Files
daily-news-app/系統解析.md
donald db0f0bbfe7 Initial commit: Daily News App
企業內部新聞彙整與分析系統
- 自動新聞抓取 (Digitimes, 經濟日報, 工商時報)
- AI 智慧摘要 (OpenAI/Claude/Ollama)
- 群組管理與訂閱通知
- 已清理 Python 快取檔案

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 23:53:24 +08:00

411 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 每日報導 APP - 系統解析文檔
## 📋 系統概述
**每日報導 APP** 是一個企業內部新聞彙整與分析系統,主要功能是自動抓取多個新聞來源、使用 AI 進行智慧摘要、依產業別或議題分類,並自動生成每日報告發送給訂閱者。
---
## 🏗️ 系統架構
### 技術棧
| 層級 | 技術 | 說明 |
|------|------|------|
| **後端框架** | FastAPI 0.109.0 | 現代化的 Python Web 框架,支援異步處理 |
| **Python 版本** | Python 3.11 | 使用最新穩定版本 |
| **資料庫** | MySQL 8.0 / SQLite | 支援 MySQL生產和 SQLite開發 |
| **ORM** | SQLAlchemy 2.0.25 | 資料庫操作抽象層 |
| **認證** | JWT + LDAP/AD | 支援本地帳號和企業 AD/LDAP 整合 |
| **LLM 整合** | OpenAI / Gemini / Ollama | 支援多種 AI 模型進行摘要生成 |
| **排程** | APScheduler 3.10.4 | 定時任務排程(新聞抓取、報告生成) |
| **Email** | aiosmtplib 3.0.1 | 異步 SMTP 郵件發送 |
| **PDF 生成** | WeasyPrint 60.2 | 報告 PDF 匯出功能 |
| **部署** | Docker + Docker Compose | 容器化部署,支援 1Panel |
### 系統架構圖
```
┌─────────────────────────────────────────────────────────┐
│ 前端介面 (UI) │
│ (響應式設計,支援手機閱讀) │
└────────────────────┬────────────────────────────────────┘
│ HTTP/HTTPS
┌────────────────────▼────────────────────────────────────┐
│ FastAPI 應用程式 (app/main.py) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │
│ │ Auth API │ │ Users API│ │Groups API│ │Reports │ │
│ └──────────┘ └──────────┘ └──────────┘ └─────────┘ │
└────┬───────────────┬───────────────┬────────────────────┘
│ │ │
┌────▼────┐ ┌──────▼──────┐ ┌────▼──────┐
│ Services│ │ Models │ │ Database │
│ Layer │ │ (ORM) │ │ (MySQL) │
└────┬────┘ └──────────────┘ └───────────┘
┌────▼──────────────────────────────────────┐
│ 核心服務模組 │
│ • Crawler Service (新聞爬蟲) │
│ • LLM Service (AI 摘要) │
│ • Notification Service (Email 通知) │
│ • Scheduler Service (排程任務) │
└───────────────────────────────────────────┘
```
---
## 🔑 核心功能模組
### 1. 認證與授權 (`app/api/v1/endpoints/auth.py`)
- **JWT Token 認證**:使用 JWT 進行用戶認證
- **LDAP/AD 整合**:支援企業 Active Directory 統一認證
- **本地帳號**:支援本地用戶帳號密碼登入
- **角色權限**admin管理員、editor編輯、reader讀者
### 2. 用戶管理 (`app/api/v1/endpoints/users.py`)
- 用戶列表查詢
- 用戶新增、編輯、停用
- 角色分配
- 最後登入時間追蹤
### 3. 群組管理 (`app/api/v1/endpoints/groups.py`)
- **群組分類**產業別industry或議題topic
- **關鍵字管理**:為每個群組設定關鍵字,用於新聞匹配
- **AI 設定**:可為群組設定 AI 背景資訊和摘要提示
- **啟用/停用**:控制群組是否參與自動匹配
### 4. 新聞抓取 (`app/services/crawler_service.py`)
- **支援來源**
- Digitimes需付費帳號
- 經濟日報(公開)
- 工商時報(公開)
- **自動排程**:每日定時抓取(預設 08:00
- **關鍵字匹配**:根據群組關鍵字自動匹配新聞
- **防重複**:使用外部 ID 避免重複抓取
- **錯誤重試**:支援自動重試機制
### 5. 報告管理 (`app/api/v1/endpoints/reports.py`)
- **報告生成**:每日為每個群組自動生成報告
- **AI 摘要**:使用 LLM 生成綜合摘要
- **編輯功能**:專員可編輯 AI 摘要
- **文章篩選**:專員可選擇是否納入報告
- **發布流程**:草稿 → 待審核 → 已發布
- **PDF 匯出**:支援匯出 PDF 格式
### 6. 訂閱管理 (`app/api/v1/endpoints/subscriptions.py`)
- 用戶訂閱群組
- Email 通知開關
- 訂閱列表查詢
### 7. AI 摘要服務 (`app/services/llm_service.py`)
- **多 LLM 支援**
- Google Gemini預設
- OpenAI GPT-4
- Ollama本地部署
- **摘要生成**:根據群組設定和新聞內容生成摘要
- **可配置模型**:可選擇不同模型和參數
### 8. 通知服務 (`app/services/notification_service.py`)
- **Email 通知**:報告發布時自動發送 Email
- **通知記錄**:記錄所有通知發送狀態
- **失敗重試**:支援失敗通知重試
### 9. 排程服務 (`app/services/scheduler_service.py`)
- **定時抓取**:每日定時執行新聞抓取
- **報告生成**:定時生成每日報告
- **通知發送**:定時發送通知
### 10. 系統設定 (`app/api/v1/endpoints/settings.py`)
- LLM 設定API Key、模型選擇
- SMTP 設定Email 發送)
- PDF 設定Logo、頁首頁尾
- 系統參數設定
---
## 📊 資料庫結構
### 核心資料表
1. **用戶與權限**
- `roles`角色表admin, editor, reader
- `users`:用戶表(支援 AD/LDAP 和本地帳號)
2. **新聞來源與文章**
- `news_sources`:新聞來源設定
- `news_articles`:抓取的新聞文章
- `crawl_jobs`:抓取任務記錄
3. **群組與關鍵字**
- `groups`:群組表(產業別/議題)
- `keywords`:關鍵字表
- `article_group_matches`:新聞-群組匹配關聯
4. **報告**
- `reports`:報告表
- `report_articles`:報告-新聞關聯表
5. **讀者互動**
- `subscriptions`:訂閱表
- `favorites`:收藏表
- `comments`:留言表
- `notes`:個人筆記表
6. **系統**
- `system_settings`:系統設定表
- `audit_logs`:操作日誌表
- `notification_logs`:通知記錄表
### 資料保留策略
- 預設保留 60 天資料
- 使用 MySQL Event Scheduler 自動清理過期資料
---
## 🔐 安全機制
### 1. 認證安全
- JWT Token 認證
- 密碼使用 bcrypt 雜湊
- LDAP 注入防護
- Token 過期時間控制(生產環境建議 60-120 分鐘)
### 2. 資料安全
- 敏感資訊加密儲存API Keys、密碼
- SQL 注入防護(使用 ORM
- XSS 防護(輸入驗證和輸出編碼)
### 3. 環境安全
- 生產環境強制關閉 Debug 模式
- 生產環境關閉 API 文檔(/docs
- CORS 嚴格控制(生產環境不允許 `*`
- 密鑰長度驗證(至少 32 字元)
### 4. 日誌與審計
- 操作日誌記錄audit_logs
- 錯誤日誌記錄
- 通知發送記錄
---
## 📁 目錄結構說明
```
daily-news-app/
├── app/ # 應用程式主目錄
│ ├── api/v1/ # API 路由
│ │ ├── endpoints/ # API 端點實作
│ │ │ ├── auth.py # 認證相關
│ │ │ ├── users.py # 用戶管理
│ │ │ ├── groups.py # 群組管理
│ │ │ ├── reports.py # 報告管理
│ │ │ ├── subscriptions.py # 訂閱管理
│ │ │ └── settings.py # 系統設定
│ │ └── router.py # 路由總管理
│ ├── core/ # 核心設定
│ │ ├── config.py # 環境變數設定
│ │ ├── security.py # 安全相關JWT、LDAP
│ │ └── logging_config.py # 日誌設定
│ ├── db/ # 資料庫
│ │ └── session.py # 資料庫連線管理
│ ├── models/ # 資料模型SQLAlchemy
│ │ ├── user.py # 用戶模型
│ │ ├── news.py # 新聞模型
│ │ ├── group.py # 群組模型
│ │ ├── report.py # 報告模型
│ │ ├── interaction.py # 互動模型(訂閱、收藏等)
│ │ └── system.py # 系統模型
│ ├── schemas/ # Pydantic SchemaAPI 驗證)
│ │ ├── user.py
│ │ ├── group.py
│ │ └── report.py
│ ├── services/ # 商業邏輯服務
│ │ ├── crawler_service.py # 新聞爬蟲
│ │ ├── llm_service.py # AI 摘要
│ │ ├── notification_service.py # Email 通知
│ │ └── scheduler_service.py # 排程任務
│ ├── utils/ # 工具函數
│ └── main.py # 應用程式入口
├── scripts/ # 腳本
│ ├── init_db_sqlite.py # SQLite 初始化
│ └── init.sql # MySQL 初始化 SQL
├── templates/ # Email 模板
├── tests/ # 測試檔案
├── logs/ # 日誌目錄
├── uploads/ # 上傳檔案目錄
├── docker-compose.yml # Docker Compose 配置
├── Dockerfile # Docker 映像檔配置
├── requirements.txt # Python 依賴套件
├── run.py # 啟動腳本
└── README.md # 專案說明
```
---
## 🔄 系統流程
### 1. 新聞抓取流程
```
排程觸發 (08:00)
讀取所有啟用的新聞來源
對每個來源執行抓取
解析文章列表
取得文章內容
儲存到 news_articles
根據群組關鍵字匹配
建立 article_group_matches 關聯
記錄抓取任務狀態
```
### 2. 報告生成流程
```
每日定時觸發
查詢所有啟用的群組
對每個群組:
├─ 查詢匹配的新聞文章
├─ 使用 LLM 生成 AI 摘要
├─ 建立報告狀態draft
└─ 關聯新聞文章
專員審核與編輯
發布報告狀態published
發送 Email 通知給訂閱者
```
### 3. 用戶登入流程
```
用戶提交帳號密碼
判斷認證類型AD/LDAP 或本地)
驗證帳號密碼
查詢用戶資訊和角色
生成 JWT Token
返回 Token 給前端
```
---
## 🌐 API 端點總覽
### 認證相關
- `POST /api/v1/auth/login` - 用戶登入
- `GET /api/v1/auth/me` - 取得當前用戶資訊
### 用戶管理
- `GET /api/v1/users` - 用戶列表
- `POST /api/v1/users` - 新增用戶
- `GET /api/v1/users/{id}` - 用戶詳情
- `PUT /api/v1/users/{id}` - 更新用戶
- `DELETE /api/v1/users/{id}` - 刪除用戶
### 群組管理
- `GET /api/v1/groups` - 群組列表
- `POST /api/v1/groups` - 新增群組
- `GET /api/v1/groups/{id}` - 群組詳情
- `PUT /api/v1/groups/{id}` - 更新群組
- `DELETE /api/v1/groups/{id}` - 刪除群組
### 報告管理
- `GET /api/v1/reports` - 報告列表
- `GET /api/v1/reports/{id}` - 報告詳情
- `POST /api/v1/reports/{id}/publish` - 發布報告
- `GET /api/v1/reports/{id}/pdf` - 匯出 PDF
### 訂閱管理
- `GET /api/v1/subscriptions` - 我的訂閱
- `POST /api/v1/subscriptions` - 新增訂閱
- `DELETE /api/v1/subscriptions/{id}` - 取消訂閱
### 系統設定
- `GET /api/v1/settings` - 取得設定
- `PUT /api/v1/settings` - 更新設定
---
## 🔧 環境變數說明
系統使用 `.env` 檔案管理環境變數,主要包含:
### 應用程式設定
- `APP_ENV`環境development/staging/production
- `DEBUG`:除錯模式(生產環境必須為 false
- `SECRET_KEY`:應用程式密鑰(至少 32 字元)
- `JWT_SECRET_KEY`JWT 簽章密鑰(至少 32 字元)
### 資料庫設定
- `DB_HOST`:資料庫主機(或 "sqlite" 使用 SQLite
- `DB_PORT`:資料庫埠號
- `DB_NAME`:資料庫名稱
- `DB_USER`:資料庫用戶
- `DB_PASSWORD`:資料庫密碼
### LLM 設定
- `LLM_PROVIDER`LLM 提供者gemini/openai/ollama
- `GEMINI_API_KEY`Gemini API Key
- `OPENAI_API_KEY`OpenAI API Key
- `OLLAMA_ENDPOINT`Ollama 端點 URL
### SMTP 設定
- `SMTP_HOST`SMTP 伺服器
- `SMTP_PORT`SMTP 埠號
- `SMTP_USERNAME`SMTP 帳號
- `SMTP_PASSWORD`SMTP 密碼
- `SMTP_FROM_EMAIL`:寄件者 Email
### LDAP/AD 設定
- `LDAP_SERVER`LDAP 伺服器位址
- `LDAP_BASE_DN`LDAP Base DN
### 其他設定
- `DIGITIMES_USERNAME`Digitimes 帳號
- `DIGITIMES_PASSWORD`Digitimes 密碼
---
## 📝 注意事項
1. **生產環境部署**
- 必須設定強隨機的 `SECRET_KEY``JWT_SECRET_KEY`
- 必須關閉 `DEBUG` 模式
- 必須明確設定 `CORS_ORIGINS`(不能使用 `*`
- 建議設定 `JWT_ACCESS_TOKEN_EXPIRE_MINUTES` 為 60-120 分鐘
2. **資料庫選擇**
- 開發環境可使用 SQLite設定 `DB_HOST=sqlite`
- 生產環境建議使用 MySQL 8.0
3. **LLM 選擇**
- Gemini需要 API Key費用較低
- OpenAI需要 API Key品質較高
- Ollama本地部署無需 API Key但需要 GPU 資源
4. **新聞來源**
- Digitimes 需要付費帳號
- 經濟日報和工商時報為公開來源
---
## 📚 相關文檔
- `README.md` - 專案說明
- `daily-news-SDD.md` - 系統設計文檔
- `安全修復完成報告.md` - 安全修復記錄
- `執行步驟.md` - 詳細執行步驟(見下一個文檔)