Go项目实践二(gin+vue)
1. 目录结构
.
├── README.md
├── common # 通用
│ ├── datasource # 数据源
│ ├── logger # 日志
│ ├── middleware # gin中间件
│ ├── req # 请求
│ ├── resp # 响应
│ ├── returncode # 响应码
│ ├── setting # 设置
│ ├── utils # 工具
│ └── validator # 校验
├── config # 配置
│ └── config.yml
├── doc # 文档
│ └── june.sql
├── go.mod
├── go.sum
├── log # 日志输出目录
├── main.go # 启动入口文件
├── models # 数据模型
│ └── vo
├── repository # 持久层
│ ├── baseRepo.go
├── routers # 路由
│ └── router.go
├── service # 服务层
└── web # 接口层
如果是做过Java后端开发的应该会对这个目录结构眼熟,没错!就是参考了
Spring MVC
的目录结构,包括使用了facebookgo/inject
依赖注入库的使用,就会发现和Spring
的编程方式很相似(Java中毒太深😂)
其中,
common
包里包含整个项目的通用模块代码,比如工具、数据库、日志、状态码等models
包是数据模型repository
包是数据持久层,编写数据库操作相关的逻辑service
包主要是编写业务逻辑web
包则是接口层,包含对入参数的校验等处理main.go
是整个程序的入口
按照以上进行分包,整体代码就会比较整齐
2. restful API和状态码的设计
关于restful API和状态码的设计可以参考这篇文章《restful API和状态码的设计》
除了由于
gin
的路由匹配规则不支持,对部分API进行了调整,其他基本保持一致。而状态码则去除了微服务代码这一段(因为这是个单体服务😅),基本上也保持一致
3. 权限的设计
3.1 权限数据模型
模型很简单,一眼应该能看明白。然后有两个需要注意的地方是:
- 前端页面上控制菜单和按钮的权限标识使用的是
t_sys_menu
的perm
字段,而后端做API权限校验的时候则通过t_sys_api
的method
和uri
字段组合来进行,这也是为什么表t_sys_menu
和表t_sys_api
需要进行关联。 t_sys_client
表用于保存第三方应用,通过t_sys_client_api
关联到我们的API,其中加上ip
字段,可以对来源IP,做进一步的限制。(暂未实现client的校验🙈)
3.2 登录认证
登录认证功能是基于appleboy/gin-jwt/v2
库实现的,比较简单,我们只需要根据自己的逻辑实现GinJWTMiddleware
的相关方法就好了。
- 首先确定我们需要保存到token里的信息,例如我这里保存了用户ID、登录名、角色和权限标识列表
type UserPermVo struct {
UserId int32 `json:"userId"`
LoginName string `json:"loginName"`
Roles []int32 `json:"roles"`
Perms [