Skip to content

一步步实现微服务权限管理系统(4)

前言

  • 前端参考了很多框架,可谓百花齐放,但很多封装过剩,不利于学习和应用,最终我选择了 [vue-pure-admin](https://github.com/pure-admin/vue-pure-admin)
  • 后端我将使用 go-zero 来带领大家一步步实现一个权限管理系统
  • 本系列项目存放在 purezeroadmin 中,每一部分我都将打tag,并保证每个tag能正常运行。请多点赞和评论。
  • 后面示例均为 purezeroadmin 项目为例,你们可以根据需要自建工程来进行试验。均采用vscode进行试验。
  • go-zero 常用命令我将放入其对应的 makefile 文件中。

统一返回

  • 参考 https://go-zero.dev/docs/tutorials/customization/template
  • api返回一般采用以下返回
{
    "code": 0,
    "msg": "ok",
    "data": {}
}

修改后端登陆模块支持验证和返回错误

修改登陆逻辑

user-api/internal/logic/userloginlogic.go修改

func (l *UserLoginLogic) UserLogin(req *types.UserLoginReq) (resp *types.UserLoginResp, err error) {
    if req.UserName == "admin" && req.Password == "admin123" {
        return &types.UserLoginResp{
            Base: types.Base{
                Success: true,
            },
            Data: types.UserLoginData{
                Avatar:       "https://avatars.githubusercontent.com/u/44761321",
                Username:     "admin",
                Nickname:     "小铭",
                Roles:        []string{"admin"},
                Permissions:  []string{"*:*:*"},
                AccessToken:  "eyJhbGciOiJIUzUxMiJ9.admin",
                RefreshToken: "eyJhbGciOiJIUzUxMiJ9.adminRefresh",
                Expires:      "2030/10/30 00:00:00",
            },
        }, nil
    }

    if req.UserName == "common" && req.Password == "123456" {
        return &types.UserLoginResp{
            Base: types.Base{
                Success: true,
            },
            Data: types.UserLoginData{
                Avatar:       "https://avatars.githubusercontent.com/u/52823142",
                Username:     "common",
                Nickname:     "小林",
                Roles:        []string{"common"},
                Permissions:  []string{"permission:btn:add", "permission:btn:edit"},
                AccessToken:  "eyJhbGciOiJIUzUxMiJ9.common",
                RefreshToken: "eyJhbGciOiJIUzUxMiJ9.commonRefresh",
                Expires:      "2030/10/30 00:00:00",
            },
        }, nil
    }

    return nil, errors.New("登陆失败")
}

观测

curl 测试,返回不一致

 curl --request POST \
  --url http://localhost:8888/api/login \
  --header 'Content-Type: application/json' \
  --data '{
    "username": "admin",
    "password": "admin123"
}'
{"success":true,"data":{"avatar":"https://avatars.githubusercontent.com/u/44761321","username":"admin","nickname":"小铭","roles":["admin"],"permissions":["*:*:*"],"accessToken":"eyJhbGciOiJIUzUxMiJ9.admin","refreshToken":"eyJhbGciOiJIUzUxMiJ9.adminRefresh","expires":"2030/10/30 00:00:00"}}# 
curl --request POST \
  --url http://localhost:8888/api/login \
  --header 'Content-Type: application/json' \
  --data '{
    "username": "admin",
    "password": "admin1234"
}'
登陆失败

修改user-api/internal/handler/userloginhandler.go核心函数,支持统一返回

  • 修改
// 用户登录
func userLoginHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        var req types.UserLoginReq
        if err := httpx.Parse(r, &req); err != nil {
            xhttp.JsonBaseResponseCtx(r.Context(), w, err)
            return
        }

        l := logic.NewUserLoginLogic(r.Context(), svcCtx)
        resp, err := l.UserLogin(&req)
        if err != nil {
            xhttp.JsonBaseResponseCtx(r.Context(), w, err)
        } else {
            xhttp.JsonBaseResponseCtx(r.Context(), w, resp)
        }
    }
}

完成后 go mod tidy 一下

  • 测试
 curl --request POST \
  --url http://localhost:8888/api/login\?debug \
  --header 'Content-Type: application/json' \
  --data '{
    "username": "admin",
    "password": "admin1234"
}'
{"code":-1,"msg":"登陆失败"}

tag版本

purezeroadmin 项目下

git checkout v1.3.0

接下来

  • 模型修改不采用前端 {success: true, data: xx } 模式
  • 统一前后端修改为 {code: 0, msg: "ok", data: xx} 模式

Comments