轻拾人间辞藻,言说万千心绪。
开发历程
说实话,轻言的开发过程踩了不少坑,也正是这些坑让我对它越来越上心。
随机接口:从 10 秒到 50 毫秒
刚开始做随机获取接口时,我想法很简单:把所有句子查出来,打乱,取前几条。在数据只有几十条的时候完全没问题,但随着数据越来越多,这个接口开始暴露出性能问题。
六千条句子的时候,每次调用随机接口都要十秒多。不是毫秒,是秒。浏览器直接超时白屏,我自己都不好意思用。
问题出在哪里?全量加载。每次请求都把六千条句子从数据库捞出来,序列化成对象,丢进一个 ArrayList,再用 Collections.shuffle 打乱,取前 8 条。这个流程每一步都在消耗时间和内存。
查看Halo仓库时,看到了一条关于随机文章的PR,看到 PostFinderImpl 里的随机文章方法,思路完全不一样:
先用
countBy查总数(毫秒级)根据总数和每页条数算出总页数
随机抽一页
用
listBy只查这一页的数据(索引分页,极快)再使用
Collections.shuffle打乱模拟随机
我赶紧照着改。改完一测,响应时间从 10 多秒直接掉到 50 毫秒以内。这个过程让我深刻体会到,有时候看源码比看文档有用多了——文档只会告诉你有什么 API,源码才能告诉你这个 API 正确的使用姿势是什么。
踩坑 Halo 的 RBAC
最让我头疼的是接口公开访问的问题。随机获取接口是 GET,配置好角色模板后很快就能公开访问。但点赞接口我一开始设计成了 POST,不管怎么配角色模板的 verbs,始终返回 401。
我在 verbs 里写了 ["post"],不对。改成 ["create"],还是不对。折腾了大半天,最后不知道怎么搞的就又可以了。
修好之后,POST 接口终于能调通了。但考虑到实际使用场景——前端可能只是一个简单的链接,如果要求用户发 POST 请求,门槛就高了。最终我还是把点赞接口改成了 GET 方法:前端直接用 href 跳转就行,权限配置也更简单。
调谐器的坑
Halo 的自定义模型通过 Reconciler 来维护状态一致性。轻言用了一个 SentenceReconciler 来同步每个分类下的句子数量。看似简单,实际上踩了好几个坑:
第一个坑:删除句子后分类计数不更新。我一开始在 isDeleted 分支里直接 return 跳过了,导致删句子时分类数量始终不变。后来才意识到,删除操作也应该触发重新计数。
第二个坑:已标记删除的句子被 countBy 统计进去了。Halo 删除资源是先打 deletionTimestamp 标记finalizers 清理后才物理删除。在标记阶段countBy 依然能查到这条记录,所以分类数量始终比实际多一条。解决办法是在查询条件里加一个 Queries.Queries("metadata.deletionTimestamp",true)。
第三个坑:死循环。句子被标记删除后,如果 finalizers 没有被清理,Reconciler 会反复被触发,每次都更新一次分类计数,进入无限循环。最后我加上了手动清理 finalizers 的逻辑,让删除流程能正常结束。
这三个坑一个个踩过来,才算真正理解了 Halo 的控制器模式。以前看文档里讲 Reconciler 觉得抽象,自己写一遍、调一遍、炸一遍,就全明白了。
从 Finder 到主题模板
轻言最早只提供了 REST API,用户需要自己写前端去调接口。后来接触了 Halo 的 Finder 机制,发现可以直接在 Thymeleaf 模板里调用,一行 Java 代码都不用写。
于是我给轻言加上了 Finder API 和默认主题模板。模板用 Tailwind CSS 写的,支持随机展示句子、按分类筛选、换一批刷新。因为是直接在服务端渲染,首屏速度很快,不需要等 JS 加载完才能看到内容。
功能介绍
轻言是一款句子管理插件,支持创建、管理海量句子,按分类归档。主要功能:
句子管理:新建、编辑、删除句子,支持 JSON 和 Excel 批量导入
分类归档:自定义分类,侧边栏导航,实时统计各分类句子数量
模糊搜索:支持关键词搜索句子内容
点赞互动:开放点赞和取消点赞接口
主题集成:提供 Finder API,可在 Halo 主题模板中直接调用
数据看板:后台概览页面,展示句子总数、分类分布、发布状态统计
插件截图





开源地址
PureSkys/plugin-hitokoto-hub: 轻拾人间辞藻,言说万千心绪
结语
从一个十秒多的随机接口,到后来毫秒级的响应;从没完没了的 401,到给匿名用户也能点赞;从调谐器的死循环,到删除流程的顺畅结束——每一步都是踩着坑过来的。
我希望这款插件能帮助到其他 Halo 用户,让每个网站都能拥有一个温暖、安静、充满灵感的角落。如果你有任何建议或问题,欢迎在 GitHub Issues 提出。
轻拾人间辞藻,言说万千心绪。
感谢使用轻言。