基础要求

  • JDK = 1.8.x「Spring Boot 2」
  • JDK = 17「Spring Boot 3」
  • Maven >= 3.6
  • MySQL >= 8.0
  • NodeJs = 18.16.1
  • NPM = 9.5.1
  • Docker >= 19.x「微服务必选」

开发环境

  • 前端推荐使用 VSCode 作为开发环境,npm + webpack 为打包工具。重点,前端 NodeJs 和 NPM 的版本,请务必参考上面的基础要求
  • 后台推荐使用 IntelliJ IDEA 作为开发环境,Maven 为打包工具。
  • 后台必须安装的 IDE 插件包括 Lombok Plugin 和 Maven Helper。

工程导入

当前文档仅给出 IntelliJ IDEA 和 VSCode 的工程导入说明。

  • 解压下载后的压缩包,如 DemoSingle.zip,其中目录 admin-project/DemoSingle 为后端工程主目录。
  • 打开 IntelliJ IDEA,依次选择菜单 File -> Open,选中下图所示目录将工程导入。第一次导入时会相对较慢,需要将项目依赖的 jar 包,通过 Maven 拉取并下载到本地仓库。
  • 导入成功后,如下图所示,打开停靠在 IDE 最右侧的 Maven 窗格,双击执行 maven install 命令,如出现任何编译期问题,请及时反馈。

目录结构

这里我们列出了全部可生成的工程模块目录结构,如果有些模块没有出现在您已经生成的工程中,可直接忽略。

