3.2、然后熟悉Java项目结构

11/20/2022

建议您打开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
1
2
3
4

# 1.2、优秀的扩展性

如果将来 smart-admin要做一个app端的话,我们只需要加一个 sa-app的项目就可以了,其中sa-app只完成app端的项目业务逻辑接口,如下:

/smart-admin-api
|-- sa-admin/
|-- sa-common/
|-- sa-app/
1
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>
1
2
3
4

# 2.2、定义多模块 moudle

  <modules>
      <module>sa-common</module>
      <module>sa-admin</module>
  </modules>
1
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>
1
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>
1
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的初衷

如果你接触过多模块,肯定听过类似于basecommon的字样,那么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
1
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   运行时环境配置
1
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                            角色管理
1
2
3
4
5
6
7
8
9
10
11
12
13

# 4.5、重点yaml配置

在上面中我们讲解了 sa-commonsa-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
1
2
3
4
5
6
7
8

以上会覆盖掉 sa-common.yaml中对应的配置。

# 联系我们

加 主任 “卓大” 微信
拉你入群,一起学习
关注 “六边形工程师”
分享:赚钱、代码、生活
请 “1024创新实验室” 喝咖啡
支持我们的开源与分享

# 作者

1024创新实验室-主任:卓大 (opens new window),混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室(河南·洛阳) (opens new window) 致力于成为中原领先、国内一流的技术团队,以技术创新为驱动,合作各类项目(软件外包、技术顾问、培训等等)。

告白气球 (钢琴版)
JESSE T