This commit is contained in:
TanJ 2024-12-02 15:23:06 +08:00
commit 8bcbf1b26b
32 changed files with 955 additions and 0 deletions

39
.gitignore vendored Normal file
View File

@ -0,0 +1,39 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
.idea
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

3
Dockerfile Normal file
View File

@ -0,0 +1,3 @@
FROM harbor.axzo.cn/images_base/jdk1.8-fc:v1
COPY server/target/demo-server.jar ./demo-server.jar
ENTRYPOINT [{ENTRYPOINT}]

0
README.md Normal file
View File

27
orgmanax-api/pom.xml Normal file
View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.axzo.infra</groupId>
<artifactId>axzo-parent</artifactId>
<version>2.4.13.4</version>
</parent>
<groupId>cn.axzo.orgmanax</groupId>
<artifactId>orgmanax-api</artifactId>
<version>${revision}</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,13 @@
package cn.axzo.orgmanax.config;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
/**
* @author tanjie@axzo.cn
* @date 2022/4/25 10:48
*/
@Configuration
@EnableFeignClients(basePackages = "cn.axzo.orgmanax.feign")
public class OrgmanaxApiConfig {
}

View File

@ -0,0 +1,17 @@
package cn.axzo.orgmanax.feign;
import org.springframework.cloud.openfeign.FeignClient;
/**
*
* @author tanjie@axzo.cn
*/
@FeignClient(
value = "orgmanax",
url = "${axzo.service.orgmanax:http://orgmanax:8080}")
public interface OrganizationalUnitApi {
}

View File

@ -0,0 +1,13 @@
package cn.axzo.orgmanax;
/**
*
* 对外提供的RPC接口
* 1.该模块要做到尽量轻量级
* 2.不允许依赖其它服务的api或者service
* 3.不允许依赖本项目的service
* 4.可以依赖common
* 5.做好内部防御如批量查询分页限制等防止外部服务打爆自身
*
*/

View File

@ -0,0 +1 @@
package cn.axzo.orgmanax.req;

View File

@ -0,0 +1 @@
package cn.axzo.orgmanax.resp;

View File

@ -0,0 +1,2 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.axzo.orgmanax.config.OrgmanaxApiConfig

38
orgmanax-common/.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

20
orgmanax-common/pom.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.axzo.orgmanax</groupId>
<artifactId>orgmanax</artifactId>
<version>${revision}</version>
</parent>
<artifactId>orgmanax-common</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@ -0,0 +1,6 @@
package cn.axzo.orgmanax.config;
/**
* 公共组件枚举等
*
*
*/

38
orgmanax-domain/.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

20
orgmanax-domain/pom.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.axzo.orgmanax</groupId>
<artifactId>orgmanax</artifactId>
<version>${revision}</version>
</parent>
<artifactId>orgmanax-domain</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@ -0,0 +1,11 @@
package cn.axzo.orgmanax;
/**
* @author tanjie@axzo.cn
* @date 2024/11/28 15:52
*/
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}

38
orgmanax-infra/.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

