Go Web下GORM框架使用(二)

news2024/11/23 13:08:03

〇、前言

本文将会写一个前后端分离的的小项目,本文将会只实现后端。
在这里插入图片描述

一、定义全局变量与模型

本文需要一个数据库,因此将这个数据库定义为全局变量将会非常轻松。

var (
	DB *gorm.DB
)

type Todo struct {
	ID     int    `json:"id"`
	Title  string `json:"title"`
	Status bool   `json:"status"`
}

二、建立数据库

database create bubble;
use bubble;

可以看到,已经创建了 一个名为bubble的mysql数据库:
在这里插入图片描述

三、连接数据库

在 gorm 框架下,对于 mysql 等多种数据库的使用极其方便:

func initMySQL() (err error) {
	// 连接数据库
	dsn := "root:pwd@tcp(127.0.0.1:3306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"
	DB, err = gorm.Open("mysql", dsn)
	if err != nil {
		return err
	}
	// 判断是否连通
	return DB.DB().Ping()
}

四、载入前端静态文件

部署一个项目,假设前端可靠,那么就可以放心得写后端了:

// 连接数据库
	err := initMySQL()
	if err != nil {
		panic(err)
	}
	// 模型绑定
	DB.AutoMigrate(&Todo{}) // todos
	defer func(DB *gorm.DB) {
		err := DB.Close()
		if err != nil {
			panic(err)
		}
	}(DB)

	r := gin.Default()
	r.Static("/static", "/Users/***/GoLand/gin_practice/chap18/static")
	r.LoadHTMLGlob("/Users/***/GoLand/gin_practice/chap18/templates/*")
	r.GET("/bubble", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil)
	})

五、路由组的实现

我们可以根据前端的各种请求,写一个路由组:

v1Group := r.Group("v1")
	{
		// 待办事项
		v1Group.POST("/todo", func(c *gin.Context) {
			

		})
		// 查看所有的待办事项
		v1Group.GET("/todo", func(c *gin.Context) {
			
		})
		// 查看某一个待办事项
		v1Group.GET("/todo/:id", func(c *gin.Context) {

		})
		// 修改(更新) 某一个事项
		v1Group.PUT("/todo/:id", func(c *gin.Context) {
			
		})
		// 删除
		v1Group.DELETE("/todo/:id", func(c *gin.Context) {
			
		})

	}

六、功能的实现

添加事项:

	v1Group.POST("/todo", func(c *gin.Context) {
			// 前端页面提交待办事项,接受请求
			// 返回响应
			var todo Todo
			c.BindJSON(&todo)
			// 从请求中把数据捞出来,存储到数据库
			if err := DB.Create(&todo).Error; err != nil {
				// 失败时的响应
				c.JSON(http.StatusOK, gin.H{
					"err": err.Error(),
				})
				return
			} else {
				// 成功的响应
				c.JSON(http.StatusOK, todo)
				//c.JSON(http.StatusOK, gin.H{
				//	"code": 2000,
				//	"msg":  "Ok",
				//	"data": todo,
				//})
			}

		})

查询事项:

	v1Group.GET("/todo", func(c *gin.Context) {
			// 查询todo数据库中的数据所有的数据
			var todoList []Todo
			if err = DB.Find(&todoList).Error; err != nil {
				// 如果出错
				c.JSON(http.StatusOK, gin.H{
					"err": err.Error(),
				})
				return
			} else {
				// 如果成功
				c.JSON(http.StatusOK, todoList)

			}
		})

修改事项:

	v1Group.PUT("/todo/:id", func(c *gin.Context) {
			// 拿到 id,然后查询,修改
			id, ok := c.Params.Get("id")
			if !ok {
				c.JSON(http.StatusOK, gin.H{
					"error": "id不存在",
				})
				return
			}
			var todo Todo
			if err = DB.Where("id=?", id).First(&todo).Error; err != nil {
				// 如果出错
				c.JSON(http.StatusOK, gin.H{
					"err": err.Error(),
				})
				return

			} // 更新
			c.BindJSON(&todo)
			if err = DB.Save(&todo).Error; err != nil {
				c.JSON(http.StatusOK, gin.H{
					"error": err.Error(),
				})
				return

			}
			// 成功
			c.JSON(http.StatusOK, todo)
		})

