feat: 每日热点问题共享库(定时生成+管理员手动更新+点击埋点)
CI / 后端测试 (push) Has been cancelled
CI / 前端构建 (push) Has been cancelled

数据库:
- daily_topics表:每天每场景一条热点问题记录
- sample_clicks表:记录用户点击示例问题行为

后端:
- DailyTopicStore: CRUD + 埋点 + 点击统计
- generate_daily_topics: AI生成4场景各25-30个问题
- 定时任务:每天凌晨3点自动生成(后台线程轮询)
- GET /topics/daily: 获取当天热点(公开)
- POST /topics/click: 点击埋点
- GET /admin/daily-topics: 管理端查看
- POST /admin/daily-topics: 管理员手动更新
- POST /admin/daily-topics/generate: 手动触发AI生成
- GET /admin/sample-clicks: 点击统计

前端:
- ChatPanel挂载时取当天热点,无则用硬编码兜底
- 点击示例问题时记录埋点
- AdminDailyTopics管理页面:查看/编辑/手动生成
- 路由 /admin/daily-topics + 导航配置

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
selfrelease
2026-08-31 17:04:33 +08:00
co-authored by Devin
parent 35cc6e54ea
commit a7ef530841
9 changed files with 638 additions and 3 deletions
+25
View File
@@ -249,6 +249,31 @@ CREATE TABLE IF NOT EXISTS risk_alerts (
CREATE INDEX IF NOT EXISTS idx_risk_alerts_user ON risk_alerts(user_phone);
CREATE INDEX IF NOT EXISTS idx_risk_alerts_user_read ON risk_alerts(user_phone, read_at);
CREATE INDEX IF NOT EXISTS idx_risk_alerts_created ON risk_alerts(created_at DESC);
-- 每日热点问题库:每天凌晨 AI 生成,管理员可手动更新
CREATE TABLE IF NOT EXISTS daily_topics (
id SERIAL PRIMARY KEY,
date DATE NOT NULL, -- 生效日期
scene TEXT NOT NULL, -- legal/decision/life/emotion
questions JSONB NOT NULL, -- 问题数组 ["问题1","问题2",...]
source TEXT NOT NULL DEFAULT 'ai', -- ai(自动生成) / admin(管理员手动)
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- 唯一约束:同一天同一场景只有一条记录(更新时覆盖)
CREATE UNIQUE INDEX IF NOT EXISTS idx_daily_topics_date_scene ON daily_topics(date, scene);
CREATE INDEX IF NOT EXISTS idx_daily_topics_date ON daily_topics(date DESC);
-- 示例问题点击埋点:记录用户点击哪些示例问题
CREATE TABLE IF NOT EXISTS sample_clicks (
id SERIAL PRIMARY KEY,
user_phone TEXT,
scene TEXT NOT NULL, -- legal/decision/life/emotion
question TEXT NOT NULL, -- 被点击的示例问题
clicked_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_sample_clicks_scene ON sample_clicks(scene);
CREATE INDEX IF NOT EXISTS idx_sample_clicks_clicked ON sample_clicks(clicked_at DESC);
"""
# 专家种子数据(密码统一为 expert123,生产环境应让专家自行注册)