73
orgmanax-infra/pom.xml Normal file
View File

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.axzo.orgmanax</groupId>
<artifactId>orgmanax</artifactId>
<version>${revision}</version>
</parent>
<artifactId>orgmanax-infra</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>cn.axzo.orgmanax</groupId>
<artifactId>orgmanax-domain</artifactId>
<version>${project.version}</version>
</dependency>
<!-- rocket相关的包 -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
</dependency>
<!-- rocket相关的包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- TODO 根据项目需要, 使用不同的组件-->
<!---->
<dependency>
<groupId>cn.axzo.foundation</groupId>
<artifactId>dao-support-lib</artifactId>
</dependency>
<dependency>
<groupId>cn.axzo.foundation</groupId>
<artifactId>web-support-lib</artifactId>
</dependency>
<dependency>
<groupId>cn.axzo.foundation</groupId>
<artifactId>event-support-lib</artifactId>
</dependency>
<dependency>
<groupId>cn.axzo.foundation</groupId>
<artifactId>unittest-support-lib</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.6</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,39 @@
package cn.axzo.orgmanax.client;
import cn.axzo.foundation.web.support.apps.AppCenter;
import cn.axzo.foundation.web.support.rpc.RpcClient;
import cn.axzo.foundation.web.support.rpc.RpcClientWrapper;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Component
@RequiredArgsConstructor
public class RpcClientHolder {
final AppCenter appCenter;
private final RpcClient rpcClient;
private final LoadingCache<String, RpcClient> rpcClientCache = CacheBuilder.newBuilder()
.maximumSize(50)
.expireAfterAccess(10, TimeUnit.MINUTES)
.build(new CacheLoader<String, RpcClient>() {
@Override
public RpcClient load(String key) {
return RpcClientWrapper.builder()
.normalRpcClient(rpcClient)
.appResolver(() -> appCenter.getByName(key))
.build();
}
});
public RpcClient getRpcClient(String appName) {
RpcClient result = rpcClientCache.getUnchecked(appName);
Objects.requireNonNull(result);
return result;
}
}

View File

@ -0,0 +1,103 @@
package cn.axzo.orgmanax.config;
import cn.axzo.foundation.web.support.AppRuntime;
import cn.axzo.foundation.web.support.apps.AppCenter;
import cn.axzo.foundation.web.support.apps.AppCenterImpl;
import cn.axzo.foundation.web.support.config.DefaultWebMvcConfig;
import cn.axzo.foundation.web.support.exception.AbstractExceptionHandler;
import cn.axzo.foundation.web.support.log.RequestLogAspect;
import cn.axzo.foundation.web.support.rpc.RpcClient;
import cn.axzo.foundation.web.support.rpc.RpcClientImpl;
import com.google.common.collect.ImmutableMap;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration;
import org.springframework.boot.task.TaskExecutorBuilder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;
import org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.function.Consumer;
import static org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME;
/**
* Server服务唯一的配置入口
* TODO 按需启用/禁用
*/
@Slf4j
@Configuration
@Import({DefaultWebMvcConfig.class,
MybatisPlusConfig.class,
RocketMQEventConfig.class})
public class Config {
@Value("${web.debug.host:}")
private String debugHost;
@Bean
public ScheduledThreadPoolExecutor scheduledThreadPoolExecutor(AppRuntime appRuntime) {
// bfs-client会使用这个scheduler
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor =
new ScheduledThreadPoolExecutor(1, new ThreadFactoryBuilder()
.setNameFormat(appRuntime.getAppName() + "-%d").build());
scheduledThreadPoolExecutor.setMaximumPoolSize(8);
return scheduledThreadPoolExecutor;
}
/**
* XXX Spring默认配置当有Executor的bean后不再装载TaskExecutor, 这里因为手动注册了
* {@link #scheduledThreadPoolExecutor}会导致spring不再自动注册TaskExecutor, 因此需要去掉ConditionalOnMissingBean的限制.
* 参考{@link TaskExecutionAutoConfiguration#applicationTaskExecutor}
*/
@Bean(name = {APPLICATION_TASK_EXECUTOR_BEAN_NAME,
AsyncAnnotationBeanPostProcessor.DEFAULT_TASK_EXECUTOR_BEAN_NAME})
public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) {
ThreadPoolTaskExecutor executor = builder.build();
executor.setThreadNamePrefix("bfs-task");
// prevent interrupting running tasks
// https://www.baeldung.com/spring-boot-graceful-shutdown
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
@Bean
AppRuntime appRuntime(ApplicationContext applicationContext) {
return AppRuntime.builder().applicationContext(applicationContext).build();
}
@Bean
public RequestLogAspect requestLogAspect() {
return RequestLogAspect.builder().build();
}
@Bean
@Primary
public RpcClient rpcClient() {
return RpcClientImpl.builder().build();
}
@Bean
@Profile({"!unittest && !local"})
AbstractExceptionHandler.ExceptionHandlerHook exceptionHandlerHook() {
return new AbstractExceptionHandler.ExceptionHandlerHook() {
@Override
public Consumer<AbstractExceptionHandler.ExceptionContext> getExceptionConsumer() {
return context -> log.error("未捕获内部异常",
"logText: {}", context.dumpRequest(), context.getException());
}
};
}
@Bean
AppCenter appCenter(ScheduledThreadPoolExecutor scheduledThreadPoolExecutor) {
return AppCenterImpl.builder()
.executor(scheduledThreadPoolExecutor)
.debugHost(debugHost)
//本地调试 需要特殊映射的路径 key=服务名 value = host后的映射的服务路径
.debugAppRoutes(ImmutableMap.of("data-collection", "dataCollection"))
.build();
}
}

