大象笔记

知者行之始,行者知之成

Building Distributed Applications in Gin

关于这本书 这本书全名是: 《Building Distributed Applications in Gin: A hands-on guide for Go developers to build and deploy distributed web apps with the Gin framework》 名字这么长大概是为了 SEO 吧。。。 国内找不到纸质书,只有 kindle 上有电子版,但是我的 kindle 已吃灰。加上最近迷上了看纸质书,因为可以乱写乱画,还能给大鸿撕着玩。 于是搞了个 PDF 版,在 PDD 上找了家湖南的打印店,A4 纸打印加装订,463 页包邮才 26, ...

阅读全文...

Ant Design Form 字段设置默认值

正确的做法 例如这种,在 form 的 initialValues 里设置各个字段的默认值。 而不是去具体字段里用 value 或 defaultValue 属性来设置默认值。 <Form {...formItemLayout} form={form} name="register" onFinish={onFinish} initialValues={{ residence: ['zhejiang', 'hangzhou', 'xihu'], prefix: '86', }} scrollToFirstError > ...

阅读全文...

nginx 部署 antd pro 在非根目录报 404 错误

例如,使用 antd pro 开发的网站管理后台,在服务器部署时,想部署在 /admin 这种非根目录。根目录留给 go gin 的路由处理。 在 nginx 里按照正常 root 配置,访问时会报 404 错误。 config/config.ts 配置方法 需要修改 antd pro 的配置文件: config/config.ts 添加配置: publicPath: '/admin/', base: '/admin/', 打包目录 打包之后,上传服务器,解压后,将 dist 重命名为 admin。 nginx 配置 location /admin { alias /some/path/f ...

阅读全文...

通过 go embed.FS 将 gin 模板及静态资源文件打包进二进制程序

使用 gin 写网站会涉及到大量的外部文件: HTML 模板文件 静态资源文件:js,css,图片等 多语言翻译文件 发布时,除了要将编译好的二进制文件上传到服务器,还需要将上面提到的三类文件同步到二进制文件所在的目录。这样有两个弊端: 部署麻烦 如果是交付给客户,放在客户服务器上运行,客户能拿到这些文件的明文 embed 打包 go 1.16 引入的新特性 embed 支持将这些外部文件打包入二进制文件。 而且 gin 也支持了 embed,配置起来就更方便了。 首先需要过一遍 go embed 的官方文档,否则 gin 里的 embed 代码不容易理解。 template 及 st ...

阅读全文...

ant design 组件上传视频直传七牛云

由于视频文件太大,不适合通过自己服务器中转一层,还是在前端直接传到七牛云合理。 文档 七牛云 Go SDK 文档,参考上传凭证的生成:https://developer.qiniu.com/kodo/sdk/go 七牛云 JS SDK 文档,参考其自定义文件名:https://developer.qiniu.com/kodo/1283/javascript 关于 token token 上传凭证。 作用:客户端(移动端或者Web端)上传文件的时候,需要从客户自己的业务服务器获取上传凭证 有效期:默认情况下,在不指定上传凭证的有效时间情况下,默认有效期为1个小时。也可以自行指定上传凭证的 ...

阅读全文...

sync.Map 实现 gin template 全局共享变量

需求背景 在用 gin 开发网站的时候,每个页面都需要相同的页眉和页脚。 里面有些变量是通用的,例如: 公司 logo 电话 公司名称 备案号 等等。 但是,每次都在 controller 里从数据库里读取这些配置,有两个弊端: 每个页面的 controller 都需要重复写这个配置参数传入逻辑,啰嗦 这些配置极少变化,每次都读取数据库,没有必要。可以通过缓存来优化 实现逻辑 增加一个 template func,方便 template 中直接调用,省去 controller 中传参的步骤 定义一个全局缓存,sync.Map 类型。 实现代码 cache.go langs 作为可选 ...

阅读全文...

golang 查看变量的原始定义类型

我想把 golang gin 多语言网站的语言配置提取出来,作为项目的配置项。 而我不知道 language.Chinese 到底是什么类型,是不是 zh 这样的字符串,于是想打印一下输出。 测试一下 package main import ( "fmt" "reflect" "golang.org/x/text/language" ) func main() { fmt.Println("Hello, 世界") fmt.Println(language.Chinese) // zh fmt.P ...

阅读全文...

golang gin 的多语言网站国际化支持 i18n

需求 我想在 golang gin 同一套网站模板中同时支持中文和英文,类似 SpringBoot 中的 Thymeleaf I18N 那样,能在模板中调用翻译。 <label th:text="#{label}"></label> 改造思路 但是 gin i18n 的文档里并没有介绍如何在 template 中使用翻译。大概是很少有人用 gin 写网站吧,都是如何在 api 中使用翻译的方式。 Google 搜素了半天,几乎没找到几个模板国际化相关的参考。好不容易找到一个台湾大哥的实现方案,给了我很大启发。 其实就是使用 golang templ ...

阅读全文...

使用 esbuild 对 js 进行打包

之前只用过 webpack 进行 js 项目打包,但其实都是用的现成的脚手架,不需要过多的自己配置。 这次是纯手动创建的项目,并没有任何脚手架代码及配置,所以我想尝试自己配置一遍。 为何选择 esbuild 粗略调研了一圈,webpack, rollup, vite, esbuild。 webpack 确实最强大,我甚至花了两天时间看了一本书,虽然学到不少,但用不到那么多配置 vite 感觉是人为推广,跟风严重,不太想去了解,而且开发环境是基于 esbuild。我对知乎上一致好评的技术选型有天然的抵触情绪 rollup 官方教程不错 我决定尝试 esbuild,仅仅是因为 esbuild 是 ...

阅读全文...

Antd Pro 无法修改图标,Module "./@ant-design/icons/xxx" does not exist in container

Antd Pro V5 的诡异问题不断,在新增了一个路由配置项,修改图标之后,导致报错。 之前的 V5 beta 版从来没有遇到这个问题,是最新的 V5 正式版新引入的问题。 新图标导致报错 { name: '配置项', icon: 'SettingOutlined', path: '/settings', component: './Settings', access: 'canAdmin', }, 报错信息: Module "./@ant-design/icons/SettingOutlined" does not exist ...

阅读全文...

多主题对应独立的 tailwind css 编译规则

需求背景 在一套网站代码里,嵌入多套页面模板主题。 这样就需要每个独立的主题都有一个独立的 css 文件。 而我使用的 tailwind css,那么就需要对每个 css 文件进行编译。原来的单一文件配置,需要做下调整。 现有的 tailwind 编译机制 Makefile 中的快捷命令: .PHONY: tailwind tailwind: npx tailwindcss -i ./css/main.css -o ./public/css/main.css --watch tailwind 配置文件: > cat tailwind.config.js module.exports ...

阅读全文...

golang gin 项目代码组织结构能否像 python django 一样清晰

现有的组织结构 现在使用的 golang gin 的代码组织结构是延续了之前使用 php laravel 的组织方式, 主要目录包括: models controllers views / templates public 每个目录下都是一堆堆的 go 文件,例如 controllers 下是 user.go, article.go 等。 现有结构的弊端 现有组织结构用了快两年,经历的 gin 项目多了之后,弊端就逐渐显露了出来。例如: 所有 controllers 都在一个 package 内,就算是我一个人开发、维护,都很容易出现全局变量重名的情况。不得已就得加前缀,但是这样就增加了 ...

阅读全文...