# 日历API路由接口说明

## 接口概述

新增的 `get-calendar-info` API接口用于获取指定日期的黄历信息，支持智能查询：优先从数据库查询，未找到时自动调用外部API获取数据并保存到数据库。

## 接口详情

### 基本信息

- **接口名称**: `get-calendar-info`
- **请求方法**: `GET`
- **接口路径**: `/api/data_parse/get-calendar-info`
- **功能描述**: 获取指定日期的黄历信息

### 请求参数

| 参数名 | 类型 | 必填 | 格式 | 说明 |
|--------|------|------|------|------|
| date | string | 是 | YYYY-MM-DD | 查询日期，如：2025-01-19 |

### 请求示例

```bash
# 使用curl
curl -X GET "http://localhost:5000/api/data_parse/get-calendar-info?date=2025-01-19"

# 使用浏览器
GET http://localhost:5000/api/data_parse/get-calendar-info?date=2025-01-19
```

### 响应格式

#### 成功响应 (200)

```json
{
    "reason": "successed",
    "return_code": 200,
    "result": {
        "id": "1657",
        "yangli": "2014-09-11",
        "yinli": "甲午(马)年八月十八",
        "wuxing": "井泉水 建执位",
        "chongsha": "冲兔(己卯)煞东",
        "baiji": "乙不栽植千株不长 酉不宴客醉坐颠狂",
        "jishen": "官日 六仪 益後 月德合 除神 玉堂 鸣犬",
        "yi": "祭祀 出行 扫舍 馀事勿取",
        "xiongshen": "月建 小时 土府 月刑 厌对 招摇 五离",
        "ji": "诸事不宜"
    }
}
```

#### 错误响应

**参数缺失 (400)**
```json
{
    "reason": "failed",
    "return_code": 400,
    "result": null,
    "error": "缺少必填参数: date"
}
```

**日期格式错误 (400)**
```json
{
    "reason": "failed",
    "return_code": 400,
    "result": null,
    "error": "日期格式错误，请使用YYYY-MM-DD格式"
}
```

**数据未找到 (404)**
```json
{
    "reason": "failed",
    "return_code": 404,
    "result": null,
    "error": "未找到日期 2025-01-19 的黄历信息，且API获取失败"
}
```

**服务器错误 (500)**
```json
{
    "reason": "failed",
    "return_code": 500,
    "result": null,
    "error": "查询过程中发生错误: 具体错误信息"
}
```

## 响应字段说明

### 成功响应字段

| 字段名 | 类型 | 说明 |
|--------|------|------|
| reason | string | 操作结果描述，"successed"表示成功 |
| return_code | integer | HTTP状态码，200表示成功 |
| result | object | 黄历信息数据对象 |

### 黄历信息字段 (result)

| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | string | 记录ID |
| yangli | string | 阳历 |
| yinli | string | 阴历 |
| wuxing | string | 五行 |
| chongsha | string | 冲煞 |
| baiji | string | 彭祖百忌 |
| jishen | string | 吉神宜趋 |
| yi | string | 宜 |
| xiongshen | string | 凶神宜忌 |
| ji | string | 忌 |

### 错误响应字段

| 字段名 | 类型 | 说明 |
|--------|------|------|
| reason | string | 操作结果描述，"failed"表示失败 |
| return_code | integer | HTTP状态码 |
| result | null | 失败时为null |
| error | string | 错误描述信息 |

## 业务逻辑

### 查询流程

1. **参数验证**: 检查date参数是否存在且格式正确
2. **数据库查询**: 在`calendar_info`表中查找指定日期的记录
3. **API调用**: 如果数据库中没有找到，自动调用外部黄历API
4. **数据保存**: 将API获取的数据保存到数据库
5. **结果返回**: 返回标准化的JSON响应

### 智能查询特性

- **优先本地**: 首先查询本地数据库，响应速度快
- **自动补充**: 数据库缺失时自动从API获取
- **数据持久化**: API数据自动保存，避免重复调用
- **统一格式**: 无论数据来源如何，都返回相同格式

## 错误处理

### HTTP状态码

| 状态码 | 说明 |
|--------|------|
| 200 | 查询成功 |
| 400 | 请求参数错误 |
| 404 | 数据未找到 |
| 500 | 服务器内部错误 |

### 错误类型

1. **参数错误**: 缺少date参数或格式不正确
2. **数据缺失**: 指定日期在数据库和API中都没有数据
3. **API错误**: 外部API调用失败
4. **系统错误**: 数据库操作异常等

## 使用示例

### Python示例

```python
import requests

# 查询指定日期的黄历信息
url = "http://localhost:5000/api/data_parse/get-calendar-info"
params = {"date": "2025-01-19"}

response = requests.get(url, params=params)

if response.status_code == 200:
    data = response.json()
    if data['return_code'] == 200:
        calendar_info = data['result']
        print(f"阳历: {calendar_info['yangli']}")
        print(f"阴历: {calendar_info['yinli']}")
        print(f"宜: {calendar_info['yi']}")
        print(f"忌: {calendar_info['ji']}")
    else:
        print(f"查询失败: {data['error']}")
else:
    print(f"HTTP请求失败: {response.status_code}")
```

### JavaScript示例

```javascript
// 查询指定日期的黄历信息
async function getCalendarInfo(date) {
    try {
        const response = await fetch(`/api/data_parse/get-calendar-info?date=${date}`);
        const data = await response.json();
        
        if (data.return_code === 200) {
            const calendarInfo = data.result;
            console.log(`阳历: ${calendarInfo.yangli}`);
            console.log(`阴历: ${calendarInfo.yinli}`);
            console.log(`宜: ${calendarInfo.yi}`);
            console.log(`忌: ${calendarInfo.ji}`);
            return calendarInfo;
        } else {
            console.error(`查询失败: ${data.error}`);
            return null;
        }
    } catch (error) {
        console.error('请求失败:', error);
        return null;
    }
}

// 使用示例
getCalendarInfo('2025-01-19');
```

## 测试

### 测试文件

运行以下测试文件验证接口功能：

```bash
# 测试API路由接口
python test_calendar_api_route.py
```

### 测试用例

1. **有效日期**: 测试正常日期查询
2. **无效格式**: 测试错误日期格式
3. **参数缺失**: 测试缺少date参数
4. **空参数**: 测试空字符串参数

## 注意事项

1. **日期格式**: 必须使用YYYY-MM-DD格式，如2025-01-19
2. **API密钥**: 外部API调用需要有效的API密钥
3. **网络超时**: API调用设置了超时时间，网络不稳定可能影响结果
4. **数据一致性**: API数据保存到数据库后，后续查询将直接从数据库返回
5. **错误日志**: 所有操作都会记录详细日志，便于问题排查

## 依赖要求

确保安装了以下Python包：

```bash
pip install flask requests sqlalchemy
```

## 部署说明

1. 确保Flask应用正在运行
2. 检查数据库连接配置
3. 验证外部API密钥有效性
4. 测试接口可访问性

## 更新日志

- **v1.0.0**: 初始版本，支持基本的黄历信息查询
- **v1.1.0**: 新增API集成功能，支持自动数据补充
- **v1.2.0**: 新增路由接口，支持HTTP GET请求
