📝 平台简介

一、功能说明

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + UniApp 微信小程序,支持 RBAC 动态权限、数据权限、SaaS 多租户、Activiti + Flowable 工作流、三方登录、短信等功能。

  • 前端采用 vue-element-admin,正在支持 Vue 3 + ElementUI Plus 最新方案。
  • 后端采用 Spring Boot、MySQL + MyBatis Plus、Redis + Redisson。
  • 数据库可使用 MySQL、Oracle、PostgreSQL、SQL Server、国产达梦 DM 等等。
  • 权限认证使用 Spring Security & Token & Redis,支持多终端、多种用户的认证系统。
  • 支持加载动态权限菜单,按钮级别权限控制,本地缓存提升性能。
  • 支持 SaaS 多租户系统,可自定义每个租户的权限,提供透明化的多租户底层封装。
  • 工作流使用 Flowable,支持动态表单、在线设计流程、多种任务分配方式。
  • 高效率开发,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验。
  • 集成微信小程序、微信公众号、企业微信、钉钉等三方登录。
  • 集成阿里云、腾讯云、云片等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务。
  • 集成activemq消息订阅/发布服务。

    二、功能列表

    1、系统功能

    | | 功能 | 描述 | | —- | —- | —- | | | 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置 | | ⭐️ | 在线用户 | 当前系统中活跃用户状态监控,支持手动踢下线 | | | 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 | | | 菜单管理 | 配置系统菜单、操作权限、按钮权限标识等,本地缓存提供性能 | | | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 | | | 岗位管理 | 配置系统用户所属担任职务 | | 🚀 | 租户管理 | 配置系统租户,支持 SaaS 场景下的多租户功能 | | 🚀 | 租户套餐 | 配置租户套餐,自定每个租户的菜单、操作、按钮的权限 | | | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | | 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、云片等主流短信平台 | | 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 | | ⭐️ | 登录日志 | 系统登录日志记录查询,包含登录异常 | | 🚀 | 错误码管理 | 系统所有错误码的管理,可在线修改错误提示,无需重启服务 | | | 通知公告 | 系统通知公告信息发布维护 |

2、基础设施

功能 描述
🚀 代码生成 前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载
🚀 系统接口 基于 Swagger 自动生成相关的 RESTful API 接口文档
🚀 数据库文档 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式
表单构建 拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件
🚀 配置管理 对系统动态配置常用参数,支持 SpringBoot 加载
🚀 文件服务 支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、数据库等
🚀 文件服务 支持本地文件存储,同时支持兼容 Amazon S3 协议的云服务、开源组件
🚀 API 日志 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题
MySQL 监控 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈
Redis 监控 监控 Redis 数据库的使用情况,使用的 Redis Key 管理
🚀 消息队列 基于 Redis 实现消息队列,Stream 提供集群消费,Pub/Sub 提供广播消费
🚀 Java 监控 基于 Spring Boot Admin 实现 Java 应用的监控
🚀 链路追踪 接入 SkyWalking 组件,实现链路追踪
🚀 日志中心 接入 SkyWalking 组件,实现日志中心
🚀 分布式锁 基于 Redis 实现分布式锁,满足并发场景
🚀 幂等组件 基于 Redis 实现幂等组件,解决重复请求问题
🚀 服务保障 基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能
🚀 日志服务 轻量级日志中心,查看远程服务器的日志
🚀 单元测试 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等
activemq服务 基于active实现了Jms的实时消息发布订阅服务

3、工作流程

功能 描述
🚀 流程模型 配置工作流的流程模型,支持文件导入与在线设计流程图,提供 7 种任务分配规则
🚀 流程表单 拖动表单元素生成相应的工作流表单,覆盖 Element UI 所有的表单组件
🚀 用户分组 自定义用户分组,可用于工作流的审批分组
🚀 我的流程 查看我发起的工作流程,支持新建、取消流程等操作,高亮流程图、审批时间线
🚀 待办任务 查看自己【未】审批的工作任务,支持通过、不通过、转发、委派、退回等操作
🚀 已办任务 查看自己【已】审批的工作任务,未来会支持回退操作
🚀 OA 请假 作为业务自定义接入工作流的使用示例,只需创建请求对应的工作流程,即可进行审批

image.png技术选型

👻 后端

系统环境

框架 说明 版本 学习指南
JDK Java 开发工具包 >= 1.8.0 书单
Maven Java 管理与构建工具 >= 3.5.0 书单
Nginx 高性能 Web 服务器 - 文档

主框架

