Gin

type
status
date
slug
summary
tags
category
icon
password
终于来哩!
Gin 是一个 Go (Golang) 编写的轻量级 http web 框架
Gin 的官网:https://gin-gonic.com/zh-cn/
Gin Github 地址:https://github.com/gin-gonic/gin

环境搭建

  1. 下载&安装
在项目目录下面执行
  1. 将 gin 引入到代码中
  1. 新建Main.go
  1. Gin,启动!

golang 程序的热加载

所谓热加载就是当我们对代码进行修改时,程序能够自动重新加载并执行,这在我们开发中是非常便利的,可以快速进行代码测试,省去了每次手动重新编译
工具 1(推荐):https://github.com/gravityblast/fresh
工具 2:https://github.com/codegangsta/gin

Gin 框架中的路由

GET(SELECT)
从服务器取出资源(一项或多项)
POST(CREATE)
在服务器新建一个资源
PUT(UPDATE)
在服务器更新资源(客户端提供改变后的完整资源)
DELETE(DELETE)
从服务器删除资源
c.String() c.JSON() c.JSONP() c.HTML()
GET POST PUT
例子

Gin HTML 模板渲染

模板放在不同目录里面的配置方法

Gin 框架中如果不同目录下面有同名模板的话我们需要给模版起别名
在main.go中这样写

gin 模板基本语法

{{.}} 输出数据

例子
其中user结构体定义如下

注释

可以多行,不能嵌套

变量

移除空格

”-“要紧挨着“{{“和“}}”

比较函数

符号
含义
eq
如果 arg1 == arg2 则返回真
ne
如果 arg1 != arg2 则返回真
lt
如果 arg1 < arg2 则返回真
le
如果 arg1 <= arg2 则返回真
gt
如果 arg1 > arg2 则返回真
ge
如果 arg1 >= arg2 则返回真

条件判断

例子

range

例子

with

预定义函数

执行模板时,函数从两个函数字典中查找:首先是模板函数字典,然后是全局函数字典。一 般不在模板内定义函数,而是使用 Funcs 方法添加函数到模板里。
预定义的全局函数如下:
名称
功能
and
函数返回它的第一个 empty 参数或者最后一个参数; 就是说”and x y”等价于”if x then y else x”;所有参数都会执行;
or
返回第一个非 empty 参数或者最后一个参数; 亦即”or x y”等价于”if x then x else y”;所有参数都会执行;
not
返回它的单个参数的布尔值的否定
len
返回它的参数的整数类型长度
index
执行结果为第一个参数以剩下的参数为索引/键指向的值; 如”index x 1 2 3”返回 x[1][2][3]的值;每个被索引的主体必须是数组、切片或者字典。
print
即 fmt.Sprint
printf
即 fmt.Sprintf
println
即 fmt.Sprintln
html
返回与其参数的文本表示形式等效的转义 HTML。 这个函数在 html/template 中不可用。
urlquery
以适合嵌入到网址查询中的形式返回其参数的文本表示的转义值。 这个函数在 html/template 中不可用。
js
返回与其参数的文本表示形式等效的转义 JavaScript。
call
执行结果是调用第一个参数的返回值,该参数必须是函数类型,其余参数作为调用该函 数的参数; 如”call .X.Y 1 2”等价于 go 语言里的 dot.X.Y(1, 2); 其中 Y 是函数类型的字段或者字典的值,或者其他类似情况; call 的第一个参数的执行结果必须是函数类型的值(和预定义函数如 print 明显不同); 该函数类型值必须有 1 到 2 个返回值,如果有 2 个则后一个必须是 error 接口类型; 如果有 2 个返回值的方法返回的 error 非 nil,模板执行会中断并返回给调用模板执行者 该错误;

自定义模板函数

main.go中:
LoadHTMLGlob之前SetFuncMap,添加自定义的模版函数
SetFuncMap就是设置了一个Map
实现函数
模版中:
调用函数
函数名 参数1 参数2……

嵌套 template

新建public/header.html
在其他模版内引入
注意加上最后的“.”

