这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
因为最近要开发大项目,所以我在网上学了一些小项目 下面这个项目是网上找的一个免费的,公开的项目
package main
import (
"bubble/dao"
"bubble/models"
"bubble/routers"
"bubble/setting"
"fmt"
"os"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("Usage:./bubble conf/config.ini")
return
}
// 加载配置文件
if err := setting.Init(os.Args[1]); err != nil {
fmt.Printf("load config from file failed, err:%v\n", err)
return
}
// 创建数据库
// sql: CREATE DATABASE bubble;
// 连接数据库
err := dao.InitMySQL(setting.Conf.MySQLConfig)
if err != nil {
fmt.Printf("init mysql failed, err:%v\n", err)
return
}
defer dao.Close() // 程序退出关闭数据库连接
// 模型绑定
dao.DB.AutoMigrate(&models.Todo{})
// 注册路由
r := routers.SetupRouter()
if err := r.Run(fmt.Sprintf(":%d", setting.Conf.Port)); err != nil {
fmt.Printf("server startup failed, err:%v\n", err)
}
}
首先看main函数,这是一个通用的web脚手架,我们分别看 1、加载配置 2、创建数据库,连接数据库 3、模型绑定,注册路由
我们来看一下控制层在干什么,代码后面给出解析
// 定义 package 为 controller
package controller
// 引入需要的包
import (
"bubble/models" // 引入模型层相关的包
"github.com/gin-gonic/gin" // 引入 Gin Web 框架
"net/http" // 引入用于构建 HTTP 相关功能的包
)
/*
url --> controller --> logic --> model
请求来了 --> 控制器 --> 业务逻辑 --> 模型层的增删改查
*/
// IndexHandler 处理主页请求并返回主页
func IndexHandler(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", nil)
}
// CreateTodo 处理创建待办事项的请求
func CreateTodo(c *gin.Context) {
// 前端页面填写待办事项 点击提交 会发请求到这里
// 1. 从请求中把数据拿出来
var todo models.Todo
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, todo)
//c.JSON(http.StatusOK, gin.H{
// "code": 2000,
// "msg": "success",
// "data": todo,
//})
}
}
// GetTodoList 获取所有待办事项的列表
func GetTodoList(c *gin.Context) {
// 查询todo这个表里的所有数据
todoList, err := models.GetAllTodo()
if err!= nil {
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
}else {
c.JSON(http.StatusOK, todoList)
}
}
// UpdateATodo 处理更新待办事项的请求
func UpdateATodo(c *gin.Context) {
id, ok := c.Params.Get("id")
if !ok {
c.JSON(http.StatusOK, gin.H{"error": "无效的id"})
return
}
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)
}
}
// DeleteATodo 处理删除待办事项的请求
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.DeleteATodo(id);err!=nil{
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
}else{
c.JSON(http.StatusOK, gin.H{id:"deleted"})
}
}