大象笔记

知者行之始,行者知之成

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 内,就算是我一个人开发、维护,都很容易出现全局变量重名的情况。不得已就得加前缀,但是这样就增加了 ...

阅读全文...

Golang CMS 通用的公司产品、服务介绍类网站框架设计

需求背景 我正在用 golang + react ant design pro 开发一套公司内部使用的物联网产品解决方案的介绍网站,同时支持电脑端和手机端。 但是突然来了一个客户的紧急需求,就是能够手机扫描二维码,直接查看产品介绍。 最初想做微信小程序,但是由于要兼容海外市场,最终决定采用 H5 页面的方式来实现,支持中英双语。 于是纠结来了。如果把现在正在开发的那套代码复制过来,很多地方都是需要调整的,例如: 公司 logo 企业名称 备案号 等。而这些模板修改,放到代码中,非常不方便维护,以后再有第三套,第四套同样需要这些修改。 于是,我想是否能够实现一套像 php wordpress ...

阅读全文...

golang fmt.Sprintf 中 %d 与 %s 混用会怎样

写了一个后台分页的 bug,问题的原因在 fmt.Sprintf 中我将 int 类型传递给了 %s。 有问题的代码 categoryId := 5 if categoryId > 0 { url += fmt.Sprintf("?category=%s", categoryId) } 其输出是: /solutions?category=%!s(int=5) 导致之后的参数解析逻辑没有正常执行。 而且这个 bug 具有隐蔽性,从打印日志输出看,我看了半天也没有发现这是一个错误的输出。 后来看 golang fmt 的文档,才知道这是错误信息。 Format ...

阅读全文...

上班开车单程1小时真是噩梦般的体验

去集团另一个子公司现场办公一个周,每天走高速单程一个小时,身心俱疲。 实力不允许做雷锋 第一天早上6:50出门,绕回公司接同事,再走高速去另一个公司。8:20到达,整整一个半小时。 本来还以为绕个圈小意思,没想到这个小意思足够回乳山老家的时间了。 第二天,我就不敢再做好事了,让同事打车到我门口,我再开车去现场。不过,天天等人的滋味也并不好受。 下高速查行程码,要命 本来开这么远的距离已经够糟心了,下高速还要排队查行程码,赶上早晚高峰,排个 15 分钟到 20 分钟很正常。 没有比这更让人上火的了,不到两天,嘴上就起了个泡。 压垮骆驼的最后一根稻草 今天早上,照例我提前到了约定地点,等候永远迟到 ...

阅读全文...

golang 生成文章简介

主要是为了用 golang 生成文章简介,及 html description 标签的内容。 逻辑 去除 html tag 取前 N 个字符 (160 个字母,或 80 个中文字符) HTML StripTags for Go, 去除 HTML 标签 https://github.com/grokify/html-strip-tags-go go get github.com/grokify/html-strip-tags-go 使用方法 import( strip "github.com/grokify/html-strip-tags-go" ) fun ...

阅读全文...

VIM Markdown 中打开当前光标所在的文件链接

由于我把记录每天 TODO 事项放在了 markdown 文件中,当需要记录具体某个事项的细节时,还是新开一个文档比较清晰,所以需要能在 VIM 中快速打开,或者新建文件。 vim-markdown 插件 原来 vim-markdown 组件是支持这个功能的: https://github.com/preservim/vim-markdown 安装: Plugin 'godlygeek/tabular' Plugin 'preservim/vim-markdown' NeoVim 中使用也完全没有问题。 ge 命令 要打开光标所在的文件链接,只需要在 VIM 中依次按下: ge 此时就 ...

阅读全文...

微信小程序 wxml include 公共模板

需求 我想在微信小程序每个页面的底部都加上统一的页脚,例如,问题反馈入口和版权信息等。 由于页面太多,全部逐页手动添加不现实,所以需要用到引入公共模板的功能。 连 golang 的 template 都支持 include 功能,更何况小程序的 wxml 呢。 查了一下,确实支持。 https://developers.weixin.qq.com/miniprogram/dev/reference/wxml/import.html 放在哪里 可以在项目根目录,与 pages 平级,新建一个 templates 的目录,专门用来存放公用模板。例如: footer.wxml header.wxm ...

阅读全文...

Android 通过 ACTION_IMAGE_CAPTURE 拍照获取原尺寸的 bitmap 图片

之前匆匆实现了 Android 拍照功能,但测试时发现得到的图片尺寸都很小,并不是拍照时的原始尺寸。 从官方文档得知原来 ACTION_IMAGE_CAPTURE 从 Intent 得到的是图片的缩略图。 而且解决过程中,万万没想到 Android 官方文档的中文版示例代码有问题,直接用里面的代码根本运行不了。同时,里面不少翻译错误。 需要切换为英文文档,才能跑通。浪费大量时间,服气了。 最终效果 为何直接从 Intent 得到的是缩略图 实际上 Android 官方文档写的也很详细: val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAP ...

阅读全文...