View File

@ -0,0 +1,45 @@
package cn.axzo.orgmanax.config;
import cn.axzo.foundation.dao.support.mysql.plugins.LimitInterceptor;
import cn.axzo.foundation.web.support.conditional.LocalCondition;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Slf4j
@EnableTransactionManagement
@MapperScan("cn.axzo.**.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> {
LimitInterceptor limitInterceptor = LimitInterceptor.builder()
.overflowConsumer(limitContext -> {
log.warn("数据库击穿告警, sql = {}, limitSize = {}", limitContext.getSql(), limitContext.getLimitSize());
})
.build();
configuration.addInterceptor(limitInterceptor);
};
}
/**
* 本地启动默认打印sql日志
*/
@Bean
@LocalCondition.Conditional
public ConfigurationCustomizer localConfigurationCustomizer() {
return configuration -> configuration.setLogImpl(StdOutImpl.class);
}
}

View File

@ -0,0 +1,108 @@
package cn.axzo.orgmanax.config;
import cn.axzo.foundation.event.support.consumer.*;
import cn.axzo.foundation.event.support.producer.EventProducer;
import cn.axzo.foundation.event.support.producer.RocketMQEventProducer;
import cn.axzo.foundation.web.support.AppRuntime;
import cn.axzo.foundation.web.support.conditional.NonLocalCondition;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
* 如果需要使用mq, 则启用该类, 并设置DEFAULT_MODULE为当前服务名称
*/
@Slf4j
public class RocketMQEventConfig {
public static final String DEFAULT_MODULE = "archetype-server";
@Value("topic_${spring.application.name}_${spring.profiles.active}")
private String currentTopic;
@Value("topic_${spring.application.name}_retry_${spring.profiles.active}")
private String currentRetryTopic;
/**
* 注意这里不能使用@Configuration因为会导致该类被spring代理代理类上注解无法使用 clazz.getAnnotation(RocketMQMessageListener.class)方式获取到注解信息
* {@link org.apache.rocketmq.spring.autoconfigure.ListenerContainerConfiguration}使用了这种方式导致启动报错所以需要在外部import该配置类
*/
@NonLocalCondition.Conditional
@Component
// XXX: consumerGroup 必须全局唯一. RocketMQ要求同一个Consumer Group的消费者必须要拥有相同的注册信息即必须要听一样的topic(并且tag也一样)
// 这里通个添加 topic信息来保证唯一.
@RocketMQMessageListener(topic = "topic_${spring.application.name}_${spring.profiles.active}",
consumerGroup = "GID_${spring.application.name}_${spring.application.name}_${spring.profiles.active}",
consumeMode = ConsumeMode.ORDERLY, enableMsgTrace = false)
public static class Listener extends DefaultRocketMQListener {
public Listener(EventConsumer eventConsumer) {
super(eventConsumer);
}
}
@NonLocalCondition.Conditional
@Component
// XXX: consumerGroup 必须全局唯一. RocketMQ要求同一个Consumer Group的消费者必须要拥有相同的注册信息即必须要听一样的topic(并且tag也一样)
// 这里通个添加 topic信息来保证唯一.
@RocketMQMessageListener(topic = "topic_${spring.application.name}_retry_${spring.profiles.active}",
consumerGroup = "GID_${spring.application.name}_retry_${spring.application.name}_${spring.profiles.active}",
consumeMode = ConsumeMode.ORDERLY, enableMsgTrace = false)
public static class RetryListener extends DefaultRocketMQListener {
public RetryListener(RetryableEventConsumer retryableEventConsumer) {
super(retryableEventConsumer);
}
}
@NonLocalCondition.Conditional
@Component
// XXX: consumerGroup 必须全局唯一. RocketMQ要求同一个Consumer Group的消费者必须要拥有相同的注册信息即必须要听一样的topic(并且tag也一样)
// 这里通个添加 topic信息来保证唯一.
@RocketMQMessageListener(topic = "topic_workflow_engine_${spring.profiles.active}",
consumerGroup = "GID_${spring.application.name}_workflow_engine_${spring.profiles.active}",
consumeMode = ConsumeMode.ORDERLY, enableMsgTrace = false)
public static class WorkflowListener extends DefaultRocketMQListener {
public WorkflowListener(EventConsumer eventConsumer) {
super(eventConsumer);
}
}
@Bean
EventHandlerRepository eventHandlerRepository() {
return EventHandlerRepository.builder()
.build();
}
@Bean
EventConsumer eventConsumer(EventHandlerRepository eventHandlerRepository) {
return DefaultEventConsumer.builder().handlerRepository(eventHandlerRepository).build();
}
@Bean
RetryableEventConsumer retryableEventConsumer(EventConsumer eventConsumer, EventProducer eventProducer) {
return RocketRetryableEventConsumer.builder()
.eventConsumer(eventConsumer)
.eventProducer(eventProducer)
.retryTopic(currentRetryTopic)
.build();
}
@Bean
EventProducer eventProducer(AppRuntime appRuntime,
RocketMQTemplate rocketMQTemplate) {
return new RocketMQEventProducer(rocketMQTemplate,
appRuntime.getAppName(),
appRuntime.getAppName(),
EventProducer.Context.<RocketMQEventProducer.RocketMQMessageMeta>builder()
.meta(RocketMQEventProducer.RocketMQMessageMeta.builder()
.topic(currentTopic)
.build())
.build(),
(event, rocketMQMessageMetaContext) -> {
//发送后回调 可以处理事件发送统计
});
}
}

