module hellogin

go 1.15

require (
github.com/gin-gonic/gin v1.6.3
github.com/go-sql-driver/mysql v1.5.0
github.com/jinzhu/gorm v1.9.16
)
package main

import (
"fmt"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
"log"
"net/http"
)

type User struct {
gorm.Model
Name string `gorm:"type:varchar(20);not null"`
Telephone string `gorm:"varchar(20);not null;unique"`
Password string `gorm:"size:255;not null"`
}

var (
db *gorm.DB
err error
)

func main() {
initDB()
defer db.Close()

r := gin.Default()

r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})

// 路由配置
r.POST("/user/create", CreateUser)
r.DELETE("/user/:id", DeleteUser)
r.GET("/users", ListUser)
r.GET("/user/:id", GetUser)
r.PUT("/user/:id", UpdateUser)

r.Run()
}

// 数据库连接
func initDB() *gorm.DB {
driverName := "mysql"
host := "127.0.0.1"
port := "3306"
database := "test"
username := "root"
password := "root"
charset := "utf8"

args := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true",
username,
password,
host,
port,
database,
charset,
)

db, err = gorm.Open(driverName, args)
if err != nil {
panic("failed to connect database,err:" + err.Error())
}

db.DB().SetMaxIdleConns(10)
db.DB().SetMaxOpenConns(100)

// 全局禁用表名复数
db.SingularTable(true) // 如果设置为true,`User`的默认表名为`user`,使用`TableName`设置的表名不受影响

// 一般不会直接用CreateTable创建表
// 检查模型`User`表是否存在,否则为模型`User`创建表
if !db.HasTable(&User{}) {
if err := db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{}).Error; err != nil {
panic(err)
}
}

return db
}

// 创建用户
func CreateUser(c *gin.Context) {
var user User
c.BindJSON(&user) // 使用bindJson填充数据

// db.Create(&user) // 创建对象
// c.JSON(http.StatusOK, &user) // 返回页面

if user.Name != "" && user.Password != "" {
//
if err := db.Create(&user).Error; err != nil {
fmt.Println("error 了")
c.JSON(400, gin.H{"error": err.Error()})
return
}

c.JSON(http.StatusOK, gin.H{
"code": 20000,
"message": "success",
"data": &user,
})
} else {
c.JSON(422, gin.H{"error": "Fields are empty"})
}
}

// 删除用户
func DeleteUser(c *gin.Context) {
id := c.Params.ByName("id")

log.Println("id:", id)

if err := db.Where(&User{Name: id}).Delete(User{}).Error; err != nil {
c.JSON(500, gin.H{
"msg": "删除失败",
"error": err.Error(),
})
}

c.JSON(http.StatusOK, gin.H{
"msg": "删除成功",
"data": "User# " + id + " deleted!",
})

// 2
//var user User
//db.First(&user, id)
//if user.Name {
// db.Delete(&user)
// c.JSON(http.StatusOK, gin.H{
// "success": "User# " + id + " deleted!",
// })
//} else{
// c.JSON(404, gin.H{
// "error": "User not found",
// })
//}
}

// 列出所有用户
func ListUser(c *gin.Context) {
var user []User
db.Find(&user)
c.JSON(http.StatusOK, &user) //限制查找前line行
}

// 列出单个用户
func GetUser(c *gin.Context) {
var user User
id := c.Params.ByName("id")
err := db.First(&user, id).Error
if err != nil {
c.AbortWithStatus(404)
fmt.Println(err.Error())
} else {
c.JSON(http.StatusOK, &user)
}
}

// 更新用户
func UpdateUser(c *gin.Context) {
var user User
id := c.Params.ByName("id")

err := db.First(&user, id).Error
if err != nil {
c.AbortWithStatus(404)
fmt.Println(err.Error())
} else {
c.BindJSON(&user)

if err := db.Save(&user).Error; err != nil {
c.JSON(http.StatusOK, gin.H{
"message": err.Error(),
}) // 返回页面
return
}

// 提交修改
c.JSON(http.StatusOK, &user) // 返回页面
}
}