diff --git a/orange-demo-flowable/orange-demo-flowable-service/.gitignore b/orange-demo-flowable/orange-demo-flowable-service/.gitignore
new file mode 100644
index 00000000..ac242580
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/.gitignore
@@ -0,0 +1,26 @@
+/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-flowable/orange-demo-flowable-service/README.md b/orange-demo-flowable/orange-demo-flowable-service/README.md
new file mode 100644
index 00000000..0939c817
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/README.md
@@ -0,0 +1,15 @@
+### 服务接口文档
+---
+- 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-flowable/orange-demo-flowable-service/application-webadmin/pom.xml b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/pom.xml
new file mode 100644
index 00000000..628a6304
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/pom.xml
@@ -0,0 +1,82 @@
+
+
+
+ com.flow.demo
+ DemoFlow
+ 1.0.0
+
+ 4.0.0
+
+ application-webadmin
+ 1.0.0
+ application
+ jar
+
+
+
+
+ com.flow.demo
+ common-redis
+ 1.0.0
+
+
+ com.flow.demo
+ common-online-api
+ 1.0.0
+
+
+ com.flow.demo
+ common-flow-online
+ 1.0.0
+
+
+ com.flow.demo
+ common-log
+ 1.0.0
+
+
+ com.flow.demo
+ common-sequence
+ 1.0.0
+
+
+ com.flow.demo
+ common-datafilter
+ 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-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/WebAdminApplication.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/WebAdminApplication.java
new file mode 100644
index 00000000..dcecef95
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/WebAdminApplication.java
@@ -0,0 +1,23 @@
+package com.flow.demo.webadmin;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+/**
+ * 应用服务启动类。
+ *
+ * @author Jerry
+ * @date 2021-06-06
+ */
+@EnableAsync
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+@ComponentScan("com.flow.demo")
+public class WebAdminApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(WebAdminApplication.class, args);
+ }
+}
diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/controller/AreaCodeController.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/controller/AreaCodeController.java
new file mode 100644
index 00000000..6d88cd24
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/controller/AreaCodeController.java
@@ -0,0 +1,72 @@
+package com.flow.demo.webadmin.app.controller;
+
+import cn.jimmyshi.beanquery.BeanQuery;
+import com.flow.demo.webadmin.app.model.AreaCode;
+import com.flow.demo.webadmin.app.service.AreaCodeService;
+import com.flow.demo.common.core.object.ResponseResult;
+import com.flow.demo.common.core.annotation.MyRequestBody;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+
+/**
+ * 行政区划数据访问接口类。
+ *
+ * @author Jerry
+ * @date 2021-06-06
+ */
+@RestController
+@RequestMapping("/admin/app/areaCode")
+public class AreaCodeController {
+
+ @Autowired
+ private AreaCodeService areaCodeService;
+
+ /**
+ * 按照字典的形式返回行政区划列表。
+ *
+ * @return 字典形式的行政区划列表。
+ */
+ @GetMapping("/listDict")
+ public ResponseResult>> listDict() {
+ List resultList = areaCodeService.getAllListFromCache();
+ return ResponseResult.success(BeanQuery.select(
+ "parentId as parentId", "areaId as id", "areaName as name").executeFrom(resultList));
+ }
+
+ /**
+ * 根据上级行政区划Id获取其下级行政区划列表。
+ *
+ * @param parentId 上级行政区划Id。
+ * @return 按照字典的形式返回下级行政区划列表。
+ */
+ @GetMapping("/listDictByParentId")
+ public ResponseResult>> listDictByParentId(@RequestParam(required = false) Long parentId) {
+ Collection resultList = areaCodeService.getListByParentId(parentId);
+ if (CollectionUtils.isEmpty(resultList)) {
+ return ResponseResult.success(new LinkedList<>());
+ }
+ return ResponseResult.success(BeanQuery.select(
+ "parentId as parentId", "areaId as id", "areaName as name").executeFrom(resultList));
+ }
+
+ /**
+ * 根据字典Id集合,获取查询后的字典数据。
+ *
+ * @param dictIds 字典Id集合。
+ * @return 字典形式的行政区划列表。
+ */
+ @PostMapping("/listDictByIds")
+ public ResponseResult>> listDictByIds(
+ @MyRequestBody(elementType = Long.class) List dictIds) {
+ List resultList = areaCodeService.getInList(new HashSet<>(dictIds));
+ return ResponseResult.success(BeanQuery.select(
+ "parentId as parentId", "areaId as id", "areaName as name").executeFrom(resultList));
+ }
+}
diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/dao/AreaCodeMapper.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/dao/AreaCodeMapper.java
new file mode 100644
index 00000000..21e069c4
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/dao/AreaCodeMapper.java
@@ -0,0 +1,13 @@
+package com.flow.demo.webadmin.app.dao;
+
+import com.flow.demo.common.core.base.dao.BaseDaoMapper;
+import com.flow.demo.webadmin.app.model.AreaCode;
+
+/**
+ * 行政区划数据操作访问接口。
+ *
+ * @author Jerry
+ * @date 2021-06-06
+ */
+public interface AreaCodeMapper extends BaseDaoMapper {
+}
\ No newline at end of file
diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/dao/mapper/AreaCodeMapper.xml b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/dao/mapper/AreaCodeMapper.xml
new file mode 100644
index 00000000..dd9cdadd
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/dao/mapper/AreaCodeMapper.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/model/AreaCode.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/model/AreaCode.java
new file mode 100644
index 00000000..bbf3026d
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/model/AreaCode.java
@@ -0,0 +1,39 @@
+package com.flow.demo.webadmin.app.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+/**
+ * 行政区划实体对象。
+ *
+ * @author Jerry
+ * @date 2021-06-06
+ */
+@Data
+@TableName(value = "zz_area_code")
+public class AreaCode {
+
+ /**
+ * 行政区划主键Id
+ */
+ @TableId(value = "area_id")
+ private Long areaId;
+
+ /**
+ * 行政区划名称
+ */
+ @TableField(value = "area_name")
+ private String areaName;
+
+ /**
+ * 行政区划级别 (1: 省级别 2: 市级别 3: 区级别)
+ */
+ @TableField(value = "area_level")
+ private Integer areaLevel;
+
+ /**
+ * 父级行政区划Id
+ */
+ @TableField(value = "parent_id")
+ private Long parentId;
+}
\ No newline at end of file
diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/service/AreaCodeService.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/service/AreaCodeService.java
new file mode 100644
index 00000000..df824c5b
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/service/AreaCodeService.java
@@ -0,0 +1,23 @@
+package com.flow.demo.webadmin.app.service;
+
+import com.flow.demo.common.core.base.service.IBaseDictService;
+import com.flow.demo.webadmin.app.model.AreaCode;
+
+import java.util.Collection;
+
+/**
+ * 行政区划的Service接口。
+ *
+ * @author Jerry
+ * @date 2021-06-06
+ */
+public interface AreaCodeService extends IBaseDictService {
+
+ /**
+ * 根据上级行政区划Id,获取其下级行政区划列表。
+ *
+ * @param parentId 上级行政区划Id。
+ * @return 下级行政区划列表。
+ */
+ Collection getListByParentId(Long parentId);
+}
diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/service/impl/AreaCodeServiceImpl.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/service/impl/AreaCodeServiceImpl.java
new file mode 100644
index 00000000..a4d02a74
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/service/impl/AreaCodeServiceImpl.java
@@ -0,0 +1,52 @@
+package com.flow.demo.webadmin.app.service.impl;
+
+import com.flow.demo.webadmin.app.service.AreaCodeService;
+import com.flow.demo.webadmin.app.dao.AreaCodeMapper;
+import com.flow.demo.webadmin.app.model.AreaCode;
+import com.flow.demo.common.core.cache.MapTreeDictionaryCache;
+import com.flow.demo.common.core.base.service.BaseDictService;
+import com.flow.demo.common.core.base.dao.BaseDaoMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.Collection;
+
+/**
+ * 行政区划的Service类。
+ *
+ * @author Jerry
+ * @date 2021-06-06
+ */
+@Service("areaCodeService")
+public class AreaCodeServiceImpl extends BaseDictService implements AreaCodeService {
+
+ @Autowired
+ private AreaCodeMapper areaCodeMapper;
+
+ public AreaCodeServiceImpl() {
+ super();
+ this.dictionaryCache = MapTreeDictionaryCache.create(AreaCode::getAreaId, AreaCode::getParentId);
+ }
+
+ @PostConstruct
+ public void init() {
+ this.reloadCachedData(true);
+ }
+
+ @Override
+ protected BaseDaoMapper mapper() {
+ return areaCodeMapper;
+ }
+
+ /**
+ * 根据上级行政区划Id,获取其下级行政区划列表。
+ *
+ * @param parentId 上级行政区划Id。
+ * @return 下级行政区划列表。
+ */
+ @Override
+ public Collection getListByParentId(Long parentId) {
+ return ((MapTreeDictionaryCache) dictionaryCache).getListByParentId(parentId);
+ }
+}
diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/util/FlowDeptPostExtHelper.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/util/FlowDeptPostExtHelper.java
new file mode 100644
index 00000000..a00a4e8b
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/util/FlowDeptPostExtHelper.java
@@ -0,0 +1,45 @@
+package com.flow.demo.webadmin.app.util;
+
+import cn.hutool.core.collection.CollUtil;
+import com.flow.demo.common.flow.util.BaseFlowDeptPostExtHelper;
+import com.flow.demo.common.flow.util.FlowCustomExtFactory;
+import com.flow.demo.webadmin.upms.service.SysDeptService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+
+/**
+ * 为流程提供所需的部门岗位等扩展信息的帮助类。如本部门领导岗位和上级部门领导岗位。
+ *
+ * @author Jerry
+ * @date 2021-06-06
+ */
+@Slf4j
+@Component
+public class FlowDeptPostExtHelper implements BaseFlowDeptPostExtHelper {
+
+ @Autowired
+ private SysDeptService sysDeptService;
+ @Autowired
+ private FlowCustomExtFactory flowCustomExtFactory;
+
+ @PostConstruct
+ public void doRegister() {
+ flowCustomExtFactory.registerFlowDeptPostExtHelper(this);
+ }
+
+ @Override
+ public Long getLeaderDeptPostId(Long deptId) {
+ List deptPostIdList = sysDeptService.getLeaderDeptPostIdList(deptId);
+ return CollUtil.isEmpty(deptPostIdList) ? null : deptPostIdList.get(0);
+ }
+
+ @Override
+ public Long getUpLeaderDeptPostId(Long deptId) {
+ List deptPostIdList = sysDeptService.getUpLeaderDeptPostIdList(deptId);
+ return CollUtil.isEmpty(deptPostIdList) ? null : deptPostIdList.get(0);
+ }
+}
diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/vo/AreaCodeVo.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/vo/AreaCodeVo.java
new file mode 100644
index 00000000..7e1051a5
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/app/vo/AreaCodeVo.java
@@ -0,0 +1,33 @@
+package com.flow.demo.webadmin.app.vo;
+
+import lombok.Data;
+
+/**
+ * 行政区划DomainVO对象。
+ *
+ * @author Jerry
+ * @date 2021-06-06
+ */
+@Data
+public class AreaCodeVo {
+
+ /**
+ * 行政区划主键Id
+ */
+ private Long areaId;
+
+ /**
+ * 行政区划名称
+ */
+ private String areaName;
+
+ /**
+ * 行政区划级别 (1: 省级别 2: 市级别 3: 区级别)
+ */
+ private Integer areaLevel;
+
+ /**
+ * 父级行政区划Id
+ */
+ private Long parentId;
+}
\ No newline at end of file
diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/ApplicationConfig.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/ApplicationConfig.java
new file mode 100644
index 00000000..2be23ed5
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/ApplicationConfig.java
@@ -0,0 +1,51 @@
+package com.flow.demo.webadmin.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 应用程序自定义的程序属性配置文件。
+ *
+ * @author Jerry
+ * @date 2021-06-06
+ */
+@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-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/DataSourceType.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/DataSourceType.java
new file mode 100644
index 00000000..92876210
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/DataSourceType.java
@@ -0,0 +1,36 @@
+package com.flow.demo.webadmin.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 表示数据源类型的常量对象。
+ *
+ * @author Jerry
+ * @date 2021-06-06
+ */
+public final class DataSourceType {
+
+ public static final int MAIN = 0;
+
+ private static final Map TYPE_MAP = new HashMap<>(2);
+ static {
+ TYPE_MAP.put("main", MAIN);
+ }
+
+ /**
+ * 根据名称获取字典类型。
+ *
+ * @param name 数据源在配置中的名称。
+ * @return 返回可用于多数据源切换的数据源类型。
+ */
+ public static Integer getDataSourceTypeByName(String name) {
+ return TYPE_MAP.get(name);
+ }
+
+ /**
+ * 私有构造函数,明确标识该常量类的作用。
+ */
+ private DataSourceType() {
+ }
+}
diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/FilterConfig.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/FilterConfig.java
new file mode 100644
index 00000000..2e9d2117
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/FilterConfig.java
@@ -0,0 +1,57 @@
+package com.flow.demo.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 2021-06-06
+ */
+@Configuration
+public class FilterConfig {
+
+ /**
+ * 配置Ajax跨域过滤器。
+ */
+ @Bean
+ public CorsFilter corsFilterRegistration(ApplicationConfig applicationConfig) {
+ UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
+ CorsConfiguration corsConfiguration = new CorsConfiguration();
+ if (StringUtils.isNotBlank(applicationConfig.getCredentialIpList())) {
+ 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-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/InterceptorConfig.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/InterceptorConfig.java
new file mode 100644
index 00000000..854e9fbc
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/InterceptorConfig.java
@@ -0,0 +1,21 @@
+package com.flow.demo.webadmin.config;
+
+import com.flow.demo.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 2021-06-06
+ */
+@Configuration
+public class InterceptorConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(new AuthenticationInterceptor()).addPathPatterns("/admin/**");
+ }
+}
diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/MultiDataSourceConfig.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/MultiDataSourceConfig.java
new file mode 100644
index 00000000..b7440328
--- /dev/null
+++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/flow/demo/webadmin/config/MultiDataSourceConfig.java
@@ -0,0 +1,44 @@
+package com.flow.demo.webadmin.config;
+
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
+import com.flow.demo.common.core.config.DynamicDataSource;
+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;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 多数据源配置对象。
+ *
+ * @author Jerry
+ * @date 2021-06-06
+ */
+@Configuration
+@EnableTransactionManagement
+@MapperScan(value = {"com.flow.demo.webadmin.*.dao", "com.flow.demo.common.*.dao"})
+public class MultiDataSourceConfig {
+
+ @Bean(initMethod = "init", destroyMethod = "close")
+ @ConfigurationProperties(prefix = "spring.datasource.druid.main")
+ public DataSource mainDataSource() {
+ return DruidDataSourceBuilder.create().build();
+ }
+
+ @Bean
+ @Primary
+ public DynamicDataSource dataSource() {
+ Map