小报童排行榜导航

分类
AI
79
编程 Web3
41
个人成长(职场)
98
独立创业(出海)
33
产品运营
39
读书|英语
13
赚钱副业
140
技能提升
65
自媒体
91
提交专栏

coding

  • 100种互联网热门赚钱方法

    100种互联网热门赚钱方法

    100种互联网热门赚钱方法 最新、最热的互联网赚钱项目拆解,向有结果的人拿答案

    读者: 6075内容: 63
    作者:纯洁的微笑
  • 编程与 AI 编程

    编程与 AI 编程

    编程与 AI 编程 共 15 个小专栏:AI辅助编程高质量科普、C/C++、Java、Python、Go、Rust、k8s、前端、数据库、操作系统、网络安全、机器学习、运维、测试。

    读者: 4038内容: 200
    作者:findyi
  • 小白的AI编程提效课

    小白的AI编程提效课

    小白的AI编程提效课 小册包括六个专栏:AI编程实战、AI编程工具、AI高效办公、AI副业赚钱、AI提示词工程、AI私人助手

    读者: 3654内容: 41
    作者:峰兄
  • 阿里P9右军:20年职业50个思考与洞察

    阿里P9右军:20年职业50个思考与洞察

    阿里P9右军:20年职业50个思考与洞察 20年P9老兵的职业思考:程序员成长 | 系统化思维 | 行业洞察

    读者: 1556内容: 36
    作者:右军
  • 大模型应用开发 | API 实操

    大模型应用开发 | API 实操

    大模型应用开发 | API 实操 小册价值:快速入门OpenAI API,掌握核心能力:开发环境搭建、GPT原理、Chat、Tools、Assistants、Images、Audio

    读者: 1352内容: 33
    作者:菠菜
  • 程序员职场避坑指南

    程序员职场避坑指南

    程序员职场避坑指南 本小册整理了程序员从求职面试、在职发展、抉择成长三个方面,在职场中会遇到的几十个核心问题,旨在总结可复制的经验,帮助你在职场之路上避坑

    读者: 1249内容: 40
    作者:托尼学长
  • 嵌入式千宝箱解决小白入门的1000个问题

    嵌入式千宝箱解决小白入门的1000个问题

    嵌入式千宝箱解决小白入门的1000个问题 本专栏专注于解决嵌入式新手遇到的各种疑难问题,助力解决小白入门的1000个问题

    读者: 968内容: 229
    作者:易快学AI李肯
  • 史官的游戏研发入门培训手册

    史官的游戏研发入门培训手册

    史官的游戏研发入门培训手册 本专栏着重为刚入行和想要入行的朋友们提供一些参考和思路,包含且不限于游戏研发岗位职能介绍、游戏设计思路探讨,游戏创业经验总结等等

    读者: 798内容: 63
    作者:正义的史官
  • 小白零基础用Python量化股票分析小册

    小白零基础用Python量化股票分析小册

    小白零基础用Python量化股票分析小册 从小白的角度浅浅的介绍一下从零基础python入门,pandas库的使用,股票的数据的基本分析,可视化股票分析,以及如何写一个简单的量化策略,如何去回测你的策略

    读者: 656内容: 53
    作者:菜哥
  • 深入浅出Web3开发技术

    深入浅出Web3开发技术

    深入浅出Web3开发技术 本手册内容源自作者未完成的书籍稿件,内容包括Web3基础,智能合约技术和语言基础,智能合约开发、测试和部署,标准 Token 协议,区块链预言机,Keeper,数据索引服务 Graph,前端 Web3 框架等

    读者: 645内容: 111
    作者:Keegan小钢
  • Python 全家桶

    Python 全家桶

    Python 全家桶 专栏包含 Python「基础编程」和 「高级编程」,同时置顶帖赠送 爬虫开发、游戏开发、数据分析、人工智能、自动办公,旨在帮你一站式入门 Python 运用

    读者: 643内容: 164
    作者:算法金
  • 播客小捕手

    播客小捕手

    播客小捕手 播客小捕手是一个海外播客数据库,你可以:通过搜索功能搜寻到你感兴趣的内容。查看部分精华节目的人工总结。在这个数据库里查看该播客的中文稿。

    读者: 637内容: 56
    作者:Jimmy Wong
  • Go 语言 与 AI 提效

    Go 语言 与 AI 提效

    Go 语言 与 AI 提效 小册共分 7 个大专栏:Go 入门、Go 进阶、Go Web 开发、Go 微服务、Go 源码、Go 面试、AI 提效(包含 3 个小专栏)

    读者: 582内容: 94
    作者:木川
  • 史官的游戏人生-第1季@正义的史官

    史官的游戏人生-第1季@正义的史官

    史官的游戏人生-第1季@正义的史官 本专栏从一个游戏设计者的视角观察和理解生活,也从生活中感受和领悟游戏的精神内核。每周至少会更新一篇1500字左右文章,至少更新50篇。

    读者: 558内容: 52
    作者:正义的史官
  • Python潮流周刊 | 每周连载中

    Python潮流周刊 | 每周连载中

    Python潮流周刊 | 每周连载中 从全网挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等丰富内容,第一时间汇聚给你阅读。

    读者: 318内容: 117
    作者:穆宁
  • C++埋点SDK项目实战

    C++埋点SDK项目实战

    C++埋点SDK项目实战 【终身订阅】C++客户端埋点相关的SDK实战项目。适合入门和进阶C++的同学

    读者: 312内容: 19
    作者:程序喵
  • 基于 Gin 封装的高效 Web 框架

    基于 Gin 封装的高效 Web 框架

    基于 Gin 封装的高效 Web 框架 从零开始教你如何基于 Gin 框架封装自己的 Web 框架,涵盖框架设计与实现。无论你经验水平如何,都可获得实际项目开发技巧,提高开发效率。

    读者: 233内容: 49
    作者:新亮
  • 产品经理的技术课

    产品经理的技术课

    产品经理的技术课 给产品经理讲技术,普及技术基础知识。结合具体案例循序渐进地讲解产品经理需要学习的技术知识

    读者: 208内容: 37
    作者:熊哥
  • 游火研究院 2023

    游火研究院 2023

    游火研究院 2023 每个工作日收取一篇推送,由我们的编辑团队为你筛选全球游戏行业重要新闻。支持通过微信或者邮箱阅读

    读者: 176内容: 413
    作者:小编
  • 游火研究院 - 2024

    游火研究院 - 2024

    游火研究院 - 2024 每个工作日收取一篇推送,由我们的编辑团队为你筛选全球游戏行业重要新闻。支持通过微信或者邮箱阅读

    读者: 168内容: 279
    作者:小编
  • 产品成长指北

    产品成长指北

    产品成长指北 产品通识知识库,也是产品实践手册;致力于为读者建立扎实的产品基本功

    读者: 167内容: 151
    作者:产品星球
  • 大数据技术在用户画像中的应用

    大数据技术在用户画像中的应用

    大数据技术在用户画像中的应用 大数据技术画像应用实战,从0到1,带你入门大数据技术

    读者: 165内容: 23
    作者:诸葛子房
  • 播客制作手册(2023版)

    播客制作手册(2023版)

    播客制作手册(2023版) 播客制作手册2023版。本版会在播客制作手册2020版 上进行修订,并补充品牌播客与内容生态的理解。旨在帮助更多人能够轻松了解并上手播客。你将在这里见证播客制作手册诞生的全过程,并参与讨论。

    读者: 157内容: 61
    作者:zac
  • 简明数据库小课「已完结,放心买」

    简明数据库小课「已完结,放心买」

    简明数据库小课「已完结,放心买」 面向产品经理的数据库小课,通过案例、原型等方式,从产品经理的视角讲解数据库知识。覆盖数据库概念、实操、案例、数据分析、如何使用AI工具、数据仓库、BI和PaaS等全方位的知识。

    读者: 138内容: 31
    作者:产品海豚湾
  • 硬件产品经理手册

    硬件产品经理手册

    硬件产品经理手册 这是在过去 几年的工作里,我关于做硬件产品经理工作的最佳实践指南。

    读者: 132内容: 29
    作者:Ahab
  • 王建硕的 Web3 启蒙书

    王建硕的 Web3 启蒙书

    王建硕的 Web3 启蒙书 本专栏是关于Web3的启蒙书,适合初学者入门,内容包括Web3的基础知识、技术原理、应用场景等

    读者: 130内容: 40
    作者:王建硕
  • 人人都能读懂的技术专栏

    人人都能读懂的技术专栏

    人人都能读懂的技术专栏 它应该是接地气的,完全可以用非专业性术语去描绘,应该是人人都能读懂的

    读者: 126内容: 15
    作者:程序员冲少
  • Chrome插件全栈开发实战

    Chrome插件全栈开发实战

    Chrome插件全栈开发实战 真实出海项目的实战教学课,讲解Chrome插件和Next.js端的全栈开发,教你最佳的出海技术栈组合,帮助你半个月内成为全栈出海工程师。

    读者: 120内容: 20
    作者:程普
  • Java入门进阶与AI 提效

    Java入门进阶与AI 提效

    Java入门进阶与AI 提效 本学习手册的内容主要包括:从 Java 入门到 Java 进阶以及AI提效,介绍从Java SE、Java EE、常用框架以及AI助力编程提效等方面

    读者: 119内容: 43
    作者:秋天
  • 三爷的B端产品专家进阶之路

    三爷的B端产品专家进阶之路

    三爷的B端产品专家进阶之路 本专栏我希望帮助所有还在一直进行单一功能设计工作的同学进行一次全面升级,帮助每一位专栏读者构建高阶产品人所必须的技能树,进行一次维度升级,实现从简单的功能设计到更高维度的产品规划的技能突破

    读者: 113内容: 43
    作者:三爷
  • 然阿姨的成长顿悟2023-2024

    然阿姨的成长顿悟2023-2024

    然阿姨的成长顿悟2023-2024 主要更新内容:👉真实职场经历和总结(脱敏版)👉近期阅读推荐👉付费咨询手记(脱敏版)👉部分播客访谈脱水文字版

    读者: 112内容: 132
    作者:然阿姨
  • 产品经理自由职业之路2022

    产品经理自由职业之路2022

    产品经理自由职业之路2022 作为探索了一年半自由职业的产品经理,接下来会用产品思维迭代商业IP,已经是小红书第一产品经理的我,希望和大家一起更快的成长

    读者: 98内容: 300
    作者:Super黄
  • 产品经理自由职业之路2023

    产品经理自由职业之路2023

    产品经理自由职业之路2023 作为探索了一年半自由职业的产品经理,接下来会用产品思维迭代商业IP,已经是小红书第一产品经理的我,希望和大家一起更快的成长

    读者: 97内容: 49
    作者:Super黄
  • AI辅助软件测试

    AI辅助软件测试

    AI辅助软件测试 小册分为四个主题:ChatGPT辅助软件测试入门,ChatGPT辅助软件测试进阶,ChatGPT辅助软件测试面试。

    读者: 90内容: 28
    作者:程序员馨馨
  • 前端快速入门

    前端快速入门

    前端快速入门 小册分为 5 个主题:前端入门、前端进阶、前端实战、面试经验、职场经验,一年内最少输出 30 篇心得

    读者: 86内容: 44
    作者:晨光
  • 软测面试精选题库

    软测面试精选题库

    软测面试精选题库 为你挑选100道面试题,并附上最优解,助你轻松搞定面试!

    读者: 65内容: 93
    作者:小谭
  • 零基础轻松入门前端:知识点加实战

    零基础轻松入门前端:知识点加实战

    零基础轻松入门前端:知识点加实战 深入浅出介绍前端各个知识点,同时实现一个涉及前后端的课程返现网站。适合在校学生、前端初学、后端、算法等开发人员。

    读者: 51内容: 20
    作者:windliang
  • AI 辅助学 Java

    AI 辅助学 Java

    AI 辅助学 Java 小册分为:AI 辅助学 Java 、AI 辅助学计算机、AI 辅助学数据库、AI 辅助学算法、AI 辅助学微服务、AI 辅助面试、AI 辅助改简历,AI 辅助编程副业

    读者: 49内容: 40
    作者:苍何
  • 个人独立游戏开发者指南

    个人独立游戏开发者指南

    个人独立游戏开发者指南 本专栏不教你具体如何编程,如何设计游戏,但会提供一定的产品思路。对于具体编程,设计等已经有许多优秀的教程,我也会在专栏中有详细的分享

    读者: 38内容: 16
    作者:五分之1蓝
  • Python精选300题

    Python精选300题

    Python精选300题 精选 Python 编程300题,附答案及详细解析,夯实基础,提炼精华。

    读者: 33内容: 302
    作者:迷途小书童的Note
  • 陈随易的Node.js全栈实验指南

    陈随易的Node.js全栈实验指南

    陈随易的Node.js全栈实验指南 本课程提供3种交付方式:1,小册文字版(165元包含);2,微信群问答(165元包含);3,录播视频版(单独付费,未定价)。

    读者: 30内容: 15
    作者:前端之虎陈随易
