go+vue——基于gin框架和gorm的web开发实战

2023-11-15

go+vue——基于gin框架和gorm的web开发实战

gin框架

视频、资料、笔记

Go web开发系列教程,基于Gin框架和GORM的练手小项目。
视频中博客地址:https://liwenzhou.com
源码地址:https://github.com/Q1mi/bubble
笔记gitee

安装Go环境, 添加环境变量(可能自动添加好)

下载 Go

B站视频

  1. 安装 go 的环境,菜鸟教程
  2. 安装 数据库 mysql
  3. 安装一个测试工具 , postman / apipost
  4. golang / vscode
  5. navicat

https://www.kancloud.cn/shuangdeyu/gin_book/949412

https://gorm.io/zh_CN/docs/

环境变量

在这里插入图片描述
D:\Dsoftware\go\install2\Go\bin

在这里插入图片描述

goland 报错: GOROOT is not defined

go故障排查集锦 : https://www.cnblogs.com/chalon/p/15151474.html
在这里插入图片描述

C:\Users\Administrator> go env |findstr GOROOT
set GOROOT=D:\Dsoftware\go\install2\Go

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建项目:

Golang中的GoPath和GoModule

https://blog.csdn.net/delete_you/article/details/128693981

什么是GoPath?

GoPath是Golang的工作空间,所有的Go文件,都需要放在GoPath下的src目录下才能够编译运行,所以我提议不要直接配置全局的GoPath目录,否则会非常难以管理所有的Golang项目。

但是在另一篇博客Golang连接MySQL数据库之CRUD中,我也提到过,我们在项目中使用第三方类库的时候,可以使用go get命令从网下直接拉去第三方类库的包,而拉取下来的包就会直接下载到我们的GoPath目录下的src包下。

这样就导致了一个问题,我们自己的Golang代码,和第三方的Golang文件混在了一起,这对于我们管理Golang项目的包显然是非常麻烦的,而且每个如果项目都需要同样的依赖,那么我们就会在不同的GoPath的src中下载大量重复的第三方依赖包,这同样会占用大量的磁盘空间。

优缺点

我们给不同的项目设置不同的GoPath,优点非常明显:

便于管理项目,每个项目都是不同的GoPath,这对于我们管理多个Golang项目而言,能够非常清晰的处理项目结构。如果我们把所有项目都放在同一个GoPath的src包下,那么项目的结构就会变得非常混乱,难以管理。

但是当我们需要依赖第三方的包的时候,不同的项目设置不同的GoPath的缺点也非常明显:

第三方依赖的包和我们自己的Golang包混在一起,会给我们的项目文件管理带来一定的麻烦。
不同的GoPath都需要下载依赖,那么磁盘中重复的依赖就会非常多,会占用我们大量的磁盘空间。
所以,究竟是设置一个GoPath目录,解决依赖重复的问题,还是设置不同的GoPath目录,解决Golang项目结构混乱的问题,这是一个有争议性的问题。

为了解决这所有的问题,Golang最终引入了GoModule的概念。

什么是GoModule?

GoModule是Golang在1.11版本初步引入的概念,在1.12版本中正是开始使用,所以如果需要使用GoModule,那么需要保证你的Golang的版本在1.12或以上。
另外需要说一下,Golang1.11和1.12版本虽然已经引入了GoModule的概念,但是GoModule是默认不开启的,如果需要开启,那么需要配置一个环境变量:GO111MODULE=on,默认是off。

而在Golang1.13及以上的版本中,GoModule的默认配置为auto,即GoModule会通过你的目录下是否有go.mod文件来判断是否开启GoModule。所以Golang1.13+的版本中我们就不需要配置GO111MODULE属性了。
所以如果你使用GoModule,那么就直接使用Golang1.13+的版本好了!

那么究竟什么是GoModule?

其实说得直白一下,GoModule就是一个用来取代GoPath的Golang的工作空间。
我们之前说过,所有的Golang的文件,都需要放在GoPath目录下才能进行正确的编译和运行,而有了GoModule之后,那么我们就可以把文件放在GoModule目录下,而放在GoModule目录下的Golang文件,也可以正确地编译运行。

