go+mysql+redis+vue3简单聊室,第2弹:数据库链接和操作

设置配置文件

在根目录下创建config目录,目录下存放全局需要用到的一些配置文件
创建配置文件config.ini

# 配置文件

[mysql]
Db = mysql
Host = 127.0.0.1
Port = 3306
User = root
Pwd = root
#DbName = bee
DbName = gochat

[redis]
Db = redis
Addr = 127.0.0.1:6379
Pwd = root
DbName = 1

创建用于解析配置文件的 config.go

package config

import "gopkg.in/ini.v1"

//全局配置文件 指针
var ConfigFile *ini.File

func init(){
	//下载ini包
	//第一次执行go get命令,需要先执行:go env -w GOSUMDB="sum.golang.google.cn
	//目的是修改GOSUMDB 验证地址,默认的地址被墙,会导致连接超时
	//然后执行
	//go get gopkg.in/ini.v1
	if file,err := ini.Load("./config/config.ini");err != nil{
		panic(err)
	}else{
		ConfigFile = file
	}
}

连接数据库

根目录下创建db目录,存放数据库链接相关的操作文件
在db下创建mysql.go

package db

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"project1/config"
	"time"
)


func GetMysql() *gorm.DB{

	host := config.ConfigFile.Section("mysql").Key("Host").String()
	user := config.ConfigFile.Section("mysql").Key("User").String()
	pwd := config.ConfigFile.Section("mysql").Key("Pwd").String()
	dbName := config.ConfigFile.Section("mysql").Key("DbName").String()
	port := config.ConfigFile.Section("mysql").Key("Port").String()
	db,err := gorm.Open("mysql",user+":"+pwd+"@tcp("+host+":"+port+")/"+dbName+"?charset=utf8mb4&parseTime=True")
	if err != nil {
		panic(err)
	}
	db.SingularTable(true)//表名不加s
	db.DB().SetMaxIdleConns(20)//连接池数量
	db.DB().SetMaxOpenConns(100)//最大并发量
	db.DB().SetConnMaxLifetime(time.Second*30)//链接超时时间
	return db
	//返回的 Conn 只能用来进行一次 goroutine 的操作,也就是说不能把这个 Conn 应用于 Go 的多个 goroutine 里面。
	//Go 不知道某个操作究竟是由哪个 goroutine 发起的,从而导致数 据混乱,比如可能会把 goroutineA 里面执行的查询操作的结果返回给 goroutineB 从而使 B 错误地把此结果当成自己执行的插入数据。
}

创建数据表model

gorm操作数据表,是基于一个struct类型的变量进行的,struct 中属性和类型需要与表一一对应,所以们需要建立两个文件,相当于是表对应的model,用以对两个表进行声明和操作

先建立两个表,user和msg
在这里插入图片描述
在这里插入图片描述
在根目录创建models文件夹,存放数据表的对应的model
在models文件夹下建立user.go文件,如下

package models

// 引入所需的包
import (
	"crypto/md5"
	"fmt"
	"github.com/go-playground/validator/v10"
	"github.com/jinzhu/gorm"
	"github.com/gin-gonic/gin"
)
//建立自定义类型User ,大写,以便外部需要引用该类型
type User struct{
    //gorm.Model为gorm预定义的mysql字段,包括了,ID,CreateAt,UpdateAt,DeleteAt四个字段。可以不用,完全自己定义。但是使用gorm删除时,无法自动标记软删除
	gorm.Model
	//属性都为大写,方便外部调用
	//tag主要用于使用gorm建表,不需要使用gorm建表的话,可以不写tag。属性虽然为大写,但当建表时会字段转换为小写并用下划线连接
	Phone string `gorm:"size:11;not null;unique_index"`
	Password string `gorm:"type:varchar(50);not null;"`
	Name string `gorm:"type:varchar(30);default:'';"`
}



//注册新用户
//可在api验证数据通过后调用该方法
//*RegisterRule为gin框架验证参数通过后,建立的包含传入参数的RegisterRule类型的变量指针
func (user *RegisterRule) RegisterUser(){
	var userModel User
	var back Response
	//加密密码
	md5Pwd := md5.Sum([]byte(rule.Password+"12345"))
	// md5.Sum返回的是一个[16]byte数组,无法使用string()直接转换
	newPwd := fmt.Sprintf("%x",md5Pwd)
	//设置要插入表中的字段值
	userModel = User{Phone:rule.Phone,Password:newPwd,Name:rule.Name}
	//获取一个mysql连接
	mysql := GetMysql()
	defer mysql.Close()
	//插入数据
	if err := mysql.Create(&userModel).Error;err == nil {
		back = gin.H{"status":1,"msg":"注册成功","data":userModel}
	}else{
		back = gin.H{"status":0,"msg":err.Error()}
	}
	return back
}

//登录方法
func (rule *LoginRule) Login() Response{
	var user User
	//加密密码
	md5Pwd := md5.Sum([]byte(rule.Password+"12345"))
	newPwd := fmt.Sprintf("%x",md5Pwd)
	//查询用户
	mysql := GetMysql()
	defer mysql.Close()
	if err := mysql.Where("phone = ? AND password = ?",rule.Phone,newPwd).First(&user).Error;err == nil{
		back = gin.H{"status":1,"msg":"登录成功","data":user}
	}else{
		back = gin.H{"status":0,"msg":err.Error()}
	}
	return $back;
}

使用models中的方法

定义完注册方法后,我们来到api/user.go文件中,使用models中的方法,如下

import(
	...
	"project1/models"
)
//注册方法
func Register(c *gin.Context){
	...
	//执行验证接收
	if err := c.ShouldBind(&registerRule);err == nil {
		//数据验证成功,调用注册方法
		res := registerRule.Register()
		if res.status == 1{
			c.JSON(200,res)
		}else{
			c.JSON(402,res)
		}
	}else{
		c.JSON(402,err.Error())
	}
}

//登录方法
//按照Register流程,试着建立登录方法
func Login(c *gin.Context){
	//先在api/user.go 定义登录参数验证结构体LoginRule
	//然后在该方法内执行ShouldBind方法,验证和获取参数
	//验证成功后,调用LoginRule绑定的方法,方法定义在models/user.go中
	//根据返回状态,判断是否登录成功等后续操作
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值