突发奇想,写了个 QSL 卡管理系统
起因特别没仪式感:前几天翻抽屉翻出几张 QSL 卡,又看到本子上记的通联,哪张寄了哪张没寄,得靠想。都 2026 年了还这么管换卡,有点说不过去。顺手搜了下有没有现成的,找到 bi1kbu 写的 qsl-management,公开申请、卡片状态流转、快递查询,设计挺全。看完的结论是:思路我全要,但还是想搞自己的——界面、流程都按自己的习惯来。
本来准备自己写。Go 起了个服务,GORM 连上 SQLite,写了半天登录,看了看后面还排着邮件、图片上传、前端、Docker,掂量了一下业余时间的分量,决定换人。代码交给 AI 写,我负责提需求、点页面、挑毛病。所以严格来说这个项目是我"写"的——划掉,是 AI 写的,我验收。
技术栈没什么可炫的:后端 Go + Gin + GORM,数据库 SQLite 一个文件,前端 Vue 3 加 Element Plus,最后打成一个 Docker 镜像扔服务器上,反代个域名完事。
功能围着"换卡"两个字展开。对方不用注册,网页上直接交申请,分 QSO、SWL、EYEBALL 三种场景,各自要填对应的证据——几点通联的、什么频率、什么模式,免得口说无凭。我这边审完建卡,之后制卡、寄出、收卡,每一步卡片都有状态,对方在进度页能看到时间线,挂号信的单号填进去还能查快递。SWL 最绕:得对方先寄卡过来,我收到之后再回寄,一来一回两个方向都要登记,这段流程来回改了好几版才顺。另外顺手做了 ADIF 导入,日志软件里导出来的文件直接丢进去,选中一条通联就能建卡;邮件通知全程自动,审批、寄出、签收都会发。后来还加了个插件机制,主题和统计功能做成插件,后台开关一点就生效,算是过度设计了,但好玩。
坑也踩了不少,记两个印象深的。一个是 GORM 的 Save:ID 为 0 的时候它执行的是 INSERT 不是 UPDATE,还是静默的,等着撞唯一索引才知道出事。另一个是 Docker 挂载卷的权限,宿主机上 root 建的目录,容器里的普通用户写不进去,SQLite 直接起不来,最后在 ENTRYPOINT 里先 chown 再降权才解决。写完还让 AI 补了个 E2E 脚本,一百多项检查全过才敢部署——它写得比我看得快,不测着心里实在没底。
项目开源在 github.com/amnssb/hamqsl,想自部署一套的可以直接拿去用。
73!
本文由 AI 生成,内容经本人审核修改。