基于gin+Grom的Goweb框架bubble清单项目的记录与理解

2023-11-22 15:40

本文主要是介绍基于gin+Grom的Goweb框架bubble清单项目的记录与理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、前端Vue框架的应用
    • 1.1 下载前端写好的代码(vue)
  • 二、后端逻辑功能实现
    • 1.添加事项gin后端功能实现
    • 2. 更新修改 某个事项
    • 3 .查看 显示所有事项
    • 4. 删除 肯定是某一个ID事项
    • 5. 整体后端功能请求
  • 三、企业级项目结构拆分
    • 3.1 controller层
    • 3.2 logic 层
    • 3.3 dao层
    • 3.4 model层
  • 总结

一、前端Vue框架的应用

1.1 下载前端写好的代码(vue)

清晰前端的json数据,理清需要是实现的功能点。对于我们这种前端不熟悉的人,可以借助Postman进行后端测试。
下载地址:https://github.com/Q1mi/go_web
查看前端界面:
在这里插入图片描述

二、后端逻辑功能实现

首先是资源文件来源配置与页面请求

//静态文件资源加载r.Static("/static", "./static")//加载资源文件r.LoadHTMLGlob("templates/*")r.GET("/index", func(c *gin.Context) {c.HTML(200, "index.html", nil)})

需要实现的功能:遇事不决,先写注释,对初学者来说十分重要。
bubble清单:待办事项
1.添加事项
2.更新修改 某个事项
3.查看 显示所有事项
4.删除 某个事项

1.添加事项gin后端功能实现

//添加 事项v1Group.POST("/todo", func(c *gin.Context) {//前端页面填写待办事项 点击提交 会发送请求到这里//1.从请求中把数据拿出来var todo Todo     //声明一个Todo类型的结构体 todoc.BindJSON(&todo) //将数据从请求中取出BindJSON 数据json格式,存入变量todo//2.存入数据库 DB.Create()//err := DB.Create(&todo).Error//if err != nil {////}//3.反应具体响应if err = DB.Create(&todo).Error; err != nil {c.JSON(http.StatusOK, gin.H{"error": err.Error()})} else {c.JSON(http.StatusOK, todo) //数据插入数据库成功 直接返回todo变量//c.JSON(http.StatusOK, gin.H{//	"code": 2000,//	"msg":  "success",//	"data": todo,//}) //数据插入数据库成功 直接返回todo变量,前端要求返回的格式}})

2. 更新修改 某个事项

//修改,更新  肯定是某一个ID事项v1Group.PUT("/todo/:id", func(c *gin.Context) {id, _ := c.Params.Get("id") //拿到请求路径的idvar todo Todo//通过id 从数据库 查询到对应的数据if err = DB.Where("id=?", id).First(&todo).Error; err != nil {c.JSON(http.StatusOK, gin.H{"error": err.Error()})}c.BindJSON(&todo) //BindJSON 将数据从请求中取出 数据json格式,存入变量todoif err = DB.Save(&todo).Error; err != nil {c.JSON(http.StatusOK, gin.H{"error": err.Error()})}})

3 .查看 显示所有事项

//查看所有待办事项,页面显示菜单v1Group.GET("/todo", func(c *gin.Context) {//查询todo这个表里面所有数据var todolist []Todo //声明一个Todo结构体类型的切片 todolostif err = DB.Find(&todolist).Error; err != nil {c.JSON(http.StatusOK, gin.H{"error": err.Error()})} else {c.JSON(http.StatusOK, todolist)//c.JSON(http.StatusOK, gin.H{//	"code": 2000,//	"msg":  "success",//	"data": todolost,//})}})//查看某一个代办事项v1Group.GET("/todo/:id", func(c *gin.Context) {// 该项目未使用})

4. 删除 肯定是某一个ID事项