删除事项:

		v1Group.DELETE("/todo/:id", func(c *gin.Context) {
			// 拿到 id,然后查询,修改
			id, ok := c.Params.Get("id")
			if !ok {
				c.JSON(http.StatusOK, gin.H{
					"error": "id不存在",
				})
				return
			}
			var todo Todo
			if err = DB.Where("id=?", id).Delete(&todo).Error; err != nil {
				// 如果出错
				c.JSON(http.StatusOK, gin.H{
					"err": err.Error(),
				})
				return
			}
			// 成功
			c.JSON(http.StatusOK, todo)
		})

这样,就完成了整个项目的后端处理。

七、运行起来的样子

点击运行,可以看到一个还算清爽的界面(前端写得好,与我无瓜):

在这里插入图片描述
添加几个事项:
在这里插入图片描述
查看一下数据库:

在这里插入图片描述
可以看到,数据库成功地将前端提交的表达做了持久化存储。再标记几个已完成:

在这里插入图片描述
再看看数据库:

在这里插入图片描述
可以看到成功地将 status 标记成了 1。撤销看看:

在这里插入图片描述

数据库:
在这里插入图片描述
删除看看:

在这里插入图片描述

数据库:

在这里插入图片描述
可以看到,后端的功能都正常。

全文完,感谢阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/609547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C#图解教程】第六章 方法(下)

输出参数 函数的输出只有返回值有时不太够,此时需要用到输出参数,用修饰词out声明 输出参数的要求与引用参数类似,需要是变量,此外,输出参数也是实参的别名,指向堆中同一对象。 输出参数与引用参数的不同在…

【实用篇】Elasticsearch03

文章目录 分布式搜索引擎031.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric聚合语法1.2.5.小结 1.3.RestAPI实现聚合1.3.1.API语法1.3.2.业务需求1.3.3.业务实现 2.自动补全2.1.拼音分词器2.2.自定义分词器2.3.…

【人工智能】— Support Vector Machines 支持向量机

【人工智能】— Support Vector Machines 支持向量机 支持向量机概述支持向量机支持向量机原理介绍分类间距(Classification Margin) 支持向量机概述 找到使间隔最大化的超平面>B1比B2更好 支持向量机 研究起因:如何找到最优的切分面 分…

制作酷炫可视化大屏利器--分享10种比较流行的开源免费的图表库

在开发可视化项目的过程中往往涉及到可视化图表, 多酷炫的报表, 大屏, 都用了非常多的图表, 接下来我和大家分享一些比较流行的开源免费的图表库. 分享10种比较流行的开源免费的图表库 1,Frappe Charts2,Recharts3,Protovis4,dygr…

Docker快速入门(分分钟钟就能上手)

Docker的思想 集装箱:会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿到这个集装箱就可以了。标准化: 运输的标准化:Docker有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环…

设计模式-01.设计思想

设计思想 此系列文章非本人原创,是学习笔记。 下面讲一些常见的设计思想 基于接口而非实现编程 这个原则非常重要,是一种非常有效的提高代码质量的手段,在平时的开发中特别经常被用到。 如何解读原则中的“接口”二字? “基于…

python面向对象操作1(速通版)

目录 一、高阶函数 1.lambda函数 2.lambda函数注意事项 3.map用法 4.map和lambda函数配合 二、reduce函数 1.reduce基本应用 2.reduce和匿名函数配合 三、filter()函数 1.简单用法 2.高阶应用 四、列表排列方法(key和lambda问题) 1.正常排序…

Node服务器和常见模块

1 Node服务器开发 2 fs模块-文件系统 3 event模块-事件处理 4 认识二进制和buffer 5 Buffer的创建方式 6 Buffer的源码解析 node 的fs模块操作: 这里主要讲node如何进行读取文件,操作文件。服务器该有的操作node都有。 node的fs读取文本文件内容的d…

自定义starter

第一步、创建 xxx-spring-boot-starter 的spring Initializr模块 第二步、删除不需要的内容&#xff08;启动类、除下面spring-boot-starter的其它依赖&#xff0c;maven编译插件&#xff09; <dependency><groupId>org.springframework.boot</groupId><…