框架 说明 版本 学习指南
Spring Boot 应用开发框架 2.5.10 文档
Spring MVC MVC 框架 5.3.16 文档
Spring Security Spring 安全框架 5.5.5 文档
Hibernate Validator 参数校验组件 6.2.2 文档

存储层

框架 说明 版本 学习指南
MySQL 数据库服务器 >= 5.7 书单
Druid JDBC 连接池、监控组件 1.2.8 文档
MyBatis Plus MyBatis 增强工具包 3.5.1 文档
Dynamic Datasource 动态数据源 3.5.0 文档
Redis key-value 数据库 >= 5.0 书单
Redisson Redis 客户端 3.16.8 文档

中间件

框架 说明 版本 学习指南
Activiti 工作流引擎 7.1.0.M6 文档
Quartz 任务调度组件 2.3.2 文档
Resilience4j 服务保障组件 1.7.0 文档
avtivemq mqtt服务 5.15.0 文档

系统监控

框架 说明 版本 学习指南
Spring Boot Admin Spring Boot 监控平台 2.4.2 文档
SkyWalking 分布式应用追踪系统 8.5.0 文档

单元测试

框架 说明 版本 学习指南
JUnit Java 单元测试框架 5.7.2 -
Mockito Java Mock 框架 3.9.0 -

其它工具

框架 说明 版本 学习指南
Knife4j Swagger 增强 UI 实现 3.0.2 文档
Jackson JSON 工具库 2.12.6
MapStruct Java Bean 转换 1.4.1 文档
Lombok 消除冗长的 Java 代码 1.16.14 文档

👾 前端

管理后台

框架 说明 版本 学习指南
Node JavaScript 运行时环境 >= 12 -
Vue JavaScript 框架 2.6.12 书单
Vue Element Admin 后台前端解决方案 -

用户 App

框架 说明 版本 学习指南
Vue JavaScript 框架 2.6.12 书单
UniApp 小程序、H5、App 的统一框架 - -

image.png项目结构

image.png

👻 后端结构

后端采用模块化的架构,按照功能拆分成多个 Maven Module,提升开发与研发的效率,带来更好的可维护性。
一共有类 Maven Module:

Maven Module 作用
ykkj-dependencies Maven 依赖版本管理
ykkj-framework Java 框架拓展
ykkj-module-xxx XXX 功能的 Module 模块
ykkj-server 管理后台 + 用户 App 的服务端

下面,我们来逐个看看。

1. ykkj-dependencies

该模块是一个 Maven Bom,只有一个 pom.xml文件,定义项目中所有 Maven 依赖的版本号,解决依赖冲突问题。

从定位上来说,它和 Spring Boot 的 spring-boot-starter-parent和 Spring Cloud 的 spring-cloud-dependencies是一致的。
实际上,ykkj-springboot 本质上还是个单体项目,直接在根目录 pom.xml管理依赖版本会更加方便,也符合绝大多数程序员的认知。但是要额外考虑一个场景,如果每个 ykkj-module-xxx 模块都维护在一个独立的 Git 仓库,那么 ykkj-dependencies 就可以在多个 ykkj-module-xxx 模块下复用。

2. ykkj-framework

该模块是 com-ykkj.cdp 项目的框架封装,其下的每个 Maven Module 都是一个组件,分成两种类型:
① 技术组件:技术相关的组件封装,例如说 MyBatis、Redis 等等。

Maven Module 作用
ykkj-common 定义基础 pojo 类、枚举、工具类等
ykkj-spring-boot-starter-activemq 消息队列,基于 activemq 实现,支持实时/队列消息的发布/订阅
ykkj-spring-boot-starter-web Web 封装,提供全局异常、访问日志等
ykkj-spring-boot-starter-security 认证授权,基于 Spring Security 实现
ykkj-spring-boot-starter-mybatis 数据库操作,基于 MyBatis Plus 实现
ykkj-spring-boot-starter-redis 缓存操作,基于 Spring Data Redis + Redisson 实现
ykkj-spring-boot-starter-mq 消息队列,基于 Redis 实现,支持集群消费和广播消费
ykkj-spring-boot-starter-config 配置中心,基于 Apollo 实现,提供动态配置
ykkj-spring-boot-starter-job 定时任务,基于 Quartz 实现,支持集模式
ykkj-spring-boot-starter-flowable 工作流,基于 Flowable 实现
ykkj-spring-boot-starter-protection 服务保障,提供幂等、分布式锁、限流、熔断等功能
ykkj-spring-boot-starter-file 文件客户端,支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、FTP、数据库等
ykkj-spring-boot-starter-excel Excel 导入导出,基于 EasyExcel 实现
ykkj-spring-boot-starter-monitor 服务监控,提供链路追踪、日志服务、指标收集等功能
ykkj-spring-boot-starter-test 单元测试,基于 Junit + Mockito 实现
ykkj-spring-boot-starter-extension 拓展点组件

