docs: add research assets, screenshots and guides

Include supplementary documentation, research notes on Lexical/UX, and setup guides.
This commit is contained in:
2026-02-11 11:51:35 +08:00
parent ad8e2e313e
commit f6b806617e
46 changed files with 11571 additions and 0 deletions

View File

@@ -0,0 +1,137 @@
# 1. Project Analysis and Context
**Last Updated:** 2025-01-29
## Existing Project Overview
### Analysis Source
- **Type:** IDE-based fresh analysis
- **Research Materials:** `research/www.enchun.tw/` directory
### Current Project State
#### Original System (Webflow)
**Platform:** Webflow CMS + Hosted Website
**Website:** www.enchun.tw (恩群數位行銷)
**Purpose:** Corporate showcase website + content marketing platform
**Content Structure:**
- 7 main pages
- 4 article categories
- 35+ blog articles
- Portfolio showcase
- Team profiles
**Target Audience:**
- Potential clients (seeking digital marketing services)
- Internal editors (content management)
- Administrators (system management)
#### Target System (New Architecture)
**Architecture:** Monorepo (pnpm workspaces)
```
website-enchun-mgr/
├── apps/
│ ├── backend/ # Payload CMS (Headless CMS)
│ └── frontend/ # Astro (SSR frontend)
└── packages/
└── shared/ # Shared TypeScript utilities
```
**Technology Stack:**
- **Frontend:** Astro 6.0.x (SSR mode + Cloudflare native runtime) + Tailwind CSS v4 + TypeScript
- **Backend/CMS:** Payload CMS 3.x + MongoDB
- **Authentication:** Payload CMS built-in authentication system ✅
- **Deployment:** Cloudflare Pages (frontend) + Node.js (Payload CMS admin)
- **Storage:** Cloudflare R2 (media files)
**為什麼選擇 Astro 6.0**
- ✅ Cloudflare native runtime - 開發和生產使用相同環境
- ✅ 原生 Cloudflare Workers 整合Cloudflare 2026年1月收購 Astro
- ✅ 支援 Rate Limiting、PDF Generation、Live Collaborative Editing
- ✅ 更快的 Cloudflare Pages 部署和邊緣快取
### Migration Drivers
1. **Performance Improvement:** Target Lighthouse 95+ scores
2. **Cost Optimization:** Reduce Webflow subscription fees
3. **Flexibility:** Greater customization capabilities and integration options
4. **Maintainability:** Modern development toolchain and better DX
5. **SEO Preservation:** Maintain and improve existing SEO value
---
## Available Documentation Analysis
### Available Documentation
| Document | Status | Notes |
|----------|--------|-------|
| Tech Stack Documentation | ❌ Needs creation | |
| Source Tree/Architecture | ❌ Needs creation | |
| Coding Standards | ❌ Needs creation | |
| API Documentation | ❌ Needs creation | |
| UX/UI Guidelines | ❌ Needs extraction from Webflow | |
| CMS Collection Structure | ✅ Available | `cms_structure.md` |
| Original PRD | ✅ Available | `PRD.md` (high-level needs) |
### Recommendation
**Action Required:** Run `document-project` task before implementation to establish:
- Complete technical documentation
- Architecture diagrams
- Coding standards
- API specifications
This will help the development team better understand existing patterns and constraints.
---
## Enhancement Scope Definition
### Enhancement Type
**Technology Stack Migration** (Complete platform migration)
### Enhancement Description
Migrate the existing Webflow CMS-hosted website completely to a modernized Payload CMS + Astro architecture while maintaining all content, SEO value, and user experience. This includes page reconstruction, content migration, SEO redirects, authentication system implementation, and CMS admin interface integration.
### Impact Assessment
**Major Impact** (Architectural changes required)
- Complete frontend framework replacement
- Migration from hosted CMS to self-hosted Headless CMS
- New authentication and authorization system
- Data migration and structure transformation
---
## Goals and Background Context
### Goals
1. ✅ Fully migrate all 7 main pages with 95%+ visual fidelity to original design
2. ✅ Migrate 35+ blog articles and 4 categories to Payload CMS
3. ✅ Implement complete 301 redirect mappings to preserve SEO equity
4. ✅ Achieve Lighthouse performance scores of 95+ for all public pages
5. ✅ Establish secure authentication system supporting Admin and Editor roles
6. ✅ Build user-friendly CMS admin interface for content editors
7. ✅ Deploy to Cloudflare Pages + Workers infrastructure
8. ✅ Maintain or improve existing SEO rankings and organic traffic
### Background Context
Enchun Digital Marketing currently uses Webflow CMS for their corporate website and content marketing platform. While Webflow provides convenient visual editing and hosting, long-term costs and technical limitations have become growth bottlenecks. To achieve better cost-effectiveness, greater customization flexibility, and modernized development and deployment workflows, the company has decided to migrate to a Payload CMS + Astro architecture.
This migration is not just a technology platform switch, but aims to establish a scalable, high-performance, and maintainable digital platform to support Enchun Digital's long-term business growth. The migration process must ensure content integrity, SEO value preservation, and user experience continuity.
---
## Change Log
| Change | Date | Version | Description | Author |
|--------|------|---------|-------------|--------|
| Initial creation | 2025-01-29 | v4 | Brownfield PRD created from migration analysis | PM Agent |
| Authentication correction | 2025-01-29 | v4.1 | Corrected Auth.js references to Payload CMS built-in auth | PM Agent |
---
**Next Section:** [Requirements](./02-requirements.md)

113
docs/prd/02-requirements.md Normal file
View File

@@ -0,0 +1,113 @@
# 2. Requirements
**Last Updated:** 2025-01-29
> **Note:** These requirements are based on the understanding of the existing Webflow to Payload CMS + Astro migration. Please review carefully to ensure alignment with project reality.
## Functional Requirements
**FR1:** The system must fully migrate all 7 main pages (Home, About, Solutions, Marketing Magnifier/Blog, Teams, Portfolio, Contact) to the new Astro architecture while maintaining 95%+ visual similarity to the original Webflow design.
**FR2:** The system must implement Payload CMS as a Headless CMS supporting Users, Posts, Categories, Portfolio, and Media collections.
**FR3:** The system must implement authentication based on **Payload CMS built-in authentication system**, supporting Admin and Editor roles, with secure login/logout functionality.
**FR4:** The system must migrate all 35+ blog articles and 4 article categories (Google小學堂, Meta小學堂, 行銷時事最前線, 恩群數位最新公告) to Payload CMS.
**FR5:** The system must provide complete SEO support for all pages and articles, including dynamic sitemap.xml generation, meta tags, and Open Graph tags.
**FR6:** The system must implement complete 301 redirect mappings to redirect all old Webflow URLs to the new URL structure.
**FR7:** The contact form must function correctly, with submissions processed securely through a Cloudflare Worker.
**FR8:** The Payload CMS admin interface must be embedded at the `/admin/cms` route and accessible only to authenticated users.
**FR9:** The system must support Role-Based Access Control (RBAC), where Admins have access to all features, while Editors can only manage content but cannot modify system settings or users.
**FR10:** The system must provide a protected `/admin/dashboard` route as a general dashboard for authenticated users.
**FR11:** All media files (images, documents) must be migrated to Cloudflare R2 storage and correctly referenced in Payload CMS.
**FR12:** The system must support responsive design, maintaining consistent user experience across desktop, tablet, and mobile devices.
---
## Non-Functional Requirements
**NFR1:** All public pages must achieve Lighthouse performance scores of 95+ (Performance, Accessibility, Best Practices, SEO).
**NFR2:** First Contentful Paint (FCP) should be under 1.5 seconds, and Largest Contentful Paint (LCP) should be under 2.5 seconds.
**NFR3:** Pages must comply with WCAG 2.1 AA accessibility standards.
**NFR4:** The system must support at least 100 concurrent users without performance degradation.
**NFR5:** All API response times must be under 500ms (95th percentile).
**NFR6:** The system must protect all sensitive data using HTTPS and security headers.
**NFR7:** Payload CMS and Astro frontend must be deployed to Cloudflare infrastructure to ensure global CDN acceleration.
**NFR8:** Pages must use Traditional Chinese (繁體中文).
**NFR9:** The system must log all critical operations (login, content changes, settings modifications) for audit purposes.
**NFR10:** Code must follow TypeScript and ESLint best practices and maintain 80%+ test coverage.
---
## Compatibility Requirements
**CR1:** The new system must maintain compatibility with existing Google Analytics (G-DKBZWCGGZR) without disrupting data tracking.
**CR2:** The Payload CMS database schema must be able to map all existing Webflow CMS collections and fields without losing any content data.
**CR3:** UI/UX must maintain consistency with the original Webflow design, including:
- Fonts: Noto Sans TC and Quicksand
- Color schemes
- Responsive breakpoints
- Interaction patterns and animations
**CR4:** The system must maintain compatibility with existing social media integrations (Facebook, Google Analytics).
**CR5:** 301 redirects must ensure that all external links and bookmarks remain valid.
---
## Technical Clarifications
### Authentication System Clarification
**❌ Incorrect (Legacy Documentation):**
> "The site will use Auth.js (`astro-auth`) to handle user authentication."
**✅ Correct (Actual Implementation):**
> "The site will use **Payload CMS built-in authentication system** with cookie-based sessions."
**Key Differences:**
- **Payload CMS Auth:** Built-in, handles users collection directly, provides `/api/users/login` endpoint
- **Session Management:** Payload uses HTTP-only cookies for session storage
- **Integration:** Astro frontend communicates with Payload API for authentication verification
- **RBAC:** Implemented through Payload's access control functions (`authenticated()`, custom role checks)
### API Integration Pattern
```typescript
// Astro → Payload CMS Authentication Pattern
import { Payload } from '@payloadcms/payload'
// Verify session on protected routes
export async function GET({ request, locals }) {
const user = locals.user // Set by Payload middleware
if (!user) {
return new Response(null, { status: 401 })
}
// Proceed with authenticated request
}
```
---
**Next Section:** [User Interface Enhancement Goals](./03-ui-enhancement-goals.md)

View File

@@ -0,0 +1,221 @@
# 3. User Interface Enhancement Goals
**Last Updated:** 2025-01-29
Since this migration involves complete UI reconstruction, this section defines how UI enhancements integrate with the existing design.
---
## Integration with Existing UI
### Design System Extraction
Based on analysis of the original Webflow HTML, the following key design patterns have been identified:
#### Typography System
**Fonts:**
- **Primary Font:** Noto Sans TC (weights: 100, 300, 400, 500, 700, 900)
- **Display Font:** Quicksand (weights: 300, 400, 500, 600, 700)
- **Source:** Google Fonts
**Responsive Font Sizes:**
```css
/* Desktop and above */
html { font-size: 19px; }
/* Tablet */
@media (max-width: 991px) {
html { font-size: 19px; }
}
/* Mobile - Landscape */
@media (max-width: 767px) {
html { font-size: 16px; }
}
/* Mobile - Portrait */
@media (max-width: 479px) {
html { font-size: 13px; }
}
```
#### Icon System
- **Library:** Google Material Icons
- **Variants:** Outlined, Two Tone, Round, Sharp
#### Layout Patterns
- **Container-based layout** (`w-container` class in Webflow)
- **Grid system** for feature cards, portfolio, footer
- **Sticky navigation** with scroll effects
- **Responsive hamburger menu** for mobile
#### Component Patterns
- Hero sections with overlay backgrounds
- Feature cards with icon + text
- Comparison tables (Enchun vs competitors)
- Call-to-action sections
- Dynamic footer with blog categories
---
## Modified/New Screens and Views
### Pages to Reconstruct
#### 1. Homepage (`/`)
- Hero section with overlay
- Service features grid
- Portfolio preview
- CTA section
#### 2. About Enchun (`/about`)
- Hero section
- Service features (4 cards)
- Comparison table (Enchun vs others)
- CTA section
#### 3. Marketing Solutions (`/solutions`)
- Services list
- Detail sections for each service
#### 4. Marketing Magnifier (`/blog`)
- Blog listing page
- Category filters
- Article cards with thumbnails
#### 5. Teams (`/teams`)
- Team member profiles
#### 6. Website Portfolio (`/portfolio`)
- Portfolio grid (2 columns)
- Project cards with external links
#### 7. Contact Us (`/contact`)
- Contact form
- Contact information
- CTA section
#### 8. Article Detail (`/blog/[slug]`)
- Dynamic content from Payload CMS
- Related articles
- Social sharing
#### 9. Category Page (`/blog/category/[slug]`)
- Filtered article list
- Category description
#### 10. Project Detail (`/portfolio/[slug]`)
- Project details
- Case study content
### New Admin Interface
#### 11. Login Page (`/admin/login`)
- Login form with email/password
- Error handling
- Redirect after login
#### 12. Dashboard (`/admin/dashboard`)
- Welcome message
- Quick stats
- Recent activity
#### 13. CMS Admin Interface (`/admin/cms`)
- Embedded Payload CMS admin panel
- Protected by authentication
---
## UI Consistency Requirements
### Responsive Design Requirements
#### Breakpoint Definition
- **Desktop:** > 991px
- **Tablet:** 768px - 991px
- **Mobile Landscape:** 480px - 767px
- **Mobile Portrait:** < 479px
#### Consistency Rules
**UC1:** All pages must use a unified Header component including:
- Enchun logo
- Navigation links (About, Solutions, Marketing Magnifier, Teams, Portfolio, Contact)
- Hot/New badges (Solutions shows "hot", Marketing Magnifier shows "new")
- Mobile hamburger menu
**UC2:** All pages must use a unified Footer component including:
- Enchun logo and description
- Contact information (phone, Email, Facebook)
- Marketing solution links
- Marketing magnifier category links (dynamically fetched from Payload CMS)
- Copyright notice (2018 - 2024)
**UC3:** All CTA buttons must follow consistent styling:
- Consistent colors, spacing, border-radius
- Hover effects
- Material icons integration
**UC4:** All form elements must:
- Use consistent input styling
- Provide clear error messages
- Support keyboard navigation
- Meet WCAG 2.1 AA contrast requirements
**UC5:** Images and media must:
- Use Next.js Image or Astro Image optimization
- Support responsive loading
- Provide alt text
- Implement lazy loading
**UC6:** Animations and transitions must:
- Maintain smooth scroll effects similar to original Webflow
- Use CSS transitions and transforms
- Respect user's `prefers-reduced-motion` setting
**UC7:** Typography must:
- Follow hierarchy structure (H1 > H2 > H3 > H4)
- Use consistent spacing system (based on Tailwind spacing scale)
- Maintain consistent line-height and letter-spacing
**UC8:** Accessibility must:
- All interactive elements accessible via keyboard
- Clear focus indicators
- Semantic HTML (proper use of `<nav>`, `<main>`, `<article>`, `<section>`)
- ARIA labels for custom components
---
## Design Tokens
### Color System (To Be Extracted)
The following color system needs to be extracted from Webflow CSS and converted to Tailwind configuration:
```javascript
// tailwind.config.js (to be completed)
module.exports = {
theme: {
extend: {
colors: {
// Extract from enchun.webflow.shared.557e15b5a.css
brand: {
primary: '', // To be extracted
secondary: '', // To be extracted
accent: '', // To be extracted
}
}
}
}
}
```
### Spacing System
- Base spacing unit: Tailwind default (4px)
- Consistent padding/margins for components
- Container max-widths aligned with breakpoints
---
**Next Section:** [Technical Constraints and Integration Requirements](./04-technical-constraints.md)

View File

@@ -0,0 +1,475 @@
# 4. Technical Constraints and Integration Requirements
**Last Updated:** 2025-01-29
This section defines how the migration integrates with the existing architecture and technical constraints.
---
## Existing Technology Stack
### Target System Architecture
**Languages:**
- TypeScript 5.x (strict mode enabled)
**Frameworks:**
- **Frontend:** Astro 6.0.x (SSR mode + Cloudflare native runtime)
- **Backend/CMS:** Payload CMS 3.x
- **UI Components:** React (for interactive components via @astrojs/react integration)
**Database:**
- **Development:** Local MongoDB or SQLite
- **Production:** MongoDB (Atlas or self-hosted)
- **Option:** PostgreSQL support available (via @payloadcms/db-postgres)
**Infrastructure:**
- **Hosting:** Cloudflare Pages (frontend)
- **Serverless:** Cloudflare Workers (backend API)
- **Storage:** Cloudflare R2 (media files)
- **DNS:** Cloudflare (existing)
- **CDN:** Cloudflare global network + **native runtime**
**External Dependencies:**
- **Authentication:** Payload CMS built-in authentication ✅
- **Form Processing:** Cloudflare Workers (contact form)
- **Analytics:** Google Analytics (G-DKBZWCGGZR)
- **Fonts:** Google Fonts (Noto Sans TC, Quicksand)
- **Icons:** Google Material Icons
**Development Tools:**
- **Package Manager:** pnpm 10.x (workspace)
- **Build Tool:** Turborepo 2.x (monorepo management)
- **Code Quality:** ESLint, Prettier
- **Testing:** Vitest (unit tests), Playwright (E2E)
- **Version Control:** Git
---
## Integration Approach
### Database Integration Strategy
#### Payload CMS Collection Design
```typescript
// Users Collection (with built-in authentication)
{
email: string;
role: 'admin' | 'editor';
name?: string;
createdAt: Date;
}
// Posts Collection (migrated from "行銷放大鏡集")
{
title: string; // 文章標題
slug: string; // URL slug
excerpt?: string; // 文章簡述
content: richText; // 發文內容
category: relation; // 文章分類 (link to Categories)
publishedDate: Date; // 發文日期
featuredImage: media; // 強調圖片
ogImage?: media; // Open Graph 顯示圖片
showInFooter: boolean; // 是否放在頁尾
status: 'draft' | 'published';
}
// Categories Collection (migrated from "文章分類s")
{
name: string; // 分類名稱
slug: string; // URL slug
nameEn?: string; // 英文分類名稱
order: number; // 順序
textColor: string; // 文字顏色
backgroundColor: string; // 分類顏色
parent?: relation; // Support nested categories (optional)
}
// Portfolio Collection (migrated from "網站設計範本s")
{
title: string; // project
slug: string; // Slug
url?: string; // External link
image: media; // 圖片
description?: string; // description
websiteType: string; // 網站類型
tags?: string[]; // 標籤 (e.g., "一頁式銷售", "客戶預約")
}
// Media Collection
{
alt?: string;
caption?: string;
url: string; // R2 URL
filename: string;
mimeType: string;
filesize: number;
width?: number;
height?: number;
}
```
#### Content Migration Strategy
**Phase 1: Webflow Export**
1. Export Webflow CMS as JSON/CSV
2. Export all media files
3. Document field mappings
**Phase 2: Build Migration Script**
```typescript
// migration-script.ts
// 1. Parse Webflow export data
// 2. Transform to Payload CMS API format
// 3. Batch upload to Payload CMS
// 4. Preserve original slugs and URL structure
```
**Phase 3: Media Migration**
1. Download all images/documents
2. Upload to Cloudflare R2
3. Update references in Payload CMS
---
### API Integration Strategy
#### Astro → Payload CMS
```typescript
// Fetch data from Payload API
const API_URL = import.meta.env.PAYLOAD_CMS_URL;
const API_KEY = import.meta.env.PAYLOAD_CMS_API_KEY;
async function getPosts() {
const response = await fetch(`${API_URL}/api/posts?depth=1`, {
headers: { 'Authorization': `users ${API_KEY}` }
});
return response.json();
}
```
#### Astro → Payload Authentication
```typescript
// Verify Payload CMS session in Astro
// Payload sets HTTP-only cookies, Astro reads them
export async function middleware({ request, locals }) {
const user = await verifyPayloadSession(request.headers.get('cookie'));
locals.user = user;
}
```
---
### Frontend Integration Strategy
#### Component Architecture
```
apps/frontend/src/
├── components/
│ ├── common/ # Shared components
│ │ ├── Header.astro
│ │ ├── Footer.astro
│ │ └── CTAButton.astro
│ ├── layout/ # Layout components
│ │ ├── MainLayout.astro
│ │ └── AdminLayout.astro
│ └── sections/ # Page sections
│ ├── Hero.astro
│ ├── FeatureCards.astro
│ └── ComparisonTable.astro
├── layouts/
│ ├── BaseLayout.astro
│ └── EmptyLayout.astro
├── pages/
│ ├── index.astro
│ ├── about.astro
│ ├── solutions.astro
│ ├── blog/
│ │ ├── index.astro
│ │ └── [slug].astro
│ └── admin/
│ ├── login.astro
│ └── dashboard.astro
└── lib/
├── payload.ts # Payload API client
├── auth.ts # Auth helpers
└── utils.ts # Utility functions
```
#### Styling Integration
**Tailwind CSS Configuration:**
```javascript
// tailwind.config.js
module.exports = {
theme: {
extend: {
fontFamily: {
sans: ['Noto Sans TC', 'sans-serif'],
display: ['Quicksand', 'sans-serif'],
},
colors: {
// Extract brand colors from Webflow CSS
brand: { /* ... */ }
}
}
}
}
```
---
### Testing Integration Strategy
**Unit Tests:**
- Utility functions
- Payload CMS hooks
- API route handlers
**E2E Tests:**
- Critical user journeys:
- Home → About → Contact
- Blog list → Article detail
- Login → Edit content
- Form submissions
- Authentication flows
---
## Code Organization and Standards
### File Structure Approach
**Monorepo Structure:**
```
website-enchun-mgr/
├── apps/
│ ├── backend/ # Payload CMS
│ │ ├── src/
│ │ │ ├── collections/
│ │ │ ├── globals/
│ │ │ ├── payload.config.ts
│ │ │ └── server.ts # Cloudflare Workers entry
│ │ └── package.json
│ └── frontend/ # Astro
│ ├── src/
│ │ ├── components/
│ │ ├── layouts/
│ │ ├── pages/
│ │ └── styles/
│ ├── astro.config.mjs
│ └── package.json
├── packages/
│ └── shared/ # Shared TypeScript utilities
│ ├── src/
│ │ ├── types/
│ │ ├── utils/
│ │ └── constants/
│ └── package.json
├── pnpm-workspace.yaml
├── turbo.json
└── package.json
```
### Naming Conventions
**Files/Folders:**
- Components: `PascalCase` (`Header.astro`, `FeatureCards.astro`)
- Pages: `kebab-case` (`about.astro`, `marketing-solutions.astro`)
- Utils: `camelCase` (`formatDate.ts`, `slugify.ts`)
- Constants: `UPPER_SNAKE_CASE` (`API_URL.ts`, `BREAKPOINTS.ts`)
- Types: `PascalCase` (`Post.ts`, `User.ts`)
**Code Naming:**
- Variables/Functions: `camelCase`
- Classes/Interfaces/Types: `PascalCase`
- Private vars: `camelCase` with `_` prefix (`_internalFunction`)
- Booleans: `is/has/should` prefix (`isLoading`, `hasError`)
### Coding Standards
**TypeScript Configuration:**
```json
{
"compilerOptions": {
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
}
}
```
**ESLint Rules:**
- `@typescript-eslint/recommended`
- `astro/recommended`
- Custom rules:
- Max line length: 100
- No console.log in production
- Require explicit return types
**Import Order:**
```typescript
// 1. External dependencies
import React from 'react';
// 2. Internal shared
import { formatDate } from '@repo/shared/utils';
// 3. Components
import { Header } from '@/components/common/Header.astro';
// 4. Styles
import '@/styles/global.css';
```
### Documentation Standards
- All components must have JSDoc comments
- Complex functions must explain purpose, parameters, return values
- Payload CMS collections must have field descriptions
---
## Deployment and Operations
### Build Process Integration
**Turborepo Scripts:**
```json
{
"scripts": {
"dev": "turbo run dev --parallel",
"build": "turbo run build",
"lint": "turbo run lint",
"test": "turbo run test"
}
}
```
**Build Flow:**
1. **Frontend Build:**
```bash
cd apps/frontend
pnpm build
# Output: dist/
```
2. **Backend Build:**
```bash
cd apps/backend
pnpm build
# Output: .next/ or build/
```
### Deployment Strategy
**Cloudflare Pages Configuration:**
```toml
# wrangler.toml
name = "enchun-frontend"
compatibility_date = "2024-01-01"
[env.production]
routes = [
{ pattern = "/api/*", zone_name = "enchuntw-admin.anlstudio.cc" }
]
```
**CI/CD Pipeline:**
1. Push to `main` branch → Auto-trigger deployment
2. Run tests → Stop deployment if failed
3. Build → Generate optimized production version
4. Deploy to Cloudflare Pages
**Environment Variables:**
```bash
# .env.production
PAYLOAD_CMS_URL=https://enchuntw-admin.anlstudio.cc
PAYLOAD_CMS_API_KEY=your-production-key
DATABASE_URI=mongodb+srv://...
R2_ACCOUNT_ID=your-account-id
R2_ACCESS_KEY_ID=your-access-key
R2_SECRET_ACCESS_KEY=your-secret-key
```
**Domain and DNS:**
- `www.enchun.tw` → Cloudflare Pages
- `enchuntw-admin.anlstudio.cc` → Payload CMS admin
### Monitoring and Logging
**Cloudflare Analytics:**
- Page views
- Response times
- Error rates
- Geographic distribution
**Logging Strategy:**
```typescript
// Unified logging format
import { logger } from '@/lib/logger';
logger.info('User login', { userId, timestamp });
logger.error('API request failed', { endpoint, error });
```
**Error Tracking:**
- Sentry or Cloudflare Web Analytics
- Capture frontend errors
- Track API failures
### Configuration Management
**Environment Variables:**
- `.env.local` - Local development
- `.env.production` - Production
- All sensitive data in environment variables
**Secret Management:**
- Cloudflare Secrets (Workers)
- GitHub Secrets (CI/CD)
- Never commit .env files to Git
---
## Risk Assessment and Mitigation
### Technical Risks
| Risk | Impact | Probability | Mitigation |
|------|--------|-------------|------------|
| **Payload CMS collection design doesn't match Webflow** | High | Medium | Carefully analyze Webflow CMS structure, create complete field mapping table |
| **Content migration data loss** | High | Medium | Build migration validation scripts, compare source and target data |
| **SEO traffic drop** | High | Medium | Implement complete 301 redirects, monitor Google Analytics |
| **Performance below target (Lighthouse < 95)** | Medium | Low | Use WebPageTest and Lighthouse CI for continuous monitoring |
| **Cloudflare Workers limits** | Medium | Low | Optimize bundle size, split using edge functions |
| **Payload auth security vulnerabilities** | High | Low | Use tested Payload built-in auth, regular security audits |
| **R2 storage cost over budget** | Medium | Low | Implement image compression and lazy loading strategies |
### Integration Risks
| Risk | Impact | Probability | Mitigation |
|------|--------|-------------|------------|
| **Astro SSR + Payload API integration issues** | High | Medium | Build dedicated API client layer, implement error handling and retry logic |
| **Monorepo dependency management conflicts** | Medium | Medium | Use pnpm workspace strict version control, regular dependency updates |
| **Tailwind CSS vs Webflow style differences** | Medium | High | Extract Webflow CSS to Tailwind config, verify with Storybook |
| **Responsive design breakpoint mismatches** | Medium | Low | Use same breakpoint definitions, test all device sizes |
| **Font loading causing FOUT/FOIT** | Low | Medium | Use font-display: swap, preload critical fonts |
### Deployment Risks
| Risk | Impact | Probability | Mitigation |
|------|--------|-------------|------------|
| **Deployment downtime affects SEO** | Medium | Low | Use zero-downtime deployment, test staging environment first |
| **Environment variable configuration errors** | High | Low | Use CI/CD to validate environment variables, implement config checklist |
| **R2 image loading failures** | High | Medium | Implement CDN fallback mechanism, monitor R2 availability |
| **DNS switch delays** | Low | Low | Configure DNS in advance, gradually migrate traffic |
---
**Next Section:** [Epic and Story Structure](./05-epic-stories.md)

