golang入门实战

  • github
  • 接上篇
  • 接口数据时间格式
  • token校验中间件
  • 多平台打包
  • 未完待续

github

项目完整代码–github

接上篇

golang入门实战(一)

接口数据时间格式

在上篇 整合mysql ---gorm框架部分 返回数据的时间格式是带时区的  一般我们需要把他转成 2006-01-02 15:04:05 这种格式
http://localhost:1016/user/save?username=aaa

{“code”:200,“data”:{“ID”:3,“CreatedAt”:“2023-02-13T10:40:26.2750692+08:00”,“UpdatedAt”:“2023-02-13T10:40:26.2750692+08:00”,“DeletedAt”:null,“Username”:“aaa”,“Password”:“”,“Tel”:“”}}

  • 定义一个时间类型,来重写时间格式为我们需要的格式

    /model/BaseModel.go
    
package modelimport ("database/sql/driver""fmt""time"
)type BaseModel struct {ID        uint `gorm:"primary_key"`CreatedAt *FormatTimeUpdatedAt *FormatTimeDeletedAt *FormatTime `sql:"index"`
}type FormatTime time.Timefunc (t *FormatTime) MarshalJSON() ([]byte, error) {tTime := time.Time(*t)return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil
}func (t FormatTime) Value() (driver.Value, error) {tTime := time.Time(t)return tTime.Format("2006-01-02 15:04:05"), nil
}func (t *FormatTime) Scan(v interface{}) error {switch vt := v.(type) {case time.Time:*t = FormatTime(vt)}return nil
}
  • 应用

      /model/User.go把原来使用的 gorm.Model 替换为我们的BaseModel
    
package modeltype User struct {BaseModelUsername stringPassword stringTel      string
}
  • 测试
  •   postman请求http://localhost:1016/user/save{"code": 200,"data": {"ID": 9,"CreatedAt": "2023-02-14 17:28:59","UpdatedAt": "2023-02-14 17:28:59","DeletedAt": null,"Username": "asd","Password": "","Tel": ""},"msg": "success"}
    

token校验中间件

大部分项目接口中,对接口访问是有身份&权限校验的
/middleware/TokenMiddleware.go
package middlewareimport ("github.com/gin-gonic/gin""pro/response""strings"
)func TokenMiddleware() gin.HandlerFunc {return func(c *gin.Context) {//检查放行白名单url := c.Request.RequestURIif CheckWhitelist(url) {return}//验证tokentoken := c.GetHeader("token")if CheckToken(token) {return}response.Fail(c, "token失效")//终止请求执行c.Abort()}
}// 放行白名单 配置具体接口/群组
var Whitelist = []string{"/user/ggt","/rel/",
}// 检查接口是否需要放行
func CheckWhitelist(url string) bool {for _, item := range Whitelist {if url == item || (strings.HasSuffix(item, "/") && strings.HasPrefix(url, item)) {return true}}return false
}// 校验token  token校验及权限校验在此处处理
func CheckToken(token string) bool {if token == "123" {return true}return false
}
  • main入口 启用中间件
func Router() *gin.Engine {//禁用gin输出gin.DefaultWriter = io.Discardr := gin.Default()//文件上传大小r.MaxMultipartMemory = 8 << 20 // 8 MiBr.Use(//异常处理middleware.RecoveryMiddleware(),//跨域middleware.CORSMiddleware(),//请求参数处理middleware.RequestParamsMiddleware(),//日志middleware.LogMiddle(),//tokenmiddleware.TokenMiddleware(),)return StartRouter(r)
}
  • 路由配置
func StartRouter(r *gin.Engine) *gin.Engine {//用户user := r.Group("/user"){user.POST("/save", controller.SaveUser)user.POST("/del", controller.DelUser)user.POST("/get", controller.GetUser)user.POST("/ggt", controller.GetUser)user.GET("/gg", controller.GG)}rel := r.Group("/rel"){rel.POST("/get", controller.GetUser)}return r
}
  • 测试

      postmanhttp://localhost:1016/user/get{"code": 400,"data": null,"msg": "token失效"}http://localhost:1016/user/ggt{"code": 200,"data": {"ID": 0,"CreatedAt": null,"UpdatedAt": null,"DeletedAt": null,"Username": "","Password": "","Tel": ""},"msg": "success"}http://localhost:1016/rel/get{"code": 200,"data": {"ID": 0,"CreatedAt": null,"UpdatedAt": null,"DeletedAt": null,"Username": "","Password": "","Tel": ""},"msg": "success"}
    

多平台打包

goreleaser安装

 选择下方Assets中goreleaser_Windows_x86_64.zip下载解压后配置环境变量,将路径添加到path中 如: E:\goreleaser_Windows_x86_64
  • 打包配置

      与main.go同级别/.goreleaser.yaml
    
# This is an example .goreleaser.yml file with some sensible defaults.
# Make sure to check the documentation at https://goreleaser.combefore:hooks:# You may remove this if you don't use go modules.- go mod tidy# you may remove this if you don't need go generate- go generate ./...
builds:- env:- CGO_ENABLED=0goos:- linux
#      - windows
#      - darwin
archives:- replacements:
#      darwin: Darwinlinux: Linux
#      windows: Windows
#      386: i386amd64: x86_64
checksum:name_template: 'checksums.txt'
snapshot:name_template: "{{ incpatch .Version }}-next"
changelog:sort: ascfilters:exclude:- '^docs:'- '^test:'# modelines, feel free to remove those if you don't want/use them:
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
  • 打包

  •   goland打开terminal 执行以下命令goreleaser --snapshot --skip-publish --rm-dist等待打包完成  包会成为在/dist目录/dist/golang_linux_amd64_v1/pro
    
  • 启动

      chmod +x pronohup ./pro>log.log 2>&1 &
    

未完待续

golang入门实战(二)相关推荐

  1. 【Golang入门】二、Go语言快速开发

    需求:开发一个hello.go程序,要求输出"hello world". 采用VScode进行Golang的开发,因此这一系列博客的代码均在VScode编译器上编译实现. 这里我们 ...

  2. 怎么加载csv_python爬虫入门实战(四)!爬取动态加载的页面

    今天的主题是爬取动态网页的经验分享,以cocos论坛为例子进行分享.(官方不会打我吧 ) 配置环境 为什么选择cocos论坛呢?因为自己在浏览论坛时,发现标题内容会随着滚动条的位置而动态添加. 环境: ...

  3. python xpath入门_python爬虫入门实战(三)!xpath 和 csv!

    最近有小伙伴说正则表达式学不懂?那有什么替代方案呢?一起往下看吧! 在前两篇文章我们已经学了一些基本技巧.但是之前都是用正则表达式来解析内容的,可能有小伙伴对正则表达式不理解,于是乎,我找到一个相对好 ...

  4. python爬虫动态加载_python爬虫入门实战(四)!爬取动态加载的页面!

    今天的主题是爬取动态网页的经验分享,以cocos论坛为例子进行分享.(官方不会打我吧 ) 配置环境 为什么选择cocos论坛呢?因为自己在浏览论坛时,发现标题内容会随着滚动条的位置而动态添加. 环境: ...

  5. layui 如何动态加载局部页面_python爬虫入门实战(四)!爬取动态加载的页面!

    今天的主题是爬取动态网页的经验分享,以cocos论坛为例子进行分享.(官方不会打我吧 ) 配置环境 为什么选择cocos论坛呢?因为自己在浏览论坛时,发现标题内容会随着滚动条的位置而动态添加. 环境: ...

  6. 从零开始的Flutter入门实战(二)

    目录 前言 一.Column布局 1.创建一个Column 2.添加Container 3.运行验证 二.Row布局 1.将Column改成Row 三.Column布局和Row布局的混合使用 1.Si ...

  7. MATLAB App Designer入门实战(二)

    为了方便汇总,这里的目录是接着第一篇来的. 系列文章目录: MATLAB 手把手带你制作第一个APP designer程序(电子词典) MATLAB App Designer入门实战(一) MATLA ...

  8. python游戏开发框架_用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块1)...

    游戏是为了什么而存在的?Bingo,是为了娱乐~ 在这个最高主题之前,技术啥的什么都无所谓! 前一段时间,有位姓刘的网友用Pygame写了个俄罗斯方块,在用py2exe打包的时候遇到一些问题,和我交流 ...

  9. python用户界面游戏_用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块2)...

    我们接着来做这个整死人不偿命的俄罗斯方块. 代码组织和名词约定 上一次我们稍微整理了一下游戏运行的框架,这里需要整理一下python代码的框架,一个典型的pygame脚本结构如下: 其中,lib为py ...

