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

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
      • 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/

环境变量

go+vue——基于gin框架和gorm的web开发实战_第1张图片
D:\Dsoftware\go\install2\Go\bin

go+vue——基于gin框架和gorm的web开发实战_第2张图片

goland 报错: GOROOT is not defined

go故障排查集锦 : https://www.cnblogs.com/chalon/p/15151474.html
go+vue——基于gin框架和gorm的web开发实战_第3张图片

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

go+vue——基于gin框架和gorm的web开发实战_第4张图片
go+vue——基于gin框架和gorm的web开发实战_第5张图片
go+vue——基于gin框架和gorm的web开发实战_第6张图片
go+vue——基于gin框架和gorm的web开发实战_第7张图片

创建项目:

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

go+vue——基于gin框架和gorm的web开发实战_第8张图片

其他, 不一定需要

检查 是否可以 运行程序

go+vue——基于gin框架和gorm的web开发实战_第9张图片

web 本质 : net/http介绍

课件、教程

https://liwenzhou.com
https://www.liwenzhou.com/posts/Go/golang-menu/
https://www.liwenzhou.com/posts/Go/http/
go+vue——基于gin框架和gorm的web开发实战_第10张图片
go+vue——基于gin框架和gorm的web开发实战_第11张图片

启动

go+vue——基于gin框架和gorm的web开发实战_第12张图片

读文件

go+vue——基于gin框架和gorm的web开发实战_第13张图片
go+vue——基于gin框架和gorm的web开发实战_第14张图片

gin

下载 安装

下载并安装Gin:

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

go+vue——基于gin框架和gorm的web开发实战_第15张图片

使用 gin

go+vue——基于gin框架和gorm的web开发实战_第16张图片

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 删除书籍信息
go+vue——基于gin框架和gorm的web开发实战_第17张图片

Postman

https://www.postman.com/

go+vue——基于gin框架和gorm的web开发实战_第18张图片
go+vue——基于gin框架和gorm的web开发实战_第19张图片

Go语言标准库之template

Go语言的模板引擎

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

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

go+vue——基于gin框架和gorm的web开发实战_第20张图片

模板引擎的使用

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

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

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

模板语法

{{.}} + 注释

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

当我们传入一个结构体对象时,我们可以根据.来访问结构体的对应字段。例如:
go+vue——基于gin框架和gorm的web开发实战_第21张图片

go+vue——基于gin框架和gorm的web开发实战_第22张图片

变量

go+vue——基于gin框架和gorm的web开发实战_第23张图片

移除空格

go+vue——基于gin框架和gorm的web开发实战_第24张图片

条件

go+vue——基于gin框架和gorm的web开发实战_第25张图片

比较

go+vue——基于gin框架和gorm的web开发实战_第26张图片

循环

slice idx, value
map key, value

slice

go+vue——基于gin框架和gorm的web开发实战_第27张图片

range else

go+vue——基于gin框架和gorm的web开发实战_第28张图片

with

go+vue——基于gin框架和gorm的web开发实战_第29张图片
类似于
go+vue——基于gin框架和gorm的web开发实战_第30张图片

预定义 函数 index

go+vue——基于gin框架和gorm的web开发实战_第31张图片

自定义函数

go+vue——基于gin框架和gorm的web开发实战_第32张图片

报错: 模板 名字不一样

go+vue——基于gin框架和gorm的web开发实战_第33张图片
go+vue——基于gin框架和gorm的web开发实战_第34张图片

自定义函数

go+vue——基于gin框架和gorm的web开发实战_第35张图片
go+vue——基于gin框架和gorm的web开发实战_第36张图片

模板嵌套

go+vue——基于gin框架和gorm的web开发实战_第37张图片

三种模板

go+vue——基于gin框架和gorm的web开发实战_第38张图片

先写 父亲, 再写 孩子

go+vue——基于gin框架和gorm的web开发实战_第39张图片

模板继承 block

绝大多数 模板一样

go+vue——基于gin框架和gorm的web开发实战_第40张图片
go+vue——基于gin框架和gorm的web开发实战_第41张图片

block 定义 块 , 作为 base

go+vue——基于gin框架和gorm的web开发实战_第42张图片

define 重新定义模板,

go+vue——基于gin框架和gorm的web开发实战_第43张图片

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

go+vue——基于gin框架和gorm的web开发实战_第44张图片

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

