-
安装beego和bee工具(安装过程参考beego开发文档)
-
创建user表 这里我是将token放进数据表中,其实可以放进缓存
![](https://img-blog.csdnimg.cn/img_convert/41552e63d9d44743889ed031a57a7f4b.png)
-
routuer使用注解路由
package routers
import (
"fyoukuApi/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Include(&controllers.UserController{})
}
-
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()
}
}
-
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
}
-
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 版权协议,转载请附上原文出处链接和本声明。