友链朋友圈

GO 的 Web 开发系列(五)—— 使用 Swagger 生成一份好看的接口文档

经过前面的文章,已经完成了 Web 系统基础功能的搭建,也实现了 API 接口、HTML 模板渲染等功能。接下来要做的就是使用 Swagger 工具,为这些 Api 接口生成一份好看的接口文档。 一、写注释 注释是 Swagger 的灵魂,Swagger 是通过特定格式的注释生成接口文档的。 1.1 基础注释 这部分基础注释对全接口文档通用,指定接口文档的基础信息,可添加在 main 函数上。 注释 说明 示例 title 必填 应用程序的名称。 // @title Swagger Example API version 必填 提供应用程序API的版本。 // @version 1.0 description 应用程序的简短描述。 // @description This is a sample server celler server. tag.name 标签的名称。 // @tag.name This is the name of the tag tag.description 标签的描述。 // @tag.description Cool Description tag.docs.url 标签的外部文档的URL。 // @tag.docs.urlhttps://example.com tag.docs.description 标签的外部文档说明。 // @tag.docs.description Best example documentation termsOfService API的服务条款。 // @termsOfServicehttp://swagger.io/terms/ contact.name 公开的API的联系信息。 // @contact.name API Support contact.url 联系信息的URL。 必须采用网址格式。 // @con...

玖涯博客 发表于 2024年02月12日 20:37:40

GO 的 Web 开发系列(四)—— 静态资源文件访问的几种方式

Web 开发过程中,不可避免会包含有 js / css 等静态资源文件,在 Gin 框架中如何优雅的访问这些静态资源呢? 一、访问外部静态文件 静态资源不打包进可执行文件内部,与可执行文件放在同一目录下,这时候 Gin 的 API 可以直接访问这些文件。 router := gin.Default()router.Static("/admin", "resource/admin") 通过 http://127.0.0.1:8080/admin/ 就可以访问 resource/admin 目录下的资源文件了。 但这种访问方式其实限制也比较多,如果我们希望通过不同的业务字段进行判断,进而实现不同资源文件的响应,那就需要自己增加 GET 方法进行实现。 router.GET("admin/*filePath", func(c *gin.Context) { // 拿到请求 url url := c.Request.RequestURI // 这里可以通过 c.Param 等拿到参数,进行相关的业务判断,然后决定是否响应文件 // ... // 响应文件 c.File("resource/" + c.Request.RequestURI)}) 二、访问内部静态文件 以上方式虽然简单好用,但是需要将资源文件放在可执行文件外部。在一些特殊场景下,我们可能希望把资源文件放在可执行文件内部。 这时候就需要借助 Embed 功能,这个功能是 Go 内置的静态文件打包工具需要 Go 1.16 版本以上才可以支持,只需要几行代码即可进行简单配置。 package mainimport "embed"//go:embed resource/admin/*var f embed.FSfunc main() { router := gin.Default() router.Static...

玖涯博客 发表于 2024年01月31日 21:00:31

GO 的 Web 开发系列(三)—— 通过 Gin 实现 Html 模板和 Api 接口路由

Gin 的路由其实就是 Java 中 @RequestMapping 注解的内容,只是 Go 需要在一个代码模块中统一对所有路由进行配置。 一、路由组配置 一般情况下,通过路由需要完成两个事情,一是通过 HTML 模板完成前端页面的渲染,二是实现 Api 接口调用。 这两部分功能是完全不一样的,在 Gin 中可以用两个不同的路由组来隔离逻辑。 router := gin.Default()// 指定模板文件所在的路径router.LoadHTMLGlob("templates/*.html")// 渲染html的路由组htmlGroup := router.Group("")// api 处理的路由组apiGroup := router.Group("api") 再更近一步,可以将 API 路由组再细分为公共 API 和私有 API。 // 公共API路由组publicGroup := apiGroup.Group("public")// 私有API路由组,绑定鉴权中间件privateGroup := apiGroup.Group("")privateGroup.Use(middleware.AdminAuth) 二、API 接口实现 创建一个简单的 GET 接口,并返回一条字符串数据内容。 apiGroup.GET("/health", func(c *gin.Context) {c.String(200, "ok health")}) 返回一个 JSON 数据: apiGroup.GET("/health", func(c *gin.Context) {c.AbortWithStatusJSON(200, map[string]string{"msg": "ok health"})}) 三、HTML 模板渲染 渲染模板用的是 Go 内置的 html.template 工...

