Go 语言 Gin 框架实战

  • 后端
    • Goland 操作
    • 创建项目
    • 运行项目
    • 数据库操作
    • jwt、Response
    • 配置管理
    • 获取请求参数
    • 数据验证
    • 使用 UUID
  • 前端
    • 环境搭建
    • 创建项目
    • ESLint
    • 环境变量
    • Vuex

学习视频:Go语言 Gin + Vue 前后端分离实战 - OceanLearn

本课程的核心思想:快速开发,逐步优化

项目代码:https://gitee.com/szluyu99/gin-demo

后端

Go 语言学习资料:

  • 首页 - Go语言中文网 - Golang中文社区 (studygolang.com)
  • Go 语言教程 | 菜鸟教程 (runoob.com)
  • Go语言圣经 (studygolang.com)
  • Learn Go with tests - learn-go-with-tests (gitbook.io)
  • Go by Example(英)

接口测试:ApiPost - API 文档、调试、Mock、测试一体化协作平台

Goland 操作

Goland 设置保存时自动格式化代码:Preferences > Tools > File Watchers > + > go fmt

Goland 设置自动引入模块:Preferences > Go > Go Modules > Enable Go moudules integration

Goland 调试小技巧:调试模式下,右键 > Run to Cursoer,可以运行到指定行

定义好接口后,让某个结构体实现它:光标在结构体上,按 ctrl + i