静态文件服务

当我们渲染的 HTML 文件中引用了静态文件时,我们需要配置静态 web 服务
r.Static(“/static”, “./static”) 前面的/static 表示路由 后面的./static 表示路径
若css放在/static/css下,则在html中这样引入

路由详解

GET POST 以及获取 Get Post 传值

Get 请求传值

此时的GET请求应该如下:

Post 请求传值 获取 form 表单数据

前台:
后台:

获取 GET POST 传递的数据绑定到结构体

定义结构体,添加form标签
json标签的作用是解析的时候把json字段名改成小写
GET
声明为结构体
传的时候用它的指针!!!
别他妈写出什么user:=&UserInfo{}然后传&user了,你传牛魔呢
或者干脆用user:=new(UserInfo)
直接传user
浪费老子一个早上看你那💩代码
POST

获取 Post Xml 数据

动态路由

路由分组

在同文件下分组
拆分到不同文件
新建 routes 文件夹,routes 文件下面新建 adminRoutes.go、apiRoutes.go、defaultRoutes.go
在main.go中,导入routers包
然后在各自的xxx.go下配置路由即可

Gin 中自定义控制器

新建controllers文件夹,在其下建立对应的控制器,以admin为例
新建admin文件夹,在其中建立userController.go
之所以建立结构体是为了方便继承
然后在对应的router中使用即可
继承
新建 controller/admin/BaseController.go
可以让 UserController继承BaseController
然后直接调用BaseController的方法

Gin 中间件

next

先跳转到后面的剩余处理程序,再回来继续执行

Abort

终止调用请求的剩余处理程序
一个路由可以添加多个中间件

全局中间件

在main函数中添加:

分组路由中间件

法1:
法2:

中间件传值

Model

就是把一个常用的功能,放到一个模块里,中间件/控制器/main都可以使用该功能。
例如把时间转换放到一个model里。

文件上传

html模版:
Controller:

按日期存储文件

  1. 获取上传文件
  1. 判断后缀是否合法
  1. 创建保存目录
  1. 生成文件名和保存的目录
  1. 执行上传

Cookie

SetCookie

第一个参数 key
第二个参数 value
第三个参数 过期时间.如果只想设置 Cookie 的保存路径而不想设置存活时间,可以在第三个参数中传递 nil
第四个参数 cookie 的路径
第五个参数 cookie 的路径 Domain 作用域 本地调试配置成 localhost , 正式上线配置成域名
第六个参数是 secure ,当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效
第七个参数 httpOnly,是微软对 COOKIE 做的扩展。如果在 COOKIE 中设置了“httpOnly”属性,
则通过程序(JS 脚本、applet 等)将无法读取到 COOKIE 信息,防止 XSS 攻击产生

Cookie(获取)

Session

session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session保存在服务器上。当客户端浏览器第一次访问服务器并发送请求时,服务器端会创建一个 session 对象,生成一个类似于 key,value 的键值对,然后将 value 保存到服务器 将 key(cookie)返回到浏览器(客户)端。浏览器下次访问时会携带 key(cookie),找到对应的 session(value)。

Gorm

gorm.model

可以用继承加入到自己的结构体中,也可以不加入
默认用ID作为主键

tag

结构体标记(Tag)
描述
Column
指定列名
Type
指定列数据类型
Size
指定列大小, 默认值255
PRIMARY_KEY
将列指定为主键
UNIQUE
将列指定为唯一
DEFAULT
指定列默认值
PRECISION
指定列精度
NOT NULL
将列指定为非 NULL
AUTO_INCREMENT
指定列是否为自增类型
INDEX
创建具有或不带名称的索引, 如果多个索引同名则创建复合索引
UNIQUE_INDEX
INDEX 类似,只不过创建的是唯一索引
EMBEDDED
将结构设置为嵌入
EMBEDDED_PREFIX
设置嵌入结构的前缀
-
忽略此字段
结构体标记(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
是否自动完成预加载的相关操作

表名

列名

MysqlGo语言入门
  • Waline