玖涯博客 发表于 2024年01月31日 00:59:42

GO 的 Web 开发系列(二)—— Web 项目的技术框架选择和项目搭建

Web 系统搭建第一步,选择技术框架,完成 Hello World。 小玖用的 Go 版本是 1.21.6 介绍项目的技术选型个结构,不包括代码。 一、技术框架选择 Web 框架: github.com/gin-gonic/gin v1.9.1 调研了 Go 开发者一圈,给小玖推荐这个框架的人最多 主要优点是轻量容易定制。 ORM 框架: xorm.io/xorm v1.3.6 最初小玖选的 gorm,因为网上的评价一致是:gorm 是国人开发,用户更多,文档更完善,更简单好用;xorm 的优点只是性能好点。 但是后面查问题时发现,gorm 网上相关的资料也不是那么多,所以改为了使用 xorm。 (搜索 gorm 的问题,出来了很多 xorm 的相关回答) 主要是这个框架自带缓存功能,想偷懒一下~ 配置文件处理工具: github.com/spf13/viper v1.18.2 这个工具可以同时处理 yaml、json 和命令行参数等多种配置方式,所以选择了它。 以下这些工具包,根据网上使用人数,以及功能是否完善、丰富做的选择。 日志框架: go.uber.org/zap v1.26.0 BCrypt 生成工具: golang.org/x/crypto v0.18.0 JWT 工具: github.com/dgrijalva/jwt-go v3.2.0+incompatible Redis 连接工具: github.com/go-redis/redis/v8 v8.11.5 MySQL 连接工具: github.com/go-sql-driver/mysql v1.7.0 UUID 生成工具: github.com/google/uuid v1.4.0 验证码生成工具: github.com/mojocn/base64Captcha v1.3.6 内存缓存工具: githu...

玖涯博客 发表于 2024年01月21日 14:46:47

GO 的 Web 开发系列(一)—— Java 与 Go 做 Web 程序的区别

小玖是奋斗一线的 Java 开发,准备自己开发一个建站程序,出于某些原因,小玖最终将建站程序的开发语言选择了 Go。 对于 Go 小玖其实之前并没有太多接触过,也只能算是个初学者吧,所以对 Go 的 WEB 开发从初学的角度总结经验,希望日后能对初学 Go 语言的小伙伴有所帮助。但本系列不会从零基础开始介绍,是针对有一定程序开发基础的同学,Go 的一些基础语法就不会详细介绍。 一、为什么选择 Go 可能很多伙伴会有疑问,Java 的 SpringBoot 一整套框架做 Web 开发效率高,技术成熟,文档和解决方案都很成熟,为啥小玖要选择 Go 呢? Go 和 Java 其实差别还是比较大的,这其实是综合考虑的结果,因为 Go 能解决一些小玖认为非常重要的问题,而 Java 却刚好难以解决或者说无法解决。 Java 占用内存高,SpringBoot 框架一启动,直接把内存占满(对小玖的弱鸡服务器跑起来真的非常吃力啦); Java 的虚拟机机制有些鸡肋,无法动态的去调整内存,比如 -Xmx 等虚拟机参数; Java 编译的程序需要依赖 JVM 环境,而 Go 编译后的二进制文件可以直接运行(便于建站程序日后的交付); Java 编译的 Class 容易反编译破解,虽然有一些类似通过自定义 ClassLoader 进行加密的方案,但安全性还是差了很多。小玖了解到的最安全的方案还得是通过 JNI 去调二进制文件做加密和验证,太麻烦了。 基于以上这些问题,小玖找了好久的解决方案,比如 GraalVM 等等的都去了解过,这些方案总是有些局限性,所以,最终选择了 Go。 Go 占用的内存少,而且编译成的二进制文件源码安全性也更有保障。 Go 有以上技术优势,也存在一些劣势,尤其是在生态这块和 Java 差距很大。 二、Java 与 Go 语言上的差异 非 Go 语言专家,只谈谈自己使用以...

