r := gin.Default()返回一个默认的引擎 *gin.Engine类型
下面我们就要使用r
来做事情
使用r.LoadHTMLGlob()
方法
使用r.Static()
方法
r.GET("/bubble", controller.BubbleHandle)
v1Group := r.Group("v1")
{
// 4.1 添加发送的POST请求
v1Group.POST("/todo", controller.CreateTodo)
// 4.2 查看所有的待办事项
v1Group.GET("/todo", controller.LookTodoList)
// 4.3 修改状态为完成或者未完成
v1Group.PUT("todo/:id", controller.UpdateTodo)
// 4.4 删除已经完成的待办事项
v1Group.DELETE("todo/:id", controller.DeleteTodo)
}
处理一开始浏览器发送的GET请求
func BubbleHandle(c *gin.Context){
c.HTML(http.StatusOK, "index.html", nil)
}
返回一个HTML页面
在数据库表中创建一个新的元素
func CreateTodo (c *gin.Context) {
// 前端页面填写待办事项, 点击提交就会发送POST请求到这里
// 1.从请求中把数据拿出来
var todo models.Todo
c.BindJSON(&todo)
// 2.存入数据库
if err := models.CreateData(&todo); err != nil{
c.JSON(http.StatusBadRequest, gin.H{"error" : err.Error()})
}else {
// 3.返回响应
c.JSON(http.StatusOK, todo)
}
}
在浏览器页面展示数据库中现有的数据
func LookTodoList(c *gin.Context) {
// 查询todo这个表里面的所有数据
var todoList []models.Todo
if err := models.ShowData(&todoList); err != nil {
c.JSON(http.StatusOK, gin.H{"error" : err.Error()})
}else {
c.JSON(http.StatusOK, todoList)
}
}
修改待办事项的状态
func UpdateTodo(c *gin.Context) {
// 拿到id之后更新status状态即可
id := c.Params.ByName("id")
var todo models.Todo
if err := models.UpdateTodo(&todo, id); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error" : err.Error()})
}else {
c.JSON(http.StatusOK, todo)
}
// BindJSON将json文件于todo绑定修改状态
c.BindJSON(&todo)
models.Save(todo)
}
在客户端点击删除, 即发送DELETE请求,同时在数据库里面删除即可
func DeleteTodo (c *gin.Context) {
id := c.Params.ByName("id")
var todo models.Todo
if err := models.DeleteTodo(&todo, id); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error" : err.Error()})
}else {
c.JSON(http.StatusOK, gin.H{id : "deleted"})
}
}
具体说明各种处理函数的具体执行都是由models文件里面的gorm框架来操作完成
声明一个全局的*gorm.DB变量用来与数据库之间的操作
重要的一点是需要与下文的models.Todo进行结构体绑定使用AutoMigrate方法
package database
import (
"fmt"
"gin_demo/lesson15/models"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"time"
)
var GlobalDB *gorm.DB
func InitMysql(){
dsn := "root:admin@tcp(127.0.0.1:3306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println(err)
return
}
sqlDB, err := db.DB()
if err != nil {
return
}
sqlDB.SetMaxOpenConns(100)
sqlDB.SetMaxIdleConns(10)
sqlDB.SetConnMaxLifetime(time.Hour)
GlobalDB = db
// 模型绑定
GlobalDB.AutoMigrate(&models.Todo{})
fmt.Println("连接成功")
}
type Todo struct {
// json标签表示在浏览器中这个字段的模样
ID int `json:"id"`
Title string `json:"title"`
Status bool `json:"status"`
}
注意这里字段的首字母需要大写,这样才对外部的包可见
在表中插入一段数据,使用了GlobalDB.Create()方法需要传入绑定的结构体指针
在客户端展示数据库中现有的数据元素,使用了GlobalDB.Find()方法,将todoList切片指针传入并且没有任何查询条件,就会将查询到的数据全部绑定在todoList中,即可展示全部数据
根据传入的id值找到一条特定的元素,并将元素绑定至todo结构体中, 在调用函数的地方使用c.BindJSON()方法修改status的状态
使用GlobalDB.Save(todo)方法保存即可
使用GlobalDB.Where().Delete()即可 根据传入的id找到一条特定的元素, 并且将其删除即可
func CreateData(todo *Todo) (err error){
if err = database.GlobalDB.Create(&todo).Error; err != nil{
return nil
}
return
}
func ShowData(todoList *[]Todo)(err error){
if err = database.GlobalDB.Find(&todoList).Error; err != nil {
return nil
}
return
}
func UpdateTodo(todo *Todo, id string) (err error){
if err = database.GlobalDB.Where("id = ?", id).First(&todo).Error; err != nil {
return nil
}
return
}
func Save(todo Todo){
database.GlobalDB.Save(todo)
}
func DeleteTodo(todo *Todo, id string)(err error) {
if err = database.GlobalDB.Where("id = ?", id).Delete(&todo).Error; err != nil{
return nil
}
return
}