diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
new file mode 100644
index 0000000..c150a12
--- /dev/null
+++ b/casic-server/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-security-cockpit
+ 2.0.0
+ ../pom.xml
+
+
+ casic-server
+ 2.0.0
+ jar
+ casic-server
+ casic 的spring boot版本
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+ provided
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${boot.version}
+ provided
+
+
+
+
+ com.hikvision.ga
+ artemis-http-client
+ 1.1.3
+
+
+ commons-io
+ commons-io
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.4.5
+
+
+ io.netty
+ netty-all
+ 4.1.42.Final
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
new file mode 100644
index 0000000..c150a12
--- /dev/null
+++ b/casic-server/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-security-cockpit
+ 2.0.0
+ ../pom.xml
+
+
+ casic-server
+ 2.0.0
+ jar
+ casic-server
+ casic 的spring boot版本
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+ provided
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${boot.version}
+ provided
+
+
+
+
+ com.hikvision.ga
+ artemis-http-client
+ 1.1.3
+
+
+ commons-io
+ commons-io
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.4.5
+
+
+ io.netty
+ netty-all
+ 4.1.42.Final
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
new file mode 100644
index 0000000..3a60b9e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
@@ -0,0 +1,36 @@
+package com.casic.missiles.modular.async;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+ @Override
+ public Executor getAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //核心线程数
+ executor.setCorePoolSize(5);
+ //最大线程数
+ executor.setMaxPoolSize(10);
+ //队列容量
+ executor.setQueueCapacity(20);
+ //设置线程活跃时间(秒)
+ executor.setKeepAliveSeconds(60);
+ //默认线程名称
+ executor.setThreadNamePrefix("user-rpt-");
+ //拒绝策略
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ //等待所有任务结束后再关闭线程池
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
new file mode 100644
index 0000000..c150a12
--- /dev/null
+++ b/casic-server/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-security-cockpit
+ 2.0.0
+ ../pom.xml
+
+
+ casic-server
+ 2.0.0
+ jar
+ casic-server
+ casic 的spring boot版本
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+ provided
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${boot.version}
+ provided
+
+
+
+
+ com.hikvision.ga
+ artemis-http-client
+ 1.1.3
+
+
+ commons-io
+ commons-io
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.4.5
+
+
+ io.netty
+ netty-all
+ 4.1.42.Final
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
new file mode 100644
index 0000000..3a60b9e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
@@ -0,0 +1,36 @@
+package com.casic.missiles.modular.async;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+ @Override
+ public Executor getAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //核心线程数
+ executor.setCorePoolSize(5);
+ //最大线程数
+ executor.setMaxPoolSize(10);
+ //队列容量
+ executor.setQueueCapacity(20);
+ //设置线程活跃时间(秒)
+ executor.setKeepAliveSeconds(60);
+ //默认线程名称
+ executor.setThreadNamePrefix("user-rpt-");
+ //拒绝策略
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ //等待所有任务结束后再关闭线程池
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
new file mode 100644
index 0000000..8ca554c
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.modular.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+// tomcat启动无需配置
+@Configuration
+public class WebSocketConfig {
+ /**
+ * 注入ServerEndpointExporter,
+ * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
+ */
+ @Bean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
new file mode 100644
index 0000000..c150a12
--- /dev/null
+++ b/casic-server/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-security-cockpit
+ 2.0.0
+ ../pom.xml
+
+
+ casic-server
+ 2.0.0
+ jar
+ casic-server
+ casic 的spring boot版本
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+ provided
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${boot.version}
+ provided
+
+
+
+
+ com.hikvision.ga
+ artemis-http-client
+ 1.1.3
+
+
+ commons-io
+ commons-io
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.4.5
+
+
+ io.netty
+ netty-all
+ 4.1.42.Final
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
new file mode 100644
index 0000000..3a60b9e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
@@ -0,0 +1,36 @@
+package com.casic.missiles.modular.async;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+ @Override
+ public Executor getAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //核心线程数
+ executor.setCorePoolSize(5);
+ //最大线程数
+ executor.setMaxPoolSize(10);
+ //队列容量
+ executor.setQueueCapacity(20);
+ //设置线程活跃时间(秒)
+ executor.setKeepAliveSeconds(60);
+ //默认线程名称
+ executor.setThreadNamePrefix("user-rpt-");
+ //拒绝策略
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ //等待所有任务结束后再关闭线程池
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
new file mode 100644
index 0000000..8ca554c
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.modular.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+// tomcat启动无需配置
+@Configuration
+public class WebSocketConfig {
+ /**
+ * 注入ServerEndpointExporter,
+ * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
+ */
+ @Bean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
new file mode 100644
index 0000000..34fe2cd
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
@@ -0,0 +1,39 @@
+package com.casic.missiles.modular.controller;
+
+
+import com.casic.missiles.model.application.event.core.EventPublisher;
+import com.casic.missiles.model.application.event.enums.ModelEventTypeEnum;
+import com.casic.missiles.model.response.ResponseData;
+import com.casic.missiles.modular.event.UserEvent;
+import com.casic.missiles.modular.system.model.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: DemoController
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+ @Autowired
+ private EventPublisher publisher;
+
+ /**
+ * 获取mockToken
+ */
+ @PostMapping("/list")
+ @ResponseBody
+ public Object list() {
+ User user = new User();
+ user.setAccount("张三");
+ publisher.publishEvent(new UserEvent(ModelEventTypeEnum.ADD, user));
+ return ResponseData.success();
+ }
+
+
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
new file mode 100644
index 0000000..c150a12
--- /dev/null
+++ b/casic-server/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-security-cockpit
+ 2.0.0
+ ../pom.xml
+
+
+ casic-server
+ 2.0.0
+ jar
+ casic-server
+ casic 的spring boot版本
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+ provided
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${boot.version}
+ provided
+
+
+
+
+ com.hikvision.ga
+ artemis-http-client
+ 1.1.3
+
+
+ commons-io
+ commons-io
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.4.5
+
+
+ io.netty
+ netty-all
+ 4.1.42.Final
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
new file mode 100644
index 0000000..3a60b9e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
@@ -0,0 +1,36 @@
+package com.casic.missiles.modular.async;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+ @Override
+ public Executor getAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //核心线程数
+ executor.setCorePoolSize(5);
+ //最大线程数
+ executor.setMaxPoolSize(10);
+ //队列容量
+ executor.setQueueCapacity(20);
+ //设置线程活跃时间(秒)
+ executor.setKeepAliveSeconds(60);
+ //默认线程名称
+ executor.setThreadNamePrefix("user-rpt-");
+ //拒绝策略
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ //等待所有任务结束后再关闭线程池
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
new file mode 100644
index 0000000..8ca554c
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.modular.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+// tomcat启动无需配置
+@Configuration
+public class WebSocketConfig {
+ /**
+ * 注入ServerEndpointExporter,
+ * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
+ */
+ @Bean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
new file mode 100644
index 0000000..34fe2cd
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
@@ -0,0 +1,39 @@
+package com.casic.missiles.modular.controller;
+
+
+import com.casic.missiles.model.application.event.core.EventPublisher;
+import com.casic.missiles.model.application.event.enums.ModelEventTypeEnum;
+import com.casic.missiles.model.response.ResponseData;
+import com.casic.missiles.modular.event.UserEvent;
+import com.casic.missiles.modular.system.model.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: DemoController
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+ @Autowired
+ private EventPublisher publisher;
+
+ /**
+ * 获取mockToken
+ */
+ @PostMapping("/list")
+ @ResponseBody
+ public Object list() {
+ User user = new User();
+ user.setAccount("张三");
+ publisher.publishEvent(new UserEvent(ModelEventTypeEnum.ADD, user));
+ return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
new file mode 100644
index 0000000..aff2889
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.event;
+
+import com.casic.missiles.model.application.event.core.ModelEvent;
+import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum;
+import com.casic.missiles.modular.system.model.User;
+
+/**
+ * @Description: 用户事件
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:23
+ */
+public class UserEvent extends ModelEvent {
+ /**
+ * Create a new {@code ApplicationEvent}.
+ *
+ * @param type 事件类型
+ * @param source the object on which the event initially occurred or with
+ * which the event is associated (never {@code null})
+ */
+ public UserEvent(AbstractEventTypeEnum type, User source) {
+ super(type, source);
+ }
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
new file mode 100644
index 0000000..c150a12
--- /dev/null
+++ b/casic-server/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-security-cockpit
+ 2.0.0
+ ../pom.xml
+
+
+ casic-server
+ 2.0.0
+ jar
+ casic-server
+ casic 的spring boot版本
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+ provided
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${boot.version}
+ provided
+
+
+
+
+ com.hikvision.ga
+ artemis-http-client
+ 1.1.3
+
+
+ commons-io
+ commons-io
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.4.5
+
+
+ io.netty
+ netty-all
+ 4.1.42.Final
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
new file mode 100644
index 0000000..3a60b9e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
@@ -0,0 +1,36 @@
+package com.casic.missiles.modular.async;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+ @Override
+ public Executor getAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //核心线程数
+ executor.setCorePoolSize(5);
+ //最大线程数
+ executor.setMaxPoolSize(10);
+ //队列容量
+ executor.setQueueCapacity(20);
+ //设置线程活跃时间(秒)
+ executor.setKeepAliveSeconds(60);
+ //默认线程名称
+ executor.setThreadNamePrefix("user-rpt-");
+ //拒绝策略
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ //等待所有任务结束后再关闭线程池
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
new file mode 100644
index 0000000..8ca554c
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.modular.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+// tomcat启动无需配置
+@Configuration
+public class WebSocketConfig {
+ /**
+ * 注入ServerEndpointExporter,
+ * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
+ */
+ @Bean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
new file mode 100644
index 0000000..34fe2cd
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
@@ -0,0 +1,39 @@
+package com.casic.missiles.modular.controller;
+
+
+import com.casic.missiles.model.application.event.core.EventPublisher;
+import com.casic.missiles.model.application.event.enums.ModelEventTypeEnum;
+import com.casic.missiles.model.response.ResponseData;
+import com.casic.missiles.modular.event.UserEvent;
+import com.casic.missiles.modular.system.model.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: DemoController
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+ @Autowired
+ private EventPublisher publisher;
+
+ /**
+ * 获取mockToken
+ */
+ @PostMapping("/list")
+ @ResponseBody
+ public Object list() {
+ User user = new User();
+ user.setAccount("张三");
+ publisher.publishEvent(new UserEvent(ModelEventTypeEnum.ADD, user));
+ return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
new file mode 100644
index 0000000..aff2889
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.event;
+
+import com.casic.missiles.model.application.event.core.ModelEvent;
+import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum;
+import com.casic.missiles.modular.system.model.User;
+
+/**
+ * @Description: 用户事件
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:23
+ */
+public class UserEvent extends ModelEvent {
+ /**
+ * Create a new {@code ApplicationEvent}.
+ *
+ * @param type 事件类型
+ * @param source the object on which the event initially occurred or with
+ * which the event is associated (never {@code null})
+ */
+ public UserEvent(AbstractEventTypeEnum type, User source) {
+ super(type, source);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
new file mode 100644
index 0000000..8f9603e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.core.application.event.UserLoginEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserOneListener {
+ @EventListener
+ public void onApplicationEvent(UserLoginEvent event) {
+ log.debug("用户1订阅:{}", event);
+ }
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
new file mode 100644
index 0000000..c150a12
--- /dev/null
+++ b/casic-server/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-security-cockpit
+ 2.0.0
+ ../pom.xml
+
+
+ casic-server
+ 2.0.0
+ jar
+ casic-server
+ casic 的spring boot版本
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+ provided
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${boot.version}
+ provided
+
+
+
+
+ com.hikvision.ga
+ artemis-http-client
+ 1.1.3
+
+
+ commons-io
+ commons-io
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.4.5
+
+
+ io.netty
+ netty-all
+ 4.1.42.Final
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
new file mode 100644
index 0000000..3a60b9e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
@@ -0,0 +1,36 @@
+package com.casic.missiles.modular.async;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+ @Override
+ public Executor getAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //核心线程数
+ executor.setCorePoolSize(5);
+ //最大线程数
+ executor.setMaxPoolSize(10);
+ //队列容量
+ executor.setQueueCapacity(20);
+ //设置线程活跃时间(秒)
+ executor.setKeepAliveSeconds(60);
+ //默认线程名称
+ executor.setThreadNamePrefix("user-rpt-");
+ //拒绝策略
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ //等待所有任务结束后再关闭线程池
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
new file mode 100644
index 0000000..8ca554c
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.modular.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+// tomcat启动无需配置
+@Configuration
+public class WebSocketConfig {
+ /**
+ * 注入ServerEndpointExporter,
+ * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
+ */
+ @Bean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
new file mode 100644
index 0000000..34fe2cd
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
@@ -0,0 +1,39 @@
+package com.casic.missiles.modular.controller;
+
+
+import com.casic.missiles.model.application.event.core.EventPublisher;
+import com.casic.missiles.model.application.event.enums.ModelEventTypeEnum;
+import com.casic.missiles.model.response.ResponseData;
+import com.casic.missiles.modular.event.UserEvent;
+import com.casic.missiles.modular.system.model.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: DemoController
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+ @Autowired
+ private EventPublisher publisher;
+
+ /**
+ * 获取mockToken
+ */
+ @PostMapping("/list")
+ @ResponseBody
+ public Object list() {
+ User user = new User();
+ user.setAccount("张三");
+ publisher.publishEvent(new UserEvent(ModelEventTypeEnum.ADD, user));
+ return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
new file mode 100644
index 0000000..aff2889
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.event;
+
+import com.casic.missiles.model.application.event.core.ModelEvent;
+import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum;
+import com.casic.missiles.modular.system.model.User;
+
+/**
+ * @Description: 用户事件
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:23
+ */
+public class UserEvent extends ModelEvent {
+ /**
+ * Create a new {@code ApplicationEvent}.
+ *
+ * @param type 事件类型
+ * @param source the object on which the event initially occurred or with
+ * which the event is associated (never {@code null})
+ */
+ public UserEvent(AbstractEventTypeEnum type, User source) {
+ super(type, source);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
new file mode 100644
index 0000000..8f9603e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.core.application.event.UserLoginEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserOneListener {
+ @EventListener
+ public void onApplicationEvent(UserLoginEvent event) {
+ log.debug("用户1订阅:{}", event);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java
new file mode 100644
index 0000000..0bd52a3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.model.application.event.core.EventSubscriber;
+import com.casic.missiles.modular.event.UserEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserTwoListener extends EventSubscriber {
+ @Override
+ public void onApplicationEvent(UserEvent event) {
+ log.debug("用户2订阅:{}", event);
+ }
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
new file mode 100644
index 0000000..c150a12
--- /dev/null
+++ b/casic-server/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-security-cockpit
+ 2.0.0
+ ../pom.xml
+
+
+ casic-server
+ 2.0.0
+ jar
+ casic-server
+ casic 的spring boot版本
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+ provided
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${boot.version}
+ provided
+
+
+
+
+ com.hikvision.ga
+ artemis-http-client
+ 1.1.3
+
+
+ commons-io
+ commons-io
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.4.5
+
+
+ io.netty
+ netty-all
+ 4.1.42.Final
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
new file mode 100644
index 0000000..3a60b9e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
@@ -0,0 +1,36 @@
+package com.casic.missiles.modular.async;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+ @Override
+ public Executor getAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //核心线程数
+ executor.setCorePoolSize(5);
+ //最大线程数
+ executor.setMaxPoolSize(10);
+ //队列容量
+ executor.setQueueCapacity(20);
+ //设置线程活跃时间(秒)
+ executor.setKeepAliveSeconds(60);
+ //默认线程名称
+ executor.setThreadNamePrefix("user-rpt-");
+ //拒绝策略
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ //等待所有任务结束后再关闭线程池
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
new file mode 100644
index 0000000..8ca554c
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.modular.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+// tomcat启动无需配置
+@Configuration
+public class WebSocketConfig {
+ /**
+ * 注入ServerEndpointExporter,
+ * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
+ */
+ @Bean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
new file mode 100644
index 0000000..34fe2cd
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
@@ -0,0 +1,39 @@
+package com.casic.missiles.modular.controller;
+
+
+import com.casic.missiles.model.application.event.core.EventPublisher;
+import com.casic.missiles.model.application.event.enums.ModelEventTypeEnum;
+import com.casic.missiles.model.response.ResponseData;
+import com.casic.missiles.modular.event.UserEvent;
+import com.casic.missiles.modular.system.model.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: DemoController
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+ @Autowired
+ private EventPublisher publisher;
+
+ /**
+ * 获取mockToken
+ */
+ @PostMapping("/list")
+ @ResponseBody
+ public Object list() {
+ User user = new User();
+ user.setAccount("张三");
+ publisher.publishEvent(new UserEvent(ModelEventTypeEnum.ADD, user));
+ return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
new file mode 100644
index 0000000..aff2889
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.event;
+
+import com.casic.missiles.model.application.event.core.ModelEvent;
+import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum;
+import com.casic.missiles.modular.system.model.User;
+
+/**
+ * @Description: 用户事件
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:23
+ */
+public class UserEvent extends ModelEvent {
+ /**
+ * Create a new {@code ApplicationEvent}.
+ *
+ * @param type 事件类型
+ * @param source the object on which the event initially occurred or with
+ * which the event is associated (never {@code null})
+ */
+ public UserEvent(AbstractEventTypeEnum type, User source) {
+ super(type, source);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
new file mode 100644
index 0000000..8f9603e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.core.application.event.UserLoginEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserOneListener {
+ @EventListener
+ public void onApplicationEvent(UserLoginEvent event) {
+ log.debug("用户1订阅:{}", event);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java
new file mode 100644
index 0000000..0bd52a3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.model.application.event.core.EventSubscriber;
+import com.casic.missiles.modular.event.UserEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserTwoListener extends EventSubscriber {
+ @Override
+ public void onApplicationEvent(UserEvent event) {
+ log.debug("用户2订阅:{}", event);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java b/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java
new file mode 100644
index 0000000..4012170
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java
@@ -0,0 +1,88 @@
+package com.casic.missiles.modular.util;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+import sun.misc.BASE64Decoder;
+
+import java.io.*;
+
+public class Base64Util {
+ /**
+ * base64字符串转换成图片
+ *
+ * @param imgStr base64字符串
+ * @param imgFilePath 图片存放路径
+ * @return
+ * @author ZHANGJL
+ * @dateTime 2018-02-23 14:42:17
+ */
+ public static boolean Base64ToImage(String imgStr, String imgFilePath, String fileDir) { // 对字节数组字符串进行Base64解码并生成图片
+
+ if (StringUtils.isEmpty(imgStr)) // 图像数据为空
+ return false;
+
+ imgStr = imgStr.substring(imgStr.indexOf(",") + 1);
+
+ BASE64Decoder decoder = new BASE64Decoder();
+ try {
+ // Base64解码
+ byte[] b = decoder.decodeBuffer(imgStr);
+
+ for (int i = 0; i < b.length; ++i) {
+ if (b[i] < 0) {// 调整异常数据
+ b[i] += 256;
+ }
+ }
+ //如果已存在图像,先删除
+ File file = new File(fileDir+File.separator + imgFilePath);
+ if (file.exists() && file.isFile()) {
+ file.delete();
+ }
+ File dir = new File(fileDir);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ file = new File(fileDir+File.separator+imgFilePath);
+ file.createNewFile();
+// ImageIO.write(bImage, "bmp", name);
+ OutputStream out = new FileOutputStream(fileDir+File.separator+imgFilePath);
+ out.write(b);
+ out.flush();
+ out.close();
+
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ }
+
+ public static String getBase64FromInputStream(InputStream in) {
+ // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
+ byte[] data = null;
+ // 读取图片字节数组
+ try {
+ ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
+ byte[] buff = new byte[100];
+ int rc = 0;
+ while ((rc = in.read(buff, 0, 100)) > 0) {
+ swapStream.write(buff, 0, rc);
+ }
+ data = swapStream.toByteArray();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return new String(Base64.encodeBase64(data));
+ }
+
+
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
new file mode 100644
index 0000000..c150a12
--- /dev/null
+++ b/casic-server/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-security-cockpit
+ 2.0.0
+ ../pom.xml
+
+
+ casic-server
+ 2.0.0
+ jar
+ casic-server
+ casic 的spring boot版本
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+ provided
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${boot.version}
+ provided
+
+
+
+
+ com.hikvision.ga
+ artemis-http-client
+ 1.1.3
+
+
+ commons-io
+ commons-io
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.4.5
+
+
+ io.netty
+ netty-all
+ 4.1.42.Final
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
new file mode 100644
index 0000000..3a60b9e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
@@ -0,0 +1,36 @@
+package com.casic.missiles.modular.async;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+ @Override
+ public Executor getAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //核心线程数
+ executor.setCorePoolSize(5);
+ //最大线程数
+ executor.setMaxPoolSize(10);
+ //队列容量
+ executor.setQueueCapacity(20);
+ //设置线程活跃时间(秒)
+ executor.setKeepAliveSeconds(60);
+ //默认线程名称
+ executor.setThreadNamePrefix("user-rpt-");
+ //拒绝策略
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ //等待所有任务结束后再关闭线程池
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
new file mode 100644
index 0000000..8ca554c
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.modular.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+// tomcat启动无需配置
+@Configuration
+public class WebSocketConfig {
+ /**
+ * 注入ServerEndpointExporter,
+ * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
+ */
+ @Bean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
new file mode 100644
index 0000000..34fe2cd
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
@@ -0,0 +1,39 @@
+package com.casic.missiles.modular.controller;
+
+
+import com.casic.missiles.model.application.event.core.EventPublisher;
+import com.casic.missiles.model.application.event.enums.ModelEventTypeEnum;
+import com.casic.missiles.model.response.ResponseData;
+import com.casic.missiles.modular.event.UserEvent;
+import com.casic.missiles.modular.system.model.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: DemoController
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+ @Autowired
+ private EventPublisher publisher;
+
+ /**
+ * 获取mockToken
+ */
+ @PostMapping("/list")
+ @ResponseBody
+ public Object list() {
+ User user = new User();
+ user.setAccount("张三");
+ publisher.publishEvent(new UserEvent(ModelEventTypeEnum.ADD, user));
+ return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
new file mode 100644
index 0000000..aff2889
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.event;
+
+import com.casic.missiles.model.application.event.core.ModelEvent;
+import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum;
+import com.casic.missiles.modular.system.model.User;
+
+/**
+ * @Description: 用户事件
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:23
+ */
+public class UserEvent extends ModelEvent {
+ /**
+ * Create a new {@code ApplicationEvent}.
+ *
+ * @param type 事件类型
+ * @param source the object on which the event initially occurred or with
+ * which the event is associated (never {@code null})
+ */
+ public UserEvent(AbstractEventTypeEnum type, User source) {
+ super(type, source);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
new file mode 100644
index 0000000..8f9603e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.core.application.event.UserLoginEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserOneListener {
+ @EventListener
+ public void onApplicationEvent(UserLoginEvent event) {
+ log.debug("用户1订阅:{}", event);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java
new file mode 100644
index 0000000..0bd52a3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.model.application.event.core.EventSubscriber;
+import com.casic.missiles.modular.event.UserEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserTwoListener extends EventSubscriber {
+ @Override
+ public void onApplicationEvent(UserEvent event) {
+ log.debug("用户2订阅:{}", event);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java b/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java
new file mode 100644
index 0000000..4012170
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java
@@ -0,0 +1,88 @@
+package com.casic.missiles.modular.util;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+import sun.misc.BASE64Decoder;
+
+import java.io.*;
+
+public class Base64Util {
+ /**
+ * base64字符串转换成图片
+ *
+ * @param imgStr base64字符串
+ * @param imgFilePath 图片存放路径
+ * @return
+ * @author ZHANGJL
+ * @dateTime 2018-02-23 14:42:17
+ */
+ public static boolean Base64ToImage(String imgStr, String imgFilePath, String fileDir) { // 对字节数组字符串进行Base64解码并生成图片
+
+ if (StringUtils.isEmpty(imgStr)) // 图像数据为空
+ return false;
+
+ imgStr = imgStr.substring(imgStr.indexOf(",") + 1);
+
+ BASE64Decoder decoder = new BASE64Decoder();
+ try {
+ // Base64解码
+ byte[] b = decoder.decodeBuffer(imgStr);
+
+ for (int i = 0; i < b.length; ++i) {
+ if (b[i] < 0) {// 调整异常数据
+ b[i] += 256;
+ }
+ }
+ //如果已存在图像,先删除
+ File file = new File(fileDir+File.separator + imgFilePath);
+ if (file.exists() && file.isFile()) {
+ file.delete();
+ }
+ File dir = new File(fileDir);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ file = new File(fileDir+File.separator+imgFilePath);
+ file.createNewFile();
+// ImageIO.write(bImage, "bmp", name);
+ OutputStream out = new FileOutputStream(fileDir+File.separator+imgFilePath);
+ out.write(b);
+ out.flush();
+ out.close();
+
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ }
+
+ public static String getBase64FromInputStream(InputStream in) {
+ // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
+ byte[] data = null;
+ // 读取图片字节数组
+ try {
+ ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
+ byte[] buff = new byte[100];
+ int rc = 0;
+ while ((rc = in.read(buff, 0, 100)) > 0) {
+ swapStream.write(buff, 0, rc);
+ }
+ data = swapStream.toByteArray();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return new String(Base64.encodeBase64(data));
+ }
+
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/CommonUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/CommonUtil.java
new file mode 100644
index 0000000..9c93895
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/CommonUtil.java
@@ -0,0 +1,75 @@
+package com.casic.missiles.modular.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class CommonUtil {
+
+ public static String CutId(String id) {
+ return id.substring(6, 10) + "-" + id.substring(10, 12) + "-" + id.substring(12, 14);
+ }
+
+ public static boolean isIDNumber(String IDNumber) {
+ if (IDNumber == null || "".equals(IDNumber)) {
+ return false;
+ }
+ // 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
+ String regularExpression =
+ "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|"
+ + "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
+ boolean matches = IDNumber.matches(regularExpression);
+ // 判断第18位校验值
+ if (matches) {
+ if (IDNumber.length() == 18) {
+ try {
+ char[] charArray = IDNumber.toCharArray();
+ // 前十七位加权因子
+ int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
+ // 这是除以11后,可能产生的11位余数对应的验证码
+ String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
+ int sum = 0;
+ for (int i = 0; i < idCardWi.length; i++) {
+ int current = Integer.parseInt(String.valueOf(charArray[i]));
+ int count = current * idCardWi[i];
+ sum += count;
+ }
+ char idCardLast = charArray[17];
+ int idCardMod = sum % 11;
+ if (idCardY[idCardMod].toUpperCase()
+ .equals(String.valueOf(idCardLast).toUpperCase())) {
+ return true;
+ } else {
+ System.out.println("身份证最后一位:" + String.valueOf(idCardLast).toUpperCase()
+ + "错误,正确的应该是:" + idCardY[idCardMod].toUpperCase());
+ return false;
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ return matches;
+ }
+
+
+ public static boolean CheckMobilePhoneNum(String phoneNum) {
+ if (StringUtils.isEmpty(phoneNum))
+ return true;
+ String regex = "^(1[3-9]\\d{9}$)";
+ if (phoneNum.length() == 11) {
+ Pattern p = Pattern.compile(regex);
+ Matcher m = p.matcher(phoneNum);
+ if (m.matches()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
new file mode 100644
index 0000000..c150a12
--- /dev/null
+++ b/casic-server/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-security-cockpit
+ 2.0.0
+ ../pom.xml
+
+
+ casic-server
+ 2.0.0
+ jar
+ casic-server
+ casic 的spring boot版本
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+ provided
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${boot.version}
+ provided
+
+
+
+
+ com.hikvision.ga
+ artemis-http-client
+ 1.1.3
+
+
+ commons-io
+ commons-io
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.4.5
+
+
+ io.netty
+ netty-all
+ 4.1.42.Final
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
new file mode 100644
index 0000000..3a60b9e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
@@ -0,0 +1,36 @@
+package com.casic.missiles.modular.async;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+ @Override
+ public Executor getAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //核心线程数
+ executor.setCorePoolSize(5);
+ //最大线程数
+ executor.setMaxPoolSize(10);
+ //队列容量
+ executor.setQueueCapacity(20);
+ //设置线程活跃时间(秒)
+ executor.setKeepAliveSeconds(60);
+ //默认线程名称
+ executor.setThreadNamePrefix("user-rpt-");
+ //拒绝策略
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ //等待所有任务结束后再关闭线程池
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
new file mode 100644
index 0000000..8ca554c
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.modular.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+// tomcat启动无需配置
+@Configuration
+public class WebSocketConfig {
+ /**
+ * 注入ServerEndpointExporter,
+ * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
+ */
+ @Bean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
new file mode 100644
index 0000000..34fe2cd
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
@@ -0,0 +1,39 @@
+package com.casic.missiles.modular.controller;
+
+
+import com.casic.missiles.model.application.event.core.EventPublisher;
+import com.casic.missiles.model.application.event.enums.ModelEventTypeEnum;
+import com.casic.missiles.model.response.ResponseData;
+import com.casic.missiles.modular.event.UserEvent;
+import com.casic.missiles.modular.system.model.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: DemoController
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+ @Autowired
+ private EventPublisher publisher;
+
+ /**
+ * 获取mockToken
+ */
+ @PostMapping("/list")
+ @ResponseBody
+ public Object list() {
+ User user = new User();
+ user.setAccount("张三");
+ publisher.publishEvent(new UserEvent(ModelEventTypeEnum.ADD, user));
+ return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
new file mode 100644
index 0000000..aff2889
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.event;
+
+import com.casic.missiles.model.application.event.core.ModelEvent;
+import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum;
+import com.casic.missiles.modular.system.model.User;
+
+/**
+ * @Description: 用户事件
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:23
+ */
+public class UserEvent extends ModelEvent {
+ /**
+ * Create a new {@code ApplicationEvent}.
+ *
+ * @param type 事件类型
+ * @param source the object on which the event initially occurred or with
+ * which the event is associated (never {@code null})
+ */
+ public UserEvent(AbstractEventTypeEnum type, User source) {
+ super(type, source);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
new file mode 100644
index 0000000..8f9603e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.core.application.event.UserLoginEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserOneListener {
+ @EventListener
+ public void onApplicationEvent(UserLoginEvent event) {
+ log.debug("用户1订阅:{}", event);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java
new file mode 100644
index 0000000..0bd52a3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.model.application.event.core.EventSubscriber;
+import com.casic.missiles.modular.event.UserEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserTwoListener extends EventSubscriber {
+ @Override
+ public void onApplicationEvent(UserEvent event) {
+ log.debug("用户2订阅:{}", event);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java b/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java
new file mode 100644
index 0000000..4012170
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java
@@ -0,0 +1,88 @@
+package com.casic.missiles.modular.util;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+import sun.misc.BASE64Decoder;
+
+import java.io.*;
+
+public class Base64Util {
+ /**
+ * base64字符串转换成图片
+ *
+ * @param imgStr base64字符串
+ * @param imgFilePath 图片存放路径
+ * @return
+ * @author ZHANGJL
+ * @dateTime 2018-02-23 14:42:17
+ */
+ public static boolean Base64ToImage(String imgStr, String imgFilePath, String fileDir) { // 对字节数组字符串进行Base64解码并生成图片
+
+ if (StringUtils.isEmpty(imgStr)) // 图像数据为空
+ return false;
+
+ imgStr = imgStr.substring(imgStr.indexOf(",") + 1);
+
+ BASE64Decoder decoder = new BASE64Decoder();
+ try {
+ // Base64解码
+ byte[] b = decoder.decodeBuffer(imgStr);
+
+ for (int i = 0; i < b.length; ++i) {
+ if (b[i] < 0) {// 调整异常数据
+ b[i] += 256;
+ }
+ }
+ //如果已存在图像,先删除
+ File file = new File(fileDir+File.separator + imgFilePath);
+ if (file.exists() && file.isFile()) {
+ file.delete();
+ }
+ File dir = new File(fileDir);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ file = new File(fileDir+File.separator+imgFilePath);
+ file.createNewFile();
+// ImageIO.write(bImage, "bmp", name);
+ OutputStream out = new FileOutputStream(fileDir+File.separator+imgFilePath);
+ out.write(b);
+ out.flush();
+ out.close();
+
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ }
+
+ public static String getBase64FromInputStream(InputStream in) {
+ // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
+ byte[] data = null;
+ // 读取图片字节数组
+ try {
+ ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
+ byte[] buff = new byte[100];
+ int rc = 0;
+ while ((rc = in.read(buff, 0, 100)) > 0) {
+ swapStream.write(buff, 0, rc);
+ }
+ data = swapStream.toByteArray();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return new String(Base64.encodeBase64(data));
+ }
+
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/CommonUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/CommonUtil.java
new file mode 100644
index 0000000..9c93895
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/CommonUtil.java
@@ -0,0 +1,75 @@
+package com.casic.missiles.modular.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class CommonUtil {
+
+ public static String CutId(String id) {
+ return id.substring(6, 10) + "-" + id.substring(10, 12) + "-" + id.substring(12, 14);
+ }
+
+ public static boolean isIDNumber(String IDNumber) {
+ if (IDNumber == null || "".equals(IDNumber)) {
+ return false;
+ }
+ // 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
+ String regularExpression =
+ "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|"
+ + "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
+ boolean matches = IDNumber.matches(regularExpression);
+ // 判断第18位校验值
+ if (matches) {
+ if (IDNumber.length() == 18) {
+ try {
+ char[] charArray = IDNumber.toCharArray();
+ // 前十七位加权因子
+ int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
+ // 这是除以11后,可能产生的11位余数对应的验证码
+ String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
+ int sum = 0;
+ for (int i = 0; i < idCardWi.length; i++) {
+ int current = Integer.parseInt(String.valueOf(charArray[i]));
+ int count = current * idCardWi[i];
+ sum += count;
+ }
+ char idCardLast = charArray[17];
+ int idCardMod = sum % 11;
+ if (idCardY[idCardMod].toUpperCase()
+ .equals(String.valueOf(idCardLast).toUpperCase())) {
+ return true;
+ } else {
+ System.out.println("身份证最后一位:" + String.valueOf(idCardLast).toUpperCase()
+ + "错误,正确的应该是:" + idCardY[idCardMod].toUpperCase());
+ return false;
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ return matches;
+ }
+
+
+ public static boolean CheckMobilePhoneNum(String phoneNum) {
+ if (StringUtils.isEmpty(phoneNum))
+ return true;
+ String regex = "^(1[3-9]\\d{9}$)";
+ if (phoneNum.length() == 11) {
+ Pattern p = Pattern.compile(regex);
+ Matcher m = p.matcher(phoneNum);
+ if (m.matches()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java
new file mode 100644
index 0000000..191ef79
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java
@@ -0,0 +1,116 @@
+package com.casic.missiles.modular.util;
+
+
+import javafx.util.Pair;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * Created by Administrator on 2015/2/25.
+ */
+public class DateUtils {
+ public static SimpleDateFormat sdf_day = new SimpleDateFormat("yyyy-MM-dd");
+ public static SimpleDateFormat sdf_day_time = new SimpleDateFormat("yyyyMMddhhmmss");
+ public static final SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ public static final SimpleDateFormat sdf5 = new SimpleDateFormat("HH:mm:ss");
+
+
+ /**
+ * 获取当年的第一天
+ *
+ * @return
+ */
+ public static Date getCurrYearFirst() {
+ Calendar currCal = Calendar.getInstance();
+ int currentYear = currCal.get(Calendar.YEAR);
+ return getYearFirst(currentYear);
+ }
+
+
+ /**
+ * 获取某年第一天日期
+ *
+ * @param year 年份
+ * @return Date
+ */
+ public static Date getYearFirst(int year) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.clear();
+ calendar.set(Calendar.YEAR, year);
+ Date currYearFirst = calendar.getTime();
+ return currYearFirst;
+ }
+
+ /**
+ * 最近7日(不包括今日)
+ */
+ public static Pair getLastSevenDays() {
+
+ Calendar calendar = Calendar.getInstance();
+ String endDate = sdf4.format(calendar.getTime());
+
+ calendar.add(Calendar.DATE, -7);
+ String beginDate = sdf4.format(calendar.getTime());
+
+ return new Pair<>(beginDate, endDate);
+ }
+
+ /**
+ * 最近n日(不包括今日)
+ */
+ public static Pair getLastNDays(int n) {
+
+ Calendar calendar = Calendar.getInstance();
+ String endDate = sdf4.format(calendar.getTime());
+
+ calendar.add(Calendar.DATE, n * -1);
+ String beginDate = sdf4.format(calendar.getTime());
+
+ return new Pair<>(beginDate, endDate);
+ }
+
+ /**
+ * 日期时间加n天
+ */
+ public static String addDays(String date, int n) {
+
+ try {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(sdf4.parse(date));
+ calendar.add(Calendar.DATE, n);
+ return sdf4.format(calendar.getTime());
+ } catch (ParseException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * 日期加n天
+ */
+ public static String addNDays(String date, int n) {
+
+ try {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(sdf_day.parse(date));
+ calendar.add(Calendar.DATE, n);
+ return sdf_day.format(calendar.getTime());
+ } catch (ParseException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * 昨日
+ */
+ public static String getYesterday() {
+
+ Calendar calendar = Calendar.getInstance();
+ calendar.add(Calendar.DATE, -2);
+ return sdf_day.format(calendar.getTime());
+ }
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
new file mode 100644
index 0000000..c150a12
--- /dev/null
+++ b/casic-server/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-security-cockpit
+ 2.0.0
+ ../pom.xml
+
+
+ casic-server
+ 2.0.0
+ jar
+ casic-server
+ casic 的spring boot版本
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+ provided
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${boot.version}
+ provided
+
+
+
+
+ com.hikvision.ga
+ artemis-http-client
+ 1.1.3
+
+
+ commons-io
+ commons-io
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.4.5
+
+
+ io.netty
+ netty-all
+ 4.1.42.Final
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
new file mode 100644
index 0000000..3a60b9e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
@@ -0,0 +1,36 @@
+package com.casic.missiles.modular.async;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+ @Override
+ public Executor getAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //核心线程数
+ executor.setCorePoolSize(5);
+ //最大线程数
+ executor.setMaxPoolSize(10);
+ //队列容量
+ executor.setQueueCapacity(20);
+ //设置线程活跃时间(秒)
+ executor.setKeepAliveSeconds(60);
+ //默认线程名称
+ executor.setThreadNamePrefix("user-rpt-");
+ //拒绝策略
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ //等待所有任务结束后再关闭线程池
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
new file mode 100644
index 0000000..8ca554c
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.modular.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+// tomcat启动无需配置
+@Configuration
+public class WebSocketConfig {
+ /**
+ * 注入ServerEndpointExporter,
+ * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
+ */
+ @Bean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
new file mode 100644
index 0000000..34fe2cd
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
@@ -0,0 +1,39 @@
+package com.casic.missiles.modular.controller;
+
+
+import com.casic.missiles.model.application.event.core.EventPublisher;
+import com.casic.missiles.model.application.event.enums.ModelEventTypeEnum;
+import com.casic.missiles.model.response.ResponseData;
+import com.casic.missiles.modular.event.UserEvent;
+import com.casic.missiles.modular.system.model.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: DemoController
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+ @Autowired
+ private EventPublisher publisher;
+
+ /**
+ * 获取mockToken
+ */
+ @PostMapping("/list")
+ @ResponseBody
+ public Object list() {
+ User user = new User();
+ user.setAccount("张三");
+ publisher.publishEvent(new UserEvent(ModelEventTypeEnum.ADD, user));
+ return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
new file mode 100644
index 0000000..aff2889
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.event;
+
+import com.casic.missiles.model.application.event.core.ModelEvent;
+import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum;
+import com.casic.missiles.modular.system.model.User;
+
+/**
+ * @Description: 用户事件
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:23
+ */
+public class UserEvent extends ModelEvent {
+ /**
+ * Create a new {@code ApplicationEvent}.
+ *
+ * @param type 事件类型
+ * @param source the object on which the event initially occurred or with
+ * which the event is associated (never {@code null})
+ */
+ public UserEvent(AbstractEventTypeEnum type, User source) {
+ super(type, source);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
new file mode 100644
index 0000000..8f9603e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.core.application.event.UserLoginEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserOneListener {
+ @EventListener
+ public void onApplicationEvent(UserLoginEvent event) {
+ log.debug("用户1订阅:{}", event);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java
new file mode 100644
index 0000000..0bd52a3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.model.application.event.core.EventSubscriber;
+import com.casic.missiles.modular.event.UserEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserTwoListener extends EventSubscriber {
+ @Override
+ public void onApplicationEvent(UserEvent event) {
+ log.debug("用户2订阅:{}", event);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java b/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java
new file mode 100644
index 0000000..4012170
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java
@@ -0,0 +1,88 @@
+package com.casic.missiles.modular.util;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+import sun.misc.BASE64Decoder;
+
+import java.io.*;
+
+public class Base64Util {
+ /**
+ * base64字符串转换成图片
+ *
+ * @param imgStr base64字符串
+ * @param imgFilePath 图片存放路径
+ * @return
+ * @author ZHANGJL
+ * @dateTime 2018-02-23 14:42:17
+ */
+ public static boolean Base64ToImage(String imgStr, String imgFilePath, String fileDir) { // 对字节数组字符串进行Base64解码并生成图片
+
+ if (StringUtils.isEmpty(imgStr)) // 图像数据为空
+ return false;
+
+ imgStr = imgStr.substring(imgStr.indexOf(",") + 1);
+
+ BASE64Decoder decoder = new BASE64Decoder();
+ try {
+ // Base64解码
+ byte[] b = decoder.decodeBuffer(imgStr);
+
+ for (int i = 0; i < b.length; ++i) {
+ if (b[i] < 0) {// 调整异常数据
+ b[i] += 256;
+ }
+ }
+ //如果已存在图像,先删除
+ File file = new File(fileDir+File.separator + imgFilePath);
+ if (file.exists() && file.isFile()) {
+ file.delete();
+ }
+ File dir = new File(fileDir);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ file = new File(fileDir+File.separator+imgFilePath);
+ file.createNewFile();
+// ImageIO.write(bImage, "bmp", name);
+ OutputStream out = new FileOutputStream(fileDir+File.separator+imgFilePath);
+ out.write(b);
+ out.flush();
+ out.close();
+
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ }
+
+ public static String getBase64FromInputStream(InputStream in) {
+ // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
+ byte[] data = null;
+ // 读取图片字节数组
+ try {
+ ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
+ byte[] buff = new byte[100];
+ int rc = 0;
+ while ((rc = in.read(buff, 0, 100)) > 0) {
+ swapStream.write(buff, 0, rc);
+ }
+ data = swapStream.toByteArray();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return new String(Base64.encodeBase64(data));
+ }
+
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/CommonUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/CommonUtil.java
new file mode 100644
index 0000000..9c93895
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/CommonUtil.java
@@ -0,0 +1,75 @@
+package com.casic.missiles.modular.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class CommonUtil {
+
+ public static String CutId(String id) {
+ return id.substring(6, 10) + "-" + id.substring(10, 12) + "-" + id.substring(12, 14);
+ }
+
+ public static boolean isIDNumber(String IDNumber) {
+ if (IDNumber == null || "".equals(IDNumber)) {
+ return false;
+ }
+ // 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
+ String regularExpression =
+ "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|"
+ + "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
+ boolean matches = IDNumber.matches(regularExpression);
+ // 判断第18位校验值
+ if (matches) {
+ if (IDNumber.length() == 18) {
+ try {
+ char[] charArray = IDNumber.toCharArray();
+ // 前十七位加权因子
+ int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
+ // 这是除以11后,可能产生的11位余数对应的验证码
+ String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
+ int sum = 0;
+ for (int i = 0; i < idCardWi.length; i++) {
+ int current = Integer.parseInt(String.valueOf(charArray[i]));
+ int count = current * idCardWi[i];
+ sum += count;
+ }
+ char idCardLast = charArray[17];
+ int idCardMod = sum % 11;
+ if (idCardY[idCardMod].toUpperCase()
+ .equals(String.valueOf(idCardLast).toUpperCase())) {
+ return true;
+ } else {
+ System.out.println("身份证最后一位:" + String.valueOf(idCardLast).toUpperCase()
+ + "错误,正确的应该是:" + idCardY[idCardMod].toUpperCase());
+ return false;
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ return matches;
+ }
+
+
+ public static boolean CheckMobilePhoneNum(String phoneNum) {
+ if (StringUtils.isEmpty(phoneNum))
+ return true;
+ String regex = "^(1[3-9]\\d{9}$)";
+ if (phoneNum.length() == 11) {
+ Pattern p = Pattern.compile(regex);
+ Matcher m = p.matcher(phoneNum);
+ if (m.matches()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java
new file mode 100644
index 0000000..191ef79
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java
@@ -0,0 +1,116 @@
+package com.casic.missiles.modular.util;
+
+
+import javafx.util.Pair;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * Created by Administrator on 2015/2/25.
+ */
+public class DateUtils {
+ public static SimpleDateFormat sdf_day = new SimpleDateFormat("yyyy-MM-dd");
+ public static SimpleDateFormat sdf_day_time = new SimpleDateFormat("yyyyMMddhhmmss");
+ public static final SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ public static final SimpleDateFormat sdf5 = new SimpleDateFormat("HH:mm:ss");
+
+
+ /**
+ * 获取当年的第一天
+ *
+ * @return
+ */
+ public static Date getCurrYearFirst() {
+ Calendar currCal = Calendar.getInstance();
+ int currentYear = currCal.get(Calendar.YEAR);
+ return getYearFirst(currentYear);
+ }
+
+
+ /**
+ * 获取某年第一天日期
+ *
+ * @param year 年份
+ * @return Date
+ */
+ public static Date getYearFirst(int year) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.clear();
+ calendar.set(Calendar.YEAR, year);
+ Date currYearFirst = calendar.getTime();
+ return currYearFirst;
+ }
+
+ /**
+ * 最近7日(不包括今日)
+ */
+ public static Pair getLastSevenDays() {
+
+ Calendar calendar = Calendar.getInstance();
+ String endDate = sdf4.format(calendar.getTime());
+
+ calendar.add(Calendar.DATE, -7);
+ String beginDate = sdf4.format(calendar.getTime());
+
+ return new Pair<>(beginDate, endDate);
+ }
+
+ /**
+ * 最近n日(不包括今日)
+ */
+ public static Pair getLastNDays(int n) {
+
+ Calendar calendar = Calendar.getInstance();
+ String endDate = sdf4.format(calendar.getTime());
+
+ calendar.add(Calendar.DATE, n * -1);
+ String beginDate = sdf4.format(calendar.getTime());
+
+ return new Pair<>(beginDate, endDate);
+ }
+
+ /**
+ * 日期时间加n天
+ */
+ public static String addDays(String date, int n) {
+
+ try {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(sdf4.parse(date));
+ calendar.add(Calendar.DATE, n);
+ return sdf4.format(calendar.getTime());
+ } catch (ParseException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * 日期加n天
+ */
+ public static String addNDays(String date, int n) {
+
+ try {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(sdf_day.parse(date));
+ calendar.add(Calendar.DATE, n);
+ return sdf_day.format(calendar.getTime());
+ } catch (ParseException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * 昨日
+ */
+ public static String getYesterday() {
+
+ Calendar calendar = Calendar.getInstance();
+ calendar.add(Calendar.DATE, -2);
+ return sdf_day.format(calendar.getTime());
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java
new file mode 100644
index 0000000..da0f8ee
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java
@@ -0,0 +1,49 @@
+package com.casic.missiles.modular.util;
+
+import com.hikvision.artemis.sdk.ArtemisHttpUtil;
+import com.hikvision.artemis.sdk.config.ArtemisConfig;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class HikUtil {
+
+ public static String hikApi(String uri, String body) {
+
+ /**
+ * STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数.
+ */
+ ArtemisConfig.host = "192.168.1.22:443"; // artemis网关服务器ip端口
+ ArtemisConfig.appKey = "25766251"; // 秘钥appkey
+ ArtemisConfig.appSecret = "h2o6zXtzCmt8eaOaMkXb";// 秘钥appSecret
+
+ /**
+ * STEP2:设置OpenAPI接口的上下文
+ */
+ final String ARTEMIS_PATH = "/artemis";
+
+ /**
+ * STEP3:设置接口的URI地址
+ */
+ final String previewURLsApi = ARTEMIS_PATH + uri;
+ Map path = new HashMap(2) {
+ {
+ put("https://", previewURLsApi);//根据现场环境部署确认是http还是https
+ }
+ };
+
+ /**
+ * STEP4:设置参数提交方式
+ */
+ String contentType = "application/json";
+
+ /**
+ * STEP5:组装请求参数
+ */
+ /**
+ * STEP6:调用接口
+ */
+ String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);// post请求application/json类型参数
+ return result;
+ }
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e20bc1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+**/target/**
+logs/
+*.iml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2fdcd74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# casic项目 V2.0.0
+
+[^_^]: # (Talk is cheap,Show me the code!)
+
+## 介绍
+基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot2.4 + shiro + mybatis-plus !
+基于casic项目代码简洁,注释丰富,上手容易,同时包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块)
+可以直接作为一个后台管理系统的脚手架! 2022目标 `更简洁`,`更规范`!
+
+
+#### 其他
+>* [git地址](http://192.168.0.203:8080/gitbucket)
+>* [本地免登地址](http://localhost:8083/route/mockToken)
diff --git a/casic-server/pom.xml b/casic-server/pom.xml
new file mode 100644
index 0000000..c150a12
--- /dev/null
+++ b/casic-server/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-security-cockpit
+ 2.0.0
+ ../pom.xml
+
+
+ casic-server
+ 2.0.0
+ jar
+ casic-server
+ casic 的spring boot版本
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+ provided
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${boot.version}
+ provided
+
+
+
+
+ com.hikvision.ga
+ artemis-http-client
+ 1.1.3
+
+
+ commons-io
+ commons-io
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.4.5
+
+
+ io.netty
+ netty-all
+ 4.1.42.Final
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
new file mode 100644
index 0000000..3a60b9e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/async/AsyncConfig.java
@@ -0,0 +1,36 @@
+package com.casic.missiles.modular.async;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+ @Override
+ public Executor getAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //核心线程数
+ executor.setCorePoolSize(5);
+ //最大线程数
+ executor.setMaxPoolSize(10);
+ //队列容量
+ executor.setQueueCapacity(20);
+ //设置线程活跃时间(秒)
+ executor.setKeepAliveSeconds(60);
+ //默认线程名称
+ executor.setThreadNamePrefix("user-rpt-");
+ //拒绝策略
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ //等待所有任务结束后再关闭线程池
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
new file mode 100644
index 0000000..8ca554c
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/config/WebSocketConfig.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.modular.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+// tomcat启动无需配置
+@Configuration
+public class WebSocketConfig {
+ /**
+ * 注入ServerEndpointExporter,
+ * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
+ */
+ @Bean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
new file mode 100644
index 0000000..34fe2cd
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DemoController.java
@@ -0,0 +1,39 @@
+package com.casic.missiles.modular.controller;
+
+
+import com.casic.missiles.model.application.event.core.EventPublisher;
+import com.casic.missiles.model.application.event.enums.ModelEventTypeEnum;
+import com.casic.missiles.model.response.ResponseData;
+import com.casic.missiles.modular.event.UserEvent;
+import com.casic.missiles.modular.system.model.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: DemoController
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+ @Autowired
+ private EventPublisher publisher;
+
+ /**
+ * 获取mockToken
+ */
+ @PostMapping("/list")
+ @ResponseBody
+ public Object list() {
+ User user = new User();
+ user.setAccount("张三");
+ publisher.publishEvent(new UserEvent(ModelEventTypeEnum.ADD, user));
+ return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
new file mode 100644
index 0000000..aff2889
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/UserEvent.java
@@ -0,0 +1,23 @@
+package com.casic.missiles.modular.event;
+
+import com.casic.missiles.model.application.event.core.ModelEvent;
+import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum;
+import com.casic.missiles.modular.system.model.User;
+
+/**
+ * @Description: 用户事件
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:23
+ */
+public class UserEvent extends ModelEvent {
+ /**
+ * Create a new {@code ApplicationEvent}.
+ *
+ * @param type 事件类型
+ * @param source the object on which the event initially occurred or with
+ * which the event is associated (never {@code null})
+ */
+ public UserEvent(AbstractEventTypeEnum type, User source) {
+ super(type, source);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
new file mode 100644
index 0000000..8f9603e
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserOneListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.core.application.event.UserLoginEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserOneListener {
+ @EventListener
+ public void onApplicationEvent(UserLoginEvent event) {
+ log.debug("用户1订阅:{}", event);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java
new file mode 100644
index 0000000..0bd52a3
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/event/listener/UserTwoListener.java
@@ -0,0 +1,20 @@
+package com.casic.missiles.modular.event.listener;
+
+import com.casic.missiles.model.application.event.core.EventSubscriber;
+import com.casic.missiles.modular.event.UserEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 用户事件订阅
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:22
+ */
+@Slf4j
+@Component
+public class UserTwoListener extends EventSubscriber {
+ @Override
+ public void onApplicationEvent(UserEvent event) {
+ log.debug("用户2订阅:{}", event);
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java b/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java
new file mode 100644
index 0000000..4012170
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/Base64Util.java
@@ -0,0 +1,88 @@
+package com.casic.missiles.modular.util;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+import sun.misc.BASE64Decoder;
+
+import java.io.*;
+
+public class Base64Util {
+ /**
+ * base64字符串转换成图片
+ *
+ * @param imgStr base64字符串
+ * @param imgFilePath 图片存放路径
+ * @return
+ * @author ZHANGJL
+ * @dateTime 2018-02-23 14:42:17
+ */
+ public static boolean Base64ToImage(String imgStr, String imgFilePath, String fileDir) { // 对字节数组字符串进行Base64解码并生成图片
+
+ if (StringUtils.isEmpty(imgStr)) // 图像数据为空
+ return false;
+
+ imgStr = imgStr.substring(imgStr.indexOf(",") + 1);
+
+ BASE64Decoder decoder = new BASE64Decoder();
+ try {
+ // Base64解码
+ byte[] b = decoder.decodeBuffer(imgStr);
+
+ for (int i = 0; i < b.length; ++i) {
+ if (b[i] < 0) {// 调整异常数据
+ b[i] += 256;
+ }
+ }
+ //如果已存在图像,先删除
+ File file = new File(fileDir+File.separator + imgFilePath);
+ if (file.exists() && file.isFile()) {
+ file.delete();
+ }
+ File dir = new File(fileDir);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ file = new File(fileDir+File.separator+imgFilePath);
+ file.createNewFile();
+// ImageIO.write(bImage, "bmp", name);
+ OutputStream out = new FileOutputStream(fileDir+File.separator+imgFilePath);
+ out.write(b);
+ out.flush();
+ out.close();
+
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ }
+
+ public static String getBase64FromInputStream(InputStream in) {
+ // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
+ byte[] data = null;
+ // 读取图片字节数组
+ try {
+ ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
+ byte[] buff = new byte[100];
+ int rc = 0;
+ while ((rc = in.read(buff, 0, 100)) > 0) {
+ swapStream.write(buff, 0, rc);
+ }
+ data = swapStream.toByteArray();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return new String(Base64.encodeBase64(data));
+ }
+
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/CommonUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/CommonUtil.java
new file mode 100644
index 0000000..9c93895
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/CommonUtil.java
@@ -0,0 +1,75 @@
+package com.casic.missiles.modular.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class CommonUtil {
+
+ public static String CutId(String id) {
+ return id.substring(6, 10) + "-" + id.substring(10, 12) + "-" + id.substring(12, 14);
+ }
+
+ public static boolean isIDNumber(String IDNumber) {
+ if (IDNumber == null || "".equals(IDNumber)) {
+ return false;
+ }
+ // 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
+ String regularExpression =
+ "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|"
+ + "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
+ boolean matches = IDNumber.matches(regularExpression);
+ // 判断第18位校验值
+ if (matches) {
+ if (IDNumber.length() == 18) {
+ try {
+ char[] charArray = IDNumber.toCharArray();
+ // 前十七位加权因子
+ int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
+ // 这是除以11后,可能产生的11位余数对应的验证码
+ String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
+ int sum = 0;
+ for (int i = 0; i < idCardWi.length; i++) {
+ int current = Integer.parseInt(String.valueOf(charArray[i]));
+ int count = current * idCardWi[i];
+ sum += count;
+ }
+ char idCardLast = charArray[17];
+ int idCardMod = sum % 11;
+ if (idCardY[idCardMod].toUpperCase()
+ .equals(String.valueOf(idCardLast).toUpperCase())) {
+ return true;
+ } else {
+ System.out.println("身份证最后一位:" + String.valueOf(idCardLast).toUpperCase()
+ + "错误,正确的应该是:" + idCardY[idCardMod].toUpperCase());
+ return false;
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ return matches;
+ }
+
+
+ public static boolean CheckMobilePhoneNum(String phoneNum) {
+ if (StringUtils.isEmpty(phoneNum))
+ return true;
+ String regex = "^(1[3-9]\\d{9}$)";
+ if (phoneNum.length() == 11) {
+ Pattern p = Pattern.compile(regex);
+ Matcher m = p.matcher(phoneNum);
+ if (m.matches()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java
new file mode 100644
index 0000000..191ef79
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java
@@ -0,0 +1,116 @@
+package com.casic.missiles.modular.util;
+
+
+import javafx.util.Pair;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * Created by Administrator on 2015/2/25.
+ */
+public class DateUtils {
+ public static SimpleDateFormat sdf_day = new SimpleDateFormat("yyyy-MM-dd");
+ public static SimpleDateFormat sdf_day_time = new SimpleDateFormat("yyyyMMddhhmmss");
+ public static final SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ public static final SimpleDateFormat sdf5 = new SimpleDateFormat("HH:mm:ss");
+
+
+ /**
+ * 获取当年的第一天
+ *
+ * @return
+ */
+ public static Date getCurrYearFirst() {
+ Calendar currCal = Calendar.getInstance();
+ int currentYear = currCal.get(Calendar.YEAR);
+ return getYearFirst(currentYear);
+ }
+
+
+ /**
+ * 获取某年第一天日期
+ *
+ * @param year 年份
+ * @return Date
+ */
+ public static Date getYearFirst(int year) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.clear();
+ calendar.set(Calendar.YEAR, year);
+ Date currYearFirst = calendar.getTime();
+ return currYearFirst;
+ }
+
+ /**
+ * 最近7日(不包括今日)
+ */
+ public static Pair getLastSevenDays() {
+
+ Calendar calendar = Calendar.getInstance();
+ String endDate = sdf4.format(calendar.getTime());
+
+ calendar.add(Calendar.DATE, -7);
+ String beginDate = sdf4.format(calendar.getTime());
+
+ return new Pair<>(beginDate, endDate);
+ }
+
+ /**
+ * 最近n日(不包括今日)
+ */
+ public static Pair getLastNDays(int n) {
+
+ Calendar calendar = Calendar.getInstance();
+ String endDate = sdf4.format(calendar.getTime());
+
+ calendar.add(Calendar.DATE, n * -1);
+ String beginDate = sdf4.format(calendar.getTime());
+
+ return new Pair<>(beginDate, endDate);
+ }
+
+ /**
+ * 日期时间加n天
+ */
+ public static String addDays(String date, int n) {
+
+ try {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(sdf4.parse(date));
+ calendar.add(Calendar.DATE, n);
+ return sdf4.format(calendar.getTime());
+ } catch (ParseException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * 日期加n天
+ */
+ public static String addNDays(String date, int n) {
+
+ try {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(sdf_day.parse(date));
+ calendar.add(Calendar.DATE, n);
+ return sdf_day.format(calendar.getTime());
+ } catch (ParseException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * 昨日
+ */
+ public static String getYesterday() {
+
+ Calendar calendar = Calendar.getInstance();
+ calendar.add(Calendar.DATE, -2);
+ return sdf_day.format(calendar.getTime());
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java
new file mode 100644
index 0000000..da0f8ee
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java
@@ -0,0 +1,49 @@
+package com.casic.missiles.modular.util;
+
+import com.hikvision.artemis.sdk.ArtemisHttpUtil;
+import com.hikvision.artemis.sdk.config.ArtemisConfig;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class HikUtil {
+
+ public static String hikApi(String uri, String body) {
+
+ /**
+ * STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数.
+ */
+ ArtemisConfig.host = "192.168.1.22:443"; // artemis网关服务器ip端口
+ ArtemisConfig.appKey = "25766251"; // 秘钥appkey
+ ArtemisConfig.appSecret = "h2o6zXtzCmt8eaOaMkXb";// 秘钥appSecret
+
+ /**
+ * STEP2:设置OpenAPI接口的上下文
+ */
+ final String ARTEMIS_PATH = "/artemis";
+
+ /**
+ * STEP3:设置接口的URI地址
+ */
+ final String previewURLsApi = ARTEMIS_PATH + uri;
+ Map path = new HashMap(2) {
+ {
+ put("https://", previewURLsApi);//根据现场环境部署确认是http还是https
+ }
+ };
+
+ /**
+ * STEP4:设置参数提交方式
+ */
+ String contentType = "application/json";
+
+ /**
+ * STEP5:组装请求参数
+ */
+ /**
+ * STEP6:调用接口
+ */
+ String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);// post请求application/json类型参数
+ return result;
+ }
+}
diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/HttpUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/HttpUtil.java
new file mode 100644
index 0000000..4867144
--- /dev/null
+++ b/casic-server/src/main/java/com/casic/missiles/modular/util/HttpUtil.java
@@ -0,0 +1,149 @@
+package com.casic.missiles.modular.util;
+
+import org.springframework.http.*;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * @Description: http请求工具类
+ * @Author: wangpeng
+ * @Date: 2022/7/17 11:49
+ */
+public class HttpUtil {
+ /**
+ * get请求
+ *
+ * @param url
+ * @param params 请求参数
+ * @return
+ */
+ public static String get(String url, MultiValueMap params) {
+ return get(url, params, null);
+ }
+
+ /**
+ * get请求
+ *
+ * @param url
+ * @param params 请求参数
+ * @param headers 请求头
+ * @return
+ */
+ public static String get(String url, MultiValueMap params, MultiValueMap headers) {
+ return request(url, params, headers, HttpMethod.GET);
+ }
+
+ /**
+ * post请求
+ *
+ * @param url
+ * @param params 请求参数
+ * @return
+ */
+ public static String post(String url, MultiValueMap params) {
+ return post(url, params, null);
+ }
+
+ /**
+ * post请求
+ *
+ * @param url
+ * @param params 请求参数
+ * @param headers 请求头
+ * @return
+ */
+ public static String post(String url, MultiValueMap params, MultiValueMap headers) {
+ return request(url, params, headers, HttpMethod.POST);
+ }
+
+ /**
+ * put请求
+ *
+ * @param url
+ * @param params 请求参数
+ * @return
+ */
+ public static String put(String url, MultiValueMap params) {
+ return put(url, params, null);
+ }
+
+ /**
+ * put请求
+ *
+ * @param url
+ * @param params 请求参数
+ * @param headers 请求头
+ * @return
+ */
+ public static String put(String url, MultiValueMap params, MultiValueMap headers) {
+ return request(url, params, headers, HttpMethod.PUT);
+ }
+
+ /**
+ * delete请求
+ *
+ * @param url
+ * @param params 请求参数
+ * @return
+ */
+ public static String delete(String url, MultiValueMap params) {
+ return delete(url, params, null);
+ }
+
+ /**
+ * delete请求
+ *
+ * @param url
+ * @param params 请求参数
+ * @param headers 请求头
+ * @return
+ */
+ public static String delete(String url, MultiValueMap params, MultiValueMap headers) {
+ return request(url, params, headers, HttpMethod.DELETE);
+ }
+
+ /**
+ * 表单请求
+ *
+ * @param url
+ * @param params 请求参数
+ * @param headers 请求头
+ * @param method 请求方式
+ * @return
+ */
+ public static String request(String url, MultiValueMap params, MultiValueMap headers, HttpMethod method) {
+ if (params == null) {
+ params = new LinkedMultiValueMap<>();
+ }
+ return request(url, params, headers, method, MediaType.APPLICATION_FORM_URLENCODED);
+ }
+
+ /**
+ * http请求
+ *
+ * @param url
+ * @param params 请求参数
+ * @param headers 请求头
+ * @param method 请求方式
+ * @param mediaType 参数类型
+ * @return
+ */
+ public static String request(String url, Object params, MultiValueMap headers, HttpMethod method, MediaType mediaType) {
+ if (url == null || url.trim().isEmpty()) {
+ return null;
+ }
+ RestTemplate client = new RestTemplate();
+ // header
+ HttpHeaders httpHeaders = new HttpHeaders();
+ if (headers != null) {
+// httpHeaders.addAll(headers);
+ httpHeaders.putAll(headers);
+ }
+ // 提交方式:表单、json
+ httpHeaders.setContentType(mediaType);
+ HttpEntity