678
docs/prd/05-epic-stories.md Normal file
View File

@@ -0,0 +1,678 @@
# 5. Epic and Story Structure
**Last Updated:** 2025-01-29
For brownfield projects, we favor a single comprehensive epic unless the user is clearly requesting multiple unrelated enhancements.
---
## Epic Approach
**Epic Structure Decision:** Single comprehensive epic
**Rationale:**
- This is a cohesive migration project with interdependent components
- All stories contribute to the same goal: complete Webflow to Payload CMS + Astro migration
- Multiple epics would create artificial boundaries and coordination overhead
- Sequential execution minimizes risk to existing system during transition
---
## Epic 1: Webflow to Payload CMS + Astro Migration
**Epic Goal:** Complete migration of enchun.tw website from Webflow to modern Payload CMS + Astro architecture while maintaining content integrity, SEO value, and 95%+ visual fidelity.
**Integration Requirements:**
- Must maintain existing Google Analytics tracking (G-DKBZWCGGZR)
- Must preserve all content (35+ articles, 4 categories, portfolio items)
- Must implement complete 301 redirect mappings
- Must use Payload CMS built-in authentication system
- Must deploy to Cloudflare infrastructure
---
### Story 1.1: Project Infrastructure Setup
**As a** Developer,
**I want to** set up the monorepo structure with Payload CMS and Astro,
**So that** I have a solid foundation for the migration.
**Acceptance Criteria:**
1. ✅ pnpm workspace configured with apps/backend, apps/frontend, packages/shared
2. ✅ Payload CMS 3.x initialized in apps/backend with MongoDB adapter
3. ✅ Astro 6.0.x SSR project initialized in apps/frontend (with Cloudflare native runtime)
4. ✅ TypeScript strict mode enabled across all packages
5. ✅ Turborepo configured for build/dev/lint scripts
6. ✅ Shared utilities package properly linked
7. ✅ Local development runs with `pnpm dev` (both frontend and backend)
**Integration Verification:**
- IV1: Verify that frontend can fetch data from backend API
- IV2: Verify that shared utilities can be imported in both apps
- IV3: Verify that TypeScript compilation succeeds across workspace
- IV4: Verify that hot reload works in both frontend and backend
**Estimated Effort:** 4-6 hours
---
### Story 1.2: Payload CMS Collections Definition
**As a** Developer,
**I want to** define all Payload CMS collections matching Webflow structure,
**So that** I can store migrated content in the correct structure.
**Acceptance Criteria:**
1. ✅ Users collection configured with built-in authentication
2. ✅ Posts collection with fields: title, slug, excerpt, content (richText), category (relation), publishedDate, featuredImage, ogImage, showInFooter, status
3. ✅ Categories collection with fields: name, slug, nameEn, order, textColor, backgroundColor
4. ✅ Portfolio collection with fields: title, slug, url, image, description, websiteType, tags
5. ✅ Media collection configured with R2 storage adapter
6. ✅ Access control functions defined (admin, editor roles)
7. ✅ All collections have proper timestamps and draft/published status
**Integration Verification:**
- IV1: Verify that Payload CMS admin panel loads without errors
- IV2: Verify that all collections appear in admin sidebar
- IV3: Verify that Users collection authentication works (can create/login user)
- IV4: Verify that Media collection uploads to R2 successfully
- IV5: Verify that rich text editor (Lexical) works in Posts collection
**Estimated Effort:** 8-10 hours
---
### Story 1.3: Content Migration Script
**As a** Developer,
**I want to** create a migration script that imports Webflow content to Payload CMS,
**So that** I can automate content transfer and reduce manual errors.
**Acceptance Criteria:**
1. ✅ Script accepts Webflow JSON/CSV export as input
2. ✅ Script transforms Webflow data to Payload CMS API format
3. ✅ Script migrates all 35+ posts with proper field mapping
4. ✅ Script migrates all 4 categories
5. ✅ Script migrates all portfolio items
6. ✅ Script downloads and uploads media to R2
7. ✅ Script preserves original slugs for SEO
8. ✅ Script generates migration report (success/failure counts)
9. ✅ Script supports dry-run mode for testing
**Integration Verification:**
- IV1: Verify that migrated content matches Webflow source (manual spot check)
- IV2: Verify that all media files are accessible in R2
- IV3: Verify that rich text content is formatted correctly
- IV4: Verify that category relationships are preserved
- IV5: Verify that script can be re-run without creating duplicates
**Estimated Effort:** 12-16 hours
---
### Story 1.4: Global Layout Components
**As a** Developer,
**I want to** create Header and Footer components matching Webflow design,
**So that** all pages have consistent navigation and branding.
**Acceptance Criteria:**
1. ✅ Header component with:
- Enchun logo (links to home)
- Desktop navigation (About, Solutions, Marketing Magnifier, Teams, Portfolio, Contact)
- "Hot" badge on Solutions link
- "New" badge on Marketing Magnifier link
- Mobile hamburger menu
- Sticky behavior on scroll
2. ✅ Footer component with:
- Enchun logo and description
- Contact info (phone, Email, Facebook link)
- Marketing solution links (static)
- Marketing magnifier category links (dynamic from Payload CMS)
- Copyright notice (2018 - 2024)
3. ✅ Both components use Tailwind CSS with Webflow colors
4. ✅ Both components are responsive (desktop/tablet/mobile)
5. ✅ Header/Footer integrated into MainLayout.astro
6. ✅ Mobile menu fully functional with smooth animations
**Integration Verification:**
- IV1: Verify that Header appears on all pages
- IV2: Verify that navigation links work correctly
- IV3: Verify that Footer dynamic categories load from Payload CMS
- IV4: Verify responsive behavior matches Webflow breakpoints
- IV5: Verify that mobile menu toggle works smoothly
**Estimated Effort:** 8-10 hours
---
### Story 1.5: Homepage Implementation
**As a** Visitor,
**I want to** view the homepage with hero section and service features,
**So that** I can understand what Enchun Digital offers.
**Acceptance Criteria:**
1. ✅ Hero section with:
- Background image/overlay
- Main headline and subheadline
- CTA button
2. ✅ Service features grid (4 cards):
- Icon + title + description for each feature
- Responsive grid layout
3. ✅ Portfolio preview section
4. ✅ CTA section ("準備好開始新的旅程了嗎")
5. ✅ All content fetched from Payload CMS (globals or pages collection)
6. ✅ Visual fidelity 95%+ compared to Webflow
7. ✅ Lighthouse Performance score 90+
**Integration Verification:**
- IV1: Verify that page loads without errors
- IV2: Verify that all dynamic content displays correctly
- IV3: Verify that CTA button links to contact page
- IV4: Verify responsive design on all devices
- IV5: Verify performance meets targets (Lighthouse audit)
**Estimated Effort:** 6-8 hours
---
### Story 1.6: About Page Implementation
**As a** Visitor,
**I want to** learn about Enchun Digital's values and differences,
**So that** I can trust them as my digital marketing partner.
**Acceptance Criteria:**
1. ✅ Hero section with title "關於恩群數位"
2. ✅ Service features section (4 cards):
- 在地化優先
- 高投資轉換率
- 數據優先
- 關係優於銷售
3. ✅ Comparison table (恩群數位 vs 其他行銷公司)
4. ✅ CTA section ("跟行銷顧問聊聊")
5. ✅ Visual fidelity 95%+ compared to Webflow
6. ✅ Lighthouse Performance score 90+
**Integration Verification:**
- IV1: Verify that all sections display correctly
- IV2: Verify that comparison table formatting matches original
- IV3: Verify that CTA links to consultation form
- IV4: Verify responsive layout on mobile devices
- IV5: Verify performance and accessibility scores
**Estimated Effort:** 6-8 hours
---
### Story 1.7: Solutions Page Implementation
**As a** Visitor,
**I want to** see the marketing services offered,
**So that** I can understand how Enchun can help my business.
**Acceptance Criteria:**
1. ✅ Hero section with title "行銷方案"
2. ✅ Services list:
- Google 商家關鍵字
- Google Ads
- 社群代操
- 論壇行銷
- 網紅行銷
- 形象影片
3. ✅ Each service has description and details
4. ✅ "Hot" badge indicator
5. ✅ Visual fidelity 95%+ compared to Webflow
6. ✅ Lighthouse Performance score 90+
**Integration Verification:**
- IV1: Verify that all services display correctly
- IV2: Verify that "Hot" badge is visible
- IV3: Verify responsive layout
- IV4: Verify content can be managed via Payload CMS
- IV5: Verify performance targets met
**Estimated Effort:** 4-6 hours
---
### Story 1.8: Contact Page with Form
**As a** Potential Client,
**I want to** contact Enchun Digital through a form,
**So that** I can inquire about their services.
**Acceptance Criteria:**
1. ✅ Contact form with fields:
- Name (required)
- Email (required, validated)
- Phone (optional)
- Message (required)
- Service interest (dropdown)
2. ✅ Form submission handled by Cloudflare Worker
3. ✅ Success/error message display
4. ✅ Contact information display:
- Phone: 02-55700527
- Email: enchuntaiwan@gmail.com
- Facebook link
5. ✅ CTA section
6. ✅ Form validation on client and server
7. ✅ Visual fidelity 95%+ compared to Webflow
**Integration Verification:**
- IV1: Verify that form submission reaches Cloudflare Worker
- IV2: Verify that success message displays after submission
- IV3: Verify that validation errors display correctly
- IV4: Verify that spam protection works (honeypot or rate limiting)
- IV5: Verify that form data is properly stored/transmitted
**Estimated Effort:** 6-8 hours
---
### Story 1.9: Blog System Implementation
**As a** Visitor,
**I want to** browse marketing articles and insights,
**So that** I can learn from Enchun's expertise.
**Acceptance Criteria:**
**Blog Listing Page (`/blog`):**
1. ✅ Display all published posts
2. ✅ Category filter (4 categories)
3. ✅ Article cards with:
- Featured image
- Title
- Excerpt
- Category badge
- Published date
4. ✅ Pagination or infinite scroll
5. ✅ Visual fidelity 95%+ compared to Webflow
**Article Detail Page (`/blog/[slug]`):**
1. ✅ Display full article content
2. ✅ Show category badge
3. ✅ Show published date
4. ✅ Related articles section (same category)
5. ✅ Social sharing buttons (OG tags configured)
6. ✅ Rich text rendering matches Webflow
**Category Page (`/blog/category/[slug]`):**
1. ✅ Filter articles by category
2. ✅ Show category description
3. ✅ Category color theming
**Integration Verification:**
- IV1: Verify that all 35+ articles are accessible
- IV2: Verify that category filtering works correctly
- IV3: Verify that article content formatting matches original
- IV4: Verify that related articles are actually related
- IV5: Verify that Open Graph tags work for social sharing
- IV6: Verify Lighthouse scores 90+ for all blog pages
**Estimated Effort:** 12-16 hours
---
### Story 1.10: Portfolio Implementation
**As a** Potential Client,
**I want to** see Enchun's past website projects,
**So that** I can evaluate their design capabilities.
**Acceptance Criteria:**
**Portfolio Listing (`/portfolio`):**
1. ✅ Display all portfolio items in 2-column grid
2. ✅ Each card shows:
- Project image
- Project title
- Description
- Tags (e.g., "一頁式銷售", "客戶預約")
3. ✅ Visual fidelity 95%+ compared to Webflow
**Project Detail (`/portfolio/[slug]`):**
1. ✅ Display project details
2. ✅ Link to live website
3. ✅ Additional images/slideshow (if available)
4. ✅ Case study content
**Integration Verification:**
- IV1: Verify that all portfolio items display correctly
- IV2: Verify that external links work
- IV3: Verify responsive grid layout
- IV4: Verify that images are optimized (WebP, responsive)
- IV5: Verify performance targets met
**Estimated Effort:** 6-8 hours
---
### Story 1.11: Teams Page Implementation
**As a** Visitor,
**I want to** see the Enchun team members,
**So that** I can know who will be working on my project.
**Acceptance Criteria:**
1. ✅ Display team member profiles
2. ✅ Each profile shows:
- Photo
- Name
- Role/title
- Bio (if available)
3. ✅ Responsive grid layout
4. ✅ Visual fidelity 95%+ compared to Webflow
**Integration Verification:**
- IV1: Verify that all team members display correctly
- IV2: Verify responsive layout
- IV3: Verify that images load from R2
- IV4: Verify content can be managed via Payload CMS
**Estimated Effort:** 4-6 hours
---
### Story 1.12: Authentication System Implementation
**As a** Content Editor or Admin,
**I want to** securely log in to the admin area,
**So that** I can manage website content.
**Acceptance Criteria:**
**Login Page (`/admin/login`):**
1. ✅ Login form with email/password
2. ✅ Error handling for invalid credentials
3. ✅ Redirect to /admin/dashboard after successful login
4. ✅ "Remember me" option (optional)
5. ✅ Password reset flow (email via Resend)
**Authentication Middleware:**
1. ✅ Protect all `/admin/*` routes
2. ✅ Redirect unauthenticated users to login
3. ✅ Use Payload CMS built-in authentication
4. ✅ Session management via HTTP-only cookies
**Role-Based Access Control:**
1. ✅ Admin role: Full access to CMS, settings, user management
2. ✅ Editor role: Content management only (no settings/users)
3. ✅ Access control functions enforced in Payload CMS
**Integration Verification:**
- IV1: Verify that login works with valid credentials
- IV2: Verify that invalid credentials show error message
- IV3: Verify that /admin/* redirects to /admin/login when not authenticated
- IV4: Verify that authenticated users can access /admin/dashboard
- IV5: Verify that role-based restrictions work (editor can't access settings)
- IV6: Verify that logout works correctly
- IV7: Verify that sessions persist across page refreshes
**Estimated Effort:** 8-10 hours
---
### Story 1.13: Admin Dashboard
**As an** Authenticated User,
**I want to** see a dashboard after logging in,
**So that** I can access key features quickly.
**Acceptance Criteria:**
1. ✅ Welcome message with user's name
2. ✅ Quick stats:
- Total posts
- Published posts
- Draft posts
- Total portfolio items
3. ✅ Quick actions:
- Create new post
- Create new portfolio item
- Go to CMS admin
4. ✅ Recent activity list (last 5 content changes)
5. ✅ Logout button
6. ✅ Navigation to /admin/cms
**Integration Verification:**
- IV1: Verify that dashboard displays correct stats from Payload CMS
- IV2: Verify that quick actions navigate to correct pages
- IV3: Verify that recent activity is accurate
- IV4: Verify that only authenticated users can access dashboard
**Estimated Effort:** 4-6 hours
---
### Story 1.14: SEO Implementation
**As a** Marketing Manager,
**I want to** maintain SEO rankings after migration,
**So that** organic traffic is not lost.
**Acceptance Criteria:**
**Dynamic Sitemap:**
1. ✅ Generate `/sitemap.xml` automatically
2. ✅ Include all public pages
3. ✅ Include all blog posts
4. ✅ Include all portfolio items
5. ✅ Update when content changes
**Meta Tags:**
1. ✅ All pages have:
- Meta title
- Meta description
- Open Graph title
- Open Graph description
- Open Graph image
- Canonical URL
2. ✅ Payload CMS collections include SEO fields
3. ✅ Admin can edit SEO metadata per page/post
**301 Redirects:**
1. ✅ Create redirect map from Webflow URLs
2. ✅ Implement redirects in Astro
3. ✅ Test all critical redirects
4. ✅ Monitor 404 errors
**Google Analytics:**
1. ✅ Maintain existing GA tracking (G-DKBZWCGGZR)
2. ✅ GA script loads on all pages
3. ✅ Events tracked (form submissions, link clicks)
**Integration Verification:**
- IV1: Verify that sitemap.xml is accessible and valid
- IV2: Verify that all URLs in sitemap return 200 status
- IV3: Verify that meta tags appear in page source
- IV4: Verify that Open Graph tags work in social media previews
- IV5: Verify that 301 redirects preserve SEO equity
- IV6: Verify that Google Analytics receives data
- IV7: Verify Lighthouse SEO scores 95+
**Estimated Effort:** 8-10 hours
---
### Story 1.15: Performance Optimization
**As a** Visitor,
**I want to** pages load quickly,
**So that** I have a smooth browsing experience.
**Acceptance Criteria:**
1. ✅ Lighthouse Performance score 95+ on all public pages
2. ✅ First Contentful Paint (FCP) < 1.5s
3. Largest Contentful Paint (LCP) < 2.5s
4. All images optimized (WebP, responsive sizes)
5. Lazy loading for below-fold images
6. CSS/JS minified and split
7. Font loading optimized (preload critical fonts, font-display: swap)
8. CLS (Cumulative Layout Shift) < 0.1
**Integration Verification:**
- IV1: Run Lighthouse audit on all pages (desktop + mobile)
- IV2: Verify Core Web Vitals are in "Good" range
- III: Verify that images are served in modern formats
- IV4: Verify that lazy loading works correctly
- IV5: Verify that fonts don't cause FOUT/FOIT issues
- IV6: Verify that CLS score is acceptable
**Estimated Effort:** 8-12 hours
---
### Story 1.16: Deployment to Cloudflare
**As a** DevOps Engineer,
**I want to** deploy the application to Cloudflare,
**So that** the website is live and accessible.
**Acceptance Criteria:**
**Frontend Deployment (Cloudflare Pages):**
1. Build process generates optimized production bundle
2. Environment variables configured
3. Custom domain configured (www.enchun.tw)
4. SSL certificate active
5. CI/CD pipeline set up (auto-deploy on push to main)
**Backend Deployment (Cloudflare Workers):**
1. Payload CMS API deployed
2. Admin panel accessible at enchuntw-admin.anlstudio.cc
3. Cron jobs configured (if needed)
4. R2 storage configured and accessible
**DNS Configuration:**
1. DNS records point to Cloudflare
2. Propagation complete
3. DNSSEC configured (optional)
**Monitoring:**
1. Cloudflare Analytics enabled
2. Error tracking configured
3. Uptime monitoring configured
**Integration Verification:**
- IV1: Verify that www.enchun.tw loads correctly
- IV2: Verify that all pages are accessible (no 404s)
- IV3: Verify that /admin/cms loads and functions
- IV4: Verify that contact form submissions work
- IV5: Verify that Google Analytics tracks visits
- IV6: Verify that deployment process is automated
**Estimated Effort:** 6-8 hours
---
### Story 1.17: Testing and Quality Assurance
**As a** QA Engineer,
**I want to** thoroughly test the application,
**So that** there are no critical bugs at launch.
**Acceptance Criteria:**
**Cross-Browser Testing:**
1. Test on Chrome, Firefox, Safari, Edge
2. Test on latest 2 versions
3. Document any browser-specific issues
**Responsive Testing:**
1. Test on desktop (1920x1080, 1440x900)
2. Test on tablet (iPad 768x1024)
3. Test on mobile (iPhone 375x667, 414x896)
4. Verify no horizontal scroll at any size
**Functional Testing:**
1. Test all user flows:
- Browse pages
- Read blog articles
- Submit contact form
- Login/logout
- Create/edit content (CMS)
2. Test all forms with valid and invalid data
3. Test all external links
4. Test all 301 redirects
**Performance Testing:**
1. Lighthouse audit all pages (desktop + mobile)
2. WebPageTest analysis
3. Verify Core Web Vitals
**Accessibility Testing:**
1. WCAG 2.1 AA compliance check
2. Keyboard navigation test
3. Screen reader test (basic)
4. Color contrast verification
**Integration Verification:**
- IV1: All critical bugs must be fixed before launch
- IV2: All known issues documented with severity
- IV3: Test coverage report generated
- IV4: Launch checklist completed
**Estimated Effort:** 12-16 hours
---
## Story Dependencies and Sequencing
### Critical Path
```
1.1 (Infrastructure)
1.2 (Collections)
1.3 (Migration) ← Can parallel with 1.4
1.4 (Header/Footer)
1.5 (Homepage) ← Must complete before other pages
1.6, 1.7, 1.8, 1.9, 1.10, 1.11 (All pages) ← Can parallel
1.12 (Authentication) ← Can start in parallel with pages
1.13 (Dashboard)
1.14 (SEO)
1.15 (Performance)
1.16 (Deployment)
1.17 (Testing)
```
### Parallel Development Opportunities
- **Sprint 1:** Stories 1.1, 1.2 (infrastructure)
- **Sprint 2:** Stories 1.3, 1.4 (migration + layout)
- **Sprint 3:** Stories 1.5, 1.6, 1.7 (core pages)
- **Sprint 4:** Stories 1.8, 1.9, 1.10 (forms + blog + portfolio)
- **Sprint 5:** Stories 1.11, 1.12, 1.13 (teams + auth + dashboard)
- **Sprint 6:** Stories 1.14, 1.15 (SEO + performance)
- **Sprint 7:** Stories 1.16, 1.17 (deployment + testing)
---
## Estimated Timeline
**Total Estimated Effort:** 120-160 hours
**Team Size Assumption:** 1-2 developers
**Timeline:**
- **Week 1-2:** Infrastructure, Collections, Migration, Layout (Stories 1.1-1.4)
- **Week 3-4:** Core Pages Implementation (Stories 1.5-1.11)
- **Week 5:** Authentication and Dashboard (Stories 1.12-1.13)
- **Week 6:** SEO and Performance (Stories 1.14-1.15)
- **Week 7:** Deployment and Testing (Stories 1.16-1.17)
**Launch Readiness:** End of Week 7
---
**End of PRD**

View File

@@ -0,0 +1,860 @@
# Epic 1: 執行狀態與調整計劃
**更新日期:** 2025-01-30
**基於:** 4 個專業代理的深度分析報告
---
## 📊 當前執行狀態總覽
### 整體進度
| Story | 完成度 | 狀態 | 阻礙項目 | 優先級 |
|-------|--------|------|----------|--------|
| 1.1 基礎設施設置 | 85% | ⚠️ 接近完成 | Shared package 配置不完整 | P0 |
| 1.2 Collections 定義 | 43% | ❌ 需要大量工作 | Portfolio Collection 缺失 | P0 |
| 1.3 內容遷移腳本 | 0% | ⏸️ 未開始 | 依賴 Story 1.2 | P1 |
| 1.4-1.11 頁面實作 | 0% | ⏸️ 未開始 | 依賴前置 Stories | P1 |
| 1.12-1.13 認證與後台 | 0% | ⏸️ 未開始 | 可並行 | P2 |
---
## 🔍 Story 1.1 詳細分析
### ✅ 已完成的驗收標準
1. **AC1: pnpm workspace configured** - ✅ 100%
- 正確配置所有 packages
- workspace 依賴解析正常
2. **AC2: Payload CMS 3.x initialized** - ✅ 100%
- 版本3.59.1
- MongoDB adapter 配置完整
- R2 storage adapter 配置完整
3. **AC3: Astro 6.0.x SSR project** - ✅ 100%
- 使用 Astro 6.0.0-beta.1(超過原本 4.x 要求)
- Cloudflare native runtime 配置
- SSR 模式正確啟用
4. **AC7: Local dev runs** - ✅ 100%
- `pnpm dev` 正常運行
- 前後端同時啟動
### ⚠️ 部分完成的驗收標準
5. **AC4: TypeScript strict mode** - ⚠️ 66%
- Backend: ✅ strict mode 已啟用
- Frontend: ✅ strict mode 已啟用
- **Shared: ❌ strict mode 未啟用**
6. **AC5: Turborepo configured** - ⚠️ 60%
- 基礎任務配置存在
- **缺少:** typecheck 任務
- **缺少:** inputs/outputs 完整配置
7. **AC6: Shared utilities linked** - ⚠️ 30%
- Tailwind 配置可導出
- **源碼未導出:** `src/index.ts` 不在 exports 中
- **缺少:** build 和 typecheck scripts
### 📋 Story 1.1 剩餘任務清單
**高優先級(必須完成):**
1. 修復 `packages/shared/tsconfig.json` - 添加 `"strict": true`
2. 修復 `packages/shared/package.json` - 添加源碼 exports
3. 添加 `packages/shared/package.json` scripts
4. 添加根目錄 `typecheck` script
5. 創建根目錄 `.env.example`
**預估完成時間:** 40 分鐘
---
## ❌ Story 1.2 詳細執行計劃
### 當前狀態43% 完成 → 目標100%
**重要更新:** 已創建詳細修改計劃文檔
📄 `docs/prd/payload-cms-modification-plan.md`
---
### 📊 Collection 完成度總覽
| Collection | 當前 | 目標 | 缺失 | 優先級 |
|-----------|------|------|------|--------|
| Portfolio | 0% | 100% | 整個 collection | 🔴 P0 |
| Categories | 40% | 100% | 4 欄位 | 🔴 P0 |
| Posts | 60% | 100% | 4 欄位 | 🟡 P1 |
| Users | 70% | 100% | 1 欄位 | 🟡 P1 |
| Access Control | 50% | 100% | 2 函數 | 🟡 P1 |
**總預估時間:** 4 小時(比原計劃減少 50%
---
### 🎯 階段化實作計劃
#### Phase 1: Critical Blockers1.5 小時)
**目標:** 解除 Story 1.9 (Blog) 和 1.10 (Portfolio) 的阻礙
**Task 1.2.1: 創建 Portfolio Collection** (1 小時)
- ✅ 完整欄位定義文檔已規劃
- ✅ Access control 策略已定義
- ✅ Auto-slug hook 已規劃
- 📁 檔案:`collections/Portfolio/index.ts`
- 📋 詳細內容:參考 `payload-cms-modification-plan.md` Task 1.2.1
**Task 1.2.2: 完善 Categories Collection** (30 分鐘)
- ✅ 4 個新欄位已定義nameEn, order, textColor, backgroundColor
- ✅ 顏色欄位格式已確定hex code
- ✅ Admin UI 配置已規劃
- 📁 檔案:`collections/Categories.ts`
- 📋 詳細內容:參考 `payload-cms-modification-plan.md` Task 1.2.2
#### Phase 2: Content Enhancement1 小時)
**目標:** 完善內容管理功能
**Task 1.2.3: 完善 Posts Collection** (30 分鐘)
- ✅ 4 個新欄位已定義excerpt, ogImage, showInFooter, status
- ✅ excerpt 長度限制200 字
- ✅ status 選項draft, review, published
- 📁 檔案:`collections/Posts/index.ts`
- 📋 詳細內容:參考 `payload-cms-modification-plan.md` Task 1.2.3
**Task 1.2.4: 完善 Users Collection** (30 分鐘)
- ✅ role 欄位已定義admin/editor
- ✅ 預設值editor
- ✅ Admin UI 配置已規劃
- 📁 檔案:`collections/Users/index.ts`
- 📋 詳細內容:參考 `payload-cms-modification-plan.md` Task 1.2.4
#### Phase 3: Security & Access1.5 小時)
**目標:** 實現角色權限系統
**Task 1.2.5: 創建 Access Control 函數** (30 分鐘)
- ✅ adminOnly() 函數已定義
- ✅ adminOrEditor() 函數已定義
- ✅ 使用場景已文檔化
- 📁 檔案:`access/adminOnly.ts`, `access/adminOrEditor.ts`
- 📋 詳細內容:參考 `payload-cms-modification-plan.md` Task 1.2.5
**Task 1.2.6: 應用 Access Control** (30 分鐘)
- ✅ 所有 collections 的 access rules 已規劃
- ✅ Globals 的 access control 已規劃
- ✅ 角色權限矩陣已定義
- 📁 檔案7 個 collection/global 檔案
- 📋 詳細內容:參考 `payload-cms-modification-plan.md` Task 1.2.6
**Task 1.2.7: 驗證和測試** (1 小時)
- ✅ 測試腳本已規劃
- ✅ 驗收清單已定義
- ✅ 角色權限測試案例已準備
- 📋 詳細內容:參考 `payload-cms-modification-plan.md` Task 1.2.7
---
### 🔄 Webflow 欄位對應表
#### Portfolio Collection
| Webflow 欄位 | Payload 欄位 | 轉換規則 |
|-------------|-------------|---------|
| Name | title | 直接對應 |
| Slug | slug | 保留原始值 |
| Website Link | url | 直接對應 |
| Preview Image | image | 上傳到 R2 |
| Description | description | 直接對應 |
| Website Type | websiteType | Select: landing-page/booking/corporate/ecommerce/other |
| Tags | tags | String array |
#### Categories Collection
| Webflow 欄位 | Payload 欄位 | 轉換規則 |
|-------------|-------------|---------|
| Name | title | 直接對應 |
| Slug | slug | 保留原始值 |
| - | nameEn | ❌ 需手動新增 |
| - | order | ❌ 預設 0手動調整 |
| Color | textColor/backgroundColor | 拆分為兩個欄位hex code |
#### Posts Collection
| Webflow 欄位 | Payload 欄位 | 轉換規則 |
|-------------|-------------|---------|
| Title | title | 直接對應 |
| Slug | slug | 保留原始值 |
| Body | content | Richtext → Lexical JSON |
| Published Date | publishedAt | ISO 8601 format |
| Post Category | categories | 關聯 Categories collection |
| Featured Image | heroImage | 上傳到 R2 |
| SEO Title | meta.title | SEO plugin |
| SEO Description | meta.description | SEO plugin |
| - | excerpt | ❌ 需手動新增200 字限制) |
| - | ogImage | ❌ 需手動上傳(建議 1200x630px |
| - | showInFooter | ❌ 預設 false |
| - | status | ❌ 根據 published 判斷draft/review/published |
---
### 📋 最終驗收標準
#### Collection 完整性
- [x] Portfolio: 7/7 欄位title, slug, url, image, description, websiteType, tags
- [x] Categories: 6/6 欄位title, nameEn, order, textColor, backgroundColor, slug
- [x] Posts: 13/13 欄位(含新增的 excerpt, ogImage, showInFooter, status
- [x] Users: 4/4 欄位email, name, role, password
- [x] Media: 100% ✅(已完整)
- [x] Pages: 100% ✅(已完整)
#### Access Control 完整性
- [x] 5 個 access 函數:
- anyone ✅(已有)
- authenticated ✅(已有)
- authenticatedOrPublished ✅(已有)
- adminOnly ✅(新增)
- adminOrEditor ✅(新增)
#### 角色權限矩陣
| 操作 | Admin | Editor | 說明 |
|------|-------|--------|------|
| **Users** | | | |
| 刪除用戶 | ✅ | ❌ | adminOnly |
| 創建用戶 | ✅ | ❌ | adminOnly |
| **Posts/Pages** | | | |
| 創建內容 | ✅ | ✅ | adminOrEditor |
| 刪除內容 | ✅ | ✅ | adminOrEditor |
| 發布內容 | ✅ | ✅ | adminOrEditor |
| **Settings** | | | |
| 修改 Header/Footer | ✅ | ❌ | adminOnly |
#### 功能驗收
- [x] 所有 collections 在 admin panel 可見
- [x] 所有欄位可編輯
- [x] 角色權限正確執行
- [x] Media 上傳到 R2
- [x] Rich text editor 正常
- [x] 型別生成成功(`pnpm generate:types`
---
### 📊 更新後的時間影響
**原估計Story 1.2** 不明確,預估 8-12 小時
**更新後Story 1.2** **4 小時**(明確的 7 個 tasks
**Sprint 0 總時間:**
- Story 1.1: 40 分鐘
- Story 1.2: 4 小時
- **總計4.5 小時**(比原計劃 8-12 小時減少 **50-60%**
**理由:**
1. Payload CMS 架構清晰,修改簡單
2. Access control 模式一致,易於應用
3. 詳細計劃減少了不確定性
4. 大部分欄位是簡單的 text/select/upload 類型
---
### 🔗 相關 Stories 依賴更新
#### Story 1.9: Blog System依賴 Story 1.2
**新增依賴:**
- ✅ Categories.textColor/backgroundColor → category theming
- ✅ Posts.excerpt → article list display
- ✅ Posts.status → filter published posts
#### Story 1.10: Portfolio依賴 Story 1.2
**新增依賴:**
- ✅ Portfolio collection 必須存在
- ✅ 所有 7 個欄位必須定義
#### Story 1.12: Authentication依賴 Story 1.2
**新增依賴:**
- ✅ Users.role 欄位必須存在
- ✅ adminOnly/adminOrEditor 函數必須創建
- ✅ 所有 collections 必須應用 access control
**詳細的依賴更新請參考:**
`docs/prd/payload-cms-modification-plan.md` → "相關 Stories 更新" 章节
- ✅ authors (relationship to users)
- ✅ meta (SEO fields via plugin)
**缺失欄位:**
- ❌ excerpt (text) - 文章摘要
- ❌ ogImage (media) - Open Graph 圖片(獨立於 heroImage
- ❌ showInFooter (boolean) - 是否在頁腳顯示
- ❌ status - 自定義狀態(當前只有 _status: draft/published
**影響:**
- Story 1.9 (Blog System) 的摘要在列表頁無法顯示
- SEO 影響:社交分享預覽不完整
- 頁腳動態文章列表無法實作
**實作優先級:** 🟡 **High**
#### ⚠️ Access Control 缺失
**當前狀態:**
-`authenticated()` - 檢查是否登入
-`anyone()` - 允許所有人
-`authenticatedOrPublished()` - 認證用戶看全部,未認證看已發布
**缺失:**
-**角色系統未實現**
- Users collection 沒有 `role` 欄位
- 沒有 `adminOnly()` access function
- 沒有 `adminOrEditor()` access function
**Story 1.12 要求:**
- Admin role: 完整權限
- Editor role: 僅內容管理
**實作優先級:** 🟡 **High** (Story 1.12 前置需求)
---
## 📊 Story 1.2 完整任務清單
### Phase 1: 創建 Portfolio Collection (Critical)
**檔案:** `apps/backend/src/collections/Portfolio/index.ts`
**任務:**
1. 創建 Portfolio collection config
2. 定義所有必需欄位
3. 配置 access control
4. 添加 hooks (如果需要)
5. 註冊到 `payload.config.ts`
**預估時間:** 1 小時
### Phase 2: 完善 Categories Collection (Critical)
**檔案:** `apps/backend/src/collections/Categories.ts`
**任務:**
1. 添加 `nameEn` 欄位 (text)
2. 添加 `order` 欄位 (number, defaultValue: 0)
3. 添加 `textColor` 欄位 (text, 顏色選擇器)
4. 添加 `backgroundColor` 欄位 (text, 顏色選擇器)
5. 更新 admin UI 配置
**預估時間:** 30 分鐘
### Phase 3: 完善 Posts Collection (High)
**檔案:** `apps/backend/src/collections/Posts/index.ts`
**任務:**
1. 添加 `excerpt` 欄位 (text, textarea)
2. 添加 `ogImage` 欄位 (upload to media)
3. 添加 `showInFooter` 欄位 (checkbox, default: false)
4. 添加 `status` 欄位 (select: draft, review, published)
5. 更新 admin UI 配置
**預估時間:** 30 分鐘
### Phase 4: 實現角色系統 (High)
**檔案:** `apps/backend/src/collections/Users/index.ts`
**檔案:** `apps/backend/src/access/adminOnly.ts` (新建)
**檔案:** `apps/backend/src/access/adminOrEditor.ts` (新建)
**任務:**
1. 在 Users collection 添加 `role` 欄位 (select: admin, editor)
2. 創建 `adminOnly()` access function
3. 創建 `adminOrEditor()` access function
4. 更新 Collections 的 access control
- Users delete: adminOnly
- Posts/Pages create/update/delete: adminOrEditor
5. 重新生成型別
**預估時間:** 1 小時
### Phase 5: 驗證和測試
**任務:**
1. 重新生成 Payload 型別
2. 啟動開發環境
3. 驗證所有 collections 出現在 admin sidebar
4. 測試新增欄位功能
5. 測試角色系統(創建 admin/editor 用戶)
6. 測試 R2 上傳(如果尚未測試)
**預估時間:** 1 小時
**總預估時間:** 4 小時
---
## 🔄 更新的依賴關係圖
### Critical Path關鍵路徑
```
Story 1.1 (85%) ← 剩 40 分鐘
Story 1.2 (43%) ← 剩 4 小時
├─ Phase 1: Portfolio Collection (1 hr) ← BLOCKER
├─ Phase 2: Categories (30 min) ← BLOCKER
├─ Phase 3: Posts (30 min)
├─ Phase 4: Role System (1 hr)
└─ Phase 5: Verification (1 hr)
Story 1.3 (0%) ← 依賴 1.2 完成
Story 1.4-1.11 (0%) ← 可並行
├─ Story 1.4: Header/Footer
├─ Story 1.5: Homepage ← 依賴 1.4
├─ Story 1.6: About Page
├─ Story 1.7: Solutions Page
├─ Story 1.8: Contact Page
├─ Story 1.9: Blog ← 依賴 1.2 完成
├─ Story 1.10: Portfolio ← 依賴 1.2 完成 (BLOCKER)
└─ Story 1.11: Teams Page
Story 1.12-1.13 (0%) ← 可與頁面並行
├─ Story 1.12: Authentication ← 依賴 1.2 Role System
└─ Story 1.13: Dashboard
Story 1.14-1.17 (0%) ← 最後階段
├─ Story 1.14: SEO
├─ Story 1.15: Performance
├─ Story 1.16: Deployment
└─ Story 1.17: Testing
```
### Parallel Opportunities並行開發機會
**Wave 1: Infrastructure & Collections (必須先完成)**
- Story 1.1: 剩餘 40 分鐘
- Story 1.2: 4 小時
**Wave 2: Migration & Layout (可並行)**
- Story 1.3: 內容遷移腳本 (12-16 hr)
- Story 1.4: Header/Footer 組件 (8-10 hr)
**Wave 3: Core Pages (可並行)**
- Story 1.5: Homepage (6-8 hr) ← 依賴 1.4
- Story 1.6: About Page (6-8 hr)
- Story 1.7: Solutions Page (4-6 hr)
- Story 1.8: Contact Page (6-8 hr)
**Wave 4: Content Systems (可並行)**
- Story 1.9: Blog System (12-16 hr) ← 依賴 1.2
- Story 1.10: Portfolio (6-8 hr) ← 依賴 1.2
- Story 1.11: Teams Page (4-6 hr)
- Story 1.12: Authentication (8-10 hr) ← 依賴 1.2
- Story 1.13: Dashboard (4-6 hr)
**Wave 5: Production Readiness**
- Story 1.14: SEO (8-10 hr)
- Story 1.15: Performance (8-12 hr)
- Story 1.16: Deployment (6-8 hr)
- Story 1.17: Testing (12-16 hr)
---
## 🎯 優先級調整建議
基於分析報告,建議調整 Story 優先級:
### P0 (Critical - 本週必須完成)
1. **完成 Story 1.1** (40 分鐘)
- 移除阻礙 Story 1.2 的配置問題
2. **完成 Story 1.2 Phase 1-2** (1.5 小時)
- 創建 Portfolio Collection ← **Critical Blocker**
- 完善 Categories Collection ← **Critical Blocker**
**理由:** 這些是 Story 1.9 和 1.10 的直接阻礙
### P1 (High - 下週完成)
3. **完成 Story 1.2 Phase 3-5** (2.5 小時)
- 完善 Posts Collection
- 實現角色系統
- 驗證和測試
4. **開始 Story 1.4** (Header/Footer)
- 為所有頁面提供 Layout 基礎
### P2 (Medium - 視情況而定)
5. **Story 1.5-1.8** (核心頁面)
- 按順序實作:首頁 → 關於 → 方案 → 聯絡
6. **Story 1.9-1.10** (內容系統)
- Blog 和 Portfolio (依賴 1.2 完成)
---
## 📝 Story 1.2 詳細任務定義
### Task 1.2.1: Create Portfolio Collection
**User Story:**
```gherkin
As a Developer,
I want to create a Portfolio collection in Payload CMS,
So that website projects can be stored and managed.
Acceptance Criteria:
- Portfolio collection exists with slug 'portfolio'
- Has 7 required fields: title, slug, url, image, description, websiteType, tags
- Image field uploads to R2 storage
- Access control: authenticated users can read, admins can edit
- Collection appears in admin sidebar
```
**Definition of Done:**
- [ ] Collection config file created
- [ ] All 7 fields defined with correct types
- [ ] Admin UI labels configured (Chinese)
- [ ] Access control functions applied
- [ ] Registered in payload.config.ts
- [ ] Types regenerated successfully
- [ ] Verified in admin panel
**預估時間:** 1 小時
---
### Task 1.2.2: Complete Categories Collection
**User Story:**
```gherkin
As a Developer,
I want to add missing fields to Categories collection,
So that blog categories have complete metadata.
Acceptance Criteria:
- nameEn field added (English name)
- order field added (sorting, default: 0)
- textColor field added (with color picker)
- backgroundColor field added (with color picker)
- All fields appear in admin UI
- Fields are editable and save correctly
```
**Definition of Done:**
- [ ] 4 new fields added to Categories collection
- [ ] Admin UI configured with proper labels
- [ ] Color picker enabled for color fields
- [ ] Types regenerated
- [ ] Tested in admin panel
**預估時間:** 30 分鐘
---
### Task 1.2.3: Complete Posts Collection
**User Story:**
```gherkin
As a Developer,
I want to add missing fields to Posts collection,
So that blog posts have complete metadata for display and SEO.
Acceptance Criteria:
- excerpt field added (textarea, 200 char limit)
- ogImage field added (upload to media, separate from heroImage)
- showInFooter field added (checkbox, default: false)
- status field added (select: draft, review, published)
- All fields appear in post editor
- Fields save and load correctly
```
**Definition of Done:**
- [ ] 4 new fields added to Posts collection
- [ ] Admin UI configured
- [ ] excerpt field has character limit
- [ ] ogImage has image preview
- [ ] Types regenerated
- [ ] Tested creating/editing a post
**預估時間:** 30 分鐘
---
### Task 1.2.4: Implement Role-Based Access Control
**User Story:**
```gherkin
As an Admin,
I want to have different access levels for admins and editors,
So that editors can only manage content, not system settings.
Acceptance Criteria:
- role field added to Users collection (admin, editor)
- adminOnly() access function created
- adminOrEditor() access function created
- Users collection: delete restricted to admins
- Posts/Pages: create/update/delete restricted to adminOrEditor
- Settings access restricted to admins
```
**Definition of Done:**
- [ ] role field added to Users collection
- [ ] Default value: 'editor'
- [ ] adminOnly.ts file created
- [ ] adminOrEditor.ts file created
- [ ] All collections updated with new access rules
- [ ] Tested with both admin and editor users
- [ ] Types regenerated
**預估時間:** 1 小時
---
### Task 1.2.5: Verify and Test Collections
**User Story:**
```gherkin
As a QA Engineer,
I want to verify all collections work correctly,
So that content management is functional.
Acceptance Criteria:
- All collections appear in admin sidebar
- All fields are editable in admin UI
- Role-based access control works correctly
- Media uploads to R2 successfully
- Rich text editor works in Posts
- Can create users with different roles
```
**Definition of Done:**
- [ ] All 6 collections visible in sidebar
- [ ] Created test portfolio item
- [ ] Created test category with all fields
- [ ] Created test post with all fields
- [ ] Created admin and editor users
- [ ] Verified access restrictions
- [ ] Documented any issues
**預估時間:** 1 小時
---
## 📋 Sprint 建議
### Sprint 0: Infrastructure Completion1 天)
**目標:** 完成 Story 1.1 和 Story 1.2 關鍵部分
**Backlog:**
1. ✅ Story 1.1 - Complete Shared package config (40 min)
2. ✅ Story 1.2 - Task 1.2.1: Portfolio Collection (1 hr)
3. ✅ Story 1.2 - Task 1.2.2: Categories Completion (30 min)
**更新說明:** Story 1.2 已擴展為 7 個詳細任務(共 4 小時),但 Sprint 0 專注於 Phase 1Critical Blockers
**Sprint Goal:**
解除 Story 1.9 和 1.10 的阻礙Portfolio 和 Categories
**Definition of Done:**
- [ ] Story 1.1 達到 100%
- [ ] Portfolio Collection 創建完成7/7 欄位)
- [ ] Categories Collection 完整6/6 欄位)
- [ ] 所有型別生成成功
- [ ] 開發環境正常運行
**預估時間:** 2.5 小時(比原計劃減少)
---
### Sprint 1: Collections Completion & Content Enhancement (1-2 天)
**目標:** 完成 Story 1.2 剩餘任務,完善 Posts/Users/Access Control
**Backlog:**
1. ✅ Story 1.2 - Task 1.2.3: Posts Completion (30 min)
2. ✅ Story 1.2 - Task 1.2.4: Users Completion (30 min)
3. ✅ Story 1.2 - Task 1.2.5: Create Access Control Functions (30 min)
4. ✅ Story 1.2 - Task 1.2.6: Apply Access Control (30 min)
5. ✅ Story 1.2 - Task 1.2.7: Verification and Testing (1 hr)
6. ⏸️ Story 1.4 - Header/Footer Components可選如時間允許
**Sprint Goal:**
完成所有 Collections 定義和 Access ControlPayload CMS 完整可用
**Definition of Done:**
- [ ] Story 1.2 達到 100%(所有 7 個 tasks 完成)
- [ ] Portfolio Collection: 7/7 欄位 ✅
- [ ] Categories Collection: 6/6 欄位 ✅
- [ ] Posts Collection: 13/13 欄位 ✅
- [ ] Users Collection: 4/4 欄位(含 role
- [ ] Access Control: 5 個函數完整 ✅
- [ ] 角色權限測試通過
- [ ] 所有型別生成成功
**預估時間:** 3 小時Story 1.2 Phase 2-3+ 可選 Story 1.4
---
### Sprint 2: Layout & Core Pages (3-4 天)
**目標:** Header/Footer + 核心頁面實作
**Backlog:**
1. Story 1.4 - Header/Footer Components (8-10 hr)
2. Story 1.5 - Homepage (6-8 hr)
3. Story 1.6 - About Page (6-8 hr)
4. Story 1.7 - Solutions Page (4-6 hr)
**Sprint Goal:**
主要頁面上線,導航和佈局完成
**Definition of Done:**
- [ ] Header/Footer 在所有頁面顯示
- [ ] 首頁、關於、方案頁面完成
- [ ] 視覺保真度 95%+
- [ ] Lighthouse Performance 90+
---
### Sprint 3: Content Systems (3-4 天)
**目標:** Blog, Portfolio, Contact 頁面
**Backlog:**
1. Story 1.8 - Contact Page (6-8 hr)
2. Story 1.9 - Blog System (12-16 hr)
3. Story 1.10 - Portfolio (6-8 hr)
4. Story 1.11 - Teams Page (4-6 hr)
**Sprint Goal:**
所有頁面內容系統完成
**Definition of Done:**
- [ ] Blog 文章列表和詳情頁完成
- [ ] Portfolio 列表和詳情頁完成
- [ ] Teams 頁面完成
- [ ] Contact 表單功能正常
---
### Sprint 4: Auth & Admin (2-3 天)
**目標:** 認證系統和管理後台
**Backlog:**
1. Story 1.12 - Authentication System (8-10 hr)
2. Story 1.13 - Admin Dashboard (4-6 hr)
**Sprint Goal:**
編輯者可以登入並管理內容
**Definition of Done:**
- [ ] 登入/登出功能正常
- [ ] 角色權限正確執行
- [ ] Dashboard 顯示統計資訊
- [ ] 可以創建/編輯內容
---
### Sprint 5: Production Readiness (3-4 天)
**目標:** SEO、性能、部署、測試
**Backlog:**
1. Story 1.14 - SEO Implementation (8-10 hr)
2. Story 1.15 - Performance Optimization (8-12 hr)
3. Story 1.16 - Deployment (6-8 hr)
4. Story 1.17 - Testing (12-16 hr)
**Sprint Goal:**
網站正式上線
**Definition of Done:**
- [ ] SEO 設定完整
- [ ] Lighthouse 95+
- [ ] 部署到 Cloudflare
- [ ] 所有測試通過
- [ ] 生產環境驗證
---
## 📊 調整後的時間線
**原估計:** 120-160 小時 (7 週)
**調整後考慮:**
- Payload CMS 瘦身已完成(減少維護成本)
- Story 1.2 實際複雜度比預期高
- Story 1.1 已接近完成
**更新後時間線:**
| 週次 | Sprint | 主要交付物 | 預估工時 |
|------|--------|----------|----------|
| Week 1 | Sprint 0 | Story 1.1 完成 + Story 1.2 關鍵部分 | 8-12 hr |
| Week 2-3 | Sprint 1 | Story 1.2 完成 + Story 1.3 遷移 | 24-30 hr |
| Week 4-5 | Sprint 2 | Story 1.4-1.7 核心頁面 | 30-40 hr |
| Week 6-7 | Sprint 3 | Story 1.8-1.11 內容系統 | 30-40 hr |
| Week 8 | Sprint 4 | Story 1.12-1.13 認證後台 | 16-20 hr |
| Week 9-10 | Sprint 5 | Story 1.14-1.17 上線準備 | 40-50 hr |
**總預估:** 148-192 小時 (約 10 週)
---
## 🎯 下一步行動建議
### 立即執行(今天)
1. **完成 Story 1.1** (40 分鐘)
- 快速修復 Shared package 配置
- 為 Story 1.2 清除障礙
2. **創建 Portfolio Collection** (1 小時)
- 最高優先級
- 解除 Story 1.10 BLOCKER
### 本週執行
3. **完善 Categories Collection** (30 分鐘)
4. **完善 Posts Collection** (30 分鐘)
5. **實現角色系統** (1 小時)
6. **驗證測試** (1 小時)
**目標:** Story 1.1 和 1.2 達到 100%
### 下週執行
7. **開始 Story 1.3** (內容遷移腳本)
8. **或開始 Story 1.4** (Header/Footer)
---
## 📌 關鍵決策點
### 決策 1: Story 1.3 是否需要立即執行?
**選項 A** 是 - 先遷移內容,再實作頁面
- 優點:確保內容結構正確
- 缺點:看不到實際頁面效果
**選項 B** 否 - 先實作頁面,用測試數據
- 優點:快速看到視覺成果
- 缺點:後續需要更新所有內容
**建議:** 選項 B - 先實作 Story 1.5 (首頁),建立基礎模板
### 決策 2: Story 1.12 (認證) 優先級?
**選項 A** 高優先級 - 現在就實作
- 優點:內容編輯者可以提前開始工作
- 缺點:增加當前工作量
**選項 B** 中優先級 - 在頁面完成後實作
- 優點:集中精力完成用戶可見功能
- 缺點:內容管理延後
**建議:** 選項 B - 在 Sprint 4 執行(頁面完成後)
---
**文檔生成時間:** 2025-01-30
**基於:** 4 個專業代理分析報告 + Payload CMS 瘩身分析

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,844 @@
# Multi-Agent 並行執行策略建議
**建立日期:** 2025-01-30
**適用於:** Epic 1 - Webflow to Payload CMS + Astro Migration
**目標:** 最大化開發效率,縮短總時間線
---
## 📊 執行摘要
基於優先級重新評估,以下 Stories **可以並行執行**,使用多個 Agents 同時工作:
| Wave | 並行 Stories | 可節省時間 | Agent 數量 |
|------|-------------|-----------|-----------|
| **Wave 1** | 1.5, 1.9, 1.10 | 16-22 小時 | 3-4 Agents |
| **Wave 2** | 1.6, 1.7, 1.8 | 12-16 小時 | 3 Agents |
| **Wave 3** | 1.3, 1.11, 1.12 | 8-12 小時 | 3 Agents |
| **Wave 4** | 1.14, 1.15, 1.17 | 8-12 小時 | 3-4 Agents |
**總效益:** 縮短總時間線 **44-62 小時**(約 40-50%
---
## 🎯 並行執行框架
### Agent 類型定義
1. **Frontend Agent** - Astro 組件和頁面開發
2. **Content Agent** - 內容遷移和數據處理
3. **System Agent** - 認證、後端系統
4. **Quality Agent** - 測試、性能優化、SEO
### 並行執行原則
1.**無依賴 Stories 可完全並行**
2.**共享依賴完成後立即並行**
3. ⚠️ **有依賴的 Stories 需要協調**
4.**定期 sync每日/每完成 milestone**
---
## 🚀 Wave 1: 最大並行機會(推薦)
### 並行組合1.5 + 1.9 + 1.10
**觸發條件:** Story 1.4 (Header/Footer) 完成後
**並行圖:**
```
Story 1.4 完成
├─→ Agent 1: Story 1.5 Homepage (6-8 hr)
├─→ Agent 2: Story 1.9 Blog System (12-16 hr)
└─→ Agent 3: Story 1.10 Portfolio (6-8 hr)
(可選 Agent 4: 支援/Code Review)
```
**總時間(順序):** 24-34 小時
**總時間(並行):** **12-16 小時**(最長的 Story
**節省時間:** **12-18 小時**50%
---
### Agent 1: Story 1.5 - Homepage Implementation
**Agent 類型:** Frontend Agent
**時間估算:** 6-8 小時
**依賴:** Story 1.4 完成
**任務清單:**
1. ✅ Task 1.5.1: Create Homepage in Payload CMS1 小時)
2. ✅ Task 1.5.2: Create index.astro Route2 小時)
3. ✅ Task 1.5.3: Implement Hero Section1.5 小時)
4. ✅ Task 1.5.4: Implement Service Features Grid1.5 小時)
5. ✅ Task 1.5.5: Implement Portfolio Preview Section1 小時)
6. ✅ Task 1.5.6: Implement CTA Section1 小時)
7. ✅ Task 1.5.7: Performance Optimization and Testing1 小時)
**交付成果:**
- [ ] Homepage 完整實作
- [ ] 視覺保真度 ≥ 95%
- [ ] Lighthouse Performance ≥ 90
**所需技能:**
- Astro 組件開發
- Tailwind CSS
- Payload API 整合
- 響應式設計
---
### Agent 2: Story 1.9 - Blog System Implementation
**Agent 類型:** Frontend Agent + Content Agent
**時間估算:** 12-16 小時
**依賴:** Story 1.2 Phase 1-2 完成
**任務清單:**
1. ✅ Task 1.9.1: Design Blog Architecture2 小時)
2. ✅ Task 1.9.2: Implement Blog Listing Page2.5 小時)
3. ✅ Task 1.9.3: Implement Article Detail Page3 小時)
4. ✅ Task 1.9.4: Implement Category Page2 小時)
5. ✅ Task 1.9.5: Extend Posts Collection1.5 小時)
6. ✅ Task 1.9.6: Implement Search/Filter Functionality2 小時,可選)
7. ✅ Task 1.9.7: Performance Optimization and Testing2 小時)
**交付成果:**
- [ ] Blog 系統完整實作
- [ ] 文章列表、詳情、分類頁面
- [ ] 分類篩選功能
- [ ] 視覺保真度 ≥ 95%
**所需技能:**
- Astro 動態路由
- Payload API 查詢
- 分頁實作
- Rich text 渲染Lexical
**與 Agent 1/3 協調:**
- ✅ 使用相同的 Header/FooterStory 1.4
- ✅ 使用相同的 MainLayout
- ⚠️ 可能需要共享 CSS classes
---
### Agent 3: Story 1.10 - Portfolio Implementation
**Agent 類型:** Frontend Agent
**時間估算:** 6-8 小時
**依賴:** Story 1.2 Task 1.2.1 完成
**任務清單:**
1. ✅ Task 1.10.1: Design Portfolio Architecture1 小時)
2. ✅ Task 1.10.2: Implement Portfolio Listing Page2 小時)
3. ✅ Task 1.10.3: Implement Portfolio Detail Page2 小時)
4. ✅ Task 1.10.4: Implement Portfolio Filter1 小時,可選)
5. ✅ Task 1.10.5: Performance and Visual Testing1 小時)
**交付成果:**
- [ ] Portfolio 列表和詳情頁面
- [ ] Grid 佈局響應式
- [ ] 圖片優化WebP, lazy loading
- [ ] 視覺保真度 ≥ 95%
**所需技能:**
- Astro 組件開發
- Grid/Flexbox 佈局
- 圖片優化
- Payload API 查詢
**與 Agent 1/2 協調:**
- ✅ 使用相同的 Header/FooterStory 1.4
- ✅ 使用相同的 MainLayout
- ✅ 可能共享 Portfolio 預覽組件(與 Agent 1 協調)
- ⚠️ Agent 1 的首頁可能需要顯示 Portfolio preview
---
### (可選) Agent 4: Code Review and Support
**Agent 類型:** Code Review Agentsuperpowers:code-reviewer
**時間估算:** 全程支援
**職責:**
- 🔍 審查 Agent 1/2/3 的代碼
- 🐛 發現潛在 bugs 和問題
- 📝 確保代碼一致性
- 🎨 確保視覺一致性
**執行頻率:**
- 每 2-3 小時審查一次
- 每次 Agent 完成任務時審查
- 最終整體審查
---
### Wave 1 協調機制
**每日 Sync建議時間30 分鐘):**
1. ✅ 各 Agent 報告進度(完成哪些 tasks
2. ✅ 討論遇到的阻礙
3. ✅ 協調共享組件和樣式
4. ✅ 代碼審查Agent 4
**通訊渠道:**
- 📝 共享文檔:進度追蹤
- 💬 即時通訊:快速問題討論
- 🔄 定期會議:詳細協調
**代碼合併策略:**
```bash
# 每個 Agent 使用獨立 branch
git checkout -b story-1.5-homepage # Agent 1
git checkout -b story-1.9-blog # Agent 2
git checkout -b story-1.10-portfolio # Agent 3
# 完成後合併到 main 或 feature branch
git checkout main
git merge story-1.5-homepage
git merge story-1.9-blog
git merge story-1.10-portfolio
```
**潛在衝突解決:**
- ⚠️ 共享檔案衝突Layout.astro, Header.astro
- ✅ 明確各自的修改範圍
- ✅ 使用 git merge tools
- ⚠️ CSS 命名衝突
- ✅ 使用 Tailwind 的 utility classes
- ✅ 共享設計 tokens
- ⚠️ API 調用模式不一致
- ✅ 提前約定 API 調用模式
- ✅ 共享 API utility functions
---
## 🚀 Wave 2: 內容頁面並行
### 並行組合1.6 + 1.7 + 1.8
**觸發條件:** Story 1.4 完成
**並行圖:**
```
Story 1.4 完成
├─→ Agent 1: Story 1.6 About Page (6-8 hr)
├─→ Agent 2: Story 1.7 Solutions Page (4-6 hr)
└─→ Agent 3: Story 1.8 Contact Page (6-8 hr)
```
**總時間(順序):** 16-22 小時
**總時間(並行):** **6-8 小時**(最長的 Story
**節省時間:** **10-14 小時**60%
---
### Agent 1: Story 1.6 - About Page
**任務清單:**
1. ✅ Task 1.6.1: Create About Page in Payload CMS1 小時)
2. ✅ Task 1.6.2: Create about-enchun.astro Route1.5 小時)
3. ✅ Task 1.6.3: Implement Hero Section1 小時)
4. ✅ Task 1.6.4: Implement Service Features Section1.5 小時)
5. ✅ Task 1.6.5: Implement Comparison Table1.5 小時)
6. ✅ Task 1.6.6: Implement CTA Section0.5 小時)
7. ✅ Task 1.6.7: Performance and Visual Testing1 小時)
**與 Wave 1 Agents 協調:**
- ✅ 使用相同的 Header/Footer
- ✅ 可能重用 Service Features 組件Story 1.5
- ✅ 使用相同的 CTA 組件模式
---
### Agent 2: Story 1.7 - Solutions Page
**任務清單:**
1. ✅ Task 1.7.1: Create Solutions Page in Payload CMS1 小時)
2. ✅ Task 1.7.2: Create marketing-solutions.astro Route1.5 小時)
3. ✅ Task 1.7.3: Implement Hero Section1 小時)
4. ✅ Task 1.7.4: Implement Services List Component2 小時)
5. ✅ Task 1.7.5: Performance and Visual Testing1 小時)
**與 Wave 1 Agents 協調:**
- ✅ 使用相同的 Header/Footer
- ✅ 可能重用 Hero 組件模式
- ✅ 使用相同的 Card 組件設計
---
### Agent 3: Story 1.8 - Contact Page with Form
**任務清單:**
1. ✅ Task 1.8.1: Create Contact Page in Payload CMS1 小時)
2. ✅ Task 1.8.2: Create contact-us.astro Route1 小時)
3. ✅ Task 1.8.3: Implement Contact Form2 小時)
4. ✅ Task 1.8.4: Implement Form Submission Logic2 小時)
5. ✅ Task 1.8.5: Implement Contact Info Display0.5 小時)
6. ✅ Task 1.8.6: Implement CTA Section0.5 小時)
7. ✅ Task 1.8.7: Testing and Validation1 小時)
**與 Wave 1 Agents 協調:**
- ✅ 使用相同的 Header/Footer
- ✅ 重用 CTA 組件模式
- ⚠️ **特別注意:** 表單提交 API endpoint
**特殊需求:**
- ⚠️ 需要創建 `/api/contact` API route可能影響其他 Agents
- ⚠️ Email 發送配置Resend
---
### Wave 2 協調機制
**共享組件庫(由 Wave 1 Agents 建立):**
- ✅ Hero Section 組件
- ✅ Service Features Card 組件
- ✅ CTA Section 組件
- ✅ Grid 佈局 patterns
**代碼合併策略:**
```bash
# 建議先合併 Wave 1 的代碼,再並行 Wave 2
git checkout main
git merge story-1.5-homepage
git merge story-1.9-blog
git merge story-1.10-portfolio
# Wave 2 Agents 基於合併後的 main
git checkout main
git pull
git checkout -b story-1.6-about # Agent 1
git checkout -b story-1.7-solutions # Agent 2
git checkout -b story-1.8-contact # Agent 3
```
---
## 🚀 Wave 3: 內容系統並行
### 並行組合1.3 + 1.11 + (1.12 → 1.13)
**觸發條件:** 所有頁面完成
**並行圖:**
```
頁面完成
├─→ Agent 1: Story 1.3 Content Migration (12-16 hr)
├─→ Agent 2: Story 1.11 Teams Page (4-6 hr)
└─→ Agent 3: Story 1.2 Phase 3 + 1.12 Auth (9-11.5 hr)
└─→ (可選) Agent 4: Story 1.13 Dashboard (4-6 hr)
```
**總時間(順序):** 32-39.5 小時
**總時間(並行):** **16-22 小時**(最長的 Story
**節省時間:** **16-17.5 小時**50%
---
### Agent 1: Story 1.3 - Content Migration Script
**Agent 類型:** Content Agent + Backend Agent
**時間估算:** 12-16 小時
**任務清單:**
1. ✅ Task 1.3.1: Research Webflow Export Format2 小時)
2. ✅ Task 1.3.2: Create Migration Script Foundation2 小時)
3. ✅ Task 1.3.3: Implement Posts Migration Logic3 小時)
4. ✅ Task 1.3.4: Implement Categories Migration Logic1 小時)
5. ✅ Task 1.3.5: Implement Portfolio Migration Logic2 小時)
6. ✅ Task 1.3.6: Implement Media Migration Module3 小時)
7. ✅ Task 1.3.7: Implement Deduplication Logic2 小時)
8. ✅ Task 1.3.8: Generate Migration Report1 小時)
9. ✅ Task 1.3.9: Testing and Validation2 小時)
**交付成果:**
- [ ] 遷移腳本完整
- [ ] 35+ 文章成功遷移
- [ ] Portfolio 成功遷移
- [ ] 媒體文件上傳到 R2
**所需技能:**
- TypeScript/Node.js 腳本開發
- Payload CMS API
- Webflow API/Export format
- 圖片處理和上傳
**與其他 Agents 協調:**
- ✅ 獨立執行,不影響其他 Agents
- ⚠️ 需要訪問 Payload CMS API
- ⚠️ 需要測試數據(可與其他 Agents 並行)
---
### Agent 2: Story 1.11 - Teams Page
**Agent 類型:** Frontend Agent
**時間估算:** 4-6 小時
**任務清單:**
1. ✅ Task 1.11.1: Design Teams Architecture0.5 小時)
2. ✅ Task 1.11.2: Create Teams Collection1 小時)
3. ✅ Task 1.11.3: Implement Teams Page2 小時)
4. ✅ Task 1.11.4: Performance and Visual Testing1 小時)
**交付成果:**
- [ ] Teams Collection 創建
- [ ] Teams 頁面完整
- [ ] 圓形照片裁切正確
**與其他 Agents 協調:**
- ✅ 使用相同的 Header/Footer
- ✅ 使用相同的 Card 組件設計
- ⚠️ 需要創建新的 Collection與 Story 1.2 類似)
---
### Agent 3: Story 1.2 Phase 3 + Story 1.12 - Access Control & Auth
**Agent 類型:** System Agent
**時間估算:** 9-11.5 小時
**任務清單:**
**Story 1.2 Phase 31.5 小時):**
1. ✅ Task 1.2.5: Create Access Control Functions0.5 小時)
2. ✅ Task 1.2.6: Apply Access Control0.5 小時)
3. ✅ Task 1.2.7: Verification and Testing0.5 小時)
**Story 1.128-10 小時):**
1. ✅ Task 1.12.1: Design Authentication Architecture1.5 小時)
2. ✅ Task 1.12.2: Implement Login Page2 小時)
3. ✅ Task 1.12.3: Implement Payload Authentication Middleware1 小時)
4. ✅ Task 1.12.4: Implement Route Protection2 小時)
5. ✅ Task 1.12.5: Implement Role-Based Access Control2 小時,簡化)
6. ✅ Task 1.12.6: Implement Password Reset Flow2 小時)
7. ✅ Task 1.12.7: Implement Logout Functionality0.5 小時)
**交付成果:**
- [ ] Access Control 系統完成
- [ ] 登入/登出功能正常
- [ ] 角色權限正確執行
**與其他 Agents 協調:**
- ⚠️ **影響所有其他 Stories**
- ✅ 需要與所有 Agents 測試權限
- ⚠️ 可能需要修改其他 Stories 的頁面
---
### (可選) Agent 4: Story 1.13 - Admin Dashboard
**觸發條件:** Story 1.12 完成
**時間估算:** 4-6 小時
**任務清單:**
1. ✅ Task 1.13.1: Design Dashboard Layout1 小時)
2. ✅ Task 1.13.2: Create Dashboard Route1.5 小時)
3. ✅ Task 1.13.3: Implement Quick Stats Section2 小時)
4. ✅ Task 1.13.4: Implement Quick Actions1 小時)
5. ✅ Task 1.13.5: Implement Recent Activity List1 小時)
6. ✅ Task 1.13.6: Implement User Profile Section0.5 小時)
**與 Agent 3 協調:**
- ✅ 依賴 Story 1.12 完成
- ✅ 使用相同的認證機制
---
### Wave 3 協調機制
**特殊注意事項:**
- ⚠️ Agent 3 的 Access Control 修改會影響所有其他 Agents
- ⚠️ Agent 1 的遷移腳本需要訪問 CMS API
- ✅ Agent 2 相對獨立
**建議執行順序:**
1. ✅ Agent 2 先開始Teams Page無依賴
2. ✅ Agent 1 並行開始(遷移腳本)
3. ⚠️ Agent 3 最後開始(等 Agent 1/2 完成一部分)
4. ✅ Agent 4 在 Agent 3 完成後開始
---
## 🚀 Wave 4: 上線準備並行
### 並行組合1.14 + 1.15 + 1.17 → 1.16
**觸發條件:** 所有功能完成
**並行圖:**
```
所有功能完成
├─→ Agent 1: Story 1.14 SEO (8-10 hr)
├─→ Agent 2: Story 1.15 Performance (8-12 hr)
├─→ Agent 3: Story 1.17 Testing (12-16 hr)
└─→ (最後) Agent 4: Story 1.16 Deployment (6-8 hr)
```
**總時間(順序):** 34-46 小時
**總時間(並行):** **22-28 小時**(最長的 Story
**節省時間:** **12-18 小時**35%
---
### Agent 1: Story 1.14 - SEO Implementation
**任務清單:**
1. ✅ Task 1.14.1: Generate Dynamic Sitemap2 小時)
2. ✅ Task 1.14.2: Implement Meta Tags System2 小時)
3. ✅ Task 1.14.3: Create 301 Redirect Map2 小時)
4. ✅ Task 1.14.4: Setup Google Analytics1 小時)
5. ✅ Task 1.14.5: Implement Structured Data2 小時)
6. ✅ Task 1.14.6: SEO Testing and Validation2 小時)
**與其他 Agents 協調:**
- ✅ 需要訪問所有頁面
- ✅ 與 Agent 2 (Performance) 協作(圖片優化)
- ⚠️ 可能需要修改所有頁面的 meta tags
---
### Agent 2: Story 1.15 - Performance Optimization
**任務清單:**
1. ✅ Task 1.15.1: Performance Audit and Baseline2 小時)
2. ✅ Task 1.15.2: Optimize Images3 小時)
3. ✅ Task 1.15.3: Optimize CSS and JavaScript2 小時)
4. ✅ Task 1.15.4: Optimize Font Loading1 小時)
5. ✅ Task 1.15.5: Implement Caching Strategy1.5 小時)
6. ✅ Task 1.15.6: Optimize Critical Rendering Path2 小時)
7. ✅ Task 1.15.7: Final Performance Testing1.5 小時)
**與其他 Agents 協調:**
- ✅ 與 Agent 1 (SEO) 協作(圖片優化)
- ⚠️ 可能需要修改所有頁面的資源加載
- ⚠️ 可能影響 Agent 3 (Testing) 的結果
---
### Agent 3: Story 1.17 - Testing and Quality Assurance
**任務清單:**
1. ✅ Task 1.17.1: Create Test Plan2 小時)
2. ✅ Task 1.17.2: Cross-Browser Testing4 小時)
3. ✅ Task 1.17.3: Responsive Testing2 小時)
4. ✅ Task 1.17.4: Functional Testing4 小時)
5. ✅ Task 1.17.5: Performance Testing3 小時)
6. ✅ Task 1.17.6: Accessibility Testing2 小時)
7. ✅ Task 1.17.7: Security Testing2 小時)
8. ✅ Task 1.17.8: Content Verification4 小時)
9. ✅ Task 1.17.9: Bug Tracking and Resolution2 小時)
10. ✅ Task 1.17.10: Launch Preparation1 小時)
**與其他 Agents 協調:**
- ✅ 需要等待 Agent 1 (SEO) 和 Agent 2 (Performance) 完成
- ✅ 測試所有之前 Agents 的成果
- ⚠️ 發現的 bugs 需要指派給原 Agent 修復
---
### Agent 4: Story 1.16 - Deployment最後執行
**觸發條件:** Stories 1.14, 1.15, 1.17 完成
**任務清單:**
1. ✅ Task 1.16.1: Prepare Frontend Build Configuration1.5 小時)
2. ✅ Task 1.16.2: Configure Backend Deployment2 小時)
3. ✅ Task 1.16.3: Configure Custom Domain1.5 小時)
4. ✅ Task 1.16.4: Setup CI/CD Pipeline2 小時)
5. ✅ Task 1.16.5: Configure Environment Variables1 小時)
6. ✅ Task 1.16.6: Final Deployment and Verification1.5 小時)
**與其他 Agents 協調:**
- ⚠️ **必須最後執行**
- ✅ 需要所有其他 Agents 完成
- ✅ 處理部署過程中發現的問題
---
## 📊 總效益分析
### 時間節省總結
| Wave | 順序執行 | 並行執行 | 節省時間 | 節省比例 |
|------|---------|---------|---------|---------|
| Wave 1 | 24-34 hr | 12-16 hr | 12-18 hr | **50%** |
| Wave 2 | 16-22 hr | 6-8 hr | 10-14 hr | **60%** |
| Wave 3 | 32-39.5 hr | 16-22 hr | 16-17.5 hr | **50%** |
| Wave 4 | 34-46 hr | 22-28 hr | 12-18 hr | **35%** |
| **總計** | **106-141.5 hr** | **56-74 hr** | **50-67.5 hr** | **47%** |
**關鍵發現:**
- ✅ 總時間從 **106-141.5 小時** 縮短到 **56-74 小時**
- ✅ 節省 **50-67.5 小時**47%
- ✅ 原本需要 **10-14 週**,現在只需要 **5-7 週**
---
## 🎯 推薦執行策略
### 最優策略3-Agent Wave 並行
**Wave 1最關鍵**
```
Story 1.4 完成
Agent 1 (Frontend): Story 1.5 Homepage
Agent 2 (Frontend + Content): Story 1.9 Blog
Agent 3 (Frontend): Story 1.10 Portfolio
Agent 4 (Code Review): 支援/審查
```
**預期成果:**
- ✅ 12-16 天完成 Wave 1原本 24-34 天)
- ✅ 最高價值功能提前完成
- ✅ 核心頁面全部可用
---
## 📋 Agent 協調最佳實踐
### 1. 明確的責任劃分
**每個 Agent 應該知道:**
- ✅ 自己的範圍和責任
- ✅ 其他 Agents 的範圍
- ✅ 共享組件和資源
- ✅ 通訊渠道和 sync 時間
### 2. 共享設計系統
**建議提前準備:**
- ✅ Design Tokens顏色、字體、間距
- ✅ 共享組件庫Header, Footer, Layout, Cards
- ✅ API 調用約定
- ✅ CSS 命名規範Tailwind
### 3. 定期 Sync
**建議頻率:**
- 📅 **每日 Sync** 30 分鐘(早上或傍晚)
- 📝 **進度更新:** 共享文檔即時更新
- 💬 **快速問題:** 即時通訊隨時討論
**Sync 內容:**
1. 各 Agent 進度報告
2. 討論遇到的阻礙
3. 協調共享組件
4. 代碼審查
### 4. Git Branching 策略
**推薦策略:**
```bash
# 每個 Agent 使用獨立 branch
git checkout -b wave-1-story-1.5-homepage
git checkout -b wave-1-story-1.9-blog
git checkout -b wave-1-story-1.10-portfolio
# 開發過程中定期 push
git push origin wave-1-story-1.5-homepage
# 完成後提交 Pull Request
# 經過 Code ReviewAgent 4後合併
```
### 5. 共享文檔和通訊
**建議工具:**
- 📝 **進度追蹤:** 共享 Google Sheets/Notion
- 💬 **即時通訊:** Discord/Slack
- 🔄 **代碼審查:** GitHub Pull Request
- 📅 **會議記錄:** 共享文檔
**進度追蹤模板:**
```markdown
## Wave 1 進度追蹤
### Agent 1 (Story 1.5 Homepage)
- [x] Task 1.5.1: Create Homepage in Payload CMS
- [ ] Task 1.5.2: Create index.astro Route (進行中: 60%)
- [ ] Task 1.5.3: Implement Hero Section
- [ ] ...
### Agent 2 (Story 1.9 Blog)
- [ ] ...
### Agent 3 (Story 1.10 Portfolio)
- [ ] ...
### 共享問題
- ⚠️ [Hero Section 樣式不一致]
- ⚠️ [API 調用模式需要統一]
```
---
## ⚠️ 風險和緩解措施
### 風險 1: 代碼衝突
**風險描述:** 多個 Agents 修改相同檔案
**緩解措施:**
- ✅ 明確各自的修改範圍
- ✅ 使用共置設計系統
- ✅ 頻繁同步(每日)
- ✅ Code Review Agent 協助
### 風險 2: 視覺不一致
**風險描述:** 各 Agents 的頁面風格不統一
**緩解措施:**
- ✅ 提前定義 Design Tokens
- ✅ 共享組件庫
- ✅ 定期視覺審查
- ✅ Code Review Agent 檢查
### 風險 3: API 調用不一致
**風險描述:** 各 Agents 的 Payload API 調用模式不同
**緩解措施:**
- ✅ 提前約定 API 調用約定
- ✅ 共享 API utility functions
- ✅ Code Review Agent 檢查
### 風險 4: 進度不平衡
**風險描述:** 某個 Agents 進度落後,影響整體
**緩解措施:**
- ✅ 每日 sync 追蹤進度
- ✅ Agent 4 可協助落後的 Agent
- ✅ 預留 buffer time
---
## 📊 Agent 技能需求
### Frontend Agent需求最多
**所需技能:**
- ✅ Astro 框架
- ✅ TypeScript
- ✅ Tailwind CSS
- ✅ Payload CMS API
- ✅ Responsive Design
- ✅ Component 開發
**適合 Stories**
- 1.5 Homepage
- 1.9 Blog System
- 1.10 Portfolio
- 1.6 About Page
- 1.7 Solutions Page
- 1.8 Contact Page
- 1.11 Teams Page
---
### Content Agent
**所需技能:**
- ✅ TypeScript/Node.js
- ✅ Payload CMS API
- ✅ Webflow API
- ✅ 數據處理和轉換
- ✅ 圖片處理
**適合 Stories**
- 1.3 Content Migration
---
### System Agent
**所需技能:**
- ✅ Payload CMS 深度知識
- ✅ Authentication/Authorization
- ✅ Access Control
- ✅ System Security
**適合 Stories**
- 1.2 Phase 3 (Access Control)
- 1.12 Authentication
- 1.13 Admin Dashboard
---
### Quality Agent
**所需技能:**
- ✅ SEO Optimization
- ✅ Performance Optimization
- ✅ Testing (QA)
- ✅ Accessibility
- ✅ Security
**適合 Stories**
- 1.14 SEO
- 1.15 Performance
- 1.17 Testing
- 1.16 Deployment
---
### Code Review Agent全程支援
**所需技能:**
- ✅ Code Review
- ✅ Best Practices
- ✅ Bug Detection
- ✅ Consistency Checking
**職責:**
- 🔍 審查所有 Agents 的代碼
- 🐛 發現潛在問題
- 📝 確保代碼一致性
- 🎨 確保視覺一致性
---
## 🎯 執行建議
### 立即執行(今天)
**Wave 0單 Agent**
- ✅ Story 1.1: 完成基礎設施40 分鐘)
- ✅ Story 1.2 Phase 1-2: Collections2.5 小時)
### 明天開始Wave 13-4 Agents 並行)
**推薦配置:**
- ✅ Agent 1 (Frontend): Story 1.5 Homepage
- ✅ Agent 2 (Frontend + Content): Story 1.9 Blog
- ✅ Agent 3 (Frontend): Story 1.10 Portfolio
- ✅ Agent 4 (Code Review): 支援和審查
**預期成果:**
- ✅ 12-16 天完成 Wave 1
- ✅ 核心功能全部可用
---
## 📚 參考文檔
**相關文檔:**
1. `docs/prd/priority-reassessment.md` - 優先級評估
2. `docs/prd/payload-cms-modification-plan.md` - Story 1.2 詳細計劃
3. `docs/prd/epic-1-stories-1.3-1.17-tasks.md` - 所有 Stories 任務定義
**技術文檔:**
- Payload CMS Docs: https://payloadcms.com/docs
- Astro Docs: https://docs.astro.build
- Tailwind CSS Docs: https://tailwindcss.com/docs
---
**文檔版本:** v1.0
**最後更新:** 2025-01-30
**適用於:** Epic 1 - Webflow to Payload CMS + Astro Migration
**狀態:** ✅ Multi-Agent 並行執行策略完成

View File

@@ -0,0 +1,913 @@
# Payload CMS 修改計劃 - Story 1.2 詳細規劃
**建立日期:** 2025-01-30
**適用範圍:** Story 1.2 - Payload CMS Collections Definition
**目標:** 完善所有 Collections 以符合 PRD 需求
---
## 📊 執行摘要
### 當前狀態
| Collection | 完成度 | 缺失項目 | 優先級 | 預估時間 |
|-----------|--------|---------|--------|---------|
| Portfolio | ❌ 0% | 整個 Collection | 🔴 P0 | 1 小時 |
| Categories | ⚠️ 40% | 4 個欄位 | 🔴 P0 | 30 分鐘 |
| Posts | ⚠️ 60% | 4 個欄位 | 🟡 P1 | 30 分鐘 |
| Users | ⚠️ 70% | 1 個欄位 | 🟡 P1 | 30 分鐘 |
| Access Control | ⚠️ 50% | 2 個函數 | 🟡 P1 | 1 小時 |
**總預估時間:** 4 小時
---
## 🎯 實作策略
### 階段劃分
**Phase 1: Critical Blockers必須優先**
- 目標:解除 Story 1.9 (Blog) 和 1.10 (Portfolio) 的阻礙
- 時間1.5 小時
- 內容:
- Task 1.2.1: 創建 Portfolio Collection
- Task 1.2.2: 完善 Categories Collection
**Phase 2: Content Enhancement次要優先**
- 目標:完善內容管理功能
- 時間1 小時
- 內容:
- Task 1.2.3: 完善 Posts Collection
- Task 1.2.4: 完善 Users Collection
**Phase 3: Security & Access最後**
- 目標:實現角色權限系統
- 時間1.5 小時
- 內容:
- Task 1.2.5: 創建 Access Control 函數
- Task 1.2.6: 應用 Access Control
- Task 1.2.7: 驗證和測試
---
## 📋 詳細任務定義
### Task 1.2.1: 創建 Portfolio Collection
**User Story:**
```gherkin
As a Developer,
I want to create a Portfolio collection in Payload CMS,
So that website projects can be stored and managed.
Acceptance Criteria:
- Portfolio collection exists with slug 'portfolio'
- Has 7 required fields: title, slug, url, image, description, websiteType, tags
- Image field uploads to R2 storage
- Access control: authenticated users can read, admins can edit
- Collection appears in admin sidebar
```
**Definition of Done:**
- [ ] Collection config file created at `apps/backend/src/collections/Portfolio/index.ts`
- [ ] All 7 fields defined with correct types
- [ ] Admin UI labels configured (Chinese)
- [ ] Access control functions applied
- [ ] Registered in `payload.config.ts`
- [ ] Types regenerated successfully (`pnpm generate:types`)
- [ ] Verified in admin panel
**檔案結構:**
```
apps/backend/src/collections/Portfolio/
├── index.ts # Main collection config
└── hooks/ # Optional hooks (if needed)
```
**完整欄位定義:**
```typescript
// apps/backend/src/collections/Portfolio/index.ts
import type { CollectionConfig } from 'payload'
import { authenticated } from '../../access/authenticated'
import { anyone } from '../../access/anyone'
import { slugField } from '@/fields/slug'
export const Portfolio: CollectionConfig = {
slug: 'portfolio',
access: {
create: authenticated,
read: anyone,
update: authenticated,
delete: authenticated,
},
admin: {
useAsTitle: 'title',
defaultColumns: ['title', 'websiteType', 'updatedAt', 'createdAt'],
},
fields: [
{
name: 'title',
type: 'text',
required: true,
label: '專案標題',
},
{
name: 'url',
type: 'text',
label: '外部連結',
admin: {
description: '前往此專案網站的連結(可選)',
},
},
{
name: 'image',
type: 'upload',
relationTo: 'media',
required: true,
label: '專案圖片',
},
{
name: 'description',
type: 'textarea',
label: '專案描述',
admin: {
description: '簡短描述此專案的特點',
},
},
{
name: 'websiteType',
type: 'select',
required: true,
label: '網站類型',
options: [
{ label: '一頁式銷售', value: 'landing-page' },
{ label: '客戶預約', value: 'booking' },
{ label: '企業官網', value: 'corporate' },
{ label: '電商網站', value: 'ecommerce' },
{ label: '其他', value: 'other' },
],
},
{
name: 'tags',
type: 'array',
label: '標籤',
fields: [
{
name: 'tag',
type: 'text',
},
],
},
...slugField(),
],
hooks: {
beforeChange: [
({ data, operation }) => {
// Auto-generate slug from title if creating
if (operation === 'create' && !data.slug) {
return {
...data,
slug: data.title
.toLowerCase()
.replace(/[^\w\s-]/g, '')
.replace(/\s+/g, '-'),
}
}
return data
},
],
},
}
```
**更新 payload.config.ts**
```typescript
// 在 apps/backend/src/payload.config.ts
import { Portfolio } from './collections/Portfolio'
// 在 collections array 中添加
collections: [Pages, Posts, Media, Categories, Users, Portfolio],
```
**預估時間:** 1 小時
---
### Task 1.2.2: 完善 Categories Collection
**User Story:**
```gherkin
As a Developer,
I want to add missing fields to Categories collection,
So that blog categories have complete metadata for theming.
Acceptance Criteria:
- nameEn field added (English name)
- order field added (sorting, default: 0)
- textColor field added (with color picker)
- backgroundColor field added (with color picker)
- All fields appear in admin UI
- Fields are editable and save correctly
```
**Definition of Done:**
- [ ] 4 new fields added to Categories collection
- [ ] Admin UI configured with proper labels (Chinese)
- [ ] Color picker enabled for color fields
- [ ] Types regenerated successfully
- [ ] Tested in admin panel
**修改檔案:** `apps/backend/src/collections/Categories.ts`
**新增欄位定義:**
```typescript
export const Categories: CollectionConfig = {
slug: 'categories',
access: {
create: authenticated,
delete: authenticated,
read: anyone,
update: authenticated,
},
admin: {
useAsTitle: 'title',
defaultColumns: ['title', 'order', 'updatedAt'],
},
fields: [
{
name: 'title',
type: 'text',
required: true,
label: '分類名稱(中文)',
},
{
name: 'nameEn', // ✨ 新增
type: 'text',
label: '英文名稱',
admin: {
description: '用於 URL 或國際化',
},
},
{
name: 'order', // ✨ 新增
type: 'number',
label: '排序順序',
defaultValue: 0,
admin: {
position: 'sidebar',
description: '數字越小越靠前',
},
},
{
name: 'textColor', // ✨ 新增
type: 'text',
label: '文字顏色',
defaultValue: '#000000',
admin: {
description: '十六進制顏色碼,例如 #000000',
},
},
{
name: 'backgroundColor', // ✨ 新增
type: 'text',
label: '背景顏色',
defaultValue: '#ffffff',
admin: {
description: '十六進制顏色碼,例如 #ffffff',
},
},
...slugField(),
],
}
```
**預估時間:** 30 分鐘
---
### Task 1.2.3: 完善 Posts Collection
**User Story:**
```gherkin
As a Developer,
I want to add missing fields to Posts collection,
So that blog posts have complete metadata for display and SEO.
Acceptance Criteria:
- excerpt field added (textarea, 200 char limit)
- ogImage field added (upload to media, separate from heroImage)
- showInFooter field added (checkbox, default: false)
- status field added (select: draft, review, published)
- All fields appear in post editor
- Fields save and load correctly
```
**Definition of Done:**
- [ ] 4 new fields added to Posts collection
- [ ] Admin UI configured with proper labels
- [ ] excerpt field has character limit (200)
- [ ] ogImage has image preview
- [ ] Types regenerated successfully
- [ ] Tested creating/editing a post
**修改檔案:** `apps/backend/src/collections/Posts/index.ts`
**新增欄位定義:**
```typescript
// 在 fields array 的 Content tab 中添加
{
name: 'excerpt', // ✨ 新增
type: 'text',
label: '文章摘要',
admin: {
description: '顯示在文章列表頁,建議 150-200 字',
multiline: true,
},
maxLength: 200,
}
// 在 Content tab 中添加heroImage 之後)
{
name: 'ogImage', // ✨ 新增
type: 'upload',
relationTo: 'media',
label: '社群分享圖片',
admin: {
description: 'Facebook/LINE 分享時顯示的預覽圖,建議 1200x630px',
},
}
// 在 Meta tab (sidebar) 中添加
{
name: 'showInFooter', // ✨ 新增
type: 'checkbox',
label: '顯示在頁腳',
defaultValue: false,
admin: {
position: 'sidebar',
},
}
// 在 sidebar 中添加publishedAt 附近)
{
name: 'status', // ✨ 新增
type: 'select',
label: '文章狀態',
defaultValue: 'draft',
options: [
{ label: '草稿', value: 'draft' },
{ label: '審核中', value: 'review' },
{ label: '已發布', value: 'published' },
],
admin: {
position: 'sidebar',
},
}
```
**預估時間:** 30 分鐘
---
### Task 1.2.4: 完善 Users Collection
**User Story:**
```gherkin
As an Admin,
I want to assign roles to users,
So that I can control who has access to different features.
Acceptance Criteria:
- role field added to Users collection (admin, editor)
- Default value is 'editor'
- Field appears in user editor
- Existing users can be updated
```
**Definition of Done:**
- [ ] role field added to Users collection
- [ ] Default value: 'editor'
- [ ] Admin UI configured with Chinese labels
- [ ] Types regenerated successfully
- [ ] Tested with both admin and editor users
**修改檔案:** `apps/backend/src/collections/Users/index.ts`
**新增欄位定義:**
```typescript
export const Users: CollectionConfig = {
slug: 'users',
access: {
admin: authenticated,
create: authenticated,
delete: authenticated,
read: authenticated,
update: authenticated,
},
admin: {
defaultColumns: ['name', 'email', 'role'],
useAsTitle: 'name',
},
auth: true,
fields: [
{
name: 'name',
type: 'text',
label: '姓名',
},
{
name: 'role', // ✨ 新增
type: 'select',
label: '角色',
defaultValue: 'editor',
required: true,
options: [
{
label: '管理員',
value: 'admin',
},
{
label: '編輯者',
value: 'editor',
},
],
admin: {
position: 'sidebar',
},
},
],
timestamps: true,
}
```
**預估時間:** 30 分鐘
---
### Task 1.2.5: 創建 Access Control 函數
**User Story:**
```gherkin
As an Admin,
I want different access levels for admins and editors,
So that editors can only manage content, not system settings.
Acceptance Criteria:
- adminOnly() access function created
- adminOrEditor() access function created
- Functions check user.role field
- Functions return boolean
```
**Definition of Done:**
- [ ] adminOnly.ts file created
- [ ] adminOrEditor.ts file created
- [ ] Functions check user.role correctly
- [ ] TypeScript types correct
**創建檔案 1** `apps/backend/src/access/adminOnly.ts`
```typescript
import type { Access } from 'payload'
/**
* 僅允許 Admin 角色訪問
*
* 用例:
* - Users collection (敏感操作)
* - Globals (Header/Footer)
* - System settings
*/
export const adminOnly: Access = ({ req: { user } }) => {
return user?.role === 'admin'
}
```
**創建檔案 2** `apps/backend/src/access/adminOrEditor.ts`
```typescript
import type { Access } from 'payload'
/**
* 允許 Admin 或 Editor 角色訪問
*
* 用例:
* - Posts/Pages collection (內容管理)
* - Categories collection (內容分類)
* - Portfolio collection (作品管理)
*/
export const adminOrEditor: Access = ({ req: { user } }) => {
if (!user) return false
return user?.role === 'admin' || user?.role === 'editor'
}
```
**預估時間:** 30 分鐘
---
### Task 1.2.6: 應用 Access Control
**User Story:**
```gherkin
As an Admin,
I want access control applied to all collections,
So that role-based permissions work correctly.
Acceptance Criteria:
- Users collection: delete restricted to admins
- Posts/Pages: create/update/delete restricted to adminOrEditor
- Categories/Portfolio: create/update/delete restricted to adminOrEditor
- Globals: update restricted to admins
- All collections read access preserved
```
**Definition of Done:**
- [ ] Users collection updated with adminOnly
- [ ] Posts collection updated with adminOrEditor
- [ ] Pages collection updated with adminOrEditor
- [ ] Categories collection updated with adminOrEditor
- [ ] Portfolio collection updated with adminOrEditor
- [ ] Header global updated with adminOnly
- [ ] Footer global updated with adminOnly
- [ ] Types regenerated
- [ ] Tested with both admin and editor users
**修改檔案 1** `apps/backend/src/collections/Users/index.ts`
```typescript
import { adminOnly } from '../../access/adminOnly'
export const Users: CollectionConfig = {
slug: 'users',
access: {
admin: adminOnly, // ❌ 改為 adminOnly
create: adminOnly, // ❌ 改為 adminOnly
delete: adminOnly, // ❌ 改為 adminOnly
read: authenticated, // ✅ 保持
update: adminOnly, // ❌ 改為 adminOnly
},
// ...
}
```
**修改檔案 2** `apps/backend/src/collections/Posts/index.ts`
```typescript
import { adminOrEditor } from '../../access/adminOrEditor'
export const Posts: CollectionConfig = {
slug: 'posts',
access: {
create: adminOrEditor, // ❌ 改為 adminOrEditor
delete: adminOrEditor, // ❌ 改為 adminOrEditor
read: authenticatedOrPublished, // ✅ 保持
update: adminOrEditor, // ❌ 改為 adminOrEditor
},
// ...
}
```
**修改檔案 3** `apps/backend/src/collections/Pages/index.ts`
```typescript
import { adminOrEditor } from '../../access/adminOrEditor'
export const Pages: CollectionConfig = {
slug: 'pages',
access: {
create: adminOrEditor, // ❌ 改為 adminOrEditor
delete: adminOrEditor, // ❌ 改為 adminOrEditor
read: authenticatedOrPublished, // ✅ 保持
update: adminOrEditor, // ❌ 改為 adminOrEditor
},
// ...
}
```
**修改檔案 4** `apps/backend/src/collections/Categories.ts`
```typescript
import { adminOrEditor } from '../access/adminOrEditor'
export const Categories: CollectionConfig = {
slug: 'categories',
access: {
create: adminOrEditor, // ❌ 改為 adminOrEditor
delete: adminOrEditor, // ❌ 改為 adminOrEditor
read: anyone, // ✅ 保持(公開可讀)
update: adminOrEditor, // ❌ 改為 adminOrEditor
},
// ...
}
```
**修改檔案 5** `apps/backend/src/collections/Portfolio/index.ts`
```typescript
import { adminOrEditor } from '../../access/adminOrEditor'
import { anyone } from '../../access/anyone'
export const Portfolio: CollectionConfig = {
slug: 'portfolio',
access: {
create: adminOrEditor, // ❌ 使用 adminOrEditor
read: anyone, // ✅ 公開可讀
update: adminOrEditor, // ❌ 使用 adminOrEditor
delete: adminOrEditor, // ❌ 使用 adminOrEditor
},
// ...
}
```
**修改檔案 6** `apps/backend/src/Header/config.ts`
```typescript
import { adminOnly } from '../access/adminOnly'
export const Header: GlobalConfig = {
slug: 'header',
access: {
read: anyone, // ✅ 公開可讀
update: adminOnly, // ❌ 僅 Admin 可編輯
},
// ...
}
```
**修改檔案 7** `apps/backend/src/Footer/config.ts`
```typescript
import { adminOnly } from '../access/adminOnly'
export const Footer: GlobalConfig = {
slug: 'footer',
access: {
read: anyone, // ✅ 公開可讀
update: adminOnly, // ❌ 僅 Admin 可編輯
},
// ...
}
```
**預估時間:** 30 分鐘
---
### Task 1.2.7: 驗證和測試
**User Story:**
```gherkin
As a QA Engineer,
I want to verify all collections work correctly,
So that content management is functional.
Acceptance Criteria:
- All collections appear in admin sidebar
- All fields are editable in admin UI
- Role-based access control works correctly
- Media uploads to R2 successfully
- Rich text editor works in Posts
- Can create users with different roles
```
**Definition of Done:**
- [ ] All 6 collections visible in sidebar (Pages, Posts, Media, Categories, Users, Portfolio)
- [ ] Created test portfolio item with all 7 fields
- [ ] Created test category with all 6 fields
- [ ] Created test post with all 13 fields
- [ ] Created admin and editor users
- [ ] Verified access restrictions:
- [ ] Admin can delete users, editor cannot
- [ ] Admin can edit Header/Footer, editor cannot
- [ ] Both can create/edit Posts/Pages
- [ ] Documented any issues
**測試腳本:**
```typescript
// 測試檔案: apps/backend/src/scripts/test-collections.ts
// 可選:創建自動化測試腳本
console.log('🧪 Testing Collections...')
// 1. 測試 Portfolio Collection
console.log('✓ Portfolio collection exists')
console.log('✓ Can create portfolio item')
console.log('✓ Image uploads to R2')
// 2. 測試 Categories Collection
console.log('✓ Categories collection has 6 fields')
console.log('✓ Color fields work')
// 3. 測試 Posts Collection
console.log('✓ Posts collection has 13 fields')
console.log('✓ Excerpt limits to 200 chars')
console.log('✓ OG image uploads')
// 4. 測試 Users Collection
console.log('✓ Users collection has role field')
console.log('✓ Can create admin user')
console.log('✓ Can create editor user')
// 5. 測試 Access Control
console.log('✓ Admin can delete users')
console.log('✓ Editor cannot delete users')
console.log('✓ Admin can edit Header/Footer')
console.log('✓ Editor cannot edit Header/Footer')
console.log('✓ Both can create/edit Posts')
console.log('✅ All tests passed!')
```
**預估時間:** 1 小時
---
## 🔗 相關 Stories 更新
### Story 1.9: Blog System依賴 Story 1.2
**更新後的依賴:**
```gherkin
Story 1.2 must be completed first:
- Categories collection needs textColor/backgroundColor for theming
- Posts collection needs excerpt for list display
- Posts collection needs status for filtering
```
**Task 1.9.2Blog Listing Page更新**
```diff
+ 從 Payload API 載入已發布文章status: 'published'
+ 顯示 category badge使用 category.textColor/backgroundColor
+ 顯示文章摘要(使用 post.excerpt
```
**Task 1.9.4Category Page更新**
```diff
+ 分類顏色主題(使用 category.textColor/backgroundColor
+ Badge 使用動態顏色
```
### Story 1.10: Portfolio依賴 Story 1.2
**更新後的依賴:**
```gherkin
Story 1.2 must be completed first:
- Portfolio collection must exist
- All 7 fields must be defined
```
**Task 1.10.1Design Portfolio Architecture更新**
```diff
- 決定是否使用 Payload CMS collection
+ Portfolio collection 已在 Story 1.2 創建
- 欄位規劃
+ 欄位已在 Story 1.2 定義title, slug, url, image, description, websiteType, tags
```
**Task 1.10.2Implement Portfolio Listing Page更新**
```diff
+ 2-column grid 佈局
+ Portfolio card 顯示:
+ - Project image (image)
+ - Project title (title)
+ - Description (description)
+ - Tags (tags array)
+ - Website type badge (websiteType)
```
### Story 1.12: Authentication依賴 Story 1.2
**更新後的依賴:**
```gherkin
Story 1.2 Phase 3 must be completed first:
- Users collection must have role field
- Access control functions must exist (adminOnly, adminOrEditor)
- All collections must apply access control
```
**Task 1.12.5Implement Role-Based Access Control更新**
```diff
- Users collection 添加 role 欄位
+ Users collection 已在 Story 1.2 Task 1.2.4 添加 role 欄位
- 建立 access/adminOnly.ts
+ access/adminOnly.ts 已在 Story 1.2 Task 1.2.5 創建
- 建立 access/adminOrEditor.ts
+ access/adminOrEditor.ts 已在 Story 1.2 Task 1.2.5 創建
- 更新 Collections 的 access rules
+ Collections 已在 Story 1.2 Task 1.2.6 應用 access rules
+ 此 Task 改為測試驗證角色權限
```
---
## 📊 更新後的時間線
### Story 1.2: Payload CMS Collections Definition
| Phase | Task | 內容 | 預估時間 |
|-------|------|------|---------|
| Phase 1 | 1.2.1 | 創建 Portfolio Collection | 1 小時 |
| Phase 1 | 1.2.2 | 完善 Categories Collection | 30 分鐘 |
| Phase 2 | 1.2.3 | 完善 Posts Collection | 30 分鐘 |
| Phase 2 | 1.2.4 | 完善 Users Collection | 30 分鐘 |
| Phase 3 | 1.2.5 | 創建 Access Control 函數 | 30 分鐘 |
| Phase 3 | 1.2.6 | 應用 Access Control | 30 分鐘 |
| Phase 3 | 1.2.7 | 驗證和測試 | 1 小時 |
| **總計** | | | **4 小時** |
### Sprint 影響
**Sprint 0原計劃:** 8-12 小時
- Story 1.1: 40 分鐘
- Story 1.2: 4 小時 ← **更新後**
- **總計:** 4.5-5 小時(比原計劃減少約 50%
**原因:**
- 原計劃高估了複雜度
- Payload CMS 的架構非常清晰
- Access control 模式簡單一致
---
## ✅ 最終驗收標準
### Collection 完整性
- [x] Portfolio: 7/7 欄位 ✅
- [x] Categories: 6/6 欄位 ✅
- [x] Posts: 13/13 欄位 ✅
- [x] Users: 4/4 欄位 ✅
- [x] Media: 100% ✅(已完整)
- [x] Pages: 100% ✅(已完整)
### Access Control 完整性
- [x] 5 個 access 函數 ✅
- anyone ✅
- authenticated ✅
- authenticatedOrPublished ✅
- adminOnly ✅(新增)
- adminOrEditor ✅(新增)
### 功能驗收
- [x] 所有 collections 在 admin panel 可見
- [x] 所有欄位可編輯
- [x] 角色權限正確執行
- [x] Media 上傳到 R2
- [x] Rich text editor 正常
- [x] 型別生成成功
---
## 📝 備註
### Webflow 欄位對應表
#### Portfolio Collection
| Webflow 欄位 | Payload 欄位 | 轉換規則 |
|-------------|-------------|---------|
| Name | title | 直接對應 |
| Slug | slug | 保留原始值 |
| Website Link | url | 直接對應 |
| Preview Image | image | 上傳到 R2 |
| Description | description | 直接對應 |
| Website Type | websiteType | Select options |
| Tags | tags | String array |
#### Categories Collection
| Webflow 欄位 | Payload 欄位 | 轉換規則 |
|-------------|-------------|---------|
| Name | title | 直接對應 |
| Slug | slug | 保留原始值 |
| - | nameEn | ❌ 需手動新增 |
| - | order | ❌ 預設 0手動調整 |
| Color | textColor/backgroundColor | 拆分為兩個欄位 |
#### Posts Collection
| Webflow 欄位 | Payload 欄位 | 轉換規則 |
|-------------|-------------|---------|
| Title | title | 直接對應 |
| Slug | slug | 保留原始值 |
| Body | content | Richtext → Lexical JSON |
| Published Date | publishedAt | ISO 8601 |
| Post Category | categories | 關聯 Categories |
| Featured Image | heroImage | 上傳到 R2 |
| SEO Title | meta.title | SEO plugin |
| SEO Description | meta.description | SEO plugin |
| - | excerpt | ❌ 需手動新增 |
| - | ogImage | ❌ 需手動上傳 |
| - | showInFooter | ❌ 預設 false |
| - | status | ❌ 根據 published 判斷 |
---
**文檔版本:** v1.0
**最後更新:** 2025-01-30
**適用於:** Payload CMS 3.59.1
**相關文檔:**
- `docs/prd/epic-1-execution-plan.md`
- `docs/prd/epic-1-stories-1.3-1.17-tasks.md`
- `docs/prd/payload-cms-slimming-report.md`

View File

@@ -0,0 +1,604 @@
# Payload CMS 瘦身分析報告
## 執行摘要
經過詳細分析 `/Users/pukpuk/Dev/website-enchun-mgr/apps/backend/src/payload.config.ts` 和相關配置,發現多個可以移除的不必要功能。預估可減少約 **15-20%** 的依賴大小和 bundle 大小。
---
## 可移除的功能
### 1. GraphQL 核心依賴 ⭐ 高優先級
**當前配置:**
```json
// package.json line 50
"graphql": "^16.8.2"
```
**依賴大小:** ~2.4 MB (包含相關依賴 graphql-http, graphql-scalars 等)
**使用場景:**
- Payload CMS v3 預設使用 GraphQL 作為查詢語言
- 但前端完全使用 REST API
- payload-types.ts 中沒有生成任何 GraphQL 型別
**是否使用:** ❌ 未使用
**檢查結果:**
- 前端所有 API 呼叫都是 REST (`/api/pages`, `/api/posts`)
- 沒有找到任何 GraphQL query 或 mutation
- 註解中提到 "GraphQL will also not return mutated user data" 但實際上沒有使用
**移除建議:**
這是**最大的瘦身機會**。雖然 Payload CMS v3 核心依賴 GraphQL但可以透過以下方式優化
1. Payload CMS 3.59.1 預設包含 GraphQL無法完全移除它是核心依賴
2. **但可以移除相關的 GraphQL 依賴套件**,如 graphql-scalars, graphql-http
3. 在未來版本中Payload 可能會提供「無 GraphQL」的構建選項
**影響範圍:**
- 無實際影響(未使用任何 GraphQL 功能)
- 可移除 ~1-2 MB 的相關依賴
---
### 2. Form Builder Plugin ⭐ 高優先級
**當前配置:**
```typescript
// /Users/pukpuk/Dev/website-enchun-mgr/apps/backend/src/plugins/index.ts lines 58-83
formBuilderPlugin({
fields: {
payment: false,
},
// ...
})
```
**依賴大小:** ~532 KB
**使用場景:**
- 允許管理員在後台動態建立表單
- 自動處理表單提交和儲存
**是否使用:** ❌ 未使用
**檢查結果:**
- payload-types.ts 顯示生成了 `forms``form-submissions` collections
- 前端只有 `/contact-us.astro` 有一個靜態表單
- 前端表單使用 `alert('Form submitted (placeholder)')` - 完全沒有連接到 Payload
- 沒有找到任何 `FormBlock` 的使用
**移除建議:**
1. **完全移除 Form Builder Plugin**
2. 如果將來需要聯絡表單,使用:
- 方案 A: 建立自定義 `ContactMessages` collection
- 方案 B: 使用第三方服務 (Formspree, Netlify Forms)
- 方案 C: 使用 Server Actions
**移除步驟:**
```bash
# 1. 移除依賴
pnpm remove @payloadcms/plugin-form-builder
# 2. 編輯 /apps/backend/src/plugins/index.ts
# 移除 formBuilderPlugin 的 import 和使用
# 3. 移除 FormBlock (如果存在)
rm -rf /apps/backend/src/blocks/Form
```
**影響範圍:**
- 減少 532 KB
- 移除 `forms``form-submissions` collections
- 管理後台會少一個表單管理選項
---
### 3. Nested Docs Plugin ⭐ 中優先級
**當前配置:**
```typescript
// /Users/pukpuk/Dev/website-enchun-mgr/apps/backend/src/plugins/index.ts lines 50-53
nestedDocsPlugin({
collections: ['categories'],
generateURL: (docs) => docs.reduce((url, doc) => `${url}/${doc.slug}`, ''),
})
```
**依賴大小:** ~216 KB
**使用場景:**
- 支援巢狀的文件結構(例如:分類可以有子分類)
- 自動生成巢狀 URL
**是否使用:** ⚠️ 可能不需要
**檢查結果:**
- 只應用於 `categories` collection
- Categories 是非常簡單的結構(只有 title 和 slug
- 沒有看到父子分類的實際使用
- URL 結構:`/wen-zhang-fen-lei/[slug]` (單層)
**移除建議:**
如果確認不需要分層分類,可以移除:
1. 檢查是否有「父分類」和「子分類」的需求
2. 如果只需要平面分類列表,移除此 plugin
3. 如果將來需要巢狀結構,可以用 relation-to-self 實現
**移除步驟:**
```bash
# 1. 移除依賴
pnpm remove @payloadcms/plugin-nested-docs
# 2. 編輯 /apps/backend/src/plugins/index.ts
# 移除 nestedDocsPlugin 的 import 和使用
```
**影響範圍:**
- 減少 216 KB
- 分類 URL 變成單層:`/categories/[slug]` 而非 `/categories/parent/child`
---
### 4. Search Plugin ⭐ 中優先級
**當前配置:**
```typescript
// /Users/pukpuk/Dev/website-enchun-mgr/apps/backend/src/plugins/index.ts lines 84-92
searchPlugin({
collections: ['posts'],
beforeSync: beforeSyncWithSearch,
searchOverrides: {
fields: ({ defaultFields }) => {
return [...defaultFields, ...searchFields]
},
},
})
```
**依賴大小:** ~304 KB
**使用場景:**
- 提供後台搜尋功能
- 索引 collection 資料以提供快速搜尋
- 生成 `search` collection
**是否使用:** ⚠️ 僅後台使用
**檢查結果:**
- 只索引 `posts` collection
- payload-types.ts 顯示生成了 `search` collection
- **前端沒有使用搜尋功能**(檢查了所有前端檔案)
- 可能只在管理後台使用
**移除建議:**
1. 如果前端不需要搜尋功能,可以移除
2. 如果只需要簡單的前端搜尋,可以:
- 使用 Payload 的 REST API `_q` 參數進行模糊搜尋
- 使用 Algolia, Meilisearch 等第三方搜尋服務
3. 如果後台編輯體驗需要搜尋,保留
**移除步驟:**
```bash
# 1. 移除依賴
pnpm remove @payloadcms/plugin-search
# 2. 編輯 /apps/backend/src/plugins/index.ts
# 移除 searchPlugin 的 import 和使用
# 3. 移除搜尋相關檔案
rm -rf /apps/backend/src/search
rm -rf /apps/backend/src/hooks/revalidateRedirects.ts (如果只與搜尋相關)
```
**影響範圍:**
- 減少 304 KB
- 移除 `search` collection
- 管理後台失去內容搜尋功能
---
### 5. Redirects Plugin ⭐ 低優先級
**當前配置:**
```typescript
// /Users/pukpuk/Dev/website-enchun-mgr/apps/backend/src/plugins/index.ts lines 28-49
redirectsPlugin({
collections: ['pages', 'posts'],
overrides: {
fields: ({ defaultFields }) => {
return defaultFields.map((field) => {
if ('name' in field && field.name === 'from') {
return {
...field,
admin: {
description: 'You will need to rebuild the website when changing this field.',
},
}
}
return field
})
},
hooks: {
afterChange: [revalidateRedirects],
},
},
})
```
**依賴大小:** ~92 KB
**使用場景:**
- 管理頁面重新導向(例如:舊 URL → 新 URL
- 避免連結失效時的 404 錯誤
- SEO 最佳實踐
**是否使用:** ⚠️ 間接使用
**檢查結果:**
- 前端沒有直接使用 redirects API
- 但有 `revalidateRedirects` hook
- payload-types.ts 顯示生成了 `redirects` collection
**移除建議:**
1. **建議保留** - 這對 SEO 和網站維護很重要
2. 如果確定不需要重新導向功能:
- 使用 Cloudflare Workers / Nginx 處理重新導向
- 使用 Astro/Next.js 的 middleware 處理
**移除步驟:**
```bash
# 1. 移除依賴
pnpm remove @payloadcms/plugin-redirects
# 2. 編輯 /apps/backend/src/plugins/index.ts
# 移除 redirectsPlugin 的 import 和使用
# 3. 移除相關 hooks
rm /apps/backend/src/hooks/revalidateRedirects.ts
```
**影響範圍:**
- 減少 92 KB
- 移除 `redirects` collection
- 失去視覺化的重新導向管理介面
---
### 6. Payload Cloud Plugin ⭐ 低優先級
**當前配置:**
```typescript
// /Users/pukpuk/Dev/website-enchun-mgr/apps/backend/src/plugins/index.ts line 93
payloadCloudPlugin()
```
**依賴大小:** Plugin 本身很小,但包含 Cloudflare 部署整合
**使用場景:**
- Payload 官方的雲端託管服務
- 一鍵部署到 Payload Cloud
**是否使用:** ❌ 未使用
**檢查結果:**
- 使用 Docker + Coolify 部署(見 docker-compose.coolify.yml
- 不使用 Payload Cloud
**移除建議:**
如果確定不會使用 Payload Cloud可以移除
1. 不影響自託管部署
2. 只是多了一個「Deploy to Payload Cloud」按鈕
**移除步驟:**
```bash
# 1. 移除依賴
pnpm remove @payloadcms/payload-cloud
# 2. 編輯 /apps/backend/src/plugins/index.ts
# 移除 payloadCloudPlugin 的 import 和使用
```
**影響範圍:**
- 減少少量依賴
- 移除 Payload Cloud 整合
---
### 7. Live Preview 功能 ⭐ 低優先級
**當前配置:**
```typescript
// /Users/pukpuk/Dev/website-enchun-mgr/apps/backend/src/payload.config.ts lines 37-58
livePreview: {
breakpoints: [
{ label: 'Mobile', name: 'mobile', width: 375, height: 667 },
{ label: 'Tablet', name: 'tablet', width: 768, height: 1024 },
{ label: 'Desktop', name: 'desktop', width: 1440, height: 900 },
],
}
```
**依賴大小:** 包含在 `@payloadcms/live-preview-react` (~大小需確認)
**使用場景:**
- 即時預覽內容編輯結果
- 管理後台的並排預覽
**是否使用:** ⚠️ 編輯者可能使用
**檢查結果:**
- Pages 和 Posts collections 都有配置 livePreview URL
- 前端有 `/admin/dashboard.astro` - 可能有使用
- 如果內容編輯者需要預覽功能,保留
**移除建議:**
1. 如果內容編輯者需要預覽,保留
2. 如果只是簡單的部落格,不需要即時預覽,可以移除
3. 移除後仍可以手動開啟新分頁預覽
**移除步驟:**
```typescript
// 編輯 /apps/backend/src/payload.config.ts
// 移除 admin.livePreview 配置
// 移除 collections 中的 livePreview 配置
```
**影響範圍:**
- 減少少量依賴
- 失去管理後台的即時預覽功能
---
## Bundle 大小對比
### 當前狀態
```
node_modules/@payloadcms/ (所有 plugins): ~2.5 MB
- plugin-form-builder: 532 KB
- plugin-seo: 1.0 MB
- plugin-search: 304 KB
- plugin-nested-docs: 216 KB
- plugin-redirects: 92 KB
- 其他 (核心功能): ~356 KB
GraphQL 相關依賴: ~4.3 MB
- graphql: 2.4 MB
- graphql-scalars: 1.3 MB
- graphql-http: 596 KB
總計可移除: ~4.8 MB (包含 GraphQL 依賴)
實際可移除 plugins: ~1.1 MB (不包含 GraphQL 核心依賴)
```
### 移除後預估
```
建議移除(高優先級):
- Form Builder: -532 KB
- GraphQL 相關依賴(部分): -1.5 MB
可選移除(中優先級):
- Nested Docs: -216 KB
- Search Plugin: -304 KB
總減少: ~2.5 MB (約 28% 的 Payload 相關依賴)
```
### 實際生產環境影響
```
由於使用 pnpm 和 Docker 多階段構建:
- 開發環境 node_modules: 885 MB → 可減少 ~150-200 MB
- 生產 Docker image: 實際減少會更小tree-shaking
- Runtime bundle: 可能減少 100-200 KB
```
---
## 移除步驟總覽
### 階段 1: 移除高優先級功能(安全)
```bash
cd /Users/pukpuk/Dev/website-enchun-mgr
# 1. 移除 Form Builder Plugin
cd apps/backend
pnpm remove @payloadcms/plugin-form-builder
```
編輯 `/apps/backend/src/plugins/index.ts`:
```typescript
// 移除這兩行
import { formBuilderPlugin } from '@payloadcms/plugin-form-builder'
// ... 和 plugins 陣列中的 formBuilderPlugin()
```
```bash
# 2. 重新生成型別
pnpm generate:types
# 3. 重新構建測試
pnpm build
```
### 階段 2: 移除中優先級功能(需評估)
```bash
# 移除 Nested Docs Plugin (如果不需要分層分類)
pnpm remove @payloadcms/plugin-nested-docs
# 移除 Search Plugin (如果前端不需要搜尋)
pnpm remove @payloadcms/plugin-search
# 移除 Payload Cloud Plugin (如果不使用 Payload Cloud)
pnpm remove @payloadcms/payload-cloud
```
編輯 `/apps/backend/src/plugins/index.ts`:
```typescript
// 移除相應的 imports 和 plugins
```
### 階段 3: 清理相關檔案
```bash
# 移除不再使用的檔案
rm -rf src/search
rm -f src/hooks/revalidateRedirects.ts (如果移除 redirects)
# 檢查並移除 FormBlock
rm -rf src/blocks/Form
# 重新生成型別
pnpm generate:types
```
### 階段 4: 驗證和測試
```bash
# 1. 型別檢查
pnpm lint
# 2. 構建測試
pnpm build
# 3. 本地開發測試
pnpm dev
# 4. 測試管理後台
# - 檢查所有 collections 是否正常
# - 檢查 SEO 欄位是否正常
# - 檢查編輯器是否正常
```
---
## 風險評估
### 高風險項目
無 - 所有建議移除的功能都是可選的 plugins
### 中風險項目
1. **Search Plugin** - 如果移除,管理後台的搜尋功能會消失
2. **Nested Docs** - 如果未來需要分層分類,需要重新加入
### 低風險項目
1. **Form Builder** - 完全未使用,安全移除
2. **Payload Cloud** - 不使用官方雲端,安全移除
---
## 替代方案
### 表單功能替代
如果將來需要聯絡表單:
**方案 A: 自定義 Collection**
```typescript
// /apps/backend/src/collections/ContactMessages.ts
export const ContactMessages: CollectionConfig = {
slug: 'contact-messages',
fields: [
{ name: 'name', type: 'text', required: true },
{ name: 'email', type: 'email', required: true },
{ name: 'message', type: 'textarea', required: true },
],
}
```
**方案 B: Server Actions**
```typescript
// /apps/frontend/src/actions/contact.ts
'use server'
export async function submitContactForm(formData: FormData) {
// 直接發送 email 或儲存到資料庫
}
```
**方案 C: 第三方服務**
- Formspree (免費方案可用)
- Netlify Forms
- Web3Forms
### 搜尋功能替代
如果需要前端搜尋:
**方案 A: REST API 搜尋**
```typescript
// 使用 Payload 的 _q 參數
const response = await fetch('/api/posts?where[or][0][title][like]=keyword')
```
**方案 B: 第三方搜尋服務**
- Algolia (有免費方案)
- Meilisearch (開源自託管)
- Lunr.js (客戶端搜尋)
---
## 建議的瘦身優先順序
### 第一批(立即移除)
1.**Form Builder Plugin** - 完全未使用
2.**Payload Cloud Plugin** - 不使用官方雲端
### 第二批(評估後移除)
3. ⚠️ **Nested Docs Plugin** - 確認是否需要分層分類
4. ⚠️ **Search Plugin** - 確認是否需要後台搜尋
### 第三批(可選)
5.**GraphQL 相關依賴** - Payload 核心依賴,無法完全移除
6.**Redirects Plugin** - 建議保留SEO 重要性)
7.**Live Preview** - 依據編輯者需求
---
## 總結
### 可立即移除
- **Form Builder Plugin** (532 KB) - 零使用,安全移除
- **Payload Cloud Plugin** (少量) - 不使用官方雲端
### 建議評估後移除
- **Nested Docs Plugin** (216 KB) - 如果不需要分層分類
- **Search Plugin** (304 KB) - 如果不需要後台搜尋
### 建議保留
- **SEO Plugin** (1.0 MB) - 對 SEO 很重要
- **Redirects Plugin** (92 KB) - 避免連結失效
- **Live Preview** - 提升編輯體驗
### 預期收益
- **開發環境:** 減少 ~150-200 MB node_modules
- **生產環境:** 減少 ~100-200 KB runtime bundle
- **維護成本:** 減少不必要的配置和潛在 bug
- **啟動速度:** 減少 ~5-10% 的冷啟動時間
---
## 下一步行動
1. **確認需求** - 與團隊確認:
- 是否需要分層分類?
- 是否需要後台搜尋功能?
- 是否需要即時預覽?
2. **備份現有配置** - 在移除前備份:
```bash
cp apps/backend/src/plugins/index.ts apps/backend/src/plugins/index.ts.backup
```
3. **逐步移除** - 一次移除一個 plugin測試後再繼續
4. **監控生產環境** - 移除後監控:
- 管理後台功能是否正常
- API 是否正常運作
- 錯誤日誌是否有異常
---
**文件生成時間:** 2026-01-30
**分析範圍:** Payload CMS v3.59.1 configuration
**建議適用於:** 恩群數位行銷網站後端

View File

@@ -0,0 +1,321 @@
# 規劃更新摘要 - Story 1.2 Payload CMS Collections
**更新日期:** 2025-01-30
**更新類型:** 詳細規劃調整
**影響範圍:** Story 1.2, 1.9, 1.10, 1.12
---
## 📊 執行摘要
根據用戶要求「調整規劃,更新相關的 stories」我已完成
1. ✅ 創建詳細的 Payload CMS 修改計劃
2. ✅ 更新 Story 1.2 執行計劃
3. ✅ 重新估算時間(減少 50%
4. ✅ 定義相關 Stories 依賴關係
---
## 📁 新增/更新的文檔
### 1. 新增文檔
**📄 `docs/prd/payload-cms-modification-plan.md`**
- **用途:** Story 1.2 的詳細實作指南
- **內容:**
- 7 個詳細任務定義Task 1.2.1 - 1.2.7
- 每個任務的完整代碼範例
- Webflow → Payload 欄位對應表
- 驗收標準和測試計劃
- 相關 Stories 依賴更新
### 2. 更新文檔
**📄 `docs/prd/epic-1-execution-plan.md`**
- **更新部分:** Story 1.2 詳細執行計劃
- **主要變更:**
- 重寫 Story 1.2 章節(原 74-280 行)
- 階段化實作計劃Phase 1-3
- Webflow 欄位對應表
- 角色權限矩陣
- 更新 Sprint 0 和 Sprint 1 時間估算
---
## 🎯 關鍵決策更新
### Story 1.2 時間估算
| 項目 | 原估計 | 更新後 | 變化 |
|------|--------|--------|------|
| Story 1.2 | 8-12 小時 | **4 小時** | -50% ~ -66% |
| Sprint 0 | 8-12 小時 | **2.5 小時** | -75% |
| Sprint 1 | 24-30 小時 | **3 小時** | -90% |
**理由:**
1. Payload CMS 架構清晰,修改簡單直接
2. Access control 模式一致,易於批量應用
3. 詳細計劃減少了不確定性和反覆修改
4. 大部分欄位是標準類型text/select/upload
### Story 1.2 任務結構
**原計劃:** 5 個 tasks定義模糊
**更新後:** 7 個 tasks詳細定義
| Phase | Task | 內容 | 時間 |
|-------|------|------|------|
| **Phase 1** | 1.2.1 | 創建 Portfolio Collection | 1 小時 |
| (Critical) | 1.2.2 | 完善 Categories Collection | 30 分鐘 |
| **Phase 2** | 1.2.3 | 完善 Posts Collection | 30 分鐘 |
| (Enhancement) | 1.2.4 | 完善 Users Collection | 30 分鐘 |
| **Phase 3** | 1.2.5 | 創建 Access Control 函數 | 30 分鐘 |
| (Security) | 1.2.6 | 應用 Access Control | 30 分鐘 |
| | 1.2.7 | 驗證和測試 | 1 小時 |
| **總計** | | | **4 小時** |
---
## 🔗 相關 Stories 依賴更新
### Story 1.9: Blog System更新
**新增依賴項:**
```diff
Story 1.9 依賴 Story 1.2 完成:
+ Categories.textColor/backgroundColor → category badge theming
+ Posts.excerpt → article list display150-200 字)
+ Posts.status → filter published postsdraft/review/published
```
**Task 1.9.2Blog Listing Page更新**
```diff
+ 從 Payload API 載入已發布文章where: { status: 'published' }
+ 顯示 category badge使用動態顏色 category.textColor/backgroundColor
+ 顯示文章摘要(使用 post.excerpt最多 200 字)
```
**Task 1.9.4Category Page更新**
```diff
+ 分類顏色主題(使用 category.textColor/backgroundColor
+ Badge 使用動態顏色而非固定顏色
+ 分類名稱顯示 category.nameEn如果存在
```
### Story 1.10: Portfolio更新
**新增依賴項:**
```diff
Story 1.10 依賴 Story 1.2 完成:
+ Portfolio collection 必須存在7 個欄位)
+ 所有欄位必須定義才能實作前端頁面
```
**Task 1.10.1Design Portfolio Architecture簡化**
```diff
- 決定是否使用 Payload CMS collection
+ Portfolio collection 已在 Story 1.2 創建Task 1.2.1
- 欄位規劃
+ 欄位已在 Story 1.2 定義:
+ title, slug, url, image, description, websiteType, tags
+ 此 Task 改為專注於前端路由和組件架構設計
```
**Task 1.10.2Implement Portfolio Listing Page更新**
```diff
+ Portfolio card 顯示:
+ - Project image (image 欄位)
+ - Project title (title 欄位)
+ - Description (description 欄位)
+ - Tags (tags array)
+ - Website type badge (websiteType 欄位)
```
### Story 1.12: Authentication更新
**新增依賴項:**
```diff
Story 1.12 依賴 Story 1.2 Phase 3 完成:
+ Users.role 欄位必須存在admin/editor
+ adminOnly/adminOrEditor 函數必須創建
+ 所有 Collections 必須應用 access control
```
**Task 1.12.5Implement Role-Based Access Control簡化**
```diff
- Users collection 添加 role 欄位
+ Users collection 已在 Story 1.2 Task 1.2.4 添加 role 欄位
- 建立 access/adminOnly.ts
+ access/adminOnly.ts 已在 Story 1.2 Task 1.2.5 創建
- 建立 access/adminOrEditor.ts
+ access/adminOrEditor.ts 已在 Story 1.2 Task 1.2.5 創建
- 更新 Collections 的 access rules
+ Collections 已在 Story 1.2 Task 1.2.6 應用 access rules
+ 此 Task 改為專注於測試驗證角色權限
```
---
## 📋 Collection 完成度總覽
### Story 1.2 完成後狀態
| Collection | 當前 | Story 1.2 後 | 新增欄位 |
|-----------|------|-------------|---------|
| Portfolio | 0% | **100%** ✅ | 7 個欄位 |
| Categories | 40% (2/6) | **100%** ✅ | +4 欄位 |
| Posts | 60% (9/13) | **100%** ✅ | +4 欄位 |
| Users | 70% (3/4) | **100%** ✅ | +1 欄位 |
| Media | 90% | **100%** ✅ | - |
| Pages | 100% | **100%** ✅ | - |
### Access Control 完成度
| 組件 | 當前 | Story 1.2 後 |
|------|------|-------------|
| Access 函數 | 3 個 | **5 個** ✅ |
| Collections 應用 | 部分 | **全部** ✅ |
| Globals 應用 | 無 | **完整** ✅ |
| 角色權限測試 | 無 | **完成** ✅ |
---
## 🔄 Sprint 調整影響
### Sprint 0: Infrastructure Completion
**調整前:**
- Story 1.1: 40 分鐘
- Story 1.2: 不明確
- 總計8-12 小時
**調整後:**
- Story 1.1: 40 分鐘
- Story 1.2 Phase 1: 1.5 小時
- **總計2.5 小時**-75%
**理由:** 專注於 Critical BlockersPortfolio + Categories解除 Story 1.9 和 1.10 的阻礙
### Sprint 1: Collections Completion
**調整前:**
- Story 1.2 完成: 不明確
- Story 1.3 遷移: 12-16 小時
- 總計24-30 小時
**調整後:**
- Story 1.2 Phase 2-3: 3 小時
- Story 1.3 遷移: 延後到 Sprint 2
- **總計3 小時**-90%
**理由:** 將 Story 1.2 拆分到 Sprint 0 和 Sprint 1先完善 Collections 再遷移內容
### Sprint 2: Migration & Layout新增建議
**建議內容:**
- Story 1.3: Content Migration Script (12-16 小時)
- Story 1.4: Header/Footer Components (8-10 小時)
- **總計20-26 小時**
**理由:** Collections 完成後,開始內容遷移和全局組件開發
---
## 📊 時間線總結
### Epic 1 整體時間估算
| 階段 | 原估計 | 更新後 | 變化 |
|------|--------|--------|------|
| Sprint 0 (Infra) | 8-12 hr | 2.5 hr | **-75%** |
| Sprint 1 (Collections) | 24-30 hr | 3 hr | **-90%** |
| Sprint 2 (Migration) | - | 20-26 hr | **新增** |
| Sprint 3-5 (Pages/Apps) | 90-120 hr | 90-120 hr | 無變化 |
| Sprint 6 (Production) | 40-50 hr | 40-50 hr | 無變化 |
| **總計** | **162-212 hr** | **155.5-201.5 hr** | **-4%** |
**關鍵變化:**
- Sprint 0 和 Sprint 1 時間大幅減少(詳細規劃的效果)
- 新增 Sprint 2 專注於內容遷移和全局組件
- 整體時間線略微縮短,但更有組織性
---
## ✅ 驗收清單
### Story 1.2 完成標準
#### Collection 完整性
- [ ] Portfolio: 7/7 欄位title, slug, url, image, description, websiteType, tags
- [ ] Categories: 6/6 欄位title, nameEn, order, textColor, backgroundColor, slug
- [ ] Posts: 13/13 欄位(含新增的 excerpt, ogImage, showInFooter, status
- [ ] Users: 4/4 欄位email, name, role, password
- [ ] Media: 100%
- [ ] Pages: 100%
#### Access Control 完整性
- [ ] 5 個 access 函數完整
- [ ] 7 個 collections/globals 應用 access rules
- [ ] 角色權限矩陣測試通過
- [ ] Admin 可完整權限Editor 僅內容管理
#### 功能驗收
- [ ] 所有 collections 在 admin panel 可見
- [ ] 所有欄位可編輯
- [ ] 型別生成成功(`pnpm generate:types`
- [ ] 開發環境正常運行
- [ ] R2 上傳測試通過
---
## 📝 後續行動建議
### 選項 A開始執行 Story 1.2(推薦)
**Phase 1 - Critical Blockers今天**
1. Task 1.2.1: 創建 Portfolio Collection (1 小時)
2. Task 1.2.2: 完善 Categories Collection (30 分鐘)
**預期成果:**
- Story 1.9 和 1.10 的阻礙解除
- Portfolio 和 Categories 可用於前端開發
### 選項 B繼續規劃其他 Stories
**可以並行規劃:**
- Story 1.3: Content Migration Script
- Story 1.4: Header/Footer Components
- Story 1.5-1.8: 頁面實作細節
### 選項 C調整整體計劃
**可能的調整:**
- 重新評估 Story 1.3 的優先級(是否先遷移還是先實作頁面)
- 調整 Sprint 結構
- 修改時間線
---
## 📚 參考文檔
**主要文檔:**
1. `docs/prd/payload-cms-modification-plan.md` - Story 1.2 詳細實作指南
2. `docs/prd/epic-1-execution-plan.md` - Epic 1 執行計劃(已更新)
3. `docs/prd/epic-1-stories-1.3-1.17-tasks.md` - Stories 1.3-1.17 任務定義
**相關文檔:**
4. `docs/prd/01-project-analysis.md` - 項目分析
5. `docs/prd/payload-cms-slimming-report.md` - Payload CMS 瘩身報告
**Payload CMS 官方文檔:**
- [Collections](https://payloadcms.com/docs/configuration/collections)
- [Access Control](https://payloadcms.com/docs/access-control/overview)
- [Field Types](https://payloadcms.com/docs/configuration/fields)
---
**文檔版本:** v1.0
**最後更新:** 2025-01-30
**適用於:** Payload CMS 3.59.1
**狀態:** ✅ 規劃完成,等待執行確認

View File

@@ -0,0 +1,651 @@
# Epic 1 優先級重新評估
**評估日期:** 2025-01-30
**評估依據:** 業務價值、技術依賴、風險評估、資源配置
**評估人員:** PM Agent (John)
---
## 📊 執行摘要
### 當前狀態
| Story | 完成度 | 狀態 | 阻礙 | 時間估算 |
|-------|--------|------|------|---------|
| 1.1 基礎設施 | 85% | ⚠️ 接近完成 | Shared package | 40 分鐘 |
| 1.2 Collections | 43% | ❌ 需要工作 | Portfolio 缺失 | 4 小時 |
| 1.3 內容遷移 | 0% | ⏸️ 未開始 | 依賴 1.2 | 12-16 小時 |
| 1.4 Layout 組件 | 0% | ⏸️ 未開始 | 依賴 1.1 | 8-10 小時 |
| 1.5-1.8 頁面 | 0% | ⏸️ 未開始 | 依賴 1.4 | 22-30 小時 |
| 1.9 Blog | 0% | ⏸️ 未開始 | 依賴 1.2 | 12-16 小時 |
| 1.10 Portfolio | 0% | ⏸️ 未開始 | 依賴 1.2 | 6-8 小時 |
| 1.11 Teams | 0% | ⏸️ 未開始 | 無強依賴 | 4-6 小時 |
| 1.12 認證 | 0% | ⏸️ 未開始 | 依賴 1.2 Phase 3 | 8-10 小時 |
| 1.13 Dashboard | 0% | ⏸️ 未開始 | 依賴 1.12 | 4-6 小時 |
| 1.14-1.17 上線 | 0% | ⏸️ 未開始 | 依賴所有 | 40-50 小時 |
---
## 🎯 優先級評估框架
### 評估維度
1. **業務價值Business Value** - 對最終用戶/客戶的價值
2. **技術依賴Technical Dependencies** - 被其他 Stories 依賴的程度
3. **風險評估Risk Analysis** - 失敗或延遲的影響
4. **時間成本Time Cost** - 完成所需的時間
5. **資源需求Resource Requirements** - 所需技能和工具
---
## 📊 優先級矩陣
### 🔴 P0 - Critical關鍵路徑必須首先完成
#### Story 1.1: 基礎設施設置(剩餘部分)
**當前狀態:** 85% → 100%
**剩餘時間:** 40 分鐘
**為什麼是 P0**
- ✅ 解除所有其他 Stories 的配置阻礙
- ✅ 快速完成(僅 40 分鐘)
- ✅ 一次性解決,無反覆
**業務價值:** ⭐⭐☆☆☆(基礎設施,用戶不可見)
**技術依賴:** 🔴 被所有 Stories 依賴
**風險評估:** 🟡 低風險(已 85% 完成)
**優先級評分:** **95/100**
---
#### Story 1.2: Payload CMS CollectionsPhase 1-2
**當前狀態:** 43% → 100%Phase 1-2
**時間:** 2.5 小時
**為什麼是 P0**
- ✅ Portfolio Collection 是 Story 1.10 的 **BLOCKER**
- ✅ Categories/Posts 是 Story 1.9 的 **BLOCKER**
- ✅ 快速解除多個 Stories 的阻礙
- ⚠️ **先完成 Phase 1-2Phase 3Access Control可延後**
**Phase 1-2 包含:**
- Task 1.2.1: Portfolio Collection1 小時)🔴 Critical
- Task 1.2.2: Categories Completion30 分鐘)🔴 Critical
- Task 1.2.3: Posts Completion30 分鐘)🟡 High
- Task 1.2.4: Users Completion30 分鐘)🟡 High
**業務價值:** ⭐⭐⭐☆☆(內容管理基礎)
**技術依賴:** 🔴 被Stories 1.9, 1.10, 1.12 依賴
**風險評估:** 🔴 高風險(多個 Stories 被阻塞)
**優先級評分:** **92/100**
**重要策略調整:**
- ⚠️ **Phase 3Access Control不包含在 P0**
- ✅ Story 1.12 可延後,先用 admin 權限開發
- ✅ 這樣可以提前開始 Stories 1.9, 1.10
---
#### Story 1.4: Global Layout Components
**當前狀態:** 0% → 100%
**時間:** 8-10 小時
**為什麼是 P0**
- ✅ 被 Stories 1.5-1.8 強烈依賴
- ✅ Header/Footer 是所有頁面的基礎
- ✅ 一次完成,所有頁面受益
**業務價值:** ⭐⭐⭐⭐☆(用戶每個頁面都看到)
**技術依賴:** 🔴 被Stories 1.5, 1.6, 1.7, 1.8 依賴
**風險評估:** 🟡 中風險(影響多個頁面)
**優先級評分:** **88/100**
---
### 🟡 P1 - High高價值可與 P0 並行)
#### Story 1.5: Homepage Implementation
**當前狀態:** 0% → 100%
**時間:** 6-8 小時
**依賴:** Story 1.4
**為什麼是 P1**
-**最高業務價值**(用戶第一印象)
-**SEO 最重要**(首頁權重最高)
- ✅ 快速展示可見成果
- ✅ 可與其他 Stories 並行開發
**業務價值:** ⭐⭐⭐⭐⭐(最重要的頁面)
**技術依賴:** 🟡 僅依賴 Story 1.4
**風險評估:** 🟡 中風險(視覺保真度要求高)
**優先級評分:** **90/100**
**策略建議:**
- 🚀 **可在 Story 1.4 完成後立即開始**
- 🚀 **與 Stories 1.6-1.8 並行開發**
- ⚠️ **需要設計參考和視覺標準**
---
#### Story 1.9: Blog System
**當前狀態:** 0% → 100%
**時間:** 12-16 小時
**依賴:** Story 1.2Phase 1-2
**為什麼是 P1**
- ✅ 35+ 篇文章是內容營銷核心
- ✅ SEO 價值高(長尾流量)
- ✅ Story 1.2 Phase 1-2 完成後即可開始
- ⚠️ 不需要等待 Story 1.2 Phase 3Access Control
**業務價值:** ⭐⭐⭐⭐☆(內容營銷核心)
**技術依賴:** 🟡 依賴 Story 1.2 Phase 1-2
**風險評估:** 🟡 中風險(複雜度中等)
**優先級評分:** **82/100**
**策略建議:**
- 🚀 **Story 1.2 Phase 1-2 完成後立即開始**
- 🚀 **與 Stories 1.5-1.8 並行開發**
-**Access Control 可暫時用 admin 權限**
---
#### Story 1.10: Portfolio Implementation
**當前狀態:** 0% → 100%
**時間:** 6-8 小時
**依賴:** Story 1.2Task 1.2.1
**為什麼是 P1**
- ✅ 作品展示是核心服務
- ✅ 潛在客戶的重要參考
- ✅ Story 1.2 Task 1.2.1 完成後即可開始
- ⚠️ **僅依賴 Portfolio Collection不依賴 Phase 3**
**業務價值:** ⭐⭐⭐⭐☆(展示實力,吸引客戶)
**技術依賴:** 🟡 僅依賴 Story 1.2 Task 1.2.1
**風險評估:** 🟢 低風險(相對簡單)
**優先級評分:** **80/100**
**策略建議:**
- 🚀 **Story 1.2 Task 1.2.1 完成後立即開始**
- 🚀 **與 Story 1.5 並行開發**
-**Access Control 可暫時用 admin 權限**
---
### 🟢 P2 - Medium中等價值可延後
#### Story 1.6: About Page
**時間:** 6-8 小時 | 依賴Story 1.4
**優先級評分:** 72/100
#### Story 1.7: Solutions Page
**時間:** 4-6 小時 | 依賴Story 1.4
**優先級評分:** 70/100
#### Story 1.8: Contact Page
**時間:** 6-8 小時 | 依賴Story 1.4
**優先級評分:** 75/100
**為什麼是 P2**
- ✅ 業務價值中等
- ✅ 可與 Story 1.5 並行開發
- ⚠️ 視覺保真度要求高,需要時間
**策略建議:**
- 🚀 在 Story 1.5 之後開始
- 🚀 與 Stories 1.9, 1.10 並行
- ⚠️ 可根據時間調整優先級
---
### 🔵 P3 - Low低優先級最後完成
#### Story 1.2 Phase 3: Access Control
**時間:** 1.5 小時
**包含:** Tasks 1.2.5, 1.2.6, 1.2.7
**為什麼降到 P3**
- ⚠️ **不阻礙任何 Stories 開始**
- ✅ 開發期間可用 admin 權限
- ✅ 上線前完成即可
- ✅ 可與其他 Stories 並行
**策略調整:**
- 🔻 **從 P0 降級到 P3**
- ✅ 在 Sprint 2-3 完成
- ✅ 與 Stories 1.9, 1.10 並行
---
#### Story 1.3: Content Migration Script
**時間:** 12-16 小時
**優先級評分:** 65/100
**為什麼是 P3**
- ⚠️ **不阻礙頁面開發**(可用測試數據)
- ✅ 頁面完成後再遷移更高效
- ✅ 可反覆執行,不需要一次完成
- ✅ 可與頁面開發並行
**策略建議:**
- 🔻 **延後到 Sprint 2**
- 🚀 **與 Stories 1.5-1.8 並行**
- ✅ 先用測試數據開發頁面
---
#### Story 1.11: Teams Page
**時間:** 4-6 小時
**優先級評分:** 68/100
**為什麼是 P3**
- ✅ 業務價值相對較低
- ✅ 無強依賴,可隨時完成
- ⚠️ 資料量少,實作簡單
---
#### Story 1.12: Authentication System
**時間:** 8-10 小時
**依賴:** Story 1.2 Phase 3
**優先級評分:** 60/100
**為什麼是 P3**
- ⚠️ **依賴 Story 1.2 Phase 3已降級**
- ✅ 開發期間不需要認證
- ✅ 上線前完成即可
- ✅ 可與其他功能並行
---
#### Story 1.13: Admin Dashboard
**時間:** 4-6 小時
**依賴:** Story 1.12
**優先級評分:** 55/100
**為什麼是 P3**
- ✅ 內部工具,用戶不可見
- ✅ 可用 Payload CMS admin 代替
- ✅ 最後完成即可
---
#### Story 1.14-1.17: Production Readiness
**時間:** 40-50 小時
**優先級評分:** 50/100
**為什麼是 P3**
- ✅ 最後階段才能完成
- ✅ 依賴所有功能完成
- ✅ 可分階段進行
---
## 🚀 新的執行策略
### Wave 0: Critical Path第 1 天3 小時)
**目標:** 解除所有關鍵阻礙
```
✅ Story 1.1: 完成基礎設施40 分鐘)
✅ Story 1.2 Phase 1-2: Collections2.5 小時)
├─ Task 1.2.1: Portfolio Collection1 小時)🔴
├─ Task 1.2.2: Categories Completion30 分鐘)🔴
├─ Task 1.2.3: Posts Completion30 分鐘)🟡
└─ Task 1.2.4: Users Completion30 分鐘)🟡
```
**交付成果:**
- ✅ Portfolio Collection 創建完成Story 1.10 可開始)
- ✅ Categories/Posts 完整Story 1.9 可開始)
- ✅ 所有 Collections 可用
- ⚠️ **Phase 3Access Control延後**
**預估時間:** 3 小時
---
### Wave 1: Foundation + High Value第 2-4 天26-34 小時)
**目標:** 建立 Layout 基礎 + 完成最高價值頁面
```
✅ Story 1.4: Header/Footer Components8-10 小時)
並行開始:
├─ ✅ Story 1.5: Homepage6-8 小時)⭐⭐⭐⭐⭐
├─ ✅ Story 1.9: Blog System12-16 小時)⭐⭐⭐⭐☆
└─ ✅ Story 1.10: Portfolio6-8 小時)⭐⭐⭐⭐☆
```
**交付成果:**
- ✅ Header/Footer 完成(所有頁面可用)
- ✅ 首頁完成(最高僰值)
- ✅ Blog 系統完成(內容營銷)
- ✅ Portfolio 完成(作品展示)
**預估時間:** 26-34 小時
**重要策略:**
- 🚀 **Story 1.4 完成後1.5/1.9/1.10 立即並行開始**
-**Access Control 暫時用 admin 權限**
-**內容用測試數據(不執行 Story 1.3**
---
### Wave 2: Content Pages第 5-6 天16-22 小時)
**目標:** 完成剩餘頁面
```
並行開發:
├─ ✅ Story 1.6: About Page6-8 小時)
├─ ✅ Story 1.7: Solutions Page4-6 小時)
└─ ✅ Story 1.8: Contact Page6-8 小時)
```
**交付成果:**
- ✅ 所有主要頁面完成
- ✅ 網站功能完整
**預估時間:** 16-22 小時
---
### Wave 3: Migration + Content Systems第 7-8 天16-22 小時)
**目標:** 遷移內容 + 完成低優先級功能
```
並行進行:
├─ ✅ Story 1.3: Content Migration12-16 小時)
├─ ✅ Story 1.11: Teams Page4-6 小時)
└─ ✅ Story 1.2 Phase 3: Access Control1.5 小時)
└─ ✅ Story 1.12: Authentication8-10 小時)
```
**交付成果:**
- ✅ 真實內容遷移完成
- ✅ 所有頁面有真實數據
- ✅ 認證系統完成
- ✅ 角色權限完成
**預估時間:** 16-22 小時
---
### Wave 4: Polish & Launch第 9-10 天45-55 小時)
**目標:** 上線準備
```
├─ ✅ Story 1.13: Admin Dashboard4-6 小時)
├─ ✅ Story 1.14: SEO8-10 小時)
├─ ✅ Story 1.15: Performance8-12 小時)
├─ ✅ Story 1.16: Deployment6-8 小時)
└─ ✅ Story 1.17: Testing12-16 小時)
```
**交付成果:**
- ✅ 上線準備完成
- ✅ 所有測試通過
- ✅ 正式部署
**預估時間:** 45-55 小時
---
## 📊 新的時間線
### 對比表
| Wave | Stories | 原估計 | 新估計 | 變化 |
|------|---------|--------|--------|------|
| Wave 0 | 1.1, 1.2 (Phase 1-2) | 8-12 hr | **3 hr** | ⬇️ 75% |
| Wave 1 | 1.4, 1.5, 1.9, 1.10 | 38-50 hr | **26-34 hr** | ⬇️ 32% |
| Wave 2 | 1.6, 1.7, 1.8 | 16-22 hr | **16-22 hr** | 無變化 |
| Wave 3 | 1.3, 1.11, 1.2 (Phase 3), 1.12 | 24-32 hr | **16-22 hr** | ⬇️ 33% |
| Wave 4 | 1.13-1.17 | 40-50 hr | **45-55 hr** | ⬆️ 12% |
| **總計** | | **126-166 hr** | **106-136 hr** | ⬇️ **16%** |
**關鍵改進:**
- ✅ 總時間減少 **20-30 小時**16%
- ✅ Wave 0 和 Wave 1 大幅提速
- ✅ 高價值功能提前交付
- ✅ 並行開發最大化
---
## 🎯 關鍵決策點
### 決策 1: Story 1.2 Phase 3Access Control降級 ✅
**原計劃:** Story 1.2 包含 Phase 37 個 tasks4 小時)
**新計劃:** Phase 1-24 個 tasks2.5 小時)→ P0
     Phase 33 個 tasks1.5 小時)→ P3
**理由:**
- ✅ Phase 3 不阻礙任何 Stories 開始
- ✅ Stories 1.9, 1.10 可立即開始(用 admin 權限)
- ✅ Access Control 可在 Wave 3 與其他功能並行
- ✅ 節省關鍵路徑時間 **1.5 小時**
**風險:**
- ⚠️ 開發期間需要用 admin 帳號
- ⚠️ 需要在 Wave 3 記得完成 Phase 3
- ✅ 風險可控
---
### 決策 2: Story 1.3(內容遷移)延後 ✅
**原計劃:** Sprint 1 執行Story 1.2 完成後立即)
**新計劃:** Wave 3 執行(與頁面開發並行)
**理由:**
- ✅ 頁面開發可用測試數據
- ✅ 頁面完成後再遷移更高效
- ✅ 遷移腳本可反覆執行
- ✅ 解除關鍵路徑瓶頸
**風險:**
- ⚠️ 需要準備測試數據
- ⚠️ 頁面完成後需要更新內容
- ✅ 風險可控
---
### 決策 3: 最大化並行開發 ✅
**原計劃:** 順序執行1.4 → 1.5 → 1.6 → 1.7 → 1.8
**新計劃:** 並行執行1.4 → 1.5/1.9/1.10 同時開始)
**理由:**
- ✅ 最大化資源利用
- ✅ 縮短總時間線
- ✅ 高價值功能提前交付
**風險:**
- ⚠️ 需要協調多個並行任務
- ⚠️ 代碼合併衝突
- ✅ 風險可控
---
## 📋 優先級清單
### 立即執行(今天)
**Wave 0: Critical Path3 小時)**
1. Story 1.1: 完成基礎設施40 分鐘)
2. Story 1.2 Phase 1: Portfolio Collection1 小時)
3. Story 1.2 Phase 2: Categories/Posts/Users1.5 小時)
**交付成果:**
- ✅ 解除 Story 1.9, 1.10 的阻礙
- ✅ 所有 Collections 可用
---
### 本週執行Wave 1
**Wave 1: Foundation + High Value26-34 小時)**
1. Story 1.4: Header/Footer Components8-10 小時)
2. Story 1.5: Homepage6-8 小時)⭐⭐⭐⭐⭐
3. Story 1.9: Blog System12-16 小時)⭐⭐⭐⭐☆
4. Story 1.10: Portfolio6-8 小時)⭐⭐⭐⭐☆
**交付成果:**
- ✅ 最高價值頁面完成
- ✅ 網站核心功能可用
---
### 下週執行Wave 2-3
**Wave 2: Content Pages16-22 小時)**
1. Story 1.6: About Page
2. Story 1.7: Solutions Page
3. Story 1.8: Contact Page
**Wave 3: Migration + Content Systems16-22 小時)**
1. Story 1.3: Content Migration
2. Story 1.11: Teams Page
3. Story 1.2 Phase 3: Access Control
4. Story 1.12: Authentication
**交付成果:**
- ✅ 所有頁面完成
- ✅ 真實內容遷移完成
---
### 最後階段Wave 4
**Wave 4: Polish & Launch45-55 小時)**
1. Story 1.13: Admin Dashboard
2. Story 1.14: SEO
3. Story 1.15: Performance
4. Story 1.16: Deployment
5. Story 1.17: Testing
**交付成果:**
- ✅ 正式上線
---
## 🎯 成功指標
### Wave 0 完成標準
- [ ] Story 1.1 達到 100%
- [ ] Portfolio Collection: 7/7 欄位 ✅
- [ ] Categories Collection: 6/6 欄位 ✅
- [ ] Posts Collection: 13/13 欄位 ✅
- [ ] Users Collection: 4/4 欄位 ✅
- [ ] 所有型別生成成功
- [ ] Story 1.9 和 1.10 阻礙解除
### Wave 1 完成標準
- [ ] Header/Footer 完成
- [ ] 首頁完成(視覺保真度 ≥ 95%
- [ ] Blog 系統完成(列表 + 詳情 + 分類)
- [ ] Portfolio 完成(列表 + 詳情)
- [ ] Lighthouse Performance ≥ 90
### Wave 2 完成標準
- [ ] About/Solutions/Contact 頁面完成
- [ ] 所有頁面視覺保真度 ≥ 95%
- [ ] Contact 表單功能正常
### Wave 3 完成標準
- [ ] 內容遷移完成35+ 文章)
- [ ] Teams 頁面完成
- [ ] Access Control 完成
- [ ] 認證系統完成
### Wave 4 完成標準
- [ ] SEO 完成Meta tags, Sitemap, Redirects
- [ ] Performance 優化完成Lighthouse ≥ 95
- [ ] 部署到 Cloudflare
- [ ] 所有測試通過
- [ ] 正式上線
---
## 📊 風險評估
### 高風險項目
1. **視覺保真度Stories 1.5-1.8**
- 🔴 風險Webflow 設計複雜,可能難以達到 95% 保真度
- ✅ 緩解:使用 Webflow 設計作為參考,逐步迭代
- ⏰ 時間:可能需要額外 20-30% 時間
2. **內容遷移Story 1.3**
- 🟡 風險Webflow 導出格式可能不標準
- ✅ 緩解:準備手動修正方案,逐步遷移
- ⏰ 時間:可能需要額外 30-50% 時間
3. **Access Control 延後Story 1.2 Phase 3**
- 🟡 風險:可能忘記在 Wave 3 完成
- ✅ 緩解:在 Wave 0 清單中明確標記
- ⏰ 時間:風險可控
### 中風險項目
4. **並行開發協調Wave 1**
- 🟡 風險:多個 Stories 同時開發可能有衝突
- ✅ 緩解:每日 syncclear branch strategy
- ⏰ 時間:風險可控
5. **Performance 優化Story 1.15**
- 🟡 風險:可能難以達到 Lighthouse ≥ 95
- ✅ 緩解:在開發過程中持續優化
- ⏰ 時間:可能需要額外 20% 時間
---
## 📝 備註
### 調整理由總結
1. **Story 1.2 Phase 3 降級**
- 不阻礙任何 Stories 開始
- 可與其他功能並行
- 節省關鍵路徑時間
2. **Story 1.3 延後**
- 頁面開發可用測試數據
- 解除關鍵路徑瓶頸
- 遷移可反覆執行
3. **最大化並行開發**
- 最大化資源利用
- 縮短總時間線
- 高價值功能提前交付
### 時間節省分析
- **Wave 0:** 節省 5-9 小時75%↓)
- **Wave 1:** 節省 12-16 小時32%↓)
- **Wave 3:** 節省 8-10 小時33%↓)
- **總計:** 節省 25-35 小時16%↓)
### 業務價值提升
- ✅ 首頁提前 **3-4 天**完成
- ✅ Blog 系統提前 **5-6 天**完成
- ✅ Portfolio 提前 **5-6 天**完成
- ✅ 核心功能提前 **4-5 天**可用
---
**文檔版本:** v2.0
**最後更新:** 2025-01-30
**適用於:** Epic 1 - Webflow to Payload CMS + Astro Migration
**狀態:** ✅ 優先級重新評估完成
**下一步:** 等待用戶確認新執行策略