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

news2024/11/27 20:34:53

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

  • gin框架
    • 视频、资料、笔记
    • 安装Go环境, 添加环境变量(可能自动添加好)
      • 下载 Go
      • 环境变量
      • goland 报错: GOROOT is not defined
    • 创建项目:
      • Golang中的GoPath和GoModule
        • 什么是GoPath?
          • 优缺点
        • 什么是GoModule?
        • GoModule的设置
      • Goland项目使用gomod配置
        • Environment GOPROXY=https://goproxy.cn
        • 其他, 不一定需要
      • 检查 是否可以 运行程序
  • web 本质 : net/http介绍
      • 课件、教程
      • 启动
      • 读文件
  • gin
      • 下载 安装
      • 使用 gin
      • RESTful API
      • Postman
    • Go语言标准库之template
      • Go语言的模板引擎
      • 模板引擎的使用
      • 模板语法
        • {{.}} + 注释
        • 变量
        • 移除空格
        • 条件
        • 比较
        • 循环
          • slice
          • range else
        • with
        • 预定义 函数 index
      • 自定义函数
        • 报错: 模板 名字不一样
        • 自定义函数
      • 模板嵌套
        • 三种模板
        • 先写 父亲, 再写 孩子
      • 模板继承 block
        • 绝大多数 模板一样
        • block 定义 块 , 作为 base
        • define 重新定义模板,
        • 父模板 写前面, 根模板 写后面
        • ExecuteTemplate 指定哪个模板, 不是 之前的 Execute
        • 将数据 传递 子模板 , 加一个 “.”
        • 模板冲突 解决
        • 修改默认 标识符 分隔符 delimiter
        • htmp/template 安全 转移 防止攻击
          • 自定义函数 解决 是否需要 转义, 执行HTML调用 template.HTML
          • 调用 自定义 函数 , 利用 管道 {{{}} | safe , 在 解析模板 之前定义
  • Gin
      • HTML
        • http.Status
        • go mod tidy , download
        • gin.H 本质 map
        • 路由 一定要对应
        • 重名
          • define end
          • templates/**/* 两级目录:第一级为 template,第三级为 .tmpl 文件
        • 自定义模版函数 , 解析模板之前定义,
          • 参数
          • 管道
          • 定义 函数
        • 静态文件
          • static 文件夹
          • 加载静态文件
        • 不支持 block 继承, 用其他方法 ----------------------------------------------------- 没有学
        • HTML5 模板 下载
        • 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 反射 、传入&指针
        • 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中间件
        • 使用
          • 先调用 , 后调用
          • 计时
        • 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
    • 链接MySQL
        • import "_" 表示 用到了 其中的 初始化 方法
        • 指定 数据库 类型
        • 连接 SQL 服务 Open
        • 加入 解析时间 本地时间
        • 数据表 迁移
        • 增删改查
          • 查询 更新
    • Model
      • 定义模型
    • Tag 标识: 结构体标记
      • 支持的结构体标记(Struct tags)
      • 关联相关标记(tags)
        • 快捷键
    • 默认 约定
        • 主键 、 : 默认 将 结构体 中 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
  • 结尾

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

在这里插入图片描述

结尾

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

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

相关文章

kafka安装

kafka安装前置将压缩包拷贝到虚拟机中解压改名更改server.properties启动先启动zookeeper非静默启动。会占用一个黑窗口再启动一个窗口&#xff0c;用jps查看静默启动 加一个-daemon另一种静默启动操作命令创建消息队列查看消息队列创建副本&#xff08;备份&#xff09;单机版…

MySQL数据库,数据的约束

目录 1.数据的约束 1.1约束的类型 1.2NULL约束 1.3UNIQUE约束 1.4DEFAULT约束 1.5PRIMARY KEY约束 1.6FOREIGN KEY约束 1.数据的约束 首先&#xff0c;创建一个名为test的数据库&#xff1a; mysql> create database test charset utf8; Query OK, 1 row affected …

Vue3中shallowRef和shallowReactive的使用?

shallowRef 和 shallowReactive前言shallowRef 和 shallowReactive概述区别shallowReactiveshallowRef总结&#xff1a;注意为什么使用shallowRef和shallowReactive&#xff1f;我们在之前的博客进过 ref 函数和 reactive 函数&#xff0c;他们的作用是将数据转换成响应式的数据…

真空压力控制方法在X射线探测器窗口薄膜材料力学性能测试中的应用

摘要&#xff1a;针对X射线窗口膜材料机械性能测试中对真空度和高压压力的准确控制需要&#xff0c;本文提出了相应的解决方案。解决方案中采用了薄膜电容真空计、压力传感器、电动针阀、压力调节阀和真空压力PID控制器&#xff0c;与真空泵和高压气源配合&#xff0c;可在膜材…

5Element

一、Element-快速入门 1、安装ElementUi组件库 输入npm install element-ui2.15.3 2、引入ElementUi组件库 https://element.eleme.cn/#/zh-CN/component/quickstart //引入element-ui import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css;Vue.…

Java魔法类 Unsafe应用解析

前言 Unsafe是位于sun.misc包下的一个类&#xff0c;主要提供一些用于执行低级别、不安全操作的方法&#xff0c;如直接访问系统内存资源、自主管理内存资源等&#xff0c;这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Ja…

【Linux】man什么都搜不了,No manual entry for xxx的解决方案

本文首发于 慕雪的寒舍 man什么都搜不了&#xff0c;No manual entry for xxx的解决方案 系统 CentOS 7.6 1.问题描述 今天查手册的时候&#xff0c;发现man什么都查不了。不管是系统接口还是函数&#xff0c;都显示没有入口文档&#xff08;No manual entry for&#xff09;…

狂追ChatGPT:开源社区的“平替”热潮

目前&#xff0c;不少优质的类ChatGPT模型都只能通过API接入&#xff0c;而一些开源LLM的效果与ChatGPT相比差距不小。不过&#xff0c;近期开源社区开始密集发力了。 其中&#xff0c;Meta的LLaMA模型泄漏是开源“ChatGPT”运动的代表性事件。基于LLaMA模型&#xff0c;开源社…

条款08: 别让异常逃离析构函数

文章目录背景知识析构函数背景知识 下面是一段测试代码&#xff1a; class Test { public:Test(int para){m_num para;};void test_throw(){throw(3);};~Test() {cout<<"delete Test"<<m_num<<endl;//test_throw();};int m_num; }; int main() …

牛客乔迁新居,新址在……

有个好消息想向大家公布&#xff1a;牛客&#xff08;上海办公室&#xff09;搬家啦&#xff01; 自3月27日起&#xff0c;牛客&#xff08;上海办公室&#xff09;正式乔迁至上海市长宁区长宁路999号兆丰广场办公楼G层G15。新的办公室坐落在上海长宁区的中心地带&#xff0c;…

Talk预告 | 浙江大学特聘研究员廖依伊:面向自动驾驶仿真平台的神经渲染

本期为TechBeat人工智能社区第477期线上Talk&#xff01; 北京时间3月1日(周三)20:00&#xff0c;浙江大学信电学院特聘研究员——廖依伊的Talk将准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “面向自动驾驶仿真平台的神经渲染”&#xff0c;届时将探…

VSCode 配置PyQt5 开发环境

前提要求&#xff1a;Windows 安装Anaconda。 如果没有安装&#xff0c;请参考文章:Windows安装Anaconda使用教程 1、PyQt 5 安装 在配置python环境的时候需要注意&#xff0c;PyQt5需要python 3.5以上的版本&#xff0c;在python环境中(conda、pipenv)安装pyqt5相关组件Py…

4.13(LoadLibrary)

接着之前预习的知识&#xff0c;我观察的自己编译出来的bin LoadLibraryExA LoadLibraryExA函数进去&#xff0c;现时用RtInitAnsiString函数初始化了ANSI的计数字符串&#xff0c;底层是调用了LoadLibraryExW函数&#xff0c;在LoadLibrarExW函数里做了unicode的计数字符串的…

分子生物学 第三章 基因、基因组及基因组学

文章目录第三章 基因、基因组及基因组学第一节 基因1 基因认识的三个阶段2 基因的特征(1)跳跃基因(2)断裂基因3 基因的分类4 基因的结构5 基因的大小6 基因的数目第二节 基因组1 基因组的概念2 噬菌体基因组3 细菌基因组以大肠杆菌(原核生物的代表)为研究对象4 酵母基因组以酵母…

Python之拯救Xubuntu22.04误删/usr/bin/python3.10(二十二)

0.首先删除/usr/bin/python3.10,会导致以下错误: <1>.报错1: ModuleNotFoundError: No module named ‘apt_pkg’ <2>.报错2: bash: /usr/lib/command-not-found: /usr/bin/python3: 解释器错误: 没有那个文件或目录 <3>.报错3: 通过亲身操作,以下步骤可…

【Linux】来写一个tcp的服务端+客户端

本文首发于 慕雪的寒舍 今天让我们来写一个tcp的服务器/客户端代码。 完整代码见我的gitee 链接 阅读本文前&#xff0c;建议先阅读&#x1f449; udp服务器 由于本文采用自建图床&#xff0c;CSDN可能因带宽不够&#xff0c;出现外链图片缓存失败。 1.基本框架 tcp的服务器…

walt 调度算法

Walt 算法 WALT负载统计原理_walt算法_森森浅浅笙笙的博客-CSDN博客 CPU负载均衡之WALT学习【转】_mb5fdcad0be2e90的技术博客_51CTO博客 1、A task’s demand is the maximum of its contribution to the most recently completed window and its average demand over the p…

webgl-attribute、uniform、varying三者的区别

通用js: let canvas document.getElementById(webgl) canvas.width window.innerWidth canvas.height window.innerHeight let ctx canvas.getContext(webgl) attribute&#xff1a; 范围: 只适用于vertexShader&#xff0c;将js代码中的数据传递给vertexShader。 使用方…

知识图谱扩充|蜕变测试|蜕变关系

目录 前言&#xff1a;概念定义 什么是蜕变测试&#xff1f; 那么&#xff0c;怎么进行蜕变测试呢&#xff1f; 1. 生成蜕变关系 a 等价关系 b 混排关系 c 交集关系 d 并集关系 2. 生成蜕变用例 3. 执行蜕变用例 4. 校验蜕变关系 学术报告 一、蜕变测试MT 二、蜕变…

【id:32】【20分】B. Date(类与构造)

题目描述 下面是一个日期类的定义&#xff0c;请在类外实现其所有的方法&#xff0c;并在主函数中生成对象测试之。 注意&#xff0c;在判断明天日期时&#xff0c;要加入跨月、跨年、闰年的判断 例如9.月30日的明天是10月1日&#xff0c;12月31日的明天是第二年的1月1日 2月…