建议您打开idea 导入本项目后,对照着代码结构来阅读此文章,才能感受到其中的结构之美!
# 一、整体结构
# 1.1、结构解读
SmartAdmin的Admin端使用的是Java单体应用( 为什么使用单体应用,请看文章 架构那么些事儿 ),整个项目同时也可以将来扩展成为微服务架构。
项目整体结构如下:
/smart-admin-api/
|-- sa-admin/ 【springboot项目】是admin端的业务逻辑,最终以springboot 启动
|-- sa-common/ 【jar项目】是通用的类和业务逻辑,最终以jar形式,被sa-admin或者其他项目使用
|-- pom.xml 【pom.xml文件】父级pom.xml文件,定义共用依赖、模块、多环境profile
2
3
4
# 1.2、优秀的扩展性
如果将来 smart-admin要做一个app端的话,我们只需要加一个 sa-app
的项目就可以了,其中sa-app
只完成app
端的项目业务逻辑接口,如下:
/smart-admin-api
|-- sa-admin/
|-- sa-common/
|-- sa-app/
2
3
4
最终会运行两个java进程:
- sa-admin 进程,满足 后管的业务api
- sa-app 进程,满足 移动端的业务api
如果再加一个 数据大屏的话,可以再加一个项目sa-data
项目,用于提供数据大屏的接口。
# 二、maven多模块
目录smart-admin-api
使用的是 maven多模块 项目,即最顶层有一个 parent
的/smart-admin-api/pom.xml
文件,在 /smart-admin-api/pom.xml
文件中将整个项目公用的依赖提取到此pom文件中,并将版本号统一提取出来,方便维护;具体如下:
# 2.1、定义parent
<groupId>net.1024lab</groupId>
<artifactId>sa-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
2
3
4
# 2.2、定义多模块 moudle
<modules>
<module>sa-common</module>
<module>sa-admin</module>
</modules>
2
3
4
# 2.3、提取依赖版本
<properties>
<java.version>1.8</java.version>
<springboot.version>2.7.5</springboot.version>
<spring-mock.version>2.0.8</spring-mock.version>
....
....
</properties>
2
3
4
5
6
7
# 2.4、定义多环境profile
<profiles>
<!--开发环境,即 默认环境-->
<profile>
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--测试环境-->
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
<!--预发布环境-->
<profile>
<id>pre</id>
<properties>
<profiles.active>pre</profiles.active>
</properties>
</profile>
<!--生产环境-->
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
</profile>
</profiles>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 三、sa-common项目讲解
# 3.1、 common的初衷
如果你接触过多模块,肯定听过类似于base
、common
的字样,那么sa-common
项目也是同理,来存放一些通用的类;本项目中 sa-common
主要有如下四个作用:
- 1) 通用的无状态的类,如:javabean对象、常量、异常、枚举、错误码、工具类、序列化类等等
- 2) 通用的配置,如:mybatis、心跳、数据库、http、环境变量、reload、重复提交 等等配置
- 3) 通用支撑类的业务逻辑,如:缓存、文件上传、验证码、数据字典、操作记录、token、序列号、加密 等等
- 4) 全局的常量维护,如:redis key前缀、错误码范围、url前缀 等等
# 3.2、yaml文件
很多人觉得对于common类的项目都是jar,没有配置文件,但是在 smart-admin中,里面还有个配置文件是为什么?
根本原因 因为 sa-common
中提供了以上 四类的功能都需要配置,而且这些配置 在 其他项目中还可能一样;比如:
- 数据库地址,各个项目连接的都是一个数据库
- oss配置, 各个项目也是一个通知
- redis 配置,也是一样的等等
- 等等还有其他
所以:
在common项目中,我们加入了 sa-common.yaml
配置文件,并使用PostProcessorConfig
类将sa-common.yaml
的配置注入到了,其他引用sa-common
的项目中。
感兴趣的小伙伴可以研究下PostProcessorConfig
这个类。
# 3.3、common 通用类
通用类在sa-common
项目中的 net.lab1024.sa.common.common
包,具体作用如下:
/common
|--- annoation 通用注解,如@NoNeedLogin、@SaAuth授权
|--- code 返回错误码,ErrorCode`
|--- constatnt 通用的常量
|--- controller 父类BaseController
|--- domain 通用javabean,如返回对象RequestDTO,分页PageResult等
|--- enumeration 全局枚举接口,BaseEnum,配合前端的 vue-enum
|--- exception 通用自定义异常,如业务异常等
|--- json 通用的 json 序列化、反序列化,如文件、字典等
|--- swagger 通用的swagger类,配合后端的BaseEnum和前端的vue-enum
|--- util 通用工具类(本项目虽使用hutool,但是还有一些独有的工具类)
|--- validator 表单校验,配合 BaseEnum的枚举校验 @CheckEnum
2
3
4
5
6
7
8
9
10
11
12
# 3.4、common 配置类
配置类在sa-common
项目中的 net.lab1024.sa.common.config
包,具体作用如下:
/config
|--- AsyncConfig 异步注解@Async的线程池配置
|--- CorsFilterConfig 跨域请求配置
|--- DataSourceConfig 数据库连接池druid配置
|--- FileCloudConfig 文件OSS配置
|--- HeartBeatConfig 心跳配置
|--- MvcConfig MVC配置
|--- PostProcessorConfig 独有的yaml配置
|--- RedisConfig redis配置
|--- RepeatSubmitConfig 重复提交配置
|--- ScheduleConfig 定时任务配置
|--- SystemEnvironmentConfig 运行时环境配置
2
3
4
5
6
7
8
9
10
11
12
# 3.5、common 支撑类
支撑类在sa-common
项目中的 net.lab1024.sa.common.module.support
包,这个包不容易理解,再简单阐述下;
我们知道任何系统都离不开一些基础功能,比如
- 基础功能:系统配置、字典、文件上传和下载、缓存cache 等
- 日志功能:心跳日志、登录日志、操作日志、数据变动日志等
- 校验功能:接口加密解密、防止重复提交、图形验证码等
- 通用功能:表格自定义列、订单号生成、token生成等
等等以上功能其实是 任何行业、任何系统 都所需要的一些基础功能,所以我们起了个名字,叫做:support
,起到支撑的作用,同时也放到了 common
包中,以便各个项目使用。
此包不在这里具体阐述,详情请看后端亮点解读
TODO
# 四、sa-admin 项目讲解
# 4.1、理解admin
sa-admin
项目是具体的 后台管理的业务代码项目,目录结构 符合 Java代码规范 V2 。
sa-admin
项目中包含了 一个后管所常见的功能,比如:员工、部门、角色、权限、菜单
等等,同时也加入了一些其他功能,比如OA的 企业信息、通知公告
等等
# 4.2、config包
sa-admin
项目中,config包下只有三个类,为什么这么少呢,是因为我们引入了 sa-common
,在sa-common
项目中的config
包有很多默认的配置,都引入了进来。
# 4.3、constant包
此包是sa-admin
项目独有的常量类,比如 AdminRedisKeyConst
是admin项目独有的redis的key;
# 4.4、重点module包
在module
中,具体拆成了两个包,一个是 busiess,业务包;另外一个是system 系统包; 具体理解:
我们将任何后管的系统工程拆成了两类:
- 第一类是
员工、部门、角色、权限、菜单
等等,这类是系统必须有的,我们定义为system
- 第二类是具体的业务,比如你是进销存系统,采购、入库、销售等,这种属于业务,我们定义为
business
根据这两类划分,所以我们有了以上的两个子包,一个system
,一个business
;
如果你在做一个进销存ERP系统,在搭建完smart-admin
后,可以直接在business
包中进行业务编码;结构如下:
module/
|---business 业务模块
|---|----goods 商品管理
|---|----|------GoodsController 商品controller
|---|----|------GoodsService 商品service
|---|----|------GoodsDao
|---|----order 订单管理
|---|----|------OrderController 订单controller
|---|----|------OrderService
|---system 系统模块
|---|----department 部门管理
|---|----employee 员工管理
|---|----role 角色管理
2
3
4
5
6
7
8
9
10
11
12
13
# 4.5、重点yaml配置
在上面中我们讲解了 sa-common
的sa-common.yaml
配置文件,会自动注入到其他项目中,所以如果sa-common.yaml
中的配置满足了sa-admin
项目的需求,我们就不用任何配置。
那么对于sa-admin
中独有的配置,比如端口号,那么我们只需要配置下端口好就可以了,比如在 application.yaml
配置文件中,我们配置了sa-admin
的进程端口为 1024
server:
servlet:
context-path: '/'
port: 1024
# swagger文档
swagger:
host: localhost:${server.port}
tag-class: net.lab1024.sa.admin.constant.AdminSwaggerTagConst
2
3
4
5
6
7
8
以上会覆盖掉 sa-common.yaml
中对应的配置。
# 联系我们
![]() | ![]() | ![]() |
加 主任 “卓大” 微信 拉你入群,一起学习 | 关注 “小镇程序员” 分享代码与生活、技术与赚钱 | 请 “1024创新实验室” 喝咖啡 支持我们的开源与分享 |
# 作者
1024创新实验室-主任:卓大 (opens new window),混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室(河南·洛阳) (opens new window) 致力于成为中原领先、国内一流的技术团队,以技术创新为驱动,合作各类项目(软件外包、技术顾问、培训等等)。