================================================================================ 品牌資產最終處理與維護 (Phase 7) [DONE] ================================================================================ 26. [已完成] 品牌圖檔格式轉換: - 使用 `convert_assets.py` 生成多種格式。 - 產出格式:TIFF, JPG, EPS, AI (PDF), SVG (x3 款 Logo)。 - 位置:/Users/ogt/momo_pro_system/export_assets - 已部署至伺服器並建立品牌資產庫頁面:https://momo.wooo.work/brand_assets 27. [已完成] 維護頁面文案更新與部署: - 文案已更新為:「正在進行系統升級,為了提供更穩定的網站服務,系統正在進行必要的維護與優化,造成不便,敬請見諒」 - 已同步至 GCP 生產環境。 ================================================================================ WOOO TECH 公司入口網站 (Phase 8) [NEW PROJECT] ================================================================================ 28. [待辦] 公司入口網站開發 (wooo.work): - 將使用 **Flutter Web** 開發。 - 需在獨立專案中進行(非 momo_pro_system)。 - 詳細規劃文件:implementation_plan_wooo_website.md 【網站定位】 - 新創公司 WOOO TECH 的數位門面 - 整合各子系統產品的導航與介紹 - 一級域名:wooo.work - 子系統:momo.wooo.work, [未來產品].wooo.work 【頁面結構】 - 首頁:Hero Section + 產品卡片 - 產品介紹頁:各系統功能詳情 - 公司介紹:願景、使命 - 聯繫我們:表單或 Email 【視覺風格】 - 延續 WOOO 品牌:漸變紫藍 + 深色科技感 + 玻璃質感 - 動態流暢的互動效果 【待確認】 - DNS 託管商 (wooo.work) - 公司簡介文案 - 是否需要多語言支援 【環境區分】 1. 開發/測試環境(本機 VS Code): - 位置:macOS 本機 (/Users/ogt/momo_pro_system) - 用途:開發新功能、測試、除錯 - 啟動方式:`python app.py` - 訪問:http://localhost:5000 或 http://127.0.0.1:5000 - 資料庫:data/momo_database.db (本機 SQLite) ================================================================================ 完整部署流程 (2026-01-13) ================================================================================ 【部署完成狀態】 ✅ 網站:https://momo.wooo.work ✅ 響應時間:1.7-2 秒 ✅ SSL 有效期:2026-04-13 ✅ Google Drive 自動匯入:每 30 分鐘 ✅ 爬蟲任務:每小時執行 ✅ 自動備份:已配置 ================================================================================ 日常開發工作流程 ================================================================================ 【本機開發流程】 1. 啟動開發環境: cd /Users/ogt/momo_pro_system python app.py # 訪問:http://localhost:5000 2. 開發新功能: - 編輯程式碼 - 本機測試 - 確認功能正常 3. 測試資料庫變更: - 修改 database/models.py - 執行 python init_db.py - 驗證資料庫結構 4. 版本控制(如果使用 Git): git add . git commit -m "描述變更內容" 【版本同步檢查】 ⚠️ 重要:每次更新後確認本機和 GCP 版本一致 1. 檢查關鍵文件的修改時間和大小: # 本機 ls -lh /Users/ogt/momo_pro_system/app.py ls -lh /Users/ogt/momo_pro_system/dashboard.html # GCP gcloud compute ssh momo-server --zone=asia-east1-a \ --command="ls -lh ~/momo_pro_system/app.py ~/momo_pro_system/dashboard.html" 2. 比對檔案 MD5 雜湊值(確保內容完全一致): # 本機 md5 /Users/ogt/momo_pro_system/app.py # GCP gcloud compute ssh momo-server --zone=asia-east1-a \ --command="md5sum ~/momo_pro_system/app.py" 3. 檢查最近更新的文件: # 本機(最近 1 天內修改的 Python 和 HTML 文件) find /Users/ogt/momo_pro_system -type f \( -name "*.py" -o -name "*.html" \) -mtime -1 -ls # GCP gcloud compute ssh momo-server --zone=asia-east1-a \ --command="find ~/momo_pro_system -type f \( -name '*.py' -o -name '*.html' \) -mtime -1 -ls" 4. 版本追蹤建議: ✅ 每次更新後記錄更新時間和文件清單 ✅ 使用 Git 進行版本控制(未來可考慮) ✅ 重大更新前先備份 GCP 當前版本 ✅ 更新後測試關鍵功能確認正常 【常用維護命令】 # 查看服務狀態 gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo systemctl status momo" # 查看即時日誌 gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo journalctl -u momo -f" # 重啟服務 gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo systemctl restart momo" # 停止服務 gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo systemctl stop momo" # 啟動服務 gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo systemctl start momo" # 查看 Nginx 狀態 gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo systemctl status nginx" # 重新載入 Nginx 配置 gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo nginx -t && sudo systemctl reload nginx" # 檢查 SSL 證書狀態 gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo certbot certificates" # 手動更新 DuckDNS IP gcloud compute ssh momo-server --zone=asia-east1-a \ --command="~/duckdns/duck.sh && cat ~/duckdns/duck.log" # 查看資源使用狀況 gcloud compute ssh momo-server --zone=asia-east1-a \ --command="free -h && df -h && top -bn1 | head -n 15" 【維護模式管理】 # 啟用維護模式(顯示維護頁面,停止應用服務) gcloud compute ssh momo-server --zone=asia-east1-a \ --command="./enable_maintenance.sh" # 禁用維護模式(恢復正常服務) gcloud compute ssh momo-server --zone=asia-east1-a \ --command="./disable_maintenance.sh" # 維護模式說明: # - 維護模式會將網站切換到靜態維護頁面 # - 顯示「系統維護中」訊息和即時時鐘 # - SSL/HTTPS 持續運作 # - 適用於系統更新、資料庫維護等需要暫停服務的場景 # - 維護頁面位置:~/momo_pro_system/maintenance.html ================================================================================ 系統備份策略 ================================================================================ 【本機備份】 - 執行:python backup_system.py - 或在系統設定頁面點擊「系統備份」按鈕 - 位置:backups/ 目錄 - 最新備份:momo_pro_system_backup_20260113_111011_V9.4.zip (261 MB) 【生產環境備份】 ✅ 已設置每日自動備份(每天凌晨 2:00) 1. 自動備份配置: - 執行時間:每天 02:00(台北時間 10:00) - 備份腳本:~/daily_backup.sh - 備份位置:~/momo_backups/ - 保留期限:最近 7 天 - 備份內容: * 資料庫(momo_database.db) * 配置文件(config/) * Google Drive 憑證 * 系統配置(Nginx, systemd) * DuckDNS 配置 * 最近 7 天日誌 2. 查看備份狀態: gcloud compute ssh momo-server --zone=asia-east1-a \ --command="ls -lh ~/momo_backups/*.tar.gz | tail -5" 3. 查看備份日誌: gcloud compute ssh momo-server --zone=asia-east1-a \ --command="tail -50 ~/momo_backups/backup.log" 4. 手動執行備份: gcloud compute ssh momo-server --zone=asia-east1-a \ --command="~/daily_backup.sh" 5. 下載備份到本機: gcloud compute scp momo-server:~/momo_backups/momo_production_backup_*.tar.gz \ /Users/ogt/momo_pro_system/backups/ --zone=asia-east1-a 6. 恢復備份: # 解壓備份檔 tar -xzf momo_production_backup_YYYYMMDD_HHMMSS.tar.gz # 恢復資料庫 cp momo_production_backup_*/momo_database.db ~/momo_pro_system/data/ # 重啟服務 sudo systemctl restart momo ================================================================================ 故障排除指南 ================================================================================ 【問題:網站無法訪問】 1. 檢查服務狀態: gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo systemctl status momo nginx" 2. 檢查防火牆: gcloud compute firewall-rules list --filter="name:allow-http*" 3. 檢查 DNS 解析: nslookup momo.wooo.work 【問題:網站速度慢】 1. 檢查資源使用: gcloud compute ssh momo-server --zone=asia-east1-a \ --command="free -h && df -h && ps aux | grep python" 2. 檢查 Gunicorn workers: gcloud compute ssh momo-server --zone=asia-east1-a \ --command="ps aux | grep gunicorn" 3. 查看應用日誌: gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo journalctl -u momo -n 100 --no-pager" 【問題:SSL 證書過期】 1. 檢查證書狀態: gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo certbot certificates" 2. 手動續期: gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo certbot renew" 【問題:Google Drive 自動匯入失敗】 1. 檢查日誌: gcloud compute ssh momo-server --zone=asia-east1-a \ --command="sudo journalctl -u momo | grep -i 'google drive' | tail -n 20" 2. 檢查憑證檔案: gcloud compute ssh momo-server --zone=asia-east1-a \ --command="ls -lh ~/momo_pro_system/config/google_*.{json,pickle}" 3. 手動測試: gcloud compute ssh momo-server --zone=asia-east1-a cd ~/momo_pro_system source venv/bin/activate python -c "from services.google_drive_service import GoogleDriveService; g=GoogleDriveService(); print(g.list_files())" 【問題:504 Gateway Timeout】 原因:某些頁面(如 sales_analysis)需要處理大量數據(31 萬+ 筆記錄), 超過 Nginx 預設的 60 秒 timeout。 解決方案(已修復 2026-01-13): 1. 增加 Nginx proxy timeout 到 300 秒: - proxy_read_timeout 300s; - proxy_connect_timeout 300s; - proxy_send_timeout 300s; 2. 如需調整 timeout,編輯 Nginx 配置: gcloud compute ssh momo-server --zone=asia-east1-a sudo nano /etc/nginx/sites-available/momo # 修改 location / { 區塊內的 proxy_*_timeout 值 sudo nginx -t && sudo systemctl reload nginx 3. 如問題持續,考慮: - 查詢優化(已添加 11 個索引) - 增加 Gunicorn timeout(目前 120 秒) - 實作分頁或快取機制 - 升級 VM 規格(✅ 已升級:e2-standard-2, 8GB RAM) 效能優化歷程: - 2026-01-13: Nginx timeout 增加到 300 秒 - 2026-01-13: VM 記憶體從 4GB 升級到 8GB(解決 OOM 問題) - 記憶體使用率:從 94% 降至 7.5%,可用記憶體 6.9GB 【VM 規格升級方法】 如需再次升級 VM 規格: 1. 停止實例:gcloud compute instances stop momo-server --zone=asia-east1-a 2. 更改類型:gcloud compute instances set-machine-type momo-server --machine-type=e2-standard-4 --zone=asia-east1-a 3. 啟動實例:gcloud compute instances start momo-server --zone=asia-east1-a 4. 驗證升級:gcloud compute ssh momo-server --zone=asia-east1-a --command="free -h" 可用機器類型: - e2-standard-2: 2 vCPU, 8GB RAM (當前) - e2-standard-4: 4 vCPU, 16GB RAM - e2-standard-8: 8 vCPU, 32GB RAM ================================================================================ 重要檔案位置 ================================================================================ 【本機環境】 - 專案根目錄:/Users/ogt/momo_pro_system/ - 資料庫:data/momo_database.db - 配置檔:config.py, .env - Google Drive:config/google_credentials.json, config/google_token.pickle - 備份目錄:backups/ - 日誌目錄:logs/ 【生產環境 (VM)】 - 專案目錄:/home/ogt/momo_pro_system/ - 虛擬環境:/home/ogt/momo_pro_system/venv/ - 資料庫:/home/ogt/momo_pro_system/data/momo_database.db - 配置檔:/home/ogt/momo_pro_system/.env - Systemd 服務:/etc/systemd/system/momo.service - Nginx 配置:/etc/nginx/sites-available/momo - SSL 證書:/etc/letsencrypt/live/momo.wooo.work/ - DuckDNS 腳本:/home/ogt/duckdns/duck.sh - Gunicorn 日誌: - Access: /home/ogt/momo_pro_system/logs/gunicorn-access.log - Error: /home/ogt/momo_pro_system/logs/gunicorn-error.log - 系統日誌:sudo journalctl -u momo ================================================================================ 系統重啟後待辦事項清單 ================================================================================ 【本機開發環境重啟】 1. 啟動系統: cd /Users/ogt/momo_pro_system python app.py 2. 驗證匯入功能 (關鍵): - 進入「系統設定」頁面,匯入 Excel 報表。 - 觀察終端機日誌,確認出現「自動去重」或「已建立新資料表」的訊息。 - 若重複匯入相同檔案,應顯示「發現 X 筆重複資料,已忽略」。 3. 檢查資料顯示: - 進入「業績分析」頁面 (/sales_analysis)。 - 確認 '狀態' 欄位是否正確顯示 'F' (目前系統處於原始匯入模式,未執行強制轉 0)。 4. 決定清理策略: - 目前 app.py 中的「智慧資料清理」邏輯已被註解掉 (約第 1160 行)。 - 若確認資料無誤且不需要自動轉型,可維持現狀。 - 若需要恢復清理功能,請取消註解並重啟 app.py。 5. 系統備份: - 確認一切正常後,點擊「系統備份」按鈕或執行 `python backup_system.py`。 【進階報表與策略分析規劃 (Phase 2)】 6. [已完成] 營運成長報表 (Growth Strategy): - 建立獨立頁面 `growth_analysis.html`。 - 實作 MoM (月增率) / YoY (年增率) 雙軸趨勢圖。 - 實作 YTD (年初至今) 累計達成率。 - 實作 客單價 (AOV) 趨勢分析。 7. [已完成] BCG 矩陣分析 (波士頓矩陣): - 已在業績分析頁加入散佈圖,並自動計算中位數劃分四象限。 - 視覺化顯示:明星(黃)、金牛(綠)、問題(藍)、瘦狗(灰)。 8. [已完成] ABC 分析 (帕累托法則): - 已實作 A/B/C 類商品佔比計算與視覺化。 - 已加入 Excel 匯出功能,包含 ABC 分類欄位。 9. [已完成] 廠商獲利能力排行: - 已在業績分析頁新增廠商排行表格。 - 顯示總業績、毛利額、毛利率、SKU 數與平均單品產值。 10. [已完成] 淡旺季熱力圖: - 已實作 Month x Category 熱力圖。 - 透過氣泡大小與顏色深淺,視覺化呈現各分類在不同月份的業績表現。 【系統優化與維護 (Phase 3)】 11. [已完成] 業績分析頁面效能優化: - 實作 Server-side AJAX 載入列表資料,解決頁面卡頓問題。 - 優化篩選邏輯與快取機制。 12. [已完成] 淡旺季熱力圖匯出: - 實作點擊氣泡匯出該月份分類明細的功能。 13. [已完成] 廠商排行與詳細列表優化: - 廠商排行:新增佔比、銷量、ASP 欄位,並優化版面高度。 - 詳細列表:改為多維度聚合 (商品+品牌+廠商+分類),新增品牌、均價、退貨率欄位。 14. [已完成] ABC 分析列表增加商品ID欄位: - 在 ABC 詳細報表頁面與匯出 Excel 中增加「商品ID」欄位。 【待辦功能與驗證 (Phase 4)】 15. [待辦] 廠商排行互動優化: - 實作點擊廠商名稱,自動跳轉並篩選該廠商的所有商品。 16. [待辦] 商品看板庫存顯示: - 研究是否能從爬蟲抓取一般商品的庫存量 (目前僅 EDM/Festival 有抓取)。 - 若可行,在商品看板列表加入庫存欄位。 17. [已完成] 當日業績看板 (Daily Sales Dashboard): 【功能目標】 - ✅ 建立新頁面 `/daily_sales`,用於每日業績快照的分析與追蹤。 【資料表設計】 - ✅ 新建資料表 `daily_sales_snapshot`。 - ✅ 欄位結構與 `realtime_sales_monthly` 相同,並額外增加 `snapshot_date` (日期) 欄位。 - ✅ 實作自動去重機制,避免重複匯入相同日期的資料。 【Excel 匯入功能】 - ✅ 提供 Excel 上傳功能,欄位對應 `realtime_sales_monthly` 結構。 - ✅ 智慧匯入:從 Excel 的「日期」欄位自動拆分 snapshot_date(支援單檔多日)。 - ✅ 匯入後自動記錄快照日期,保留歷史記錄供比較分析。 【KPI 卡片顯示】 - ✅ 6 個核心指標卡片,每個指標計算 DoD% 和 WoW%: 1. 總業績 (DoD%, WoW%) 2. 總成本 (DoD%, WoW%) 3. 毛利 (DoD%, WoW%) 4. SKU 數 (DoD%, WoW%) 5. 客單價 (DoD%, WoW%) 6. 總銷量 (DoD%, WoW%) - ✅ KPI 卡片文字對比度優化(白色文字 + 陰影) 【分析圖表】 - ✅ 每日業績趨勢圖(混合圖表:柱狀 + 折線) - ✅ DoD 成長率圖(條件著色) - ✅ WoW 成長率圖(前 7 天灰色 + 第 8 天起彩色 + 說明工具提示) - ✅ 商品 Top 10 排行(橫向柱狀圖) 【業績行事曆視圖】(全新功能) - ✅ 完整月份行事曆,顯示每日業績、毛利、SKU、客單價、銷量 - ✅ 星期標註(週一~週日) - ✅ 2026 年台灣國定假日標註(根據人事行政總處公佈) - ✅ DoD 顏色系統:紅色 = 正成長,綠色 = 負成長 - ✅ DoD 百分比標籤顯示(右上角) - ✅ 行事曆文字對比度優化(彩色背景上的白色文字 + 陰影) - ✅ 點擊日期切換查看詳細業績 - ✅ 月份切換按鈕(上個月/下個月) 【詳細列表】 - ✅ 顯示當日各分類的業績明細(分類層級聚合) - ✅ 支援 DataTables 排序、搜尋、分頁功能 【日期選擇功能】 - ✅ 下拉選單顯示所有可用日期 - ✅ 切換日期時,KPI、圖表、列表同步更新 - ✅ 行事曆與日期選擇器連動 【UI/UX 優化】(2026-01-12 完成) - ✅ 行事曆視覺優化:移除彩色背景,改用白底黑字 + DoD 徽章(上漲紅色、下跌綠色) - ✅ 金額格式改為完整顯示(千分位):$123,456 取代 $123K - ✅ 移除行事曆日期格中的重複星期顯示(標題列已有星期標註) - ✅ 國定假日標籤改為日期右側顯示(inline layout) - ✅ 響應式設計優化: • 手機版採用橫向滾動(min-width: 700px) • KPI 標籤改用 emoji 圖示(💰業績、📊毛利、📦SKU、🛒客單、📈銷量) • 平板與手機適配字體大小與間距 • 新增滾動提示訊息 【多維度分析強化】(2026-01-12 完成) - ✅ 每日趨勢圖:多 Y 軸顯示(業績/毛利、客單價、銷量) - ✅ DoD 圖表:4 條線(業績、毛利、客單價、銷量) - ✅ WoW 圖表:4 條線 + 前 7 天灰色顯示 + 工具提示說明 - ✅ 行事曆每格顯示 5 項指標(業績、毛利、SKU、客單價、銷量) - ✅ 毛利計算修正:自動計算 (revenue - cost) 【廠商維度增強】(2026-01-12 完成) - ✅ Top 10 商品:顯示格式改為「商品名稱 (廠商名稱)」 - ✅ 分類業績明細:新增廠商欄位,顯示廠商名稱(非 ID) - ✅ 欄位優先順序修正:['廠商名稱', '廠商', 'Vendor', 'Supplier'] 【系統配置更新】(2026-01-12 完成) - ✅ 服務端口從 5888 改為 80 - ✅ 資料庫路徑確認:data/momo_database.db 【已完成測試】 - ✅ 行事曆顯示 5 項指標(完整金額 + 千分位) - ✅ 2026 年國定假日正確標註 - ✅ DoD 徽章顏色系統(紅色上漲、綠色下跌) - ✅ WoW 圖表灰色線條邏輯(前 7 天無對比資料) - ✅ 行事曆文字清晰可讀(白底黑字 + DoD 徽章) - ✅ 月份切換功能 - ✅ 日期選擇功能 - ✅ 手機版橫向滾動(行事曆、分類列表、Top 10 圖表) - ✅ 廠商名稱顯示(Top 10 + 分類明細) - ✅ 手機版 KPI 文字可見性優化(行事曆標籤由灰色改為深色) - ✅ 毛利率百分比顯示(顯示於毛利金額右側) - ✅ DoD/WoW 徽章對比度優化(改用深色背景白色文字) - ✅ 分類業績明細表格手機版滾動(min-width: 800px) - ✅ Top 10 商品圖表手機版滾動(min-width: 400-500px) 【修正的檔案】 - app.py (第 3376-3450 行):多維度圖表數據準備(DoD/WoW 計算、毛利計算、廠商維度) - app.py (第 3416, 3459 行):廠商欄位優先順序修正 - app.py (第 3456-3492 行):台灣國定假日資料 - app.py (第 3548-3628 行):行事曆數據計算(客單價、銷量、毛利) - app.py (第 3752-3791 行):行事曆數據準備函式(margin_rate 計算) - app.py (多處):服務端口從 5888 改為 80 - daily_sales.html (第 42-287 行):CSS 樣式重構(白底黑字、DoD 徽章、響應式設計) - daily_sales.html (第 106-114 行):Top 10 圖表響應式滾動容器樣式 - daily_sales.html (第 177-200 行):行事曆 HTML(5 項指標完整顯示) - daily_sales.html (第 227-242 行):行事曆 KPI 文字顏色與毛利率樣式 - daily_sales.html (第 260-262, 277-279 行):手機版 Top 10 圖表最小寬度設定 - daily_sales.html (第 387 行):毛利率百分比顯示(inline 於毛利右側) - daily_sales.html (第 408-521 行):DoD/WoW 徽章改用深色背景 - daily_sales.html (第 580-588 行):Top 10 圖表容器結構(加入滾動提示與響應式容器) - daily_sales.html (第 605-640 行):分類列表表格響應式容器(加入滾動提示) - daily_sales.html (第 644-896 行):Chart.js 多維度圖表配置 【系統架構優化與重構 (Phase 5)】 18. [已完成] 商品看板視覺優化 (V9.2): 【爬蟲效能優化】(2026-01-12 完成) - ✅ 商品圖爬取改用 i_code 直接構造 CDN URL - ✅ 格式:https://m.momoshop.com.tw/moscdn/goods/{i_code}_m.webp - ✅ 移除複雜 DOM 查詢(8+ CSS 選擇器),速度提升 20-30% - ✅ 提高圖片載入準確性與穩定性 【UI/UX 全面升級】(2026-01-12 完成) - ✅ 統一紫色主題風格(#667eea, #764ba2)與 Daily Sales 一致 - ✅ 現代化漸變效果(卡片、按鈕、表頭) - ✅ 商品卡片懸停動效(陰影、縮放) - ✅ 表格樣式優化(漸變表頭、hover 效果) - ✅ 商品圖片懸停效果(放大、邊框、陰影) - ✅ 分頁按鈕圓角與漸變設計 【版面與排版修正】(2026-01-12 完成) - ✅ 修正按鈕群組排版(全部、新上架、漲價、跌價、下架) - ✅ 修正表格文字可見性(tbody 文字顏色 #2c3e50) - ✅ 修正商品列表標題區塊(增加 card-body 包裹) - ✅ 商品 ID 字體放大至 0.875rem(原 small class) - ✅ 商品 ID 改用紫色主題色(#667eea) 【互動體驗增強】(2026-01-12 完成) - ✅ 價格顯示 hover 效果(背景漸變、放大、陰影) - ✅ 複製品號視覺回饋優化(✅ emoji + 縮放動畫) - ✅ 歷史圖表 Modal 視覺升級(漸變標題、圓角、陰影) - ✅ 圖表優化:漸變填充、平滑曲線、動態點樣式 - ✅ Tooltip 優化:emoji 圖示、深色背景、紫色邊框 - ✅ 圖表動畫:1 秒平滑動畫(easeInOutQuart) 【修正的檔案】 - scheduler.py (第 228-244 行):商品圖 URL 構造邏輯 - app.py (第 88 行):版本號更新至 V9.2 - dashboard.html (第 166-331 行):完整 CSS 重構 - dashboard.html (第 462-500 行):商品列表標題區塊結構調整 - dashboard.html (第 548-550 行):商品 ID 樣式修正 - dashboard.html (第 582-587 行):價格顯示互動效果 - dashboard.html (第 730-813 行):圖表漸變與動畫配置 - dashboard.html (第 777-789 行):複製回饋動畫 19. [已完成] 商品看板 KPI 卡片重構與新增指標 (V9.3): 【需求整合】(2026-01-12 完成) - ✅ 將原有 4 張 KPI 卡片整合為 2 張卡片 - ✅ 新增 7 個關鍵業務指標 - ✅ 優化視覺層次與資訊密度 - ✅ 提升使用者體驗與數據可讀性 【卡片 1:商品監控概況】(2026-01-12 完成) - ✅ 監控商品總數(千分位格式化) - ✅ 今日新增商品數 - ✅ 週增長(過去 7 天新增商品數) - ✅ 價格穩定商品數(7 天內無變價) 【卡片 2:今日價格動態】(2026-01-12 完成) - ✅ 上排:漲價 / 降價 / 下架(3 個主要變動指標) - ✅ 中排:平均漲幅 / 平均跌幅 / 活躍度(價格分析) - ✅ 下排:最活躍分類 / 最大變動(關鍵商業指標) 【新增 KPI 指標】(2026-01-12 完成) - ✅ 平均漲幅:漲價商品平均價格變動 - ✅ 平均跌幅:降價商品平均價格變動 - ✅ 今日活躍度:有價格變動的商品百分比 - ✅ 週增長:過去 7 天新增商品數 - ✅ 價格穩定商品數:7 天內價格無變化的商品數 - ✅ 最活躍分類:今日變動商品數最多的分類 - ✅ 最大變動:單一商品最大價格變動(含商品名稱) 【後端數據計算】(2026-01-12 完成) - ✅ 平均漲跌幅計算邏輯(sum / count) - ✅ 活躍度百分比計算(變動商品 / 總商品 * 100) - ✅ 最大變動商品查找(絕對值比較) - ✅ 週增長查詢(7 天內 min(timestamp) 的商品數) - ✅ 價格穩定商品統計(7 天內 distinct(price) == 1) - ✅ 最活躍分類統計(category_activity 字典統計) 【前端視覺優化】(2026-01-12 完成) - ✅ 新增 .kpi-grid CSS 樣式(3 欄網格佈局) - ✅ 新增 .kpi-item 樣式(漸變背景、hover 效果) - ✅ 顏色區分:increase (紅色) / decrease (綠色) / neutral (灰色) - ✅ 響應式設計:手機版改為單欄佈局 - ✅ 卡片 1 藍色漸變背景(與 Daily Sales 風格一致) - ✅ 卡片 2 白色背景 + 網格佈局(清晰易讀) 【修正的檔案】 - app.py (第 494-554 行):新增 KPI 計算邏輯 - app.py (第 659-692 行):render_template 傳遞新 KPI 數據 - app.py (第 88 行):版本號更新至 V9.3 - dashboard.html (第 369-421 行):新增 KPI 網格樣式 - dashboard.html (第 440-448 行):響應式設計更新 - dashboard.html (第 477-585 行):完整 2 張卡片 HTML 結構 20. [待辦] 爬蟲邏輯統一與效能優化 (Scheduler): - 將 run_momo_task 的優化邏輯 (批次寫入、無例外查找) 套用到 run_edm_task 與 run_festival_task。 - 提升 EDM 與購物節爬蟲的穩定性與速度。 21. [待辦] 首頁 (Dashboard) 效能優化: - 對 get_consolidated_data 實作短時間快取 (5-10分鐘),減少資料庫全表掃描。 - 評估改用 SQL 分頁取代記憶體分頁。 22. [待辦] 程式碼重構與模組化: - 將 app.py 的路由拆分為 Blueprints (dashboard, analysis, api)。 - 將資料處理邏輯移至 services 層。 23. [待辦] 清理冗餘程式碼: - 移除 database/manager.py 中不再使用的 update_data 函式。 【系統安全強化 (Phase 6) - URGENT】 === 重大安全風險 (Critical - 須立即修復) === 24. [CRITICAL] 移除硬編碼敏感資訊: - 檔案: config.py (第 17, 22, 26, 35, 40, 173 行) - 問題: 所有 API 金鑰、密碼、Token 直接寫在程式碼中 • LOGIN_PASSWORD = "0936223270" • TELEGRAM_BOT_TOKEN = "8075645931:AAH-EGKMo8ZC4QJs-Nc1_0s92xHrGdQvdpg" • LINE_CHANNEL_ACCESS_TOKEN = "nD6MSXjB2FyB111zpT6Yik5B275mi6olHjjf94VnqN..." • EMAIL_HOST_PASSWORD = "jopokbhdpnnborjd" • NGROK_AUTH_TOKEN = "36e27NM5V7sUJ8QxJIAAWCp7sUv_3brtcrBarYvcP3SbvFKhF" - 風險: 任何有權限看到程式碼的人都能取得所有帳密,可接管系統 - 修復: 1. 安裝 python-dotenv: pip install python-dotenv 2. 建立 .env 檔案存放所有敏感資訊 3. 將 .env 加入 .gitignore 4. 更新 config.py 改用 os.getenv() 讀取環境變數 5. **立即更換所有已外洩的密碼與 Token** 25. [CRITICAL] 修復 SQL Injection 漏洞 #1: - 檔案: app.py (第 2539, 3469 行) - 問題: 使用字串插值直接組合 SQL 查詢 • df_existing = pd.read_sql(f"SELECT * FROM {table_name}", engine) • df = pd.read_sql(f"SELECT {', '.join(req_cols)} FROM {table_name}", db.engine) - 風險: 攻擊者可透過惡意表格名稱執行任意 SQL 命令,竊取或刪除資料 - 修復: 使用參數化查詢,或建立白名單驗證表格/欄位名稱 26. [CRITICAL] 修復 SQL Injection 漏洞 #2: - 檔案: database/manager.py (第 43, 52, 57 行) - 問題: ALTER TABLE 語句使用字串插值組合 SQL • session.execute(text(f"ALTER TABLE products ADD COLUMN updated_at TIMESTAMP DEFAULT '{now_str}'")) - 風險: 若 now_str 包含單引號可導致 SQL injection - 修復: 使用 SQLAlchemy 的 literal() 或驗證輸入格式 === 高風險漏洞 (High - 本週內修復) === 27. [HIGH] 強化登入驗證機制: - 檔案: auth.py (第 30-41 行) - 問題: • 明文密碼比對 (input_password == LOGIN_PASSWORD) • 無登入失敗次數限制 • 無帳號鎖定機制 • 使用簡單電話號碼作為密碼 - 風險: 易遭受暴力破解攻擊 - 修復: 1. 使用 werkzeug.security 的 generate_password_hash / check_password_hash 2. 實作登入失敗計數 (IP-based) 3. 5 次失敗後鎖定 5 分鐘 4. 要求更換為強密碼 (8+ 字元,含英數符號) 28. [HIGH] 加入 CSRF 防護: - 檔案: app.py (多處 POST 路由) - 問題: 所有 POST/PUT/DELETE 端點皆無 CSRF Token 驗證 - 風險: 攻擊者可偽造請求執行未授權操作 (如刪除資料、修改設定) - 修復: 1. 安裝 Flask-WTF: pip install Flask-WTF 2. 在 app.py 設定 app.config['WTF_CSRF_ENABLED'] = True 3. 在所有表單加入 {{ csrf_token() }} 4. 為 AJAX 請求設定 X-CSRFToken header 29. [HIGH] 修復路徑遍歷漏洞: - 檔案: app.py (第 2069-2070 行) - 問題: 未驗證檔案路徑是否超出允許目錄 • potential_path = os.path.join(BASE_DIR, 'web/static/screenshots', filename) - 風險: 攻擊者可使用 ../../../etc/passwd 存取系統檔案 - 修復: 使用 pathlib.Path.resolve() 確保路徑在合法目錄內 30. [HIGH] 檔案上傳驗證: - 檔案: app.py (第 2406-2422 行) - 問題: 上傳 Excel 檔案無驗證 • 未檢查副檔名 • 未檢查檔案大小 • 未驗證 MIME type - 風險: 可上傳惡意檔案 (如 webshell, 病毒),或透過大檔案導致 DoS - 修復: 1. 白名單副檔名: ['xlsx', 'xls', 'csv'] 2. 限制檔案大小: 10MB 3. 使用 werkzeug.utils.secure_filename() 清理檔名 4. 驗證 MIME type === 中風險漏洞 (Medium - 本月內修復) === 31. [MEDIUM] 缺少 HTTP 安全標頭: - 檔案: app.py (全域) - 問題: 未設定安全相關 HTTP headers - 風險: 易受 XSS、點擊劫持、MIME type sniffing 攻擊 - 修復: 在 @app.after_request 加入以下 headers: • X-Content-Type-Options: nosniff • X-Frame-Options: DENY • X-XSS-Protection: 1; mode=block • Strict-Transport-Security: max-age=31536000 • Content-Security-Policy: default-src 'self' 32. [MEDIUM] Session 安全性不足: - 檔案: auth.py (第 34 行) - 問題: Session cookie 設定不安全 - 風險: Session 易被劫持或遭 CSRF 攻擊 - 修復: 在 app.py 設定: • app.config['SESSION_COOKIE_SECURE'] = True # HTTPS only • app.config['SESSION_COOKIE_HTTPONLY'] = True # 防 XSS • app.config['SESSION_COOKIE_SAMESITE'] = 'Lax' # 防 CSRF • app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2) 33. [MEDIUM] 弱亂數產生器: - 檔案: app.py (第 720 行) - 問題: 使用時間戳生成 ID • new_id = int(time.time() * 1000) - 風險: ID 可預測,攻擊者可猜測其他資源 ID - 修復: 使用 secrets.randbits(64) 產生密碼學安全的隨機數 34. [MEDIUM] 敏感資訊洩漏: - 檔案: 多個日誌輸出 - 問題: 日誌可能記錄敏感資料 (密碼、Token、個資) - 風險: 日誌檔若外洩會暴露機密資訊 - 修復: 1. 檢視所有 log.info / log.debug 輸出 2. 實作密碼遮罩函式 (顯示前 2 後 2 碼,中間用 * 遮蔽) 3. 避免記錄完整 Token 或信用卡資訊 35. [MEDIUM] SSRF / Open Redirect 風險: - 檔案: app.py (第 756-778 行) - 問題: 未驗證外部 URL 就發送請求 • response = requests.get(url, headers=headers, timeout=10) - 風險: 攻擊者可探測內網服務或發動 SSRF 攻擊 - 修復: 1. 建立 URL 白名單或黑名單 2. 禁止存取私有 IP (127.0.0.1, 10.0.0.0/8, 192.168.0.0/16) 3. 使用 urllib.parse 驗證 URL 格式 36. [MEDIUM] 資源耗盡風險: - 檔案: app.py (多處查詢) - 問題: • 查詢結果無分頁限制 • 無請求速率限制 • 檔案上傳無大小限制 - 風險: 攻擊者可發送大量請求或上傳大檔案導致服務中斷 - 修復: 1. 安裝 Flask-Limiter: pip install Flask-Limiter 2. 設定 API 速率限制 (如 100 requests/min) 3. 設定 app.config['MAX_CONTENT_LENGTH'] = 10 * 1024 * 1024 # 10MB 4. 資料庫查詢加入 LIMIT 與分頁 37. [MEDIUM] 缺少授權檢查: - 檔案: app.py (多個路由) - 問題: 部分路由未加 @login_required 裝飾器 - 風險: 未登入使用者可存取受保護功能 - 修復: 檢視所有路由,確保需要登入的端點都有 @login_required === 後續安全維護建議 === 38. [建議] 定期安全掃描: - 使用工具定期檢測漏洞: • bandit (Python 程式碼安全掃描): pip install bandit && bandit -r . • pip-audit (依賴套件漏洞掃描): pip install pip-audit && pip-audit • semgrep (進階程式碼分析): https://semgrep.dev/ - 建議每月執行一次,或於部署前執行 39. [建議] 建立安全開發規範: - 制定 secure coding guidelines 文件 - Code review 時檢查安全性 - 使用 pre-commit hooks 執行安全掃描 - 定期更新依賴套件至最新版本 40. [建議] 備份與災難復原計畫: - 確保資料庫定期備份 - 建立系統還原 SOP - 測試備份還原流程 - 考慮實作異地備份 ================================================================================ 【業績分析儀表板邏輯定義 (2026-01-15 修復確認)】 ================================================================================ 所有後續開發與維護,必須嚴格遵守以下邏輯與定義: 1. 數據聚合維度 (Aggregation Granularity): - Dashboard Top 3 卡片: * 聚合鍵: `[商品ID, 商品名稱]` (不可僅用名稱,避免同名不同規商品混淆)。 * 顯示名稱: 僅顯示 `商品名稱` (前端截斷)。 * 目的: 確保卡片數值與詳細列表中的單品數值完全一致。 - 詳細列表 (Modal): * 聚合鍵: `[商品ID, 商品名稱, 品牌, 廠商名稱, 商品館(分類)]`。 * 目的: 提供最完整的商品細節。 2. 利潤計算邏輯 (Profit Logic): - 通用公式: * 若資料源存在「利潤」欄位 (`col_profit`): 優先使用 `SUM(col_profit)`。 * 若無: 使用 `SUM(總業績) - SUM(總成本)`。 - 應用範圍: * 所有 KPI 卡片 (利潤、毛利率)。 * 所有圖表 (BCG 矩陣)。 * 詳細列表 SQL 查詢。 * Excel 匯出功能。 3. 欄位映射與動態性 (Dynamic Column Mapping): - 機制: 必須優先從 `_SALES_PROCESSED_CACHE` 讀取 `cols_map`。 - 禁止行為: 嚴禁在 SQL 查詢中硬編碼中文欄位名稱 (如 "商品館", "品牌", "總業績")。 - 變數使用: 必須使用變數 (如 `col_category`, `col_amount`) 構建 SQL。 4. 篩選連動性 (Filter Consistency): - 全域連動: 任何全域篩選條件 (日期、分類、品牌、廠商、價格區間、毛利區間、關鍵字) 必須同時作用於: * 主畫面所有圖表 (趨勢圖、圓餅圖、長條圖)。 * Top 3 商業洞察卡片。 * 點擊卡片後的詳細列表 (Modal)。 * 詳細列表的 Excel 匯出。