go+vue——基于gin框架和gorm的web开发实战_第45张图片

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

go+vue——基于gin框架和gorm的web开发实战_第46张图片

模板冲突 解决

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

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

go+vue——基于gin框架和gorm的web开发实战_第47张图片

修改默认 标识符 分隔符 delimiter

go+vue——基于gin框架和gorm的web开发实战_第48张图片

htmp/template 安全 转移 防止攻击

go+vue——基于gin框架和gorm的web开发实战_第49张图片

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

go+vue——基于gin框架和gorm的web开发实战_第50张图片

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

go+vue——基于gin框架和gorm的web开发实战_第51张图片
go+vue——基于gin框架和gorm的web开发实战_第52张图片
go+vue——基于gin框架和gorm的web开发实战_第53张图片

Gin

HTML

http.Status

go+vue——基于gin框架和gorm的web开发实战_第54张图片

go mod tidy , download

go+vue——基于gin框架和gorm的web开发实战_第55张图片

go+vue——基于gin框架和gorm的web开发实战_第56张图片

gin.H 本质 map

go+vue——基于gin框架和gorm的web开发实战_第57张图片

路由 一定要对应

go+vue——基于gin框架和gorm的web开发实战_第58张图片

重名

define end

go+vue——基于gin框架和gorm的web开发实战_第59张图片

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

go+vue——基于gin框架和gorm的web开发实战_第60张图片

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

参数

go+vue——基于gin框架和gorm的web开发实战_第61张图片

管道

go+vue——基于gin框架和gorm的web开发实战_第62张图片

定义 函数

go+vue——基于gin框架和gorm的web开发实战_第63张图片

静态文件

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

static 文件夹

go+vue——基于gin框架和gorm的web开发实战_第64张图片

加载静态文件

参数:
第一个: HTML 文件 中 , 引入
第二个: 本地路径
当发现 HTML 中 xxx 开头 , 就会从 ./static 中 寻找
go+vue——基于gin框架和gorm的web开发实战_第65张图片go+vue——基于gin框架和gorm的web开发实战_第66张图片
go+vue——基于gin框架和gorm的web开发实战_第67张图片

不支持 block 继承, 用其他方法 ----------------------------------------------------- 没有学

HTML5 模板 下载

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

go+vue——基于gin框架和gorm的web开发实战_第68张图片
go+vue——基于gin框架和gorm的web开发实战_第69张图片
go+vue——基于gin框架和gorm的web开发实战_第70张图片

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

go+vue——基于gin框架和gorm的web开发实战_第71张图片

go+vue——基于gin框架和gorm的web开发实战_第72张图片
go+vue——基于gin框架和gorm的web开发实战_第73张图片

go+vue——基于gin框架和gorm的web开发实战_第74张图片
go+vue——基于gin框架和gorm的web开发实战_第75张图片

go+vue——基于gin框架和gorm的web开发实战_第76张图片
go+vue——基于gin框架和gorm的web开发实战_第77张图片

gin 返回 json

使用 map

go+vue——基于gin框架和gorm的web开发实战_第78张图片

使用 gin.H

go+vue——基于gin框架和gorm的web开发实战_第79张图片
go+vue——基于gin框架和gorm的web开发实战_第80张图片

结构体

go+vue——基于gin框架和gorm的web开发实战_第81张图片
go+vue——基于gin框架和gorm的web开发实战_第82张图片

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

go+vue——基于gin框架和gorm的web开发实战_第83张图片

go+vue——基于gin框架和gorm的web开发实战_第84张图片

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

go+vue——基于gin框架和gorm的web开发实战_第85张图片

go+vue——基于gin框架和gorm的web开发实战_第86张图片

Query(“”) -> “”

go+vue——基于gin框架和gorm的web开发实战_第87张图片

go+vue——基于gin框架和gorm的web开发实战_第88张图片

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

go+vue——基于gin框架和gorm的web开发实战_第89张图片

GetQuery(“”) -> “”

go+vue——基于gin框架和gorm的web开发实战_第90张图片
go+vue——基于gin框架和gorm的web开发实战_第91张图片

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

go+vue——基于gin框架和gorm的web开发实战_第92张图片

go+vue——基于gin框架和gorm的web开发实战_第93张图片

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

首页 显示 的 是 GET 请求 得到的, 发 GET 的 /login

