使用gin和gorm框架完成的bubble小清单项目

bubble小清单项目

1. 使用gin框架来做服务端,回应浏览器发送的请求

1.gin.Default() 启动一个默认的路由

r := gin.Default()返回一个默认的引擎 *gin.Engine类型

下面我们就要使用r来做事情

1.前端页面需要加载静态文件

使用r.LoadHTMLGlob() 方法

2.静态文件加载地址

使用r.Static()方法

3.处理浏览器发送的GET访问请求

r.GET("/bubble", controller.BubbleHandle)

4. 定义一个路由组来处理浏览器发送的各种请求
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)
	}

2.controller文件包含处理浏览器发送的各种请求

1.controller.BubbleHandle

处理一开始浏览器发送的GET请求

func BubbleHandle(c *gin.Context){
	c.HTML(http.StatusOK, "index.html", nil)
}

返回一个HTML页面

2. controller.CreateTodo

在数据库表中创建一个新的元素

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)
	}
}
3. controller.LookTodoList

在浏览器页面展示数据库中现有的数据

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)
	}
}
4. controller.UpdateTodo

修改待办事项的状态

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)
}
5. controller.DeleteTodo

在客户端点击删除, 即发送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框架来操作完成

2. 使用 gorm 框架来连接数据库,实现增删改查

1.创建连接mysql文件

声明一个全局的*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("连接成功")
}

2. 创建models文件代表与数据库相关的操作都在这进行

3. 创建结构体与客户端发送来的数据进行绑定

type Todo struct {
    // json标签表示在浏览器中这个字段的模样
    ID int `json:"id"`
	Title string `json:"title"`
	Status bool `json:"status"`
}

注意这里字段的首字母需要大写,这样才对外部的包可见

4. 完成各种操作(增删改查)

1.CreateData

在表中插入一段数据,使用了GlobalDB.Create()方法需要传入绑定的结构体指针

2. ShowData

在客户端展示数据库中现有的数据元素,使用了GlobalDB.Find()方法,将todoList切片指针传入并且没有任何查询条件,就会将查询到的数据全部绑定在todoList中,即可展示全部数据

3. UpDateTodo

根据传入的id值找到一条特定的元素,并将元素绑定至todo结构体中, 在调用函数的地方使用c.BindJSON()方法修改status的状态

4. Save

使用GlobalDB.Save(todo)方法保存即可

5. DeleteTodo

使用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
}

3.具体使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gopher333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值