基于 Gin 封装的高效 Web 框架
订阅图标新亮

订阅数:235

文章数:49

专栏类型:买断制

编程 Web3
发布于 December 4, 2023
基于 Gin 封装的高效 Web 框架

小报童专栏: 基于 Gin 封装的高效 Web 框架

从零开始教你如何基于 Gin 框架封装自己的 Web 框架,涵盖框架设计与实现。无论你经验水平如何,都可获得实际项目开发技巧,提高开发效率。 相比于我的开源项目 go-gin-api(GitHub 5.5K Star),此框架去掉了一些集成的功能和界面,使得整个框架更加简洁、轻量。此外也对代码进行了升级以确保性能和稳定性。开发者就可以更灵活地选择所需的功能,并获得更好的性能和稳定性。 原价 199 元,限时特惠,只需 59.9 元。 买过后,从置顶帖【目录合集】加微信,发源码 + 进交流群。

查看专栏详情
5.7 自动化生成 model、dao、handler、routers 以及 Swagger 接口文档

1. 生成 model、dao

示例:

# 根目录下执行  
go run cmd/gormgen/main.go -dsn "root:123456789@tcp(127.0.0.1:3306)/gin_api_mono?charset=utf8mb4&parseTime=True&loc=Local" -tables "admin"

具体文档:cmd/gormgen/README.md