② 业务组件:业务相关的组件封装,例如说数据字典、操作日志等等。如果是业务组件,名字会包含 biz 关键字。

Maven Module 作用
ykkj-spring-boot-starter-biz-tenant SaaS 多租户
ykkj-spring-boot-starter-biz-data-permissionn 数据权限
ykkj-spring-boot-starter-biz-dict 数据字典
ykkj-spring-boot-starter-biz-operatelog 操作日志
ykkj-spring-boot-starter-biz-sms 短信客户端,对接阿里云、腾讯云等短信服务
ykkj-spring-boot-starter-biz-social 社交客户端,对接微信公众号、小程序、企业微信、钉钉等三方授权平台
ykkj-spring-boot-starter-biz-weixin 微信客户端,对接微信的公众号、开放平台等

每个组件,包含两部分:

  1. core 包:组件的核心封装,拓展相关的功能。
  2. config 包:组件的 Spring Boot 自动配置。

image.png

3. ykkj-module-xxx

该模块是 XXX 功能的 Module 模块,目前内置了 4 个模块。

项目 说明 是否必须
ykkj-module-system 系统功能
ykkj-module-infra 基础设施
ykkj-module-member 会员中心 x
ykkj-module-bpm 工作流程 x

每个模块包含两个 Maven Module,分别是:

Maven Module 作用
ykkj-module-xxx-api 提供给其它模块的 API 定义
ykkj-module-xxx-biz 模块的功能的具体实现

例如说,ykkj-module-infra 想要访问 ykkj-module-system 的用户、部门等数据,需要引入 ykkj-module-system-api 子模块。示例如下:
image.png
疑问:为什么设计 ykkj-module-xxx-api 模块呢?

  1. 明确需要提供给其它模块的 API 定义,方便未来迁移微服务架构。
  2. 模块之间可能会存在相互引用的情况,虽然说从系统设计上要尽量避免,但是有时在快速迭代的情况下,可能会出现。此时,通过只引用对方模块的 API 子模块,解决相互引用导致 Maven 无法打包的问题。

ykkj-module-xxx-api 子模块的项目结构如下:
image.png

所在包 作用 示例
api Api 接口 提供给其它模块的 API 接口 AdminUserApi
api DTO 类 Api 接口的入参 ReqDTO、出参 RespDTO LoginLogCreateReqDTO
DeptRespDTO
enums Enum 类 字段的枚举 LoginLogTypeEnum
enums DictTypeConstants 类 数据字典的枚举 DictTypeConstants
enums ErrorCodeConstants 类 错误码的枚举 ErrorCodeConstants

ykkj-module-xxx-biz 子模块的项目结构如下:

所在包 作用 示例
api ApiImpl 类 提供给其它模块的 API 实现类 AdminUserApiImpl
controler.admin Controller 类 提供给管理后台的 RESTful API,默认以 admin-api/ 作为前缀。
例如 admin-api/system/auth/login 登录接口
AuthController
controler.admin VO 类 Admin Controller 接口的入参 ReqVO、出参 RespVO AuthLoginReqVO
AuthLoginRespVO
controler.app Controller 类,以 App 为前缀 提供给用户 App 的 RESTful API,默认以 app-api/ 作为前缀。
例如 app-api/member/auth/login 登录接口
AppAuthController
controler.app VO 类,以 App 为前缀 App Controller 接口的入参 ReqVO、出参 RespVO AppAuthLoginReqVO
AppAuthLoginRespVO
controler .http 文件 IDEA Http Client 插件
,模拟请求 RESTful 接口
AuthController.http
service Service 接口 业务逻辑的接口定义 AdminUserService
service ServiceImpl 类 业务逻辑的实现类 AdminUserServiceImpl
dal - Data Access Layer,数据访问层
dal.dataobject DO 类 Data Object,映射数据库表、或者 Redis 对象 AdminUserDO
dal.mapper Mapper 接口 数据库的操作 AdminUserMapper
dal.redis RedisDAO 类 Redis 的操作 LoginUserRedisDAO
convert Convert 接口 DTO / VO / DO 等对象之间的转换器 UserConvert
job Job 类 定时任务 UserSessionTimeoutJob
mq - Message Queue,消息队列
mq.message Message 类 发送和消费的消息 DeptRefreshMessage
mq.producer Producer 类 消息的生产者 DeptProducer
mq.consumer Producer 类 消息的消费者 DeptRefreshConsumer
framework - 模块自身的框架封装 framework

