![](https://cdn.zklighting.ltd/wp-content/uploads/2021/06/beegomeetup4-170404174143-thumbnail-4.jpg)
源码: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
测试下
![](https://cdn.zklighting.ltd/wp-content/uploads/2021/06/image-43-1024x799.png)
嗯,还行。hhh
下一个,引入Jwt Token
生成,还有密码进行Hash
处理
暂无评论