Gin 开发实战
大约 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
钉钉消息通知
加载环境变量
加载配置文件