├── common                                // 工具类
│       └── common-core                   // 基础通用类集合
│              └── advice                 // 全局通知
│              └── annotation             // 全局注解
│              └── aop                    // 通用切面
│              └── base/client            // Feign远程调用接口基类
│              └── base/controller        // Feign远程调用控制器基类
│              └── base/model             // 实体对象基类
│              └── base/vo                // VO对象基类
│              └── base/dao               // 数据访问层基类
│              └── base/mapper            // 对象映射基类
│              └── base/service           // 全局服务类接口和基类
│              └── cache                  // 字典缓存类
│              └── config                 // 全局配置类
│              └── constant               // 全局常量
│              └── exception              // 全局异常
│              └── interceptor            // 全局拦截器
│              └── listener               // 全局监听器
│              └── object                 // 全局对象
│              └── upload                 // 文件上传插件的基类
│              └── util                   // 工具对象
│              └── validator              // 表单数据验证器
│       └── common-datafilter             // 数据过滤,如数据权限和租户
│              └── aop                    // 数据过滤相关切面
│              └── config                 // 配置对象
│              └── interceptor            // Mybatis拦截器
│              └── listener               // 加载初始数据的监听器
│       └── common-datasync               // 基于RocketMQ的数据同步公用模块
│              └── base/service           // 数据同步的Service基类
│              └── config                 // 配置对象
│              └── constant               // 常量对象
│              └── consumer               // 消费者基类
│              └── dao                    // 消息幂等性数据访问类
│              └── dao/mapper             // 消息幂等性数据访问xml
│              └── event                  // 消息异步发送通知事件
│              └── listener               // 消息监听器
│              └── model                  // 消息幂等性实体对象
│              └── object                 // 自定义对象
│              └── producer               // 数据同步的消息生产者类
│              └── service                // 消息幂等性数据操作服务类
│       └── common-dbutil                 // 通过JDBC操作数据的工具模块
│              └── constant               // 常量对象
│              └── object                 // 对象类
│              └── provider               // 不同数据库类型的供应者
│              └── util                   // 工具类
│       └── common-dict                   // 全局编码数据字典
│              └── constant               // 常量对象
│              └── dao                    // 字典表的数据访问层
│              └── dto                    // 全局编码字典的DTO对象
│              └── model                  // 全局编码字典的实体对象
│              └── service                // 全局编码字典的服务接口
│              └── service/impl           // 全局编码字典的服务实现类
│              └── util                   // 工具类
│              └── vo                     // 全局编码字典的VO对象
│       └── common-ext                    // 针对在线表单和报表等模块的扩展
│              └── base                   // 基础对象
│              └── config                 // 配置对象
│              └── constant               // 常量类
│              └── controller             // 扩展组件访问的接口
│              └── util                   // 工具类
│       └── common-log                    // 操作日志组件
│              └── annotation             // 标记操作日志的注解
│              └── aop                    // 统一拦截处理的切面类
│              └── config                 // 配置对象
│              └── dao                    // 操作日志数据访问类
│              └── dao/mapper             // 操作日志数据访问xml
│              └── dto                    // 操作日志DTO对象
│              └── model                  // 操作日志实体对象
│              └── model/constant         // 操作日志实体对象的常量类
│              └── service                // 操作日志数据操作服务类
│              └── service/impl           // 操作日志数据操作服务实现类
│              └── vo                     // 操作日志VO对象
│       └── common-redis                  // Redis功能
│              └── cache                  // 基于Redis的字典缓存类
│              └── config                 // Redis配置类
│              └── util                   // Redis工具类
│       └── common-minio                  // Minio功能
│              └── config                 // Minio配置类
│              └── util                   // 工具类
│              └── wrapper                // 封装的Minio模板类
│       └── common-sequence               // 分布式Id功能
│              └── config                 // 配置类
│              └── generator              // Id生成器
│              └── wrapper                // 统一封装对象
│       └── common-flow                   // 工作流基础模块
│              └── base/service           // 服务实现的基类
│              └── config                 // 配置对象
│              └── constant               // 常量对象
│              └── controller             // 请求接口对象
│              └── dao                    // 数据访问层
│              └── dao/mapper             // 数据访问xml
│              └── dto                    // DTO对象
│              └── exception              // 异常对象
│              └── listener               // 自定义监听器
│              └── model                  // 实体对象
│              └── model/constant         // 实体对象常量
│              └── object                 // 自定义对象
│              └── service                // 数据服务接口
│              └── service/impl           // 数据服务接口实现
│              └── util                   // 工具对象
│              └── vo                     // VO对象
│       └── common-flow-online            // 工作流集成在线表单
│              └── aop                    // 模块内统一的AOP
│              └── controller             // 请求接口
│              └── config                 // 配置对象
│              └── object                 // 对象类
│              └── service                // 数据服务接口
│              └── service/impl           // 数据服务接口实现
│       └── common-online                 // 在线表单基础模块
│              └── aop                    // 模块内统一的AOP
│              └── config                 // 配置对象
│              └── controller             // 请求接口对象
│              └── dao                    // 数据访问层
│              └── dao/mapper             // 数据访问xml
│              └── dto                    // DTO对象
│              └── exception              // 模块内定义的异常
│              └── model                  // 实体对象
│              └── model/constant         // 实体对象常量
│              └── object                 // 自定义对象
│              └── service                // 数据服务接口
│              └── service/impl           // 数据服务接口实现
│              └── util                   // 工具对象
│              └── vo                     // VO对象
│       └── common-report                 // 报表基础模块
│              └── config                 // 配置对象
│              └── constant               // 常量对象
│              └── constroller            // 请求接口对象
│              └── dao                    // 数据访问层
│              └── dao/mapper             // 数据访问xml
│              └── dto                    // DTO对象
│              └── example                // 样例
│              └── model                  // 实体对象
│              └── model/constant         // 实体对象的常量类
│              └── object                 // 自定义对象
│              └── object/sheet           // 打印模板中电子表单
│              └── object/view            // 报表组件中视图对象
│              └── service                // 数据服务接口
│              └── service/impl           // 数据服务接口实现
│              └── util                   // 工具类
│              └── vo                     // VO对象
│       └── common-mobile                 // 移动端模块
│              └── config                 // 配置对象
│              └── controller             // 请求接口对象
│              └── dao                    // 数据访问层
│              └── dao/mapper             // 数据访问xml
│              └── dto                    // DTO对象
│              └── model                  // 实体对象
│              └── model/constant         // 实体对象常量
│              └── object                 // 自定义对象
│              └── service                // 数据服务接口
│              └── service/impl           // 数据服务接口实现
│              └── vo                     // VO对象
│       └── common-tenant                 // 仅多租户可见
│              └── annotation             // 注解对象
│              └── aop                    // 模块内的AOP
│              └── constant               // 常量类
│       └── common-tenant-online          // 多租户在线表单模块
│              └── controller             // 多租户在线表单访问接口
│       └── common-tenant-report          // 多租户报表打印模块
│              └── controller             // 多租户报表打印访问接口
├── application                           // 生成的应用服务
│       └── application-common            // 应用服务的通用业务
│              └── constant               // 业务依赖的通用常量
│       └── gateway                       // 网关服务
│              └── config                 // 网关配置类
│              └── constant               // 网关常量
│              └── filter                 // 网关过滤器
│              └── util                   // 网关工具类
│       └── upms                          // 用户权限服务
│              └── upms-api               // 服务接口
│                    └── client           // 服务的Feign接口
│                    └── constant         // 服务常量
│                    └── dto              // 服务的DTO
│                    └── vo               // 服务的VO
│              └── upms-service           // 服务实现
│                    └── config           // 服务配置类
│                    └── controller       // 服务控制器类
│                    └── dao              // 服务数据访问类
│                    └── dao/mapper       // 服务数据访问层xml
│                    └── model            // 服务实体对象类
│                    └── service          // 服务的数据服务接口
│                    └── service/impl     // 服务的数据服务实现类
│                    └── util             // 工具类
├── application-consumer                  // 独立的消息消费者服务
│       └── upms-dept-sync                // upms部门数据实时同步服务
│              └── config                 // 服务配置类
│              └── consumer               // 包含多个消费群组的实现类
│              └── dao                    // 部门同步数据访问层
│              └── dao/mapper             // 部门同步数据访问层xml
│              └── model                  // 部门及相关数据实体对象
│              └── service                // 部门同步数据操作服务类
│       └── operation-log-consumer        // 集中处理操作日志的Kafka消费者服务
│              └── config                 // 服务配置类
│              └── consumer               // 批量处理操作日志的消费者监听器
├── application-tenant                    // 多租户管理服务
│       └── tenant-admin                  // 租户管理服务
│              └── config                 // 服务配置类
│              └── constant               // 常量类
│              └── interceptor            // 数据访问的拦截器
│              └── tenant/controller      // 租户系统管理接口
│              └── tenant/dao             // 租户系统管理数据访问层
│              └── tenant/dao/mapper      // 租户系统管理数据访问层xml
│              └── tenant/dto             // 租户系统管理数据输入域对象
│              └── tenant/model           // 租户系统管理数据实体对象
│              └── tenant/vo              // 租户系统管理数据输出值对象
│              └── tenant/service         // 租户系统管理数据操作服务类
│              └── tenant/service/impl    // 租户系统管理数据操作服务实现类
│              └── upms/bo                // 租户平台管理业务对象
│              └── upms/controller        // 租户平台管理接口
│              └── upms/dao               // 租户平台管理数据访问层
│              └── upms/dao/mapper        // 租户平台管理数据访问层xml
│              └── upms/dto               // 租户平台管理数据输入域对象
│              └── upms/model             // 租户平台管理数据实体对象
│              └── upms/model/constant    // 租户平台管理数据实体对象的常量类
│              └── upms/service           // 租户平台管理数据操作服务类
│              └── upms/service/impl      // 租户平台管理数据操作服务实现类
│              └── upms/util              // 租户平台管理工具类
│              └── upms/vo                // 租户平台管理数据输出值对象
│       └── tenant-sync                   // 租户管理和租户业务库之间的数据同步
│              └── annotation             // 模块内使用的注解类
│              └── aop                    // 模块内使用的AOP类
│              └── config                 // 服务配置类
│              └── consumer               // 包含多个消费群组的实现类
│              └── online/service         // 租户系统在线表单数据同步服务类
│              └── report/service         // 租户系统报表统计数据同步服务类
│              └── upms/dao               // 租户系统权限数据访问层
│              └── upms/dao/mapper        // 租户系统权限数据访问层xml
│              └── upms/model             // 租户系统权限数据实体对象
│              └── upms/model/constant    // 租户系统权限数据实体对象常量对象
│              └── upms/service           // 租户系统权限数据操作服务类
├── framework                             // 所有基础服务的根目录
│       └── uaa                           // uaa服务模块的根目录
│              └── uaa-auth               // uaa授权服务模块
│                    └── config           // 配置对象
│                    └── handler          // 请求处理器
│                    └── controller       // 接口对象
│                    └── service          // 业务服务
│                    └── dao              // 数据表访问
│                    └── model            // 实体对象
│                    └── dto              // dto对象
│                    └── util             // 工具类
│              └── uaa-admin              // uaa管理服务模块
│                    └── config           // 配置对象
│                    └── interceptor      // 拦截器
│                    └── controller       // 接口对象
│                    └── service          // 业务服务
│                    └── dao              // 数据表访问
│                    └── model            // 实体对象
├── zz-resource                           // 资源目录
│       └── docker-files                  // Docker容器 (调试阶段可用)
│       └── upload-files                  // 缺省文件上传目录 (调试阶段)
│       └── db-scripts                    // 数据库初始化脚本
│             └── upms-script.sql         // 用户权限SQL脚本
│             └── uaa-script.sql          // 统一登录SQL脚本(仅当支持时必选)
│             └── areacode.sql            // 行政区划SQL脚本 (非必选)