2. 生成 handler、routers

示例:

# 根目录下执行  
go run cmd/handlergen/main.go -table "admin"

具体文档:cmd/handlergen/README.md

3. 生成 Swagger 接口文档

# 根目录下执行
./scripts/swagger.sh

4. 注册路由

// 定义自动生成的路由组前缀为 /api
generatedRouterGroup := mux.Group("/api")  
// 注册路由  
admin.RegisterGeneratedAdminRoutes(logger, db, generatedRouterGroup)

文件地址:internal/router/router.go

5. 重启项目

项目重启后访问:http://127.0.0.1:9999/swagger/index.html 会看到生成的接口文档。

获取源码,可添加我微信 wx-xinliang 。


有启发,左下角点击“启发”告诉我呀,点我即可直接跳转到小册目录合集 。

6.10 用 Go 写了一个桌面程序,源码免费分享给大家

用 Go 写了一个桌面程序:生成授权码的小工具,先看下效果。

我已经安装到 macOS 上了。

源码地址:jazr2......

6.9 mongo-driver 完整用法与示例代码
1. 安装 mongo-driver

可以使用以下命令进行安装:

go get go.mongodb.org/mongo-driver/mongo

2. 基本连接与配置

Mo......

6.8 go-redis/redis 完整用法与示例代码
1. 安装 go-redis

