diff --git a/Cargo.lock b/Cargo.lock index b34c759..c467bd3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -147,6 +147,7 @@ dependencies = [ "matchit", "memchr", "mime", + "multer", "percent-encoding", "pin-project-lite", "rustversion", @@ -1553,6 +1554,23 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "multer" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http", + "httparse", + "memchr", + "mime", + "spin", + "version_check", +] + [[package]] name = "native-tls" version = "0.2.18" diff --git a/Cargo.toml b/Cargo.toml index c8e3c53..f328aa4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ name = "astroresearch" version = "0.1.0" edition = "2021" +default-run = "astroresearch" [lib] path = "src/lib.rs" @@ -11,12 +12,14 @@ name = "astroresearch" path = "src/main.rs" [[bin]] -name = "test_qiniu" -path = "scratch/test_qiniu.rs" +name = "health_check" +path = "src/bin/health_check.rs" + + [dependencies] tokio = { version = "1", features = ["full"] } -axum = { version = "0.7", features = ["macros"] } +axum = { version = "0.7", features = ["macros", "multipart"] } tower-http = { version = "0.5", features = ["cors", "fs", "trace"] } sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "sqlite", "chrono", "json"] } serde = { version = "1.0", features = ["derive"] } diff --git a/README.md b/README.md index 2e2f735..0b2537c 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,14 @@ AstroResearch 是一个基于 **Rust (Axum)** 后端与 **React (Vite + TypeScri AstroResearch 为天文领域的学者与研究人员提供一站式的文献管理与智能阅读解决方案,核心功能包括: -- 🌌 **统一学术检索**:一键跨源检索 NASA ADS 与 arXiv 数据库,支持去重元数据卡片式展示。 -- 📥 **智能双通道下载**:模拟浏览器请求头与延迟,自动绕过出版商防爬墙,官方 HTML 优先并支持 ar5iv 备用兜底。 +- 🌌 **统一学术检索**:一键跨源检索 NASA ADS 与 arXiv 数据库,支持去重元数据卡片式展示、高级组合条件检索与多种排序方式。 +- 📥 **多通道文献同步与防爬绕过**:支持智能后台下载(官方 HTML / ar5iv 回退)、网页端本地 PDF/HTML 手动离线上传,以及浏览器书签脚本一键直推同步(无惧 Cloudflare 等高强度 WAF 拦截)。 +- 🏷️ **下载错误诊断与无资源标记**:自动记录每篇文献 PDF/HTML 下载失败的具体原因(数据库 `error:` 前缀字段),支持一键标记"无有效全文资源"并从批量任务中排除。 - 📝 **结构化文献解析**:解析 HTML 或调用 MinerU (PDF 降级解析) 输出标准 GFM Markdown,对 LaTeX 公式实施占位符保护。 - 🗣️ **大模型双语翻译**:基于本地天文学词汇库 (Trie 树最长匹配) 构建翻译 Glossary,指导大模型进行公式级精准中英翻译。 - 🪐 **引文网络星系图**:基于 HTML5 Canvas 的高性能力导向拓扑渲染,双击节点支持引文深度探索。 - ✍️ **划词高亮与笔记**:在双语阅读器中自由划词、多色高亮并记录学术心得,数据与文献双向绑定。 +- 🩺 **馆藏健康度检查**:内置诊断与修复工具,检测数据库与物理文件的不一致性并支持一键自动修复。 --- @@ -57,7 +59,18 @@ cp .env.example .env cd .. cargo run --release ``` - 运行后直接访问 `http://localhost:8000` 即可使用,此时所有 React 网页和后台 API 均由 Rust 进程统一分发托管,无需额外启动 Vite。 + 运行后直接访问 `http://localhost:8000` 即可使用,此时所有 React 网页和后台 API 均由 Rust 进程统一分发托管,无需额外启动 Vite。 + +### 2.3 馆藏文献健康度检查与修复 (Health Check) +系统提供内置的健康度校验脚本,可用于排查与自动修复数据库状态和物理磁盘文件的不一致问题: +- **只读扫描模式**:检测损坏文件、丢失文件、报错记录和孤立 Markdown,不改动任何数据。 + ```bash + cargo run --bin health_check + ``` +- **自动修复模式**:物理清理磁盘损坏/无源文件,将失效路径重置为 `NULL`(安全保留 `error:` 报错诊断日志)。 + ```bash + cargo run --bin health_check -- --fix + ``` --- @@ -75,7 +88,55 @@ cp .env.example .env --- -## 4. 目录组件 README 交叉引用 (Component READMEs) +## 4. 项目目录结构 (Project Structure) -- 💻 **前端 React 控制台**:查看 [dashboard/README.md](dashboard/README.md) -- ⚙️ **后端 Rust 源码**:参见 [src/README.md](src/README.md) +``` +AstroResearch/ +├── src/ +│ ├── main.rs # Axum 服务入口:路由注册、中间件、静态资源托管 +│ ├── lib.rs # 库入口:Config 配置结构体与环境变量加载 +│ ├── api/ # API 层(模块化拆分) +│ │ ├── mod.rs # AppState / StandardPaper 定义 + handlers 兼容命名空间 +│ │ ├── helpers.rs # 共享工具函数:格式转换、数据库读写、路径校验 +│ │ ├── papers.rs # 文献相关:检索、下载、上传、解析、翻译、引文、导出 +│ │ ├── notes.rs # 笔记 CRUD:创建、查询、删除 +│ │ └── sync.rs # 批量同步:元数据同步、资源同步、查询管理 +│ ├── bin/ +│ │ └── health_check.rs # 独立二进制:馆藏健康度诊断与修复工具 +│ ├── clients/ +│ │ ├── ads.rs # NASA ADS API 客户端 +│ │ ├── arxiv.rs # arXiv Atom XML API 客户端 +│ │ └── qiniu.rs # 七牛云对象存储客户端 +│ └── services/ +│ ├── batch/ # 批量同步引擎(模块化拆分) +│ │ ├── mod.rs # 公共导出 +│ │ ├── meta.rs # 元数据大批量采集 (MetaSync) +│ │ └── asset.rs # 物理资源批量处理 (AssetSync) +│ ├── download.rs # 文献下载器:反爬伪装、多级回退、错误记录 +│ ├── parser.rs # HTML/PDF → Markdown 解析器 +│ ├── translation.rs # LLM 翻译器 + Trie 词典 +│ ├── query_parser.rs # 高级检索语法解析 +│ └── logging.rs # 日志系统:控制台美化 + 滚动文件 +├── dashboard/ +│ └── src/ +│ ├── App.tsx # 全局状态管理与布局 +│ ├── types.ts # TypeScript 类型定义 +│ ├── components/ +│ │ ├── CitationGalaxyCanvas.tsx # Canvas 力导向引文星系图 +│ │ └── CustomSelect.tsx # 可复用下拉选择组件 +│ └── features/ +│ ├── search/SearchPanel.tsx # 跨源检索面板 +│ ├── library/LibraryPanel.tsx # 馆藏管理面板 +│ ├── reader/ReaderPanel.tsx # 双语对照阅读器 +│ ├── citation/CitationPanel.tsx # 引文图谱面板 +│ ├── sync/SyncPanel.tsx # 批量同步控制台 +│ └── settings/SettingsPanel.tsx # 系统设置 +├── migrations/ # SQLite 数据库迁移脚本 +├── library/ # 本地文献物理存储目录 +│ ├── PDF/ # 下载的 PDF 文件 +│ ├── HTML/ # 下载的 HTML 文件 +│ ├── Markdown/ # 解析后的 Markdown 文件 +│ └── Translation/ # 翻译后的中文 Markdown 文件 +├── docs/ # 技术文档 +└── dictionary.txt # 天文学双语名词词典 +``` diff --git a/bin/obscura b/bin/obscura new file mode 100755 index 0000000..2f53321 Binary files /dev/null and b/bin/obscura differ diff --git a/bin/obscura-worker b/bin/obscura-worker new file mode 100755 index 0000000..0e7a04e Binary files /dev/null and b/bin/obscura-worker differ diff --git a/dashboard/index.html b/dashboard/index.html index 984e31d..2b705d3 100644 --- a/dashboard/index.html +++ b/dashboard/index.html @@ -4,7 +4,7 @@ -
- 保存的历史批量收割检索规则。可在此快速一键再次启动同步或加载检索参数。 + 保存的历史批量元数据同步检索规则。可在此快速一键再次启动同步或加载检索参数。
+ 无需手动保存和拖拽上传!在您自己真实的浏览器上突破 Cloudflare/WAF 人机验证或在学校内网成功打开 PDF/HTML 页面后,点击此书签即可将文献直接推送同步到本地 AstroResearch 数据库与文献馆中。 +
++ 将下方的按钮直接拖拽到浏览器的书签栏中;或者新建一个浏览器书签,将其 URL 设为复制的 JavaScript 代码(点击右侧按钮复制): +
+ +