0
点赞
收藏
分享

微信扫一扫

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理


架构图:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据


如上图,它分别就表示了gva当前的所有的功能,你可以看到‍‍所有的事情都是以 core 为核心开始的,

core 里面是干什么的,它是咱们项目启动的地方,项目的第一个‍‍必经之地,所有的事情都是从这地方从这开始,core 里面会带上什么东西?

core 这边走的时候,你会发现我们的​​server/core/server.go​​里面会走一系列的init事件,init在哪?

在initialize文件夹里面​​plugin.go​​,‍‍这个文件夹里面就包含了咱们所需要注册的gorm,redis,路由注册,插件路由注册,

咱们的路由所有的注册点也都在这个位置,
然后 gorm 的一些数据,它的初始化功能也都在这个位置,所以‍‍ core 上面会附带一个init,只要 core 运行,init就会执行,然后整个项目就 run 起来了,

run 起来之后,‍‍你的数据的流向,我们从数据流向开始分析,数据如果一个请求过来,它会怎么走?‍‍

首先请求会通过路由‍‍, router路由 这个地方走进 api 网络交互层,api 网络交互层会到达service层里面去进行处理,‍‍这是大体的最简单的数据流向。‍‍

它会通过 router 找到我们所需要注册的路由方法​​server/router/system/sys_api.go​​​,比如说我们注册 ​​createApi​​:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_后端结构设计和基本工作原理_02

它会从​​server/router/system/sys_api.go​​​的​​createApi​​​方法进入到‍‍ ​​server/api/v1/system/sys_api.go​​​的​​createApi​​方法里面去,

这里面之后它再会找到 api 所对应的CreateApi这样的方法:
代码示例:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_后端结构设计和基本工作原理_03

这个方法里面​​server/service/system/sys_api.go​​就会走到咱们的所有的业务逻辑,比如说创建数据,Create数据:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_功能块_04

然后走完之后‍‍处理完之后,error是否存在,如果 error 不存在,该返回什么?
如果 error 存在,该返回什么?

这时候又会走到什么?走到 api 网络交互层,然后再通过router路由返回给前端,
这是大体的数据流向。

当你明白了数据流向之后,‍‍我这边就需要开始给你介绍当前的这样一个架构设计模式,为什么要这么做?‍‍

首先你们可以看到开头一张图,我们会先发划分几个大型的功能模块,首先是什么模块?‍‍
数据结构模块,
路由模块,
api 网络交互模块,
service 数据处理(业务处理)模块,‍‍这是几个大模块,分别干什么?‍‍

首先model模块里面包含了我们后续所需要的一切的数据的 struct 结构体,‍‍

我们所有的结构体要取就来这取,即​​server/model/common/response/common.go​

要声明就来这声明,即​​server/model/common/request/common.go​​ 为什么?不会乱。

不会产生包之间的相互引用,‍‍不会说我们项目越做越大,然后咔咔出现俩相互有用,我靠完了,这种事情出现,‍‍

然后模块里面会分为很多小的功能块,比如说​​server/model/common​​​这是咱们的基础功能,​​server/model/example​​​这是示例功能,‍‍​​server/model/system​​这是我们的系统核心功能,

小的功能块里面​​server/model/system​​​又会分为
普通的功能模块‍‍
比如​​​server/model/system/sys_api.go​​​ 再比如​​server/model/system/sys_user.go​

响应模块
​​​server/model/system/response​​​ 请求模块,
​server/model/system/request​

这样就便于我们对于不同的模块里面的‍‍不同的数据的不同用途做一下区分。‍‍

model数据结构层咱们就讲清楚了。‍‍

接下来实际上还有什么?还有‍‍功能块 ​​enter​​,

api 网络交互和 router 路由,这三个模块实际上一模一样,‍‍数据处理(业务处理)service它是有一个大的模块,然后里面会增加一个 enter 功能块,enter 功能块是什么?

是入口块,‍‍入口块负责把小的模块进行集合,一定要记住大的模块‍‍enter 要做的事情就是把小的模块集合,
图片示例:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据处理_05

