# djapi

Django 5.2 项目，提供 A 股金融数据 API 和新闻联播视频处理能力。

## 架构

```
djapi/
├── manage.py              # Django 入口
├── djapi/                  # 项目配置
│   ├── settings.py         # Django 设置、CORS、DRF
│   ├── urls.py             # 根路由 + OpenAPI schema
│   └── wsgi.py             # WSGI 入口
├── api/                    # 唯一 app
│   ├── views.py            # 视图层（薄转发，调用 stock 模块）
│   ├── urls.py             # /api/* 路由（~20 个端点）
│   ├── stock/              # 股票数据模块
│   │   ├── config.py       # Tushare token、扫描参数
│   │   ├── stock_utils.py  # 通用工具（tscode 校验、NaN 修正、view 包装器）
│   │   ├── stock_basic.py  # 日线行情、基本信息、行业查询
│   │   ├── getStockParam.py    # 个股参数
│   │   ├── getStockEp.py       # TTM / 季度 EPS
│   │   ├── getIndexs.py        # 指数行情
│   │   ├── stockMargin.py      # 融资融券
│   │   ├── getStockFina.py     # 财务报表分析
│   │   ├── getStockDiv2.py     # 股息率计算（TTM 分红 + 毛刺平滑）
│   │   ├── smoothBrush.py      # 数据平滑算法
│   │   ├── divSearch.py        # 全市场股息率批量扫描
│   │   ├── xwlbDaily.py        # 新闻联播数据查询
│   │   └── mysqlHandle.py      # MySQL 连接封装
│   └── video/               # 新闻联播视频处理（独立模块）
│       ├── getVideo5.py     # 主流程：抓取→下载→识别→入库
│       ├── audioRead.py     # 音频转换、分割、ASR 识别
│       ├── deepseek.py      # DeepSeek API 封装
│       ├── ai.py            # AI 调用函数
│       ├── newsProcess.py   # 新闻分割+标题提取
│       └── main.py          # 定时任务入口
├── static/                  # 静态文件（collect 后的 admin 资源）
├── uwsgi.ini                # uWSGI 配置
└── requirements.txt         # Python 依赖
```

### 数据流

**股票 API**：`HTTP 请求` → `views.py` 提取参数 → `viewFunc_tsCodeAndDate()` 统一包装 → `stock/*.py` 调用 Tushare API → pandas DataFrame → JsonResponse

**视频处理**：`main.py` → `getVideo5.py` 抓取 CCTV 视频页 → yt-dlp 下载 → ffmpeg 提取 MP3 → pydub 静音分割 → DashScope Paraformer ASR → MySQL → `newsProcess.py` 调用 DeepSeek 分割新闻+生成标题 → MySQL

### 外部依赖

| 服务 | 用途 | 相关文件 |
|------|------|----------|
| Tushare | A 股行情、财报、分红、指数 | `api/stock/*.py` |
| DeepSeek API | 新闻文本分割、摘要 | `api/video/deepseek.py`, `ai.py` |
| DashScope (Qwen) | ASR 语音识别、文本纠错 | `api/video/audioRead.py`, `ai.py` |
| MySQL | 股票数据、新闻联播数据 | `mysqlHandle.py`（stock 和 video 各一份） |
| yt-dlp + ffmpeg | 视频下载、音频提取 | `api/video/getVideo5.py` |

## 快速开始

```bash
# 安装依赖
pip install -r requirements.txt

# 开发服务器
python manage.py runserver 0.0.0.0:8000

# 数据库初始化
python manage.py migrate
python manage.py createsuperuser

# uWSGI 部署
uwsgi --ini uwsgi.ini
uwsgi --reload uwsgi.pid
uwsgi --stop uwsgi.pid
```

## API 概览

基础 URL：`/api/`

| 端点 | 参数 | 说明 |
|------|------|------|
| `stockbasic/` | tscode, start_date, end_date | 日线行情 |
| `stockinfo/` | tscode | 个股基本信息 |
| `stockparam/` | tscode, start_date, end_date | 个股参数（市值等） |
| `industrys/` | industry | 按行业查股票列表 |
| `indexByName/` | index_name | 按名称查指数 |
| `indexDatas/` | index_name, start_date, end_date | 指数日行情 |
| `stockep/` | tscode, start_date, end_date | TTM EPS |
| `quarterlyEps/` | tscode, start_date, end_date | 季度 EPS |
| `finance/` | tscode, start_date, end_date | 财务报表分析 |
| `getdiv/` | tscode, start_date, end_date | 股息率（含 TTM） |
| `dailymargin/` | trade_date, exchange_id | 每日融资融券汇总 |
| `stockmargin/` | tscode, start_date, end_date | 个股融资融券 |
| `xwlbNews/` | start_date, end_date | 新闻联播（原始识别文本） |
| `xwlbFine/` | start_date, end_date | 新闻联播（AI 分割后） |
| `news/reports/` | report_type, start_date, end_date, id | 日报查询（默认最近 24h；传 id 返回单份详情含事件） |
| `news/events/` | days, importance, report_type, section, limit | 重要事件聚合（跨日报，最近 N 天 importance≥阈值） |

日报查询接口详细说明见 [`docs/news_report_api.md`](../docs/news_report_api.md)（表结构见 `djapi/docs/db_schema.md`）。

API 文档（Swagger）：`/api/docs/`
OpenAPI Schema：`/api/schema/`

## 部署

- 服务器路径：`/home/simon/myquant/djapi/`
- uWSGI 监听 `127.0.0.1:5004`，nginx 反向代理
- 域名：`api.doorcome.cn`、`echart.doorcome.cn`
- 虚拟环境：`/opt/miniconda/envs/django`
- Python 版本：3.10

## TODO

- [ ] 将硬编码的 API Key / Token / 数据库密码迁移到环境变量
- [ ] 视图片段从 `JsonResponse` 迁移到 DRF ViewSet + Serializer，完善 Swagger 文档
- [ ] 添加接口限流和认证机制
- [ ] 补充单元测试（当前 tests.py 为空）
- [ ] `config.py` 中的交易所、行业列表等改为可动态配置
- [ ] video 模块的 `db.sqlite3` 不应随代码提交，添加到 `.gitignore`
- [ ] 数据库密码、API Key 出现在多个 `__pycache__/*.pyc` 中，需要清理历史
- [ ] video 模块中废弃脚本（`wasted/`）确认后清理
