# Hospital Helpers (HH)

[![Crates.io](https://img.shields.io/crates/v/hh.svg)](https://crates.io/crates/hh)
[![Documentation](https://docs.rs/hh/badge.svg)](https://docs.rs/hh)
[![License](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue.svg)](LICENSE)

Hospital Helpers 是一个 Rust 医疗信息助手库和 Web 服务，旨在从公开的医药公司网站获取药品信息和常见疾病自我诊断指导。

## 功能特性

- 🔍 **药品信息查询** - 从医药公司公开网站获取药品详细信息
- 💊 **药物数据库** - 结构化的药品信息，包括适应症、用法用量、副作用等
- 🏥 **疾病诊断** - 基于症状的常见疾病自我诊断指导
- 🌐 **RESTful API** - 提供完整的 Web API 接口
- 📦 **Crates.io 兼容** - 可作为库被其他项目引用

## 快速开始

### 作为库使用

在 `Cargo.toml` 中添加依赖：

```toml
[dependencies]
hh = "0.1.0"
tokio = { version = "1", features = ["full"] }
```

示例代码：

```rust
use hh::{HHClient, medicine::MedicineService, diagnosis::DiagnosisService};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // 创建客户端
    let client = HHClient::new();
    
    // 药品信息服务
    let medicine_service = MedicineService::new(client.clone());
    let medicine_info = medicine_service.get_details("阿司匹林").await?;
    println!("药品: {}", medicine_info.name);
    
    // 诊断服务
    let diagnosis_service = DiagnosisService::new(client);
    // ... 使用诊断服务
    
    Ok(())
}
```

### 作为 Web 服务使用

1. 克隆仓库：

```bash
git clone https://github.com/yourusername/hh.git
cd hh
```

2. 构建并运行：

```bash
cargo build --release
cargo run --bin hh-server
```

3. 服务将在 `http://127.0.0.1:3000` 启动

## API 端点

### 根路径
```
GET /
```
返回 API 信息和可用端点列表。

### 健康检查
```
GET /health
```
返回服务健康状态。

### 药品搜索
```
GET /api/v1/medicines/search?q={query}&limit={limit}
```

参数：
- `q`: 搜索关键词（药品名称）
- `limit`: 返回结果数量限制（可选，默认 10）

示例：
```bash
curl "http://127.0.0.1:3000/api/v1/medicines/search?q=阿司匹林"
```

### 药品详情
```
GET /api/v1/medicines/{name}
```

示例：
```bash
curl "http://127.0.0.1:3000/api/v1/medicines/阿司匹林"
```

### 症状分析
```
POST /api/v1/diagnosis/analyze
Content-Type: application/json

{
  "symptoms": [
    {
      "name": "发烧",
      "severity": "Moderate",
      "duration_days": 2
    },
    {
      "name": "咳嗽",
      "severity": "Mild"
    }
  ]
}
```

示例：
```bash
curl -X POST "http://127.0.0.1:3000/api/v1/diagnosis/analyze" \
  -H "Content-Type: application/json" \
  -d '{"symptoms":[{"name":"发烧","severity":"Moderate"}]}'
```

### 疾病信息
```
GET /api/v1/diseases/{name}
```

示例：
```bash
curl "http://127.0.0.1:3000/api/v1/diseases/感冒"
```

## 项目结构

```
hh/
├── src/
│   ├── lib.rs              # 库入口
│   ├── main.rs             # Web 服务器入口
│   ├── client.rs           # HTTP 客户端
│   ├── error.rs            # 错误类型定义
│   ├── medicine.rs         # 药品信息模块
│   ├── diagnosis.rs        # 诊断模块
│   └── scraper_utils.rs    # HTML 解析工具
├── Cargo.toml              # 项目配置
└── README.md               # 项目文档
```

## 数据模型

### MedicineInfo (药品信息)

```rust
pub struct MedicineInfo {
    pub name: String,                      // 药品名称
    pub generic_name: Option<String>,      // 通用名（学名）
    pub manufacturer: Option<String>,      // 生产厂家
    pub description: Option<String>,       // 描述
    pub indications: Vec<String>,          // 适应症
    pub dosage: Option<String>,            // 用法用量
    pub side_effects: Vec<String>,         // 副作用
    pub contraindications: Vec<String>,    // 禁忌症
    pub warnings: Vec<String>,             // 注意事项
    pub source_url: Option<String>,        // 来源网址
}
```

### Symptom (症状)

```rust
pub struct Symptom {
    pub name: String,                     // 症状名称
    pub severity: SeverityLevel,          // 严重程度
    pub duration_days: Option<u32>,       // 持续天数
    pub notes: Option<String>,            // 备注
}

pub enum SeverityLevel {
    Mild,       // 轻度
    Moderate,   // 中度
    Severe,     // 重度
    Emergency,  // 紧急
}
```

### DiseaseInfo (疾病信息)

```rust
pub struct DiseaseInfo {
    pub name: String,                          // 疾病名称
    pub alternative_names: Vec<String>,        // 别名
    pub description: Option<String>,           // 描述
    pub common_symptoms: Vec<String>,          // 常见症状
    pub causes: Vec<String>,                   // 病因
    pub risk_factors: Vec<String>,             // 风险因素
    pub treatments: Vec<String>,               // 治疗方案
    pub prevention: Vec<String>,               // 预防措施
    pub when_to_see_doctor: Vec<String>,      // 何时就医
    pub source_url: Option<String>,           // 来源网址
}
```

## 开发指南

### 添加新的数据源

要添加新的医药公司网站作为数据源：

1. 在 `medicine.rs` 或 `diagnosis.rs` 中实现特定的爬虫逻辑
2. 使用 `scraper_utils.rs` 中的工具函数解析 HTML
3. 将解析结果映射到相应的数据结构

示例：

```rust
use crate::scraper_utils::{extract_text, clean_text};

pub async fn fetch_from_custom_source(&self, url: &str) -> Result<MedicineInfo> {
    let html = self.client.fetch_html(url).await?;
    
    // 提取药品名称
    let name = extract_first_text(&html, "h1.drug-name")?
        .ok_or_else(|| HHError::NotFound("Drug name not found".to_string()))?;
    
    // 提取其他信息
    let description = extract_first_text(&html, ".drug-description")?;
    
    Ok(MedicineInfo::new(name).with_description(description))
}
```

### 运行测试

```bash
cargo test
```

### 构建文档

```bash
cargo doc --open
```

## 注意事项

⚠️ **重要提示**：

1. **不替代专业医疗建议** - 本项目仅提供信息参考，不能替代专业医疗诊断和治疗
2. **紧急情况请就医** - 如有严重症状，请立即就医
3. **数据准确性** - 从公开网站获取的数据可能存在延迟或不准确，使用前请核实
4. **遵守使用条款** - 爬取网站数据时请遵守目标网站的使用条款和 robots.txt
5. **个人隐私** - 不要在公共 API 中提交敏感个人健康信息

## 路线图

- [ ] 添加更多医药公司数据源
- [ ] 实现更智能的症状匹配算法
- [ ] 添加药物相互作用检查
- [ ] 支持多语言（中文、英文）
- [ ] 添加用户反馈机制
- [ ] 集成更多医学数据库 API
- [ ] 添加前端界面
- [ ] 移动应用支持

## 贡献

欢迎贡献！请查看 [CONTRIBUTING.md](CONTRIBUTING.md)（待创建）了解详情。

## 许可证

本项目采用双许可证：

- MIT License
- Apache License 2.0

您可以选择其中一个使用。详见 [LICENSE-MIT](LICENSE-MIT) 和 [LICENSE-APACHE](LICENSE-APACHE)。

## 致谢

感谢所有公开医疗信息的医药公司和医疗机构。

## 联系方式

- 问题反馈：[GitHub Issues](https://github.com/yourusername/hh/issues)
- 邮箱：your.email@example.com

---

**免责声明**：本软件按"原样"提供，不提供任何明示或暗示的保证。使用本软件获取的信息不应被视为医疗建议。