可以使用以下命令安装:

go get github.com/go-redis/redis/v8

2. 基本连接

你可以通过 redis.NewC......

6.7 go-resty/resty 完整用法与示例代码
1. 安装

可以通过以下命令安装:

go get github.com/go-resty/resty/v2

2. 创建一个简单的 HTTP 客户端

通过 resty.New(......

5.6 示例二:集成登录、注册和用户管理功能

缘起:有部分开发者提出了这样的需求:“亮哥,看了文档和源码后,我还是不知道如何下手,可以基于 gin-api-mono 集成下登录、注册和用户管理功能吗?”

于是就有它......

3.6 包装 gin Context

Context 是一个上下文对象,它提供了许多有用的方法和属性,用于处理 HTTP 请求和响应。

代码片段:

// ./internal/pkg/core/con......
3.5 包装 gin IRoutes

IRoutes 接口是定义路由组的接口。

IRoutes 接口包含了定义路由的方法,可以用于添加路由和中间件等。

代码片段:

// ./......
3.4 实现链路日志记录

目前可收集日志类型包括:

  1. 当前的请求日志

  2. 当前的响应日志

  3. 自定义调试日志

  4. MySQL 操作日志

  5. Redis 操作信息

  6. Mongo 操作信息

  7. 请求三方 API 接口的请求与响应日志

日志收集,代码片段:

// ./internal/pkg/core/core.go

// region 记录日志
var t *trace.Trace
if x := context.Trace(); x != nil {
	t = x.(*trace.Trace)
} else {
	return
}

decodedURL, _ := url.QueryUnescape(ctx.Request.URL.RequestURI())

// ctx.Request.Header,精简 Header 参数
traceHeader := map[string]string{
	"Content-Type": ctx.GetHeader("Content-Type"),
}

t.WithRequest(&trace.Request{
	TTL:        "un-limit",
	Method:     ctx.Request.Method,
	DecodedURL: decodedURL,
	Header:     traceHeader,
	Body:       string(context.RawData()),
})

var responseBody interface{}

if response != nil {
	responseBody = response
}

t.WithResponse(&trace.Response{
	Header:          ctx.Writer.Header(),
	HttpCode:        ctx.Writer.Status(),
	HttpCodeMsg:     http.StatusText(ctx.Writer.Status()),
	BusinessCode:    businessCode,
	BusinessCodeMsg: businessCodeMsg,
	Body:            responseBody,
	CostSeconds:     time.Since(ts).Seconds(),
})

t.Success = !ctx.IsAborted() && (ctx.Writer.Status() == http.StatusOK)
t.CostSeconds = time.Since(ts).Seconds()

logger.Info("trace-log",
	zap.Any("method", ctx.Request.Method),
	zap.Any("path", decodedURL),
	zap.Any("http_code", ctx.Writer.Status()),
	zap.Any("business_code", businessCode),
	zap.Any("success", t.Success),
	zap.Any("cost_seconds", t.CostSeconds),
	zap.Any("trace_id", t.Identifier),
	zap.Any("trace_info", t),
	zap.Error(abortErr),
)
// endregion

使用日志组件,代码片段:

// main.go

import "gin-api-mono/internal/pkg/logger"

// 将日志输出到文件
accessLogger, err := logger.NewJSONLogger(
	logger.WithField("domain", fmt.Sprintf("%s[%s]", configs.ProjectName, env.Active().Value())),
	logger.WithTimeLayout(timeutil.CSTLayout),
	logger.WithFileP(configs.ProjectAccessLogFile),
)

// 将日志输出到文件 + 控制台
accessLogger, err := logger.NewJSONLogger(
	logger.WithOutputInConsole(),
	logger.WithField("domain", fmt.Sprintf("%s[%s]", configs.ProjectName, env.Active().Value())),
	logger.WithTimeLayout(timeutil.CSTLayout),
	logger.WithFileP(configs.ProjectAccessLogFile),
)

// 如果需要日志分割,可以使用 WithFileRotationP() 方法。

记录自定义调试日志,代码片段:

import "gin-api-mono/internal/pkg/debug"

// 示例一,记录多个数据
debug.WithContext(ctx.RequestContext()).Logger("这是调试信息A1", "这是调试信息A2")

// 示例二,记录单个数据
debug.WithContext(ctx.RequestContext()).Logger("这是调试信息B")

记录 MySQL 操作日志,代码片段:

// 查询数据,核心是使用 .WithContext() 方法
h.db.GetDbR().WithContext(ctx.RequestContext()).Where(queryWhere).Find(&resultData)

记录 Redis 操作日志,代码片段:

import "gin-api-mono/internal/repository/redis"

// get,核心是使用 ctx.RequestContext() 参数
getResult, err := redis.GetRedisClient().Get(ctx.RequestContext(), "name").Result()

记录 Mongo 操作日志,代码片段:

import "gin-api-mono/internal/repository/mongo"

// 获取 Mongo Client
client := mongo.GetMongoClient()

// 获取 Collection,例如 Database 为 gin_api_mono,Collection 为 user
collection := client.Database("gin_api_mono").Collection("user")

// 查询数据,核心是使用 ctx.RequestContext() 参数
findResult, err := collection.Find(ctx.RequestContext(), bson.D{})

记录请求三方 API 接口的日志,代码片段:

import "gin-api-mono/internal/pkg/httpclient"

// 支持在上下文记录执行日志的 httpclient
client := httpclient.GetHttpClientWithContext(ctx.RequestContext())

// 普通的 httpclient
client := httpclient.GetHttpClient()

// GET
resp, err := client.R().
      SetQueryParams(map[string]string{
          "page_no": "1",
          "limit": "20",
          "sort":"name",
          "order": "asc",
          "random":strconv.FormatInt(time.Now().Unix(), 10),
      }).
      SetHeader("Accept", "application/json").
      SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F").
      Get("/search_result")

日志结构,代码片段:

// ./internal/pkg/trace/trace.go

// Trace 记录的参数
type Trace struct {
	mux                sync.Mutex
	Identifier         string     `json:"trace_id"`             // 链路ID
	Request            *Request   `json:"request"`              // 请求信息
	Response           *Response  `json:"response"`             // 返回信息
	ThirdPartyRequests []*HttpLog `json:"third_party_requests"` // 调用第三方接口的信息
	Debugs             []*Debug   `json:"debugs"`               // 调试信息
	SQLs               []*SQL     `json:"sqls"`                 // 执行的 SQL 信息
	Redis              []*Redis   `json:"redis"`                // 执行的 Redis 信息
	Mongos             []*Mongo   `json:"mongos"`               // 执行的 Mongo 信息
	Success            bool       `json:"success"`              // 请求结果 true or false
	CostSeconds        float64    `json:"cost_seconds"`         // 执行时长(单位秒)
}

不同组件能够将日志记录到上下文的核心是 拦截器,具体在第三方组件集成章节详细描述,此模块有些复杂,也可以微信找我沟通。


有启发,左下角点击“启发”告诉我呀,点我即可直接跳转到小册目录合集 。

3.3 实现错误处理与告警

使用 IsAborted 函数来判断进行错误处理。

统一处理,代码片段:

// ./internal/pkg/core/core.go // region 发生......
查看专栏详情