博客开发日志 - 关于博客分类

2026 年 7 月 7 日
12

   今天把博客基础分类模块做完了,纠结了很久要不要做关联表,目前是多对一的数据结构,想到后期可能会拓展到多对多,暂且保留关联表,除了查询时相对麻烦一点,倒也没啥其他问题。


   等到部署以后才发现麻瓜了。docker部署时忘记指定时区,而我是用的astro服务端渲染,导致即使服务器上的时区是正确的,渲染出来的日期也是不对的,解决方法是在格式化时指定时区或者在写Dokcerfile时指定时区。好久没用docker了,倒是忘了了还会有这个问题。

   遇到的另外一个问题是,在编辑文章时,由于分类数据是异步获取的,文章数据和分类数据有个先后的问题,如果是先获取到了文章数据再获取到分类数据,即使此时使用form.reset对category_id进行了赋值,Select组件在提交时还是可能提交上""空字符串,而由于我对Select的默认值进行了Number()转换,导致最终获取到的数据是0。  并且由于我zod设置的规则过于宽泛:

category_id: z
    .number()
    .int()
    .optional()
    .refine((v) => v !== undefined, '请选择文章分类')

   没有判断到大于0的情况,id为0的数据就这么堂而皇之的到了后端接口。

   如果事情只是到这里也还算是一次小小的失误,毕竟我后端还有参数校验和数据库唯一性校验:

CategoryID *int32 `json:"category_id" validate:"required,min=0"`
CREATE TABLE post_category
(
    post_id INT NOT NULL,
    category_id INT NOT NULL,
    PRIMARY KEY (post_id, category_id)
);

   这时候搞怪的来了,由于我是直接复制的sort的验证规则,id为0的数据也可以堂而皇之的入库,并且由于是唯一性校验,在新增数据时,post_id(1)/category_id(1),和编辑数据时的post_id(1)/category_id(0),完全没有冲突,关联表就这样出现了2条数据!当我在列表中看到了2条一模一样,只是有一条缺少分类的数据后,我甚至怀疑我的sql写错了,于是此时我做了一个错误的决定,点击删除此条数据,终于,“两条数据”一起消失了。

   至于为什么不做软删除,一是因为太麻烦,二是我觉得毕竟只是个博客,能做到每天定时备份一下数据库已经足够了。