那么我们有了GoModule之后,GoPath是不是就可以被舍弃了?

不是的!

我们之前说过,GoPath所引出的问题,就是因为第三方类库的包所导致的,所以我们在有了GoModule之后,GoPath和GoModule就分别负责不同的职责,共同为我们的Golang项目服务。

GoPath我们用来存放我们从网上拉取的第三方依赖包。
GoModule我们用来存放我们自己的Golang项目文件,当我们自己的项目需要依赖第三方的包的时候,我们通过GoModule目录下的一个go.mod文件来引用GoPath目录src包下的第三方依赖即可。

这样依赖,既解决了原来只能局限在GoPath目录src包下进行编程的问题,也解决了第三方依赖包难以管理和重复依赖占用磁盘空间的问题。

总而言之,在引入GoModule之后,我们不会直接在GoPath目录进行编程,而是把GoPath作为一个第三方依赖包的仓库,我们真正的工作空间在GoModule目录下。

GoModule的设置

参考教材
https://www.jb51.net/article/236436.htm

Goland项目使用gomod配置

手把手2022版本,

Goland 项目创建
https://blog.csdn.net/delete_you/article/details/128693981

goland2020.3 及以上 IDE,默认创建的 go 项目 就是使用 gomod 管理!
goland2020.3 及以下的 IDE,创建项目时需要选择 带小括号 vgo 的才是 gomod 管理模式

Environment GOPROXY=https://goproxy.cn

https://goproxy.cn
GOPROXY=https://goproxy.cn,direct

在这里插入图片描述

其他, 不一定需要

检查 是否可以 运行程序

在这里插入图片描述

web 本质 : net/http介绍

课件、教程

https://liwenzhou.com
https://www.liwenzhou.com/posts/Go/golang-menu/
https://www.liwenzhou.com/posts/Go/http/
在这里插入图片描述
在这里插入图片描述

启动

在这里插入图片描述

读文件

在这里插入图片描述
在这里插入图片描述

gin

下载 安装

下载并安装Gin:

go get -u github.com/gin-gonic/gin

在这里插入图片描述

使用 gin

在这里插入图片描述

RESTful API

RESTful API
REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。

推荐阅读阮一峰 理解RESTful架构

简单来说,REST的含义就是客户端与Web服务器之间进行交互的时候,使用HTTP协议中的4个请求方法代表不同的动作。

GET用来获取资源
POST用来新建资源
PUT用来更新资源
DELETE用来删除资源。
只要API程序遵循了REST风格,那就可以称其为RESTful API。目前在前后端分离的架构中,前后端基本都是通过RESTful API来进行交互。

例如,我们现在要编写一个管理书籍的系统,我们可以查询对一本书进行查询、创建、更新和删除等操作,我们在编写程序的时候就要设计客户端浏览器与我们Web服务端交互的方式和路径。按照经验我们通常会设计成如下模式:

请求方法 URL 含义
GET /book 查询书籍信息
POST /create_book 创建书籍记录
POST /update_book 更新书籍信息
POST /delete_book 删除书籍信息
同样的需求我们按照RESTful API设计如下:

请求方法 URL 含义
GET /book 查询书籍信息
POST /book 创建书籍记录
PUT /book 更新书籍信息
DELETE /book 删除书籍信息
在这里插入图片描述

Postman

https://www.postman.com/

在这里插入图片描述
在这里插入图片描述

Go语言标准库之template

Go语言的模板引擎

Go语言内置了文本模板引擎text/template和用于HTML文档的html/template。它们的作用机制可以简单归纳如下:

模板文件通常定义为.tmpl和.tpl为后缀(也可以使用其他的后缀),必须使用UTF8编码。
模板文件中使用{{和}}包裹和标识需要传入的数据。
传给模板这样的数据就可以通过点号(.)来访问,如果数据是复杂类型的数据,可以通过{ { .FieldName }}来访问它的字段。
除{{和}}包裹的内容外,其他内容均不做修改原样输出。

