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