疑问:为什么 Controller 分成 Admin 和 App 两种?
提供给 Admin 和 App 的 RESTful API 接口是不同的,拆分后更加清晰。
疑问:为什么 VO 分成 Admin 和 App 两种?
相同功能的 RESTful API 接口,对于 Admin 和 App 传入的参数、返回的结果都可能是不同的。例如说,Admin 查询某个用户的基本信息时,可以返回全部字段;而 App 查询时,不会返回 mobile 手机等敏感字段。
疑问:为什么 DO 不作为 Controller 的出入参?

  1. 明确每个 RESTful API 接口的出入参。例如说,创建部门时,只需要传入 name、parentId 字段,使用 DO 接参就会导致 type、createTime、creator 等字段可以被传入,导致前端同学一脸懵逼。
  2. 每个 RESTful API 有自己独立的 VO,可以更好的设置 Swagger 注解、Validator 校验规则,而让 DO 保持整洁,专注映射好数据库表。

疑问:为什么操作 Redis 需要通过 RedisDAO?
Service 直接使用 RedisTemplate 操作 Redis,导致大量 Redis 的操作细节和业务逻辑杂糅在一起,导致代码不够整洁。通过 RedisDAO 类,将每个 Redis Key 像一个数据表一样对待,清晰易维护。
总结来说,每个模块采用三层架构 + 非严格分层,如下图所示:
image.png

4. ykkj-server

该模块是后端 Server 的主项目,通过引入需要 ykkj-module-xxx 业务模块,从而实现提供 RESTful API 给 ykkj-ui-admin、ykkj-ui-user 等前端项目。
本质上来说,它就是个空壳(容器)!如下图所示:
image.png

👾 前端结构

前端一共有两个项目,分别是:

项目 说明
ykkj-admin-ui 管理后台的 UI 界面
ykkj-user-ui 用户 App 的 UI 界面

1. ykkj-admin-ui

  1. ├── bin // 执行脚本
  2. ├── build // 构建相关
  3. ├── public // 公共文件
  4. ├── favicon.ico // favicon 图标
  5. └── index.html // html 模板
  6. └── robots.txt // 反爬虫
  7. ├── src // 源代码
  8. ├── api // 所有请求【重要】
  9. ├── assets // 主题、字体等静态资源
  10. ├── components // 全局公用组件
  11. ├── directive // 全局指令
  12. ├── icons // 图标
  13. ├── layout // 布局
  14. ├── plugins // 插件
  15. ├── router // 路由
  16. ├── store // 全局 store 管理
  17. ├── utils // 全局公用方法
  18. ├── views // 视图【重要】
  19. ├── App.vue // 入口页面
  20. ├── main.js // 入口 JS,加载组件、初始化等
  21. ├── permission.js // 权限管理
  22. └── settings.js // 系统配置
  23. ├── .editorconfig // 编码格式
  24. ├── .env.dev // 开发环境配置
  25. ├── .env.prod // 生产环境配置
  26. ├── .env.staging // 测试环境配置
  27. ├── .eslintignore // 忽略语法检查
  28. ├── .eslintrc.js // eslint 配置项
  29. ├── .gitignore // git 忽略项
  30. ├── babel.config.js // babel.config.js
  31. ├── package.json // package.json
  32. └── vue.config.js // vue.config.js

2. ykkj-user-ui

建设中,基于 uniapp 实现…

image.png已改造

结构上

1、精简结构,去掉商城和acitiviti工作流模块
2、增加授权,授权方式与老cdp平台保持一致

功能上

1、去掉登录时的机构选择,配置验证码可不选择
2、部门增加组织机构类型:公司、部门、班组。
3、增加角色分配用户
4、字典属性明细修改成弹窗
5、密码复杂度设置,需要包含大小写字母、数字、特殊字符
6、密码传输加密,采用国密2 :
7、开发通用人员选择控件、单选和多选
8、用户管理时部门改成不能为空

下一步改造

工作流

1、增加工作流退回和委派功能
2、完善审批节点可以为多人。
3、流程表单审批节点的表单元素的权限控制。
4、业务表单审批节点的表单修改功能。
5、会签功能。
6、全部流程实例管理,可对所有流程进行终止、变更节点等操作。