在这里插入图片描述

模板引擎的使用

定义模板文件
其中,定义模板文件时需要我们按照相关语法规则去编写,后文会详细介绍。

解析模板文件
上面定义好了模板文件之后,可以使用下面的常用方法去解析模板文件,得到模板对象:

func (t *Template) Parse(src string) (*Template, error)
func ParseFiles(filenames ...string) (*Template, error)
func ParseGlob(pattern string) (*Template, error)
当然,你也可以使用func New(name string) *Template函数创建一个名为name的模板,然后对其调用上面的方法去解析模板字符串或模板文件。

模板渲染
渲染模板简单来说就是使用数据去填充模板,当然实际上可能会复杂很多。

func (t *Template) Execute(wr io.Writer, data interface{}) error
func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error

模板语法

{{.}} + 注释

模板语法都包含在{{和}}中间,其中{{.}}中的点表示当前对象。

当我们传入一个结构体对象时,我们可以根据.来访问结构体的对应字段。例如:
在这里插入图片描述

在这里插入图片描述

变量

在这里插入图片描述

移除空格

在这里插入图片描述

条件

在这里插入图片描述

比较

在这里插入图片描述

循环

slice idx, value
map key, value

slice

在这里插入图片描述

range else

在这里插入图片描述

with

在这里插入图片描述
类似于
在这里插入图片描述

预定义 函数 index

在这里插入图片描述

自定义函数

在这里插入图片描述

报错: 模板 名字不一样

在这里插入图片描述
在这里插入图片描述

自定义函数

在这里插入图片描述
在这里插入图片描述

模板嵌套

在这里插入图片描述

三种模板

在这里插入图片描述

先写 父亲, 再写 孩子

在这里插入图片描述

模板继承 block

绝大多数 模板一样

在这里插入图片描述
在这里插入图片描述

block 定义 块 , 作为 base

在这里插入图片描述

define 重新定义模板,

在这里插入图片描述

父模板 写前面, 根模板 写后面

在这里插入图片描述

ExecuteTemplate 指定哪个模板, 不是 之前的 Execute

在这里插入图片描述

将数据 传递 子模板 , 加一个 “.”

在这里插入图片描述

模板冲突 解决
如果我们的模板名称冲突了,例如不同业务线下都定义了一个index.tmpl模板,我们可以通过下面两种方法来解决。

在模板文件开头使用{{define 模板名}}语句显式的为模板命名。
可以把模板文件存放在templates文件夹下面的不同目录中,然后使用template.ParseGlob("templates/**/*.tmpl")解析模板。

在这里插入图片描述

修改默认 标识符 分隔符 delimiter

在这里插入图片描述

htmp/template 安全 转移 防止攻击

在这里插入图片描述

自定义函数 解决 是否需要 转义, 执行HTML调用 template.HTML

在这里插入图片描述

