beervid-app-cli 0.2.3 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +57 -1
  2. package/dist/cli.mjs +84 -65
  3. package/package.json +2 -4
  4. package/skills/beervid-app-cli/SKILL.md +318 -0
  5. package/skills/beervid-app-cli/docs/database-schema.md +231 -0
  6. package/skills/beervid-app-cli/docs/oauth-callback.md +282 -0
  7. package/skills/beervid-app-cli/docs/retry-and-idempotency.md +295 -0
  8. package/skills/beervid-app-cli/docs/tt-poll-task.md +239 -0
  9. package/skills/beervid-app-cli/docs/tts-product-cache.md +256 -0
  10. package/skills/beervid-app-cli/example/express/README.md +58 -0
  11. package/skills/beervid-app-cli/example/express/package.json +20 -0
  12. package/skills/beervid-app-cli/example/express/server.ts +431 -0
  13. package/skills/beervid-app-cli/example/express/tsconfig.json +12 -0
  14. package/skills/beervid-app-cli/example/nextjs/.env.example +3 -0
  15. package/skills/beervid-app-cli/example/nextjs/README.md +54 -0
  16. package/skills/beervid-app-cli/example/nextjs/app/api/oauth/callback/route.ts +34 -0
  17. package/skills/beervid-app-cli/example/nextjs/app/api/oauth/url/route.ts +30 -0
  18. package/skills/beervid-app-cli/example/nextjs/app/api/products/route.ts +43 -0
  19. package/skills/beervid-app-cli/example/nextjs/app/api/publish/tt/route.ts +116 -0
  20. package/skills/beervid-app-cli/example/nextjs/app/api/publish/tts/route.ts +58 -0
  21. package/skills/beervid-app-cli/example/nextjs/app/api/status/[shareId]/route.ts +41 -0
  22. package/skills/beervid-app-cli/example/nextjs/app/layout.tsx +9 -0
  23. package/skills/beervid-app-cli/example/nextjs/app/page.tsx +80 -0
  24. package/skills/beervid-app-cli/example/nextjs/lib/beervid-client.ts +107 -0
  25. package/skills/beervid-app-cli/example/nextjs/next.config.ts +4 -0
  26. package/skills/beervid-app-cli/example/nextjs/package.json +19 -0
  27. package/skills/beervid-app-cli/example/nextjs/tsconfig.json +23 -0
  28. package/skills/beervid-app-cli/example/standard/README.md +51 -0
  29. package/skills/beervid-app-cli/example/standard/api-client.ts +181 -0
  30. package/skills/beervid-app-cli/example/standard/get-oauth-url.ts +44 -0
  31. package/skills/beervid-app-cli/example/standard/package.json +18 -0
  32. package/skills/beervid-app-cli/example/standard/query-products.ts +141 -0
  33. package/skills/beervid-app-cli/example/standard/tsconfig.json +12 -0
  34. package/skills/beervid-app-cli/example/standard/tt-publish-flow.ts +194 -0
  35. package/skills/beervid-app-cli/example/standard/tts-publish-flow.ts +246 -0
  36. package/SKILL.md +0 -486
  37. package/agents/openai.yaml +0 -7
  38. /package/{references → skills/beervid-app-cli/references}/api-reference.md +0 -0
