# 日历API集成功能说明 ## 功能概述 `get_calendar_by_date` 函数现在具备了完整的智能查询功能: 1. **优先查询数据库**: 首先在本地 `calendar_info` 表中查找指定日期的黄历信息 2. **自动API调用**: 如果数据库中没有找到记录,自动调用外部API获取数据 3. **数据持久化**: 将API获取的数据自动保存到数据库中 4. **统一返回格式**: 无论数据来源如何,都返回标准化的JSON格式 ## 工作流程 ``` 用户请求日期 → 查询数据库 → 找到数据? → 是 → 返回数据 ↓ 否 ↓ 调用外部API → 成功? → 是 → 保存到数据库 → 返回数据 ↓ 否 ↓ 返回错误信息 ``` ## 新增方法 ### CalendarService.fetch_calendar_from_api() 从聚合数据黄历API获取指定日期的黄历信息。 **参数:** - `yangli_date (date)`: 阳历日期 **返回:** - `Optional[dict]`: API返回的黄历信息,失败时返回None ### CalendarService.save_calendar_from_api() 将API返回的黄历信息保存到数据库。 **参数:** - `api_data (dict)`: API返回的黄历信息数据 **返回:** - `Optional[CalendarInfo]`: 保存后的黄历信息对象,失败时返回None ## 配置文件 新增 `calendar_config.py` 配置文件,集中管理API相关配置: ```python CALENDAR_API_CONFIG = { 'url': 'http://v.juhe.cn/laohuangli/d', 'key': 'your-api-key-here', 'timeout': 10, 'retry_times': 3 } ``` ## API数据格式转换 外部API返回的数据格式与数据库字段的映射关系: | API字段 | 数据库字段 | 说明 | |---------|------------|------| | `yangli` | `yangli` | 阳历日期 | | `yinli` | `yinli` | 阴历日期 | | `wuxing` | `wuxing` | 五行 | | `chongsha` | `chongsha` | 冲煞 | | `baiji` | `baiji` | 彭祖百忌 | | `jishen` | `jishen` | 吉神宜趋 | | `yi` | `yi` | 宜 | | `xionshen` | `xiongshen` | 凶神宜忌 (注意字段名差异) | | `ji` | `ji` | 忌 | ## 错误处理 函数包含完整的错误处理机制: - **400**: 日期格式错误 - **404**: 数据库和API都没有找到数据 - **500**: 系统内部错误(如API调用失败、数据库保存失败等) ## 使用示例 ```python from app.core.data_parse.calendar import get_calendar_by_date # 查询指定日期的黄历信息 result = get_calendar_by_date("2025-08-24") if result['return_code'] == 200: calendar_data = result['result'] print(f"阳历: {calendar_data['yangli']}") print(f"阴历: {calendar_data['yinli']}") print(f"宜: {calendar_data['yi']}") print(f"忌: {calendar_data['ji']}") else: print(f"查询失败: {result['error']}") ``` ## 注意事项 1. **API密钥**: 当前硬编码在配置文件中,生产环境建议使用环境变量 2. **网络超时**: API调用设置了10秒超时,可根据网络情况调整 3. **数据一致性**: API数据保存到数据库后,后续查询将直接从数据库返回 4. **错误日志**: 所有API调用和数据库操作的错误都会记录到控制台 ## 测试 运行以下测试文件验证功能: ```bash # 测试基本功能 python test_calendar_function.py # 测试API集成功能 python test_calendar_api_integration.py ``` ## 依赖要求 确保安装了以下Python包: ```bash pip install requests sqlalchemy ```