1、项目文件目录:
2、main.go
import (
"awesomeProject/bubble/dao"
"awesomeProject/bubble/models"
"awesomeProject/bubble/routes"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
// 遇事不决 注释先行
func main() {
//1. 连接MySql数据库
err := dao.InitMySQL()
if err!= nil{
panic(err)
}
defer dao.Close()
//2. 自动迁移 把结构体和数据表进行对应
dao.DB.AutoMigrate(&models.Todo{})
// 3.注册路由
r := routes.SetupRouter()
r.Run()
}
3、注册路由:
import (
"awesomeProject/bubble/controller"
"github.com/gin-gonic/gin"
)
func SetupRouter() *gin.Engine{
r := gin.Default()
// 告诉gin框架模板文件引用的静态文件去哪里找
r.Static("/static", "static")
// 告诉gin框架去哪里找模板文件
r.LoadHTMLGlob("templates/*")
r.GET("/", controller.IndexHandler)
// v1
v1Group := r.Group("v1")
{
// 待办事项
// 添加
v1Group.POST("/todo", controller.CreateATodo)
// 查看所有的待办事项
v1Group.GET("/todo", controller.GetTodoList)
// 修改某一个待办事项
v1Group.PUT("/todo/:id", controller.UpdateATodo)
// 删除某一个待办事项
v1Group.DELETE("/todo/:id", controller.DeleteATodo)
}
return r
}
4、controller:
import (
"awesomeProject/bubble/models"
"github.com/gin-gonic/gin"
"net/http"
)
/*
正常流程: url-> controller -> logic -> model 模型层的crud
*/
func IndexHandler(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", nil)
}
func CreateATodo(c *gin.Context) {
// 1.请求中取数据
var todo models.Todo
c.BindJSON(&todo)
//2.存储数据 3.返回响应
err := models.CreateATodo(&todo)
if err != nil {
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
}else {
c.JSON(http.StatusOK, todo)
/*统一响应格式c.JSON(http.StatusOK, gin.H{
"code": 2000,
"msg": "success",
"data": todo,
})*/
}
}
func GetTodoList(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 UpdateATodo(c *gin.Context) {
id, ok := c.Params.Get("id") //获取请求参数
if !ok {
c.JSON(http.StatusOK, gin.H{"error": "id不存在"})
return
}
// 根据id查询待修改实体
todo, err := models.GetATodo(id)
if err != nil {
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
return
}
c.BindJSON(&todo)
if err = models.UpdateATodo(todo); err != nil{
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
}else {
c.JSON(http.StatusOK, todo)
}
}
func DeleteATodo(c *gin.Context) {
id, ok := c.Params.Get("id")
if !ok {
c.JSON(http.StatusOK, gin.H{"error":"无效的id"})
return
}
if err := models.DeleteTodo(id); err!=nil{
c.JSON(http.StatusOK,gin.H{"error": err.Error()})
}else {
c.JSON(http.StatusOK, gin.H{id: "deleted"})
}
}
5、模型层
import "awesomeProject/bubble/dao"
type Todo struct {
ID int `json:"id"` //和前端做交互 使用的是json数据
Title string `json:"title"`
Status bool `json:"status"`
}
/*
下面是Todo这个Model的crud操作
*/
func CreateATodo(todo *Todo)(err error) {
if err = dao.DB.Create(&todo).Error; err != nil {
return err
}
return
}
func GetAllTodo() (todoList []*Todo, err error) {
if err := dao.DB.Find(&todoList).Error; err != nil{
return nil, err
}
return
}
func GetATodo(id string)(todo *Todo, err error) {
if err = dao.DB.Where("id=?", id).First(todo).Error; err != nil{
return nil, err
}
return
}
func UpdateATodo(todo *Todo)(err error) {
err = dao.DB.Save(todo).Error
return
}
func DeleteTodo(id string)(err error) {
err = dao.DB.Where("id=?", id).Delete(&Todo{}).Error
return
}
6、mysql.go
import "github.com/jinzhu/gorm"
var (
DB *gorm.DB
)
func InitMySQL()(err error) {
dsn := "root:root@(xxx.xxx:3306)/gormDemo?charset=utf8&parseTime=True&loc=Local"
DB, err = gorm.Open("mysql", dsn)
if err!= nil{
panic(err)
}
return DB.DB().Ping()
}
func Close() {
DB.Close()
}