比如说service是最大的模块,我们需要集合两个小的功能块,示例功能块​​server/service/example​​​和‍‍ system 系统核心逻辑功能块​​server/service/system​​,把它们两个给集中起来:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_gin-vue-admin_06

然后它们两个 中间 分别又会有自己的一个小的​​enter.go​​,它会集中更小的功能块进来:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据_07

比如说咱们拿示例模块举例:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据_08

示例模块里面会有‍‍客户管理功能块:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据_09

断点续传功能块:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_gin-vue-admin_10

Excel上传导入功能块:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据处理_11

还有文件上传下载功能块:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据处理_12

4个功能块分别通过‍‍自己的 ​​type ExcelService strtuc{}​​​注册,
因为这些方法都会注册在它们自己本身的结构体上面,

我们会通过这样一个​​enter.go​​把它们再次进行一个集中:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_功能块_13

因此它们形成了一个什么结构?

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_功能块_14

看到图上面就会发现,功能块分为三个小的业务块,‍‍这几个小的业务块里面分为小的逻辑块,小的功能块分成小的业务块,这是它们的业务块,‍‍

业务块里面分为小的逻辑块,比如位置​​server/service/example/exa_excel_parse.go​​,‍‍那么我们就把这些东西完全形成了一个树形结构,所有的树形结构会集中在一个大的功能块里面,为什么要做集中?‍‍

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据处理_15

这个也是一个设计点,因为我们要统一 ​​new​​ 一下,当然你想去单独的摘这么一个小逻辑出来:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_功能块_14

你也可以直接去‍‍去​​new​​小的业务也没有问题,

我们做成一个大的enter,就是我们只需要​​new​​​一次,我们不需要对里边每一个模块都​​new​​一回。

​new​​完之后的功能块我们就可以对外暴露使用了,比如说 service 功能块我们给了谁?‍‍:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据_17

数据流向它是从外部进来,经过router 路由层到 api 网络交互层 到 数据处理(业务处理)service 的 enter层。

但是‍‍咱们的业务逻辑是反向过去的,

小的功能块进到api 网络交互层,
api 网络交互层进到router 路由层,

我们下面再捋一遍。‍‍小的service模块:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_gin-vue-admin_18

我们会‍‍把大的 ​​server/service/enter.go​​​里的​​ServiceGroupApp​​ 注册进谁?

注册进 api里面 :

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_功能块_19

位置:
​​​server/api/v1/system/enter.go​

截图:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_gin-vue-admin_20


说明:

它所依赖的功能看到没有?【第22行​​var()​​​】
是service Group里边的那个 api 里边的某一个小功能注册进这儿,‍‍

api 的功能块注册给了谁, api 的功能块注册给了router:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据处理_21

到这里边我们是把 api 给引用进来的:

位置:​​server/router/system/enter.go​

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据_22

你所调用的这些东西,比如说我们点一个点进去:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_功能块_23

再点进去:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据_24

你发现没有?‍‍
位置:​​​server/router/system/sys_system.go​

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据_25

这里面实际上用的是谁?是 api 里边的这些功能,‍‍

像这些 api 的功能 我们注册完之后,是不是我们又做了一个很大的路由块:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_gin-vue-admin_26

SysRouter 路由块,‍‍SysRouter 路由块又干了什么事?
位置:​​​server/router/system/enter.go​

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_功能块_27

router路由块又集中了一个路由的​​enter.go​​​,我们把所有的路由都集中了一个叫做‍‍​​RouterGroup​​的东西,

它们再次通过路由块注册了一个大的enter:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_后端结构设计和基本工作原理_28

然后咱们把大的路由的​​enter.go​​​走到哪儿?
走到了咱们的真正的init里面去:
位置:​​​server/initialize/router.go​

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据处理_29

那么这两个路由块的注册也就完成了:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_功能块_30

我们需要做的事情只需要把这两个路由里面所有的init挂一下就可以了:

猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理_数据_31

你想给这个块传一个开放结构,传一个私有化的路由 或者 开放的路由你传就行了,‍‍这就是当前的后端的设计 以及 大体的 逻辑分析。


举报

相关推荐

0 条评论