220 lines
12 KiB
SQL
220 lines
12 KiB
SQL
-- 小红书模块:建表 + 业务种子数据(在 OMS 库 fake_simple_admin / oms 执行)
|
||
-- 执行顺序:本文件 → seed_xhs_rbac_menu.sql(RBAC 库 menu 表)→ seed_xhs_role_permissions.sql
|
||
--
|
||
-- Navicat:选中 OMS 业务库后运行本文件
|
||
|
||
-- ========== 1. 建表 migrate_t_xhs.sql ==========
|
||
-- (内容与 migrate_t_xhs.sql 相同,便于一键安装)
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_xhs_agent` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`CustomerId` INT NOT NULL COMMENT '客户ID → t_customer.Id',
|
||
`DeviceId` VARCHAR(64) NOT NULL COMMENT 'Agent 本机设备标识',
|
||
`DeviceName` VARCHAR(128) NULL COMMENT '用户自定义名称',
|
||
`AgentVersion` VARCHAR(32) NULL COMMENT 'Agent 版本号',
|
||
`BridgePort` INT NOT NULL DEFAULT 9333 COMMENT 'Bridge WebSocket 端口',
|
||
`Status` VARCHAR(16) NOT NULL DEFAULT 'offline' COMMENT 'online/offline',
|
||
`EngineRunning` TINYINT NOT NULL DEFAULT 0 COMMENT 'Bridge 引擎是否运行',
|
||
`ExtensionConnected` TINYINT NOT NULL DEFAULT 0 COMMENT 'Chrome 扩展是否连上 Bridge',
|
||
`XhsLoggedIn` TINYINT NOT NULL DEFAULT 0 COMMENT '小红书是否已登录',
|
||
`LastHeartbeatTime` DATETIME NULL COMMENT '最后心跳时间',
|
||
`LastError` VARCHAR(512) NULL COMMENT '最近一次 Agent 上报错误摘要',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()) COMMENT '并发戳',
|
||
`CreateUserId` INT NOT NULL DEFAULT 0 COMMENT '创建人',
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`UpdateUserId` INT NULL COMMENT '更新人',
|
||
`UpdateTime` DATETIME NULL COMMENT '更新时间',
|
||
PRIMARY KEY (`Id`),
|
||
UNIQUE KEY `uk_xhs_agent_device` (`DeviceId`),
|
||
KEY `idx_xhs_agent_customer` (`CustomerId`, `Status`)
|
||
) COMMENT='小红书本地 Agent 设备表';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_xhs_task` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`CustomerId` INT NOT NULL COMMENT '客户ID',
|
||
`AgentId` INT NULL COMMENT '指定执行的 Agent;NULL 表示任意在线 Agent',
|
||
`TaskType` VARCHAR(32) NOT NULL COMMENT '任务类型',
|
||
`ToolName` VARCHAR(64) NULL COMMENT 'LIKE AI 工具名',
|
||
`Priority` INT NOT NULL DEFAULT 0 COMMENT '越大越优先',
|
||
`Status` VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/claimed/running/succeeded/failed/cancelled',
|
||
`ArgumentsJson` JSON NOT NULL COMMENT '工具参数 JSON',
|
||
`ProgressText` VARCHAR(512) NULL COMMENT '执行过程摘要',
|
||
`ResultJson` JSON NULL COMMENT '成功时结构化结果',
|
||
`ErrorMessage` VARCHAR(1024) NULL COMMENT '失败原因',
|
||
`Source` VARCHAR(32) NOT NULL DEFAULT 'web' COMMENT 'web/schedule/skill',
|
||
`SourceRefId` VARCHAR(64) NULL COMMENT '来源关联 ID',
|
||
`ScheduledTime` DATETIME NULL COMMENT '计划执行时间',
|
||
`ClaimedAt` DATETIME NULL COMMENT 'Agent 认领时间',
|
||
`StartedAt` DATETIME NULL COMMENT '开始执行',
|
||
`FinishedAt` DATETIME NULL COMMENT '结束时间',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()),
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
KEY `idx_xhs_task_poll` (`CustomerId`, `Status`, `ScheduledTime`, `Priority`),
|
||
KEY `idx_xhs_task_agent` (`AgentId`, `Status`),
|
||
KEY `idx_xhs_task_source` (`Source`, `SourceRefId`)
|
||
) COMMENT='小红书 Agent 任务队列表';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_xhs_publish_record` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`CustomerId` INT NOT NULL COMMENT '客户ID',
|
||
`TaskId` INT NULL COMMENT '关联 t_xhs_task.Id',
|
||
`ToolName` VARCHAR(64) NOT NULL COMMENT 'publish_content / publish_with_video',
|
||
`Title` VARCHAR(256) NOT NULL COMMENT '笔记标题',
|
||
`ContentPreview` VARCHAR(512) NULL COMMENT '正文摘要',
|
||
`ContentFull` TEXT NULL COMMENT '完整正文',
|
||
`MediaJson` JSON NULL COMMENT '图片/视频 URL 列表',
|
||
`TagsJson` JSON NULL COMMENT '标签数组',
|
||
`Visibility` VARCHAR(32) NULL COMMENT '可见范围',
|
||
`Status` VARCHAR(16) NOT NULL DEFAULT 'draft' COMMENT 'draft/scheduled/publishing/succeeded/failed/cancelled',
|
||
`Success` TINYINT NULL COMMENT '最终是否成功',
|
||
`ResultSummary` VARCHAR(1024) NULL COMMENT 'Agent 回传结果摘要',
|
||
`ScheduledTime` DATETIME NULL COMMENT '定时发布时间',
|
||
`PublishedTime` DATETIME NULL COMMENT '实际发布完成时间',
|
||
`SkillId` INT NULL COMMENT '若来自技能卡片',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()),
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
KEY `idx_xhs_publish_customer_time` (`CustomerId`, `CreateTime`),
|
||
KEY `idx_xhs_publish_status_sched` (`CustomerId`, `Status`, `ScheduledTime`),
|
||
KEY `idx_xhs_publish_task` (`TaskId`)
|
||
) COMMENT='小红书发布记录表';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_xhs_analysis_session` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`CustomerId` INT NOT NULL COMMENT '客户ID',
|
||
`SessionName` VARCHAR(128) NULL COMMENT '用户备注名',
|
||
`AnalysisType` VARCHAR(32) NOT NULL COMMENT 'home_feed/search/my_feeds/feed_detail',
|
||
`Keyword` VARCHAR(128) NULL COMMENT '搜索关键词',
|
||
`TaskId` INT NULL COMMENT '采集任务 ID',
|
||
`FeedsJson` JSON NULL COMMENT '采集笔记列表',
|
||
`SelectedFeedId` VARCHAR(64) NULL COMMENT '当前选中笔记 ID',
|
||
`AiAnalysisMarkdown` MEDIUMTEXT NULL COMMENT 'AI 分析结果',
|
||
`SkillId` INT NULL COMMENT '技能配方 ID',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()),
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
KEY `idx_xhs_analysis_customer` (`CustomerId`, `CreateTime`)
|
||
) COMMENT='小红书内容分析会话表';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_xhs_skill` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`CustomerId` INT NOT NULL COMMENT '客户ID;0 表示系统预置',
|
||
`ExternalId` VARCHAR(32) NOT NULL COMMENT '对外稳定 ID',
|
||
`Title` VARCHAR(256) NOT NULL COMMENT '技能名称',
|
||
`SkillType` VARCHAR(32) NOT NULL DEFAULT 'ai_create' COMMENT '技能类型',
|
||
`PresetId` VARCHAR(64) NULL COMMENT '内置预设标识',
|
||
`RecipeJson` JSON NOT NULL COMMENT '配方 JSON',
|
||
`SortOrder` INT NOT NULL DEFAULT 0 COMMENT '排序',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()),
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
UNIQUE KEY `uk_xhs_skill_external` (`CustomerId`, `ExternalId`),
|
||
KEY `idx_xhs_skill_customer` (`CustomerId`, `SortOrder`)
|
||
) COMMENT='小红书技能卡片表';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_xhs_human_config` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`CustomerId` INT NOT NULL COMMENT '客户ID',
|
||
`BehaviorJson` JSON NOT NULL COMMENT 'human_behavior 配置',
|
||
`GuardJson` JSON NOT NULL COMMENT 'human_guard 配置',
|
||
`Version` INT NOT NULL DEFAULT 1 COMMENT '配置版本',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()),
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
UNIQUE KEY `uk_xhs_human_customer` (`CustomerId`)
|
||
) COMMENT='小红书拟人行为与防封配置表';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_xhs_ai_provider` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`CustomerId` INT NOT NULL COMMENT '客户ID;0 表示全局',
|
||
`ProviderKey` VARCHAR(32) NOT NULL COMMENT 'ai_chatgpt / ai_zhipu 等',
|
||
`ProviderType` VARCHAR(32) NOT NULL COMMENT 'chatgpt/doubao/deepseek/zhipu',
|
||
`DisplayName` VARCHAR(64) NOT NULL COMMENT '展示名',
|
||
`BaseUrl` VARCHAR(512) NOT NULL COMMENT 'API Base URL',
|
||
`ApiKeyEnc` VARCHAR(512) NULL COMMENT 'API Key(暂明文,后续可加密)',
|
||
`ApiSecretEnc` VARCHAR(512) NULL COMMENT 'Secret/模型名',
|
||
`IsDefault` TINYINT NOT NULL DEFAULT 0 COMMENT '是否默认',
|
||
`Enabled` TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()),
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
UNIQUE KEY `uk_xhs_ai_provider` (`CustomerId`, `ProviderKey`),
|
||
KEY `idx_xhs_ai_customer` (`CustomerId`, `Enabled`)
|
||
) COMMENT='小红书 AI 提供商配置表';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_xhs_media` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`CustomerId` INT NOT NULL COMMENT '客户ID',
|
||
`FileName` VARCHAR(256) NOT NULL COMMENT '原始文件名',
|
||
`StoragePath` VARCHAR(512) NOT NULL COMMENT '相对路径',
|
||
`PublicUrl` VARCHAR(512) NOT NULL COMMENT '对外 HTTPS URL',
|
||
`MimeType` VARCHAR(64) NULL COMMENT 'MIME',
|
||
`FileSizeBytes` BIGINT NULL COMMENT '字节数',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
KEY `idx_xhs_media_customer` (`CustomerId`, `CreateTime`)
|
||
) COMMENT='小红书创作上传媒体表';
|
||
|
||
-- ========== 2. 种子 seed_xhs_skills + seed_xhs_ai_providers ==========
|
||
|
||
INSERT INTO `t_xhs_skill` (
|
||
`CustomerId`, `ExternalId`, `Title`, `SkillType`, `PresetId`, `RecipeJson`, `SortOrder`,
|
||
`IsDeleted`, `CreateUserId`, `CreateTime`
|
||
) VALUES
|
||
(0, '5a9d3c012d50', '数字型/疑问型 · 物流知识 · 图文', 'ai_create', NULL,
|
||
'{"formula":["emotion","utility","visual","social"],"title_types":["number","question"],"body":{"domain":"物流知识","content_type":"干货教程","emotion":"生活场景","social":"知识炫耀"},"image_modes":["cover_impact"],"video_modes":[],"notes":"讲解9610的简易申报和汇总申报,退税,以及申报要求"}',
|
||
1, 0, 0, NOW()),
|
||
(0, '7dd58bfe4770', '效率工具 · 干货教程(新号)', 'ai_create', 'efficiency_tutorial',
|
||
'{"formula":["emotion","utility","visual","social"],"title_types":["number","question"],"body":{"domain":"效率工具","content_type":"干货教程","emotion":"焦虑共鸣","social":"价值传递"},"image_modes":["cover_impact","step_cards"],"video_modes":[],"notes":"话题示例:笔记工具提升效率"}',
|
||
2, 0, 0, NOW()),
|
||
(0, '3f6ed9f62afd', '职场发展 · 经验分享', 'ai_create', 'career_experience',
|
||
'{"formula":["emotion","utility","social"],"title_types":["story","compare"],"body":{"domain":"职场发展","content_type":"经验分享","emotion":"理想生活","social":"身份标签"},"image_modes":["cover_impact","lifestyle"],"video_modes":[],"notes":"话题示例:职场人际关系"}',
|
||
3, 0, 0, NOW()),
|
||
(0, '61a4d4febada', '情感共鸣 · 真实场景', 'ai_create', 'emotional_relatable',
|
||
'{"formula":["emotion","social"],"title_types":["story","question"],"body":{"domain":"情感共鸣","content_type":"经验分享","emotion":"生活场景","social":"情感支持"},"image_modes":["lifestyle"],"video_modes":["vlog_clip"],"notes":"让读者觉得这也太真实了"}',
|
||
4, 0, 0, NOW()),
|
||
(0, 'ec62cc03eea9', '避坑指南 · 观点表达', 'ai_create', 'pitfall_opinion',
|
||
'{"formula":["emotion","utility","visual","social"],"title_types":["number"],"body":{"domain":"职场发展","content_type":"避坑指南","emotion":"吐槽宣泄","social":"观点表达"},"image_modes":["info_chart"],"video_modes":["talking_head"],"notes":"话题示例:避坑指南"}',
|
||
5, 0, 0, NOW())
|
||
ON DUPLICATE KEY UPDATE `Title` = VALUES(`Title`), `RecipeJson` = VALUES(`RecipeJson`);
|
||
|
||
INSERT INTO `t_xhs_ai_provider` (
|
||
`CustomerId`, `ProviderKey`, `ProviderType`, `DisplayName`, `BaseUrl`,
|
||
`ApiKeyEnc`, `ApiSecretEnc`, `IsDefault`, `Enabled`,
|
||
`IsDeleted`, `CreateUserId`, `CreateTime`
|
||
) VALUES
|
||
(0, 'ai_zhipu', 'zhipu', '智谱 AI', 'https://open.bigmodel.cn/api/paas/v4', NULL, 'glm-4-flash', 1, 0, 0, 0, NOW()),
|
||
(0, 'ai_deepseek', 'deepseek', 'DeepSeek', 'https://api.deepseek.com/v1', NULL, 'deepseek-chat', 0, 0, 0, 0, NOW()),
|
||
(0, 'ai_chatgpt', 'chatgpt', 'OpenAI', 'https://api.openai.com/v1', NULL, 'gpt-4o-mini', 0, 0, 0, 0, NOW())
|
||
ON DUPLICATE KEY UPDATE `DisplayName` = VALUES(`DisplayName`), `BaseUrl` = VALUES(`BaseUrl`);
|