基础要求
- 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 字段中,见下图。
- 将生成的公钥,替换到前端工程,见下图。
结语
赠人玫瑰,手有余香,感谢您的支持和关注。选择橙单,效率乘三,收入翻番。