跳至主要內容

Gin 开发实战

OrangBus大约 2 分钟

使用go+gin自建一套脚手架。

目录结构

Gin

https://learnku.com/docs/gin-gonic/1.7

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

目录结构设计

路由初始化

/bootstrap/route.go

package bootstrap

import (
	"gin-web/app/middleware"
	"gin-web/routes"
	"github.com/gin-gonic/gin"
	"net/http"
	"strings"
)

func SetupRouter(router *gin.Engine) {
	// 注册中间件
	registerGlobalMiddlewares(router)

	// 注册理由
	routes.RegisterApiRoutes(router)
	routes.RegisterWebRoutes(router)

	// 设置接口错误返回
	setup404Handle(router)
}

func registerGlobalMiddlewares(router *gin.Engine) {
	router.Use(
		middleware.Cors(),
	)
}

func setup404Handle(router *gin.Engine) {
	router.NoRoute(func(c *gin.Context) {
		acceptString := c.Request.Header.Get("Accept")
		if strings.Contains(acceptString, "text/html") {
			c.String(http.StatusNotFound, "页面不存在")
		} else {
			c.JSON(http.StatusOK, gin.H{
				"code": http.StatusNotFound,
				"msg":  "接口不存在",
			})
		}
	})
}

路由注册

/routes/web.go

package routes

import "github.com/gin-gonic/gin"

func RegisterWebRoutes(router *gin.Engine) {
	router.Static("/assets", "web/dist/assets")
	router.Static("/images", "web/dist/images")
	router.LoadHTMLGlob("web/dist/index.html")

	router.GET("/", func(c *gin.Context) {
		c.HTML(200, "index.html", gin.H{
			"title": "mysql慢日志解析",
		})
	})
}

main.go

package main

import (
	"github.com/gin-gonic/gin"
	"webscoket/bootstrap"
)

func main() {
	router := gin.Default()
    gin.SetMode(gin.DebugMode)
	bootstrap.SetupRouter(router)

	err := router.Run(":3000")
	if err != nil {
		panic(err)
	}
}

请求数据

import axios from "axios";
import router from "../router/index.js";
import LocalStorage from "../utils/LocalStorage.js";
import EnumData from "../utils/EnumData.js";

axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
axios.defaults.withCredentials = true;
axios.defaults.timeout = 30000;

axios.interceptors.request.use((config)=>{
	config.headers['Authorization'] = 'Bearer ' + LocalStorage.get(EnumData.tokenLabel);
	config.headers['Content-Type'] = "multipart/form-data"; // 需要加上这个

	return config;
},(error)=>{
	return Promise.reject(error);
})

axios.interceptors.response.use((response)=>{
	const status = response.data.code;
	switch (status){
		case 200:
		case 202:
			return response.data;
			break;
		case 419:
			return router.push({path:"/login"})
			break;
		default:
			// snackbar.error("请求错误,刷新重试");
			break;
	}
	return response;
},(error)=>{
	return Promise.reject(error);
})

export default axios;

通用数据返回

在BaseController 中定义

package api

import (
	"github.com/gin-gonic/gin"
)

type BaseApiController struct {
}

// 成功返回
func RespSuccess(c *gin.Context, msg ...string) {
	message := "success"
	if len(msg) > 0 {
		message = msg[0]
	}
	c.JSON(200, gin.H{
		"code": 200,
		"msg":  message,
	})
}

// 错误返回
func RespError(c *gin.Context, msg ...string) {
	message := "success"
	if len(msg) > 0 {
		message = msg[0]
	}
	c.JSON(200, gin.H{
		"code": 202,
		"msg":  message,
	})
}

// 数据信息返回
func RespData(c *gin.Context, data interface{}, msg ...string) {
	message := "success"
	if len(msg) > 0 {
		message = msg[0]
	}
	c.JSON(200, gin.H{
		"code": 202,
		"data": data,
		"msg":  message,
	})
}

// 列表数据返回
func RespList(c *gin.Context, data interface{}, total int64, msg ...string) {
	message := "success"
	if len(msg) > 0 {
		message = msg[0]
	}
	c.JSON(200, gin.H{
		"code":  202,
		"data":  data,
		"total": total,
		"msg":   message,
	})
}

渲染vue前端

package routes

import "github.com/gin-gonic/gin"

func RegisterWebRoutes(router *gin.Engine) {
	router.Static("/assets", "web/dist/assets")
	router.Static("/images", "web/dist/images")
	router.LoadHTMLGlob("web/dist/index.html")

	router.GET("/", func(c *gin.Context) {
		c.HTML(200, "index.html", gin.H{
			"title": "在线追番下载器",
		})
	})
}

使用扩展库

jwt

钉钉消息通知

加载环境变量

加载配置文件