View File

@ -0,0 +1,8 @@
package cn.axzo.orgmanax;
/**
* @(#)package-info.java
* 基础设施层
* 1.封装外部依赖
* 2.封装外部组件
*
*/

38
orgmanax-server/.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

40
orgmanax-server/pom.xml Normal file
View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.axzo.orgmanax</groupId>
<artifactId>orgmanax</artifactId>
<version>${revision}</version>
</parent>
<artifactId>orgmanax-server</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>cn.axzo.orgmanax</groupId>
<artifactId>orgmanax-domain</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.axzo.orgmanax</groupId>
<artifactId>orgmanax-infra</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,38 @@
package cn.axzo.orgmanax;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
/**
* @author tanjie@axzo.cn
* @date 2024/11/28 15:54
*/
@SpringBootApplication
@Slf4j
public class OrgmanaxApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(OrgmanaxApplication.class, args);
Environment env = run.getEnvironment();
log.info(
"--------------------------------------------------------------------------------------------------------------------\n" +
"Application 【{}】 is running on 【{}】 environment!\n" +
"Api Local: \thttp://127.0.0.1:{}\n" +
"Mysql: \t{}\t username:{}\n" +
"Redis: \t{}:{}\t database:{}\n" +
"RabbitMQ: \t{}\t username:{}",
env.getProperty("spring.application.name"),
env.getProperty("spring.profiles.active"),
env.getProperty("server.port"),
env.getProperty("spring.datasource.url"),
env.getProperty("spring.datasource.username"),
env.getProperty("spring.redis.host"),
env.getProperty("spring.redis.port"),
env.getProperty("spring.redis.database"),
env.getProperty("spring.rabbitmq.addresses"),
env.getProperty("spring.rabbitmq.username") +
"\n----------------------------------------------------------");
}
}

