# **(實作) PM 產品需求文件 – 收藏商品功能**
:::info
- 規格書
1. 背景與目標
2. User Story
3. 功能需求一覽
4. 非功能需求
5. 邊界情境與例外處理
6. UI / UX 設計概念
7. 資料結構設計
8. API 介面設計
9. MVP 範圍界定
10. 發佈與迭代計畫 Roadmap
11. 驗收準則
12. KPIs
- 時程表+負責人
- 任務拆解估時
:::
<br/>
轉職班寫過類似的規格書,現在 vibe coding,自己管理自己,體會到:
1. 良好規格書 = 專案羅盤 ─ 先寫清楚背景、目標與範圍,最好寫成 md 檔,會大幅降低與 AI 溝通的 token 量
2. 時程可視化 ─ 需求拆解並估時,能自我約束(畢竟自己懶又有點完美主義)
3. 驗收與 KPI 明確化 ─ 提前定義成功標準,後續才知道該優化哪裡
這裡試著改以前的文件,假設有一整個團隊,以完整 PRD 格式梳理「收藏商品功能」,希望以後獨立開發別的專案,能像團隊協作,有條不紊地推進
<br/>
## 規格書
### 1. 背景與目標
- 使用者常在瀏覽時發現有興趣的商品,缺乏暫存機制導致流失
- **目標**:提供收藏功能,提升回訪率與轉換率
---
### 2. User Story
> **As a** registered user
> **I want to** mark/unmark products as favorites
> **So that** I can revisit them later easily
---
### 3. 功能需求一覽
| 編號 | 功能 | 說明 |
|------|------------------|--------------------------------------|
| FR1 | 收藏商品 | 點擊愛心圖示,將商品加入收藏清單 |
| FR2 | 取消收藏 | 再次點擊愛心圖示,可取消收藏 |
| FR3 | 收藏列表頁 | 我的帳號中可查看「我的收藏」清單 |
| FR4 | 登入限制 | 未登入使用者需先登入才能收藏商品 |
---
### 4. 非功能需求
- 收藏/取消收藏操作需在 500ms 內完成
- 收藏列表支援 infinite scroll(初始載入10筆)
- 收藏狀態應跨裝置同步
---
### 5. 邊界情境與例外處理
| 編號 | 情境類型 | 說明 |
|-------|--------------|----------------------------------------------------------------------|
| EC1 | 商品下架 | 收藏清單中應顯示「商品已下架」提示文字,避免造成操作錯誤 |
| EC2 | 重複點擊 | 多次快速點擊收藏按鈕,不可重複送出請求,應進行 debounce 或鎖定操作 |
| EC3 | 離線狀態 | 若裝置離線時點擊收藏,應顯示「目前無法操作,請檢查網路連線」提示 |
| EC4 | 未登入狀態 | 點擊收藏應觸發導向登入頁,登入後返回原頁,並保留原意圖自動執行收藏 |
| EC5 | 跨裝置操作 | 使用者從 A 裝置收藏商品,於 B 裝置登入帳號後應顯示相同收藏狀態 |
| EC6 | 快取未更新 | 商品已被取消收藏但頁面仍顯示愛心實心,需驗證快取更新機制或手動同步行為 |
---
### 6. UI / UX 設計概念
- 商品卡右上角加入愛心圖示(空心 / 實心)
- active 狀態:愛心變為實心並變色
- 需預留足夠空間與寬度容錯,以支援多語系與 RWD
- 收藏頁以卡片方式顯示商品(圖片、名稱、價格、加入購物車
- 收藏清單需支援 responsive 排版,於手機與桌機尺寸下皆可正常閱讀
- 未登入點擊收藏導向登入頁,登入後自動返回商品頁
- 字串最大長度限制(如英文西文會變長)
- breakpoints(如手機 ≤768px)
- 按鈕寬度 auto-expand
---
### 7. 資料結構設計
```=
favorites (
user_id UUID,
product_id UUID,
created_at TIMESTAMP
)
```
---
### 8. API 介面設計
- 前端框架:預期使用 Vue / React 進行元件化開發,請提供 JSON 結構清楚、回應迅速的 API
- 資料同步:收藏狀態選擇 Redis Cache 快取用戶清單,以支援跨裝置快速同步,降低 DB 查詢壓力
#### 收藏商品
```
POST /api/favorites
Body: { "product_id": "abc123" }
Response: { "success": true }
# 成功回應
{ "success": true }
# 失敗回應
{
"error_code": "UNAUTHORIZED",
"message": "請先登入後再操作",
"status": 401
}
```
#### 取消收藏
```=
DELETE /api/favorites/abc123
Response: { "success": true }
# 成功回應
{ "success": true }
# 失敗回應
{
"error_code": "NOT_FOUND",
"message": "該商品未被收藏",
"status": 404
}
```
#### 取得收藏清單
```
GET /api/favorites
Response: [
{
"product_id": "abc123",
"name": "產品A",
"image_url": "...",
"price": 999
}
]
# 成功回應
[
{
"product_id": "abc123",
"name": "產品A",
"image_url": "...",
"price": 999
}
]
# 失敗回應
{
"error_code": "TOKEN_EXPIRED",
"message": "請重新登入",
"status": 401
}
```
---
### 9. MVP 範圍界定
- 包含:
- 收藏 / 取消收藏功能
- 收藏清單頁展示
- 延後項目:
- 收藏清單排序 / 分類標籤 (next)
- 收藏清單分享與通知功能 (next)
---
### 10. 發佈與迭代計畫 Roadmap
- 版本 1.0:上線 MVP(收藏功能+清單頁)
- 版本 1.1:加入排序與標籤功能
- 版本 1.2:收藏分享與通知提醒
---
### 11. 驗收準則
- **AC1**:已登入使用者可成功收藏與取消商品,收藏按鈕需具備 hover/active 狀態切換,並可正確儲存至資料庫(DB)
- **AC2**:使用者的收藏狀態可於不同頁面與跨裝置間同步顯示(需與帳號綁定)
- **AC3**:收藏清單頁能準確顯示所有已收藏商品,包含商品圖片、名稱、價格
- **AC4**:未登入使用者在點擊收藏時,會正確導向登入頁;登入成功後可返回原商品頁並保留操作意圖(即登入後自動收藏)
```=
BE-AC1:成功收藏 / 取消後,資料正確儲存至資料庫(含 user_id 與 product_id)
BE-AC2:收藏清單 API 回傳商品資訊(名稱、價格、圖片)完整且正確
BE-AC3:跨裝置登入後仍能獲得相同收藏狀態(依據帳號綁定)
BE-AC4:登入成功後,如有 pending 收藏請求,API 需能支援補送收藏操作(ex: 登入時附帶 redirect 與 action token)
```
```=
UX-AC1:收藏按鈕需具備 hover / active 狀態切換,樣式與設計稿一致
UX-AC2:未登入點擊收藏時,導向登入頁流程符合 UX 動線規範
UX-AC3:收藏清單視覺設計需能支援商品圖片、名稱、價格完整呈現
```
```=
FE-AC1:已登入使用者可成功收藏 / 取消商品,點擊愛心後 UI 狀態同步切換
FE-AC2:收藏狀態需正確呈現在所有商品卡與收藏清單中
FE-AC3:登入跳轉後可保留操作意圖(自動完成收藏並返回原商品頁)
FE-AC4:未登入點擊收藏時,前端需觸發登入跳轉流程,登入後可保留原操作意圖並自動完成收藏,最後返回原商品頁
```
```=
QA-AC1:點擊收藏按鈕,應在 500ms 內收到伺服器成功回應
QA-AC2:商品下架時,收藏清單應顯示「商品已下架」提示
QA-AC3:未登入用戶點擊收藏,應正確跳轉至登入頁並登入成功後返回原商品頁
QA-AC4:跨頁面、跨裝置驗證收藏狀態一致性
```
```=
PM-AC1:所有功能需於 8/10 前完成測試與驗收
PM-AC2:PM 確認所有 AC 條件通過後,才可安排上線作業
PM-AC3/4:上線當天須追蹤收藏功能啟用率、錯誤率及回訪數據(配合 KPI 監控)
```
---
### 12. KPIs
- 收藏功能啟用率(日活用戶中有幾%點擊收藏)
- 收藏後 7 日內轉換率提升
- 收藏功能使用後回訪率提升
<br/>
## 時程表+負責人
Gantt Chart or Timeline
- 所有功能依照優先順序安排,前後端並行處理部分模組
- 若後端 API 有結構異動,請同步更新 API 文件區段
- 若 UI 有變動,請於 Figma 中 comment 並通知 PM
- 設計需提前 2 日完成以供工程實作,QA 測試後再安排上線
- PM 負責追蹤進度並更新 Slack 通知群組
```
7/28 ────────────────▶ 8/12
▍收藏 API ████
▍UX 設計 ██████
▍前端收藏 ██████
▍列表頁 █████
▍測試 ██
▍上線 █
```
| 功能模塊 | 起始日期 | 結束日期 | 負責人 | 備註 |
|----------------------|------------|------------|------------------|------------------------------------------------|
| 收藏 API 設計 | 2025-07-28 | 2025-07-30 | Backend: Max | 提供 POST/DELETE/GET API 規格與測試接口 |
| 收藏按鈕 UX 設計 | 2025-07-28 | 2025-08-01 | UX: Wang | 於 7/29 交付 Prototype v1 給 FE |
| 前端收藏功能開發 | 2025-07-30 | 2025-08-05 | Frontend: Simon | 先進行邏輯與 API 串接,設計定稿後整合畫面 |
| 收藏列表頁開發 | 2025-08-02 | 2025-08-08 | Frontend: Simon | 須等 API 結構穩定與 UX Wireframe 支援 |
| 驗收測試 QA | 2025-08-09 | 2025-08-10 | QA: Matin | 根據 AC 條件測試互動邏輯與資料正確性 |
| 上線發佈 | 2025-08-11 | 2025-08-12 | PM: Mario | 含最後驗收與版本標記,上線後監控功能使用數據 |
<br/>
## 任務拆解估時
| 模組 | 任務子項目 | 負責角色 | 估時(人日) | 備註 |
|--------------------|------------------------------------------|-----------------|--------------|----------------------------------|
| 收藏 API 設計 | 設計資料結構與 schema 定義 | Backend | 0.5 | 參考已定義 favorites 結構 |
| | 實作 POST / DELETE / GET API | Backend | 1.5 | 含 Redis 快取邏輯 |
| | API 單元測試與 Swagger 文件撰寫 | Backend | 0.5 | |
| 收藏按鈕 UX 設計 | 按鈕樣式設計(hover/active) | UX Designer | 0.5 | 符合主色與行為動態 |
| | 收藏列表 wireframe / layout | UX Designer | 1 | 含空狀態與 loading 樣式 |
| | 交付 Figma 檔+標註與寬度容錯說明 | UX Designer | 0.5 | |
| 前端收藏功能 | 收藏邏輯實作(按鈕互動與 API 串接) | Frontend | 1.5 | |
| | 收藏狀態呈現(卡片/清單同步) | Frontend | 1 | 含快取狀態更新 |
| | 未登入收藏 ➜ 導向登入並保留意圖 | Frontend | 1 | 含 redirect token 處理 |
| 收藏列表頁開發 | 撈資料並呈現商品卡片 | Frontend | 1.5 | 含圖片、名稱、價格與購物車按鈕 |
| | infinite scroll 與 loading 狀態設計 | Frontend | 1 | 初始載入 10 筆 |
| 測試驗收 | 撰寫並執行 QA 測試腳本(含邊界情境) | QA | 1 | EC1~EC6 + AC 條件覆蓋 |
| | 手機/桌機 Responsiveness 測試 | QA | 0.5 | breakpoints 行為測試 |
| 上線發佈 | 功能驗收與版本標記 | PM | 0.5 | |
| | 上線後功能監控與 KPI 數據觀察 | PM | 0.5 | 日誌追蹤、啟用率等 |