权限数据库
# 创建权限数据库表
CREATE TABLE `permission` (
`id` int NOT NULL COMMENT '自增id',
`parent_id` int NOT NULL DEFAULT '0' COMMENT '父id',
`name` char(64) NOT NULL DEFAULT '' COMMENT '名称',
`web_router` char(200) NOT NULL DEFAULT '' COMMENT '前端路由',
`server_router` char(200) NOT NULL DEFAULT '' COMMENT '后端api接口',
`request_method` char(10) NOT NULL DEFAULT '' COMMENT '请求方式',
`type` tinyint NOT NULL COMMENT '类型: 1-目录 2-菜单 3-按钮',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '是否启用 1-启用 2-禁用',
`create_date` datetime DEFAULT NULL COMMENT '创建时间',
`update_date` datetime DEFAULT NULL COMMENT '更新时间',
`delete_date` datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
权限列表接口
- api/internal/handler/routes.go:
项目的路由文件,访问的路由都是在这个文件中编写的
# 可以直接添加访问接口
server.AddRoutes(
[]rest.Route{
{
Method: http.MethodGet,
Path: "/permission/list",
Handler: PermissionListHandler(serverCtx),
},
},
)
- api/internal/types/permissiontype.go:
权限相关的结构体的定义类,主要包括请求和响应的结构体
type (
// 获取列表暂时不需要参数,则先创建空结构体
PermissionListReq struct{}
PermissionListResp struct {
PermissionInfo models.Permission
IsHasChild bool `json:"is_has_child"`
Children []PermissionListResp
}
)
- api/internal/handler/permissionhandler.go:
权限控制器文件,接收页面请求并返回数据
package handler
// PermissionListHandler 权限列表控制器
func PermissionListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// 定义3个变量:请求的结构体、响应数据的结构体、错误信息
var (
req types.PermissionListReq
resp []types.PermissionListResp
err error
)
// 将接收到的数据解析成请求结构体
if err = httpx.Parse(r, &req); err != nil {
httpx.Error(w, err)
return
}
// 调用logic函数处理业务逻辑
resp, err = logic.NewPermissionLogic(r.Context(), svcCtx).List()
if err != nil {
httpx.Error(w, err)
} else {
httpx.OkJson(w, resp)
}
}
}
- api/internal/logic/permissionlogic.go:
业务逻辑文件,处理数据
package logic
import (
"app/auth/api/internal/svc"
"app/auth/api/internal/types"
"app/models"
"context"
"github.com/zeromicro/go-zero/core/logx"
)
// 权限对象实例
type PermissionLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
// 返回对象实例
func NewPermissionLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PermissionLogic {
return &PermissionLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
// List 获取权限列表
func (l *PermissionLogic) List() (resp []types.PermissionListResp, err error) {
// 这里处理业务逻辑
resp, _, err = l.getChildForMenu(0)
return
}
// getChildForMenu 获取目录下的子菜单
func (l *PermissionLogic) getChildForMenu(menuId int64) (resp []types.PermissionListResp, isHasChildren bool, err error) {
var (
db = l.svcCtx.Mysql.Model(&models.Permission{})
tempList []models.Permission
)
db.Where("parent_id = ?", menuId).Scan(&tempList)
if tempList != nil {
isHasChildren = true
// 如果存在,则表示有子集合
for _, v := range tempList {
// 获取子集
tempChildren, tempIsHasChildren, err := l.getChildForMenu(v.ID)
if err == nil {
resp = append(resp, types.PermissionListResp{
PermissionInfo: v,
IsHasChild: tempIsHasChildren,
Children: tempChildren,
})
}
}
} else {
// 不存在,则无子集合
isHasChildren = false
}
return
}
获取用户
这样,权限后端接口就开发完成了,后面继续菜单权限列表界面开发