Base-Stone基石系统项目结构

#👻 后端结构

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

一共有类 Maven Module:

Maven Module作用
yudao-dependenciesMaven 依赖版本管理
yudao-frameworkJava 框架拓展
yudao-module-xxxXXX 功能的 Module 模块
yudao-server管理后台 + 用户 App 的服务端

下面,我们来逐个看看。

#1. yudao-dependencies

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

从定位上来说,它和 Spring Boot 的 spring-boot-starter-parent (opens new window)和 Spring Cloud 的 spring-cloud-dependencies (opens new window)是一致的。

实际上,ruoyi-vue-pro 本质上还是个单体项目,直接在根目录 pom.xml (opens new window)管理依赖版本会更加方便,也符合绝大多数程序员的认知。但是要额外考虑一个场景,如果每个 yudao-module-xxx 模块都维护在一个独立的 Git 仓库,那么 yudao-dependencies 就可以在多个 yudao-module-xxx 模块下复用。

#2. yudao-framework

该模块是 ruoyi-vue-pro 项目的框架封装,其下的每个 Maven Module 都是一个组件,分成两种类型:

① 技术组件:技术相关的组件封装,例如说 MyBatis、Redis 等等。

Maven Module作用
yudao-common定义基础 pojo 类、枚举、工具类等
yudao-spring-boot-starter-webWeb 封装,提供全局异常、访问日志等
yudao-spring-boot-starter-security认证授权,基于 Spring Security 实现
yudao-spring-boot-starter-mybatis数据库操作,基于 MyBatis Plus 实现
yudao-spring-boot-starter-redis缓存操作,基于 Spring Data Redis + Redisson 实现
yudao-spring-boot-starter-mq消息队列,基于 Redis 实现,支持集群消费和广播消费
yudao-spring-boot-starter-job定时任务,基于 Quartz 实现,支持集群模式
yudao-spring-boot-starter-flowable工作流,基于 Flowable 实现
yudao-spring-boot-starter-protection服务保障,提供幂等、分布式锁、限流、熔断等功能
yudao-spring-boot-starter-file文件客户端,支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、SFTP、数据库等
yudao-spring-boot-starter-excelExcel 导入导出,基于 EasyExcel 实现
yudao-spring-boot-starter-monitor服务监控,提供链路追踪、日志服务、指标收集等功能
yudao-spring-boot-starter-captcha验证码 Captcha,提供滑块验证码
yudao-spring-boot-starter-test单元测试,基于 Junit + Mockito 实现
yudao-spring-boot-starter-banner控制台 Banner,启动打印各种提示

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

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

每个组件,包含两部分:

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

#3. yudao-module-xxx

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

项目说明是否必须
yudao-module-system系统功能
yudao-module-infra基础设施
yudao-module-member会员中心x
yudao-module-bpm工作流程x
yudao-module-pay支付系统x
yudao-module-visualization数据报表x

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

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

例如说,yudao-module-infra 想要访问 yudao-module-system 的用户、部门等数据,需要引入 yudao-module-system-api 子模块。示例如下:

疑问:为什么设计 `yudao-module-xxx-api` 模块呢?

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

yudao-module-xxx-api 子模块的项目结构如下:

所在包作用示例
apiApi 接口提供给其它模块的 API 接口AdminUserApi(opens new window)
apiDTO 类Api 接口的入参 ReqDTO、出参 RespDTOLoginLogCreateReqDTO (opens new window)DeptRespDTO(opens new window)
enumsEnum 类字段的枚举LoginLogTypeEnum(opens new window)
enumsDictTypeConstants 类数据字典的枚举DictTypeConstants(opens new window)
enumsErrorCodeConstants 类错误码的枚举ErrorCodeConstants(opens new window)

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

所在包作用示例
apiApiImpl 类提供给其它模块的 API 实现类AdminUserApiImpl(opens new window)
controler.adminController 类提供给管理后台的 RESTful API,默认以 admin-api/ 作为前缀。
例如 admin-api/system/auth/login 登录接口
AuthController(opens new window)
controler.adminVO 类Admin Controller 接口的入参 ReqVO、出参 RespVOAuthLoginReqVO (opens new window)AuthLoginRespVO(opens new window)
controler.appController 类,以 App 为前缀提供给用户 App 的 RESTful API,默认以 app-api/ 作为前缀。
例如 app-api/member/auth/login 登录接口
AppAuthController(opens new window)
controler.appVO 类,以 App 为前缀App Controller 接口的入参 ReqVO、出参 RespVOAppAuthLoginReqVO (opens new window)AppAuthLoginRespVO(opens new window)
controler.http 文件IDEA Http Client 插件 (opens new window),模拟请求 RESTful 接口AuthController.http(opens new window)
serviceService 接口业务逻辑的接口定义AdminUserService(opens new window)
serviceServiceImpl 类业务逻辑的实现类AdminUserServiceImpl(opens new window)
dal-Data Access Layer,数据访问层
dal.dataobjectDO 类Data Object,映射数据库表、或者 Redis 对象AdminUserDO(opens new window)
dal.mapperMapper 接口数据库的操作AdminUserMapper(opens new window)
dal.redisRedisDAO 类Redis 的操作LoginUserRedisDAO(opens new window)
convertConvert 接口DTO / VO / DO 等对象之间的转换器UserConvert(opens new window)
jobJob 类定时任务UserSessionTimeoutJob(opens new window)
mq-Message Queue,消息队列
mq.messageMessage 类发送和消费的消息DeptRefreshMessage(opens new window)
mq.producerProducer 类消息的生产者DeptProducer(opens new window)
mq.consumerProducer 类消息的消费者DeptRefreshConsumer(opens new window)
framework-模块自身的框架封装framework(opens new window)

疑问:为什么 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 像一个数据表一样对待,清晰易维护。

总结来说,每个模块采用三层架构 + 非严格分层,如下图所示:

#4. yudao-server

该模块是后端 Server 的主项目,通过引入需要 yudao-module-xxx 业务模块,从而实现提供 RESTful API 给 yudao-ui-adminyudao-ui-user 等前端项目。

本质上来说,它就是个空壳(容器)!如下图所示:

#👾 前端结构

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

项目说明
yudao-ui-admin管理后台的 Vue2 前端项目
yudao-ui-admin-vue3管理后台的 Vue3 前端项目
yudao-ui-admin-uniapp管理后台的 uni-app 多端项目
yudao-ui-app用户 APP 的 UI 界面

#1. yudao-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.development           // 开发环境配置
├── .env.production            // 生产环境配置
├── .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. yudao-admin-ui-vue3

TODO 待补充

#3. yudao-admin-ui-uniapp

TODO 待补充

#4. yudao-ui-app

建设中,基于 uniapp 实现..

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值