v1Group.DELETE("/todo/:id", func(c *gin.Context) {//从库里面删除id, _ := c.Params.Get("id") //拿到请求路径的id//var todo Todo//通过id 从数据库 删除对应的数据if err = DB.Where("id=?", id).Delete(&Todo{}).Error; err != nil {c.JSON(http.StatusOK, gin.H{"error": err.Error()})} else {c.JSON(http.StatusOK, gin.H{id: "delteted",})}})

5. 整体后端功能请求

1.定义模块

// Model Todo 1、定义模块
type Todo struct {ID     int    `json:"id"`Title  string `json:"title"`Status bool   `json:"status"`
}

2.创建数据库
bubble:sql CREAT DATABASE bubble
3.连接数据库

// 包装成一个函数 //下载依赖 _ "github.com/jinzhu/gorm/dialects/mysql"
func initMYSQL() (err error) {dsn := "root:123456@(127.0.0.1:3306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"DB, err = gorm.Open("mysql", dsn) //初始化全局变量DB,不能用DB, err := gorm.Open("mysql", dsn)if err != nil {return}return DB.DB().Ping() //是否ping得通
}//3.连接数据库err := initMYSQL()if err != nil {panic(err) //连接数据库失败}

4. 模型绑定,自动创建表 表名字Todos表结构

	DB.AutoMigrate(&Todo{})

5.整体全部后端逻辑与请求

package mainimport ("github.com/gin-gonic/gin""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql""net/http"
)// Model Todo 1、定义模块
type Todo struct {ID     int    `json:"id"`Title  string `json:"title"`Status bool   `json:"status"`
}// 初始化全局变量DB
var (DB *gorm.DB
)// 包装成一个函数 //下载依赖 _ "github.com/jinzhu/gorm/dialects/mysql"
func initMYSQL() (err error) {dsn := "root:123456@(127.0.0.1:3306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"DB, err = gorm.Open("mysql", dsn) //初始化全局变量DB,不能用DB, err := gorm.Open("mysql", dsn)if err != nil {return}return DB.DB().Ping() //是否ping得通
}func main() {r := gin.Default()//2.创建数据库 bubble:sql CREAT DATABASE bubble//3.连接数据库err := initMYSQL()if err != nil {panic(err) //连接数据库失败}defer DB.Close() //程序退出关闭数据库连// 模型绑定,自动创建表 表名字Todos表结构DB.AutoMigrate(&Todo{})//静态文件资源加载r.Static("/static", "./static")//加载资源文件r.LoadHTMLGlob("templates/*")r.GET("/index", func(c *gin.Context) {c.HTML(200, "index.html", nil)})//v1v1Group := r.Group("v1"){//待办事项//添加 事项v1Group.POST("/todo", func(c *gin.Context) {//前端页面填写待办事项 点击提交 会发送请求到这里//1.从请求中把数据拿出来var todo Todo     //声明一个Todo类型的结构体 todoc.BindJSON(&todo) //将数据从请求中取出BindJSON 数据json格式,存入变量todo//2.存入数据库 DB.Create()//err := DB.Create(&todo).Error//if err != nil {////}//3.反应具体响应if err = DB.Create(&todo).Error; err != nil {c.JSON(http.StatusOK, gin.H{"error": err.Error()})} else {c.JSON(http.StatusOK, todo) //数据插入数据库成功 直接返回todo变量//c.JSON(http.StatusOK, gin.H{//	"code": 2000,//	"msg":  "success",//	"data": todo,//}) //数据插入数据库成功 直接返回todo变量,前端要求返回的格式}})//查看所有待办事项,页面显示菜单v1Group.GET("/todo", func(c *gin.Context) {//查询todo这个表里面所有数据var todolist []Todo //声明一个Todo结构体类型的切片 todolostif err = DB.Find(&todolist).Error; err != nil {c.JSON(http.StatusOK, gin.H{"error": err.Error()})} else {c.JSON(http.StatusOK, todolist)//c.JSON(http.StatusOK, gin.H{//	"code": 2000,//	"msg":  "success",//	"data": todolost,//})}})//查看某一个代办事项v1Group.GET("/todo/:id", func(c *gin.Context) {// 该项目未使用})//修改,更新  肯定是某一个ID事项v1Group.PUT("/todo/:id", func(c *gin.Context) {id, _ := c.Params.Get("id") //拿到请求路径的idvar todo Todo//通过id 从数据库 查询到对应的数据if err = DB.Where("id=?", id).First(&todo).Error; err != nil {c.JSON(http.StatusOK, gin.H{"error": err.Error()})}c.BindJSON(&todo) //BindJSON 将数据从请求中取出 数据json格式,存入变量todoif err = DB.Save(&todo).Error; err != nil {c.JSON(http.StatusOK, gin.H{"error": err.Error()})}})//删除  肯定是某一个ID事项v1Group.DELETE("/todo/:id", func(c *gin.Context) {//从库里面删除id, _ := c.Params.Get("id") //拿到请求路径的id//var todo Todo//通过id 从数据库 删除对应的数据if err = DB.Where("id=?", id).Delete(&Todo{}).Error; err != nil {c.JSON(http.StatusOK, gin.H{"error": err.Error()})} else {c.JSON(http.StatusOK, gin.H{id: "delteted",})}})}r.Run(":8080")
}

三、企业级项目结构拆分

3.1 controller层

1.controller层面里面 不写具体逻辑 只调用具体的逻辑 像logic层
url --> controller --> logic --> model
请求来了 --> 控制器 -->业务逻辑层 复杂 --> 模型层的具体的增删改查**

main 里面的路由请求全部放到controller层。
在这里插入图片描述
controller层的函数结构:如下
在这里插入图片描述

3.2 logic 层

由于这个清单项目比较简单,可以直接从controller操作dao层的函数处理

3.3 dao层

1、定义模块

// Model Todo 1、定义模块
type Todo struct {ID     int    `json:"id"`Title  string `json:"title"`Status bool   `json:"status"`
}

2.具体的数据库操作放置

Todo 的增删改查操作都会放在这里


// CreatATodo 创建todo
func CreatATodo(todo *Todo) (err error) {if err = dao.DB.Create(&todo).Error; err != nil {return err}return
}// 查询 全部数据 函数
func Getlisttodo() (todolist []*Todo, err error) {if err = dao.DB.Find(&todolist).Error; err != nil {return nil, err}return
}// 通过id 查询到某个数据
func GetAtodo(id string) (todo *Todo, err error) {//通过id 从数据库 查询到对应的数据todo = new(Todo)err = dao.DB.Where("id=?", id).First(&todo).Errorif err != nil {return nil, err}return
}// 通过id 查询到某个数据后,再更新改数据的
func UpdataAtodo(todo *Todo) (err error) {err = dao.DB.Save(&todo).Errorreturn
}
func DeltetAtodo(id string) (err error) {if err = dao.DB.Where("id=?", id).Delete(&Todo{}).Error; err != nil {return}return
}

3.4 model层

数据库连接包装

package daoimport "github.com/jinzhu/gorm"// 数据库连接
// 初始化全局变量DB
var (DB *gorm.DB
)// 包装成一个函数 //下载依赖 _ "github.com/jinzhu/gorm/dialects/mysql"
func InitMYSQL() (err error) {dsn := "root:123456@(127.0.0.1:3306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"DB, err = gorm.Open("mysql", dsn) //初始化全局变量DB,不能用DB, err := gorm.Open("mysql", dsn)if err != nil {return}return DB.DB().Ping() //是否ping得通
}func Close() {DB.Close()
}

总结

bubble小清单项目 前端Vue不是很熟悉,要加强对前端代码的理解。后端框架的操作,遇事不决,先写注释。继续学习进阶Go web 。

这篇关于基于gin+Grom的Goweb框架bubble清单项目的记录与理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/411165

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF