实现事件档案管理(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: ```python 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: "无匹配事件" 注册路由 + 迁移 + 提交。