go iris+redis+mysql 实现账号登录功能(一)
设计思路:
1.postman 通过register 接口, 注册帐号。
2.通过login接口,生成token 和refresh token 并设置各自的有效时间(token 15分钟、refresh token 3天),写入redis 和mysql.
2. token 在后续的接口访问中需要携带,且用户每次访问接口后台都需要验证token 的时效,如果token 未过期则重置token 的有效时间
3. refresh 过期后,不允许继续刷新对应token 的有效是时间。前端跳转到登录页面让用户重新登录。
一:go iris 的register 接口
go 环境的安装步骤,可以查看其它网站。
1.1 iris 服务器的搭建
github(https://github.com/kataras/iris) 推荐的步骤为:
第一步:新建文件夹 myapp
mkdir myapp
进入mayapp 文件夹,新建main.go 文件 ,初始化项目模块
go mod init main
接下来参考go iris 的例子 https://github.com/kataras/iris/tree/master/_examples 里面的 Serverless.
往 main.go 文件里面粘入下面的代码
package main
import (
"github.com/kataras/iris/v12"
)
func main() {
app := iris.New()
app.OnErrorCode(iris.StatusNotFound, notFound)
app.Get("/", index)
app.Get("/ping", status)
app.Run(iris.Addr(":8080"),iris.WithCharset("UTF-8"))
}
func notFound(ctx iris.Context){
code := ctx.GetStatusCode()
ctx.JSON(iris.Map{
"Message": msg,
"Code": code,
})
}
func index(ctx iris.Context) {
fmt.Println("compeleted")
ctx.JSON(iris.Map{
"Message": "ok",
});
}
func status(ctx iris.Context) {
ctx.JSON(iris.Map{"Message": "OK"})
}
在终端里面敲 go run main.go。
如果有些包提示下载不成功,可能需要配置下go 环境的代理,然后运行
window 设置环境变量的指令:
go env -w GOPROXY=https://goproxy.io,direct
go env -w GO111MODULE=on 或者 set GO111MODULE=on
linux 设置环境变量的指令
export GO111MODULE=on
export GOPROXY=https://goproxy.io,direct
运行成功后,在浏览器上输入http://localhost:8080/ping iris 就会返回下面的内容
{
"Message": "OK"
}
iris 简单的服务器就搭建好了。
1.2 添加 register 路由。
//import 里面引入fmt
import (
"fmt"
"github.com/kataras/iris/v12"
)
//main 函数里面添加 register 路由
app.Post("/register", registerHandle)
//定义registerHandle 函数
func registerHandle (ctx iris.Context) {
var name = ctx.PostValue("name");
var password = ctx.PostValue("password");
fmt.Printf("%s %s",name,password);
ctx.JSON(iris.Map{
"data":iris.Map{
"token":"",
"refreshToken":""},
"Message": "OK"})
}
保存运行,在postman 里面发送一个post 请求,测试结果如下:
二、 数据库链接
mysql 数据库的安装和运行远程连接配置,这里不讲。在服务器上安装好数据库后,用navicat 链接,如果能正常访问数据库,那数据库的配置就没有问题了。
package mysqlmanage
import (
"fmt"
"time"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
var db *gorm.DB
// 数据库user 表的结果
type User struct {
Id int `gorm:"AUTO_INCREMENT"`
Name string `gorm:"size:255"`
Password string `gorm:"size:255"`
Token string `gorm:"size:255"`
RefreshToken string `gorm:"size:255"`
CreateDate time.Time
UpdateTime time.Time
}
type mysqlmanage struct{}
var users []User;
//创建mysqlmanage 的实例
func NewMysqlManage() *mysqlmanage{
return &mysqlmanage{}
}
// 返回链接数据库的句柄
func (*mysqlmanage) MysqlConnGet() *gorm.DB {
return db;
}
//数据库连接初始化
func (*mysqlmanage) MysqlmanageInit() (*gorm.DB,error){
dbSel, err := gorm.Open("mysql", "username:password@com@tcp(xx.xx.xx.xx:3306)/test_db?charset=utf8&parseTime=True&loc=Local"); // 数据库的链接配置
db = dbSel;
if err != nil {
fmt.Printf("链接错误");
//fmt.Printf(err);
panic(err);
}
db.SingularTable(true) ;
//db.AutoMigrate(&User{})
// 创建表时添加表后缀
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{});
// 添加唯一索引
db.Model(&User{}).AddUniqueIndex("idx_user_id", "id");
return db, err;
}
// 修改数据库记录的函数
func (*mysqlmanage) MysqlmanageAlterRecord(name string,password string,tokenString string,refreshTokenString string) {
user := User{
Token:tokenString,
RefreshToken:refreshTokenString,
UpdateTime:time.Now(),
}
db.Model(&user).Where(&User{Name: name, Password: password}).Update(&user);
db.Where(&User{Name: name, Password: password}).First(&users);
fmt.Printf("%+v ",users);
}
// 在数据库里面创建一条数据的函数
func (*mysqlmanage) MysqlmanageAddRecord(name string,password string) {
user := User{
Name:name,
Password:password,
CreateDate:time.Now(),
UpdateTime:time.Now(),
}
db.Create(&user);
db.Find(&users);
fmt.Printf("%+v ",users);
}
四、 register 接口往数据库里
regis 接口在接收到用户的注册的个人信息后,需要填入数据库。
main.go:
package main
import (
"fmt"
mysqlmanage "main/mysql"
"strings"
"time"
"github.com/kataras/iris/v12"
)
var MysqlManage = mysqlmanage.NewMysqlManage();//创建mysqlmanage模块的实例
//注册接口的实现函数
func registerHandle (ctx iris.Context) {
var name = ctx.PostValue("name");
var password = ctx.PostValue("password");
fmt.Printf("%s %s",name,password);
mysqlconn := MysqlManage.MysqlConnGet();//调用上面封装的mysqlmanage模块,连接数据
var users []mysqlmanage.User;
mysqlconn.Where("name = ?", name).First(&users)//查询当前用户是否已经存在数据库
fmt.Printf("%+v",users);
if len(users)>0 {
ctx.JSON(iris.Map{
"Message": "该账户已经存在,不用重复注册",
})
} else {
MysqlManage.MysqlmanageAddRecord(name,password);
ctx.JSON(iris.Map{
"Message": "注册成功",
"responseCode":1000000,
})
}
}
这样register 接口已经实现
本文的参考过的一些文章链接:
- https://www.cnblogs.com/jianga/p/12487267.html
- https://www.cnblogs.com/flash55/p/11397032.html
- https://www.cnblogs.com/yangxinpython/p/12825470.html
- https://github.com/kataras/iris