数据初始化

在开始执行数据库初始化脚本之前,请先了解以下注意事项。

  • 执行前请先打开脚本,并按文件中的注释说明去选择正确的执行数据库。
  • 多租户工程,租户管理和租户运营必须是分开的数据库。
  • 以 -pg 结尾的脚本,为 PostgreSQL 的数据库脚本,以 -oracle 结尾的脚本,为 Oracle 的数据库脚本,以此类推。
  • 没有任何对应后缀的是 MySQL 的数据库脚本。

在后端工程目录下,依次执行以下数据库脚本文件。需要说明的是,这里我们列出了所有可能生成的数据库脚本,如果下面提及的文件,在您的生成后工程中并不存在,可直接忽略。

  • 移动端入口表创建脚本 (./zz-resource/db-scripts/mobile-script.sql),请在后台管理应用的 upms 数据库中执行该脚本。
  • 后台用户权限表创建脚本 (./zz-resource/db-scripts/upms-script.sql),请在后台管理应用的 upms 数据库中执行该脚本。
  • 用户权限数据初始化脚本 (./zz-resource/init-upms-data-script.sql),包含全部在橙单生成器中配置的表单接口权限数据。多次生成时,相同权限数据的主键 ID 不变。需要额外说明的是,对于多租户系统而言,租户系统的用户权限管理数据,也包含在该脚本中。
  • 注意,该脚本是数据回滚脚本,不应在初始化时执行。用户权限数据回滚脚本 (./zz-resource/rollback-upms-data-script.sql),仅仅删除在 init-upms-data-script.sql 脚本中初始化的数据,用户自己手动添加的数据不会被删除。
  • 租户管理系统的用户权限表创建脚本 (./zz-resource/db-scripts/tenant-admin.sql),切记在租户管理数据库中执行。
  • 租户管理系统的用户权限数据初始化脚本 (./zz-resource/init-tenant-admin-data.sql),包含全部在橙单生成器中配置的表单接口权限数据。多次生成时,相同权限数据的主键 ID 不变。切记在租户管理数据库中执行。
  • 注意,该脚本是数据回滚脚本,不应在初始化时执行。租户管理系统的用户权限数据回滚脚本 (./zz-resource/rollback-tenant-admin-data.sql),仅仅删除在 init-tenant-admin-data.sql 脚本中初始化的数据,用户自己手动添加的数据不会被删除。切记在租户管理数据库中执行。
  • 全局编码字典模块内置表创建脚本 (./zz-resource/db-scripts/global-dict-script.sql),请根据实际情况,在全局编码所在数据库中执行该脚本。该脚本也会将在生成器中配置的全局编码字典插入到 zz_global_dict 表中。
  • 在线表单模块内置表创建脚本 (./zz-resource/db-scripts/online-form-script.sql),请根据实际情况,在在线表单管理数据库中执行该脚本。
  • 工作流模块内置表创建及数据初始化脚本 (./zz-resource/db-scripts/flow-script.sql),请根据实际情况,在流程管理数据库中执行该脚本。这其中包括流程引擎自带的内置表,以及橙单在集成 flowable 过程中创建的一系列自定义内置表,如流程工单表等。
  • 租户运营系统的工作流模块内置表创建及数据初始化脚本 (./zz-resource/db-scripts/tenant-flow-script.sql),请在租户业务数据库中执行该脚本。这其中包括流程引擎自带的内置表,以及橙单在集成 flowable 过程中创建的一系列自定义内置表,如流程工单表等。
  • 在租户运营业务数据库中执行 (./zz-resource/db-scripts/tenant-online-dblink-init.sql) 和 (./zz-resource/db-scripts/tenant-report-dblink-init.sql) 初始化脚本。
  • 报表打印模块内置表创建脚本 (./zz-resource/db-scripts/report-script.sql),请根据实际情况,在报表打印管理数据库中执行该脚本。
  • 单点登录数据初始化脚本 (./zz-resource/db-scripts/uaa-script.sql),仅当支持 uaa 时执行该脚本。
  • 行政区划数据初始化脚本 (./zz-resource/db-scripts/areacode.sql),如文件存在,需按脚本中的注释说明,在指定的数据库中创建表并插入数据。
  • Seata 分布式事务重做日志表数据初始化 (./zz-resource/db-scripts/seata-script.sql)。需要在所有支持分布式事务的数据库中执行该脚本。
  • 在需要同步部门及关联数据的业务数据库 (非upms数据库) 中,导入部门同步消费者服务所需的数据表 (./zz-resource/db-scripts/upms-dept-sync-script.sql),这里创建的数据表,均为 upms-dept-sync 服务所用。其中包括 zz_sys_dept 和 zz_sys_dept_relation 两个与部门相关的数据表,还有一个是用作消费幂等性保证的消费流水表,zz_data_sync_consumer_trans。其中每次同步操作均会产生一条消费流水数据,主键 ID 为 TransId,由消息的生产者统一提供,消费者服务在每次执行业务逻辑之前,均会查询该 TransId 是否存在,存在则忽略业务逻辑的执行,否则执行正常的业务逻辑,从而可以有效避免同一业务操作被多次执行的风险。
  • 操作日志表创建脚本 (./zz-resource/db-scripts/operation-log-consumer.sql),请在存储操作日志的数据库中执行该脚本。