@@ -0,0 +1,318 @@
1
+ ---
2
+ name: beervid-app-cli
3
+ description: >
4
+ BEERVID 第三方应用 Open API 集成开发指南。本 skill 专用于 BEERVID 面向第三方应用开放的 API(需 BEERVID_APP_KEY 认证),
5
+ 不同于 BEERVID 自身应用内部的 API。当用户需要以第三方应用身份调用 BEERVID 平台接口、开发 TikTok 视频发布/上传/数据统计功能、
6
+ 处理 TT/TTS 账号授权绑定、查询商品列表、或涉及 openApiGet/openApiPost/openApiUpload 相关代码时,使用此 skill。
7
+ 包括:账号 OAuth 授权、视频上传与发布(普通/挂车)、发布状态轮询、视频数据查询、TTS 商品查询等完整业务流程。
8
+ 当用户在 BEERVID 项目上下文中提到"发布视频"、"绑定账号"、"查询视频数据"、"挂车发布"、"BEERVID 第三方应用"、"BEERVID_APP_KEY"等关键词时,应触发此 skill。
9
+ ---
10
+
11
+ # BEERVID 第三方应用 Open API 集成指南
12
+
13
+ 本 skill 是 **BEERVID 第三方应用 Open API** 的入口导航,重点提供:
14
+
15
+ - 何时使用这套 API
16
+ - TT 与 TTS 两条业务流如何判断
17
+ - 关键参数如何在各接口之间传递
18
+ - 该去哪里找详细接口、接入文档、示例工程和 CLI 实现
19
+
20
+ 不要把这里当成完整 API 手册。详细请求/响应、字段示例、错误码和长示例统一下沉到引用文档,按需读取。
21
+
22
+ ## 适用范围
23
+
24
+ 如果问题满足以下任一条件,就应使用本 skill:
25
+
26
+ - 请求路径是 `/api/v1/open/` 前缀
27
+ - 认证依赖 `BEERVID_APP_KEY` 或请求头 `X-API-KEY`
28
+ - 需求涉及第三方应用身份的 TikTok 授权、上传、发布、查询
29
+ - 代码里出现 `openApiGet`、`openApiPost`、`openApiUpload`
30
+ - 需求涉及 TT 普通视频发布或 TTS 挂车视频发布
31
+
32
+ 以下内容 **不属于** 本 skill:
33
+
34
+ - BEERVID 自身产品内部 API
35
+ - 与第三方开放平台无关的业务接口
36
+ - 认证方式不是 `BEERVID_APP_KEY` 的接口体系
37
+
38
+ ## 最小背景
39
+
40
+ ### 环境变量
41
+
42
+ | 变量 | 用途 |
43
+ | ---------------------- | ------------------------------------------------------- |
44
+ | `BEERVID_APP_KEY` | Open API 密钥,请求头使用 `X-API-KEY` |
45
+ | `BEERVID_APP_BASE_URL` | Open API 基础地址,默认通常为 `https://open.beervid.ai` |
46
+
47
+ ### 认证方式
48
+
49
+ | 场景 | 请求头 | 值 |
50
+ | ------------- | ---------------- | -------------------------------- |
51
+ | 常规 API 调用 | `X-API-KEY` | `BEERVID_APP_KEY` |
52
+ | 视频上传 | `X-UPLOAD-TOKEN` | 上传凭证接口返回的 `uploadToken` |
53
+
54
+ ### 统一响应格式
55
+
56
+ 所有端点都返回统一信封:
57
+
58
+ ```ts
59
+ interface OpenApiResponse<T> {
60
+ code: number;
61
+ message: string;
62
+ data: T;
63
+ error: boolean;
64
+ success: boolean;
65
+ }
66
+ ```
67
+
68
+ 失败判定统一按 `code !== 0 || !success` 处理即可。
69
+
70
+ ## 先判断你在哪条业务流
71
+
72
+ ### TT 普通账号
73
+
74
+ - `accountType: 'TT'`
75
+ - 用于普通视频发布
76
+ - 可查询视频数据
77
+ - 发布后通常需要轮询状态
78
+
79
+ ### TTS Shop 账号
80
+
81
+ - `accountType: 'TTS'`
82
+ - 用于挂车视频发布和商品查询
83
+ - 发布挂车视频时依赖商品信息
84
+ - 发布后通常立即完成,不走 TT 的轮询链路
85
+
86
+ ## 六类核心能力
87
+
88
+ 只保留能力定位,详细接口说明去看引用文档:
89
+
90
+ | 能力 | 作用 | 详细资料 |
91
+ | ------------ | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
92
+ | 账号授权 | 获取 TT/TTS OAuth URL、回调绑定、拉取账号详情 | [`references/api-reference.md`](./references/api-reference.md), [`docs/oauth-callback.md`](./docs/oauth-callback.md) |
93
+ | 视频上传 | 先换上传凭证,再直传文件 | [`references/api-reference.md`](./references/api-reference.md) |
94
+ | 视频发布 | TT 普通发布或 TTS 挂车发布 | [`references/api-reference.md`](./references/api-reference.md) |
95
+ | 状态轮询 | 仅 TT 普通发布需要轮询 | [`references/api-reference.md`](./references/api-reference.md), [`docs/tt-poll-task.md`](./docs/tt-poll-task.md) |
96
+ | 视频数据查询 | 查询播放、点赞、评论、分享等统计 | [`references/api-reference.md`](./references/api-reference.md) |
97
+ | 商品查询 | 为 TTS 挂车发布提供商品列表 | [`references/api-reference.md`](./references/api-reference.md), [`docs/tts-product-cache.md`](./docs/tts-product-cache.md) |
98
+
99
+ ## 核心流程速记
100
+
101
+ ### TT 普通视频发布
102
+
103
+ ```text
104
+ 获取 TT OAuth URL
105
+ -> 用户授权回调得到 ttAbId
106
+ -> ttAbId 作为 businessId 持久化
107
+ -> 获取上传凭证
108
+ -> 上传普通视频,拿到 fileUrl
109
+ -> 发布普通视频,拿到 shareId
110
+ -> 轮询发布状态,直到 status = PUBLISH_COMPLETE 且 post_ids 非空
111
+ -> 从 post_ids[0] 得到 videoId
112
+ -> 查询视频数据
113
+ ```
114
+
115
+ ### TTS 挂车视频发布
116
+
117
+ ```text
118
+ 获取 TTS OAuth URL
119
+ -> 用户授权回调得到 ttsAbId
120
+ -> ttsAbId 作为 creatorUserOpenId 持久化
121
+ -> 查询商品,得到 productId + productTitle
122
+ -> 获取上传凭证
123
+ -> 上传 TTS 视频,拿到 videoFileId/fileId
124
+ -> 发布挂车视频
125
+ ```
126
+
127
+ ## 关键参数链路
128
+
129
+ 这是主文件里最值得保留的部分,因为它决定了接口如何串起来:
130
+
131
+ | 参数 | 含义 | 产出来源 |
132
+ | ------------------------ | -------------------- | -------------------------------------------------- |
133
+ | `businessId` | TT 账号业务 ID | OAuth 回调参数 `ttAbId` |
134
+ | `creatorUserOpenId` | TTS 账号 OpenId | OAuth 回调参数 `ttsAbId` |
135
+ | `accountId` | 平台账号 ID | 即 `ttAbId` 或 `ttsAbId`,用于查询账号详情 |
136
+ | `uploadToken` | 上传凭证 | `upload-token/generate` 返回 |
137
+ | `fileUrl` | 普通上传后的视频 URL | `file-upload` 返回 |
138
+ | `videoFileId` / `fileId` | TTS 视频文件 ID | `file-upload/tts-video` 返回 |
139
+ | `shareId` | TT 普通发布追踪 ID | `tiktok/video/publish` 返回 |
140
+ | `videoId` | TikTok 视频 ID | TTS 发布直接返回;TT 从状态查询 `post_ids[0]` 获取 |
141
+ | `productId` | 商品 ID | `tts/products/query` 返回的商品列表 |
142
+ | `productTitle` | 商品标题 | 同上,最多 29 字符,超出应先截断 |
143
+ | `itemIds` | 视频 ID 数组 | 来源于 `videoId`,用于查询视频数据 |
144
+
145
+ ```text
146
+ TT:
147
+ ttAbId -> businessId -> publish -> shareId
148
+ -> poll-status (只有 status = PUBLISH_COMPLETE 且 post_ids 非空才算完成)
149
+ -> post_ids[0] -> videoId -> query-video
150
+
151
+ TTS:
152
+ ttsAbId -> creatorUserOpenId -> query-products -> productId/productTitle
153
+ creatorUserOpenId -> upload-tts-video -> fileId -> shoppable-publish -> videoId
154
+ ```
155
+
156
+ ## 实现时优先遵循的约束
157
+
158
+ ### API 封装
159
+
160
+ 建议统一封装三个基础请求函数:
161
+
162
+ - `openApiGet`
163
+ - `openApiPost`
164
+ - `openApiUpload`
165
+
166
+ 这三个函数应共享:
167
+
168
+ - 基础地址拼接
169
+ - `X-API-KEY` 注入
170
+ - 统一响应解包
171
+ - 错误抛出格式
172
+
173
+ ### 常见业务约束
174
+
175
+ - TT 普通视频发布后需要轮询;只有 `PUBLISH_COMPLETE` 且 `post_ids` 非空才算成功完成;TTS 挂车视频通常不需要
176
+ - 仅 TT 授权账号可查询视频数据
177
+ - `productTitle` 最多 29 字符,超出时应提前截断
178
+ - 商品图片字段可能是特殊字符串格式,解析细节见 [`docs/tts-product-cache.md`](./docs/tts-product-cache.md)
179
+ - 视频查询接口可能同时返回 camelCase 与 snake_case 字段,兼容细节见 [`references/api-reference.md`](./references/api-reference.md)
180
+
181
+ ### 上传侧建议
182
+
183
+ - 上传前先换取 `uploadToken`
184
+ - 上传请求头使用 `X-UPLOAD-TOKEN`
185
+ - 如需上传进度与取消能力,优先用 XHR 而非裸 `fetch`
186
+
187
+ ## CLI 工具
188
+
189
+ 本 Skill 配套提供 `beervid` CLI;可直接在终端调用所有 Open API 能力。如需使用 CLI,请先安装:
190
+
191
+ ```bash
192
+ npm install -g beervid-app-cli
193
+ ```
194
+
195
+ ### CLI 前置
196
+
197
+ ```bash
198
+ beervid config --app-key "your-api-key"
199
+ export BEERVID_APP_BASE_URL="https://open.beervid.ai"
200
+ ```
201
+
202
+ ### CLI 命令一览
203
+
204
+ | 命令 | 功能 | 常用参数 |
205
+ | -------------------------- | --------------------- | ---------------------------------------------------------------------------- | ------------------------- |
206
+ | `beervid config` | 设置或查看全局配置 | `--app-key`, `--base-url`, `--show` |
207
+ | `beervid get-oauth-url` | 获取 OAuth 授权链接 | `--type tt | tts` |
208
+ | `beervid get-account-info` | 查询账号信息 | `--type TT | TTS`, `--account-id` |
209
+ | `beervid upload` | 上传视频 | `--file`, `--type tts`, `--creator-id`, `--token` |
210
+ | `beervid publish` | 发布普通或挂车视频 | `--type normal | shoppable` 加对应业务参数 |
211
+ | `beervid poll-status` | 轮询 TT 发布状态 | `--business-id`, `--share-id`, `--interval`, `--max-polls` |
212
+ | `beervid query-video` | 查询视频数据 | `--business-id`, `--item-ids` |
213
+ | `beervid query-products` | 查询 TTS 商品 | `--creator-id`, `--product-type`, `--cursor` |
214
+ | `beervid publish-tt-flow` | 执行 TT 完整发布流程 | `--business-id`, `--file`, `--caption` |
215
+ | `beervid publish-tts-flow` | 执行 TTS 完整发布流程 | `--creator-id`, `--file`, `--interactive`, `--product-id`, `--product-title` |
216
+
217
+ ### 使用示例
218
+
219
+ 最常用的最小示例如下:
220
+
221
+ ```bash
222
+ # 设置 APP Key
223
+ beervid config --app-key "your-api-key"
224
+
225
+ # 获取授权链接
226
+ beervid get-oauth-url --type tt
227
+ beervid get-oauth-url --type tts
228
+
229
+ # 查询账号信息
230
+ beervid get-account-info --type TT --account-id 7281234567890
231
+
232
+ # 上传普通视频(--file 同时支持本地文件路径和 URL 地址)
233
+ beervid upload --file ./video.mp4
234
+ beervid upload --file https://example.com/video.mp4
235
+
236
+ # 上传 TTS 视频(--file 同时支持本地文件路径和 URL 地址)
237
+ beervid upload --file ./video.mp4 --type tts --creator-id=open_user_abc
238
+
239
+ # 普通发布(--video-url 需要传可访问的视频 URL)
240
+ beervid publish --type normal --business-id=biz_12345 --video-url https://cdn.beervid.ai/uploads/xxx.mp4 --caption "My video"
241
+
242
+ # 挂车发布
243
+ beervid publish --type shoppable --creator-id=open_user_abc --file-id vf_abc123 --product-id prod_789 --product-title "Premium Widget" --caption "Product review"
244
+
245
+ # 轮询状态
246
+ beervid poll-status --business-id=biz_12345 --share-id share_abc123
247
+
248
+ # 查询视频数据
249
+ beervid query-video --business-id=biz_12345 --item-ids 7123456789012345678
250
+
251
+ # 查询商品
252
+ beervid query-products --creator-id=open_user_abc
253
+
254
+ # TT 一键完整流程(--file 同时支持本地文件路径和 URL 地址)
255
+ beervid publish-tt-flow --business-id=biz_12345 --file ./video.mp4 --caption "My video"
256
+ beervid publish-tt-flow --business-id=biz_12345 --file https://example.com/video.mp4 --caption "My video"
257
+
258
+ # TTS 一键完整流程(--file 同时支持本地文件路径和 URL 地址)
259
+ beervid publish-tts-flow --creator-id=open_user_abc --file ./video.mp4
260
+ beervid publish-tts-flow --creator-id=open_user_abc --file https://example.com/video.mp4
261
+ ```
262
+
263
+ ### CLI 特别注意
264
+
265
+ 当参数值本身以 `-` 开头时,必须写成 `--option=value`,否则 CLI 会把值误判为新的选项。
266
+
267
+ ## 读哪份文档
268
+
269
+ ### 接口细节
270
+
271
+ 当你需要以下内容时,直接读取 [`references/api-reference.md`](./references/api-reference.md):
272
+
273
+ - 具体端点路径
274
+ - 请求参数
275
+ - 响应字段
276
+ - 错误码
277
+ - 新旧字段兼容方式
278
+
279
+ ### 接入设计
280
+
281
+ 按场景读取:
282
+
283
+ - OAuth 回调与 State Token:[`docs/oauth-callback.md`](./docs/oauth-callback.md)
284
+ - 数据表设计:[`docs/database-schema.md`](./docs/database-schema.md)
285
+ - TT 轮询任务:[`docs/tt-poll-task.md`](./docs/tt-poll-task.md)
286
+ - TTS 商品缓存:[`docs/tts-product-cache.md`](./docs/tts-product-cache.md)
287
+ - 重试与幂等:[`docs/retry-and-idempotency.md`](./docs/retry-and-idempotency.md)
288
+
289
+ ### 示例工程
290
+
291
+ 当用户需要“可运行参考实现”时,按技术栈读取:
292
+
293
+ - 纯脚本示例:[`example/standard/README.md`](./example/standard/README.md)
294
+ - Express 示例:[`example/express/README.md`](./example/express/README.md)
295
+ - Next.js API Route 示例:[`example/nextjs/README.md`](./example/nextjs/README.md)
296
+
297
+ ## 推荐工作方式
298
+
299
+ 处理相关需求时,优先按这个顺序行动:
300
+
301
+ 1. 先判断是 TT 还是 TTS,是 API 集成还是 CLI 使用。
302
+ 2. 再确认当前缺的是哪一段链路:授权、上传、发布、轮询、查询、商品。
303
+ 3. 主流程和参数链路在本文件中快速定位。
304
+ 4. 需要具体字段、示例或错误码时,再读取对应 `references/` 或 `docs/`。
305
+ 5. 需要代码落地时,优先复用现有 `src/commands/`、`src/client/`、`src/workflows/` 和 `example/`。
306
+
307
+ ## 不要在主文件重复维护的内容
308
+
309
+ 以下内容不应继续扩写回 `SKILL.md`,避免再次膨胀:
310
+
311
+ - 单个端点的完整请求/响应示例
312
+ - CLI 的长命令样例清单
313
+ - 各种错误码详表
314
+ - 数据库字段大表
315
+ - OAuth 安全细节展开说明
316
+ - 轮询/缓存/重试的长篇策略说明
317
+
318
+ 这些内容已经分别存在于 `references/`、`docs/`、`example/` 中,应按需引用,不要复制。
@@ -0,0 +1,231 @@
1
+ # 数据表字段建议
2
+
3
+ > 本文档为接入 BEERVID 第三方应用 Open API 的后端系统提供数据库表结构设计建议。
4
+ > 以 SQL DDL 呈现,兼顾 MySQL 和 PostgreSQL 语法。
5
+
6
+ ## 总览
7
+
8
+ 接入 BEERVID Open API 通常需要持久化以下实体:
9
+
10
+ | 表名 | 作用 | 关联 API |
11
+ |------|------|----------|
12
+ | `beervid_accounts` | 存储 TT/TTS 授权账号信息 | OAuth 回调、`account/info` |
13
+ | `beervid_videos` | 视频发布记录与状态追踪 | `publish`、`poll-status`、`query-video` |
14
+ | `beervid_products` | TTS 商品缓存 | `products/query` |
15
+
16
+ ---
17
+
18
+ ## 1. 账号表 `beervid_accounts`
19
+
20
+ 存储通过 OAuth 授权绑定的 TT/TTS 账号。
21
+
22
+ ```sql
23
+ CREATE TABLE beervid_accounts (
24
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
25
+
26
+ -- 账号标识
27
+ account_type VARCHAR(8) NOT NULL COMMENT 'TT 或 TTS',
28
+ account_id VARCHAR(128) NOT NULL COMMENT 'OAuth 回调返回的 ttAbId 或 ttsAbId',
29
+
30
+ -- TT 账号专用:即 businessId,所有 TT 操作的入参
31
+ business_id VARCHAR(128) DEFAULT NULL COMMENT 'TT 业务 ID(= ttAbId)',
32
+
33
+ -- TTS 账号专用:即 creatorUserOpenId,所有 TTS 操作的入参
34
+ creator_user_open_id VARCHAR(128) DEFAULT NULL COMMENT 'TTS 用户 OpenId(= ttsAbId)',
35
+
36
+ -- 账号详情(来自 POST /api/v1/open/account/info)
37
+ username VARCHAR(256) DEFAULT NULL,
38
+ display_name VARCHAR(256) DEFAULT NULL,
39
+ seller_name VARCHAR(256) DEFAULT NULL COMMENT 'TTS 账号的卖家名称',
40
+ profile_url TEXT DEFAULT NULL COMMENT '头像 URL',
41
+ followers_count INT DEFAULT 0,
42
+ access_token VARCHAR(512) DEFAULT NULL COMMENT '访问令牌',
43
+
44
+ -- 业务归属
45
+ app_user_id BIGINT DEFAULT NULL COMMENT '你方系统的用户 ID(多对一关系)',
46
+
47
+ -- 状态
48
+ status VARCHAR(32) DEFAULT 'ACTIVE' COMMENT 'ACTIVE / EXPIRED / REVOKED',
49
+
50
+ -- 时间
51
+ authorized_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'OAuth 授权时间',
52
+ deleted_at TIMESTAMP DEFAULT NULL COMMENT '软删除时间',
53
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
54
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
55
+
56
+ -- 索引
57
+ UNIQUE KEY uk_account (account_type, account_id),
58
+ KEY idx_app_user (app_user_id),
59
+ KEY idx_business_id (business_id),
60
+ KEY idx_creator_user_open_id (creator_user_open_id)
61
+ );
62
+ ```
63
+
64
+ ### 关键说明
65
+
66
+ | 字段 | 来源 | 备注 |
67
+ |------|------|------|
68
+ | `account_id` | OAuth 回调参数 `ttAbId` 或 `ttsAbId` | 唯一标识,与 `account_type` 组成唯一键 |
69
+ | `business_id` | 等同于 `ttAbId` | TT 账号的所有操作(发布、轮询、查数据)都以此为入参 |
70
+ | `creator_user_open_id` | 等同于 `ttsAbId` | TTS 账号的所有操作(上传、发布、查商品)都以此为入参 |
71
+ | `access_token` | `account/info` 返回 | 按需存储,用于特殊场景 |
72
+ | `app_user_id` | 你方系统 | 一个用户可绑定多个 TT/TTS 账号 |
73
+
74
+ ---
75
+
76
+ ## 2. 视频表 `beervid_videos`
77
+
78
+ 记录每次视频发布的全生命周期。
79
+
80
+ ```sql
81
+ CREATE TABLE beervid_videos (
82
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
83
+
84
+ -- 关联账号
85
+ account_id BIGINT NOT NULL COMMENT '关联 beervid_accounts.id',
86
+ publish_type VARCHAR(16) NOT NULL COMMENT 'NORMAL 或 SHOPPABLE',
87
+
88
+ -- 发布前:上传信息
89
+ file_url TEXT DEFAULT NULL COMMENT '普通上传返回的 fileUrl',
90
+ video_file_id VARCHAR(128) DEFAULT NULL COMMENT 'TTS 上传返回的 videoFileId',
91
+ file_name VARCHAR(256) DEFAULT NULL,
92
+ file_size BIGINT DEFAULT NULL COMMENT '文件大小(字节)',
93
+ caption TEXT DEFAULT NULL COMMENT '视频描述/文案',
94
+
95
+ -- 发布后:追踪 ID
96
+ share_id VARCHAR(128) DEFAULT NULL COMMENT '普通发布返回,用于轮询',
97
+ video_id VARCHAR(128) DEFAULT NULL COMMENT 'TikTok 视频 ID',
98
+
99
+ -- TTS 挂车专用
100
+ product_id VARCHAR(128) DEFAULT NULL COMMENT '关联商品 ID',
101
+ product_title VARCHAR(64) DEFAULT NULL COMMENT '关联商品标题(≤29字符)',
102
+
103
+ -- 发布状态
104
+ publish_status VARCHAR(32) DEFAULT 'PENDING'
105
+ COMMENT 'PENDING / PROCESSING_DOWNLOAD / PUBLISH_COMPLETE / FAILED / TIMEOUT',
106
+ fail_reason TEXT DEFAULT NULL COMMENT '失败原因',
107
+ poll_count INT DEFAULT 0 COMMENT '已轮询次数',
108
+ last_polled_at TIMESTAMP DEFAULT NULL COMMENT '最后一次轮询时间',
109
+
110
+ -- 视频数据统计(来自 query-video)
111
+ video_views INT DEFAULT NULL,
112
+ likes INT DEFAULT NULL,
113
+ comments INT DEFAULT NULL,
114
+ shares INT DEFAULT NULL,
115
+ share_url TEXT DEFAULT NULL,
116
+ thumbnail_url TEXT DEFAULT NULL,
117
+ data_synced_at TIMESTAMP DEFAULT NULL COMMENT '最后一次数据同步时间',
118
+
119
+ -- 幂等控制
120
+ idempotency_key VARCHAR(128) DEFAULT NULL COMMENT '发布请求的稳定幂等键,防止重复发布',
121
+
122
+ -- 时间
123
+ deleted_at TIMESTAMP DEFAULT NULL COMMENT '软删除时间',
124
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
125
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
126
+
127
+ -- 索引
128
+ KEY idx_account (account_id),
129
+ KEY idx_share_id (share_id),
130
+ KEY idx_video_id (video_id),
131
+ KEY idx_publish_status (publish_status),
132
+ UNIQUE KEY uk_idempotency (idempotency_key),
133
+ KEY idx_status_poll (publish_status, last_polled_at)
134
+ COMMENT '轮询定时任务:查找需要继续轮询的记录'
135
+ );
136
+ ```
137
+
138
+ ### 关键说明
139
+
140
+ | 字段 | 用途 |
141
+ |------|------|
142
+ | `share_id` | 普通视频发布返回,用于后续 `poll-status` 轮询 |
143
+ | `video_id` | 挂车发布直接返回;普通发布从轮询结果 `post_ids[0]` 获取 |
144
+ | `publish_status` | 核心状态字段,定时任务依据此字段扫描待轮询记录 |
145
+ | `idempotency_key` | 建议使用你方业务侧稳定唯一值,如 `publish_request_id`、草稿 ID 或客户端 requestId;不要拼接时间戳 |
146
+ | `idx_status_poll` | 复合索引,加速"查找所有 PROCESSING_DOWNLOAD 且距上次轮询超过 N 秒"的查询 |
147
+
148
+ ---
149
+
150
+ ## 3. 商品缓存表 `beervid_products`
151
+
152
+ 缓存 TTS 商品数据,减少重复查询。
153
+
154
+ ```sql
155
+ CREATE TABLE beervid_products (
156
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
157
+
158
+ -- 商品标识
159
+ product_id VARCHAR(128) NOT NULL COMMENT 'BEERVID 商品 ID',
160
+ creator_user_open_id VARCHAR(128) NOT NULL COMMENT '所属 TTS 账号',
161
+
162
+ -- 商品信息
163
+ title VARCHAR(256) NOT NULL,
164
+ price_amount VARCHAR(32) DEFAULT NULL,
165
+ price_currency VARCHAR(8) DEFAULT NULL,
166
+ images JSON DEFAULT NULL COMMENT '商品图片 URL 数组(已解析)',
167
+ sales_count INT DEFAULT 0,
168
+ brand_name VARCHAR(256) DEFAULT NULL,
169
+ shop_name VARCHAR(256) DEFAULT NULL,
170
+ source VARCHAR(16) DEFAULT NULL COMMENT 'shop 或 showcase',
171
+
172
+ -- 状态
173
+ review_status VARCHAR(32) DEFAULT NULL COMMENT 'APPROVED / PENDING / REJECTED',
174
+ inventory_status VARCHAR(32) DEFAULT NULL COMMENT 'IN_STOCK / OUT_OF_STOCK',
175
+
176
+ -- 缓存管理
177
+ cached_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '首次缓存时间',
178
+ refreshed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '最后刷新时间',
179
+ deleted_at TIMESTAMP DEFAULT NULL COMMENT '软删除时间',
180
+
181
+ -- 索引
182
+ UNIQUE KEY uk_product_creator (product_id, creator_user_open_id),
183
+ KEY idx_creator (creator_user_open_id),
184
+ KEY idx_review_inventory (review_status, inventory_status)
185
+ COMMENT '过滤可发布商品:APPROVED + IN_STOCK',
186
+ KEY idx_sales (creator_user_open_id, sales_count DESC)
187
+ COMMENT '按销量排序选择商品'
188
+ );
189
+ ```
190
+
191
+ ### 关键说明
192
+
193
+ | 字段 | 备注 |
194
+ |------|------|
195
+ | `images` | 存储已解析的图片 URL 数组(非 BEERVID 原始格式),解析方法见 SKILL.md |
196
+ | `review_status` + `inventory_status` | 筛选可发布商品:仅 `APPROVED` + `IN_STOCK` 可用于挂车发布 |
197
+ | `refreshed_at` | 缓存淘汰依据,建议超过 24 小时重新拉取 |
198
+ | `deleted_at` | 若采用 `docs/tts-product-cache.md` 中的全量替换方案,需要用它标记旧缓存失效 |
199
+
200
+ ---
201
+
202
+ ## ER 关系
203
+
204
+ ```
205
+ ┌─────────────────────┐ ┌──────────────────────┐
206
+ │ beervid_accounts │ 1 N │ beervid_videos │
207
+ │ │───────│ │
208
+ │ id (PK) │ │ account_id (FK) │
209
+ │ account_type │ │ publish_type │
210
+ │ business_id │ │ share_id │
211
+ │ creator_user_open_id│ │ video_id │
212
+ │ app_user_id │ │ publish_status │
213
+ └─────────────────────┘ └──────────────────────┘
214
+ │ 1
215
+ │ N
216
+ ┌─────────────────────┐
217
+ │ beervid_products │
218
+ │ │
219
+ │ creator_user_open_id│
220
+ │ product_id │
221
+ │ title │
222
+ │ sales_count │
223
+ └─────────────────────┘
224
+ ```
225
+
226
+ ## 补充建议
227
+
228
+ 1. **软删除**:本文示例已将 `deleted_at` 纳入推荐表结构;如果你不采用软删除,也要同步调整 `docs/tts-product-cache.md` 中依赖该字段的 SQL
229
+ 2. **审计日志**:高敏感操作(发布、授权)建议独立记录操作日志表
230
+ 3. **分库分表**:如视频表数据量大,可按 `account_id` 分片
231
+ 4. **PostgreSQL 用户**:将 `AUTO_INCREMENT` 替换为 `GENERATED ALWAYS AS IDENTITY`,`JSON` 替换为 `JSONB`