Files
ewoooc/MOMO Pro/HANDOFF.md

498 lines
18 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.
# EwoooC 後台 — Codex 開發交接規格 (HANDOFF.md)
> 這份文件是給 Codex或任何工程團隊將 prototype 重建為正式 production 專案的完整規格。
> Prototype 是 React 18 + Babel Standalone瀏覽器即時 transpile**不是 production build**。
> 請依下方規格,重建為正式專案。
---
## 0. 專案概覽
**產品名稱**EwoooC內部後台 / 比價爬蟲監控系統)
**目標使用者**:採購、行銷、營運人員
**核心功能**商品價格監控、活動看板、廠商缺貨追蹤、AI 助手、雲端匯入
**資料規模**:監控 7,000+ 商品,每日掃描多次,含歷史價格走勢
**設計語言(必須沿用)**Nothing × Claude 混合風格
- 米色基底warm paper+ 黑灰主體 + 焦糖橘 accent
- JetBrains Mono 用於所有數字、ID、時間戳
- Inter 用於介面文字、繁體中文用 Noto Sans TC
- 安靜、結構化、靠留白和排版取勝;**避免**漸層厚重 hero、彩色表頭、五彩按鈕
---
## 1. 技術棧建議
| 類別 | 建議 | 備註 |
|------|------|------|
| Framework | **Next.js 14 + App Router** | SSR、RSC、檔案路由 |
| 語言 | **TypeScript** | 全面型別化 |
| 樣式 | **Tailwind CSS + CSS Variables** | tokens 走 CSS vars元件用 Tailwind |
| 狀態 / 資料 | **TanStack Query (v5)** | 抓 API、cache、revalidate |
| 表單 | React Hook Form + Zod | 表單驗證 |
| 圖表 | **Recharts****Visx** | 價格走勢圖、KPI 趨勢 |
| 表格 | **TanStack Table v8** | 排序、篩選、虛擬化 |
| Icon | **Lucide React**(替代現有 SVG icons | 與 prototype 風格相容 |
| 字型 | next/font 載入 JetBrains Mono + Inter + Noto Sans TC | self-host |
| 部署 | Vercel / 自架 Docker | — |
---
## 2. 路由表Next.js App Router
```
app/
├── layout.tsx # 全域 layout載字型、tokens、TanStack Provider
├── (auth)/
│ └── login/page.tsx # 登入頁
├── (admin)/
│ ├── layout.tsx # Sidebar + Topbar shell
│ ├── dashboard/page.tsx # 商品看板(首頁,重導 /
│ ├── campaigns/
│ │ ├── page.tsx # 活動看板(含 tab 切換)
│ │ └── [id]/page.tsx # 單一活動詳情(可選)
│ ├── products/
│ │ ├── page.tsx # 全商品列表
│ │ └── [id]/page.tsx # 商品詳情 + 30 天走勢
│ ├── analytics/page.tsx # 分析報表
│ ├── vendors/page.tsx # 廠商缺貨
│ ├── ai-assistant/page.tsx # AI 助手
│ ├── cloud-import/page.tsx # 雲端匯入
│ └── settings/page.tsx # 系統管理
└── api/ # 若用 BFF放這
```
**Sidebar 對應**
- 監控商品看板dashboard、活動看板campaigns、分析報表analytics
- 營運廠商缺貨vendors、商品列表products、訂單orders
- 智能AI 助手ai-assistant、雲端匯入cloud-import
- 系統系統管理settings
---
## 3. Design Tokens必讀直接搬
來源:`design-tokens.css`(已在交付包根目錄)
**核心變數**(節錄,完整見檔案):
```css
:root {
/* 基底色 */
--momo-bg-primary: #f0eee9; /* 米色頁底 */
--momo-bg-surface: #ffffff; /* 卡片白 */
--momo-bg-paper: #f7f5f0; /* 微暖灰白hover/header */
--momo-bg-subtle: #ebe8e0;
--momo-bg-muted: #e6e2d8;
/* 主體色 */
--momo-ink: #1a1a1a; /* Nothing 黑 */
--momo-text-primary: #1a1a1a;
--momo-text-secondary:#4a4a4a;
--momo-text-tertiary: #8a8a8a;
/* Accent */
--momo-accent: #c96442; /* Claude 焦糖橘 */
--momo-accent-hover: #b3553a;
/* 語意色 */
--momo-success: #16a34a;
--momo-danger: #dc2626;
--momo-warning: #ea580c;
--momo-info: #3b5cb8;
/* 邊線 */
--momo-border: #d6d2c8;
--momo-border-light: #e6e2d8;
/* 字型 */
--momo-font-family-base: 'Inter', 'Noto Sans TC', -apple-system, sans-serif;
--momo-font-family-mono: 'JetBrains Mono', 'SF Mono', Consolas, monospace;
/* 字級 */
--momo-font-size-xs: 11px;
--momo-font-size-sm: 13px;
--momo-font-size-base: 14px;
--momo-font-size-lg: 16px;
/* 圓角 */
--momo-radius-sm: 3px;
--momo-radius-md: 4px;
--momo-radius-lg: 8px;
--momo-radius-pill: 999px;
/* 陰影 */
--momo-shadow-sm: 0 1px 2px rgba(0,0,0,0.04);
--momo-shadow-md: 0 2px 8px rgba(0,0,0,0.06);
/* 過場 */
--momo-transition-base: all 0.15s ease;
}
```
**Tailwind 對應建議**:在 `tailwind.config.ts``theme.extend.colors``fontFamily``borderRadius` 直接對應上述變數。
---
## 4. 元件清單(重建依據 `app/ui.jsx`
| 元件 | Props (核心) | 行為 |
|------|--------------|------|
| `<Button>` | variant: gradient \| solid \| outline \| ghost \| secondary \| danger; size: sm/md/lg; icon; iconRight; loading | 主色為 accentsecondary 為米底+黑邊 |
| `<Badge>` | tone: primary/success/danger/warning/info/secondary; dot | 圓角 pill |
| `<Card>` | cardStyle: flat/elevated; padding | flat 為主border-light + 白底) |
| `<Input>` | icon; size; error | 米底外框focus 時黑邊 |
| `<Avatar>` | name; size; gradient | 圓形,預設取首字 |
| `<Icon>` | name; size | 統一用 Lucide 替代 |
| `<Modal>` | open; onClose; title; size | 中央 modal漸出 |
| `<SectionLabel>` | num; children; sub | **重要** — Dashboard 大區塊用「01 / 02 / 03」編號標籤 |
**重要規範**
- 所有「數字、ID、時間戳、價格」必須使用 Mono 字型class `momo-mono` 或 Tailwind `font-mono`
- 表頭 label 用 Mono + uppercase + letter-spacing 0.08em(看起來像終端機)
- 表格不要用紫色漸層 header已棄用改用米色 paper 底 + Mono 小字 label
---
## 5. 頁面規格
### 5.1 商品看板 / Dashboard`/dashboard`
**參考**`app/page-dashboard.jsx`
**佈局**(從上到下):
1. **區塊 01監控總覽** — 一排 4 個 KPIhorizontal divider 分隔),第二顆「今日變動」用黑底反白
- 監控總數 / 今日變動accent/ 漲價danger/ 降價success
- 大字 44px Mono下方 sub 11px
2. **區塊 02焦點數據** — 三欄並排
- 最活躍分類 / 最大變動(紅色 +金額)/ 爬蟲排程(綠點 ACTIVE + 上次執行時間)
3. **區塊 03商品列表**
- 篩選列:搜尋 + 分類 select + segmented tabs全部/新上架/漲價/降價/下架)+ 更新/發送通知按鈕
- 表格:分類 / 商品名稱(含 emoji 縮圖 + ID/ 當天價格 / 昨日漲跌 / 週漲跌 / 更新時間 / 上架時間
- 表頭:米色 paper 底Mono uppercase 小字
- 漲跌格子:紅色▲ / 綠色▼ + Mono 數字
**互動**
- 點 row → 開 Modal 顯示 30 天價格走勢(用 Recharts LineChart
- 篩選即時觸發client-side 過濾或 query params
---
### 5.2 活動看板(`/campaigns`
**參考**`app/page-campaigns.jsx`
**佈局**
1. **活動切換 segmented tabs**(限時搶購 / 1.1狂歡 / 母親節 / 520 / 勞動節)
- 每顆 tab 含 icon + 名稱 + 商品數 pill
2. **Hero 雙欄**
- 左 2/3活動主資訊卡**漸層背景,色相依活動切換**
- flash: 紅橘漸層 / festival: 紫 / mothers: 玫紅 / valentine: 情人紅 / laborday: 藍
- 點陣裝飾背景 + 大圖示 watermark
- CAMPAIGN 標籤 + ID + 大標題 + meta時段 / 最後更新 / 商品總數)+ 操作按鈕
- 右 1/3活動數據 KPI上架/新品/漲價/降價 2x2+ 底部排程 footer
3. **時段時間軸**(僅限時搶購顯示)
- 24h 條狀圖,當前時段顯示 NOW 標籤
- bar 高度依商品數accent 色為當前
4. **分類 chips**festival / mothers / valentine / laborday
- 橫向 wrap每個 chip 有名稱 + count pill可點選
5. **商品列表**
- 同 Dashboard 表格樣式,但欄位:分類 / 商品資訊 / 價格 / 倒數組數 (限時) 或狀態
---
### 5.3 商品列表(`/products`
**參考**`app/page-products.jsx`
全商品 CRUD + 篩選 + 編輯 modal。可重用 Dashboard 的 ProductTable 元件。
---
### 5.4 廠商缺貨(`/vendors`
簡單表格vendor / count / lastSeen資料來源 `EWOOOC_DATA.outOfStock`
---
### 5.5 其他頁面
- 分析報表圖表為主Recharts尚未在 prototype 完整定義 → 可先做 placeholder
- AI 助手 / 雲端匯入 / 系統管理prototype 為佔位 → 與 PM 確認需求
---
## 6. 資料模型 / API 規格
### 6.1 Mock 資料來源
`app/data.jsx``EWOOOC_DATA` 為所有假資料。**重建時請替換為 API 呼叫**。
### 6.2 建議的 OpenAPI Endpoints
```yaml
GET /api/dashboard/summary # 監控總覽 + 今日變動
GET /api/dashboard/focus # 最活躍分類 / 最大變動 / 排程狀態
GET /api/products?category=&q=&tab=&page= # 商品列表(含篩選)
GET /api/products/{id} # 商品詳情
GET /api/products/{id}/price-history?days=30 # 30 天價格走勢
POST /api/products/{id}/notify # 發送通知
GET /api/campaigns # 所有活動清單
GET /api/campaigns/{id} # 單一活動詳情(含 timeSlots, categories, products, stats
POST /api/campaigns/{id}/refresh # 手動觸發爬蟲
POST /api/campaigns/{id}/notify
GET /api/vendors/out-of-stock # 廠商缺貨
GET /api/schedule/status # 爬蟲排程狀態
```
### 6.3 Schema 範例TypeScript
```ts
interface Product {
id: string;
category: string;
name: string;
emoji?: string; // 暫時佔位,正式版改為 imageUrl
imageUrl?: string;
price: number;
yesterdayChange: number | null;
weekChange: number | null;
updatedAt: string; // ISO
listedAt: string; // ISO
isNew?: boolean;
}
interface DashboardSummary {
monitor: { total: number; todayAdded: number; weekGrowth: number; stableCount: number };
dynamics: {
priceUp: number; priceDown: number; delisted: number;
avgUp: number; avgDown: number;
activity: number; activeCount: number;
hottestCategory: string; hottestCount: number;
biggestChange: { product: string; amount: number };
};
schedule: { lastRun: string; scanned: number; added: number; status: 'success' | 'running' | 'failed' };
}
interface Campaign {
id: 'flash' | 'festival' | 'mothers' | 'valentine' | 'laborday';
name: string;
icon: string;
time: string;
lastUpdate: string;
total: number;
schedule: { lastRun: string; anomalies: number; status: string };
timeSlots?: { time: string; count: number; active?: boolean }[];
categories?: { name: string; count: number; active?: boolean }[];
stats: { listed: number; new: number; up: number; down: number; delisted: number };
products: CampaignProduct[];
}
```
---
## 7. 互動行為清單
| 行為 | 描述 |
|------|------|
| Sidebar 折疊 | 寬度從 240 → 64icon-only |
| Topbar 搜尋 | ⌘K / Ctrl+K 開啟全域搜尋 |
| 表格 row click | 開啟商品詳情 Modal含 30 天走勢圖) |
| 漲跌欄排序 | 點欄頭 ↕ 切換 asc/desc |
| 篩選 tabs | 即時過濾URL 同步 query string |
| 匯出報表 | 後端產 CSV 後 download |
| 發送通知 | trigger backend webhook回應 toast |
| 活動切換 tab | URL `?tab=flash` 同步 |
| Tweaks 面板 | **正式版可移除**prototype 用) |
---
## 8. 字型與資源
**Self-host 字型**
```ts
// app/layout.tsx
import { Inter, JetBrains_Mono, Noto_Sans_TC } from 'next/font/google';
// 對應 CSS variable
```
**Icon**:用 [Lucide](https://lucide.dev/) 替換現有 SVG名稱對照
- dashboard → `LayoutDashboard`
- megaphone → `Megaphone`
- chart → `BarChart3`
- box / package → `Package`
- robot / ai → `Bot`
- cloud → `Cloud`
- settings → `Settings`
- search → `Search`
- bell → `Bell`
- refresh → `RefreshCw`
- copy → `Copy`
- download → `Download`
- trendUp → `TrendingUp`
- arrowUp / arrowDown → `ArrowUp` / `ArrowDown`
- clock → `Clock`
- tag → `Tag`
---
## 9. 必須遵守的視覺紀律 ⚠️
**不要**
- 不要回到原本的紫色漸層 + emoji 圖示風格(舊 momo 後台)
- 不要在表頭用紫色漸層
- 不要用五彩繽紛的按鈕
- 不要在 KPI 卡用厚重藍色 hero 漸層
- 不要使用 Inter 以外的 sans-serif 主體(避開 Roboto, system-ui
- 數字、ID、時間**不要**用 sans-serif
**要**
- 米色底 + 黑灰主體 + 焦糖橘 accent
- 區塊用「01 / 02 / 03」編號 + uppercase Mono label
- KPI 大數字 44px+ Mono靠 horizontal divider 分隔,不要每顆都包卡片
- 活動 hero 才用漸層(且色相依活動主題)
- 表格安靜,靠 Mono 字體和留白做出層次
- 邊框細且淺border-light陰影克制
---
## 10. 開發里程碑建議
1. **Week 1**:架構 + tokens + 共用元件Button/Card/Badge/Input/Modal/Icon/SectionLabel
2. **Week 2**Sidebar + Topbar shell + 路由 + Auth
3. **Week 3**DashboardKPIRow / FocusRow / ProductTable+ API 串接
4. **Week 4**Campaigns5 個 tab + Hero + Timeline + Products
5. **Week 5**Products 詳情 + 30 天走勢圖 modal
6. **Week 6**Vendors / Analytics / 其他頁面 + 微調 + QA
---
## 11. 交付包檔案清單
```
ewoooc-handoff/
├── HANDOFF.md # ← 本文件
├── EwoooC 後台原型.html # 入口(瀏覽器直開)
├── design-tokens.css # 所有 CSS 變數
├── data.jsx # (根目錄舊版,可忽略)
├── design-canvas.jsx # prototype 工具,可忽略)
├── tweaks-panel.jsx # prototype 工具,可忽略)
└── app/
├── data.jsx # 假資料(轉為 API schema 參考)
├── icons.jsx # SVG icon 定義(轉為 Lucide
├── ui.jsx # 共用元件(轉為 TS components
├── shell.jsx # Sidebar + Topbar
├── main.jsx # 路由分派 + Tweaks
├── modals.jsx # 商品詳情 / 編輯 modal
├── page-dashboard.jsx # 商品看板
├── page-campaigns.jsx # 活動看板
├── page-products.jsx # 商品列表
└── page-orders.jsx # 訂單(範例頁)
```
---
## 12. 與 PM / Designer 確認清單
開發前請與 PM / Designer 對齊:
- [ ] 真實 API endpoint 文件
- [ ] 認證 / 權限模型RBAC單一管理者
- [ ] 商品 emoji 是否替換為真實圖片CDN
- [ ] Analytics 頁面圖表規格
- [ ] AI 助手 / 雲端匯入功能定義
- [ ] 多語系需求(目前只有繁中)
- [ ] 部署環境Vercel / 自架 / on-prem
- [ ] 監控與錯誤追蹤Sentry
---
> 有任何視覺或行為不確定的地方,**以 prototype 的呈現為準**。
> Prototype 路徑:開啟 `EwoooC 後台原型.html` 直接看 live demo並用右下角 Tweaks 面板觀察可調整的設計變數。
---
## 13. 2026-05 增量更新Codex 必讀)
本章記錄 HANDOFF.md 初稿後追加的所有設計決策。**以下優先於前面章節**。
### 13.1 商品看板 — KPI 列強化
KPI 從 4 格擴成 **5 格**最後一格為「AI 挑品」入口:
| # | label | value | 互動 |
|---|---|---|---|
| 1 | 監控總數 | 7,234 | — |
| 2 | 今日變動 | 2,180黑底反白| — |
| 3 | 漲價danger| 458 | 點擊 → tab 切到 `up` |
| 4 | 降價success| 612 | 點擊 → tab 切到 `down` |
| 5 | **AI 挑品** | 50 ↗ | 點擊 → tab 切到 `ai` 並平滑滾到 §03 商品列表 |
實作KPI cell 加 `cursor: pointer`onClick 設 `setTab(...)` + `document.getElementById('product-table')?.scrollIntoView({behavior:'smooth'})`(或等效 ref 滾動)。
### 13.2 商品看板 — FilterBar tabs 順序
```
全部 | AI 揀品 | 新上架 | 漲價 | 降價 | 下架
```
`AI 揀品` tab 對應規則:目前用模擬條件(價格波動 > 8% 或標題含關鍵字)挑出約 1/3 商品,**正式版請改接 `GET /api/products/ai-picks`**(後端 ML 推薦schema 同 `/api/products` response。
### 13.3 商品看板 — 表格分頁
Client-side 分頁,**50 筆/頁**。Footer 顯示 `150 · 共 N 筆` + 上下頁鈕圖示按鈕disabled 時 opacity 0.3)。正式版改 server-side`GET /api/products?page=1&pageSize=50`
### 13.4 商品看板 — Row hover & 警報欄位
- Row hover 時加左側 3px caramel accent 條(`box-shadow: inset 3px 0 0 var(--momo-warm-caramel)`)。
- 警報 chip 所在 `<td>``min-width: 140px; white-space: nowrap`,避免 chip 被擠到換行。
### 13.5 PriceHistoryModal新元件
點商品 row → 開全螢幕 modal 顯示價格走勢。
**Header**
- 左:商品縮圖 + 名稱 + IDmono
-3 顆 icon-only 操作鈕(加入監控 / 匯出 CSV / 分享連結)+ 關閉
**Body**
- 區段切換 tabs`7d` / `30d` / `90d` / `1y`
- LineChart`days` 改變時呼叫 `buildSeries(days)` 重算資料點
- 7d / 30d / 90d → 每日一點
- 1y → 每週一點,共 52 點
- 下方資訊欄:當前價 / 區間最高 / 區間最低 / 變動幅度
**API**`GET /api/products/{id}/price-history?range=7d|30d|90d|1y``{points: [{date, price}], stats: {...}}`
### 13.6 活動看板 — Hero 漸層與點陣
§03 三張活動卡(限時搶購 / 1.1 狂歡 / 母親節)背景:
- 加左上 3×36px caramel accent 條
- 疊一層 `opacity: 0.18` 的點陣紋理(`background-image: radial-gradient(circle, currentColor 1px, transparent 1px); background-size: 8px 8px`
- §02 三張焦點卡 padding 16px從 18 收緊)
### 13.7 設計紀律補充
- **絕不使用** emoji 當功能 iconemoji 只能出現在商品縮圖位置)。
- **絕不**用漸層當大面積背景,僅活動 hero 卡可用,且需配點陣紋理壓低彩度。
- 所有數字、ID、時間戳一律 JetBrains Mono中文標題用 Noto Sans TC。
- 表格 row 高度 56px、表頭 40pxpadding 一律走 tokens。
### 13.8 尚未交付Phase 2
以下在 prototype 是 placeholder正式版需設計 + 實作:
- 分析報表(`/analytics`)— 預期:類別趨勢、競品對比、季節性熱圖
- AI 助手對話流(`/ai-assistant`)— 串 LLM
- 雲端匯入精靈(`/cloud-import`)— S3 / GDrive 連接器
- 系統管理 RBAC`/settings`
> 若 prototype 與本章描述衝突,**以 prototype 的實際行為為準**。Codex 可直接讀 `app/page-dashboard.jsx`、`app/modals.jsx`、`app/page-campaigns.jsx` 取得真實實作。