feat(content): 短剧类型与内容类型支持多选
This commit is contained in:
1 parent
030df5c5dc
commit
4c614a5ece
13 files changed
+665
-50
No files matched your search
@@ -0,0 +1,121 @@
|
||||
# K93 短剧类型与内容类型支持多选
|
||||
|
||||
## 目标
|
||||
|
||||
- 后台短剧基础信息中的「类型」「内容类型」改为至少选一项的多选。
|
||||
- 后台列表筛选、列表展示支持多分类与多内容类型。
|
||||
- App 分类分区和内容类型 feed 使用多标签字段做整词匹配。
|
||||
- 单值字段继续保留,兼容创作者中心、旧接口和现有 App 卡片。
|
||||
|
||||
## 分支
|
||||
|
||||
- FruitServer:`feat/k93-drama-multi-tag`,从 `origin/develop` 创建。
|
||||
- ReelShortWeb:`feat/k93-drama-multi-tag-ui`,从 `origin/develop` 创建。
|
||||
|
||||
## A. FruitServer
|
||||
|
||||
### A1 数据库
|
||||
|
||||
- 新增 `sql/migrate-k93-drama-multi-tag.sql`:
|
||||
- `drama.drama_types VARCHAR(32) NOT NULL DEFAULT ''`
|
||||
- `drama.category_ids VARCHAR(255) NOT NULL DEFAULT ''`
|
||||
- 从现有 `drama_type / category_id` 幂等回填。
|
||||
- 同步 `sql/schema.sql` 的 drama 建表字段。
|
||||
- 只提交迁移文件,不执行数据库。
|
||||
|
||||
### A2 实体与 VO
|
||||
|
||||
- `Drama`:增加 `dramaTypes/categoryIds` 逗号字符串。
|
||||
- `DramaSaveReqVO`:
|
||||
- 新增 `List<String> dramaTypes`、`List<Long> categoryIds`,列表优先。
|
||||
- 保留 `dramaType/categoryId` 单值兜底。
|
||||
- `DramaPageReqVO`:增加 `List<Long> categoryIds`,保留 `categoryId`。
|
||||
- `DramaRespVO`:增加 `dramaTypes/categoryIds/categoryNames`,旧单值字段语义不变。
|
||||
|
||||
### A3 保存规则
|
||||
|
||||
- 内容类型列表:normalize、去重、保持提交顺序;主值写第一个,完整列表写 `drama_types`。
|
||||
- 分类列表:过滤 null/非正数、去重、保持提交顺序;主值写第一个或 0,完整列表写 `category_ids`。
|
||||
- 列表为空时回退单值;单值也没有时保留当前值。
|
||||
- 创建时内容类型最终为空则默认 LIVE。
|
||||
- 非法内容类型继续返回 BAD_REQUEST。
|
||||
|
||||
### A4 查询规则
|
||||
|
||||
统一使用整词匹配:
|
||||
|
||||
```sql
|
||||
(',' || column || ',') LIKE '%,value,%'
|
||||
```
|
||||
|
||||
- 后台分页:
|
||||
- `dramaTypes` 非空:`drama_types` token 匹配。
|
||||
- `categoryIds` 非空:`category_ids` token 匹配。
|
||||
- `categoryIds` 为空:回退 `category_id` 等值。
|
||||
- App `listPublishedFeed`:`drama_types` token 匹配。
|
||||
- App feed 游标:marker 的解析后 `dramaTypes` 与任一筛选类型相交才允许继续。
|
||||
- App `listPublished(categoryId)`:`category_ids` token 匹配,使多分类剧出现在每个分类分区。
|
||||
|
||||
### A5 响应装配
|
||||
|
||||
- 解析 `drama_types/category_ids`,空值回退单值。
|
||||
- `categoryNames` 按 categoryIds 顺序映射分类名。
|
||||
- 分类名缺失时回退 `genre`。
|
||||
- 现有 `dramaType/categoryId/category` 保持旧语义。
|
||||
|
||||
### A6 文档与测试
|
||||
|
||||
- 更新 `docs/api-phase1.md` 的后台保存/分页字段、App feed 和分类说明。
|
||||
- 增加服务测试覆盖:
|
||||
- 多类型/多分类去重、顺序与主值写回。
|
||||
- 单值兜底行为不变。
|
||||
- 后台分页 token 条件。
|
||||
- feed 多标签 marker 可被 ANIME/LIVE 命中。
|
||||
- App 分类分区 token 条件。
|
||||
- 响应多值解析和分类名顺序。
|
||||
- 门禁:`mvn test` 全模块通过。
|
||||
|
||||
## B. ReelShortWeb
|
||||
|
||||
### B1 类型
|
||||
|
||||
- `DramaItem` 增加 `dramaTypes/categoryIds/categoryNames`。
|
||||
- `DramaSaveData` 增加 `dramaTypes/categoryIds`。
|
||||
- `DramaPageParams` 增加 `categoryIds`。
|
||||
|
||||
### B2 表单
|
||||
|
||||
- `form.categoryIds: number[]`,默认空数组。
|
||||
- `form.dramaTypes: string[]`,创建默认 `['LIVE']`。
|
||||
- 两个下拉均使用 multiple、collapse-tags、collapse-tags-tooltip、filterable。
|
||||
- 校验至少 1 项。
|
||||
- 编辑时优先数组,缺失回退单值。
|
||||
- 提交数组;`genre` 使用所选分类名以 ` / ` 拼接。
|
||||
|
||||
### B3 筛选与表格
|
||||
|
||||
- 分类筛选改为 `categoryIds: number[]`。
|
||||
- 内容类型筛选改为 `dramaTypes: string[]`。
|
||||
- 查询传数组,重置为空数组。
|
||||
- 类型列显示 `categoryNames.join(' / ')`,回退 `genre`。
|
||||
- 内容类型列逐个渲染标签,缺失时回退 `dramaType`。
|
||||
|
||||
### B4 门禁
|
||||
|
||||
- `pnpm ts:check`
|
||||
- `pnpm build:dev`
|
||||
- 对修改文件执行定向 ESLint
|
||||
|
||||
## 风险与说明
|
||||
|
||||
1. 新代码依赖迁移后的 `drama_types/category_ids` 列,发布顺序必须先执行迁移再启动新版本。
|
||||
2. 逗号列仅存储受控内容类型和数字 id,不允许用户输入;查询值均来自校验后的数组。
|
||||
3. 主值继续保留,降低旧客户端、创作者中心和旧接口的兼容风险。
|
||||
4. 本次不改 specs 与 Flutter 客户端,不执行数据库迁移,不操作真机。
|
||||
|
||||
## Git
|
||||
|
||||
- FruitServer:`feat(content): 短剧类型与内容类型支持多选`
|
||||
- ReelShortWeb:`feat(admin): 短剧类型与内容类型多选`
|
||||
- 两仓库均 `--no-ff` 合回 `develop` 并 push。
|
||||
- 作者:`Zhou Weidong <502333560@qq.com>`;禁止 `git add -A`。
|
||||
@@ -23947,3 +23947,59 @@ dev 构建保留既有 `element-plus` circular chunk 警告,不影响成功退
|
||||
门禁已独立完成。
|
||||
- 本任务无数据库迁移;未修改 specs、Flutter 客户端、K91 评论列表与观看记录接口;
|
||||
未安装或操作真机,等待用户验收。
|
||||
|
||||
## 2026-10-21 K93 短剧类型与内容类型多选
|
||||
|
||||
- 已完整读取 K93 `docs/plans/INBOX.md` 及项目协作、编码、Git 规范。
|
||||
- 已创建 FruitServer `feat/k93-drama-multi-tag` 与 ReelShortWeb
|
||||
`feat/k93-drama-multi-tag-ui`,均基于最新 `origin/develop`。
|
||||
- 已先写计划 `docs/plans/2026-10-21-K93-drama-multi-tag.md`,明确双列存储、
|
||||
主值兼容、token 整词匹配、feed 游标与 Web 多选交互。
|
||||
- 本任务迁移仅写文件,不执行数据库;不改 specs 与 Flutter 客户端。
|
||||
- 已完成 A 主体代码:`Drama` / 保存、分页、响应 VO 增加双列与数组字段;
|
||||
`DramaService.apply` 支持多值去重、顺序保留和单值兜底;响应装配分类名顺序。
|
||||
- 后台分页、App feed 与 App 分类列表已改用逗号列整词匹配;feed 游标会校验 marker
|
||||
的多内容类型是否与筛选类型相交。
|
||||
- 已新增迁移 `sql/migrate-k93-drama-multi-tag.sql` 并同步 `sql/schema.sql`,迁移未执行;
|
||||
`docs/api-phase1.md` 已补多选保存、过滤与响应说明。
|
||||
- 已新增 `DramaServiceMultiTagTest`,覆盖多值去重/顺序/主值、单值兼容、后台 token 条件、
|
||||
feed 多标签游标、App 分类 token 条件与响应分类名顺序。
|
||||
- K93 定向后端测试已通过:
|
||||
|
||||
```text
|
||||
$ JAVA_HOME=<jdk21> mvn -pl fruitshorts-app-api -am \
|
||||
-Dtest=DramaServiceMultiTagTest,DramaServiceK88Test,DramaServiceFeedTest \
|
||||
-Dsurefire.failIfNoSpecifiedTests=false test
|
||||
[INFO] fruitshorts-app-api ... SUCCESS
|
||||
[INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0
|
||||
[INFO] BUILD SUCCESS
|
||||
```
|
||||
|
||||
解读:多值保存、单值兼容、后台分页、feed 多标签游标和分类分区匹配均通过。
|
||||
- 已完成 B:Web 类型与分页参数扩展;表单两个下拉改为多选并至少 1 项;编辑优先回填数组,
|
||||
缺失回退单值;筛选传数组;表格显示多分类名与多个内容类型标签。
|
||||
- ReelShortWeb `pnpm ts:check`、定向 ESLint 已通过;dev 构建已通过:
|
||||
|
||||
```text
|
||||
$ pnpm build:dev
|
||||
> fruitshorts-admin@1.0.0 build:dev
|
||||
> VITE_CJS_IGNORE_WARNING=1 vite build --mode dev
|
||||
Build successful. Please see dist-dev directory
|
||||
```
|
||||
|
||||
解读:多选表单、筛选与展示通过类型检查、Lint 和构建;构建仅有既有 circular chunk 警告。
|
||||
- 规范复核发现 `DramaService` 增至 618 行,超过 500 行红线;已将多标签存储、解析与
|
||||
Wrapper token 条件抽到同包 `DramaMultiTagSupport`,`DramaService` 回落至 440 行,
|
||||
新工具类 204 行。重构后定向测试再次通过:12 项,`BUILD SUCCESS`。
|
||||
- FruitServer 全模块门禁已通过:
|
||||
|
||||
```text
|
||||
$ JAVA_HOME=<jdk21> mvn test
|
||||
[INFO] fruitshorts-admin-api .............................. SUCCESS
|
||||
[INFO] fruitshorts-app-api ................................ SUCCESS
|
||||
[INFO] fruitshorts-transcode-worker ....................... SUCCESS
|
||||
[INFO] BUILD SUCCESS
|
||||
[INFO] Total time: 15.119 s
|
||||
```
|
||||
|
||||
解读:全部 14 个 Reactor 模块通过;app-api 共 95 项测试全过,含新增多标签测试。
|
||||
Reference in new issue
Block a user