hotspot/ddl/mysql.sql
yumoqing 26721a1b28 feat: initial commit — hotspot radar module for Sage
6 tables (source/schedule/fetch_log/item/analysis/alert)
3 fetch modes (API + Browser + Crawler)
5-dimension analysis + auto status classification
7 stat cards + 6 tab dashboard
2026-08-01 12:01:16 +08:00

146 lines
5.9 KiB
SQL

-- ============================================
-- 热点雷达系统 (Hotspot Radar) — 6 tables
-- ============================================
-- ./hotspot_source (来源配置: API / Browser / Crawler)
drop table if exists hotspot_source;
CREATE TABLE hotspot_source
(
`id` VARCHAR(32) comment 'id',
`name` VARCHAR(200) comment '来源名称',
`type` VARCHAR(20) comment '类型: rss/api/browser/crawler',
`url` VARCHAR(2000) comment '目标URL',
-- API 类型专用
`api_key` VARCHAR(500) comment 'API Key',
`api_secret` VARCHAR(500) comment 'API Secret(加密)',
`headers` TEXT comment '自定义请求头 JSON',
`fetch_method` VARCHAR(10) DEFAULT 'GET' comment 'HTTP方法',
`request_body` TEXT comment 'POST请求体',
-- Browser 类型专用
`browser_headless` VARCHAR(1) DEFAULT '1' comment '无头模式',
`browser_wait_selector` VARCHAR(500) comment '等待元素选择器',
`browser_scroll` VARCHAR(1) DEFAULT '0' comment '是否自动滚动',
-- Crawler 类型专用
`crawler_depth` INT DEFAULT 1 comment '爬取深度',
`crawler_rules` TEXT comment '爬取规则 JSON',
`crawler_start_urls` TEXT comment '起始URL列表 JSON',
-- 通用
`proxy_enabled` VARCHAR(1) DEFAULT '0' comment '启用代理',
`proxy_url` VARCHAR(500) comment '代理地址',
`enabled` VARCHAR(1) DEFAULT '1' comment '是否启用',
`priority` INT DEFAULT 0 comment '优先级(越大越高)',
`last_fetch` VARCHAR(50) comment '上次抓取时间',
`created_at` VARCHAR(50) comment '创建时间'
,primary key(id)
)
engine=innodb default charset=utf8 comment '热点来源配置'
;
-- ./hotspot_schedule (调度配置)
drop table if exists hotspot_schedule;
CREATE TABLE hotspot_schedule
(
`id` VARCHAR(32) comment 'id',
`source_id` VARCHAR(32) comment '关联来源ID',
`cron_expr` VARCHAR(100) comment 'cron表达式',
`interval_min` INT DEFAULT 60 comment '间隔(分钟)',
`enabled` VARCHAR(1) DEFAULT '1' comment '是否启用',
`last_run` VARCHAR(50) comment '上次运行',
`next_run` VARCHAR(50) comment '下次运行',
`retry_max` INT DEFAULT 3 comment '最大重试',
`retry_count` INT DEFAULT 0 comment '已重试次数'
,primary key(id)
)
engine=innodb default charset=utf8 comment '调度配置'
;
CREATE INDEX hotspot_schedule_source_idx ON hotspot_schedule(source_id);
-- ./hotspot_fetch_log (抓取日志)
drop table if exists hotspot_fetch_log;
CREATE TABLE hotspot_fetch_log
(
`id` VARCHAR(32) comment 'id',
`source_id` VARCHAR(32) comment '关联来源ID',
`start_time` VARCHAR(50) comment '开始时间',
`end_time` VARCHAR(50) comment '结束时间',
`duration_ms` INT DEFAULT 0 comment '耗时(毫秒)',
`status` VARCHAR(20) comment '状态: success/failed/partial',
`items_total` INT DEFAULT 0 comment '抓取总数',
`items_new` INT DEFAULT 0 comment '新增数量',
`items_duplicate` INT DEFAULT 0 comment '重复数量',
`error_msg` TEXT comment '错误信息',
`response_code` INT comment 'HTTP状态码',
`response_size_bytes` INT DEFAULT 0 comment '响应大小'
,primary key(id)
)
engine=innodb default charset=utf8 comment '抓取日志'
;
CREATE INDEX hotspot_fetch_log_source_idx ON hotspot_fetch_log(source_id);
CREATE INDEX hotspot_fetch_log_status_idx ON hotspot_fetch_log(status);
-- ./hotspot_item (热点条目)
drop table if exists hotspot_item;
CREATE TABLE hotspot_item
(
`id` VARCHAR(32) comment 'id',
`source_id` VARCHAR(32) comment '来源ID',
`title` VARCHAR(500) comment '标题',
`url` VARCHAR(2000) comment '原文链接',
`summary` TEXT comment '摘要',
`content` TEXT comment '正文',
`heat_score` DOUBLE(10,2) DEFAULT 0 comment '热度分数',
`heat_velocity` DOUBLE(10,2) DEFAULT 0 comment '热度加速度',
`publish_time` VARCHAR(50) comment '发布时间',
`first_seen` VARCHAR(50) comment '首次发现',
`last_updated` VARCHAR(50) comment '最后更新',
`status` VARCHAR(20) DEFAULT 'emerging' comment '状态: emerging/rising/hot/cooling/expired',
`category` VARCHAR(100) comment '分类',
`tags` VARCHAR(500) comment '标签',
`engagement_count` INT DEFAULT 0 comment '互动数',
`comment_count` INT DEFAULT 0 comment '评论数',
`share_count` INT DEFAULT 0 comment '转发数',
`sentiment` VARCHAR(20) DEFAULT 'neutral' comment '情感: positive/negative/neutral',
`is_verified` VARCHAR(1) DEFAULT '0' comment '是否已验证',
`duplicate_of` VARCHAR(32) comment '重复于(另一热点ID)'
,primary key(id)
)
engine=innodb default charset=utf8 comment '热点条目'
;
CREATE INDEX hotspot_item_source_idx ON hotspot_item(source_id);
CREATE INDEX hotspot_item_status_idx ON hotspot_item(status);
CREATE INDEX hotspot_item_score_idx ON hotspot_item(heat_score);
-- ./hotspot_analysis (五维分析)
drop table if exists hotspot_analysis;
CREATE TABLE hotspot_analysis
(
`id` VARCHAR(32) comment 'id',
`item_id` VARCHAR(32) comment '关联热点ID',
`dimension` VARCHAR(50) comment '维度: time/heat/content/propagation/audience',
`score` DOUBLE(10,2) DEFAULT 0 comment '维度得分(0-100)',
`analysis_data` TEXT comment '分析数据JSON',
`analyzed_at` VARCHAR(50) comment '分析时间'
,primary key(id)
)
engine=innodb default charset=utf8 comment '五维分析'
;
CREATE INDEX hotspot_analysis_item_idx ON hotspot_analysis(item_id);
-- ./hotspot_alert (预警规则)
drop table if exists hotspot_alert;
CREATE TABLE hotspot_alert
(
`id` VARCHAR(32) comment 'id',
`name` VARCHAR(200) comment '规则名称',
`source_id` VARCHAR(32) comment '来源ID(空=全局)',
`condition_type` VARCHAR(50) comment '条件: heat_threshold/velocity/sentiment/status_change',
`condition_value` VARCHAR(500) comment '条件值 JSON',
`enabled` VARCHAR(1) DEFAULT '1' comment '是否启用',
`notify_method` VARCHAR(50) comment '通知方式: email/webhook/sms',
`notify_target` VARCHAR(500) comment '通知目标',
`last_triggered` VARCHAR(50) comment '上次触发时间'
,primary key(id)
)
engine=innodb default charset=utf8 comment '预警规则'
;