diff --git a/docs/dev-ops/environment/docker-compose.yml b/docs/dev-ops/environment/docker-compose.yml index 3494cf24dffe46811af97d009899cb59e08fbe0c..d9abb40802c5b4eb145467e60a1fd5d9050d5bd2 100644 --- a/docs/dev-ops/environment/docker-compose.yml +++ b/docs/dev-ops/environment/docker-compose.yml @@ -84,11 +84,12 @@ services: interval: 5s timeout: 10s retries: 10 + start_period: 15s deploy: resources: limits: - cpus: '0.50' - memory: 128M + cpus: '1.00' + memory: 512M volumes_from: - mysql-job-dbdata @@ -148,11 +149,6 @@ services: interval: 10s timeout: 5s retries: 3 - deploy: - resources: - limits: - cpus: '0.50' - memory: 128M # https://hub.docker.com/r/xuchengen/rocketmq # 注意修改项; diff --git a/docs/dev-ops/environment/redis/redis.conf b/docs/dev-ops/environment/redis/redis.conf index c251d9bb7c5d790b94c06daba44e72169afae778..f6f37818750708730604af730b66e0a569367be7 100644 --- a/docs/dev-ops/environment/redis/redis.conf +++ b/docs/dev-ops/environment/redis/redis.conf @@ -1,3 +1,2 @@ bind 0.0.0.0 -port 6379 -requirepass 123456 \ No newline at end of file +port 6379 \ No newline at end of file diff --git a/scaffold/README.md b/scaffold/README.md new file mode 100644 index 0000000000000000000000000000000000000000..99392e253bbf07d7808ef12673e3313bb6ac3303 --- /dev/null +++ b/scaffold/README.md @@ -0,0 +1,19 @@ +# xfg-frame-archetype - DDD 脚手架 + +## 1. 脚手架安装使用 + +### 1. 生成 + +```shell +mvn clean install +``` + +- 在 IntelliJ IDEA 执行 `mvn clean install` 这样会把脚手架安装到本地仓库中 + +### 2. 配置 + +```shell +/Users/fuzhengwei/Documents/develop/apache-maven-3.8.6/repository +``` + +- 把你的 Maven 路径的 repository 配置到 IntelliJ IDEA 创建 Maven 工程的路径下。 diff --git a/scaffold/pom.xml b/scaffold/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..2c3e07c08f33c4b92c8ce3d03de7f860e39eb614 --- /dev/null +++ b/scaffold/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + cn.bugstack + scaffold + 1.1 + maven-archetype + + xfg-frame-archetype-std + + + + + org.apache.maven.archetype + archetype-packaging + 3.2.0 + + + + + + + maven-archetype-plugin + 3.2.0 + + + + + + Parent pom providing dependency and plugin management for applications built with Maven + + https://spring.io/projects/spring-boot/xfg-frame-archetype-std + + + + xiaofuge + 184172133@qq.com + fuzhengwei + https://github.com/fuzhengwei + + + + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0 + + + + + https://github.com/spring-projects/spring-boot/xfg-frame-archetype-std + + diff --git a/scaffold/src/main/resources/META-INF/maven/archetype-metadata.xml b/scaffold/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 0000000000000000000000000000000000000000..145a61b4e20972ab4e849f20424826c506b9c30d --- /dev/null +++ b/scaffold/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,131 @@ + + + + + docs/dev-ops + + **/*.txt + **/*.xml + **/*.properties + + + + + docs/dev-ops + + **/*. + **/*.sh + **/*.log + **/*.yml + **/*.json + **/*.conf + **/*.bak + **/*.sql + + + + + + + README.md + __gitignore__ + + + + + + + + src/main/java + + **/*.java + + + + src/main/resources + + **/*.xml + + + + src/main/resources + + **/*.yml + **/*.yaml + + + + src/test/java + + **/*.java + + + + data/log + + **/*.log + + + + + + Dockerfile + build.sh + + + + + + + + src/main/java + + **/*.java + + + + + + + + src/main/java + + **/*.java + + + + + + + + src/main/java + + **/*.java + + + + + + + + src/main/java + + **/*.java + + + + + + + + src/main/java + + **/*.java + + + + + + diff --git a/scaffold/src/main/resources/archetype-resources/README.md b/scaffold/src/main/resources/archetype-resources/README.md new file mode 100644 index 0000000000000000000000000000000000000000..48264e4f9aa83b0ab1cb4e8099f5e70e31156b12 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/README.md @@ -0,0 +1,2 @@ +# xfg-frame-archetype - DDD 脚手架 + diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-api/pom.xml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-api/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..d041628f20e43b8c5e8d5d560a0c5f02d389d7a0 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-api/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + ${groupId} + ${rootArtifactId} + ${version} + + + ${artifactId} + + + + org.projectlombok + lombok + 1.18.26 + + + jakarta.validation + jakarta.validation-api + 3.0.2 + + + ${groupId} + ${rootArtifactId}-types + ${version} + + + + + ${rootArtifactId}-api + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + + + + + + diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-api/src/main/java/api/IUserService.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-api/src/main/java/api/IUserService.java new file mode 100644 index 0000000000000000000000000000000000000000..562767e2f6f9d0ed848076727b2f750839253f79 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-api/src/main/java/api/IUserService.java @@ -0,0 +1,10 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.api; + +public interface IUserService { + + String queryUserInfo(String req); + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-api/src/main/java/api/model/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-api/src/main/java/api/model/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..a4efaeadec9cc501fba0d601dfff536662a70a3d --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-api/src/main/java/api/model/package-info.java @@ -0,0 +1,7 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * RPC 接口层;因为RPC的调用方式,需要调用方依赖接口提供方的接口描述信息,所以需要单独提供Jar。这个包下编写接口所需的基础对象和DTO对象 + */ +package ${package}.api.model; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/Dockerfile b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..ff4122d6c0f303dceb57ec9994c21953f4ee4235 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/Dockerfile @@ -0,0 +1,17 @@ +# 基础镜像 +FROM openjdk:8-jre-slim + +# 作者 +MAINTAINER xiaofuge + +# 配置 +ENV PARAMS="" + +# 时区 +ENV TZ=PRC +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +# 添加应用 +ADD target/${artifactId}-app.jar /${artifactId}-app.jar + +ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /${artifactId}-app.jar $PARAMS"] \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/build.sh b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/build.sh new file mode 100644 index 0000000000000000000000000000000000000000..6be66e2f2d1f606d67a9b222145c4c0eb7f49afb --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/build.sh @@ -0,0 +1,6 @@ + +# 普通镜像构建,随系统版本构建 amd/arm +docker build -t system/xfg-frame-archetype-std-app:1.0-SNAPSHOT -f ./Dockerfile . + +# 兼容 amd、arm 构建镜像 +# docker buildx build --load --platform liunx/amd64,linux/arm64 -t xiaofuge/xfg-frame-archetype-app:1.0 -f ./Dockerfile . --push \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/pom.xml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..bf487e032fff88f4863abbb93b056eec0cb95f7d --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/pom.xml @@ -0,0 +1,173 @@ + + + 4.0.0 + + ${groupId} + ${rootArtifactId} + ${version} + + + ${artifactId} + + jar + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.apache.tomcat.embed + tomcat-embed-core + + + org.springframework.boot + spring-boot-configuration-processor + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + + + + mysql + mysql-connector-java + + + com.alibaba + fastjson + + + org.apache.commons + commons-lang3 + + + org.projectlombok + lombok + + + com.google.guava + guava + + + junit + junit + test + + + io.jsonwebtoken + jjwt + + + com.auth0 + java-jwt + + + commons-codec + commons-codec + + + com.squareup.retrofit2 + converter-gson + 2.9.0 + + + org.apache.dubbo + dubbo + + + org.apache.dubbo + dubbo-spring-boot-starter + + + com.alibaba.nacos + nacos-client + + + org.redisson + redisson-spring-boot-starter + + + org.apache.shardingsphere + shardingsphere-jdbc-core + + + org.yaml + snakeyaml + + + com.xuxueli + xxl-job-core + + + org.apache.rocketmq + rocketmq-client-java + + + org.apache.rocketmq + rocketmq-spring-boot-starter + + + + + ${groupId} + ${rootArtifactId}-trigger + + + ${groupId} + ${rootArtifactId}-infrastructure + + + + + ${rootArtifactId}-app + + + src/main/resources + true + + **/** + + + + + + src/test/resources + true + + **/** + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.6 + + true + false + + **/*Test.java + + + + + org.springframework.boot + spring-boot-maven-plugin + + cn.bugstack.Application + JAR + + + + + + diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/Application.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/Application.java new file mode 100644 index 0000000000000000000000000000000000000000..4dbd4013f0a7ae9353f3325ddc9dfe5b2d67fd13 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/Application.java @@ -0,0 +1,20 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@Configurable +@EnableDubbo +public class Application { + + public static void main(String[] args){ + SpringApplication.run(Application.class); + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/GuavaConfig.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/GuavaConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..4a804f90e4cc4c78087606d574c4d4cf45b1316d --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/GuavaConfig.java @@ -0,0 +1,23 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.config; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.TimeUnit; + +@Configuration +public class GuavaConfig { + + @Bean(name = "cache") + public Cache cache() { + return CacheBuilder.newBuilder() + .expireAfterWrite(3, TimeUnit.SECONDS) + .build(); + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/RedisClientConfig.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/RedisClientConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..c8780aa62b1c1d8ba7b5df740a2eed189c601f63 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/RedisClientConfig.java @@ -0,0 +1,87 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.config; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufInputStream; +import io.netty.buffer.ByteBufOutputStream; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.client.codec.BaseCodec; +import org.redisson.client.protocol.Decoder; +import org.redisson.client.protocol.Encoder; +import org.redisson.config.Config; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.io.IOException; + +/** + * Redis 客户端,使用 Redisson Redisson + * + * @author Fuzhengwei bugstack.cn @小傅哥 + */ +@Configuration +@EnableConfigurationProperties(RedisClientConfigProperties.class) +public class RedisClientConfig { + + @Bean("redissonClient") + public RedissonClient redissonClient(ConfigurableApplicationContext applicationContext, RedisClientConfigProperties properties) { + Config config = new Config(); + // 根据需要可以设定编解码器;https://github.com/redisson/redisson/wiki/4.-%E6%95%B0%E6%8D%AE%E5%BA%8F%E5%88%97%E5%8C%96 + // config.setCodec(new RedisCodec()); + + config.useSingleServer() + .setAddress("redis://" + properties.getHost() + ":" + properties.getPort()) + .setPassword(properties.getPassword()) + .setConnectionPoolSize(properties.getPoolSize()) + .setConnectionMinimumIdleSize(properties.getMinIdleSize()) + .setIdleConnectionTimeout(properties.getIdleTimeout()) + .setConnectTimeout(properties.getConnectTimeout()) + .setRetryAttempts(properties.getRetryAttempts()) + .setRetryInterval(properties.getRetryInterval()) + .setPingConnectionInterval(properties.getPingInterval()) + .setKeepAlive(properties.isKeepAlive()) + ; + + return Redisson.create(config); + } + + static class RedisCodec extends BaseCodec { + + private final Encoder encoder = in -> { + ByteBuf out = ByteBufAllocator.DEFAULT.buffer(); + try { + ByteBufOutputStream os = new ByteBufOutputStream(out); + JSON.writeJSONString(os, in, SerializerFeature.WriteClassName); + return os.buffer(); + } catch (IOException e) { + out.release(); + throw e; + } catch (Exception e) { + out.release(); + throw new IOException(e); + } + }; + + private final Decoder decoder = (buf, state) -> JSON.parseObject(new ByteBufInputStream(buf), Object.class); + + @Override + public Decoder getValueDecoder() { + return decoder; + } + + @Override + public Encoder getValueEncoder() { + return encoder; + } + + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/RedisClientConfigProperties.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/RedisClientConfigProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..1d3ccf03b14c47847f265bba65b88d25b6177a9b --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/RedisClientConfigProperties.java @@ -0,0 +1,41 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description Redis 连接配置 redisson-spring-boot-starter + * @create 2023-09-03 16:51 + */ +@Data +@ConfigurationProperties(prefix = "redis.sdk.config", ignoreInvalidFields = true) +public class RedisClientConfigProperties { + + /** host:ip */ + private String host; + /** 端口 */ + private int port; + /** 账密 */ + private String password; + /** 设置连接池的大小,默认为64 */ + private int poolSize = 64; + /** 设置连接池的最小空闲连接数,默认为10 */ + private int minIdleSize = 10; + /** 设置连接的最大空闲时间(单位:毫秒),超过该时间的空闲连接将被关闭,默认为10000 */ + private int idleTimeout = 10000; + /** 设置连接超时时间(单位:毫秒),默认为10000 */ + private int connectTimeout = 10000; + /** 设置连接重试次数,默认为3 */ + private int retryAttempts = 3; + /** 设置连接重试的间隔时间(单位:毫秒),默认为1000 */ + private int retryInterval = 1000; + /** 设置定期检查连接是否可用的时间间隔(单位:毫秒),默认为0,表示不进行定期检查 */ + private int pingInterval = 0; + /** 设置是否保持长连接,默认为true */ + private boolean keepAlive = true; + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/ThreadPoolConfig.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/ThreadPoolConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..4852cddb1d272a89aed2bea9035b087d21bf0e41 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/ThreadPoolConfig.java @@ -0,0 +1,53 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; + +import java.util.concurrent.*; + +@Slf4j +@EnableAsync +@Configuration +@EnableConfigurationProperties(ThreadPoolConfigProperties.class) +public class ThreadPoolConfig { + + @Bean + @ConditionalOnMissingBean(ThreadPoolExecutor.class) + public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties properties) throws ClassNotFoundException, InstantiationException, IllegalAccessException { + // 实例化策略 + RejectedExecutionHandler handler; + switch (properties.getPolicy()){ + case "AbortPolicy": + handler = new ThreadPoolExecutor.AbortPolicy(); + break; + case "DiscardPolicy": + handler = new ThreadPoolExecutor.DiscardPolicy(); + break; + case "DiscardOldestPolicy": + handler = new ThreadPoolExecutor.DiscardOldestPolicy(); + break; + case "CallerRunsPolicy": + handler = new ThreadPoolExecutor.CallerRunsPolicy(); + break; + default: + handler = new ThreadPoolExecutor.AbortPolicy(); + break; + } + // 创建线程池 + return new ThreadPoolExecutor(properties.getCorePoolSize(), + properties.getMaxPoolSize(), + properties.getKeepAliveTime(), + TimeUnit.SECONDS, + new LinkedBlockingQueue<>(properties.getBlockQueueSize()), + Executors.defaultThreadFactory(), + handler); + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/ThreadPoolConfigProperties.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/ThreadPoolConfigProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..a61b5b32a0fd3f219addf297e8a505bbc6f723fa --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/ThreadPoolConfigProperties.java @@ -0,0 +1,29 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@Data +@ConfigurationProperties(prefix = "thread.pool.executor.config", ignoreInvalidFields = true) +public class ThreadPoolConfigProperties { + + /** 核心线程数 */ + private Integer corePoolSize = 20; + /** 最大线程数 */ + private Integer maxPoolSize = 200; + /** 最大等待时间 */ + private Long keepAliveTime = 10L; + /** 最大队列数 */ + private Integer blockQueueSize = 5000; + /* + * AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 + * DiscardPolicy:直接丢弃任务,但是不会抛出异常 + * DiscardOldestPolicy:将最早进入队列的任务删除,之后再尝试加入队列的任务被拒绝 + * CallerRunsPolicy:如果任务添加线程池失败,那么主线程自己执行该任务 + * */ + private String policy = "AbortPolicy"; + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/XxlJobAutoConfig.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/XxlJobAutoConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..64bf597b42d9a62dbf0231f839e2466e16e9c5a8 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/XxlJobAutoConfig.java @@ -0,0 +1,74 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.config; + +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Slf4j +@Configuration +public class XxlJobAutoConfig { + + @Value("${symbol_dollar}{xxl.job.admin.addresses}") + private String adminAddresses; + + @Value("${symbol_dollar}{xxl.job.accessToken}") + private String accessToken; + + @Value("${symbol_dollar}{xxl.job.executor.appname}") + private String appname; + + @Value("${symbol_dollar}{xxl.job.executor.address}") + private String address; + + @Value("${symbol_dollar}{xxl.job.executor.ip}") + private String ip; + + @Value("${symbol_dollar}{xxl.job.executor.port}") + private int port; + + @Value("${symbol_dollar}{xxl.job.executor.logpath}") + private String logPath; + + @Value("${symbol_dollar}{xxl.job.executor.logretentiondays}") + private int logRetentionDays; + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + log.info(">>>>>>>>>>> xxl-job config init."); + + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname); + xxlJobSpringExecutor.setAddress(address); + xxlJobSpringExecutor.setIp(ip); + xxlJobSpringExecutor.setPort(port); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); + + return xxlJobSpringExecutor; + } + + /********************************************************************************************** + * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP; + * + * 1、引入依赖: + * + * org.springframework.cloud + * spring-cloud-commons + * ${symbol_dollar}{version} + * + * + * 2、配置文件,或者容器启动变量 + * spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.' + * + * 3、获取IP + * String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress(); + **********************************************************************************************/ + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..a220ee79f12bc9e86aaa554a1f18eacc49850e6e --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/config/package-info.java @@ -0,0 +1,9 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 1. 用于管理引入的Jar所需的资源启动或者初始化处理 + * 2. 如果有AOP切面,可以再建一个aop包,来写切面逻辑 + */ +package ${package}.config; + diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..fb96c75df6c110475b6bb1cbb15ca827beddd671 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/java/package-info.java @@ -0,0 +1,7 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 应用启动层,注意Application所在的包路径,是在上一层。这样才能扫描到其他 module + * */ +package ${package}; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/application-dev.yml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..f258824d68213d67ef78180a5742850d6266c94c --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/application-dev.yml @@ -0,0 +1,104 @@ +server: + port: 8091 + +# 线程池配置 +thread: + pool: + executor: + config: + core-pool-size: 20 + max-pool-size: 50 + keep-alive-time: 5000 + block-queue-size: 5000 + policy: CallerRunsPolicy + +# 数据库配置 - sharding-jdbc 分库分表 +spring: + datasource: + driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver + url: jdbc:shardingsphere:classpath:sharding/sharding-jdbc-dev.yaml + +mybatis: + mapper-locations: classpath:/mybatis/mapper/*.xml + config-location: classpath:/mybatis/config/mybatis-config.xml + +# Redis +redis: + sdk: + config: + host: 127.0.0.1 + port: 6379 + password: 123456 + pool-size: 10 + min-idle-size: 5 + idle-timeout: 30000 + connect-timeout: 5000 + retry-attempts: 3 + retry-interval: 1000 + ping-interval: 60000 + keep-alive: true + +# Dubbo +dubbo: + application: + name: xfg-frame-archetype-std + version: 1.0.0 + registry: + id: nacos-registry + address: nacos://127.0.0.1:8848 + protocol: + name: dubbo + port: -1 + scan: + base-packages: cn.bugstack.api + +# RocketMQ 配置,在docs/dev-ops下,有创建 xfg-group 脚本,也有场景mq消息的脚本 +rocketmq: + name-server: 127.0.0.1:9876 + consumer: + group: xfg-group + # 一次拉取消息最大值,注意是拉取消息的最大值而非消费最大值 + pull-batch-size: 10 + producer: + # 发送同一类消息的设置为同一个group,保证唯一 + group: xfg-group + # 发送消息超时时间,默认3000 + sendMessageTimeout: 10000 + # 发送消息失败重试次数,默认2 + retryTimesWhenSendFailed: 2 + # 异步消息重试此处,默认2 + retryTimesWhenSendAsyncFailed: 2 + # 消息最大长度,默认1024 * 1024 * 4(默认4M) + maxMessageSize: 4096 + # 压缩消息阈值,默认4k(1024 * 4) + compressMessageBodyThreshold: 4096 + # 是否在内部发送失败时重试另一个broker,默认false + retryNextServer: false + +# xxl-job https://www.xuxueli.com/xxl-job/#%E6%AD%A5%E9%AA%A4%E4%B8%80%EF%BC%9A%E8%B0%83%E5%BA%A6%E4%B8%AD%E5%BF%83%E9%85%8D%E7%BD%AE%EF%BC%9A +xxl: + job: + # 验证信息 官网Bug https://github.com/xuxueli/xxl-job/issues/1951 + accessToken: default_token + # 注册地址 + admin: + addresses: http://localhost:9090/xxl-job-admin + # 注册执行器 + executor: + # 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。 + address: + appname: xxl-job-executor-sample + # 执行器IP 配置为本机IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; + ip: + # 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; + port: 9999 + # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; + logpath: ./data/applogs/xxl-job/jobhandler + # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; + logretentiondays: 30 + +# 日志 +logging: + level: + root: info + config: classpath:logback-spring.xml \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/application-prod.yml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/application-prod.yml new file mode 100644 index 0000000000000000000000000000000000000000..f3696195c61239e31c8fdc29287c3c0abd21759f --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/application-prod.yml @@ -0,0 +1,41 @@ +server: + port: 8091 + +# 线程池配置 +thread: + pool: + executor: + config: + core-pool-size: 20 + max-pool-size: 50 + keep-alive-time: 5000 + block-queue-size: 5000 + policy: CallerRunsPolicy + +# 数据库配置 +#spring: +# datasource: +# username: root +# password: 123456 +# url: jdbc:mysql://127.0.0.1:3306/xfg_frame_archetype?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC&useSSL=true +# driver-class-name: com.mysql.cj.jdbc.Driver +# hikari: +# pool-name: Retail_HikariCP +# minimum-idle: 15 #最小空闲连接数量 +# idle-timeout: 180000 #空闲连接存活最大时间,默认600000(10分钟) +# maximum-pool-size: 25 #连接池最大连接数,默认是10 +# auto-commit: true #此属性控制从池返回的连接的默认自动提交行为,默认值:true +# max-lifetime: 1800000 #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟 +# connection-timeout: 30000 #数据库连接超时时间,默认30秒,即30000 +# connection-test-query: SELECT 1 +# type: com.zaxxer.hikari.HikariDataSource + +#mybatis: +# mapper-locations: classpath:/mybatis/mapper/*.xml +# config-location: classpath:/mybatis/config/mybatis-config.xml + +# 日志 +logging: + level: + root: info + config: classpath:logback-spring.xml \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/application-test.yml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/application-test.yml new file mode 100644 index 0000000000000000000000000000000000000000..f3696195c61239e31c8fdc29287c3c0abd21759f --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/application-test.yml @@ -0,0 +1,41 @@ +server: + port: 8091 + +# 线程池配置 +thread: + pool: + executor: + config: + core-pool-size: 20 + max-pool-size: 50 + keep-alive-time: 5000 + block-queue-size: 5000 + policy: CallerRunsPolicy + +# 数据库配置 +#spring: +# datasource: +# username: root +# password: 123456 +# url: jdbc:mysql://127.0.0.1:3306/xfg_frame_archetype?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC&useSSL=true +# driver-class-name: com.mysql.cj.jdbc.Driver +# hikari: +# pool-name: Retail_HikariCP +# minimum-idle: 15 #最小空闲连接数量 +# idle-timeout: 180000 #空闲连接存活最大时间,默认600000(10分钟) +# maximum-pool-size: 25 #连接池最大连接数,默认是10 +# auto-commit: true #此属性控制从池返回的连接的默认自动提交行为,默认值:true +# max-lifetime: 1800000 #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟 +# connection-timeout: 30000 #数据库连接超时时间,默认30秒,即30000 +# connection-test-query: SELECT 1 +# type: com.zaxxer.hikari.HikariDataSource + +#mybatis: +# mapper-locations: classpath:/mybatis/mapper/*.xml +# config-location: classpath:/mybatis/config/mybatis-config.xml + +# 日志 +logging: + level: + root: info + config: classpath:logback-spring.xml \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/application.yml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..38961419f4467f71ecb3765b95ec40499f8a373a --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/application.yml @@ -0,0 +1,5 @@ +spring: + config: + name: xfg-frame-archetype-std-app + profiles: + active: dev diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/logback-spring.xml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/logback-spring.xml new file mode 100644 index 0000000000000000000000000000000000000000..2712e0696202e579b046d963858da693b30c175f --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/logback-spring.xml @@ -0,0 +1,116 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + logback + + + + + + + + + + + + info + + + %d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0}%X{ServiceId} -%X{trace-id} %m%n + UTF-8 + + + + + + + + ./data/log/log_info.log + + + %d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0}%X{ServiceId} -%X{trace-id} %m%n + UTF-8 + + + + + ./data/log/log-info-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + 10GB + + + + + + + ./data/log/log_error.log + + + %d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0}%X{ServiceId} -%X{trace-id} %m%n + UTF-8 + + + + ./data/log/log-error-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 7 + 5GB + + + + WARN + + + + + + + 0 + + 8192 + + true + + false + + + + + + 0 + + 1024 + + true + + false + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/mybatis/config/mybatis-config.xml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/mybatis/config/mybatis-config.xml new file mode 100644 index 0000000000000000000000000000000000000000..4b56929086e12d35bbf1a9fe28a746fefd2ea302 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/mybatis/config/mybatis-config.xml @@ -0,0 +1,12 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + + + \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/mybatis/mapper/user_order_mapper.xml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/mybatis/mapper/user_order_mapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..f623be23f57192dc1c1570060557eb13f0439d0a --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/mybatis/mapper/user_order_mapper.xml @@ -0,0 +1,55 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE user_order SET order_status = 1 WHERE user_id = ${symbol_pound}{userId} + + + + + diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/sharding/sharding-jdbc-dev.yaml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/sharding/sharding-jdbc-dev.yaml new file mode 100644 index 0000000000000000000000000000000000000000..859a90eccc3bb86ec245bfec098c4e23b0467642 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/main/resources/sharding/sharding-jdbc-dev.yaml @@ -0,0 +1,74 @@ +# https://shardingsphere.apache.org/index_zh.html +mode: + # 运行模式类型。可选配置:内存模式 Memory、单机模式 Standalone、集群模式 Cluster - 目前为单机模式 + type: Standalone + +dataSources: + ds_0: + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + driverClassName: com.mysql.cj.jdbc.Driver + jdbcUrl: jdbc:mysql://127.0.0.1:13306/xfg_dev_tech_db_00?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC&useSSL=true + username: root + password: 123456 + connectionTimeoutMilliseconds: 30000 + idleTimeoutMilliseconds: 60000 + maxLifetimeMilliseconds: 1800000 + maxPoolSize: 15 + minPoolSize: 5 + + ds_1: + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + driverClassName: com.mysql.cj.jdbc.Driver + jdbcUrl: jdbc:mysql://127.0.0.1:13306/xfg_dev_tech_db_01?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC&useSSL=true + username: root + password: 123456 + connectionTimeoutMilliseconds: 30000 + idleTimeoutMilliseconds: 60000 + maxLifetimeMilliseconds: 1800000 + maxPoolSize: 15 + minPoolSize: 5 + +rules: + - !SHARDING + # 库的路由 + defaultDatabaseStrategy: + standard: + shardingColumn: user_id + shardingAlgorithmName: database_inline + # 表的路由 + tables: + user_order: + actualDataNodes: ds_$->{0..1}.user_order_$->{0..3} + tableStrategy: + standard: + shardingColumn: user_id + shardingAlgorithmName: user_order_inline + # 路由算法 + shardingAlgorithms: + # 库-路由算法 2是两个库,库的数量。库的数量用哈希模2来计算。 + database_inline: + type: INLINE + props: + algorithm-expression: ds_$->{Math.abs(user_id.hashCode()) % 2} + + # 表-路由算法 4是一个库里,表的数量。4 - 1 为了获得 011 这样的二进制值。不推荐 user_order_$->{Math.abs(user_id.hashCode()) % 2} 作为表的路由 + user_order_inline: + type: INLINE + props: + algorithm-expression: user_order_$->{(user_id.hashCode() ^ (user_id.hashCode()) >>> 16) & (4 - 1)} + +props: + # 是否在日志中打印 SQL。 + # 打印 SQL 可以帮助开发者快速定位系统问题。日志内容包含:逻辑 SQL,真实 SQL 和 SQL 解析结果。 + # 如果开启配置,日志将使用 Topic ShardingSphere-SQL,日志级别是 INFO。 false + sql-show: true + # 是否在日志中打印简单风格的 SQL。false + sql-simple: true + # 用于设置任务处理线程池的大小。每个 ShardingSphereDataSource 使用一个独立的线程池,同一个 JVM 的不同数据源不共享线程池。 + executor-size: 20 + # 查询请求在每个数据库实例中所能使用的最大连接数。1 + max-connections-size-per-query: 1 + # 在程序启动和更新时,是否检查分片元数据的结构一致性。 + check-table-metadata-enabled: false + # 在程序启动和更新时,是否检查重复表。false + check-duplicate-table-enabled: false \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/test/java/test/ApiTest.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/test/java/test/ApiTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8375bbaee095f283b1bc9fb271db405c2b5b6398 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/test/java/test/ApiTest.java @@ -0,0 +1,22 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.test; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class ApiTest { + + @Test + public void test() { + log.info("测试完成"); + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/test/java/test/infrastructure/persistent/UserOrderTest.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/test/java/test/infrastructure/persistent/UserOrderTest.java new file mode 100644 index 0000000000000000000000000000000000000000..bfcbfe3db51aeef586ca0fea8f9a5da0ae76bc17 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/test/java/test/infrastructure/persistent/UserOrderTest.java @@ -0,0 +1,79 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.test.infrastructure.persistent; + +import ${package}.infrastructure.persistent.dao.IUserOrderDao; +import ${package}.infrastructure.persistent.po.UserOrderPO; +import com.alibaba.fastjson2.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +/** + * 单元测试 + * @author Fuzhengwei bugstack.cn @小傅哥 + */ +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class UserOrderTest { + + @Resource + private IUserOrderDao userOrderDao; + + @Test + public void test_selectByUserId() { + List list = userOrderDao.selectByUserId("xfg_FOawiP"); + log.info("测试结果:{}", JSON.toJSONString(list)); + } + + @Test + public void test_insert() { + for (int i = 0; i < 10; i++) { + UserOrderPO userOrderPO = UserOrderPO.builder() + .userName("小傅哥") + .userId("xfg_" + RandomStringUtils.randomAlphabetic(6)) + .userMobile("+86 13521408***") + .sku("13811216") + .skuName("《手写MyBatis:渐进式源码实践》") + .orderId(RandomStringUtils.randomNumeric(11)) + .quantity(1) + .unitPrice(BigDecimal.valueOf(128)) + .discountAmount(BigDecimal.valueOf(50)) + .tax(BigDecimal.ZERO) + .totalAmount(BigDecimal.valueOf(78)) + .orderDate(new Date()) + .orderStatus(0) + .isDelete(0) + .uuid(UUID.randomUUID().toString().replace("-", "")) + .ipv4("127.0.0.1") + .ipv6("2001:0db8:85a3:0000:0000:8a2e:0370:7334".getBytes()) + .extData("{${symbol_escape}"device${symbol_escape}": {${symbol_escape}"machine${symbol_escape}": ${symbol_escape}"IPhone 14 Pro${symbol_escape}", ${symbol_escape}"location${symbol_escape}": ${symbol_escape}"shanghai${symbol_escape}"}}") + .build(); + + userOrderDao.insert(userOrderPO); + } + } + + /** + * 路由测试 + */ + @Test + public void test_idx() { + for (int i = 0; i < 50; i++) { + String user_id = "xfg_" + RandomStringUtils.randomAlphabetic(6); + log.info("测试结果 {}", (user_id.hashCode() ^ (user_id.hashCode()) >>> 16) & 3); + } + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/test/java/test/infrastructure/redis/RedisTest.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/test/java/test/infrastructure/redis/RedisTest.java new file mode 100644 index 0000000000000000000000000000000000000000..21cf8f86d52ceb99ac85297c818252a6c99c7eab --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-app/src/test/java/test/infrastructure/redis/RedisTest.java @@ -0,0 +1,66 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.test.infrastructure.persistent; + +import ${package}.infrastructure.redis.IRedisService; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.redisson.api.RLock; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; + +/** + * Redis 案例;Redis + * @author Fuzhengwei bugstack.cn @小傅哥 + */ +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class RedisTest { + + @Resource + private IRedisService redissonService; + + @Test + public void test_setValue() { + redissonService.setValue("xfg", "test123"); + log.info("设置属性值"); + } + + @Test + public void test_getValue() { + String xfg = redissonService.getValue("xfg"); + log.info("测试结果:{}", xfg); + } + + @Test + public void test_remove() { + redissonService.remove("60711088280"); + } + + /** + * 可重入锁,加锁和解锁。Redisson的分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口,同时还支持自动过期解锁。 + * lock.lock(); + * lock.lock(10, TimeUnit.SECONDS); + * lock.tryLock(3, 10, TimeUnit.SECONDS); + * lock.lockAsync(); + * lock.lockAsync(10, TimeUnit.SECONDS); + * Future res = lock.tryLockAsync(3, 10, TimeUnit.SECONDS); + */ + @Test + public void test_ReentrantLock() throws Exception { + RLock lock = redissonService.getLock(""); + try { + // 1. 最常见的使用方法 + lock.lock(); + + } finally { + lock.unlock(); + } + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/pom.xml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..bcb18a767c3ba4c82ce25b131964dc83233cbb75 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + ${groupId} + ${rootArtifactId} + ${version} + + + ${artifactId} + + + + org.projectlombok + lombok + + + com.alibaba + fastjson + + + org.apache.commons + commons-lang3 + + + com.google.guava + guava + + + io.jsonwebtoken + jjwt + + + com.auth0 + java-jwt + + + commons-codec + commons-codec + + + + ${groupId} + ${rootArtifactId}-types + + + + + ${rootArtifactId}-domain + + + org.apache.maven.plugins + maven-archetype-plugin + 3.2.0 + + + + create-from-project + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + ${java.version} + + + + + + diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/adapter/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/adapter/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..fcd970d54d12ea3963270a8343f230855d100f76 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/adapter/package-info.java @@ -0,0 +1,7 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 外部接口适配器层;当需要调用外部接口时,则创建出这一层,并定义接口,之后由基础设施层的 adapter 层具体实现 + */ +package ${package}.domain.xxx.adapter; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/model/aggregate/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/model/aggregate/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..da61b0a912262bf3275692af8c46c2c1cd8f6acb --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/model/aggregate/package-info.java @@ -0,0 +1,10 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 聚合对象; + * 1. 聚合实体和值对象 + * 2. 聚合是聚合的对象,和提供基础处理对象的方法。但不建议在聚合中引入仓储和接口来做过大的逻辑。而这些复杂的操作应该放到service中处理 + * 3. 对象名称 XxxAggregate + */ +package ${package}.domain.xxx.model.aggregate; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/model/entity/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/model/entity/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..fdf42b1a95c935dfb19dfca7735d881686cb41a9 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/model/entity/package-info.java @@ -0,0 +1,10 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 实体对象; + * 1. 一般和数据库持久化对象1v1的关系,但因各自开发系统的不同,也有1vn的可能。 + * 2. 如果是老系统改造,那么旧的库表冗余了太多的字段,可能会有nv1的情况 + * 3. 对象名称 XxxEntity + */ +package ${package}.domain.xxx.model.entity; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/model/valobj/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/model/valobj/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..274f4608a0ef72c91a015de21cb95df20259624d --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/model/valobj/package-info.java @@ -0,0 +1,9 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 值对象; + * 1. 用于描述对象属性的值,如一个库表中有json后者一个字段多个属性信息的枚举对象 + * 2. 对象名称如;XxxVO + */ +package ${package}.domain.xxx.model.valobj; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/repository/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/repository/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..ab5d4057b92301b1ee9f3fccb7daa53ee6606ac5 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/repository/package-info.java @@ -0,0 +1,8 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 仓储服务 + * 1. 定义仓储接口,之后由基础设施层做具体实现 + */ +package ${package}.domain.xxx.repository; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/service/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/service/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..eff50b9b884c7b5cd6beda7f7829a522ec5f666a --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/xxx/service/package-info.java @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.domain.xxx.service; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/model/aggregate/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/model/aggregate/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..43b7c4d2eb4737be1759fac6945439362f73d676 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/model/aggregate/package-info.java @@ -0,0 +1,10 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 聚合对象; + * 1. 聚合实体和值对象 + * 2. 聚合是聚合的对象,和提供基础处理对象的方法。但不建议在聚合中引入仓储和接口来做过大的逻辑。而这些复杂的操作应该放到service中处理 + * 3. 对象名称 XxxAggregate + */ +package ${package}.domain.yyy.model.aggregate; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/model/entity/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/model/entity/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..f24402f3be0c0528aa315d75ebcc15f63b12b914 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/model/entity/package-info.java @@ -0,0 +1,10 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 实体对象; + * 1. 一般和数据库持久化对象1v1的关系,但因各自开发系统的不同,也有1vn的可能。 + * 2. 如果是老系统改造,那么旧的库表冗余了太多的字段,可能会有nv1的情况 + * 3. 对象名称 XxxEntity + */ +package ${package}.domain.yyy.model.entity; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/model/valobj/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/model/valobj/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..f6dba7ed6296129897abf7c633fe5a71bcea9396 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/model/valobj/package-info.java @@ -0,0 +1,9 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 值对象; + * 1. 用于描述对象属性的值,如一个库表中有json后者一个字段多个属性信息的枚举对象 + * 2. 对象名称如;XxxVO + */ +package ${package}.domain.yyy.model.valobj; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/repository/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/repository/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..84a49cff5d6fc5b51fc77965478fcb7d01478cb3 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/repository/package-info.java @@ -0,0 +1,8 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 仓储服务 + * 1. 定义仓储接口,之后由基础设施层做具体实现 + */ +package ${package}.domain.yyy.repository; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/service/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/service/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..624a6e586f9b8fbc3403f71e630adcaf46b7366e --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-domain/src/main/java/domain/yyy/service/package-info.java @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.domain.yyy.service; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/pom.xml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..7bedfd8233b0d9ee460e66a8f1551fa09e8c2225 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + ${groupId} + ${rootArtifactId} + ${version} + + + ${artifactId} + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + + + org.projectlombok + lombok + + + org.redisson + redisson-spring-boot-starter + + + + + ${groupId} + ${rootArtifactId}-domain + + + + + ${rootArtifactId}-infrastructure + + + org.apache.maven.plugins + maven-archetype-plugin + 3.2.0 + + + + create-from-project + + + + + + + + diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/gateway/adapter/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/gateway/adapter/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..eed895764b5544efa137752166585ac941c669bc --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/gateway/adapter/package-info.java @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.infrastructure.gateway.adapter; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/gateway/api/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/gateway/api/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..f1d4da2d34896009751e796b990f665b55c0df67 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/gateway/api/package-info.java @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.infrastructure.gateway.api; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/gateway/dto/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/gateway/dto/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..e87393969ceca4380c1c39dc92ec22ae087152ec --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/gateway/dto/package-info.java @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.infrastructure.gateway.dto; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/dao/IUserOrderDao.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/dao/IUserOrderDao.java new file mode 100644 index 0000000000000000000000000000000000000000..0fa0a2d63da345a899ba960c58548827ed197623 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/dao/IUserOrderDao.java @@ -0,0 +1,20 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.infrastructure.persistent.dao; + +import ${package}.infrastructure.persistent.po.UserOrderPO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface IUserOrderDao { + + void insert(UserOrderPO userOrderPO); + + void updateOrderStatusByUserId(String userId); + + List selectByUserId(String userId); + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/dao/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/dao/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..2de1a8d2166a1ef97c2bbb6f38562ec75a071933 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/dao/package-info.java @@ -0,0 +1,7 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * DAO 接口;IXxxDao + */ +package ${package}.infrastructure.persistent.dao; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/po/UserOrderPO.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/po/UserOrderPO.java new file mode 100644 index 0000000000000000000000000000000000000000..745c6ebfbdf27337197238943f2c7734c0d2e491 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/po/UserOrderPO.java @@ -0,0 +1,63 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.infrastructure.persistent.po; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class UserOrderPO { + + /** 自增ID */ + private Long id; + /** 用户姓名 */ + private String userName; + /** 用户编号 */ + private String userId; + /** 用户电话 */ + private String userMobile; + /** 商品编号 */ + private String sku; + /** 商品名称 */ + private String skuName; + /** 订单ID */ + private String orderId; + /** 商品数量 */ + private int quantity; + /** 商品价格 */ + private BigDecimal unitPrice; + /** 折扣金额 */ + private BigDecimal discountAmount; + /** 费率金额 */ + private BigDecimal tax; + /** 支付金额 */ + private BigDecimal totalAmount; + /** 订单日期 */ + private Date orderDate; + /** 订单状态 */ + private int orderStatus; + /** 逻辑删单 */ + private int isDelete; + /** 唯一索引 */ + private String uuid; + /** 设备地址 */ + private String ipv4; + /** 设备地址 */ + private byte[] ipv6; + /** 扩展数据 */ + private String extData; + /** 更新时间 */ + private Date updateTime; + /** 创建时间 */ + private Date createTime; + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/po/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/po/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..db590aa2b12d87093f62038e2c3e38b2b9cb7f64 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/po/package-info.java @@ -0,0 +1,7 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 持久化对象;XxxPO 最后的 PO 是大写,UserPO + */ +package ${package}.infrastructure.persistent.po; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/repository/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/repository/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..2b5a3bb95f640843ddebc45af018a48281f33243 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/persistent/repository/package-info.java @@ -0,0 +1,7 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * 仓储实现;用于实现 domain 中定义的仓储接口,如;IXxxRepository 在 Repository 中调用服务 + */ +package ${package}.infrastructure.persistent.repository; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/redis/IRedisService.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/redis/IRedisService.java new file mode 100644 index 0000000000000000000000000000000000000000..edabd0356d3c7a32abeabf390c5c100c58a855cf --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/redis/IRedisService.java @@ -0,0 +1,234 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.infrastructure.redis; + +import org.redisson.api.*; + +/** + * Redis 服务 + * @author Fuzhengwei bugstack.cn @小傅哥 + */ +public interface IRedisService { + + /** + * 设置指定 key 的值 + * + * @param key 键 + * @param value 值 + */ + void setValue(String key, T value); + + /** + * 设置指定 key 的值 + * + * @param key 键 + * @param value 值 + * @param expired 过期时间 + */ + void setValue(String key, T value, long expired); + + /** + * 获取指定 key 的值 + * + * @param key 键 + * @return 值 + */ + T getValue(String key); + + /** + * 获取队列 + * + * @param key 键 + * @param 泛型 + * @return 队列 + */ + RQueue getQueue(String key); + + /** + * 加锁队列 + * + * @param key 键 + * @param 泛型 + * @return 队列 + */ + RBlockingQueue getBlockingQueue(String key); + + /** + * 延迟队列 + * + * @param rBlockingQueue 加锁队列 + * @param 泛型 + * @return 队列 + */ + RDelayedQueue getDelayedQueue(RBlockingQueue rBlockingQueue); + + /** + * 自增 Key 的值;1、2、3、4 + * + * @param key 键 + * @return 自增后的值 + */ + long incr(String key); + + /** + * 指定值,自增 Key 的值;1、2、3、4 + * + * @param key 键 + * @return 自增后的值 + */ + long incrBy(String key, long delta); + + /** + * 自减 Key 的值;1、2、3、4 + * + * @param key 键 + * @return 自增后的值 + */ + long decr(String key); + + /** + * 指定值,自增 Key 的值;1、2、3、4 + * + * @param key 键 + * @return 自增后的值 + */ + long decrBy(String key, long delta); + + + /** + * 移除指定 key 的值 + * + * @param key 键 + */ + void remove(String key); + + /** + * 判断指定 key 的值是否存在 + * + * @param key 键 + * @return true/false + */ + boolean isExists(String key); + + /** + * 将指定的值添加到集合中 + * + * @param key 键 + * @param value 值 + */ + void addToSet(String key, String value); + + /** + * 判断指定的值是否是集合的成员 + * + * @param key 键 + * @param value 值 + * @return 如果是集合的成员返回 true,否则返回 false + */ + boolean isSetMember(String key, String value); + + /** + * 将指定的值添加到列表中 + * + * @param key 键 + * @param value 值 + */ + void addToList(String key, String value); + + /** + * 获取列表中指定索引的值 + * + * @param key 键 + * @param index 索引 + * @return 值 + */ + String getFromList(String key, int index); + + /** + * 将指定的键值对添加到哈希表中 + * + * @param key 键 + * @param field 字段 + * @param value 值 + */ + void addToMap(String key, String field, String value); + + /** + * 获取哈希表中指定字段的值 + * + * @param key 键 + * @param field 字段 + * @return 值 + */ + String getFromMap(String key, String field); + + /** + * 将指定的值添加到有序集合中 + * + * @param key 键 + * @param value 值 + */ + void addToSortedSet(String key, String value); + + /** + * 获取 Redis 锁(可重入锁) + * + * @param key 键 + * @return Lock + */ + RLock getLock(String key); + + /** + * 获取 Redis 锁(公平锁) + * + * @param key 键 + * @return Lock + */ + RLock getFairLock(String key); + + /** + * 获取 Redis 锁(读写锁) + * + * @param key 键 + * @return RReadWriteLock + */ + RReadWriteLock getReadWriteLock(String key); + + /** + * 获取 Redis 信号量 + * + * @param key 键 + * @return RSemaphore + */ + RSemaphore getSemaphore(String key); + + /** + * 获取 Redis 过期信号量 + *