表单 form 的 action 写 login ,则发给 POST 的/login

go+vue——基于gin框架和gorm的web开发实战_第94张图片

PostForm(“”) -> “”

go+vue——基于gin框架和gorm的web开发实战_第95张图片

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

找到,没有填写,是空串 “”

go+vue——基于gin框架和gorm的web开发实战_第96张图片

找不到 返回 默认值

go+vue——基于gin框架和gorm的web开发实战_第97张图片

GetPostForm(“”) -> “”

go+vue——基于gin框架和gorm的web开发实战_第98张图片

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

获取 PATH ,URL 路径参数,

返回都是 string 类型

go+vue——基于gin框架和gorm的web开发实战_第99张图片
go+vue——基于gin框架和gorm的web开发实战_第100张图片

冲突 : 路由 的 匹配 冲突

go+vue——基于gin框架和gorm的web开发实战_第101张图片

不一样

go+vue——基于gin框架和gorm的web开发实战_第102张图片

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

ShouldBind 、 BindForm 、 BindJSON
go+vue——基于gin框架和gorm的web开发实战_第103张图片

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

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

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

GET queryString 方式

go+vue——基于gin框架和gorm的web开发实战_第104张图片
go+vue——基于gin框架和gorm的web开发实战_第105张图片

POST queryString 方式

go+vue——基于gin框架和gorm的web开发实战_第106张图片
go+vue——基于gin框架和gorm的web开发实战_第107张图片
go+vue——基于gin框架和gorm的web开发实战_第108张图片

原始 row -> JSON

go+vue——基于gin框架和gorm的web开发实战_第109张图片
go+vue——基于gin框架和gorm的web开发实战_第110张图片

反射 、 写全: 一一对应前段JSON

不对应,拿不到数据

go+vue——基于gin框架和gorm的web开发实战_第111张图片

go+vue——基于gin框架和gorm的web开发实战_第112张图片

一一对应,拿到数据

go+vue——基于gin框架和gorm的web开发实战_第113张图片
go+vue——基于gin框架和gorm的web开发实战_第114张图片

上传文件

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

go+vue——基于gin框架和gorm的web开发实战_第115张图片

go+vue——基于gin框架和gorm的web开发实战_第116张图片

go+vue——基于gin框架和gorm的web开发实战_第117张图片

运行结果

go+vue——基于gin框架和gorm的web开发实战_第118张图片

go+vue——基于gin框架和gorm的web开发实战_第119张图片

限制 内存

多个文件 上传 for 循环

go+vue——基于gin框架和gorm的web开发实战_第120张图片

重定向

