2.0 KiB
2.0 KiB
实现事件档案管理(P0-7)。后端数据爬取 + API + 前端卡片页面。
后端: Event Crawler
创建 backend/app/services/event_crawler.py:
- 爬取 hm.zhiweidata.ai/events 数据
- 存入 events 表 (新建 ORM 模型)
- 定时每天凌晨执行
- 暂用占位数据(TODO: real crawler)
后端: Event Model
创建 backend/app/models/event.py:
class EventStatus(str, enum.Enum):
ACTIVE = "active"
FADING = "fading"
DISSIPATING = "dissipating"
CLOSED = "closed"
class Event(Base):
__tablename__ = "events"
id: str (UUID)
title: str
level: str (A/B/C)
domain: str (12个领域之一)
status: EventStatus
occurred_date: date
last_reviewed: datetime | None
no_new_info_count: int (连续无新知次数)
next_review: datetime | None
created_at: datetime
updated_at: datetime
创建 Alembic 迁移。
后端: Events API
创建 backend/app/api/events.py,全部 require_auth
GET /api/v1/events
事件卡片列表,三维筛选(前端即时过滤):
- query: ?status=active|fading|dissipating|closed&domain=xxx&search=keyword
- 每行含超期标记: overdue_days (下一次复查逾期天数)
- 空结果返回 []
前端: Event Archive 页面
修改 frontend/src/pages/EventArchivePage.tsx:
筛选工具栏
- 状态筛选: 全部/活跃期/消减期/消散期/已完结
- 领域筛选: 12 个领域下拉
- 搜索框: 按标题模糊搜索
- 前端即时过滤,组合生效
- [+ 新建事件] 按钮(P0 先做占位 Toast)
事件卡片网格
- 自适应列数 grid (minmax 340px)
- 每张卡片:
- 标题(粗体)
- 等级 Badge + 领域 Tag (蓝色)
- 状态 Badge(绿/黄/灰)
- Meta: 发生日期, 上次复查, 连续无新知(≥5标黄), 下次复查
- 超期标记: 红色 "超期 N 天"
- Hover: 边框变 honey-dim
- 点击: Toast 显示事件标题(P1 升级详情面板)
四态覆盖
- Empty: "无匹配事件"
注册路由 + 迁移 + 提交。