调用 自定义 函数 , 利用 管道 {{{}} | safe , 在 解析模板 之前定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Gin

HTML

http.Status

在这里插入图片描述

go mod tidy , download

在这里插入图片描述

在这里插入图片描述

gin.H 本质 map

在这里插入图片描述

路由 一定要对应

在这里插入图片描述

重名
define end

在这里插入图片描述

templates/**/* 两级目录:第一级为 template,第三级为 .tmpl 文件

在这里插入图片描述

自定义模版函数 , 解析模板之前定义,
参数

在这里插入图片描述

管道

在这里插入图片描述

定义 函数

在这里插入图片描述

静态文件

静态文件 : css 、 js文件 、图片

static 文件夹

在这里插入图片描述

加载静态文件

参数:
第一个: HTML 文件 中 , 引入
第二个: 本地路径
当发现 HTML 中 xxx 开头 , 就会从 ./static 中 寻找
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

不支持 block 继承, 用其他方法 ----------------------------------------------------- 没有学
HTML5 模板 下载

HTML5 模板
https://sc.chinaz.com/tag_moban/html5.html

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

posts/home.html 给模板名字 没有起名字的时候, 默认是 文件名 home.html

在这里插入图片描述

在 <link href = “xxx/css/…” , <scripe src=“xxx/js/…”

在这里插入图片描述
在这里插入图片描述

在 <scripe src=“xxx/js/…”

在这里插入图片描述
在这里插入图片描述

<img src=“xxx/picture/…”

在这里插入图片描述
在这里插入图片描述

gin 返回 json

使用 map

在这里插入图片描述

使用 gin.H


在这里插入图片描述

结构体

在这里插入图片描述
在这里插入图片描述

结构体 小写 不可导出 , json反射 解包 、 反序列化

在这里插入图片描述

在这里插入图片描述

GET 参数? : GET 请求, gin 获取 query string , 没有HTML文件

在这里插入图片描述

在这里插入图片描述

Query(“”) -> “”

在这里插入图片描述

在这里插入图片描述

DefaultQuery(“”, “默认”) -> “”

在这里插入图片描述

GetQuery(“”) -> “”

在这里插入图片描述
在这里插入图片描述

两个参数 Query(“”) -> “” 英文 & 链接

在这里插入图片描述

在这里插入图片描述

POST 请求, gin 获取 form 请求 , 一次请求, 一个响应, 必须有HTML文件 指定 使用 POST方法

首页 显示 的 是 GET 请求 得到的, 发 GET 的 /login
表单 form 的 action 写 login ,则发给 POST 的/login

在这里插入图片描述

PostForm(“”) -> “”

在这里插入图片描述

DefaultPostForm(“”, “默认”) -> “”,
找到,没有填写,是空串 “”

在这里插入图片描述

找不到 返回 默认值

在这里插入图片描述

GetPostForm(“”) -> “”

在这里插入图片描述

地址/login + HTML method 请求方法POST GET => 同时确定 调用哪个函数

获取 PATH ,URL 路径参数,

返回都是 string 类型

在这里插入图片描述
在这里插入图片描述

冲突 : 路由 的 匹配 冲突

在这里插入图片描述

不一样

在这里插入图片描述

参数 绑定 ShouldBind : POST form | GET queryString | JSON 都可以取: 结构体 及其成员 大写 、 json 反射 、传入&指针

ShouldBind 、 BindForm 、 BindJSON
在这里插入图片描述

为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryString、form表单、JSON、XML等参数到结构体中。 下面的示例代码演示了.ShouldBind()强大的功能,它能够基于请求自动提取JSON、form表单和QueryString类型的数据,并把值绑定到指定的结构体对象。

ShouldBind会按照下面的顺序解析请求中的数据完成绑定:

如果是 GET 请求,只使用 Form 绑定引擎(query)。
如果是 POST 请求,首先检查 content-type 是否为 JSON 或 XML,然后再使用 Form(form-data)。
文件上传

GET queryString 方式

在这里插入图片描述
在这里插入图片描述

POST queryString 方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原始 row -> JSON

在这里插入图片描述
在这里插入图片描述

反射 、 写全: 一一对应前段JSON
不对应,拿不到数据

在这里插入图片描述

在这里插入图片描述

一一对应,拿到数据

在这里插入图片描述
在这里插入图片描述

上传文件

enctype=“mutipart/form-data” 上传文件 : 二进制 方式 : 图片、音乐

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

运行结果

在这里插入图片描述

在这里插入图片描述

限制 内存
多个文件 上传 for 循环

在这里插入图片描述

重定向

HTTP: c.Redirect(http.StatusMovedPermanently, “http://ww.sogo.com”)
站外 地址改变, 永久 StatusMovedPermanently

在这里插入图片描述

路由 重定向 : r.HandleContext(“\b”) 后续处理

在这里插入图片描述

站内 地址 不变

在这里插入图片描述

路由 路由组

/index GET 请求 : 获取 信息: 查看购物车 数据。 这一条处理, 称为路由
POST 创建某个信息: 一般用来表单form: 上传文件、用户密码表单、订单
PUT 更新 数据: 局部更新、改购物车
DELETE API 涉及: 删除
Any: 处理 任意 请求方法

在这里插入图片描述
在这里插入图片描述

NotFound

在这里插入图片描述
在这里插入图片描述

NoRoute

在这里插入图片描述

路由组

在这里插入图片描述

嵌套

在这里插入图片描述

Gin中间件

Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用

在这里插入图片描述

先调用 , 后调用

在这里插入图片描述

计时

在这里插入图片描述
在这里插入图片描述

r.Use() 全局注册 : 中间件 函数 , 批量

在这里插入图片描述
在这里插入图片描述

c.next()

在这里插入图片描述
在这里插入图片描述

c.Abort

在这里插入图片描述

在这里插入图片描述

加 return

在这里插入图片描述
在这里插入图片描述

权限 中间件

在这里插入图片描述

闭包 (携带 参数)

为路由组 注册

在这里插入图片描述
在这里插入图片描述

跨中间件 存取 值 : eg 拿到 这个 用户
c.Set c.Get

在这里插入图片描述
在这里插入图片描述

c.Get : 需要判断 是否拿到

在这里插入图片描述

c.MustGet 不想判断,是否拿到

在这里插入图片描述

c.GetString

在这里插入图片描述

默认 中间件

在这里插入图片描述
在这里插入图片描述

r.new()不包含 任何 中间件

在这里插入图片描述

goRouting 多线程
c.Copy() 保证 c.Next() 也拷贝一份

在这里插入图片描述

G-ORM

https://www.liwenzhou.com/posts/Go/golang-menu/

链接MySQL

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import “_” 表示 用到了 其中的 初始化 方法

在这里插入图片描述

指定 数据库 类型

在这里插入图片描述

连接 SQL 服务 Open

在这里插入图片描述

加入 解析时间 本地时间

parseTime是查询结果是否自动解析为时间。loc是MySQL的时区设置。
在这里插入图片描述

数据表 迁移

在这里插入图片描述

在这里插入图片描述

增删改查
查询 更新

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Model

在这里插入图片描述

定义模型

在这里插入图片描述
在这里插入图片描述

Tag 标识: 结构体标记

支持的结构体标记(Struct tags)

结构体标记(Tag) 描述
Column 指定列名
Type 指定列数据类型
Size 指定列大小, 默认值255
PRIMARY_KEY 将列指定为主键
UNIQUE 将列指定为唯一
DEFAULT 指定列默认值
PRECISION 指定列精度
NOT NULL 将列指定为非 NULL
AUTO_INCREMENT 指定列是否为自增类型
INDEX 创建具有或不带名称的索引, 如果多个索引同名则创建复合索引
UNIQUE_INDEX 和 INDEX 类似,只不过创建的是唯一索引
EMBEDDED 将结构设置为嵌入
EMBEDDED_PREFIX 设置嵌入结构的前缀

  • 忽略此字段

关联相关标记(tags)

结构体标记(Tag) 描述
MANY2MANY 指定连接表
FOREIGNKEY 设置外键
ASSOCIATION_FOREIGNKEY 设置关联外键
POLYMORPHIC 指定多态类型
POLYMORPHIC_VALUE 指定多态值
JOINTABLE_FOREIGNKEY 指定连接表的外键
ASSOCIATION_JOINTABLE_FOREIGNKEY 指定连接表的关联外键
SAVE_ASSOCIATIONS 是否自动完成 save 的相关操作
ASSOCIATION_AUTOUPDATE 是否自动完成 update 的相关操作
ASSOCIATION_AUTOCREATE 是否自动完成 create 的相关操作
ASSOCIATION_SAVE_REFERENCE 是否自动完成引用的 save 的相关操作
PRELOAD 是否自动完成预加载的相关操作

快捷键

在这里插入图片描述

默认 约定

在这里插入图片描述

主键 、 : 默认 将 结构体 中 ID 作为主键

在这里插入图片描述

表名、 : 结构体 复数 + 小写

在这里插入图片描述
在这里插入图片描述

不会 删除表、 不会 删除数据

在这里插入图片描述

禁用 复数

在这里插入图片描述
在这里插入图片描述

指定表名

在这里插入图片描述

修改【默认】表名 规则 (加前缀,最好小写), 但是 【唯一指定TableName】 不受影响

在这里插入图片描述
在这里插入图片描述

列名 执行

在这里插入图片描述
在这里插入图片描述

安全: 修改、删除: 增加列、 增加表、

时间戳

DeleteAt : 软删除: 为空 , 表示存在; 删除时 设置DeleteAt;

CRUD

插入

判断主键 是否为空

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

默认值

没有默认值, 什么都不显示

在这里插入图片描述
在这里插入图片描述

在 原表基础上修改, 默认NULL

在这里插入图片描述
在这里插入图片描述

新表, 通过 tag 指定

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

默认排除 : 没有 值 或 值为零 的字段

在这里插入图片描述

在这里插入图片描述

所有: 零值 : 0 “” False, 不会存到数据库, 使用他们的默认值 存数据库

指定 设置 存 零值

字符串 指针 new string

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

sql.NullString
一个结构体

在这里插入图片描述

按住 Alt + command

在这里插入图片描述

使用方式

在这里插入图片描述
在这里插入图片描述

PG : PostgreSQL 支持 冲突 合并

在这里插入图片描述

查询 : 传出

First : 根据 字段 ID 进行排序 ,ID必须为 int 整型; 同 Last

在这里插入图片描述
在这里插入图片描述

make : channel、map、slice ; new 其他 基本数据类型

在这里插入图片描述

Take 随机

Find : 传入 slice 指针

在这里插入图片描述

软删除 Debug

在这里插入图片描述

条件 查询 : 传出&

在这里插入图片描述

等于 = , 不等于 <> , IN ( ? )

Struct Map slice 查询 : 不查询 0 值, 使用 指针 或 sql.nullString

在这里插入图片描述
.

Not() not in ; Or() 或者 ; 内联 : 条件查询后面必须跟一个First() 立即查询 触发

在这里插入图片描述

额外查询 : Set 加锁

在这里插入图片描述

First Or Init 没查到则创建, 其他 默认 为 0值

在这里插入图片描述
在这里插入图片描述

attrs 没查到 gorm可以 给 一个值

在这里插入图片描述

assign 找没找到 ,都赋值给 struct

在这里插入图片描述

First Or Create 查不到 , 则创建 ; 仅支持 map struct

在这里插入图片描述
在这里插入图片描述

高级查询

子查询 expr

选择字段 Select

排序 order( , true) 覆盖排序

数量 limit

偏移 offset (-1) 表示取消

获取总数 count

Group Having 分组 : 条件比较 类似与where; having 拿算出来的sum(count) 去比较

Join

Pluck 查询某个字段 ; 多个列 用 Scan

链式查询, 不断 where

立即执行:

在这里插入图片描述

范围查询 : 写出 可重用 的数据库

在这里插入图片描述

多个立即查询, 后一个 复用 前一个 条件 ( 不包含 内联 条件)

内联 , 不用

在这里插入图片描述

前置条件

在这里插入图片描述

更新

save 默认修改 所有字段

在这里插入图片描述

update 仅修改指定字段

在这里插入图片描述

struct 不会更新 0值

在这里插入图片描述

更新 选定 select omit 忽略

select 指定一个

在这里插入图片描述

omit 排除一个

在这里插入图片描述

结果 updates 不同与前面 的 update

在这里插入图片描述

updateColumn 、批量 updateColumns : 无 hooks 更新 update字段

在这里插入图片描述

只会更新非零字段
RowAffected 返回 被更新 的 总数 ; 被影响 的行数

表达式更行

在这里插入图片描述

在这里插入图片描述

hook 钩子 :用户名 密码

在这里插入图片描述

SQL server 微软, 其他选项

在这里插入图片描述

row() scan()

在这里插入图片描述

删除

ID 主键 必须存在

在这里插入图片描述

在这里插入图片描述

如果没有 则 删除 【所有】 数据

在这里插入图片描述
在这里插入图片描述

所有 数据 都被删除

在这里插入图片描述

在这里插入图片描述

批量删除 匹配条件

where()

在这里插入图片描述

内联

在这里插入图片描述

软删除

Unscoped() 查看软删除

在这里插入图片描述

不加 deleted_at

在这里插入图片描述

加 deleted_at

在这里插入图片描述

物理删除 unscoped Delete

软删除 Delete

在这里插入图片描述

物理删除 unscoped Delete

在这里插入图片描述
在这里插入图片描述

没有 deleted_at 字段 , 就不能实现 软删除 ,一定是 物理删除

在这里插入图片描述

小清单

加载HTML : LoadHTMLGlob

在这里插入图片描述

有问题 浏览器 F12 : css js 文件 没有找到

在这里插入图片描述

指定 静态文件目录 Static(网络前缀, 本地目录)

在这里插入图片描述

逻辑讲解

在这里插入图片描述

post 、 get 、

在这里插入图片描述

delete 、put

在这里插入图片描述

数据库

全局变量 : 使用 = ; 创建局部变量 :=

在这里插入图片描述

ping 通过 , 返回 nil ; 不通 放回 err

在这里插入图片描述

关闭连接

在这里插入图片描述

模型绑定

在这里插入图片描述

添加 Post

两行 -> 一行

在这里插入图片描述

存数据 , 同时 根据ok状态 返回响应

在这里插入图片描述
在这里插入图片描述

查看

在这里插入图片描述

修改

在这里插入图片描述
在这里插入图片描述

删除

在这里插入图片描述

在这里插入图片描述

使用 PostMan 做测试

优化

controller

在这里插入图片描述

dao : database access object

在这里插入图片描述

在这里插入图片描述

models

在这里插入图片描述

controller -> logic -> models

在这里插入图片描述

GET IndexHandler

在这里插入图片描述

GetTodoList

在这里插入图片描述

Update GetATodo

在这里插入图片描述

routers

在这里插入图片描述
在这里插入图片描述

main.go

在这里插入图片描述

结尾

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go+vue——基于gin框架和gorm的web开发实战 的相关文章

随机推荐

  • 【Linux】常用指令汇总

    目录 1 文件和目录操作 2 进程管理和查询 3 压缩和解压操作 4 系统信息和管理 5 远程和下载操作 6 用户和权限管理 7 时间和日期操作 8 运行和停止程序 9 其他操作 如果这篇文章对你有所帮助 渴望获得你的一个点赞 以下示例涵盖
  • 3S基础知识:VC6.0+MapX编程总结

    一 MapX的帮助 MapX的官方帮助文档是 MapX在线帮助 个人认为 这套文档过于简单 系统性偏差 与ArcEngine的帮助文档不可比 很多MapX的开发技巧在 MapX在线帮助 中查找不到 只能在互联网上搜索 本文试图从一个程序员的
  • 1V转5V芯片,三个元件即可组成完整的稳压方案

    1V低电压要转成5V的电压 需要1V转5V的芯片 由于1V输入 所以不需要指望能输出多大的电流 压差和1V的供电电压意味着供电电流也是无法做大的了 一般1V转5V的输出电流在0MA 100mA 一般60MA应用多 1V转5V电路的BOM物料
  • [LeetCode]202. Happy Number(判断正整数是不是Happy Number)

    202 Happy Number 原题链接 Write an algorithm to determine if a number is happy A happy number is a number defined by the fol
  • java.lang.Integer线程安全吗?

    java lang Integer线程安全 因为 private final int value 不可变
  • SQL实战5——统计活跃间隔对用户分级结果

    现有用户行为日志表tb user log 问题 统计活跃间隔对用户分级后 各活跃等级用户占比 结果保留两位小数 且按占比降序排序 注 用户等级标准简化为 忠实用户 近7天活跃过且非新晋用户 新晋用户 近7天新增 沉睡用户 近7天未活跃但更早
  • 华为机试HJ11 数字颠倒

    HJ11 数字颠倒 Python 题目 解题思路 代码 结果 题目 解题思路 1 输入 转字符串 倒序输出即可 python可以很取巧 代码 print input 1 结果
  • 使用Python批量转换彩色图片到灰度图片

    当涉及到图像处理和计算机视觉时 有时需要将彩色图片转换为灰度图片 一张一张使用PS等工具转换十分复杂且没有必要 今天介绍的这种方法用到了Pillow库 使用Pillow库来打开 加载并转换彩色图像 并将图像储存在另一个文件夹里 具体步骤如下
  • [春秋杯2023]Misc sudo(记CVE-2023-22809)

    对我来说还是有点难了 web方向的phpstudy那道题 不知道为什么 xss就是打不进去 第二道python反序列化还没有理解 所以就先发一道misc MISC sudo 记CVE 2023 22809 一 漏洞范围 sudo 1 8 0
  • 3.动态库的动态加载、错误处理、GDB调试

    库文件 代码的仓库 当运行a out时 a out是链接动态库的 于是a out和动态库都需要加载到物理内存中 但是 a out可能运行十分钟 但是需要用到的动态库却只需要使用1分钟 则资源浪费 所以引入动态加载的概念 当需要用动态库的时候
  • OceanBase介绍

    OceanBase是什么 OceanBase是一个支持海量数据的高性能数据库系统 实现了数千亿条记录 数百TB数据上的跨行跨表事务 由淘宝核心系统研发部 运维 DBA 广告 应用研发等部门共同完成 OceanBase解决什么问题 许多公司的
  • 编译驱动时报错:./arch/x86/include/asm/atomic64_64.h: At top level:

    在编译6ULL驱动的时候程序报错 base c 4 arch x86 include asm atomic64 64 h At top level arch x86 include asm atomic64 64 h 31 33 error
  • Java里的锁

    前言 锁 最初是人类为了保护自己的财产而发明的一种用钥匙才能开启的装置 防范的是外部人员 正常手段下没有钥匙是不能绕过物理锁的 而在程序世界里 锁的设计则是为了保护数据资源 但并不能防范外部攻击 只能算是内部协作的一个约束 无论内外部 只要
  • Android APK反编译技巧全讲解

    Android APK反编译技巧全讲解 导言 在我们安卓开发当中 我们不仅需要掌握基础的开发技能 也需要掌握软件的安全技能 这样才可以让我们的软件能够成为一款能够真正可以进行发布的软件 同时也可以让自己的核心技术不会被别人所盗取 首先我们应
  • ul li ol 解决去除默认点 和 空白问题 缩进问题

    前面的空白 其实这段空白叫做 缩进 明白是缩进之后 在网上能搜到一堆处理的方法 使用firebug调试了很久 这段空白明明没有对应的样式控制啊 把margin left设置成0px也没用 后来反应过来 原来是缩进 据此搜索到解决办法 直接解
  • 不同平台的C/C++标准库

    1 C C 标准 C C 所涉及到的参与者 根据角色的不同 可以分为以下3类 C C 标准起草者 主要在ISO标准组织 International Organization for Standardization 他们负责对应C C 标准相
  • 元学习MAML算法详解

    Meta learning Meta learning 基本定义 元学习 又称 学习如何学习 就像我们人类学习新知识往往从以往得经验出发而很少从头开始一样 元学习以一种系统得 数据驱动得方式从先前得经验中学习 是一个可用于描述所以基于其他先
  • 【实操案例十一】使用try-except手动捕获异常 实例代码及运行效果图!

    任务一 编写程序输入学员成绩 异常捕获忘了的同学 可以参考这个 Bug的常见类型及异常处理机制 任务一 编写程序输入学员成绩 i int input 请输入学员成绩 if 0 lt i lt 100 print i else raise E
  • 【算法】稳定匹配二(JAVA版)

    详细介绍信息请看第一篇稳定匹配C 版这里不再过多讲述 下文直接贴代码 PiPei java package com dt pipei import java util Scanner public class Pipei public st
  • go+vue——基于gin框架和gorm的web开发实战

    go vue 基于gin框架和gorm的web开发实战 gin框架 视频 资料 笔记 安装Go环境 添加环境变量 可能自动添加好 下载 Go 环境变量 goland 报错 GOROOT is not defined 创建项目 Golang中