linux理解软硬链接

软硬连接 在linux下面链接文件有两种&#xff0c;一种是类似window的快捷方式功能的文件&#xff0c;可以让你快速链接到目标文件&#xff08;或目录&#xff09;&#xff0c;叫做软链接&#xff0c;另一种则是通过文件系统的inode链接来产生新的文件名&#xff0c;而不是产生…

Linux 常用开发工具(yum、vim)

绪论 耐心是一切聪明才智的基础。—— 柏拉图。本章进入到Linux下的一些常用的工具&#xff0c;这些工具能帮助我们去更好的使用Linux操作系统。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 附&#xff1a;红色&#xff0c;部分为重点部分&a…

[MAUI程序设计] 用Handler实现自定义跨平台控件

文章目录 Handler与Xamarin.Forms实现的区别为什么要用Handler代替Renderer解耦生命周期管理更细粒度的控制 用Effect来实现呢&#xff1f;自定义手势监听控件在各平台上实现TouchRecognizeriOS中的实现Android中的实现Windows中的实现 创建控件使用控件最终效果项目地址 今天来…

使用 Kubeadm 和 CRI-O 在 Rocky Linux 8 上安装 Kubernetes 集群

在 Rocky Linux 8 上安装 Kubernetes 集群。毫无疑问&#xff0c;Kubernetes 将继续改变我们大规模部署和管理业务应用程序的方式。无论用于部署应用程序的模型是手动还是通过 CI/CD 管道&#xff0c;Kubernetes 仍然是处理编排、管理和扩展应用程序的最佳选择。 对于那些不知…

一劳永逸的方法解决函数scanf报错问题

目录 scanf报错示例 代码 报错提醒 报错翻译 解决方案1&#xff08;不建议&#xff09;:将scanf换成scanf_s&#xff1b; 解决方案2&#xff08;临时解决&#xff09;&#xff1a; 解决方案3&#xff08;建议&#xff09;&#xff1a; 方法1&#xff08;建议&#xff09…

javaScript蓝桥杯----资讯接口

目录 一、介绍二、准备三、目标四、代码五、知识点1.res.end()2.res.end与res.send 六、完成 一、介绍 随着技术的发展&#xff0c;很多前端工程师已经不满足于只做诸如页面布局和交互这些开发工作了&#xff0c;很多人将目光逐渐转向了“大前端”范围&#xff0c;其中就包括不…

Vim学习笔记【Ch03】

Vim学习笔记 系列笔记链接Ch03 Searching FilesVim中打开和编辑文件用Find进行文件搜索用grep进行文件内搜索:vim搜索:grep搜索 通过Netrw浏览文件Fzffzf和ripgrep安装fzf配置fzf语法查找文件在文件内部查找用Rg代替Grep在多个文件中搜索和替换 小结 系列笔记链接 Ch00&#x…

【论文速览】根据人脑fMRI信号重建图像 Image Reconstruction from human brain activity

文章目录 前言文章一研究背景主要方法部分实验结果总结与思考参考资料 文章二研究背景主要方法部分实验结果总结与思考 前言 人类的视觉神经系统对于真实世界的视觉刺激有着非凡的感知与理解能力&#xff0c;比如我们能够准确地识别物体距离和三维几何关系等&#xff0c;这是当…

2023/6/4总结

CSS的学习&#xff1a; 2023-06-01 19-57-46-649 移动开发流式布局&#xff1a; 流式布局&#xff0c;是根据百分比布局&#xff0c;因为手机的尺寸会不一样&#xff0c;所以利用百分比布局可以很好的解决缩放以及尺寸问题&#xff1a; 这是跟着视频做的一个案例&#xff1a;…

Lecture 8 Deep Learning for NLP: Recurrent Networks

目录 Problem of N-gram Language Model N-gram 语言模型的问题Recurrent Neural Network(RNN) 循环神经网络RNN Language Model: RNN 语言模型Long Short-Term Memory Model (LSTM) 长短期记忆模型&#xff08;LSTM&#xff09;Gating Vector 门向量Forget Gate 忘记门Input G…

ChatGPT 使用 拓展资料:大模型时代的开发者新机遇

ChatGPT 使用 拓展资料:大模型时代的开发者新机遇