diff --git a/orange-demo-single-pg/orange-demo-single-pg-service/.gitignore b/orange-demo-single-pg/orange-demo-single-pg-service/.gitignore
deleted file mode 100644
index e3fa94cd..00000000
--- a/orange-demo-single-pg/orange-demo-single-pg-service/.gitignore
+++ /dev/null
@@ -1,26 +0,0 @@
-target/
-!.mvn/wrapper/maven-wrapper.jar
-/.mvn/*
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/build/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
\ No newline at end of file
diff --git a/orange-demo-single-pg/orange-demo-single-pg-service/README.md b/orange-demo-single-pg/orange-demo-single-pg-service/README.md
deleted file mode 100644
index 20274fd0..00000000
--- a/orange-demo-single-pg/orange-demo-single-pg-service/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-### 服务接口文档
----
-- Knife4j
- - 服务启动后,Knife4j的文档入口地址 [http://localhost:8082/doc.html#/plus](http://localhost:8082/doc.html#/plus)
-- Postman
- - 无需启动服务,即可将当前工程的接口导出成Postman格式。在工程的common/common-tools/模块下,找到ExportApiApp文件,并执行main函数。
-
-### 服务启动环境依赖
----
-
-执行docker-compose up -d 命令启动下面依赖的服务。
-执行docker-compose down 命令停止下面服务。
-
-- Redis
- - 版本:4
- - 端口: 6379
- - 推荐客户端工具 [AnotherRedisDesktopManager](https://github.com/qishibo/AnotherRedisDesktopManager)
diff --git a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/pom.xml b/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/pom.xml
deleted file mode 100644
index d05b3101..00000000
--- a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/pom.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-
-
-
- com.orangeforms
- DemoSinglePg
- 1.0.0
-
- 4.0.0
-
- application-webadmin
- 1.0.0
- application
- jar
-
-
-
- com.anji-plus
- spring-boot-starter-captcha
- ${ajcaptcha.version}
-
-
-
- org.springframework.boot
- spring-boot-starter-data-redis
-
-
- spring-boot-starter-logging
- org.springframework.boot
-
-
-
-
-
- com.orangeforms
- common-redis
- 1.0.0
-
-
- com.orangeforms
- common-log
- 1.0.0
-
-
- com.orangeforms
- common-sequence
- 1.0.0
-
-
- com.orangeforms
- common-datafilter
- 1.0.0
-
-
- com.orangeforms
- common-swagger
- 1.0.0
-
-
-
-
-
-
- src/main/resources
-
- **/*.*
-
- false
-
-
- src/main/java
-
- **/*.xml
-
- false
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
- ${spring-boot.version}
-
-
-
- repackage
-
-
-
-
-
-
-
diff --git a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/WebAdminApplication.java b/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/WebAdminApplication.java
deleted file mode 100644
index 61526940..00000000
--- a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/WebAdminApplication.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.orangeforms.webadmin;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.scheduling.annotation.EnableAsync;
-
-/**
- * 应用服务启动类。
- *
- * @author Jerry
- * @date 2022-02-20
- */
-@EnableAsync
-@SpringBootApplication
-@ComponentScan("com.orangeforms")
-public class WebAdminApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(WebAdminApplication.class, args);
- }
-}
diff --git a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/app/util/CaptchaCacheServiceRedisImpl.java b/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/app/util/CaptchaCacheServiceRedisImpl.java
deleted file mode 100644
index ae23a9f2..00000000
--- a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/app/util/CaptchaCacheServiceRedisImpl.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.orangeforms.webadmin.app.util;
-
-import com.anji.captcha.service.CaptchaCacheService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.StringRedisTemplate;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * 对于分布式部署的应用,我们建议应用自己实现CaptchaCacheService,比如用Redis,参考service/spring-boot代码示例。
- * 如果应用是单点的,也没有使用redis,那默认使用内存。
- * 内存缓存只适合单节点部署的应用,否则验证码生产与验证在节点之间信息不同步,导致失败。
- *
- * ☆☆☆ SPI: 在resources目录新建META-INF.services文件夹(两层),参考当前服务resources。
- * @author lide1202@hotmail.com
- * @date 2020-05-12
- */
-public class CaptchaCacheServiceRedisImpl implements CaptchaCacheService {
-
- @Override
- public String type() {
- return "redis";
- }
-
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
-
- @Override
- public void set(String key, String value, long expiresInSeconds) {
- stringRedisTemplate.opsForValue().set(key, value, expiresInSeconds, TimeUnit.SECONDS);
- }
-
- @Override
- public boolean exists(String key) {
- return stringRedisTemplate.hasKey(key);
- }
-
- @Override
- public void delete(String key) {
- stringRedisTemplate.delete(key);
- }
-
- @Override
- public String get(String key) {
- return stringRedisTemplate.opsForValue().get(key);
- }
-
- @Override
- public Long increment(String key, long val) {
- return stringRedisTemplate.opsForValue().increment(key,val);
- }
-}
diff --git a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/ApplicationConfig.java b/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/ApplicationConfig.java
deleted file mode 100644
index 73e3b2c9..00000000
--- a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/ApplicationConfig.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.orangeforms.webadmin.config;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * 应用程序自定义的程序属性配置文件。
- *
- * @author Jerry
- * @date 2022-02-20
- */
-@Data
-@Configuration
-@ConfigurationProperties(prefix = "application")
-public class ApplicationConfig {
-
- /**
- * token的Http Request Header的key
- */
- private String tokenHeaderKey;
- /**
- * token在过期之前,但是已经需要被刷新时,response返回的header信息的key。
- */
- private String refreshedTokenHeaderKey;
- /**
- * token 加密用的密钥,该值的长度最少10个字符(过短会报错)。
- */
- private String tokenSigningKey;
- /**
- * 令牌的过期时间,单位毫秒
- */
- private Long expiration;
- /**
- * 用户密码被重置之后的缺省密码
- */
- private String defaultUserPassword;
- /**
- * 上传文件的基础目录
- */
- private String uploadFileBaseDir;
- /**
- * 授信ip列表,没有填写表示全部信任。多个ip之间逗号分隔,如: http://10.10.10.1:8080,http://10.10.10.2:8080
- */
- private String credentialIpList;
- /**
- * Session的用户权限在Redis中的过期时间(秒)。
- * 缺省值是 one day
- */
- private int sessionExpiredSeconds = 86400;
-}
diff --git a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/DataSourceConfig.java b/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/DataSourceConfig.java
deleted file mode 100644
index 6c569de3..00000000
--- a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/DataSourceConfig.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.orangeforms.webadmin.config;
-
-import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-import org.mybatis.spring.annotation.MapperScan;
-
-import javax.sql.DataSource;
-
-/**
- * 数据源配置Bean对象。
- *
- * @author Jerry
- * @date 2022-02-20
- */
-@Configuration
-@EnableTransactionManagement
-@MapperScan(value = {"com.orangeforms.webadmin.*.dao", "com.orangeforms.common.*.dao"})
-public class DataSourceConfig {
-
- @Bean(initMethod = "init", destroyMethod = "close")
- @Primary
- @ConfigurationProperties(prefix = "spring.datasource.druid")
- public DataSource druidDataSource() {
- return DruidDataSourceBuilder.create().build();
- }
-}
diff --git a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/FilterConfig.java b/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/FilterConfig.java
deleted file mode 100644
index 0116c2ce..00000000
--- a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/FilterConfig.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.orangeforms.webadmin.config;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.boot.web.servlet.FilterRegistrationBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.cors.CorsConfiguration;
-import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
-import org.springframework.web.filter.CorsFilter;
-
-import javax.servlet.Filter;
-import java.nio.charset.StandardCharsets;
-
-/**
- * 这里主要配置Web的各种过滤器和监听器等Servlet容器组件。
- *
- * @author Jerry
- * @date 2022-02-20
- */
-@Configuration
-public class FilterConfig {
-
- /**
- * 配置Ajax跨域过滤器。
- */
- @Bean
- public CorsFilter corsFilterRegistration(ApplicationConfig applicationConfig) {
- UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
- CorsConfiguration corsConfiguration = new CorsConfiguration();
- if (StringUtils.isNotBlank(applicationConfig.getCredentialIpList())) {
- if ("*".equals(applicationConfig.getCredentialIpList())) {
- corsConfiguration.addAllowedOriginPattern("*");
- } else {
- String[] credentialIpList = StringUtils.split(applicationConfig.getCredentialIpList(), ",");
- if (credentialIpList.length > 0) {
- for (String ip : credentialIpList) {
- corsConfiguration.addAllowedOrigin(ip);
- }
- }
- }
- corsConfiguration.addAllowedHeader("*");
- corsConfiguration.addAllowedMethod("*");
- corsConfiguration.addExposedHeader(applicationConfig.getRefreshedTokenHeaderKey());
- corsConfiguration.setAllowCredentials(true);
- configSource.registerCorsConfiguration("/**", corsConfiguration);
- }
- return new CorsFilter(configSource);
- }
-
- @Bean
- public FilterRegistrationBean characterEncodingFilterRegistration() {
- FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(
- new org.springframework.web.filter.CharacterEncodingFilter());
- filterRegistrationBean.addUrlPatterns("/*");
- filterRegistrationBean.addInitParameter("encoding", StandardCharsets.UTF_8.name());
- // forceEncoding强制response也被编码,另外即使request中已经设置encoding,forceEncoding也会重新设置
- filterRegistrationBean.addInitParameter("forceEncoding", "true");
- filterRegistrationBean.setAsyncSupported(true);
- return filterRegistrationBean;
- }
-}
diff --git a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/InterceptorConfig.java b/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/InterceptorConfig.java
deleted file mode 100644
index 6425b06a..00000000
--- a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/InterceptorConfig.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.orangeforms.webadmin.config;
-
-import com.orangeforms.webadmin.interceptor.AuthenticationInterceptor;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-/**
- * 所有的项目拦截器都在这里集中配置
- *
- * @author Jerry
- * @date 2022-02-20
- */
-@Configuration
-public class InterceptorConfig implements WebMvcConfigurer {
-
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(new AuthenticationInterceptor()).addPathPatterns("/admin/**");
- }
-}
diff --git a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/interceptor/AuthenticationInterceptor.java b/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/interceptor/AuthenticationInterceptor.java
deleted file mode 100644
index 2fbef090..00000000
--- a/orange-demo-single-pg/orange-demo-single-pg-service/application-webadmin/src/main/java/com/orangeforms/webadmin/interceptor/AuthenticationInterceptor.java
+++ /dev/null
@@ -1,143 +0,0 @@
-package com.orangeforms.webadmin.interceptor;
-
-import com.alibaba.fastjson.JSON;
-import com.orangeforms.webadmin.config.ApplicationConfig;
-import com.orangeforms.webadmin.upms.model.SysPermWhitelist;
-import com.orangeforms.webadmin.upms.service.SysPermWhitelistService;
-import com.orangeforms.webadmin.upms.service.SysPermService;
-import com.orangeforms.common.core.annotation.NoAuthInterface;
-import com.orangeforms.common.core.constant.ErrorCodeEnum;
-import com.orangeforms.common.core.object.ResponseResult;
-import com.orangeforms.common.core.object.TokenData;
-import com.orangeforms.common.core.util.ApplicationContextHolder;
-import com.orangeforms.common.core.util.JwtUtil;
-import com.orangeforms.common.core.util.RedisKeyUtil;
-import io.jsonwebtoken.Claims;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.redisson.api.RBucket;
-import org.redisson.api.RSet;
-import org.redisson.api.RedissonClient;
-import org.springframework.web.method.HandlerMethod;
-import org.springframework.web.servlet.HandlerInterceptor;
-import org.springframework.web.servlet.ModelAndView;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Set;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * 登录用户Token验证、生成和权限验证的拦截器。
- *
- * @author Jerry
- * @date 2022-02-20
- */
-@Slf4j
-public class AuthenticationInterceptor implements HandlerInterceptor {
-
- private final ApplicationConfig appConfig =
- ApplicationContextHolder.getBean("applicationConfig");
-
- private final RedissonClient redissonClient = ApplicationContextHolder.getBean(RedissonClient.class);
-
- private final SysPermService sysPermService =
- ApplicationContextHolder.getBean(SysPermService.class);
-
- private static SysPermWhitelistService sysPermWhitelistService =
- ApplicationContextHolder.getBean(SysPermWhitelistService.class);
-
- private static Set whitelistPermSet;
-
- static {
- List sysPermWhitelistList = sysPermWhitelistService.getAllList();
- whitelistPermSet = sysPermWhitelistList.stream()
- .map(SysPermWhitelist::getPermUrl).collect(Collectors.toSet());
- }
-
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
- throws Exception {
- String url = request.getRequestURI();
- String token = request.getHeader(appConfig.getTokenHeaderKey());
- boolean noLoginUrl = false;
- // 如果接口方法标记NoAuthInterface注解,可以直接跳过Token鉴权验证,这里主要为了测试接口方便
- if (handler instanceof HandlerMethod) {
- HandlerMethod hm = (HandlerMethod) handler;
- if (hm.getBeanType().getAnnotation(NoAuthInterface.class) != null
- || hm.getMethodAnnotation(NoAuthInterface.class) != null) {
- noLoginUrl = true;
- if (StringUtils.isBlank(token)) {
- return true;
- }
- }
- }
- if (StringUtils.isBlank(token)) {
- token = request.getParameter(appConfig.getTokenHeaderKey());
- }
- Claims c = JwtUtil.parseToken(token, appConfig.getTokenSigningKey());
- if (JwtUtil.isNullOrExpired(c)) {
- response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
- this.outputResponseMessage(response,
- ResponseResult.error(ErrorCodeEnum.UNAUTHORIZED_LOGIN, "用户会话已过期或尚未登录,请重新登录!"));
- return false;
- }
- String sessionId = (String) c.get("sessionId");
- String sessionIdKey = RedisKeyUtil.makeSessionIdKey(sessionId);
- RBucket sessionData = redissonClient.getBucket(sessionIdKey);
- TokenData tokenData = null;
- if (sessionData.isExists()) {
- tokenData = JSON.parseObject(sessionData.get(), TokenData.class);
- }
- if (tokenData == null) {
- response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
- this.outputResponseMessage(response,
- ResponseResult.error(ErrorCodeEnum.UNAUTHORIZED_LOGIN, "用户会话已失效,请重新登录!"));
- return false;
- }
- TokenData.addToRequest(tokenData);
- // 如果url是免登陆、白名单中,则不需要进行鉴权操作
- if (!noLoginUrl && Boolean.FALSE.equals(tokenData.getIsAdmin()) && !whitelistPermSet.contains(url)) {
- RSet permSet = redissonClient.getSet(RedisKeyUtil.makeSessionPermIdKey(sessionId));
- if (!permSet.contains(url)) {
- response.setStatus(HttpServletResponse.SC_FORBIDDEN);
- this.outputResponseMessage(response, ResponseResult.error(ErrorCodeEnum.NO_OPERATION_PERMISSION));
- return false;
- }
- }
- if (JwtUtil.needToRefresh(c)) {
- String refreshedToken = JwtUtil.generateToken(c, appConfig.getExpiration(), appConfig.getTokenSigningKey());
- response.addHeader(appConfig.getRefreshedTokenHeaderKey(), refreshedToken);
- }
- return true;
- }
-
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
- ModelAndView modelAndView) throws Exception {
- // 这里需要空注解,否则sonar会不happy。
- }
-
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- // 这里需要空注解,否则sonar会不happy。
- }
-
- private void outputResponseMessage(HttpServletResponse response, ResponseResult