(二) beego开发web应用 – 一个简单的登录功能

源码:https://github.com/Nicolana/hello-bee/tree/main

增加 User Model字段

models/user.go

type User struct {
   Id int `json:"id" orm:"column(id);pk;unique;auto_increment;int(11)"`
   Username string `json:"username" orm:"column(username);unique;size(32)"`
   Password string `json:"password" orm:"column(password);size(128)"`
   Avatar string `json:"avatar" orm:"column(avatar);varbinary"`
   Salt string `json:"salt" orm:"column(salt);size(128)"`
   Token string `json:"token" orm:"column(token);size(256)"`
   LastLogin int64 `json:"last_login" orm:"column(last_login);size(11)"`
   Status int `json:"status" orm:"column(status);size(1)"`
   CreatedAt int64 `json:"created_at" orm:"column(created_at);size(11)"`
   UpdatedAt int64 `json:"updated_at" orm:"column(updated_at);size(11)"`
}

然后增加3个方法:

通过用户名查询用户

func GetUserByUserName(username string) (v *User, err error) {
   o := orm.NewOrm()
   fmt.Println(username)
   v = &User{Username: username}
   if err := o.QueryTable(new(User)).Filter("Username", username).RelatedSel().One(v); err == nil {
      return  v, nil
   }
   return nil, err
}

登录

func Login(username string, password string) (bool, *User) {
   o := orm.NewOrm()
   user, err := GetUserByUserName(username)
   if err != nil {
      return false, nil
   }
   err = o.QueryTable(user).Filter("Username", username).Filter("Password", password).One(user)
   return err != orm.ErrNoRows, user
}

更新Token

func UpdateUserToken(m *User, token string) (err error) {
   o := orm.NewOrm()
   v := User{Id: m.Id}
   m.Token = token
   // ascertain id exists in the database
   if err := o.Read(&v); err == nil {
      var num int64
      if num, err = o.Update(m); err == nil {
         fmt.Println("Number of records updated in database:", num)
      }
   }
   return err
}

编写Login 的Controller

创建common.go

// User Data definition
package controllers

// Predefined const error strings.
const (
   ErrInputData    = "数据输入错误"
   ErrDatabase     = "数据库操作错误"
   ErrDupUser      = "用户信息已存在"
   ErrNoUser       = "用户信息不存在"
   ErrPass         = "密码不正确"
   ErrNoUserPass   = "用户信息不存在或密码不正确"
   ErrNoUserChange = "用户信息不存在或数据未改变"
   ErrInvalidUser  = "用户信息不正确"
   ErrOpenFile     = "打开文件出错"
   ErrWriteFile    = "写文件出错"
   ErrSystem       = "操作系统错误"
)

// User Data definition
type UserSuccessLoginData struct {
   AccessToken string `json:"access_token"`
   UserName string `json:"user_name"`
}

用来定义成功登录后返回数据类型的结构。我发现这里面什么都在用结构,啥都是结构

创建 base.go

package controllers

import beego "github.com/beego/beego/v2/server/web"

type BaseController struct {
   beego.Controller
}

// Controller Response is controller error info struct.
type Response struct {
   Status int `json:"status"`
   ErrorCode int `json:"error_code"`
   ErrorMessage string `json:"error_message"`
   Data interface{} `json:"data"`
}

定义全局数据类型返回的结构或者格式

编写登录Controller

func (this *UserController) Login() {
   var reqData struct {
      Username string `valid:"Required"`
      Password string `valid:"Required"`
   }
   var token string
   if err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData); err == nil {
      if ok, user := models.Login(reqData.Username, reqData.Password); ok {
         token = "1234567890"
         models.UpdateUserToken(user, token)
         var returnData = &UserSuccessLoginData{token, user.Username}
         this.Data["json"] = &Response{0, 0, "ok", returnData}
      }
   } else {
      this.Data["json"] = "no user or password"
   }
   this.ServeJSON()
}

token暂时乱写的,获得的结果也有些不对劲,

设置路由

   ns := beego.NewNamespace("/api",
       beego.NSNamespace("/user",
      beego.NSRouter("/:id", &controllers.UserController{}, "get:GetOne"),
      beego.NSRouter("/login", &controllers.UserController{}, "post:Login;get:GetLogin"),
   ),
)
   beego.AddNamespace(ns)

一开始我不知道beego.NewNamespace创建的命名空间需要在beego里面使用AddNamespace进行添加才能使用;

一直给我报404的错误,害我废了老大劲儿

测试

大功告成,用postman测试下

嗯,还行。hhh

下一个,引入Jwt Token生成,还有密码进行Hash处理

暂无评论

发表评论

您的电子邮件地址不会被公开,必填项已用*标注。

相关推荐