go — beego 框架 实现登录

  • Post author:
  • Post category:其他


  1. 安装beego和bee工具(安装过程参考beego开发文档)


beego开发文档

  1. 创建user表 这里我是将token放进数据表中,其实可以放进缓存

  1. routuer使用注解路由

package routers

import (
    "fyoukuApi/controllers"
    "github.com/astaxie/beego"
)

func init() {
    beego.Include(&controllers.UserController{})
}
  1. user控制器

package controllers

import (
    "fyoukuApi/models"
    "github.com/astaxie/beego"
    "regexp"
)

// Operations about Users
type UserController struct {
    beego.Controller
}
// 用户登录
// @router /login/do [post]
func (this *UserController) LoginDo() {
    //创建返回的变量
    var (
        mobile   string
        password string
    )
    //获取请求的参数
    mobile = this.GetString("mobile")
    password = this.GetString("password")
    if mobile == "" {
        this.Data["json"] = ReturnError(4001, "手机号不能为空")
        this.ServeJSON()
    }
    if password == "" {
        this.Data["json"] = ReturnError(4002, "密码不能为空")
        this.ServeJSON()
    }
    //手机号正则表达式 验证
    isorno, _ := regexp.MatchString(`^1(3|5|7|8)[0-9]\d{8}$`, mobile)
    if !isorno {
        this.Data["json"] = ReturnError(4002, "手机号格式不正确")
        this.ServeJSON()
    }
    //密码加密验证
    id, user := models.IsMobileLogin(mobile, MD5V(password))
    if user == "" {
        this.Data["json"] = ReturnError(4003, "手机号或密码不正确")
        this.ServeJSON()
    } else {
        //生成token
        token := createToken(MD5V(string(id)))
        user := models.MobileGetId(id, token)
        this.Data["json"] = ReturnSuccess(1, "登录成功", user, 1)
        this.ServeJSON()
    }
}
  1. common控制器创建返回信息

package controllers

import (
    "crypto/md5"
    "encoding/hex"
    "fyoukuApi/models"
    "github.com/astaxie/beego"
    "time"
)

type CommonController struct {
    beego.Controller
}

type JsonStruct struct {
    Code  int         `json:"code"`
    Msg   interface{} `json:"msg"`
    Items interface{} `json:"items"`
    Count int64       `json:"count"`
}

// 成功返回消息
func ReturnSuccess(code int, msg interface{}, items interface{}, count int64) (json *JsonStruct) {
    json = &JsonStruct{
        Code:  code,
        Msg:   msg,
        Items: items,
        Count: count,
    }
    return
}

// 失败返回信息
func ReturnError(code int, msg interface{}) (json *JsonStruct) {
    json = &JsonStruct{
        Code: code,
        Msg:  msg,
    }
    return
}

// md5加密
func MD5V(password string) string {
    h := md5.New()
    h.Write([]byte(password + beego.AppConfig.String("md5code")))
    return hex.EncodeToString(h.Sum(nil))
}

// 生成token
func createToken(id string) string {
    token := MD5V(MD5V(string(time.Now().Unix())) + id)
    return token
}

// 验证token数据
func checkToken(token []string, id []string) bool {
    GetTokenById := models.GetHeader(token, id)
    if GetTokenById == false {
        return false
    }
    return true
}
  1. modle文件 这里有orm的查询格式,和orm执行原生sql,特意写了两个格式方便大家参考,有的时候原生sql还是好用一些

package models

import (
    "github.com/astaxie/beego/orm"
    "time"
)

type User struct {
    Id         int
    Name       string
    Password   string
    Status     int
    AddTime    int64
    Mobile     string
    Avatar     string
    UpdateTime int
    Token      string
}

func init() {
    orm.RegisterModel(new(User))
}

// 根据手机号判断用户是否存在
func IsUserMobile(mobile string) bool {
    o := orm.NewOrm()
    user := User{Mobile: mobile}
    err := o.Read(&user, "mobile")
    if err == orm.ErrNoRows || err == orm.ErrMissPK {
        return false
    }
    return true

}

// 登录功能
func IsMobileLogin(mobile string, password string) (int, string) {
    o := orm.NewOrm()
    var user User
    err := o.Raw("SELECT * FROM user WHERE mobile= ? AND password = ?", mobile, password).QueryRow(&user)
    if err != nil {
        return 0, ""
    }
    return user.Id, user.Name
}

// 更新用户信息 并返回结果
func MobileGetId(id int, token string) (data interface{}) {
    o := orm.NewOrm()
    var user User
    o.Raw("UPDATE user SET update_time = ? , token = ? WHERE id = ?", time.Now().Unix(), token, id).QueryRow(&user)

    _ = o.Raw("SELECT * FROM user WHERE id = ?", id).QueryRow(&user)
    return user
}

// 查询数据库token
func GetHeader(token []string, id []string) bool {
    o := orm.NewOrm()
    var user User
    err := o.Raw("SELECT `id`,`token` FROM user WHERE id = ? AND token = ?", id, token).QueryRow(&user)
    if err != nil {
        return false
    } else {
        return true
    }
}

整体流程就是些



版权声明:本文为qq_17525509原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。