golang基础学习+Gin框架搭建+Gorm关系映射

一、go环境搭建

中文官网:Go下载 - Go语言中文网 - Golang中文社区

go语言标准库文档:Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国

二、Gin框架搭建

Gin安装命令:

     1. go env -w GO111MODULE=on 设置mod模式

        在项目根目录下创建一个名为 go.mod 的文件

        go mod init [module name]

    2. go get -u github.com/gin-gonic/gin

         -u:已存在相关的代码包,强行更新代码包及其依赖包

        一般情况会使用国内的镜像比如:

        阿里云:https://mirrors.aliyun.com/goproxy(首选)

        微软:https://goproxy.io
        七牛云:https://goproxy.cn

        下载完之后会出现一个 go.sum文件

     3. go env -w GOPROXY=https://goproxy.cn,direct

     4.导入session包命令  go get github.com/gin-contrib/sessions

     5.导入gorm框架命令   go get github.com/jinzhu/gorm        

     6.导入MySQL包命令   go get github.com/jinzhu/gorm/dialects/mysql

 三、定义一个router

package router

import (
	"gin-project/controller"

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

func Router() *gin.Engine {

	r := gin.Default()

	user := r.Group("/user")
	{
		//注册路由
		user.POST("/register", controller.UserController{}.Register)
		//登录路由
		user.GET("/login", controller.UserController{}.Login)
		//修改密码
		user.PUT("/updatePwd", controller.UserController{}.UpdatePwd)
		//查询所有用户
		user.GET("/getUsers", controller.UserController{}.GetUserList)
		//删除某个用户
		user.DELETE("/removeUser/:id", controller.UserController{}.RemoveUser)
	}

	player := r.Group("/player")
	{
		//参赛选手列表
		player.GET("/getPlayers", controller.PlayerController{}.GetPlayers)
	}

	return r
}
服务启动成功
服务启动成功

四、编写Asponse响应体

package controllers

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

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

type JsonErrorStruct struct {
	Code int         `json:"code"`
	Msg  interface{} `json:"msg"`
}

func ReturnSuccess(c *gin.Context, code int, msg interface{}, data interface{}, count int64) {
	json := &JsonStruct{
		Code:  code,
		Msg:   msg,
		Data:  data,
		Count: count,
	}

	c.JSON(200, json)
}

func ReturnError(c *gin.Context, code int, msg interface{}) {
	json := &JsonErrorStruct{
		Code: code,
		Msg:  msg,
	}

	c.JSON(200, json)
}

五、Gorm对象关系映射库

中文官网:GORM - The fantastic ORM library for Golang, aims to be developer friendly.

  • 配置连接MySQL数据库
package config

const (
	Mysqldb = "root:123456@tcp(127.0.0.1:3306)/ranking?charset=utf8&parseTime=true"
)
package dao

import (
	"gin-project/config"
	"time"

	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

var (
	Db  *gorm.DB
	err error
)

func init() {
	Db, err = gorm.Open("mysql", config.Mysqldb)
	if err != nil {
		panic("连接数据库失败")
	}

	if Db.Error != nil {
		panic(map[string]interface{}{"database error": Db.Error})
	}
	// 设置日志模式为 true,打印执行的 SQL 语句
	Db.LogMode(true)
	//设置数据库连接池参数
	//设置连接池中的最大空闲连接数
	Db.DB().SetMaxIdleConns(10)
	//设置数据库允许打开的最大连接数
	Db.DB().SetMaxOpenConns(100)
	//设置连接的最大生命周期
	Db.DB().SetConnMaxLifetime(time.Hour)
}

六、开始Demo实操

package models

import (
	"gin-project/dao"
	"time"
)

type User struct {
	Id         int       `json:"id"`
	Username   string    `json:"useranme"`
	Password   string    `json:"password"`
	AddTime    time.Time `json:"addTime"`
	UpdateTime time.Time `json:"updateTime"`
}

func (User) TableName() string {
	return "user"
}

// 通过用户名查询用户
func GetUserInfoByUname(username string) (User, error) {
	var user User
	err := dao.Db.Where("username =?", username).First(&user).Error
	return user, err
}

// 新增用户
func AddUser(username string, password string) (int, error) {
	user := User{
		Username:   username,
		Password:   password,
		AddTime:    time.Now(),
		UpdateTime: time.Now(),
	}

	err := dao.Db.Create(&user).Error
	return user.Id, err
}

// 登录
func Login(username string, password string) (User, error) {
	var user User
	err := dao.Db.Where("username =?", username).First(&user).Error
	return user, err
}

// 修改密码
func UpdatePwd(username string, resetPwd string) error {
	err := dao.Db.Model(&User{}).Where("username = ?", username).Updates(
		map[string]interface{}{
			"password":    resetPwd,
			"update_time": time.Now(),
		}).Error
	return err
}

// 查询用户列表
func GetUserList() ([]User, error) {
	var user []User
	err := dao.Db.Find(&user).Error
	return user, err
}

// 通过id删除用户
func RemoveUser(id int) error {
	err := dao.Db.Delete(&User{}, id).Error
	return err
}
package controller

import (
	"gin-project/models"
	"strconv"

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

type UserController struct{}

type UserApi struct {
	Id       int    `json:"id"`
	Username string `json:"useranme"`
}

// 用户注册
func (u UserController) Register(c *gin.Context) {
	//接收用户名和密码及确认密码
	username := c.DefaultPostForm("username", "")
	password := c.DefaultPostForm("password", "")
	confirmPassword := c.DefaultPostForm("confirmPassword", "")

	//判断输入是否为空
	if username == "" || password == "" || confirmPassword == "" {
		ReturnError(c, 500, "请输入正确信息")
		return
	}

	//判断两次密码是否一致
	if password != confirmPassword {
		ReturnError(c, 500, "两次密码不一致!")
		return
	}

	//查询用户是否存在
	user, _ := models.GetUserInfoByUname(username)
	if user.Id != 0 {
		ReturnError(c, 500, "用户已存在!")
		return
	}

	//满足条件调用注册函数
	id, err := models.AddUser(username, EncryMd5(password))

	if err != nil {
		ReturnError(c, 500, "注册失败!")
		return
	}

	ReturnSuccess(c, 200, "注册成功!", id, 1)

}

// 用户登录
func (u UserController) Login(c *gin.Context) {
	username := c.DefaultPostForm("username", "")
	password := c.DefaultPostForm("password", "")

	if username == "" || password == "" {
		ReturnError(c, 500, "用户名或密码不为空!")
		return
	}
	user, _ := models.GetUserInfoByUname(username)

	if user.Id == 0 {
		ReturnError(c, 500, "该用户不存在!")
		return
	}

	if !CompareMd5(user.Password, password) {
		ReturnError(c, 500, "密码错误!")
		return
	}

	data := UserApi{Id: user.Id, Username: user.Username}

	ReturnSuccess(c, 200, "登录成功!", data, 1)

}

// 修改密码
func (u UserController) UpdatePwd(c *gin.Context) {
	username := c.DefaultPostForm("username", "")
	resetPwd := c.DefaultPostForm("ressetPwd", "")

	if username == "" || resetPwd == "" {
		ReturnError(c, 500, "用户名或密码不为空!")
		return
	}

	user, _ := models.GetUserInfoByUname(username)

	//如果原密码和新密码一致
	if CompareMd5(user.Password, resetPwd) {
		ReturnError(c, 500, "新密码与原密码一致!")
		return
	}
	//修改密码
	err := models.UpdatePwd(username, EncryMd5(resetPwd))

	if err != nil {
		ReturnError(c, 500, "修改失败!")
		return
	}

	ReturnSuccess(c, 200, "修改成功!", username, 1)
}

// 查询用户列表
func (u UserController) GetUserList(c *gin.Context) {
	users, _ := models.GetUserList()
	total := int64(len(users))
	ReturnSuccess(c, 200, "查询成功!", users, total)
}

// 删除用户
func (u UserController) RemoveUser(c *gin.Context) {

	idStr := c.DefaultPostForm("id", "")
	id, _ := strconv.Atoi(idStr)
	err := models.RemoveUser(id)

	if err != nil {
		ReturnError(c, 500, "删除失败!")
		return
	}

	ReturnSuccess(c, 200, "删除成功!", id, 1)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值