最新文章

  1. 网络与服务器编程框架库 acl_3.0.13 发布
  2. C 语言编程 — 头文件
  3. 一上来,就问原理,问上亿(MySQL)大表的索引优化...
  4. php批量生成200条8位兑换码
  5. 功能测试工作的一点总结
  6. Lua 学习笔记(一)环境搭建
  7. :未来5-10年,NLP将走向成熟
  8. SimBERTv2来了!融合检索和生成的RoFormer-Sim模型
  9. python-小数点保留位数问题
  10. 域名解析中“TTL”是什么意思?
  11. c语言用什么操作系统,用C语言写关于操作系统的一个问题。
  12. 基于matlab边缘提取的几种方法的比较
  13. HDU-5857-Median
  14. IDEA(或Android Studio)切换Git分支时弹出Git Checkout Problem
  15. 安迪的第一个字典(Andy‘s First Dictionary,UVa10815)
  16. ftp下载工具绿色版,ftp下载工具有绿色版的吗?教程详解
  17. 考研英语 - word-list-12
  18. 003_wz_wed_DL_课程一第二周编程题(Logistic回归;神经网络思维;)
  19. 沐曦加入龙蜥社区,聚焦技术创新,繁荣开源生态
  20. 知识点滴 - 电源适配器接头的极性

热门文章

  1. BIM用C语言编程,实现BIM技术的三个重要方面是()。A.BIM的建立B.BIM的应用C.BIM的管理D.BIM的粒度E.BIM的概念...
  2. 梦幻逊克,雾凇的故乡,摄影家的天堂
  3. Numpy 怎么把arange ()产生的列表 变成一个行向量或者列向量
  4. (挺好)最详细的Yolov3边框预测分析
  5. 半夜仍在加班的我,知道了老板跟女友都在跑步。
  6. subprocess用法,官方文档
  7. 计算机音乐数字乐谱生僻字,《生僻字》歌曲简谱
  8. ios系统删除的短信如何恢复?
  9. 关于java多参数的传值问题解析
  10. OpenCV—画直角边的直线(粗线)