feat(knowledge): 分类可改名/配色/删除,选中态与加载态更清楚
CI / backend (push) Canceled after 0s

分类之前只能新增,建错了只能干看着。补上三件事:

- knowledge_category 加 color 列(迁移 0009,CHECK 卡 #RRGGBB),
  PATCH 支持改名与改色,空串表示取消上色;知识列表带出分类色,前端不用再查。
- 分类行悬停出「⋯」:改名、选色板/手填色值、建子分类、删除(有知识时确认后 force)。
- 选中分类改成主色浅底 + 描边 + 色点,列表头显示当前筛选;切分类时列表淡出并转圈,
  不再一动不动等请求回来。

顺带给卡片画分类色上边线:扫一眼就能分出哪几条属于同一类。
This commit is contained in:
2026-11-02 19:24:44 +08:00
parent d7c9670880
commit 71982f9fa4
6 changed files with 632 additions and 32 deletions
@@ -0,0 +1,48 @@
"""知识分类配色(M3 补充)
Revision ID: 0009
Revises: 0008
Create Date: 2026-11-02
分类从"只能分级"变成"还能上色"。一列而已,但解决了卡片墙上的一个真问题:
三十条知识平铺在一起,光看标题要逐条读才知道哪条属于部署、哪条属于业务。
分类色让"归属"在扫视时就成立,不用读字。
三个取舍:
1. **颜色存分类上,不存知识上**。同一类的颜色必须一致,否则卡片墙会花成
一盘散沙;存在分类上,改一次全类生效。
2. **允许为空**。老数据(0007 建的分类)没有颜色,强行补一个默认值等于替用户
做决定;为空时前端按分类 id 稳定地挑一个调色板色,看起来仍是"每类一色"。
3. **CHECK 约束卡格式**。只接受 `#RRGGBB`,大写。前端传 `rgb(...)` 或带 alpha
的值会被挡在数据库外——渲染层不会因为一个脏值悄悄丢样式。
"""
from __future__ import annotations
from collections.abc import Sequence
from alembic import op
revision: str = "0009"
down_revision: str = "0008"
branch_labels: Sequence[str] | None = None
depends_on: Sequence[str] | None = None
UPGRADE_SQL = (
"ALTER TABLE knowledge_category ADD COLUMN IF NOT EXISTS color varchar(7)",
"ALTER TABLE knowledge_category DROP CONSTRAINT IF EXISTS ck_kcat_color",
"ALTER TABLE knowledge_category ADD CONSTRAINT ck_kcat_color "
"CHECK (color IS NULL OR color ~ '^#[0-9A-F]{6}$')",
"COMMENT ON COLUMN knowledge_category.color IS '分类色 #RRGGBB,卡片上边线用它'",
)
def upgrade() -> None:
for statement in UPGRADE_SQL:
op.execute(statement)
def downgrade() -> None:
op.execute("ALTER TABLE knowledge_category DROP CONSTRAINT IF EXISTS ck_kcat_color")
op.execute("ALTER TABLE knowledge_category DROP COLUMN IF EXISTS color")