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
146 lines
5.9 KiB
SQL
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 '预警规则'
|
|
;
|