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>
This commit is contained in:
donald
2025-12-03 23:53:24 +08:00
commit db0f0bbfe7
50 changed files with 11883 additions and 0 deletions

410
系統解析.md Normal file
View File

@@ -0,0 +1,410 @@
# 每日報導 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` - 詳細執行步驟(見下一個文檔)