feat: 投资资讯日报查询页 + 文档更新 + 拉取服务器最新内容

- 新增 charts/news_reports.php 报告查询导航页(列表+详情一体,fetch API 渲染)
- 新增 js/newsReports.js:AI 摘要/新闻联播/财经新闻/公告调研/数据总览固定模块,stats 归一化兼容多种格式
- index-2.php 研究报告卡片改为导航链接,移除 PHP 目录下拉框
- 更新 AGENTS.md/CLAUDE.md(路径、页面清单、数据模式等核实修正)
- 同步服务器拉取的文档:quant 使用手册、podcast-docs
- 生成 continuation.md 会话检查点
This commit is contained in:
2026-08-05 20:28:57 +08:00
parent 60fb1b95e1
commit 8ea9b48a9a
10 changed files with 1717 additions and 128 deletions
+120
View File
@@ -0,0 +1,120 @@
# 部署文档
> 当前部署环境: doorcome.cn (Debian 12)
## 服务器要求
| 组件 | 版本 | 用途 |
|------|------|------|
| Python | 3.11+ | Django + Celery |
| MySQL/MariaDB | 10.11+ | 数据存储 |
| Redis | 6+ | Celery Broker |
| Nginx | — | 反向代理 |
| Node.js | 18+ | 前端 |
## 目录结构
```
/home/simon/myquant/django/podcast/ # 后端代码
├── venv/ # Python 虚拟环境
├── staticfiles/ # Django 静态文件
├── data/audios/ # 音频文件
├── logs/ # 日志
└── frontend/ # 前端代码
└── .next/ # 前端构建产物
```
## systemd 服务
| 服务 | 端口 | 说明 |
|------|------|------|
| `podcast-gunicorn` | 8001 | Django API |
| `podcast-celery` | — | AI 处理 Worker |
| `podcast-frontend` | 3000 | Next.js 前端 |
### 管理命令
```bash
sudo systemctl status podcast-gunicorn
sudo systemctl restart podcast-celery
sudo journalctl -u podcast-frontend -n 50 -f
```
## Nginx 路由
| 路径 | 后端 |
|------|------|
| `/api/` | `127.0.0.1:8001` (Django) |
| `/admin/` | `127.0.0.1:8001` (Django) |
| `/static/` | Django 静态文件 |
| `/media/` | 音频文件 |
| `/podcast/` | `127.0.0.1:3000` (Next.js) |
## 首次部署
```bash
# 1. 同步代码
rsync -avz --delete --exclude='node_modules' --exclude='__pycache__' \
--exclude='.env' --exclude='venv' --exclude='.next' \
./ doorcome:/home/simon/myquant/django/podcast/
# 2. 安装依赖
ssh doorcome
cd /home/simon/myquant/django/podcast
source venv/bin/activate
pip install -r requirements.txt
# 3. 配置环境变量
vi .env # 填入数据库连接、API Key 等
# 4. 数据库迁移
python manage.py migrate
python manage.py collectstatic --noinput
python manage.py createsuperuser
# 5. 启动服务
sudo systemctl start podcast-gunicorn
sudo systemctl start podcast-celery
sudo systemctl start podcast-frontend
# 6. 配置 Nginx
# 编辑 /etc/nginx/sites-enabled/default 添加反向代理配置
sudo nginx -t && sudo systemctl reload nginx
```
## 更新部署
```bash
# 本地同步代码
rsync -avz --delete --exclude={node_modules,__pycache__,.env,venv,.next,db.sqlite3} \
./ doorcome:/home/simon/myquant/django/podcast/
# 远程执行
ssh doorcome "
cd /home/simon/myquant/django/podcast
source venv/bin/activate
pip install -r requirements.txt -q
python manage.py migrate
python manage.py collectstatic --noinput
sudo systemctl restart podcast-gunicorn podcast-celery
cd frontend
npm install -q
npm run build
sudo systemctl restart podcast-frontend
"
```
## 配置项
参见 `/home/simon/myquant/django/podcast/.env`
| 配置项 | 说明 |
|--------|------|
| `DEBUG` | 生产环境设为 False |
| `ALLOWED_HOSTS` | 允许的域名 |
| `DB_*` | MySQL 连接信息 |
| `REDIS_URL` | Redis 连接 |
| `DASHSCOPE_API_KEY` | 千问 ASR API Key |
| `DEEPSEEK_API_KEY` | DeepSeek API Key |
| `DEV_MOCK_ASR` | 0=真实 ASR, 1=Mock(开发用) |
+181
View File
@@ -0,0 +1,181 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>播客处理流水线 — 使用说明</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; line-height: 1.6; color: #333; }
h1 { border-bottom: 2px solid #2563eb; padding-bottom: 8px; }
h2 { margin-top: 32px; border-bottom: 1px solid #e5e7eb; padding-bottom: 4px; }
pre { background: #f3f4f6; padding: 12px; border-radius: 8px; overflow-x: auto; font-size: 14px; }
code { background: #f3f4f6; padding: 2px 6px; border-radius: 4px; font-size: 14px; }
table { border-collapse: collapse; width: 100%; margin: 12px 0; }
th, td { border: 1px solid #e5e7eb; padding: 8px 12px; text-align: left; }
th { background: #f9fafb; }
.tip { background: #eff6ff; border-left: 4px solid #2563eb; padding: 12px; margin: 16px 0; border-radius: 4px; }
.warn { background: #fef3c7; border-left: 4px solid #f59e0b; padding: 12px; margin: 16px 0; border-radius: 4px; }
</style>
</head>
<body>
<h1>播客处理流水线 · 使用说明</h1>
<p>从 Apple Podcast URL 自动获取播客 → 语音转文字 → 中文翻译 → AI 要点分析</p>
<h2>一、地址总览</h2>
<table>
<tr><th>用途</th><th>地址</th></tr>
<tr><td>前端首页(时间线)</td><td><a href="https://doorcome.cn/podcast/">https://doorcome.cn/podcast/</a></td></tr>
<tr><td>添加播客</td><td><a href="https://doorcome.cn/podcast/new">https://doorcome.cn/podcast/new</a></td></tr>
<tr><td>播客管理</td><td><a href="https://doorcome.cn/podcast/podcasts">https://doorcome.cn/podcast/podcasts</a></td></tr>
<tr><td>API 文档 (Swagger)</td><td><a href="https://doorcome.cn/api/docs/">https://doorcome.cn/api/docs/</a></td></tr>
<tr><td>管理后台</td><td><a href="https://doorcome.cn/admin/">https://doorcome.cn/admin/</a></td></tr>
</table>
<h2>二、前端使用</h2>
<h3>2.1 添加播客</h3>
<ol>
<li>打开「添加」页面</li>
<li>粘贴 Apple Podcast 链接,格式如:<br>
<code>https://podcasts.apple.com/cn/podcast/lex-fridman-podcast/id1434243584</code></li>
<li>点击「添加」按钮</li>
<li>系统自动获取播客信息、节目列表,后台 AI 开始处理</li>
</ol>
<div class="tip">
✅ 支持所有 Apple Podcast URL。系统会通过 iTunes API 获取元数据,
然后解析 RSS Feed 获取所有节目。
</div>
<h3>2.2 查看要点</h3>
<ul>
<li>首页按日期分组展示已处理的要点卡片</li>
<li>可按播客来源或日期过滤</li>
<li>卡片包含:封面、标题、一句话摘要、标签</li>
<li>点击「详情」查看完整内容</li>
<li>点击「播放」在线听音频</li>
</ul>
<h3>2.3 单集详情</h3>
<ul>
<li>音频播放器(顶部)</li>
<li>要点导航(点击展开/收起各话题)</li>
<li>全文展示:原文 / 中文翻译一键切换</li>
</ul>
<h3>2.4 播客管理</h3>
<ul>
<li>查看已添加的所有播客</li>
<li>删除播客及其所有节目</li>
</ul>
<h2>三、后台管理</h2>
<p>访问 <code>/admin/</code> 使用管理员账号登录。</p>
<table>
<tr><th>模型</th><th>功能</th></tr>
<tr><td>Podcast(播客)</td><td>查看、搜索所有播客</td></tr>
<tr><td>Episode(节目)</td><td>查看处理进度、过滤状态、重试失败节目</td></tr>
<tr><td>Transcript(转写)</td><td>查看 ASR 结果和翻译内容</td></tr>
<tr><td>Highlight(要点)</td><td>查看 AI 分析结果</td></tr>
</table>
<div class="tip">
处理状态说明:
<code>pending</code><code>downloading</code><code>downloaded</code>
<code>transcribing</code><code>transcribed</code>
<code>translating</code><code>translated</code>
<code>analyzing</code><code>completed</code><br>
任意步骤失败 → <code>failed</code>Admin 可选重试)
</div>
<h2>四、AI 处理流程</h2>
<p>添加播客后,Celery Worker 自动处理每个节目:</p>
<pre>
Step 1: 下载音频文件到服务器
Step 2: 千问 DashScope ASR → 语音转文字(带时间戳分段)
Step 3: 检测语种:
· 非中文 → DeepSeek 翻译成中文
· 中文 → 跳过翻译
Step 4: DeepSeek 要点分析 → JSON 结构化结果
· 一句话摘要
· 详细摘要(3-5段)
· 要点列表(话题 + 观点 + 时间戳)
· 标签
最终状态 → completed。
失败自动重试 3 次,每次间隔 60 秒。
</pre>
<h2>五、命令行操作</h2>
<p>SSH 到服务器后使用:</p>
<pre>
# 添加播客
cd /home/simon/myquant/django/podcast
source venv/bin/activate
python manage.py init_podcast "https://podcasts.apple.com/cn/podcast/.../idXXXXXX"
# 添加并触发 AI 处理
python manage.py init_podcast "https://..." --trigger-tasks
# 查看服务状态
sudo systemctl status podcast-gunicorn # Django API
sudo systemctl status podcast-celery # AI 处理 Worker
sudo systemctl status podcast-frontend # 前端
# 查看日志
sudo journalctl -u podcast-celery -n 50 -f
# 重启某个服务
sudo systemctl restart podcast-celery
</pre>
<h2>六、API 参考</h2>
<p>完整 API 文档在 <a href="https://doorcome.cn/api/docs/">Swagger UI</a></p>
<table>
<tr><th>方法</th><th>路径</th><th>说明</th></tr>
<tr><td>POST</td><td>/api/podcasts/add/</td><td>通过 Apple URL 添加播客</td></tr>
<tr><td>GET</td><td>/api/podcasts/</td><td>播客列表</td></tr>
<tr><td>GET</td><td>/api/podcasts/{id}/</td><td>播客详情(含节目列表)</td></tr>
<tr><td>DELETE</td><td>/api/podcasts/{id}/</td><td>删除播客</td></tr>
<tr><td>GET</td><td>/api/episodes/</td><td>节目列表(支持 status/podcast_id 过滤)</td></tr>
<tr><td>GET</td><td>/api/episodes/{id}/</td><td>单集详情(含转写+要点)</td></tr>
<tr><td>POST</td><td>/api/episodes/{id}/retry/</td><td>重试失败的节目</td></tr>
<tr><td>GET</td><td>/api/highlights/</td><td>要点列表(支持 date/podcast_id 过滤)</td></tr>
<tr><td>GET</td><td>/api/highlights/today/</td><td>今日要点</td></tr>
</table>
<h2>七、管理员账号</h2>
<table>
<tr><th>地址</th><th>用户名</th><th>密码</th></tr>
<tr><td><a href="https://doorcome.cn/admin/">https://doorcome.cn/admin/</a></td><td>admin</td><td>admin123</td></tr>
</table>
<div class="warn">
⚠️ 首次使用建议修改默认密码。
</div>
<h2>八、配置说明</h2>
<p>服务器配置文件:<code>/home/simon/myquant/django/podcast/.env</code></p>
<table>
<tr><th>配置项</th><th>说明</th></tr>
<tr><td>DASHSCOPE_API_KEY</td><td>千问 DashScope API KeyASR 语音转文字)</td></tr>
<tr><td>DEEPSEEK_API_KEY</td><td>DeepSeek API Key(翻译 + 要点分析)</td></tr>
<tr><td>DASHSCOPE_ASR_MODEL</td><td>ASR 模型名(默认 paraformer-realtime-v2</td></tr>
<tr><td>DEEPSEEK_MODEL</td><td>DeepSeek 模型名(默认 deepseek-chat</td></tr>
<tr><td>DEV_MOCK_ASR</td><td>开发模式:1=跳过真实 ASR,0=调用真实 API</td></tr>
</table>
</body>
</html>