主函数--main.go
package main
import (
"bubble/dao"
"bubble/routers"
)
func main() {
dao.InitDb()
r := routers.InitRouter()
r.Run(":9000")
}
dao--mysql.go
package dao
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type TodoList struct {
ID int `json:"id"`
Title string `json:"title"`
Status bool `json:"status"`
}
var DB *gorm.DB
var err error
func InitDb() {
dsn := "root:password@tcp(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=True&loc=Local"
DB, err = gorm.Open("mysql", dsn)
if err != nil {
return
}
//禁用默认表名的复数形式
DB.SingularTable(true)
//迁移建表
DB.AutoMigrate(&TodoList{})
//设置连接池中的最大闲置连接数
DB.DB().SetMaxOpenConns(10)
}
这里注意要把dsn中的用户名和密码改成自己的 db也是自己的database喔
routers--router.go
package routers
import (
"bubble/api"
"github.com/gin-gonic/gin"
)
func InitRouter() *gin.Engine {
r := gin.Default()
//告诉gin框架模板文件引用的静态文件去哪里找
r.Static("/static", "static")
//告诉gin框架去哪里找模板文件
r.LoadHTMLGlob("templates/*")
r.GET("/", api.IndexHandler)
v1Group := r.Group("v1")
{ //代办事项
//添加
v1Group.POST("/todo", api.AddTodo)
//查看所有的待办事项
v1Group.GET("/todo", api.GetAllTodos)
//修改某一待办事项
v1Group.PUT("/todo/:id", api.UpdateTodo)
//删除某一待办事项
v1Group.DELETE("/todo/:id", api.DeleteTodo)
}
return r
}
api--router.go
package api
import (
"bubble/dao"
"bubble/models"
"github.com/gin-gonic/gin"
_ "github.com/jinzhu/gorm"
"net/http"
)
func IndexHandler(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", nil)
}
func AddTodo(c *gin.Context) {
//前端页面填写待办事项 点击提交 会发请求到这里
//1.从请求中把数据拿出来
var todo dao.TodoList
c.BindJSON(&todo)
//2.存入数据库
err := models.CreateATodo(&todo)
if err != nil {
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
} else {
c.JSON(http.StatusOK, gin.H{
"code": 2000,
"msg": "success",
"data": todo,
})
}
//3.返回响应
}
func GetAllTodos(c *gin.Context) {
todolist, err := models.GetAllTodo()
if err != nil {
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
} else {
c.JSON(http.StatusOK, todolist)
}
}
func UpdateTodo(c *gin.Context) {
id, ok := c.Params.Get("id")
if !ok {
c.JSON(http.StatusOK, gin.H{"error": "无效的id"})
return
}
todo, err := models.GetTodoById(id)
if err != nil {
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
return
}
c.BindJSON(&todo)
if err = models.UpdataATodo(todo); err != nil {
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
} else {
c.JSON(http.StatusOK, todo)
}
}
func DeleteTodo(c *gin.Context) {
id, ok := c.Params.Get("id")
if !ok {
c.JSON(http.StatusOK, gin.H{
"error": "无效的id",
})
return
}
if err := models.DeleteATodo(id); err != nil {
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
} else {
c.JSON(http.StatusOK, gin.H{id: "delete"})
}
}
models--todo.go
package models
import "bubble/dao"
//Todo 增删改查
//创建todo
func CreateATodo(todo *dao.TodoList) (err error) {
err = dao.DB.Create(&todo).Error
return err
}
func GetAllTodo() (todo []*dao.TodoList, err error) {
if err = dao.DB.Find(&todo).Error; err != nil {
return nil, err
}
return
}
func GetTodoById(id string) (todo *dao.TodoList, err error) {
todo = new(dao.TodoList)
if err = dao.DB.Where("id=?", id).First(&todo).Error; err != nil {
return nil, err
}
return
}
func UpdataATodo(todo *dao.TodoList) (err error) {
err = dao.DB.Save(todo).Error
return
}
func DeleteATodo(id string) (err error) {
err = dao.DB.Where("id=?", id).Delete(&dao.TodoList{}).Error
return
}
总结
以上就是后端的内容啦 大概就是这个样子
因为笔者纯属是go小白,并且没有学习过前端技术,所以图上的static和templates文件夹的前端相关内容都来自于Qimi老师
页面展示
在文本栏中输入待办事项:
数据库:
因为没有完成所以status中显示的是 0
点击对勾
会发现代办事情上有了删除线
同时数据库中也将status改成了1
进行删除操作
删除之前
删除之后(为了效果引入第二个代办事务)
数据库中的信息
最后
如果有感兴趣的go小白,欢迎去GitHub上去下载完整代码 链接在这里喔CloserLu/Go_Bubble: 基于Qimi老师的课程编写的Go小项目 (github.com)