后台编译

本小节内容仅对微服务和多租户工程有效。

  • 工程目录下的 pom.xml 文件中,包含了与部署环境相关的配置变量。
  • 切换默认编译环境,可以将下图中的 activeByDefault 标签放到其他环境中,如下图的 test 环境。
  • 命令行打包的环境切换。
# 默认环境打包
mvn clean install
# 指定环境打包,比如指定生成环境
mvn clean install -P prod
  • 在执行 mvn package 或者 mvn install 的时候,会将下图 pom.xml 文件中的变量替换到工程内的资源文件中。

生成密钥

在工程生成之后,我们为您提供了缺省的用于用户密码加密的公钥和私钥,考虑到今后生产环境中,您势必需要更换缺省的公钥和私钥,生成方式可参考这里。

重点!通常是后台开发者执行以下操作,生成新的公钥和私钥,切记一定要保证前后端同时更新,特别是前端比较容易遗漏。如果遇到后台登录接口解密失败的情况,推荐再次生成新的公钥和私钥,并确保前后台均已更新之后,再做重试。

  • 打开工程 common/common-core 模块中的 RsaUtil.java 文件,以 main 函数的方式执行当前文件,见下图及其注释。
  • 将生成后的私钥,替换到后台工程 common/common-core 模块中 ApplicationConstant 类的 PRIVATE_KEY 字段中,见下图。
  • 将生成的公钥,替换到前端工程,见下图。

结语

赠人玫瑰,手有余香,感谢您的支持和关注。选择橙单,效率乘三,收入翻番。