玖涯博客 发表于 2024年01月21日 14:46:04

呕心沥血大作,万事顺意玖涯定制款红包封面来啦~

万事顺意玖涯定制款微信红包封面来啦~ Wow So Dreamy 在元旦,小玖发布了 Halo-Plus & Dream 第一份正式年报。 年报中,小玖讲述了23年来 Dream 和 Halo-Plus 的迭代历程和自己的想法,同时也启动了跨年送封面的活动。 非常感谢小伙伴们的喜欢和支持。 但遗憾的是,没能在元旦时定制一款好看的封面。 痛定思痛,一连好几夜,小玖纯手工手绘了一款红包封面。 一、绘画过程简览 二、封面成品一览 最终成品红包封面如下图。 威武霸气的龙,配上活泼可爱的小松鼠,用上这款封面,这红包发的就会很有排场! 虽然是第一次做手绘,但是相信还是非常精美的,希望大家喜欢。 三、新年送福 与元旦时的活动方式相同,同样是 24 份,公众号后台回复 “万事顺意” 领取,先到先得。

玖涯博客 发表于 2024年01月12日 23:38:52

寻觅2024:Dream + Halo-Plus 的第一份正式年报——追寻梦的方向,聆听心的声音

自去年发布了 逐梦2023 之后,越来越有一种感觉,是应该写一封年报的,记录这一年来的变化,所以有了这篇文章——Dream + Halo-Plus 的第一份正式年报。 年关将至,回顾这一年,有许多事项出乎了我的意料。其中包括了 Halo 2.0 定位的改变、我自身个人博客内容的改变,以及我对博客样式风格的一些审美的转变。这一系列的原因导致了我这一年来没有按计划的进行主题的升级和适配,或许计划在大多时候都赶不上变化,犹如逐梦一场。 一、与 Halo 2.x 的诀别 这里是一封与 Halo 官方的诀别信,也许让不少博主感受到沮丧,因为我没能做到曾经说过的拥抱 Halo 2.0 的诺言,对于 Halo 2.x 的适配也比预计的时间晚了些许。 一直以来,支持我更新的动力是我自身一直在更新维护自己的博客系统,开源是为了方便更多热爱个人博客的博主,让他们可以免费地使用与定制主题。同时也希望能够得到一些有建设性的意见和建议,帮助主题的迭代和发展。但随着对 Halo 2.x 更深入的了解,慢慢发现 Halo 2.x 的几次迭代都与我想要的博客系统已经渐行渐远了,Halo 2.x 在官网上的定位也由 开源个人博客系统 更新为了 开源建站工具,这个转变让我对升级 2.0 产生了诸多疑虑。 现今的 Halo 2.x 功能越来越丰富,提供了用户管理、插件机制等等,有点像另一个 WordPress,这与我想要的 轻量、快速的个人博客系统 这个理念背道而驰。同时也带来了一些困恼,比如 不同插件的兼容性、主题与插件的职责划分 等等…… 个人认为,个人博客系统应简而美,专注于写作,是一套写作工具的完美结合,从而给博主提供最佳的写作体验。而非是多个工具、插件之间的选择,不同工具插件各有特性,难以完美结合。 所以,最后我决定继续使用 Halo 1.x 系统,并且 clone 了 Halo 1.x 相关的开源库...

玖涯博客 发表于 2024年01月01日 00:00:00