HTTP: c.Redirect(http.StatusMovedPermanently, “http://ww.sogo.com”)

站外 地址改变, 永久 StatusMovedPermanently

go+vue——基于gin框架和gorm的web开发实战_第121张图片

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

go+vue——基于gin框架和gorm的web开发实战_第122张图片

站内 地址 不变

go+vue——基于gin框架和gorm的web开发实战_第123张图片

路由 路由组

/index GET 请求 : 获取 信息: 查看购物车 数据。 这一条处理, 称为路由

POST 创建某个信息: 一般用来表单form: 上传文件、用户密码表单、订单

PUT 更新 数据: 局部更新、改购物车

DELETE API 涉及: 删除

Any: 处理 任意 请求方法

go+vue——基于gin框架和gorm的web开发实战_第124张图片
go+vue——基于gin框架和gorm的web开发实战_第125张图片

NotFound

go+vue——基于gin框架和gorm的web开发实战_第126张图片
go+vue——基于gin框架和gorm的web开发实战_第127张图片

NoRoute

go+vue——基于gin框架和gorm的web开发实战_第128张图片

路由组

go+vue——基于gin框架和gorm的web开发实战_第129张图片

嵌套

go+vue——基于gin框架和gorm的web开发实战_第130张图片

Gin中间件

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

go+vue——基于gin框架和gorm的web开发实战_第131张图片
go+vue——基于gin框架和gorm的web开发实战_第132张图片
go+vue——基于gin框架和gorm的web开发实战_第133张图片
go+vue——基于gin框架和gorm的web开发实战_第134张图片

使用

go+vue——基于gin框架和gorm的web开发实战_第135张图片

先调用 , 后调用

go+vue——基于gin框架和gorm的web开发实战_第136张图片

计时

go+vue——基于gin框架和gorm的web开发实战_第137张图片
go+vue——基于gin框架和gorm的web开发实战_第138张图片

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

go+vue——基于gin框架和gorm的web开发实战_第139张图片
go+vue——基于gin框架和gorm的web开发实战_第140张图片

go+vue——基于gin框架和gorm的web开发实战_第141张图片

c.next()

go+vue——基于gin框架和gorm的web开发实战_第142张图片
go+vue——基于gin框架和gorm的web开发实战_第143张图片

c.Abort

go+vue——基于gin框架和gorm的web开发实战_第144张图片

go+vue——基于gin框架和gorm的web开发实战_第145张图片

加 return

go+vue——基于gin框架和gorm的web开发实战_第146张图片
go+vue——基于gin框架和gorm的web开发实战_第147张图片

权限 中间件

go+vue——基于gin框架和gorm的web开发实战_第148张图片

闭包 (携带 参数)

go+vue——基于gin框架和gorm的web开发实战_第149张图片

为路由组 注册

go+vue——基于gin框架和gorm的web开发实战_第150张图片
go+vue——基于gin框架和gorm的web开发实战_第151张图片

跨中间件 存取 值 : eg 拿到 这个 用户

c.Set c.Get

go+vue——基于gin框架和gorm的web开发实战_第152张图片
go+vue——基于gin框架和gorm的web开发实战_第153张图片

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

go+vue——基于gin框架和gorm的web开发实战_第154张图片

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

go+vue——基于gin框架和gorm的web开发实战_第155张图片

c.GetString

go+vue——基于gin框架和gorm的web开发实战_第156张图片

默认 中间件

go+vue——基于gin框架和gorm的web开发实战_第157张图片
go+vue——基于gin框架和gorm的web开发实战_第158张图片

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

go+vue——基于gin框架和gorm的web开发实战_第159张图片

goRouting 多线程

c.Copy() 保证 c.Next() 也拷贝一份

go+vue——基于gin框架和gorm的web开发实战_第160张图片

G-ORM

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

链接MySQL

go+vue——基于gin框架和gorm的web开发实战_第161张图片
go+vue——基于gin框架和gorm的web开发实战_第162张图片
go+vue——基于gin框架和gorm的web开发实战_第163张图片

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

go+vue——基于gin框架和gorm的web开发实战_第164张图片

指定 数据库 类型

go+vue——基于gin框架和gorm的web开发实战_第165张图片

连接 SQL 服务 Open

go+vue——基于gin框架和gorm的web开发实战_第166张图片

加入 解析时间 本地时间

parseTime是查询结果是否自动解析为时间。loc是MySQL的时区设置。
go+vue——基于gin框架和gorm的web开发实战_第167张图片

数据表 迁移

go+vue——基于gin框架和gorm的web开发实战_第168张图片

go+vue——基于gin框架和gorm的web开发实战_第169张图片

增删改查

查询 更新

go+vue——基于gin框架和gorm的web开发实战_第170张图片
go+vue——基于gin框架和gorm的web开发实战_第171张图片

go+vue——基于gin框架和gorm的web开发实战_第172张图片
go+vue——基于gin框架和gorm的web开发实战_第173张图片

Model

go+vue——基于gin框架和gorm的web开发实战_第174张图片

定义模型

go+vue——基于gin框架和gorm的web开发实战_第175张图片
go+vue——基于gin框架和gorm的web开发实战_第176张图片

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 是否自动完成预加载的相关操作

快捷键

go+vue——基于gin框架和gorm的web开发实战_第177张图片

默认 约定

go+vue——基于gin框架和gorm的web开发实战_第178张图片

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

在这里插入图片描述

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

go+vue——基于gin框架和gorm的web开发实战_第179张图片
go+vue——基于gin框架和gorm的web开发实战_第180张图片

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

go+vue——基于gin框架和gorm的web开发实战_第181张图片

禁用 复数

go+vue——基于gin框架和gorm的web开发实战_第182张图片
go+vue——基于gin框架和gorm的web开发实战_第183张图片

指定表名

go+vue——基于gin框架和gorm的web开发实战_第184张图片

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

go+vue——基于gin框架和gorm的web开发实战_第185张图片
go+vue——基于gin框架和gorm的web开发实战_第186张图片

列名 执行

go+vue——基于gin框架和gorm的web开发实战_第187张图片
go+vue——基于gin框架和gorm的web开发实战_第188张图片

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

时间戳

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

CRUD

插入

判断主键 是否为空

go+vue——基于gin框架和gorm的web开发实战_第189张图片
go+vue——基于gin框架和gorm的web开发实战_第190张图片

go+vue——基于gin框架和gorm的web开发实战_第191张图片

默认值

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

go+vue——基于gin框架和gorm的web开发实战_第192张图片
go+vue——基于gin框架和gorm的web开发实战_第193张图片

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

go+vue——基于gin框架和gorm的web开发实战_第194张图片
go+vue——基于gin框架和gorm的web开发实战_第195张图片

新表, 通过 tag 指定

go+vue——基于gin框架和gorm的web开发实战_第196张图片
go+vue——基于gin框架和gorm的web开发实战_第197张图片
go+vue——基于gin框架和gorm的web开发实战_第198张图片

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

go+vue——基于gin框架和gorm的web开发实战_第199张图片

go+vue——基于gin框架和gorm的web开发实战_第200张图片

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

指定 设置 存 零值

字符串 指针 new string

go+vue——基于gin框架和gorm的web开发实战_第201张图片
go+vue——基于gin框架和gorm的web开发实战_第202张图片
go+vue——基于gin框架和gorm的web开发实战_第203张图片

sql.NullString

一个结构体

go+vue——基于gin框架和gorm的web开发实战_第204张图片

按住 Alt + command

go+vue——基于gin框架和gorm的web开发实战_第205张图片

使用方式

go+vue——基于gin框架和gorm的web开发实战_第206张图片
go+vue——基于gin框架和gorm的web开发实战_第207张图片

PG : PostgreSQL 支持 冲突 合并

go+vue——基于gin框架和gorm的web开发实战_第208张图片

查询 : 传出

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

go+vue——基于gin框架和gorm的web开发实战_第209张图片
go+vue——基于gin框架和gorm的web开发实战_第210张图片

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

go+vue——基于gin框架和gorm的web开发实战_第211张图片

Take 随机

Find : 传入 slice 指针

go+vue——基于gin框架和gorm的web开发实战_第212张图片

软删除 Debug

在这里插入图片描述

条件 查询 : 传出&

go+vue——基于gin框架和gorm的web开发实战_第213张图片

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

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

go+vue——基于gin框架和gorm的web开发实战_第214张图片
.

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

go+vue——基于gin框架和gorm的web开发实战_第215张图片

额外查询 : Set 加锁

go+vue——基于gin框架和gorm的web开发实战_第216张图片

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

go+vue——基于gin框架和gorm的web开发实战_第217张图片
go+vue——基于gin框架和gorm的web开发实战_第218张图片

attrs 没查到 gorm可以 给 一个值

go+vue——基于gin框架和gorm的web开发实战_第219张图片

assign 找没找到 ,都赋值给 struct

go+vue——基于gin框架和gorm的web开发实战_第220张图片

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

go+vue——基于gin框架和gorm的web开发实战_第221张图片
go+vue——基于gin框架和gorm的web开发实战_第222张图片

高级查询

子查询 expr

选择字段 Select

排序 order( , true) 覆盖排序

数量 limit

偏移 offset (-1) 表示取消

获取总数 count

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

Join

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

链式查询, 不断 where

立即执行:

go+vue——基于gin框架和gorm的web开发实战_第223张图片

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

go+vue——基于gin框架和gorm的web开发实战_第224张图片

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

内联 , 不用

go+vue——基于gin框架和gorm的web开发实战_第225张图片

前置条件

go+vue——基于gin框架和gorm的web开发实战_第226张图片

更新

save 默认修改 所有字段

go+vue——基于gin框架和gorm的web开发实战_第227张图片

update 仅修改指定字段

go+vue——基于gin框架和gorm的web开发实战_第228张图片

struct 不会更新 0值

go+vue——基于gin框架和gorm的web开发实战_第229张图片

更新 选定 select omit 忽略

select 指定一个

go+vue——基于gin框架和gorm的web开发实战_第230张图片

omit 排除一个

go+vue——基于gin框架和gorm的web开发实战_第231张图片

结果 updates 不同与前面 的 update

go+vue——基于gin框架和gorm的web开发实战_第232张图片

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

go+vue——基于gin框架和gorm的web开发实战_第233张图片

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

表达式更行

go+vue——基于gin框架和gorm的web开发实战_第234张图片

go+vue——基于gin框架和gorm的web开发实战_第235张图片

hook 钩子 :用户名 密码

go+vue——基于gin框架和gorm的web开发实战_第236张图片

SQL server 微软, 其他选项

go+vue——基于gin框架和gorm的web开发实战_第237张图片

row() scan()

go+vue——基于gin框架和gorm的web开发实战_第238张图片

删除

ID 主键 必须存在

go+vue——基于gin框架和gorm的web开发实战_第239张图片

go+vue——基于gin框架和gorm的web开发实战_第240张图片

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

go+vue——基于gin框架和gorm的web开发实战_第241张图片
go+vue——基于gin框架和gorm的web开发实战_第242张图片

所有 数据 都被删除

go+vue——基于gin框架和gorm的web开发实战_第243张图片

go+vue——基于gin框架和gorm的web开发实战_第244张图片

批量删除 匹配条件

where()

go+vue——基于gin框架和gorm的web开发实战_第245张图片

内联

go+vue——基于gin框架和gorm的web开发实战_第246张图片

软删除

Unscoped() 查看软删除

go+vue——基于gin框架和gorm的web开发实战_第247张图片

不加 deleted_at

go+vue——基于gin框架和gorm的web开发实战_第248张图片

加 deleted_at

go+vue——基于gin框架和gorm的web开发实战_第249张图片

物理删除 unscoped Delete

软删除 Delete

go+vue——基于gin框架和gorm的web开发实战_第250张图片

物理删除 unscoped Delete

go+vue——基于gin框架和gorm的web开发实战_第251张图片
go+vue——基于gin框架和gorm的web开发实战_第252张图片

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

go+vue——基于gin框架和gorm的web开发实战_第253张图片

小清单

加载HTML : LoadHTMLGlob

go+vue——基于gin框架和gorm的web开发实战_第254张图片

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

go+vue——基于gin框架和gorm的web开发实战_第255张图片

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

go+vue——基于gin框架和gorm的web开发实战_第256张图片

逻辑讲解

go+vue——基于gin框架和gorm的web开发实战_第257张图片

post 、 get 、

go+vue——基于gin框架和gorm的web开发实战_第258张图片

delete 、put

go+vue——基于gin框架和gorm的web开发实战_第259张图片

数据库

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

go+vue——基于gin框架和gorm的web开发实战_第260张图片

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

go+vue——基于gin框架和gorm的web开发实战_第261张图片

关闭连接

go+vue——基于gin框架和gorm的web开发实战_第262张图片

模型绑定

go+vue——基于gin框架和gorm的web开发实战_第263张图片

添加 Post

两行 -> 一行

go+vue——基于gin框架和gorm的web开发实战_第264张图片

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

go+vue——基于gin框架和gorm的web开发实战_第265张图片
在这里插入图片描述

查看

go+vue——基于gin框架和gorm的web开发实战_第266张图片

修改

go+vue——基于gin框架和gorm的web开发实战_第267张图片
go+vue——基于gin框架和gorm的web开发实战_第268张图片

删除

go+vue——基于gin框架和gorm的web开发实战_第269张图片

go+vue——基于gin框架和gorm的web开发实战_第270张图片

使用 PostMan 做测试

优化

controller

go+vue——基于gin框架和gorm的web开发实战_第271张图片

dao : database access object

go+vue——基于gin框架和gorm的web开发实战_第272张图片

go+vue——基于gin框架和gorm的web开发实战_第273张图片

models

go+vue——基于gin框架和gorm的web开发实战_第274张图片

controller -> logic -> models

go+vue——基于gin框架和gorm的web开发实战_第275张图片

GET IndexHandler

go+vue——基于gin框架和gorm的web开发实战_第276张图片

GetTodoList

go+vue——基于gin框架和gorm的web开发实战_第277张图片

Update GetATodo

go+vue——基于gin框架和gorm的web开发实战_第278张图片

routers

go+vue——基于gin框架和gorm的web开发实战_第279张图片
go+vue——基于gin框架和gorm的web开发实战_第280张图片

main.go

go+vue——基于gin框架和gorm的web开发实战_第281张图片

结尾

你可能感兴趣的:(软件工程文档自动化,gin,golang,后端)