+ * 基于Redis的Redisson的分布式信号量(Semaphore)Java对象RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法。 + * 同时还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。 + * + * @param key 键 + * @return RPermitExpirableSemaphore + */ + RPermitExpirableSemaphore getPermitExpirableSemaphore(String key); + + /** + * 闭锁 + * + * @param key 键 + * @return RCountDownLatch + */ + RCountDownLatch getCountDownLatch(String key); + + /** + * 布隆过滤器 + * + * @param key 键 + * @param 存放对象 + * @return 返回结果 + */ + RBloomFilter getBloomFilter(String key); + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/redis/RedissonService.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/redis/RedissonService.java new file mode 100644 index 0000000000000000000000000000000000000000..b41045552dd4d98d52b2f4285b4808144ad0ac53 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-infrastructure/src/main/java/infrastructure/redis/RedissonService.java @@ -0,0 +1,152 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.infrastructure.redis; + +import org.redisson.api.*; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.Duration; + +/** + * Redis 服务 - Redisson + * @author Fuzhengwei bugstack.cn @小傅哥 + */ +@Service("redissonService") +public class RedissonService implements IRedisService { + + @Resource + private RedissonClient redissonClient; + + public void setValue(String key, T value) { + redissonClient.getBucket(key).set(value); + } + + @Override + public void setValue(String key, T value, long expired) { + RBucket bucket = redissonClient.getBucket(key); + bucket.set(value, Duration.ofMillis(expired)); + } + + public T getValue(String key) { + return redissonClient.getBucket(key).get(); + } + + @Override + public RQueue getQueue(String key) { + return redissonClient.getQueue(key); + } + + @Override + public RBlockingQueue getBlockingQueue(String key) { + return redissonClient.getBlockingQueue(key); + } + + @Override + public RDelayedQueue getDelayedQueue(RBlockingQueue rBlockingQueue) { + return redissonClient.getDelayedQueue(rBlockingQueue); + } + + @Override + public long incr(String key) { + return redissonClient.getAtomicLong(key).incrementAndGet(); + } + + @Override + public long incrBy(String key, long delta) { + return redissonClient.getAtomicLong(key).addAndGet(delta); + } + + @Override + public long decr(String key) { + return redissonClient.getAtomicLong(key).decrementAndGet(); + } + + @Override + public long decrBy(String key, long delta) { + return redissonClient.getAtomicLong(key).addAndGet(-delta); + } + + @Override + public void remove(String key) { + redissonClient.getBucket(key).delete(); + } + + @Override + public boolean isExists(String key) { + return redissonClient.getBucket(key).isExists(); + } + + public void addToSet(String key, String value) { + RSet set = redissonClient.getSet(key); + set.add(value); + } + + public boolean isSetMember(String key, String value) { + RSet set = redissonClient.getSet(key); + return set.contains(value); + } + + public void addToList(String key, String value) { + RList list = redissonClient.getList(key); + list.add(value); + } + + public String getFromList(String key, int index) { + RList list = redissonClient.getList(key); + return list.get(index); + } + + public void addToMap(String key, String field, String value) { + RMap map = redissonClient.getMap(key); + map.put(field, value); + } + + public String getFromMap(String key, String field) { + RMap map = redissonClient.getMap(key); + return map.get(field); + } + + public void addToSortedSet(String key, String value) { + RSortedSet sortedSet = redissonClient.getSortedSet(key); + sortedSet.add(value); + } + + @Override + public RLock getLock(String key) { + return redissonClient.getLock(key); + } + + @Override + public RLock getFairLock(String key) { + return redissonClient.getFairLock(key); + } + + @Override + public RReadWriteLock getReadWriteLock(String key) { + return redissonClient.getReadWriteLock(key); + } + + @Override + public RSemaphore getSemaphore(String key) { + return redissonClient.getSemaphore(key); + } + + @Override + public RPermitExpirableSemaphore getPermitExpirableSemaphore(String key) { + return redissonClient.getPermitExpirableSemaphore(key); + } + + @Override + public RCountDownLatch getCountDownLatch(String key) { + return redissonClient.getCountDownLatch(key); + } + + @Override + public RBloomFilter getBloomFilter(String key) { + return redissonClient.getBloomFilter(key); + } + + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/pom.xml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..b3d4c8eb9b2be494f18b5da9f9c513367f4eeb1e --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/pom.xml @@ -0,0 +1,83 @@ + + + 4.0.0 + + ${groupId} + ${rootArtifactId} + ${version} + + + ${artifactId} + + + + org.springframework.boot + spring-boot-starter-web + + + com.alibaba + fastjson + + + org.springframework + spring-tx + + + org.apache.commons + commons-lang3 + + + org.apache.dubbo + dubbo + + + org.apache.dubbo + dubbo-spring-boot-starter + + + com.xuxueli + xxl-job-core + + + org.apache.rocketmq + rocketmq-client-java + + + org.apache.rocketmq + rocketmq-spring-boot-starter + + + + + ${groupId} + ${rootArtifactId}-types + + + ${groupId} + ${rootArtifactId}-domain + + + ${groupId} + ${rootArtifactId}-api + + + + + ${rootArtifactId}-trigger + + + org.apache.maven.plugins + maven-archetype-plugin + 3.2.0 + + + + create-from-project + + + + + + + + diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/http/Controller.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/http/Controller.java new file mode 100644 index 0000000000000000000000000000000000000000..a4c9155f2dc784fa79d6eb11e162d90787c84e7a --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/http/Controller.java @@ -0,0 +1,47 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.xfg.frame.trigger.http; + +import ${package}.types.common.Constants; +import ${package}.types.model.Response; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Random; +import java.util.concurrent.ThreadPoolExecutor; + +@Slf4j +@RestController +public class Controller { + + @Resource + private ThreadPoolExecutor threadPoolExecutor; + + /** + * http://localhost:8090/success + */ + @RequestMapping("/success") + public Response success() { + log.info("测试调用"); + try { + // 随机休眠 + Thread.sleep(new Random().nextInt(1000)); + // 开启线程 + threadPoolExecutor.execute(() -> { + log.info("开启线程"); + }); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + if (new Random().nextInt(100) == 1) throw new RuntimeException("异常"); + return Response.builder() + .code(Constants.ResponseCode.SUCCESS.getCode()) + .info(Constants.ResponseCode.SUCCESS.getInfo()) + .data("查询用户信息,小傅哥") + .build(); + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/job/XXLJob.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/job/XXLJob.java new file mode 100644 index 0000000000000000000000000000000000000000..69ca48bc21279ec67fe55edc7a8cb60b359abfed --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/job/XXLJob.java @@ -0,0 +1,31 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.trigger.job; + +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * XXL-Job + */ +@Slf4j +@Component +public class XXLJob { + + @Setter(onMethod_ = @Autowired) + private RocketMQTemplate rocketmqTemplate; + + @XxlJob("demoJobHandler") + public void doJob() { + // 可以在任务中,调用一些业务方法逻辑的实现,如定时扫描超时未支付订单为关单处理,恢复库存 + log.info("执行任务 - XXL-Job - 01 发送一条MQ消息"); + // 发送MQ消息 + rocketmqTemplate.convertAndSend("xfg-mq", "我是测试消息"); + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/listener/MQListener.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/listener/MQListener.java new file mode 100644 index 0000000000000000000000000000000000000000..2848111d324bfb66d4fe88c7287a886768500063 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/listener/MQListener.java @@ -0,0 +1,25 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.trigger.listener; + +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.stereotype.Component; + +/** + * RocketMQ 接收消息 + * @author Fuzhengwei bugstack.cn @小傅哥 + */ +@Component +@Slf4j +@RocketMQMessageListener(topic = "xfg-mq", consumerGroup = "xfg-group") +public class MQListener implements RocketMQListener { + + @Override + public void onMessage(String s) { + log.info("接收到RocketMQ消息 {}", s); + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/package-info.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..9f8bc61eb8749cec789aedc1707f68d0b449152b --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/package-info.java @@ -0,0 +1,10 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * http 提供服务 + * job xxl-job 任务调度 + * listener RocketMQ 监听 + * rpc Dubbo 接口,实现RPC服务 + */ +package ${package}.trigger; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/rpc/UserService.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/rpc/UserService.java new file mode 100644 index 0000000000000000000000000000000000000000..eb65033eb90ed61c2638d43731de7123e80d39d5 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-trigger/src/main/java/trigger/rpc/UserService.java @@ -0,0 +1,19 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.trigger.rpc; + +import ${package}.api.IUserService; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; + +@Slf4j +@DubboService(version = "1.0.0", timeout = 450) +public class UserService implements IUserService { + + @Override + public String queryUserInfo(String req) { + return "查询用户信息"; + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-types/pom.xml b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-types/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..a11d72e5cd8a4856975a9b006a671f82e1a3457d --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-types/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + ${groupId} + ${rootArtifactId} + ${version} + + + ${artifactId} + + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + + + com.thoughtworks.xstream + xstream + + + dom4j + dom4j + + + org.apache.commons + commons-lang3 + + + + + ${rootArtifactId}-types + + + org.apache.maven.plugins + maven-archetype-plugin + 3.2.0 + + + + create-from-project + + + + + + + + diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-types/src/main/java/types/common/Constants.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-types/src/main/java/types/common/Constants.java new file mode 100644 index 0000000000000000000000000000000000000000..9dfdca53235a2876617cef6052978902b6d6e526 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-types/src/main/java/types/common/Constants.java @@ -0,0 +1,29 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.types.common; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class Constants { + + public final static String SPLIT = ","; + + @AllArgsConstructor + @NoArgsConstructor + @Getter + public enum ResponseCode { + + SUCCESS("0000", "成功"), + UN_ERROR("0001", "未知失败"), + ILLEGAL_PARAMETER("0002", "非法参数"), + ; + + private String code; + private String info; + + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-types/src/main/java/types/exception/AppException.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-types/src/main/java/types/exception/AppException.java new file mode 100644 index 0000000000000000000000000000000000000000..e202caeeaa240018bf908a7a8d68f563f8ec9a4c --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-types/src/main/java/types/exception/AppException.java @@ -0,0 +1,49 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.types.exception; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class AppException extends RuntimeException { + + private static final long serialVersionUID = 5317680961212299217L; + + /** 异常码 */ + private String code; + + /** 异常信息 */ + private String info; + + public AppException(String code) { + this.code = code; + } + + public AppException(String code, Throwable cause) { + this.code = code; + super.initCause(cause); + } + + public AppException(String code, String message) { + this.code = code; + this.info = message; + } + + public AppException(String code, String message, Throwable cause) { + this.code = code; + this.info = message; + super.initCause(cause); + } + + @Override + public String toString() { + return "${package}.x.api.types.exception.XApiException{" + + "code='" + code + '${symbol_escape}'' + + ", info='" + info + '${symbol_escape}'' + + '}'; + } + +} diff --git a/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-types/src/main/java/types/model/Response.java b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-types/src/main/java/types/model/Response.java new file mode 100644 index 0000000000000000000000000000000000000000..e10dbba80005191b9c2df0c2a6649ab0a6a4f7a9 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/__rootArtifactId__-types/src/main/java/types/model/Response.java @@ -0,0 +1,25 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package ${package}.types.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Response implements Serializable { + + private static final long serialVersionUID = 5130392244064623509L; + + private String code; + private String info; + private T data; + +} \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/app/docker-compose-1.0.yml b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/app/docker-compose-1.0.yml new file mode 100644 index 0000000000000000000000000000000000000000..3e0fa1b70da3e903f14de8d2a23582957eeca672 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/app/docker-compose-1.0.yml @@ -0,0 +1,21 @@ +# /usr/local/bin/docker-compose -f /docs/dev-ops/environment/environment-docker-compose-2.4.yml up -d +version: '3.8' +# docker-compose -f docker-compose-1.0.yml up -d +# 你需要修改system为你自身系统的仓库名 +services: + x-api-app: + image: system/${artifactId}:${version} + container_name: ${artifactId} + restart: on-failure + ports: + - "8091:8091" + environment: + - TZ=PRC + - SERVER_PORT=8091 + volumes: + - ./log:/data/log + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/app/start.sh b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/app/start.sh new file mode 100644 index 0000000000000000000000000000000000000000..84b1c3618897cb2f762716e10a0ac14764f98aac --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/app/start.sh @@ -0,0 +1,20 @@ +CONTAINER_NAME=${artifactId} +IMAGE_NAME=system/${artifactId}:${version} +PORT=8091 + +echo "容器部署开始 ${CONTAINER_NAME}" + +# 停止容器 +docker stop ${CONTAINER_NAME} + +# 删除容器 +docker rm ${CONTAINER_NAME} + +# 启动容器 +docker run --name ${CONTAINER_NAME} \ +-p ${PORT}:${PORT} \ +-d ${IMAGE_NAME} + +echo "容器部署成功 ${CONTAINER_NAME}" + +docker logs -f ${CONTAINER_NAME} \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/app/stop.sh b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/app/stop.sh new file mode 100644 index 0000000000000000000000000000000000000000..c50d125046faa1e9ccd16415748a61a8e92bea8a --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/app/stop.sh @@ -0,0 +1 @@ +docker stop ${artifactId} \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/docker-compose.yml b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..d9abb40802c5b4eb145467e60a1fd5d9050d5bd2 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/docker-compose.yml @@ -0,0 +1,174 @@ +# 命令执行 docker-compose up -d +version: '3.9' +# 安装开发环境 +# 配置中心nacos:http://127.0.0.1:8848/nacos - 【账号:nacos 密码:nacos】 +# 消息rocketmq:http://localhost:8080/#/ - 【账号:admin 密码:admin】 +# 任务调度xxl-job-admin:http://127.0.0.1:9090/xxl-job-admin/ - 【账号:admin 密码:123456】 +# 数据库mysql +# 缓存redis +services: + # 注册中心 https://github.com/nacos-group/nacos-docker - 其他配置可参考(集群) + # http://127.0.0.1:8848/nacos 【账号:nacos 密码:nacos】 + nacos: + image: nacos/nacos-server:v2.2.3-slim + container_name: nacos + restart: always + ports: + - "8848:8848" + - "9848:9848" + environment: + - PREFER_HOST_MODE=hostname + - MODE=standalone + - SPRING_DATASOURCE_PLATFORM=mysql + - MYSQL_SERVICE_HOST=mysql + - MYSQL_SERVICE_DB_NAME=nacos_config + - MYSQL_SERVICE_PORT=3306 + - MYSQL_SERVICE_USER=root + - MYSQL_SERVICE_PASSWORD=123456 + - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true + - NACOS_AUTH_IDENTITY_KEY=2222 + - NACOS_AUTH_IDENTITY_VALUE=2xxx + - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789 + networks: + - my-network + depends_on: + mysql: + condition: service_healthy + + # http://127.0.0.1:9090/xxl-job-admin admin/123456 - 安装后稍等会访问即可 + # 官网镜像为 xuxueli/xxl-job-admin:2.4.0 但不支持ARM架构【需要自己打包】,所以找了一个 kuschzzp/xxl-job-aarch64:2.4.0 镜像支持 AMD/ARM + xxl-job-admin: + image: xuxueli/xxl-job-admin:2.4.0 + container_name: xxl-job-admin + restart: always + depends_on: + mysql: + condition: service_healthy + ports: + - "9090:9090" + links: + - mysql + volumes: + - ./data/logs:/data/applogs + - ./data/xxl-job/:/xxl-job + environment: + - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/xxl_job?serverTimezone=UTC&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai + - SPRING_DATASOURCE_USERNAME=root + - SPRING_DATASOURCE_PASSWORD=123456 + - SERVER_PORT=9090 + networks: + - my-network + + # MySQL 增加健康检测,避免 + mysql: + image: mysql:8.0.32 + container_name: mysql + hostname: mysql + command: --default-authentication-plugin=mysql_native_password + restart: always + environment: + TZ: Asia/Shanghai + MYSQL_ROOT_PASSWORD: 123456 + MYSQL_USER: xfg + MYSQL_PASSWORD: 123456 + networks: + - my-network + depends_on: + - mysql-job-dbdata + ports: + - "13306:3306" + volumes: + - ./sql:/docker-entrypoint-initdb.d + healthcheck: + test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ] + interval: 5s + timeout: 10s + retries: 10 + start_period: 15s + deploy: + resources: + limits: + cpus: '1.00' + memory: 512M + volumes_from: + - mysql-job-dbdata + + # 自动加载数据 + mysql-job-dbdata: + image: alpine:3.18.2 + container_name: mysql-job-dbdata + volumes: + - /var/lib/mysql + + # phpmyadmin https://hub.docker.com/_/phpmyadmin + phpmyadmin: + image: phpmyadmin:5.2.1 + container_name: phpmyadmin + hostname: phpmyadmin + ports: + - 8899:80 + environment: + - PMA_ARBITRARY=1 + - PMA_HOST=mysql + - PMA_PORT=3306 + - MYSQL_ROOT_PASSWORD=123456 + networks: + - my-network + + # RedisAdmin https://github.com/joeferner/redis-commander + redis-admin: + image: spryker/redis-commander:0.8.0 + container_name: redis-admin + hostname: redis-commander + restart: always + ports: + - 8081:8081 + environment: + - REDIS_HOSTS=local:redis:6379 + networks: + - my-network + depends_on: + redis: + condition: service_healthy + + # Redis + redis: + image: redis:7.2.0 + container_name: redis + restart: always + hostname: redis + ports: + - 6379:6379 + volumes: + - ./redis/redis.conf:/usr/local/etc/redis/redis.conf + command: redis-server /usr/local/etc/redis/redis.conf + networks: + - my-network + healthcheck: + test: [ "CMD", "redis-cli", "ping" ] + interval: 10s + timeout: 5s + retries: 3 + + # https://hub.docker.com/r/xuchengen/rocketmq + # 注意修改项; + # 01:data/rocketmq/conf/broker.conf 添加 brokerIP1=127.0.0.1 + # 02:data/console/config/application.properties server.port=9009 - 如果8080端口被占用,可以修改或者添加映射端口 + rocketmq: + image: livinphp/rocketmq:5.1.0 + container_name: rocketmq + ports: + - 8080:8080 + - 9876:9876 + - 10909:10909 + - 10911:10911 + - 10912:10912 + volumes: + - ./rocketmq/data:/home/app/data + environment: + TZ: "Asia/Shanghai" + NAMESRV_ADDR: "rocketmq:9876" + +networks: + my-network: + driver: bridge \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/redis/redis.conf b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/redis/redis.conf new file mode 100644 index 0000000000000000000000000000000000000000..c251d9bb7c5d790b94c06daba44e72169afae778 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/redis/redis.conf @@ -0,0 +1,3 @@ +bind 0.0.0.0 +port 6379 +requirepass 123456 \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/create-group.sh b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/create-group.sh new file mode 100644 index 0000000000000000000000000000000000000000..2004b327285641f44799141c2d6dc255165d8f58 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/create-group.sh @@ -0,0 +1,2 @@ +# 命令创建 消费者组 Group xfg-group 你可以更换你需要的 +docker exec -it rocketmq sh /home/app/rocketmq/bin/mqadmin updateSubGroup -n localhost:9876 -c DefaultCluster -g xfg-group diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/create-topic.sh b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/create-topic.sh new file mode 100644 index 0000000000000000000000000000000000000000..63393f6ed35c63f364251af542cd528ed29a33c3 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/create-topic.sh @@ -0,0 +1,2 @@ +# 命令创建 主题消息 Topic xfg-mq 你可以更换你需要的 +docker exec -it rocketmq sh /home/app/rocketmq/bin/mqadmin updateTopic -n localhost:9876 -c DefaultCluster -t xfg-mq diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/config/application.properties b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/config/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..048421679541f32c264d454394d20fbdb2be8fdb --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/config/application.properties @@ -0,0 +1,57 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +${symbol_pound} +${symbol_pound} Licensed to the Apache Software Foundation (ASF) under one or more +${symbol_pound} contributor license agreements. See the NOTICE file distributed with +${symbol_pound} this work for additional information regarding copyright ownership. +${symbol_pound} The ASF licenses this file to You under the Apache License, Version 2.0 +${symbol_pound} (the "License"); you may not use this file except in compliance with +${symbol_pound} the License. You may obtain a copy of the License at +${symbol_pound} +${symbol_pound} http://www.apache.org/licenses/LICENSE-2.0 +${symbol_pound} +${symbol_pound} Unless required by applicable law or agreed to in writing, software +${symbol_pound} distributed under the License is distributed on an "AS IS" BASIS, +${symbol_pound} WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +${symbol_pound} See the License for the specific language governing permissions and +${symbol_pound} limitations under the License. +${symbol_pound} + +server.address=0.0.0.0 +server.port=8080 + +${symbol_pound}${symbol_pound}${symbol_pound} SSL setting +${symbol_pound}server.ssl.key-store=classpath:rmqcngkeystore.jks +${symbol_pound}server.ssl.key-store-password=rocketmq +${symbol_pound}server.ssl.keyStoreType=PKCS12 +${symbol_pound}server.ssl.keyAlias=rmqcngkey + +${symbol_pound}spring.application.index=true +spring.application.name=rocketmq-dashboard +spring.http.encoding.charset=UTF-8 +spring.http.encoding.enabled=true +spring.http.encoding.force=true +logging.level.root=INFO +logging.config=./config/logback.xml +${symbol_pound}if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876 +rocketmq.config.namesrvAddr= +${symbol_pound}if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true +rocketmq.config.isVIPChannel= +${symbol_pound}timeout for mqadminExt, default 5000ms +rocketmq.config.timeoutMillis= +${symbol_pound}rocketmq-console's data path:dashboard/monitor +rocketmq.config.dataPath=./store +${symbol_pound}set it false if you don't want use dashboard.default true +rocketmq.config.enableDashBoardCollect=true +${symbol_pound}set the message track trace topic if you don't want use the default one +rocketmq.config.msgTrackTopicName= +rocketmq.config.ticketKey=ticket + +${symbol_pound}Must create userInfo file: ${symbol_dollar}{rocketmq.config.dataPath}/users.properties if the login is required +rocketmq.config.loginRequired=true + +${symbol_pound}set the accessKey and secretKey if you used acl +${symbol_pound}rocketmq.config.accessKey= +${symbol_pound}rocketmq.config.secretKey= +rocketmq.config.useTLS=false diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/config/logback.xml b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/config/logback.xml new file mode 100644 index 0000000000000000000000000000000000000000..0ccd3f76bfcfa22031d66b897b8d6948eff058f3 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/config/logback.xml @@ -0,0 +1,52 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS}] %5p %m%n + + + + + ${symbol_dollar}{user.home}${symbol_dollar}{file.separator}data${symbol_dollar}{file.separator}logs${symbol_dollar}{file.separator}consolelogs${symbol_dollar}{file.separator}rocketmq-console.log + true + + ${symbol_dollar}{user.home}${symbol_dollar}{file.separator}data${symbol_dollar}{file.separator}logs${symbol_dollar}{file.separator}consolelogs${symbol_dollar}{file.separator}rocketmq-console-%d{yyyy-MM-dd}.%i.log + + 104857600 + + 10 + + + [%d{yyyy-MM-dd HH:mm:ss.SSS}] %5p %m%n + UTF-8 + + + + + + + + + \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/store/dashboard2023-11-04.json b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/store/dashboard2023-11-04.json new file mode 100644 index 0000000000000000000000000000000000000000..cc9ab764321b0a5465335848f4f21a5b59123721 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/store/dashboard2023-11-04.json @@ -0,0 +1 @@ +{"broker-a:0":["1699081019975,10.92678","1699081079957,29.70046","1699081139966,26.54158","1699081199949,25.17176","1699081259958,30.19899","1699081319958,23.90083","1699081379958,29.42203","1699081439958,26.88845","1699081499958,23.75058","1699081559958,30.02172","1699081619958,37.96032","1699081679958,41.84854","1699081739958,42.57691","1699081799958,36.82512","1699081859958,41.84120","1699081919881,41.43369","1699081979958,37.93306","1699082039957,43.53979","1699082099959,37.91108","1699082159957,41.09514","1699082224929,25.22857","1699084080001,3.79591","1699084139489,14.39676","1699085279719,16.56811","1699086292538,2.25068","1699086899956,8.76239","1699086959943,30.15414","1699087019958,25.50150","1699087079957,30.98184","1699087139959,27.19344","1699087199957,27.63796","1699087259957,31.26747","1699087319957,26.40225","1699087379981,31.67858","1699087439959,30.32723","1699087499957,38.91828","1699087559958,43.15065","1699087619958,37.67023","1699087679958,42.32411","1699087739958,40.43330","1699087799958,38.63847","1699087859958,43.49639","1699087919957,37.84353","1699087979957,42.04197","1699088039957,41.09007","1699088099958,38.12312"]} \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/store/dashboard2023-11-04_topic.json b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/store/dashboard2023-11-04_topic.json new file mode 100644 index 0000000000000000000000000000000000000000..741f9ded81bfc84d2229b91fb6c4b413c9aec5cc --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/store/dashboard2023-11-04_topic.json @@ -0,0 +1 @@ +{"DefaultCluster_REPLY_TOPIC":["1699080990000,0.00000,0,0.00000,0","1699081049952,0.00000,0,0.00000,0","1699081109958,0.00000,0,0.00000,0","1699081169957,0.00000,0,0.00000,0","1699081229958,0.00000,0,0.00000,0","1699081289958,0.00000,0,0.00000,0","1699081349958,0.00000,0,0.00000,0","1699081409957,0.00000,0,0.00000,0","1699081469959,0.00000,0,0.00000,0","1699081529957,0.00000,0,0.00000,0","1699081589957,0.00000,0,0.00000,0","1699081649957,0.00000,0,0.00000,0","1699081709960,0.00000,0,0.00000,0","1699081769958,0.00000,0,0.00000,0","1699081829956,0.00000,0,0.00000,0","1699081889886,0.00000,0,0.00000,0","1699081949957,0.00000,0,0.00000,0","1699082009957,0.00000,0,0.00000,0","1699082069960,0.00000,0,0.00000,0","1699082129957,0.00000,0,0.00000,0","1699082189955,0.00000,0,0.00000,0","1699082250222,0.00000,0,0.00000,0","1699085256224,0.00000,0,0.00000,0","1699086290774,0.00000,0,0.00000,0","1699086929664,0.00000,0,0.00000,0","1699086989922,0.00000,0,0.00000,0","1699087049957,0.00000,0,0.00000,0","1699087109957,0.00000,0,0.00000,0","1699087169957,0.00000,0,0.00000,0","1699087229958,0.00000,0,0.00000,0","1699087289957,0.00000,0,0.00000,0","1699087349973,0.00000,0,0.00000,0","1699087409965,0.00000,0,0.00000,0","1699087469959,0.00000,0,0.00000,0","1699087529958,0.00000,0,0.00000,0","1699087589957,0.00000,0,0.00000,0","1699087649957,0.00000,0,0.00000,0","1699087709958,0.00000,0,0.00000,0","1699087769958,0.00000,0,0.00000,0","1699087829957,0.00000,0,0.00000,0","1699087889958,0.00000,0,0.00000,0","1699087949958,0.00000,0,0.00000,0","1699088009956,0.00000,0,0.00000,0","1699088069959,0.00000,0,0.00000,0"],"xfg-mq":["1699081049952,0.00000,0,0.00000,0","1699081109958,0.00000,0,0.00000,0","1699081169957,0.00000,0,0.00000,0","1699081229958,0.00000,0,0.00000,0","1699081289958,0.00000,0,0.00000,0","1699081349958,0.00000,0,0.00000,0","1699081409957,0.00000,0,0.00000,0","1699081469959,0.00000,0,0.00000,0","1699081529957,0.00000,0,0.00000,0","1699081589957,0.00000,0,0.00000,0","1699081649957,0.05000,1,0.05000,1","1699081709960,0.00000,0,0.00000,0","1699081769958,0.00000,0,0.00000,0","1699081829956,0.00000,0,0.00000,0","1699081889886,0.00000,0,0.00000,0","1699081949957,0.00000,0,0.00000,0","1699082009957,0.00000,0,0.00000,0","1699082069960,0.00000,0,0.00000,0","1699082129957,0.00000,0,0.00000,0","1699082189955,0.00000,1,0.00000,1","1699082250222,0.00000,1,0.00000,1","1699085256224,0.00000,1,0.00000,1","1699086290774,0.00000,1,0.00000,1","1699086929664,0.00000,1,0.00000,1","1699086989922,0.00000,1,0.00000,1","1699087049957,0.00000,1,0.00000,1","1699087109957,0.00000,1,0.00000,1","1699087169957,0.00000,1,0.00000,1","1699087229958,0.00000,1,0.00000,1","1699087289957,0.00000,1,0.00000,1","1699087349973,0.00000,1,0.00000,1","1699087409965,0.00000,1,0.00000,1","1699087469959,0.00000,1,0.00000,1","1699087529958,0.00000,1,0.00000,1","1699087589957,0.00000,1,0.00000,1","1699087649957,0.00000,1,0.00000,1","1699087709958,0.00000,1,0.00000,1","1699087769958,0.00000,1,0.00000,1","1699087829957,0.00000,1,0.00000,1","1699087889958,0.00000,1,0.00000,1","1699087949958,0.00000,1,0.00000,1","1699088009956,0.00000,1,0.00000,1","1699088069959,0.00000,1,0.00000,1"]} \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/store/users.properties b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/store/users.properties new file mode 100644 index 0000000000000000000000000000000000000000..abb32326eda96d96f9b22b89fb1fa16149d69bd6 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/console/store/users.properties @@ -0,0 +1,28 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +${symbol_pound} +${symbol_pound} Licensed to the Apache Software Foundation (ASF) under one or more +${symbol_pound} contributor license agreements. See the NOTICE file distributed with +${symbol_pound} this work for additional information regarding copyright ownership. +${symbol_pound} The ASF licenses this file to You under the Apache License, Version 2.0 +${symbol_pound} (the "License"); you may not use this file except in compliance with +${symbol_pound} the License. You may obtain a copy of the License at +${symbol_pound} +${symbol_pound} http://www.apache.org/licenses/LICENSE-2.0 +${symbol_pound} +${symbol_pound} Unless required by applicable law or agreed to in writing, software +${symbol_pound} distributed under the License is distributed on an "AS IS" BASIS, +${symbol_pound} WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +${symbol_pound} See the License for the specific language governing permissions and +${symbol_pound} limitations under the License. +${symbol_pound} + +${symbol_pound} This file supports hot change, any change will be auto-reloaded without Dashboard restarting. +${symbol_pound} Format: a user per line, username=password[,N] ${symbol_pound}N is optional, 0 (Normal User); 1 (Admin) + +${symbol_pound} Define Admin +admin=admin,1 + +${symbol_pound} Define Users +normal=normal \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/logs/consolelogs/rocketmq-console.log b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/logs/consolelogs/rocketmq-console.log new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/logs/logs.txt b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/logs/logs.txt new file mode 100644 index 0000000000000000000000000000000000000000..712a6a3ac77f6d74429c277fb600724f1365d02b --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/logs/logs.txt @@ -0,0 +1,3 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/logs/rocketmqlogs/brokerLogDir_IS_UNDEFINED/broker.log b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/logs/rocketmqlogs/brokerLogDir_IS_UNDEFINED/broker.log new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/logs/rocketmqlogs/rocketmq_client.log b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/logs/rocketmqlogs/rocketmq_client.log new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/rocketmq/conf/broker.conf b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/rocketmq/conf/broker.conf new file mode 100644 index 0000000000000000000000000000000000000000..9e6bbea4093d6ceb47c312ff5252f6684f2e53ce --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/rocketmq/conf/broker.conf @@ -0,0 +1,33 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 +# +# http://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. + +# 集群名称 +brokerClusterName = DefaultCluster +# BROKER 名称 +brokerName = broker-a +# 0 表示 Master, > 0 表示 Slave +brokerId = 0 +# 删除文件时间点,默认凌晨 4 点 +deleteWhen = 04 +# 文件保留时间,默认 48 小时 +fileReservedTime = 48 +# BROKER 角色 ASYNC_MASTER为异步主节点,SYNC_MASTER为同步主节点,SLAVE为从节点 +brokerRole = ASYNC_MASTER +# 刷新数据到磁盘的方式,ASYNC_FLUSH 刷新 +flushDiskType = ASYNC_FLUSH +# 存储路径 +storePathRootDir = /home/app/data/rocketmq/store +# IP地址 +brokerIP1 = 127.0.0.1 \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/rocketmq/store/store.txt b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/rocketmq/store/store.txt new file mode 100644 index 0000000000000000000000000000000000000000..712a6a3ac77f6d74429c277fb600724f1365d02b --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/rocketmq/data/rocketmq/store/store.txt @@ -0,0 +1,3 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/sql/nacos.sql b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/sql/nacos.sql new file mode 100644 index 0000000000000000000000000000000000000000..b2d0725bf099dbd86cb17aa38538ae137662a602 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/sql/nacos.sql @@ -0,0 +1,302 @@ +# ************************************************************ +# Sequel Ace SQL dump +# 版本号: 20050 +# +# https://sequel-ace.com/ +# https://github.com/Sequel-Ace/Sequel-Ace +# +# 主机: 127.0.0.1 (MySQL 8.0.32) +# 数据库: nacos_config +# 生成时间: 2023-11-03 06:44:40 +0000 +# ************************************************************ + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +SET NAMES utf8mb4; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +CREATE database if NOT EXISTS `nacos_config` default character set utf8mb4 collate utf8mb4_0900_ai_ci; + +use `nacos_config`; + +# 转储表 config_info +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `config_info`; + +CREATE TABLE `config_info` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) COLLATE utf8mb3_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) COLLATE utf8mb3_bin DEFAULT NULL, + `content` longtext COLLATE utf8mb3_bin NOT NULL COMMENT 'content', + `md5` varchar(32) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + `src_user` text COLLATE utf8mb3_bin COMMENT 'source user', + `src_ip` varchar(20) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'source ip', + `app_name` varchar(128) COLLATE utf8mb3_bin DEFAULT NULL, + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT '租户字段', + `c_desc` varchar(256) COLLATE utf8mb3_bin DEFAULT NULL, + `c_use` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL, + `effect` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL, + `type` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL, + `c_schema` text COLLATE utf8mb3_bin, + `encrypted_data_key` text COLLATE utf8mb3_bin NOT NULL COMMENT '秘钥', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='config_info'; + + + +# 转储表 config_info_aggr +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `config_info_aggr`; + +CREATE TABLE `config_info_aggr` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) COLLATE utf8mb3_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'group_id', + `datum_id` varchar(255) COLLATE utf8mb3_bin NOT NULL COMMENT 'datum_id', + `content` longtext COLLATE utf8mb3_bin NOT NULL COMMENT '内容', + `gmt_modified` datetime NOT NULL COMMENT '修改时间', + `app_name` varchar(128) COLLATE utf8mb3_bin DEFAULT NULL, + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT '租户字段', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='增加租户字段'; + + + +# 转储表 config_info_beta +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `config_info_beta`; + +CREATE TABLE `config_info_beta` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) COLLATE utf8mb3_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'group_id', + `app_name` varchar(128) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'app_name', + `content` longtext COLLATE utf8mb3_bin NOT NULL COMMENT 'content', + `beta_ips` varchar(1024) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'betaIps', + `md5` varchar(32) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + `src_user` text COLLATE utf8mb3_bin COMMENT 'source user', + `src_ip` varchar(20) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'source ip', + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` text COLLATE utf8mb3_bin NOT NULL COMMENT '秘钥', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='config_info_beta'; + + + +# 转储表 config_info_tag +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `config_info_tag`; + +CREATE TABLE `config_info_tag` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) COLLATE utf8mb3_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT 'tenant_id', + `tag_id` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'tag_id', + `app_name` varchar(128) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'app_name', + `content` longtext COLLATE utf8mb3_bin NOT NULL COMMENT 'content', + `md5` varchar(32) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + `src_user` text COLLATE utf8mb3_bin COMMENT 'source user', + `src_ip` varchar(20) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'source ip', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='config_info_tag'; + + + +# 转储表 config_tags_relation +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `config_tags_relation`; + +CREATE TABLE `config_tags_relation` ( + `id` bigint NOT NULL COMMENT 'id', + `tag_name` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'tag_name', + `tag_type` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'tag_type', + `data_id` varchar(255) COLLATE utf8mb3_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT 'tenant_id', + `nid` bigint NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`nid`), + UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='config_tag_relation'; + + + +# 转储表 group_capacity +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `group_capacity`; + +CREATE TABLE `group_capacity` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `group_id` varchar(128) COLLATE utf8mb3_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', + `quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', + `usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量', + `max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值', + `max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', + `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_group_id` (`group_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='集群、各Group容量信息表'; + + + +# 转储表 his_config_info +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `his_config_info`; + +CREATE TABLE `his_config_info` ( + `id` bigint unsigned NOT NULL, + `nid` bigint unsigned NOT NULL AUTO_INCREMENT, + `data_id` varchar(255) COLLATE utf8mb3_bin NOT NULL, + `group_id` varchar(128) COLLATE utf8mb3_bin NOT NULL, + `app_name` varchar(128) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'app_name', + `content` longtext COLLATE utf8mb3_bin NOT NULL, + `md5` varchar(32) COLLATE utf8mb3_bin DEFAULT NULL, + `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00', + `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00', + `src_user` text COLLATE utf8mb3_bin, + `src_ip` varchar(20) COLLATE utf8mb3_bin DEFAULT NULL, + `op_type` char(10) COLLATE utf8mb3_bin DEFAULT NULL, + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` text COLLATE utf8mb3_bin NOT NULL COMMENT '秘钥', + PRIMARY KEY (`nid`), + KEY `idx_gmt_create` (`gmt_create`), + KEY `idx_gmt_modified` (`gmt_modified`), + KEY `idx_did` (`data_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='多租户改造'; + + + +# 转储表 permissions +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `permissions`; + +CREATE TABLE `permissions` ( + `role` varchar(50) NOT NULL, + `resource` varchar(512) NOT NULL, + `action` varchar(8) NOT NULL, + UNIQUE KEY `uk_role_permission` (`role`,`resource`,`action`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + + + +# 转储表 roles +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `roles`; + +CREATE TABLE `roles` ( + `username` varchar(50) NOT NULL, + `role` varchar(50) NOT NULL, + UNIQUE KEY `uk_username_role` (`username`,`role`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +LOCK TABLES `roles` WRITE; +/*!40000 ALTER TABLE `roles` DISABLE KEYS */; + +INSERT INTO `roles` (`username`, `role`) +VALUES + ('nacos','ROLE_ADMIN'); + +/*!40000 ALTER TABLE `roles` ENABLE KEYS */; +UNLOCK TABLES; + + +# 转储表 tenant_capacity +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `tenant_capacity`; + +CREATE TABLE `tenant_capacity` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` varchar(128) COLLATE utf8mb3_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID', + `quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', + `usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量', + `max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', + `max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', + `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='租户容量信息表'; + + + +# 转储表 tenant_info +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `tenant_info`; + +CREATE TABLE `tenant_info` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `kp` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'kp', + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT 'tenant_id', + `tenant_name` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT 'tenant_name', + `tenant_desc` varchar(256) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'tenant_desc', + `create_source` varchar(32) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'create_source', + `gmt_create` bigint NOT NULL COMMENT '创建时间', + `gmt_modified` bigint NOT NULL COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='tenant_info'; + + + +# 转储表 users +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `users`; + +CREATE TABLE `users` ( + `username` varchar(50) NOT NULL, + `password` varchar(500) NOT NULL, + `enabled` tinyint(1) NOT NULL, + PRIMARY KEY (`username`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +LOCK TABLES `users` WRITE; +/*!40000 ALTER TABLE `users` DISABLE KEYS */; + +INSERT INTO `users` (`username`, `password`, `enabled`) +VALUES + ('nacos','$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu',1); + +/*!40000 ALTER TABLE `users` ENABLE KEYS */; +UNLOCK TABLES; + + + +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/sql/xfg_dev_tech_db_00.sql b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/sql/xfg_dev_tech_db_00.sql new file mode 100644 index 0000000000000000000000000000000000000000..98a8a15fccad19b266e412da78d5ee363826d5b8 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/sql/xfg_dev_tech_db_00.sql @@ -0,0 +1,215 @@ +# ************************************************************ +# Sequel Ace SQL dump +# 版本号: 20050 +# +# https://sequel-ace.com/ +# https://github.com/Sequel-Ace/Sequel-Ace +# +# 主机: 127.0.0.1 (MySQL 8.0.32) +# 数据库: xfg_dev_tech_db_00 +# 生成时间: 2023-11-02 07:41:33 +0000 +# ************************************************************ + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +SET NAMES utf8mb4; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +CREATE database if NOT EXISTS `xfg_dev_tech_db_00` default character set utf8mb4 collate utf8mb4_0900_ai_ci; +use `xfg_dev_tech_db_00`; + +# 转储表 user_order_0 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_order_0`; + +CREATE TABLE `user_order_0` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID;【必须保留自增ID,不要将一些有随机特性的字段值设计为主键,例如order_id,会导致innodb内部page分裂和大量随机I/O,性能下降】int 大约21亿左右,超过会报错。bigint 大约9千亿左右。', + `user_name` varchar(64) NOT NULL COMMENT '用户姓名;', + `user_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户编号;', + `user_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户电话;使用varchar(20)存储手机号,不要使用整型。手机号不会做数学计算、涉及到区号或者国家代号,可能出现+-()、支持模糊查询,例如:like“135%”', + `sku` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品编号', + `sku_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称', + `order_id` varchar(64) NOT NULL COMMENT '订单ID', + `quantity` int NOT NULL DEFAULT '1' COMMENT '商品数量;整形定义中不显示规定显示长度,比如使用 INT,而不使用 INT(4)', + `unit_price` decimal(10,2) NOT NULL COMMENT '商品价格;小数类型为 decimal,禁止使用 float、double', + `discount_amount` decimal(10,2) NOT NULL COMMENT '折扣金额;', + `tax` decimal(4,2) NOT NULL COMMENT '费率金额;', + `total_amount` decimal(10,2) NOT NULL COMMENT '支付金额;(商品的总金额 - 折扣) * (1 - 费率)', + `order_date` datetime NOT NULL COMMENT '订单日期;timestamp的时间范围在1970-01-01 00:00:01到2038-01-01 00:00:00之间', + `order_status` tinyint(1) NOT NULL COMMENT '订单状态;0 创建、1完成、2掉单、3关单 【不要使用 enum 要使用 tinyint 替代。0-80 范围,都可以使用 tinyint】', + `is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删单;0未删除,1已删除 【表达是否概念的字段必须使用is_】', + `uuid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '唯一索引;分布式下全局唯一,用于binlog 同步 ES 方便使用', + `ipv4` int unsigned NOT NULL DEFAULT '2130706433' COMMENT '设备地址;存储IPV4地址,通过MySQL 函数转换,inet_ntoa、inet_aton 示例;SELECT INET_ATON(‘209.207.224.40′); 3520061480 SELECT INET_NTOA(3520061480); 209.207.224.40所有字段定义为NOT NULL,并设置默认值,因为null值的字段会导致每一行都占用额外存储空间\\n数据迁移容易出错,在聚合函数计算结果偏差(如count结果不准)并且null的列使索引/索引统计/值比较都更加复杂,MySQL内部需要进行特殊处理,表中有较多空字段的时候,数据库性能下降严重。开发中null只能采用is null或is not null检索,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’abc’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录', + `ipv6` varbinary(16) NOT NULL COMMENT '设备地址;存储IPV6地址,VARBINARY(16) 插入:INET6_ATON(''2001:0db8:85a3:0000:0000:8a2e:0370:7334'') 查询:SELECT INET6_NTOA(ip_address) ', + `ext_data` json NOT NULL COMMENT '扩展数据;记录下单时用户的设备环境等信息(核心业务字段,要单独拆表)。【select user_name, ext_data, ext_data->>''$.device'', ext_data->>''$.device.machine'' from `user_order`;】', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_orderid` (`order_id`), + UNIQUE KEY `uq_uuid` (`uuid`), + KEY `idx_order_date` (`order_date`), + KEY `idx_sku_unit_price_total_amount` (`sku`,`unit_price`,`total_amount`) +) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +LOCK TABLES `user_order_0` WRITE; +/*!40000 ALTER TABLE `user_order_0` DISABLE KEYS */; + +INSERT INTO `user_order_0` (`id`, `user_name`, `user_id`, `user_mobile`, `sku`, `sku_name`, `order_id`, `quantity`, `unit_price`, `discount_amount`, `tax`, `total_amount`, `order_date`, `order_status`, `is_delete`, `uuid`, `ipv4`, `ipv6`, `ext_data`, `update_time`, `create_time`) +VALUES + (1,'小傅哥','xfg_FOawiP','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','55811762243',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:00',0,0,'d737caf79181405a987a34a17f7a7beb',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'), + (2,'小傅哥','xfg_MIxVOs','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','64790165297',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:46',0,0,'adf5faa9fba24c298dd426e04b3dd10f',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:54','2023-11-02 15:38:54'); + +/*!40000 ALTER TABLE `user_order_0` ENABLE KEYS */; +UNLOCK TABLES; + + +# 转储表 user_order_1 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_order_1`; + +CREATE TABLE `user_order_1` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID;【必须保留自增ID,不要将一些有随机特性的字段值设计为主键,例如order_id,会导致innodb内部page分裂和大量随机I/O,性能下降】int 大约21亿左右,超过会报错。bigint 大约9千亿左右。', + `user_name` varchar(64) NOT NULL COMMENT '用户姓名;', + `user_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户编号;', + `user_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户电话;使用varchar(20)存储手机号,不要使用整型。手机号不会做数学计算、涉及到区号或者国家代号,可能出现+-()、支持模糊查询,例如:like“135%”', + `sku` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品编号', + `sku_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称', + `order_id` varchar(64) NOT NULL COMMENT '订单ID', + `quantity` int NOT NULL DEFAULT '1' COMMENT '商品数量;整形定义中不显示规定显示长度,比如使用 INT,而不使用 INT(4)', + `unit_price` decimal(10,2) NOT NULL COMMENT '商品价格;小数类型为 decimal,禁止使用 float、double', + `discount_amount` decimal(10,2) NOT NULL COMMENT '折扣金额;', + `tax` decimal(4,2) NOT NULL COMMENT '费率金额;', + `total_amount` decimal(10,2) NOT NULL COMMENT '支付金额;(商品的总金额 - 折扣) * (1 - 费率)', + `order_date` datetime NOT NULL COMMENT '订单日期;timestamp的时间范围在1970-01-01 00:00:01到2038-01-01 00:00:00之间', + `order_status` tinyint(1) NOT NULL COMMENT '订单状态;0 创建、1完成、2掉单、3关单 【不要使用 enum 要使用 tinyint 替代。0-80 范围,都可以使用 tinyint】', + `is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删单;0未删除,1已删除 【表达是否概念的字段必须使用is_】', + `uuid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '唯一索引;分布式下全局唯一,用于binlog 同步 ES 方便使用', + `ipv4` int unsigned NOT NULL DEFAULT '2130706433' COMMENT '设备地址;存储IPV4地址,通过MySQL 函数转换,inet_ntoa、inet_aton 示例;SELECT INET_ATON(‘209.207.224.40′); 3520061480 SELECT INET_NTOA(3520061480); 209.207.224.40所有字段定义为NOT NULL,并设置默认值,因为null值的字段会导致每一行都占用额外存储空间\\n数据迁移容易出错,在聚合函数计算结果偏差(如count结果不准)并且null的列使索引/索引统计/值比较都更加复杂,MySQL内部需要进行特殊处理,表中有较多空字段的时候,数据库性能下降严重。开发中null只能采用is null或is not null检索,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’abc’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录', + `ipv6` varbinary(16) NOT NULL COMMENT '设备地址;存储IPV6地址,VARBINARY(16) 插入:INET6_ATON(''2001:0db8:85a3:0000:0000:8a2e:0370:7334'') 查询:SELECT INET6_NTOA(ip_address) ', + `ext_data` json NOT NULL COMMENT '扩展数据;记录下单时用户的设备环境等信息(核心业务字段,要单独拆表)。【select user_name, ext_data, ext_data->>''$.device'', ext_data->>''$.device.machine'' from `user_order`;】', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_orderid` (`order_id`), + UNIQUE KEY `uq_uuid` (`uuid`), + KEY `idx_order_date` (`order_date`), + KEY `idx_sku_unit_price_total_amount` (`sku`,`unit_price`,`total_amount`) +) ENGINE=InnoDB AUTO_INCREMENT=147 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +LOCK TABLES `user_order_1` WRITE; +/*!40000 ALTER TABLE `user_order_1` DISABLE KEYS */; + +INSERT INTO `user_order_1` (`id`, `user_name`, `user_id`, `user_mobile`, `sku`, `sku_name`, `order_id`, `quantity`, `unit_price`, `discount_amount`, `tax`, `total_amount`, `order_date`, `order_status`, `is_delete`, `uuid`, `ipv4`, `ipv6`, `ext_data`, `update_time`, `create_time`) +VALUES + (1,'小傅哥','xfg_Cnazua','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','67077289265',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:00',0,0,'42fab13a8a7f4bf4a1db5515b5a7d1f9',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'), + (2,'小傅哥','xfg_bMNgJb','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','44231861187',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:00',0,0,'e1707367684140c8b1d57caacc1acbf8',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'); + +/*!40000 ALTER TABLE `user_order_1` ENABLE KEYS */; +UNLOCK TABLES; + + +# 转储表 user_order_2 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_order_2`; + +CREATE TABLE `user_order_2` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID;【必须保留自增ID,不要将一些有随机特性的字段值设计为主键,例如order_id,会导致innodb内部page分裂和大量随机I/O,性能下降】int 大约21亿左右,超过会报错。bigint 大约9千亿左右。', + `user_name` varchar(64) NOT NULL COMMENT '用户姓名;', + `user_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户编号;', + `user_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户电话;使用varchar(20)存储手机号,不要使用整型。手机号不会做数学计算、涉及到区号或者国家代号,可能出现+-()、支持模糊查询,例如:like“135%”', + `sku` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品编号', + `sku_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称', + `order_id` varchar(64) NOT NULL COMMENT '订单ID', + `quantity` int NOT NULL DEFAULT '1' COMMENT '商品数量;整形定义中不显示规定显示长度,比如使用 INT,而不使用 INT(4)', + `unit_price` decimal(10,2) NOT NULL COMMENT '商品价格;小数类型为 decimal,禁止使用 float、double', + `discount_amount` decimal(10,2) NOT NULL COMMENT '折扣金额;', + `tax` decimal(4,2) NOT NULL COMMENT '费率金额;', + `total_amount` decimal(10,2) NOT NULL COMMENT '支付金额;(商品的总金额 - 折扣) * (1 - 费率)', + `order_date` datetime NOT NULL COMMENT '订单日期;timestamp的时间范围在1970-01-01 00:00:01到2038-01-01 00:00:00之间', + `order_status` tinyint(1) NOT NULL COMMENT '订单状态;0 创建、1完成、2掉单、3关单 【不要使用 enum 要使用 tinyint 替代。0-80 范围,都可以使用 tinyint】', + `is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删单;0未删除,1已删除 【表达是否概念的字段必须使用is_】', + `uuid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '唯一索引;分布式下全局唯一,用于binlog 同步 ES 方便使用', + `ipv4` int unsigned NOT NULL DEFAULT '2130706433' COMMENT '设备地址;存储IPV4地址,通过MySQL 函数转换,inet_ntoa、inet_aton 示例;SELECT INET_ATON(‘209.207.224.40′); 3520061480 SELECT INET_NTOA(3520061480); 209.207.224.40所有字段定义为NOT NULL,并设置默认值,因为null值的字段会导致每一行都占用额外存储空间\\n数据迁移容易出错,在聚合函数计算结果偏差(如count结果不准)并且null的列使索引/索引统计/值比较都更加复杂,MySQL内部需要进行特殊处理,表中有较多空字段的时候,数据库性能下降严重。开发中null只能采用is null或is not null检索,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’abc’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录', + `ipv6` varbinary(16) NOT NULL COMMENT '设备地址;存储IPV6地址,VARBINARY(16) 插入:INET6_ATON(''2001:0db8:85a3:0000:0000:8a2e:0370:7334'') 查询:SELECT INET6_NTOA(ip_address) ', + `ext_data` json NOT NULL COMMENT '扩展数据;记录下单时用户的设备环境等信息(核心业务字段,要单独拆表)。【select user_name, ext_data, ext_data->>''$.device'', ext_data->>''$.device.machine'' from `user_order`;】', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_orderid` (`order_id`), + UNIQUE KEY `uq_uuid` (`uuid`), + KEY `idx_order_date` (`order_date`), + KEY `idx_sku_unit_price_total_amount` (`sku`,`unit_price`,`total_amount`) +) ENGINE=InnoDB AUTO_INCREMENT=136 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +LOCK TABLES `user_order_2` WRITE; +/*!40000 ALTER TABLE `user_order_2` DISABLE KEYS */; + +INSERT INTO `user_order_2` (`id`, `user_name`, `user_id`, `user_mobile`, `sku`, `sku_name`, `order_id`, `quantity`, `unit_price`, `discount_amount`, `tax`, `total_amount`, `order_date`, `order_status`, `is_delete`, `uuid`, `ipv4`, `ipv6`, `ext_data`, `update_time`, `create_time`) +VALUES + (1,'小傅哥','xfg_BbNdEo','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','75706486913',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:00',0,0,'f576ce3965d3455db48d9db59397908d',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'), + (2,'小傅哥','xfg_WKOtte','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','56110050786',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:00',0,0,'06156ea5dd564f13a8b03dd55936f739',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'); + +/*!40000 ALTER TABLE `user_order_2` ENABLE KEYS */; +UNLOCK TABLES; + + +# 转储表 user_order_3 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_order_3`; + +CREATE TABLE `user_order_3` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID;【必须保留自增ID,不要将一些有随机特性的字段值设计为主键,例如order_id,会导致innodb内部page分裂和大量随机I/O,性能下降】int 大约21亿左右,超过会报错。bigint 大约9千亿左右。', + `user_name` varchar(64) NOT NULL COMMENT '用户姓名;', + `user_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户编号;', + `user_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户电话;使用varchar(20)存储手机号,不要使用整型。手机号不会做数学计算、涉及到区号或者国家代号,可能出现+-()、支持模糊查询,例如:like“135%”', + `sku` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品编号', + `sku_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称', + `order_id` varchar(64) NOT NULL COMMENT '订单ID', + `quantity` int NOT NULL DEFAULT '1' COMMENT '商品数量;整形定义中不显示规定显示长度,比如使用 INT,而不使用 INT(4)', + `unit_price` decimal(10,2) NOT NULL COMMENT '商品价格;小数类型为 decimal,禁止使用 float、double', + `discount_amount` decimal(10,2) NOT NULL COMMENT '折扣金额;', + `tax` decimal(4,2) NOT NULL COMMENT '费率金额;', + `total_amount` decimal(10,2) NOT NULL COMMENT '支付金额;(商品的总金额 - 折扣) * (1 - 费率)', + `order_date` datetime NOT NULL COMMENT '订单日期;timestamp的时间范围在1970-01-01 00:00:01到2038-01-01 00:00:00之间', + `order_status` tinyint(1) NOT NULL COMMENT '订单状态;0 创建、1完成、2掉单、3关单 【不要使用 enum 要使用 tinyint 替代。0-80 范围,都可以使用 tinyint】', + `is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删单;0未删除,1已删除 【表达是否概念的字段必须使用is_】', + `uuid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '唯一索引;分布式下全局唯一,用于binlog 同步 ES 方便使用', + `ipv4` int unsigned NOT NULL DEFAULT '2130706433' COMMENT '设备地址;存储IPV4地址,通过MySQL 函数转换,inet_ntoa、inet_aton 示例;SELECT INET_ATON(‘209.207.224.40′); 3520061480 SELECT INET_NTOA(3520061480); 209.207.224.40所有字段定义为NOT NULL,并设置默认值,因为null值的字段会导致每一行都占用额外存储空间\\n数据迁移容易出错,在聚合函数计算结果偏差(如count结果不准)并且null的列使索引/索引统计/值比较都更加复杂,MySQL内部需要进行特殊处理,表中有较多空字段的时候,数据库性能下降严重。开发中null只能采用is null或is not null检索,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’abc’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录', + `ipv6` varbinary(16) NOT NULL COMMENT '设备地址;存储IPV6地址,VARBINARY(16) 插入:INET6_ATON(''2001:0db8:85a3:0000:0000:8a2e:0370:7334'') 查询:SELECT INET6_NTOA(ip_address) ', + `ext_data` json NOT NULL COMMENT '扩展数据;记录下单时用户的设备环境等信息(核心业务字段,要单独拆表)。【select user_name, ext_data, ext_data->>''$.device'', ext_data->>''$.device.machine'' from `user_order`;】', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_orderid` (`order_id`), + UNIQUE KEY `uq_uuid` (`uuid`), + KEY `idx_order_date` (`order_date`), + KEY `idx_sku_unit_price_total_amount` (`sku`,`unit_price`,`total_amount`) +) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +LOCK TABLES `user_order_3` WRITE; +/*!40000 ALTER TABLE `user_order_3` DISABLE KEYS */; + +INSERT INTO `user_order_3` (`id`, `user_name`, `user_id`, `user_mobile`, `sku`, `sku_name`, `order_id`, `quantity`, `unit_price`, `discount_amount`, `tax`, `total_amount`, `order_date`, `order_status`, `is_delete`, `uuid`, `ipv4`, `ipv6`, `ext_data`, `update_time`, `create_time`) +VALUES + (1,'小傅哥','xfg_wMIvhS','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','04973851200',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:00',0,0,'94500f29e6ba4c849094e7b694942e5b',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'), + (2,'小傅哥','xfg_mRLUQC','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','84344470134',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:00',0,0,'12b4e2c16a15434db8efd5140a262189',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'); + +/*!40000 ALTER TABLE `user_order_3` ENABLE KEYS */; +UNLOCK TABLES; + + + +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/sql/xfg_dev_tech_db_01.sql b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/sql/xfg_dev_tech_db_01.sql new file mode 100644 index 0000000000000000000000000000000000000000..acc526a0a3faa9e2612e6c147d545e8d20743479 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/sql/xfg_dev_tech_db_01.sql @@ -0,0 +1,215 @@ +# ************************************************************ +# Sequel Ace SQL dump +# 版本号: 20050 +# +# https://sequel-ace.com/ +# https://github.com/Sequel-Ace/Sequel-Ace +# +# 主机: 127.0.0.1 (MySQL 8.0.32) +# 数据库: xfg_dev_tech_db_01 +# 生成时间: 2023-11-02 07:42:32 +0000 +# ************************************************************ + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +SET NAMES utf8mb4; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +CREATE database if NOT EXISTS `xfg_dev_tech_db_01` default character set utf8mb4 collate utf8mb4_0900_ai_ci; +use `xfg_dev_tech_db_01`; + +# 转储表 user_order_0 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_order_0`; + +CREATE TABLE `user_order_0` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID;【必须保留自增ID,不要将一些有随机特性的字段值设计为主键,例如order_id,会导致innodb内部page分裂和大量随机I/O,性能下降】int 大约21亿左右,超过会报错。bigint 大约9千亿左右。', + `user_name` varchar(64) NOT NULL COMMENT '用户姓名;', + `user_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户编号;', + `user_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户电话;使用varchar(20)存储手机号,不要使用整型。手机号不会做数学计算、涉及到区号或者国家代号,可能出现+-()、支持模糊查询,例如:like“135%”', + `sku` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品编号', + `sku_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称', + `order_id` varchar(64) NOT NULL COMMENT '订单ID', + `quantity` int NOT NULL DEFAULT '1' COMMENT '商品数量;整形定义中不显示规定显示长度,比如使用 INT,而不使用 INT(4)', + `unit_price` decimal(10,2) NOT NULL COMMENT '商品价格;小数类型为 decimal,禁止使用 float、double', + `discount_amount` decimal(10,2) NOT NULL COMMENT '折扣金额;', + `tax` decimal(4,2) NOT NULL COMMENT '费率金额;', + `total_amount` decimal(10,2) NOT NULL COMMENT '支付金额;(商品的总金额 - 折扣) * (1 - 费率)', + `order_date` datetime NOT NULL COMMENT '订单日期;timestamp的时间范围在1970-01-01 00:00:01到2038-01-01 00:00:00之间', + `order_status` tinyint(1) NOT NULL COMMENT '订单状态;0 创建、1完成、2掉单、3关单 【不要使用 enum 要使用 tinyint 替代。0-80 范围,都可以使用 tinyint】', + `is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删单;0未删除,1已删除 【表达是否概念的字段必须使用is_】', + `uuid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '唯一索引;分布式下全局唯一,用于binlog 同步 ES 方便使用', + `ipv4` int unsigned NOT NULL DEFAULT '2130706433' COMMENT '设备地址;存储IPV4地址,通过MySQL 函数转换,inet_ntoa、inet_aton 示例;SELECT INET_ATON(‘209.207.224.40′); 3520061480 SELECT INET_NTOA(3520061480); 209.207.224.40所有字段定义为NOT NULL,并设置默认值,因为null值的字段会导致每一行都占用额外存储空间\\n数据迁移容易出错,在聚合函数计算结果偏差(如count结果不准)并且null的列使索引/索引统计/值比较都更加复杂,MySQL内部需要进行特殊处理,表中有较多空字段的时候,数据库性能下降严重。开发中null只能采用is null或is not null检索,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’abc’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录', + `ipv6` varbinary(16) NOT NULL COMMENT '设备地址;存储IPV6地址,VARBINARY(16) 插入:INET6_ATON(''2001:0db8:85a3:0000:0000:8a2e:0370:7334'') 查询:SELECT INET6_NTOA(ip_address) ', + `ext_data` json NOT NULL COMMENT '扩展数据;记录下单时用户的设备环境等信息(核心业务字段,要单独拆表)。【select user_name, ext_data, ext_data->>''$.device'', ext_data->>''$.device.machine'' from `user_order`;】', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_orderid` (`order_id`), + UNIQUE KEY `uq_uuid` (`uuid`), + KEY `idx_order_date` (`order_date`), + KEY `idx_sku_unit_price_total_amount` (`sku`,`unit_price`,`total_amount`) +) ENGINE=InnoDB AUTO_INCREMENT=144 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +LOCK TABLES `user_order_0` WRITE; +/*!40000 ALTER TABLE `user_order_0` DISABLE KEYS */; + +INSERT INTO `user_order_0` (`id`, `user_name`, `user_id`, `user_mobile`, `sku`, `sku_name`, `order_id`, `quantity`, `unit_price`, `discount_amount`, `tax`, `total_amount`, `order_date`, `order_status`, `is_delete`, `uuid`, `ipv4`, `ipv6`, `ext_data`, `update_time`, `create_time`) +VALUES + (1,'小傅哥','xfg_eKJVpO','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','13232577250',1,128.00,50.00,0.00,78.00,'2023-11-02 07:37:51',0,0,'bad18b73d64a41e5a6c66ffde5c86620',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'), + (2,'小傅哥','xfg_KigNVH','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','06196275702',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:00',0,0,'21efcbb490de4f56b64ae44b05666513',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'); + +/*!40000 ALTER TABLE `user_order_0` ENABLE KEYS */; +UNLOCK TABLES; + + +# 转储表 user_order_1 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_order_1`; + +CREATE TABLE `user_order_1` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID;【必须保留自增ID,不要将一些有随机特性的字段值设计为主键,例如order_id,会导致innodb内部page分裂和大量随机I/O,性能下降】int 大约21亿左右,超过会报错。bigint 大约9千亿左右。', + `user_name` varchar(64) NOT NULL COMMENT '用户姓名;', + `user_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户编号;', + `user_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户电话;使用varchar(20)存储手机号,不要使用整型。手机号不会做数学计算、涉及到区号或者国家代号,可能出现+-()、支持模糊查询,例如:like“135%”', + `sku` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品编号', + `sku_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称', + `order_id` varchar(64) NOT NULL COMMENT '订单ID', + `quantity` int NOT NULL DEFAULT '1' COMMENT '商品数量;整形定义中不显示规定显示长度,比如使用 INT,而不使用 INT(4)', + `unit_price` decimal(10,2) NOT NULL COMMENT '商品价格;小数类型为 decimal,禁止使用 float、double', + `discount_amount` decimal(10,2) NOT NULL COMMENT '折扣金额;', + `tax` decimal(4,2) NOT NULL COMMENT '费率金额;', + `total_amount` decimal(10,2) NOT NULL COMMENT '支付金额;(商品的总金额 - 折扣) * (1 - 费率)', + `order_date` datetime NOT NULL COMMENT '订单日期;timestamp的时间范围在1970-01-01 00:00:01到2038-01-01 00:00:00之间', + `order_status` tinyint(1) NOT NULL COMMENT '订单状态;0 创建、1完成、2掉单、3关单 【不要使用 enum 要使用 tinyint 替代。0-80 范围,都可以使用 tinyint】', + `is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删单;0未删除,1已删除 【表达是否概念的字段必须使用is_】', + `uuid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '唯一索引;分布式下全局唯一,用于binlog 同步 ES 方便使用', + `ipv4` int unsigned NOT NULL DEFAULT '2130706433' COMMENT '设备地址;存储IPV4地址,通过MySQL 函数转换,inet_ntoa、inet_aton 示例;SELECT INET_ATON(‘209.207.224.40′); 3520061480 SELECT INET_NTOA(3520061480); 209.207.224.40所有字段定义为NOT NULL,并设置默认值,因为null值的字段会导致每一行都占用额外存储空间\\n数据迁移容易出错,在聚合函数计算结果偏差(如count结果不准)并且null的列使索引/索引统计/值比较都更加复杂,MySQL内部需要进行特殊处理,表中有较多空字段的时候,数据库性能下降严重。开发中null只能采用is null或is not null检索,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’abc’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录', + `ipv6` varbinary(16) NOT NULL COMMENT '设备地址;存储IPV6地址,VARBINARY(16) 插入:INET6_ATON(''2001:0db8:85a3:0000:0000:8a2e:0370:7334'') 查询:SELECT INET6_NTOA(ip_address) ', + `ext_data` json NOT NULL COMMENT '扩展数据;记录下单时用户的设备环境等信息(核心业务字段,要单独拆表)。【select user_name, ext_data, ext_data->>''$.device'', ext_data->>''$.device.machine'' from `user_order`;】', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_orderid` (`order_id`), + UNIQUE KEY `uq_uuid` (`uuid`), + KEY `idx_order_date` (`order_date`), + KEY `idx_sku_unit_price_total_amount` (`sku`,`unit_price`,`total_amount`) +) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +LOCK TABLES `user_order_1` WRITE; +/*!40000 ALTER TABLE `user_order_1` DISABLE KEYS */; + +INSERT INTO `user_order_1` (`id`, `user_name`, `user_id`, `user_mobile`, `sku`, `sku_name`, `order_id`, `quantity`, `unit_price`, `discount_amount`, `tax`, `total_amount`, `order_date`, `order_status`, `is_delete`, `uuid`, `ipv4`, `ipv6`, `ext_data`, `update_time`, `create_time`) +VALUES + (1,'小傅哥','xfg_SNvNdB','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','08440801977',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:55',0,0,'4044fe46fabe498b8905a4f620f36076',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:54','2023-11-02 15:38:54'), + (2,'小傅哥','xfg_ccwftd','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','96970982688',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:55',0,0,'90c02e7687bc4bc7a0b9d4eebee78d7a',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:55','2023-11-02 15:38:55'); + +/*!40000 ALTER TABLE `user_order_1` ENABLE KEYS */; +UNLOCK TABLES; + + +# 转储表 user_order_2 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_order_2`; + +CREATE TABLE `user_order_2` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID;【必须保留自增ID,不要将一些有随机特性的字段值设计为主键,例如order_id,会导致innodb内部page分裂和大量随机I/O,性能下降】int 大约21亿左右,超过会报错。bigint 大约9千亿左右。', + `user_name` varchar(64) NOT NULL COMMENT '用户姓名;', + `user_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户编号;', + `user_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户电话;使用varchar(20)存储手机号,不要使用整型。手机号不会做数学计算、涉及到区号或者国家代号,可能出现+-()、支持模糊查询,例如:like“135%”', + `sku` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品编号', + `sku_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称', + `order_id` varchar(64) NOT NULL COMMENT '订单ID', + `quantity` int NOT NULL DEFAULT '1' COMMENT '商品数量;整形定义中不显示规定显示长度,比如使用 INT,而不使用 INT(4)', + `unit_price` decimal(10,2) NOT NULL COMMENT '商品价格;小数类型为 decimal,禁止使用 float、double', + `discount_amount` decimal(10,2) NOT NULL COMMENT '折扣金额;', + `tax` decimal(4,2) NOT NULL COMMENT '费率金额;', + `total_amount` decimal(10,2) NOT NULL COMMENT '支付金额;(商品的总金额 - 折扣) * (1 - 费率)', + `order_date` datetime NOT NULL COMMENT '订单日期;timestamp的时间范围在1970-01-01 00:00:01到2038-01-01 00:00:00之间', + `order_status` tinyint(1) NOT NULL COMMENT '订单状态;0 创建、1完成、2掉单、3关单 【不要使用 enum 要使用 tinyint 替代。0-80 范围,都可以使用 tinyint】', + `is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删单;0未删除,1已删除 【表达是否概念的字段必须使用is_】', + `uuid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '唯一索引;分布式下全局唯一,用于binlog 同步 ES 方便使用', + `ipv4` int unsigned NOT NULL DEFAULT '2130706433' COMMENT '设备地址;存储IPV4地址,通过MySQL 函数转换,inet_ntoa、inet_aton 示例;SELECT INET_ATON(‘209.207.224.40′); 3520061480 SELECT INET_NTOA(3520061480); 209.207.224.40所有字段定义为NOT NULL,并设置默认值,因为null值的字段会导致每一行都占用额外存储空间\\n数据迁移容易出错,在聚合函数计算结果偏差(如count结果不准)并且null的列使索引/索引统计/值比较都更加复杂,MySQL内部需要进行特殊处理,表中有较多空字段的时候,数据库性能下降严重。开发中null只能采用is null或is not null检索,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’abc’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录', + `ipv6` varbinary(16) NOT NULL COMMENT '设备地址;存储IPV6地址,VARBINARY(16) 插入:INET6_ATON(''2001:0db8:85a3:0000:0000:8a2e:0370:7334'') 查询:SELECT INET6_NTOA(ip_address) ', + `ext_data` json NOT NULL COMMENT '扩展数据;记录下单时用户的设备环境等信息(核心业务字段,要单独拆表)。【select user_name, ext_data, ext_data->>''$.device'', ext_data->>''$.device.machine'' from `user_order`;】', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_orderid` (`order_id`), + UNIQUE KEY `uq_uuid` (`uuid`), + KEY `idx_order_date` (`order_date`), + KEY `idx_sku_unit_price_total_amount` (`sku`,`unit_price`,`total_amount`) +) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +LOCK TABLES `user_order_2` WRITE; +/*!40000 ALTER TABLE `user_order_2` DISABLE KEYS */; + +INSERT INTO `user_order_2` (`id`, `user_name`, `user_id`, `user_mobile`, `sku`, `sku_name`, `order_id`, `quantity`, `unit_price`, `discount_amount`, `tax`, `total_amount`, `order_date`, `order_status`, `is_delete`, `uuid`, `ipv4`, `ipv6`, `ext_data`, `update_time`, `create_time`) +VALUES + (1,'小傅哥','xfg_rAZmon','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','76407784565',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:00',0,0,'0c137db910fd430b9bab307b45b64369',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'), + (2,'小傅哥','xfg_jbUupM','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','29649461429',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:00',0,0,'f3ab7b04065a4c6cb562942c8fcf3282',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'); + +/*!40000 ALTER TABLE `user_order_2` ENABLE KEYS */; +UNLOCK TABLES; + + +# 转储表 user_order_3 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_order_3`; + +CREATE TABLE `user_order_3` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID;【必须保留自增ID,不要将一些有随机特性的字段值设计为主键,例如order_id,会导致innodb内部page分裂和大量随机I/O,性能下降】int 大约21亿左右,超过会报错。bigint 大约9千亿左右。', + `user_name` varchar(64) NOT NULL COMMENT '用户姓名;', + `user_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户编号;', + `user_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户电话;使用varchar(20)存储手机号,不要使用整型。手机号不会做数学计算、涉及到区号或者国家代号,可能出现+-()、支持模糊查询,例如:like“135%”', + `sku` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品编号', + `sku_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称', + `order_id` varchar(64) NOT NULL COMMENT '订单ID', + `quantity` int NOT NULL DEFAULT '1' COMMENT '商品数量;整形定义中不显示规定显示长度,比如使用 INT,而不使用 INT(4)', + `unit_price` decimal(10,2) NOT NULL COMMENT '商品价格;小数类型为 decimal,禁止使用 float、double', + `discount_amount` decimal(10,2) NOT NULL COMMENT '折扣金额;', + `tax` decimal(4,2) NOT NULL COMMENT '费率金额;', + `total_amount` decimal(10,2) NOT NULL COMMENT '支付金额;(商品的总金额 - 折扣) * (1 - 费率)', + `order_date` datetime NOT NULL COMMENT '订单日期;timestamp的时间范围在1970-01-01 00:00:01到2038-01-01 00:00:00之间', + `order_status` tinyint(1) NOT NULL COMMENT '订单状态;0 创建、1完成、2掉单、3关单 【不要使用 enum 要使用 tinyint 替代。0-80 范围,都可以使用 tinyint】', + `is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删单;0未删除,1已删除 【表达是否概念的字段必须使用is_】', + `uuid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '唯一索引;分布式下全局唯一,用于binlog 同步 ES 方便使用', + `ipv4` int unsigned NOT NULL DEFAULT '2130706433' COMMENT '设备地址;存储IPV4地址,通过MySQL 函数转换,inet_ntoa、inet_aton 示例;SELECT INET_ATON(‘209.207.224.40′); 3520061480 SELECT INET_NTOA(3520061480); 209.207.224.40所有字段定义为NOT NULL,并设置默认值,因为null值的字段会导致每一行都占用额外存储空间\\n数据迁移容易出错,在聚合函数计算结果偏差(如count结果不准)并且null的列使索引/索引统计/值比较都更加复杂,MySQL内部需要进行特殊处理,表中有较多空字段的时候,数据库性能下降严重。开发中null只能采用is null或is not null检索,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’abc’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录', + `ipv6` varbinary(16) NOT NULL COMMENT '设备地址;存储IPV6地址,VARBINARY(16) 插入:INET6_ATON(''2001:0db8:85a3:0000:0000:8a2e:0370:7334'') 查询:SELECT INET6_NTOA(ip_address) ', + `ext_data` json NOT NULL COMMENT '扩展数据;记录下单时用户的设备环境等信息(核心业务字段,要单独拆表)。【select user_name, ext_data, ext_data->>''$.device'', ext_data->>''$.device.machine'' from `user_order`;】', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_orderid` (`order_id`), + UNIQUE KEY `uq_uuid` (`uuid`), + KEY `idx_order_date` (`order_date`), + KEY `idx_sku_unit_price_total_amount` (`sku`,`unit_price`,`total_amount`) +) ENGINE=InnoDB AUTO_INCREMENT=148 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +LOCK TABLES `user_order_3` WRITE; +/*!40000 ALTER TABLE `user_order_3` DISABLE KEYS */; + +INSERT INTO `user_order_3` (`id`, `user_name`, `user_id`, `user_mobile`, `sku`, `sku_name`, `order_id`, `quantity`, `unit_price`, `discount_amount`, `tax`, `total_amount`, `order_date`, `order_status`, `is_delete`, `uuid`, `ipv4`, `ipv6`, `ext_data`, `update_time`, `create_time`) +VALUES + (1,'小傅哥','xfg_JsEUcu','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','21630931065',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:00',0,0,'7f595d4df9954b6788c987a20e23b765',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'), + (2,'小傅哥','xfg_DhmjDx','+86 13521408***','13811216','《手写MyBatis:渐进式源码实践》','86253998065',1,128.00,50.00,0.00,78.00,'2023-11-02 07:38:00',0,0,'42dcfeae7c2c45eb9d6fb921a8a71104',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-11-02 15:38:00','2023-11-02 15:38:00'); + +/*!40000 ALTER TABLE `user_order_3` ENABLE KEYS */; +UNLOCK TABLES; + + + +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/sql/xxl_job.sql b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/sql/xxl_job.sql new file mode 100644 index 0000000000000000000000000000000000000000..a2cc4c29d42995eed4a47520b527d8581820fdb5 --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/docs/dev-ops/environment/sql/xxl_job.sql @@ -0,0 +1,121 @@ +# 获取地址:https://github.com/xuxueli/xxl-job/tree/master/doc/db +# XXL-JOB v2.4.1-SNAPSHOT +# Copyright (c) 2015-present, xuxueli. + +CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_0900_ai_ci; +use `xxl_job`; + +SET NAMES utf8mb4; + +CREATE TABLE `xxl_job_info` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `job_group` int(11) NOT NULL COMMENT '执行器主键ID', + `job_desc` varchar(255) NOT NULL, + `add_time` datetime DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `author` varchar(64) DEFAULT NULL COMMENT '作者', + `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件', + `schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型', + `schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型', + `misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略', + `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略', + `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler', + `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数', + `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略', + `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒', + `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数', + `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型', + `glue_source` mediumtext COMMENT 'GLUE源代码', + `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注', + `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间', + `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔', + `trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行', + `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间', + `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_log` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `job_group` int(11) NOT NULL COMMENT '执行器主键ID', + `job_id` int(11) NOT NULL COMMENT '任务,主键ID', + `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址', + `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler', + `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数', + `executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2', + `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数', + `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间', + `trigger_code` int(11) NOT NULL COMMENT '调度-结果', + `trigger_msg` text COMMENT '调度-日志', + `handle_time` datetime DEFAULT NULL COMMENT '执行-时间', + `handle_code` int(11) NOT NULL COMMENT '执行-状态', + `handle_msg` text COMMENT '执行-日志', + `alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败', + PRIMARY KEY (`id`), + KEY `I_trigger_time` (`trigger_time`), + KEY `I_handle_code` (`handle_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_log_report` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `trigger_day` datetime DEFAULT NULL COMMENT '调度-时间', + `running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量', + `suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量', + `fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量', + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_logglue` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `job_id` int(11) NOT NULL COMMENT '任务,主键ID', + `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型', + `glue_source` mediumtext COMMENT 'GLUE源代码', + `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注', + `add_time` datetime DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_registry` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `registry_group` varchar(50) NOT NULL, + `registry_key` varchar(255) NOT NULL, + `registry_value` varchar(255) NOT NULL, + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_group` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app_name` varchar(64) NOT NULL COMMENT '执行器AppName', + `title` varchar(12) NOT NULL COMMENT '执行器名称', + `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入', + `address_list` text COMMENT '执行器地址列表,多地址逗号分隔', + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `username` varchar(50) NOT NULL COMMENT '账号', + `password` varchar(50) NOT NULL COMMENT '密码', + `role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员', + `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割', + PRIMARY KEY (`id`), + UNIQUE KEY `i_username` (`username`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `xxl_job_lock` ( + `lock_name` varchar(50) NOT NULL COMMENT '锁名称', + PRIMARY KEY (`lock_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2018-11-03 22:21:31' ); +INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', ''); +INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL); +INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock'); + +commit; \ No newline at end of file diff --git a/scaffold/src/main/resources/archetype-resources/pom.xml b/scaffold/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d12c81c37baba85bfd1d60d130590e8a49e950a --- /dev/null +++ b/scaffold/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,234 @@ + + + 4.0.0 + + ${groupId} + ${artifactId} + ${version} + pom + + + ${rootArtifactId}-api + ${rootArtifactId}-app + ${rootArtifactId}-domain + ${rootArtifactId}-trigger + ${rootArtifactId}-infrastructure + ${rootArtifactId}-types + + + + 1.8 + UTF-8 + 8 + 8 + UTF-8 + + + + + xiaofuge + 184172133@qq.com + fuzhengwei + https://github.com/fuzhengwei + + + + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0 + + + + + org.springframework.boot + spring-boot-starter-parent + 2.7.12 + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.4 + + + + mysql + mysql-connector-java + 8.0.22 + + + com.alibaba + fastjson + 2.0.28 + + + org.apache.commons + commons-lang3 + 3.9 + + + com.google.guava + guava + 32.1.3-jre + + + dom4j + dom4j + 1.6.1 + + + com.thoughtworks.xstream + xstream + 1.4.10 + + + io.jsonwebtoken + jjwt + 0.9.1 + + + com.auth0 + java-jwt + 4.4.0 + + + commons-codec + commons-codec + 1.15 + + + org.apache.dubbo + dubbo + 3.0.9 + + + org.apache.dubbo + dubbo-spring-boot-starter + 3.0.9 + + + com.alibaba.nacos + nacos-client + 2.1.0 + + + org.redisson + redisson-spring-boot-starter + 3.23.4 + + + org.apache.shardingsphere + shardingsphere-jdbc-core + 5.4.1 + + + org.yaml + snakeyaml + 1.33 + + + com.xuxueli + xxl-job-core + 2.4.0 + + + org.apache.rocketmq + rocketmq-client-java + 5.0.4 + + + org.apache.rocketmq + rocketmq-spring-boot-starter + 2.2.0 + + + + + ${groupId} + ${rootArtifactId}-domain + ${version} + + + ${groupId} + ${rootArtifactId}-infrastructure + ${version} + + + ${groupId} + ${rootArtifactId}-types + ${version} + + + ${groupId} + ${rootArtifactId}-trigger + ${version} + + + ${groupId} + ${rootArtifactId}-api + ${version} + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + org.apache.maven.plugins + maven-resources-plugin + 2.5 + + UTF-8 + + + + org.codehaus.mojo + versions-maven-plugin + 2.7 + + + + + + + dev + + true + + + -Xms1G -Xmx1G -server -XX:MaxPermSize=256M -Xss256K -Dspring.profiles.active=test -XX:+DisableExplicitGC -XX:+UseG1GC -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/xfg-frame-archetype-std-boot -Xloggc:/export/Logs/xfg-frame-archetype-std-boot/gc-xfg-frame-archetype-std-boot.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps + dev + + + + test + + -Xms1G -Xmx1G -server -XX:MaxPermSize=256M -Xss256K -Dspring.profiles.active=test -XX:+DisableExplicitGC -XX:+UseG1GC -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/xfg-frame-archetype-std-boot -Xloggc:/export/Logs/xfg-frame-archetype-std-boot/gc-xfg-frame-archetype-std-boot.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps + test + + + + prod + + -Xms6G -Xmx6G -server -XX:MaxPermSize=256M -Xss256K -Dspring.profiles.active=release -XX:+DisableExplicitGC -XX:+UseG1GC -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/fq-mall-activity-app -Xloggc:/export/Logs/xfg-frame-archetype-std-boot/gc-xfg-frame-archetype-std-boot.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps + prod + + + + + diff --git a/scaffold/src/test/resources/projects/basic/archetype.properties b/scaffold/src/test/resources/projects/basic/archetype.properties new file mode 100644 index 0000000000000000000000000000000000000000..19f97e41b9d55ac6110bb532bc7c584bebc9db76 --- /dev/null +++ b/scaffold/src/test/resources/projects/basic/archetype.properties @@ -0,0 +1,10 @@ +#Mon Oct 30 15:50:35 CST 2023 +package=cn.bugstack +version=1.0.0-SNAPSHOT +groupId=cn.bugstack +artifactId=xfg-frame-archetype-std +gitignore=.gitignore +appName=xfg-ddd +uAppName=XfgDDD +author=system +date=2023-10-24 10:24 \ No newline at end of file diff --git a/scaffold/src/test/resources/projects/basic/goal.txt b/scaffold/src/test/resources/projects/basic/goal.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/xfg-frame-archetype-std-app/src/main/java/cn/bugstack/config/RedisClientConfig.java b/xfg-frame-archetype-std-app/src/main/java/cn/bugstack/config/RedisClientConfig.java index 8add0cba3ef1c984f7f0177ac59a82325c372e10..0c64f6c8c4dd2ff94c58ebc3119fce8ad2c9f6a9 100644 --- a/xfg-frame-archetype-std-app/src/main/java/cn/bugstack/config/RedisClientConfig.java +++ b/xfg-frame-archetype-std-app/src/main/java/cn/bugstack/config/RedisClientConfig.java @@ -36,7 +36,7 @@ public class RedisClientConfig { config.useSingleServer() .setAddress("redis://" + properties.getHost() + ":" + properties.getPort()) - .setPassword(properties.getPassword()) +// .setPassword(properties.getPassword()) .setConnectionPoolSize(properties.getPoolSize()) .setConnectionMinimumIdleSize(properties.getMinIdleSize()) .setIdleConnectionTimeout(properties.getIdleTimeout()) diff --git a/xfg-frame-archetype-std-app/src/main/resources/application-dev.yml b/xfg-frame-archetype-std-app/src/main/resources/application-dev.yml index f258824d68213d67ef78180a5742850d6266c94c..ce97672a140f85f63db6663db3cf8f151e8a74e7 100644 --- a/xfg-frame-archetype-std-app/src/main/resources/application-dev.yml +++ b/xfg-frame-archetype-std-app/src/main/resources/application-dev.yml @@ -28,7 +28,6 @@ redis: config: host: 127.0.0.1 port: 6379 - password: 123456 pool-size: 10 min-idle-size: 5 idle-timeout: 30000