微信红包封面分销代理开通方法

一、下载微店店长版APP 下载微店店长版APP,注册登录后,实名认证,才能分销(实名教程看下图) 二、扫码分销 实名认证后需要用微店店长版app扫分销码 分销码如下: 三、认证微信支付 四、分享店铺 分享店铺(生成你自己店铺的链接,然后推广这个链接就可以了) 不要用小程序分享,红包封面是虚拟商品,小程序可能打不开链接

玖涯博客 发表于 2023年12月30日 13:27:17

通过 Nginx 代理实现网页内容替换

突发奇想,用 Nginx 代理一个网站,把网站的一些关键字替换掉,蛮有意思的。 如下图: 一、编译安装 Nginx 一般 Nginx 中不包含 subs_filter 文本替换的模块,需要自己手动编译安装,步骤如下。 克隆 subs_filter 仓库: git clone http://github.com/yaoweibin/ngx_http_substitutions_filter_module.git 正常下载 Nginx 源码包解压,并安装相关编译环境: # 解压安装包tar -zxvf nginx-1.22.1.tar.gz# 安装编译环境yum -y install gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel 预编译 Nginx,需要携带上 --with-http_sub_module 参数,并通过 --add-module 指定刚刚拉取的 subs_filter 仓库地址。 本文中仓库地址为:/root/install/ngx_http_substitutions_filter_module/ 所以需要携带上关键参数:--with-http_sub_module --add-module=/root/install/ngx_http_substitutions_filter_module/ 完整预编译命令如下: ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_sub_module --with-http_v2_module --add-module=/...

玖涯博客 发表于 2023年12月23日 00:41:23

2023年国庆出游之香港六天五夜行程总结

香港是一个拥有历史悠久、独特文化的国际大都市。这次出行是带着香港银行卡开户的目的去的,去之前对银行开户做了许多攻略,去之后发现香港和想象中的挺有区别,简单总结一下。 一、准备阶段 港澳通行证办理和签注 去香港的第一步准备是办理港澳通行证,现在一些城市也支持异地办理,一般本地户口办理需要一周左右,外地户口办理需要两到三周。但建议还是提前 一个月 以上去办理港澳通行证,因为有些城市可能涉及到 跨境网络诈骗,办理港澳通行证会比较慢。而且除深圳外,其他城市应该都是要有了港澳通行证才可以买票哦,港澳通行证晚了的话会影响买票。 如果已有港澳通行证的话,那就只需要签注一下就行了。现在个人旅游(G签)和团队旅游(L签)已经没有什么区别了,都不用报旅游团跟团。 酒店预订 提前预定可以找到更合适的酒店,但香港酒店无论价格基本上都是不支持退订的,需要注意一下。因为不支持退订的酒店就算和酒店方协商也是基本不会同意退订的,所以行程不是非常确定的话,尽量找可以退订的酒店吧。 香港手机卡和上网 在香港上网有两种方式: 一是买一张香港本地的手机卡,可以提前在淘宝上面买,很便宜。如果忘记买了,可以在香港买一张手机卡,33港币可以买一张50G流量的手机卡了。 二是买漫游流量,可以在运营商的APP上购买流量,或者支付宝上搜索跨境流量购买。但是这种流量一般都是按天按量计费的,特别贵,流量还少,并不是很建议购买,最开始在支付宝上买了200M一天/8元套餐,随便刷几下QQ和朋友圈流量就用完了。 港币兑换 在香港的实际体验过程中,港币纸币需要的场景很少,地铁、公交车和吃饭基本上都可以支付宝支付,只遇到过两次不接受支付宝支付。一次是在街上小摊买东西,我直接支付了纸币,另一次是在冰室吃饭,让我微信一兑一转账给他们(有点黑,当时的挂牌汇率是100:93.57)。 去香港出游,如果只是一两天的话其实没必要兑换港币,如果时间比较...

玖涯博客 发表于 2023年10月06日 01:42:21