- 📝 平台简介
- 技术选型">
技术选型 - 项目结构">
项目结构- 👻 后端结构
- 👾 前端结构">👾 前端结构
- 已改造">
已改造 - 下一步改造
📝 平台简介
一、功能说明
基于 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 请假 | 作为业务自定义接入工作流的使用示例,只需创建请求对应的工作流程,即可进行审批 |
技术选型
👻 后端
系统环境
| 框架 | 说明 | 版本 | 学习指南 |
|---|---|---|---|
| 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 的统一框架 | - | - |
项目结构
👻 后端结构
后端采用模块化的架构,按照功能拆分成多个 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 | 微信客户端,对接微信的公众号、开放平台等 |
每个组件,包含两部分:
- core 包:组件的核心封装,拓展相关的功能。
- config 包:组件的 Spring Boot 自动配置。
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 子模块。示例如下:
疑问:为什么设计 ykkj-module-xxx-api 模块呢?
- 明确需要提供给其它模块的 API 定义,方便未来迁移微服务架构。
- 模块之间可能会存在相互引用的情况,虽然说从系统设计上要尽量避免,但是有时在快速迭代的情况下,可能会出现。此时,通过只引用对方模块的 API 子模块,解决相互引用导致 Maven 无法打包的问题。
ykkj-module-xxx-api 子模块的项目结构如下:
| 所在包 | 类 | 作用 | 示例 |
|---|---|---|---|
| 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 的出入参?
- 明确每个 RESTful API 接口的出入参。例如说,创建部门时,只需要传入 name、parentId 字段,使用 DO 接参就会导致 type、createTime、creator 等字段可以被传入,导致前端同学一脸懵逼。
- 每个 RESTful API 有自己独立的 VO,可以更好的设置 Swagger 注解、Validator 校验规则,而让 DO 保持整洁,专注映射好数据库表。
疑问:为什么操作 Redis 需要通过 RedisDAO?
Service 直接使用 RedisTemplate 操作 Redis,导致大量 Redis 的操作细节和业务逻辑杂糅在一起,导致代码不够整洁。通过 RedisDAO 类,将每个 Redis Key 像一个数据表一样对待,清晰易维护。
总结来说,每个模块采用三层架构 + 非严格分层,如下图所示:
4. ykkj-server
该模块是后端 Server 的主项目,通过引入需要 ykkj-module-xxx 业务模块,从而实现提供 RESTful API 给 ykkj-ui-admin、ykkj-ui-user 等前端项目。
本质上来说,它就是个空壳(容器)!如下图所示:
👾 前端结构
前端一共有两个项目,分别是:
| 项目 | 说明 |
|---|---|
| ykkj-admin-ui | 管理后台的 UI 界面 |
| ykkj-user-ui | 用户 App 的 UI 界面 |
1. ykkj-admin-ui
├── bin // 执行脚本├── build // 构建相关├── public // 公共文件│ ├── favicon.ico // favicon 图标│ └── index.html // html 模板│ └── robots.txt // 反爬虫├── src // 源代码│ ├── api // 所有请求【重要】│ ├── assets // 主题、字体等静态资源│ ├── components // 全局公用组件│ ├── directive // 全局指令│ ├── icons // 图标│ ├── layout // 布局│ ├── plugins // 插件│ ├── router // 路由│ ├── store // 全局 store 管理│ ├── utils // 全局公用方法│ ├── views // 视图【重要】│ ├── App.vue // 入口页面│ ├── main.js // 入口 JS,加载组件、初始化等│ ├── permission.js // 权限管理│ └── settings.js // 系统配置├── .editorconfig // 编码格式├── .env.dev // 开发环境配置├── .env.prod // 生产环境配置├── .env.staging // 测试环境配置├── .eslintignore // 忽略语法检查├── .eslintrc.js // eslint 配置项├── .gitignore // git 忽略项├── babel.config.js // babel.config.js├── package.json // package.json└── vue.config.js // vue.config.js
2. ykkj-user-ui
建设中,基于 uniapp 实现…
已改造
结构上
1、精简结构,去掉商城和acitiviti工作流模块
2、增加授权,授权方式与老cdp平台保持一致
功能上
1、去掉登录时的机构选择,配置验证码可不选择
2、部门增加组织机构类型:公司、部门、班组。
3、增加角色分配用户
4、字典属性明细修改成弹窗
5、密码复杂度设置,需要包含大小写字母、数字、特殊字符
6、密码传输加密,采用国密2 :
7、开发通用人员选择控件、单选和多选
8、用户管理时部门改成不能为空
下一步改造
工作流
1、增加工作流退回和委派功能
2、完善审批节点可以为多人。
3、流程表单审批节点的表单元素的权限控制。
4、业务表单审批节点的表单修改功能。
5、会签功能。
6、全部流程实例管理,可对所有流程进行终止、变更节点等操作。
