go基于gin框架实现用户注册和登录功能(附带密码加密储存)

go基于gin框架实现用户注册和登录功能(附带密码加密储存)

简言

本文用到的包有

github.com/oswaldoooo/octools@v1.1
golang.org/x/crypto/bcrypt
github.com/gin-gonic/gin

最终我们会实现
在这里插入图片描述
三个文件负责三个功能

  • loginservice=>负责用户登录的信息验证
  • registerservice=>负责用户的注册
  • server=>上面两个服务的路由,负责给用户“引路”
    请添加图片描述
    先看最简单的部分—引路人(server.go)
package server

import "github.com/gin-gonic/gin"

func StartServer() {
	engine := gin.Default()
	stumanager := engine.Group("/manager/student")//创建一个学生管理功能的group,后面做的业务只要是这个范畴的都扔给这个组
	engine.LoadHTMLGlob("/Users/oswaldo/dev/golang/newstart/templates/*")//加载模版目录,最后一个*是指目录下全部模版文件
	stumanager.POST("/login", Login)//用户在提交登录表单过后,对此反应的方法
	stumanager.GET("/login", LoginPage)//用户浏览器直接进的登录页面
	stumanager.GET("/regis", RegisisterUserPage)//用户浏览器直接进的注册页面
	stumanager.POST("/regis", RegisterUser)//用户提交注册表单过后,对此进行反应的方法

	engine.Run(":8001")
}
注册页面

注册页面逻辑很简单,你提交ID,用户名,密码,后端拿到这些信息后,先查看id是否在当前数据库存在,若存在那这肯定是注册不了的,不存在就直接把相关信息写入数据库,密码写入前用bcrypt加个密再写。这里数据库操作是octools提前封装过的,就不需要去自己手动写老久了

package server

import (
	"errors"
	"fmt"

	"github.com/gin-gonic/gin"
	"golang.org/x/crypto/bcrypt"
)

func RegisterUser(ctx *gin.Context) {
	//获取这里的基本讯息,id,password,name
	id := ctx.PostForm("id")
	password := ctx.PostForm("password")
	name := ctx.PostForm("name")
	userid := &struct{ Id string }{}//先预先定义struct,而且里面fileid一定要大写!!!,不然mysql取出来的数据是放不进去的
	var err error
	err = usrservice.dbcon.Get(userid, "id", id, "id")//这里的四个参数分别是你数据库取出来的数据放置的容器,数据库查询数据时匹配的参数名,和参数名需对应的值,最后一个id指的是只取id,这句方法相当于select id from tablename where id="your_id_content"
	fmt.Println("error>>", err)
	if err != nil {
		if len(id) > 0 {
			res, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)//bcrypt加密,后面可通过它自带的方法对比出是不是和原内容一样,所以不必担心怎么把它解密出来的问题
			err = usrservice.dbcon.InsertEasily(map[string]string{"id": id, "name": name, "password": string(res)})//简单的解释:insert into tablename (id,name,password)values('your_id_content','your_name_content','your_password_content')
		} else {
			err = errors.New("id is empty")
		}
	}
	var code int = 200
	data := gin.H{}
	if err == nil {
		data = gin.H{"status": "regis success"}
	} else {
		data = gin.H{"status": err}
	}
	ctx.HTML(code, "regisister.html", data)
}
func RegisisterUserPage(ctx *gin.Context) {

	ctx.HTML(200, "regisister.html", nil)
}

数据库控制器注册(需要提前导入github.com/oswaldoooo/octools/database)

type UserService struct {
	dbcon *database.DbController
}

var usrservice = NewUserService("user_info", "test:123456@tcp(localhost:3306)/lab")

func NewUserService(tablename, db_url string) *UserService {
	return &UserService{dbcon: database.New(tablename, db_url)}
}

登录逻辑
简单粗暴,先看id存不存在,存在=>再看密码对不对的上,对的上,登录成功,上面有一个有问题就返回登录失败

type Student struct {
	Id       string
	Name     string
	Password string
	// ClassName string
}
func Login(ctx *gin.Context) {
	//获取前端输入的登录讯息
	id := ctx.PostForm("studentid")
	pwd := ctx.PostForm("password")
	var code int
	data := gin.H{}
	code = 200
	fmt.Printf("accept info id %v,password %v\n", id, pwd)
	//控制器为空就是数据库连接出问题了
	if usrservice.dbcon != nil {
		student := new(Student)
		//不写入参数默认获得匹配的全部列(因为咋数据库一共就3个列,这里就默认让它输出匹配的全部列了,如果你的数据库并没完全输出全部列的话,这里后面可加参数声明输出哪些列)
		err := usrservice.dbcon.Get(student, "id", id)
		if err == nil {
			fmt.Println("get student info>>", student) //debugline
			err = bcrypt.CompareHashAndPassword([]byte(student.Password), []byte(pwd))//这里就是前文说的hash对比,不需要将你的密码解密来比
		}
		if err == nil {
			data = gin.H{"msg": fmt.Sprintf("Hello,%v", student.Name)}
		} else {
			data = gin.H{"msg": err}
		}
	} else {
		data = gin.H{"msg": "connect to database failed"}
	}
	ctx.HTML(code, "greet.html", data)
}

//log in page

func LoginPage(ctx *gin.Context) {
	ctx.HTML(200, "login.html", nil)
}
这里密码(helloworld!)在数据库中就长这样的了

请添加图片描述

关于octools/database数据库详细操作可参考
github

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是一个简单的示例代码,演示了如何使用Gin框架实现登录功能,前端使用HTML和JavaScript。 后端代码(使用Gin框架): ```go package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() // 静态文件目录,存放前端页面 r.Static("/static", "./static") // 登录页面 r.GET("/login", func(c *gin.Context) { c.HTML(http.StatusOK, "login.html", nil) }) // 登录接口 r.POST("/api/login", func(c *gin.Context) { username := c.PostForm("username") password := c.PostForm("password") // 在这里进行账号验证等操作 // ... c.JSON(http.StatusOK, gin.H{ "message": "登录成功", }) }) r.Run(":8080") } ``` 前端代码(使用HTML和JavaScript): ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <form id="login-form"> <div> <label>用户名:</label> <input type="text" name="username"> </div> <div> <label>密码:</label> <input type="password" name="password"> </div> <div> <button type="submit">登录</button> </div> </form> <script src="/static/jquery.min.js"></script> <script> $(function() { $('#login-form').on('submit', function(event) { event.preventDefault(); var formData = $(this).serialize(); $.ajax({ type: 'POST', url: '/api/login', data: formData, success: function(data) { alert(data.message); // TODO: 登录成功后的操作 }, error: function(xhr, textStatus, errorThrown) { alert(xhr.responseText); } }); }); }); </script> </body> </html> ``` 在示例代码中,后端路由配置了两个接口,一个是GET请求的/login,用于返回登录页面,一个是POST请求的/api/login,用于处理登录请求。前端页面使用了jQuery库,通过ajax()方法将表单数据发送给后端。在登录成功后,会弹出提示框,提示用户登录成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值