或者 ,Mac 下 cmd + enter > Implement interface(Windows 下是 alt + enter

创建项目

基础知识:Go 中没有项目的说法,只有包,其中有两个重要路径

  • GOROOT:就是 Go 的安装路径(类似于 Java 的 JDK)
  • GOPATH:我们的工作空间,保存 Go 项目代码和第三方库

go env 可以查看 Go 的环境相关信息。

Gin 官网:Gin Web Framework (gin-gonic.com)

初始化项目:会在项目目录下生成 go.mod 文件

go mod init oceanlearn.tech/ginessential

根据 Gin 文档进行安装:会更新 go.mod 中的依赖

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

运行项目

如果有多个文件需要编译运行:

go run main.go routes.go

也可以先编译,再运行:

go build # 编译,生成可执行文件
./ginessential # 该文件根据项目名生成

上面的命令可简写:

go build && ./ginessential

数据库操作

GORM 官网:GORM - The fantastic ORM library for Golang, aims to be developer friendly.

根据 GORM 文档进行安装:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

使用方法参考官方文档,有中文,很详细。

jwt、Response

jwt-go 库 Git 地址:jwt-go

在 go 中安装开源库使用 jwt:

go get github.com/dgrijalva/jwt-go

jwt 由 header、payload、verify signature 三部分构成,中间以 . 分隔:

  • header:存储算法和 token 类型
  • payload:存储数据
  • signature:对前两者的数据再加密

例如:对于以下 jwt,可以用 echo xxx | base64 -D 进行 Base64 解码查看前两部分

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjQsImV4cCI6MTY0NDI0MjI5NSwiaWF0IjoxNjQzNjM3NDk1LCJpc3MiOiJ5dXNhZWwiLCJzdWIiOiJ1c2VyIHRva2VuIn0.YSM4oRD2iyjNtUcv5MIB5uqHSG85dDAQO5fni5BmwI8

例如对第 1 部分:echo eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | base64 -D

{"alg":"HS256","typ":"JWT"}

第 2 部分同理,得到以下数据:

{"UserId":4,"exp":1644242295,"iat":1643637495,"iss":"yusael","sub":"user token}

但是第 3 部分无法直接用 Base 64 解码查看(进行了其他加密操作)。

Header 的 Authorization 加 Bearer 的原因: OAuth 2.0 规定,Authorization 的字符串开头必须要有 Bearer。


[Response 封装](response/response.go · szluyu99/gin-demo - 码云 - 开源中国 (gitee.com)) 中,httpStatus 和 code 是分开的:

  • httpStatus 是 http 标准状态码,表示 http 请求是否成功

  • code 是业务状态码,表示该接口返回的状态(由接口逻辑决定)

可能 httpStatus 为 200,code 为 40002,表示 http 请求发送成功,但是接口调用失败。

配置管理

网上找到的使用教程:Go语言配置管理神器 — Viper 中文教程

viper 是一个配置解决方案,本项目中用该库将一些配置放到外部配置文件,实现解耦。

  • 在 config / application.yml 中写相关配置(服务端口号、数据库相关配置…)
  • 在程序开始的 main 函数中,通过 Viper 加载 application.yml 中的配置
  • 在初始化数据函数 InitDB 中,读取 Viper 中加载的配置并进行初始化操作

安装:根据文档进行

go get github.com/spf13/viper

获取请求参数

如果前端是表单提交:multipart/form-data

name := ctx.PostForm("name")
telephone := ctx.PostForm("telephone")
password := ctx.PostForm("password")

如果前端传来是 json 数据:application/json

  • 原生解析 json 方式:
var requestUser = model.User{}
json.NewDecoder(ctx.Request.Body).Decode(&requestUser)
  • Gin 中提供的函数:func (c *Context) Bind(obj interface{}) error
json.NewDecoder(ctx.Request.Body).Decode(&requestUser)
ctx.Bind(&requestUser)

数据验证

参考:Multipart/Urlencoded 绑定 | Gin Web Framework

  • Must Bind 类型的绑定,验证失败则请求中止,响应状态码被设置为 400 并且 Content-Type 被设置为 text/plain; charset=utf-8

  • Should Bind 类型的绑定,Gin 会返回错误并由开发者处理错误和请求

使用 UUID

go get github.com/satori/go.uuid

参考:GORM 中 Hook(对象生命周期)应用:使用UUID作为数据库主键

但是不建议这么用,大数据量下会影响性能

前端

前端只是简单记录一下知识点,没有源码。

环境搭建

Node.js 安装:参考Node.js 中文网

方式 1:去 Node.js 官网安装某个长期维护版本

方式 2(推荐):使用 nvm (Node Version Manager) 安装和管理多个 node 版本

Mac 下使用 HomeBrew 安装 nvm:

brew install nvm
source $(brew --prefix nvm)/nvm.sh
. ~/.bash_profile
# 查看帮助
nvm --help# 查看
nvm ls              # 查看本地安装的node版本
nvm ls-remote # 列出可以远程安装的所有node版本# 安装与卸载
nvm install node                # 安装最新版本
nvm install --lts node  # 安装最新的长期维护版本
nvm install v14.18.3        # 安装指定node版本
nvm uninstall v14.18.3  # 卸载指定node版本# 切换
nvm use v14.18.3    # 切换成指定的版本
nvm alias default 16 # 指定想用的版本号, 这样就不用每次打开终端都 nvm use 切换node -v # 查看当前node版本

yarn 安装:参考Yarn 中文文档

yarn -v

@vue/cli 安装:参考介绍 | Vue CLI

vue --version

创建项目

参考 Vue CLI 文档:创建一个项目 | Vue CLI

vue create ginessential-vue

ESLint

ESLint - 插件化的 JavaScript 代码检测工具 - ESLint中文文档 (bootcss.com)

ESLint 作用:1、检查语法错误 2、检查代码规范

环境变量

创建环境变量文件:.env.development.local.env.development

# API基础地址
VUE_APP_BASE_URL = http://localhost:8080/api/

在项目中使用:通过 process.env.VUE_APP_BASE_URL 即可获取到定义的值。

process 是 node 维护的全局变量

process.env 中保存着当前 node 项目中所有的环境变量

Vuex

Vuex 是什么? | Vuex (vuejs.org)

Vue 新的状态管理库 Pinia 也可以了解一下

登出有两种:

  • 前端登出:将 Vuex 中存储的 token、userInfo 清除(该 token 仍有效)
  • 后端登出:让 token 失效,前端即使使用 token 也无法获取信息

Go 语言 Gin 框架实战项目笔记相关推荐

  1. GO语言gin框架实战-02-Jwt和登录认证

    文章目录 1. 相关函数 2. router对其调用 3. 其他接口身份验证 4. postman 测试 4.1 测试登录接口 4.2 postman设置Cookies 4.3 其他接口调用身份验证测 ...

  2. G0第25章:Gin框架进阶项目实战

    1 Gin框架源码解析 通过阅读gin框架的源码来探究gin框架路由与中间件的秘密. 1.1 Gin框架路由详解 gin框架使用的是定制版本的httprouter,其路由的原理是大量使用公共前缀的树结 ...

  3. go语言 gin框架中集成zap日志库

    在go语言gin框架中,日志是默认输出到终端的,但是我们在实际工作中,一般来说是需要记录服务器日志的.而最常用的日志库就是zap日志库,我们需要将gin在终端输出的内容通过zap日志库记录到文件中,首 ...

  4. UNIAPP实战项目笔记43 购物车页面修改收货地址和修改默认地址

    UNIAPP实战项目笔记43 购物车页面修改收货地址和修改默认地址 实际案例图片 修改收货地址和修改默认地址页面布局和功能 具体内容图片自己替换哈,随便找了个图片的做示例 用到了vuex的状态机,具体 ...

  5. 视频教程-Apache Shiro权限框架实战+项目案例视频课程-Java

    Apache Shiro权限框架实战+项目案例视频课程 拥有10余年项目实战经验. 2006-2011在nttdata从事对日软件开发类工作. 2011-2015在HP从事技术服务工作. 擅长于j2e ...

  6. UNIAPP实战项目笔记28 商品分享功能点分享按钮分享到微信好友

    UNIAPP实战项目笔记28 商品分享功能点分享按钮分享到微信好友 detail.vue 加生命周期 // 点击分享onNavigationBarButtonTap(e) {if(e.type===' ...

  7. CSDN【top1】Pytest接口测试框架实战项目搭建

    一.前言 想想之前玩的框架,做的项目都是把数据用例冗余到一起的,不符合数据用例分离的思想,所以准备基于pytest搭建个测试框架,支持数据用例分离,接下来会用一系列文章逐步介绍整个框架是怎么搭建起来的 ...

  8. UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK

    UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK 注册时候需要发送验证 通过验阿里云或腾讯云等短信sdk供应商 实际案例图片 后端接口文件 index.js var express = r ...

  9. UNIAPP实战项目笔记45 订单页面布局完成和数据渲染

    UNIAPP实战项目笔记45 订单页面布局完成和数据渲染 实际案例图片 订单页面 具体内容图片自己替换哈,随便找了个图片的做示例 具体位置见目录结构 通过 模拟数据list 来实现数据渲染 完善布局页 ...

最新文章

  1. 深度学习模型训练过程
  2. CSP 201812-1 小明上学 Python实现+详解
  3. 功能强大的 C++ redis 客户端库增加至 acl 项目中
  4. reactjs使用eject暴露webpack核心配置
  5. java 右键事件_java table右键点击事件
  6. 的it生活_在日本生活了10年的IT女,聊聊回国工作的亲身经历
  7. 基于mxnet的Regression问题Kaggle比赛代码框架
  8. Is there anyway to discover which ip addresses are connected to the db?
  9. [C++] socket - 2 [UDP通信C/S实例]
  10. AlphaGo Zero:从头开始学习
  11. UE4之python编程
  12. android手机黑科技软件,安卓党福利!10款黑科技APP,让你的手机更好用
  13. 广东省计算机一级常考选择题,广东省计算机一级选择题
  14. k2p华硕系统怎么设置_斐讯K2刷华硕固件教程
  15. win8.1 安装kb2999226 一直提示 搜索更新
  16. Vue+FusionCharts 动态获取数据生成甘特图
  17. Required request body is missing:ParameterException解决方法
  18. 使用 Metasploit 渗透局域网 Windows 设备
  19. 苹果cmsV10MXone Pro自适应模板 站长亲测 全网首发
  20. 进制转换与进制转换表达式

热门文章

  1. Qt4_快速设计对话框
  2. Markdown (小白可查看的)基本语法
  3. trycatch处理流IO流中的异常
  4. sql server锁异常_SQL Server中异常处理的背景
  5. 关于阿里云OSS报错-java.lang.ClassNotFoundException: org.jdom.input.JDOMParseException
  6. JS删除数组里的某一个元素
  7. C/C++连接MySQL数据库执行查询
  8. Codeforces Round #519 by Botan Investments翻车记
  9. CF1042D Petya and Array
  10. maven课程 项目管理利器-maven 2-2第一个maven案例hellomaven