View File

@ -0,0 +1,4 @@
/**
* @(#)package-info.java
* controller层
*/

View File

@ -0,0 +1,14 @@
package cn.axzo.orgmanax.controller.unit;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author tanjie@axzo.cn
* @date 2024/12/2 15:01
*/
@RestController
@RequestMapping("/organizational-unit")
public class OrganizationalUnit {
}

View File

@ -0,0 +1,8 @@
package cn.axzo.orgmanax.service;
/**
* @(#)service层
* 该层为业务实现但是只关注业务的流程针对domain或者infra完成整个业务的编排不包含具体业务逻辑实现
* 依赖domain层或者infra层
*
*/

View File

@ -0,0 +1,30 @@
spring:
application:
name: orgmanax
jackson:
time-zone: GMT+8
serialization:
write-dates-as-timestamps: true
generator:
write-bigdecimal-as-plain: true
deserialization:
fail-on-unknown-properties: false
read-unknown-enum-values-as-null: true
main:
allow-bean-definition-overriding: true
#指定激活环境
profiles:
active: ${NACOS_PROFILES_ACTIVE:dev}
cloud:
nacos:
config:
server-addr: ${NACOS_HOST}:${NACOS_PORT}
file-extension: yaml
namespace: ${NACOS_NAMESPACE_ID}
lifecycle:
timeout-per-shutdown-phase: 30s
# 优雅关闭
server:
shutdown: graceful

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 导入安心筑全局日志配置 -->
<include resource="logback/logback-axzo.xml"/>
<!-- 覆盖开发环境日志配置 -->
<springProfile name="local,dev,test">
<logger name="cn.axzo" level="DEBUG"/>
</springProfile>
</configuration>

111
pom.xml Normal file
View File

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>cn.axzo.infra</groupId>
<artifactId>axzo-parent</artifactId>
<version>2.4.13.4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>cn.axzo.orgmanax</groupId>
<artifactId>orgmanax</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 2nd dependencies -->
<foundation-support-lib>2.0.0-SNAPSHOT</foundation-support-lib>
<spring-cloud-starter-alibaba-nacos.version>2021.1</spring-cloud-starter-alibaba-nacos.version>
<spring-cloud-starter-bootstrap.version>3.0.6</spring-cloud-starter-bootstrap.version>
<mybatis-plus.version>3.5.6</mybatis-plus.version>
<rocket-mq.version>2.2.3</rocket-mq.version>
<revision>2.0.0-SNAPSHOT</revision>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${spring-cloud-starter-alibaba-nacos.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>${spring-cloud-starter-bootstrap.version}</version>
</dependency>
<dependency>
<groupId>cn.axzo.foundation</groupId>
<artifactId>web-support-lib</artifactId>
<version>${foundation-support-lib}</version>
</dependency>
<dependency>
<groupId>cn.axzo.foundation</groupId>
<artifactId>dao-support-lib</artifactId>
<version>${foundation-support-lib}</version>
</dependency>
<dependency>
<groupId>cn.axzo.foundation</groupId>
<artifactId>event-support-lib</artifactId>
<version>${foundation-support-lib}</version>
</dependency>
<dependency>
<groupId>cn.axzo.foundation</groupId>
<artifactId>redis-support-lib</artifactId>
<version>${foundation-support-lib}</version>
</dependency>
<dependency>
<groupId>cn.axzo.foundation</groupId>
<artifactId>unittest-support-lib</artifactId>
<version>${foundation-support-lib}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>${rocket-mq.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- maven-compiler-plugin 插件,解决 Lombok 组合 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>axzo</id>
<name>axzo repository</name>
<url>https://nexus.axzo.cn/repository/axzo/</url>
</repository>
</repositories>
<modules>
<module>orgmanax-api</module>
<module>orgmanax-common</module>
<module>orgmanax-domain</module>
<module>orgmanax-server</module>
<module>orgmanax-infra</module>
</modules>
</project>