feat: enhance UI, refactor services, improve templates and tests

- Replace image_extractor with pdf_image_extractor service
- Enhance pi_client with expanded API capabilities
- Improve summarizer service with additional features
- Update admin routes with more endpoints
- Add login page template
- Enhance detail page with comprehensive layout
- Improve search and trends pages
- Update base template with additional elements
- Refactor tests for better coverage
- Add validate_summary script
- Update project configuration and dependencies
This commit is contained in:
2026-06-07 19:38:58 +08:00
parent 4a72c35452
commit 0d293422ac
32 changed files with 2003 additions and 586 deletions
+28 -9
View File
@@ -49,6 +49,7 @@ paper/
├── pyproject.toml
├── app/
│ ├── __init__.py
│ ├── main.py # FastAPI 入口(lifespan 管理)
│ ├── config.py # pydantic-settings 配置加载
│ ├── database.py # SQLAlchemy 引擎、会话与 FTS5
@@ -57,6 +58,7 @@ paper/
│ ├── cli.py # Typer CLIcrawl / summarize / init-db
│ │
│ ├── routes/ # 页面与 API 路由
│ │ ├── __init__.py
│ │ ├── pages.py # 首页、日期页、论文详情
│ │ ├── admin.py # Token 鉴权管理接口
│ │ ├── search.py # 搜索、阅读列表、RSS
@@ -65,6 +67,7 @@ paper/
│ │ └── compare.py # 论文对比页
│ │
│ ├── services/ # 业务逻辑层
│ │ ├── __init__.py
│ │ ├── crawler.py # HuggingFace API 爬虫
│ │ ├── summarizer.py # AI 总结编排
│ │ ├── searcher.py # FTS5 + 语义搜索
@@ -103,7 +106,7 @@ paper/
│ ├── init_db.py # 数据库初始化
│ └── manual_crawl.py # 手动抓取脚本
├── tests/ # 10 个测试模块
├── tests/ # 9 个测试模块
│ ├── conftest.py # 测试夹具(内存 DB、样本数据)
│ └── test_*.py # 各模块测试
@@ -117,7 +120,7 @@ paper/
### 1. 准备环境
- Python **3.12+**
- 可选:[`pi`](https://github.com/) CLI(用于 AI 总结)
- 可选:[`pi`](https://www.npmjs.com/package/@mariozechner/pi-coding-agent) CLI(用于 AI 总结)
### 2. 安装依赖
@@ -139,14 +142,30 @@ cp .env.example .env
| 变量 | 默认值 | 说明 |
|------|--------|------|
| `APP_HOST` / `APP_PORT` | `127.0.0.1` / `8000` | 服务监听地址 |
| `APP_DEBUG` | `false` | 调试模式(开启 uvicorn reload |
| `BASE_URL` | `http://127.0.0.1:8000` | 站点根 URL(用于 RSS 生成) |
| `APP_TIMEZONE` | `Asia/Shanghai` | 时区 |
| `ADMIN_TOKEN` | `change-me` | **必须修改** — 管理接口鉴权 |
| `HF_API_BASE` | `https://huggingface.co/api` | HuggingFace API 地址 |
| `HF_PROXY` | — | HTTP 代理 |
| `TOP_N` | `20` | 每日抓取 Top N 论文 |
| `HTTP_TIMEOUT_SECONDS` | `30` | HTTP 请求超时 |
| `HTTP_MAX_RETRIES` | `3` | HTTP 最大重试次数 |
| `PI_BIN` | — | `pi` CLI 路径 |
| `SUMMARY_SKILL` | `daily-paper-summary` | pi 总结技能名 |
| `SUMMARY_CONCURRENCY` | `3` | 最大并行总结数 |
| `SUMMARY_TIMEOUT_SECONDS` | `300` | 单篇总结超时 |
| `SUMMARY_MAX_RETRIES` | `1` | 总结最大重试次数 |
| `SCHEDULER_ENABLED` | `false` | 启用每日自动抓取 |
| `SCHEDULE_HOUR` / `SCHEDULE_MINUTE` | `8` / `0` | 定时任务时间(Asia/Shanghai |
| `SCHEDULE_HOUR` / `SCHEDULE_MINUTE` | `8` / `0` | 定时任务时间(APP_TIMEZONE |
| `APP_WORKERS` | `1` | Uvicorn worker 数(必须为 1 |
| `DATABASE_URL` | `sqlite:///data/db/papers.db` | 数据库路径 |
| `CHROMA_ENABLED` | `false` | 启用语义搜索 |
| `PI_BIN` | — | `pi` CLI 路径 |
| `SUMMARY_CONCURRENCY` | `3` | 最大并行总结数 |
| `CHROMA_DIR` | `data/chroma` | ChromaDB 数据目录 |
| `EMBED_API_BASE` | — | Embedding API 地址 |
| `EMBED_API_KEY` | — | Embedding API Key |
| `EMBED_MODEL` | — | Embedding 模型名 |
| `EMBED_DIMENSIONS` | `0` | 向量维度 |
### 4. 初始化数据库
@@ -158,10 +177,10 @@ python scripts/init_db.py
### 5. 启动服务
```bash
uvicorn app.main:app --host 127.0.0.1 --port 8000 --workers 1
uvicorn app.main:app --host 127.0.0.1 --port 8000
```
> 调度器依赖单 worker`--workers` 必须为 `1`,否则每日任务会被重复触发。
> 调度器依赖单 worker不可使用 `--workers > 1`,否则每日任务会被重复触发。
打开浏览器访问 `http://127.0.0.1:8000` 即可。
@@ -172,9 +191,9 @@ uvicorn app.main:app --host 127.0.0.1 --port 8000 --workers 1
### 手动抓取指定日期
```bash
python scripts/manual_crawl.py --date 2025-01-15
python scripts/manual_crawl.py 2025-01-15
# 或
python -m app.cli crawl --date 2025-01-15 --top 20
python -m app.cli crawl 2025-01-15 --top 20
```
### 手动触发总结