feat: 重构 PDF/文献检索同步机制、升级引力图交互与控制台 UI 样式

- [后端/PDF解析] 重构 MinerU PDF 解析流程:引入预签名两阶段直传机制,解决大文件 API 传输限制问题;支持轮询机制与本地 images 备用目录存储。
- [后端/同步与下载] 新增经典 ADS SCAN 扫描件 PDF 和 ADS_PDF 直接通道的下载逻辑;新增常用同步检索配置的持久化存储与去重管理 API。
- [后端/日志] 重构日志系统,支持控制台 pretty 输出与每日滚动文件日志(使用上海 +08:00 时区),引入 HTTP 路由请求链路追踪。
- [前端/引力图] 升级引用星系图 canvas 交互:支持平移拖拽与滚轮缩放,添加引力圈轨道装饰及未导入文献的半透明视觉区分。
- [前端/控制台] 统一重构为扁平高对比度浅色纯中文控制台样式;重新设计文献详情弹窗与状态进度条。
- [数据库] 新增 papers 表的 doctype 字段及 sync_queries 检索配置表。
This commit is contained in:
fmq
2026-06-10 17:29:07 +08:00
parent e13fa2ad40
commit cd6af4f995
43 changed files with 4029 additions and 958 deletions
+15 -6
View File
@@ -22,6 +22,7 @@ graph TD
Downloader[下载器 services/download.rs]
Translator[翻译器 services/translation.rs]
Qiniu[七牛云客户端 clients/qiniu.rs]
Logging[日志记录器 services/logging.rs]
DB[("SQLite / astro_research.db")]
end
@@ -143,12 +144,18 @@ sequenceDiagram
P->>P: 6e. 转换 GFM Markdown 并恢复 LaTeX 公式
P->>P: 6f. 后处理:清除冗余的 margin 空白与前导缩进
else 仅有 PDF 文件 (PDF 降级解析)
P->>M: 7a. Multipart 格式上传 PDF 至 MinerU 服务
M-->>P: 7b. 返回大模型解析出的 Markdown 文本及插图包
loop 遍历每一个提取的插图
P->>Q: 7c. 上传插图文件并获取七牛云 CDN 域名外链
P->>M: 7a. 获取批量预签名上传 URL (POST /file-urls/batch/)
M-->>P: 7b. 返回预签名上传 URL 与 Batch ID
P->>M: 7c. 上传 PDF 二进制字节流 (PUT 至预签名 URL)
loop 轮询任务状态 (每 10s 一次,最多 45 次)
P->>M: 7d. 查询提取进度与结果 (GET /extract-results/batch/{id})
M-->>P: 7e. 返回处理状态 ("done"/"error"等)
end
P->>P: 7d. 在 Markdown 中重写插图链接为七牛云 CDN 绝对路径
P->>P: 7f. 下载解析结果的 ZIP 压缩包并解压提取
loop 遍历每一个提取的插图
P->>Q: 7g. 上传插图文件并获取七牛云 CDN 域名外链
end
P->>P: 7h. 在 Markdown 中重写插图链接为七牛云 CDN 绝对路径
end
P-->>H: 8. 返回清洗转换出的标准英文 Markdown 文本
@@ -159,7 +166,7 @@ sequenceDiagram
#### 详细解析说明:
1. **HTML 转换为 Markdown 保护公式**:由于 MathJax/LaTeX 在 Markdown 转换中极易被当成普通字符进行转义(例如 `_` 倾斜或 `\` 换行失效),解析器在 HTML 解析前,通过正则将 `$` / `$$``\(` / `\[` 中的内容全部替换为特定的 UUID 占位符,转换为标准 Markdown 之后,再反向替换恢复公式,确保 LaTeX 渲染无损。
2. **PDF 复杂排版降级**:遇到无法直接提取 HTML 的老文献时,调用 MinerU 进行布局分析与公式提取,配合七牛云对象存储实现插图的自动提取、自动图床托管与正文自动替换回写
2. **PDF 复杂排版降级与大文件直传**:遇到无法直接提取 HTML 的老文献时,调用 MinerU 进行布局分析与公式提取。为避免在上传大型 PDF 时触发 API 网关的 `413 Payload Too Large` 错误,系统弃用了传统的 Multipart 表单直接 POST 请求,转而采用**两阶段直传机制**:先请求预签名上传 URL,随后使用 HTTP `PUT` 直接流式传输二进制数据至存储服务,最后通过后台任务轮询 `extract-results` 获取转换完毕的 ZIP 并自动托管插图至七牛云
---
@@ -233,6 +240,8 @@ sequenceDiagram
- 统一相对图表链接,并集成 MinerU PDF 解析。
- **[src/services/translation.rs](../src/services/translation.rs)**:
- 利用本地千万字级别的天文学双语词典对原文进行分词匹配,注入系统提示词让 LLM 实现学术级精细翻译。
- **[src/services/logging.rs](../src/services/logging.rs)**:
- 全局日志记录系统,基于 `tracing-subscriber` 实现了控制台美化日志输出与基于时间的每日滚动日志文件写出,使用上海时区 (+08:00) 格式化时间。
- **[dashboard/src/components/CitationGalaxyCanvas.tsx](../dashboard/src/components/CitationGalaxyCanvas.tsx)**:
- 基于原生 HTML5 Canvas 开发的轻量级、高性能力导向图星系物理引擎,用于文献引文网络拓扑结构的可视化渲染。
+3 -3
View File
@@ -34,13 +34,13 @@
### Rust 规范 (Backend)
- 遵循 Rust 官方标准样式,提交前必须执行 `cargo fmt` 与 `cargo clippy`。
- 注释和系统日志建议统一使用中文,便于开发者追踪阅读。
- API handers 中的异常信息请使用 `anyhow` 或 `thiserror` 进行结构化抛出。
- 注释和系统日志建议统一使用中文,便于开发者追踪 and 阅读。
- API handlers 中的异常信息请使用 `anyhow` 或 `thiserror` 进行结构化抛出。
### React & TypeScript 规范 (Frontend)
- 严格遵循 `React 18/19` 函数式组件写法,使用 React Hooks 维护状态。
- 为保证生产编译成功,务必开启类型安全限制(如在导入纯类型时显式使用 `import type { ... }`)。
- CSS 层面使用 Tailwind CSS 统一的磨砂玻璃体 (Glassmorphism) 及响应式布局,所有间距、颜色严格使用 CSS 变量控制以支持主题切换
- CSS 层面使用 Tailwind CSS 统一的高对比度浅色纯中文控制台风格,所有布局、间距、颜色需遵循实边框、高对比度黑白字及高雅按钮样式(`.btn-console` 等),以保障学术沉浸与阅读的高保真性
---
+5 -5
View File
@@ -6,14 +6,14 @@ AstroResearch 的前端界面设计坚持“未来科技感与学术沉浸”的
## 1. 视觉系统 (Visual Palette)
### 1.1 精致双色主题
### 1.1 高对比度浅色纯中文控制台
AstroResearch 完美适配了深色与浅色模式。使用精挑细选的 HSL 柔和色彩代替刺眼的饱和色
AstroResearch 前端目前重构并统一为**高对比度浅色纯中文学术控制台**,以确保长久学术检索与对照阅读的沉浸体验
| 模式 | 背景色 | 主文本色 | 卡片容器 | 毛玻璃效果 (Glassmorphism) |
| 元素 | 背景色 / 边框色 | 主文本色 | 交互按钮与状态指示 | 设计风格 |
| :--- | :--- | :--- | :--- | :--- |
| **深色模式** | 深夜极光黑 (`#090d16`) | 纯净雪白 (`#f8fafc`) | 磨砂深灰 (`bg-slate-900/60`) | 边框: `border-slate-800/80`, 模糊: `backdrop-blur-md` |
| **浅色模式** | 雅致灰石色 (`#f8fafc`) | 深石板色 (`#0f172a`) | 磨砂亮白 (`bg-white/60`) | 边框: `border-slate-200/80`, 模糊: `backdrop-blur-md` |
| **主背景** | 纯净冷灰白 (`#f1f5f9`) | 深石板灰/接近纯黑 (`#0f172a`) | 控制台按钮 (`.btn-console` / `.btn-console-primary`) | 扁平极简实边框设计 |
| **卡片/容器** | 纯白背景 (`#ffffff`),实线灰色边框 (`#e2e8f0`) | 辅助灰 (`#64748b`) | 指示灯:深宝石绿 (就绪) / 灰石色 (未解析) | 微卡片投影效果 |
---
+14 -2
View File
@@ -35,9 +35,21 @@
---
## 3. 数据库与运行环境问题 (Runtime & DB Issues)
## 3. 检索与显示问题 (Search & Display Issues)
### 3.1 启动提示 "Database Migration Failed"
### 3.1 无法通过特定的 arXiv ID 或 DOI 检索到已导入的文献
- **原因**:历史版本前端本地检索仅匹配了文献的标题、作者、摘要和 `bibcode`,未对 `arxiv_id``doi` 进行全局检测过滤。
- **排障/解决**:现已在馆藏过滤逻辑中追加了 `arxiv_id``doi` 的字段检索。如果遇到由于升级导致的缓存错乱,可点击顶部的 “重新同步馆藏” 刷新本地缓存状态。
### 3.2 文献详情页的 BIBCODE 与 ARXIV ID 显示完全相同的值(如均显示 '0710.0600'
- **原因**:当文献通过 arXiv 单独直接导入时,后端处理器无法预知其关联的 ADS Bibcode。为确保数据一致,系统在 SQLite 中临时将 `bibcode``arxiv_id` 均用 arXiv ID 填充,直到后续 ADS 元数据同步匹配成功将其“升级”。
- **解决机制**:前端已实现了防重与标识规整机制。如果检测到 `bibcode === arxiv_id`,卡片页将前缀格式化为 `arXiv:xxxx.xxxx` 形式,而文献元数据详情弹窗中 `BIBCODE` 则会直接优雅呈现为 **“暂无”** 状态,避免视觉歧义。
---
## 4. 数据库与运行环境问题 (Runtime & DB Issues)
### 4.1 启动提示 "Database Migration Failed"
- **原因**:本地 SQLite 数据库文件 `astro_research.db` 出现并发锁死或版本 schema 冲突。
- **解决方法**
1. 备份并临时删除根目录下的 `astro_research.db` 数据库文件。