一、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)
}