Communitygithub.com

Landing Page 建置器 — CAE 模式

從零開始建立一個完整的、高轉換率的著陸頁,採用 CAE EEC 模式。透過結構化的問題收集所有內容,產生 HTML/CSS 與 Google Apps Script 後端,然後部署到 Cloudflare Pages。

Landing Page 建置器 — CAE 模式 是什麼?

這個技能「Landing Page 建置器 — CAE 模式」是一款專為 AI 代理(如 Antigravity)設計的工具,旨在自動化建立專業、高轉換率的著陸頁。它採用 CAE Việt Nam 驗證過的 EEC(吸引、參與、轉換)模式,涵蓋從需求收集、內容產生、前端開發、後端整合到雲端部署的完整流程。使用者只需回答一系列結構化的問題(品牌、英雄區、優勢、課程、見證、常見問題、表單及部署設定),代理便會據此生成一個包含動畫、響應式設計的 `index.html`,以及一個用於處理表單資料(寫入 Google Sheets 並發送通知郵件)的 Google Apps Script。最終會提供步驟指引,將整個 Landing Page 部署到 Cloudflare Pages。此外,此技能還包含一個「10 星願景」強制檢查點,用於挑戰使用者的預設選擇(例如弱標題),並整合了 Mem0 記憶功能,可在後續互動中記住使用者偏好。此技能明確支援的平台上需要有 Google Sheets、Google Apps Script 和 Cloudflare Pages 環境。

相容平台~Claude Code~Codex CLI~Cursor✓Antigravity
npx skills add buithelong-all/landing-page-skill

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Landing Page 建置器 — CAE 模式 是做什麼的?

總覽說明

此技能可協助您根據使用者提供的資訊,建立高品質的 Landing Page(採用 CAE Việt Nam 的 EEC 模式)。整個流程由 Antigility 執行,使用者只需回答問題即可。

最終產出:

  • index.html + styles.css — 完整的、響應式的 Landing Page,包含動畫效果
  • google-apps-script.js — 用於接收表單資料、寫入 Google Sheets 並發送通知郵件的後端程式
  • 逐步部署至 Cloudflare Pages 的說明

EEC 頁面架構(標準藍圖)

1. NAV — 固定定位,滾動時模糊效果,包含 Logo、連結及 CTA 按鈕
2. HERO — 全螢幕,紅色漸層,粒子效果,主標題 + 副標題 + 2 個按鈕
3. STATS BAR — 4 個顯著數據,具有動畫計數效果
4. WHY US — 6 個特色卡片,附帶懸停效果(3 欄)
5. INSTRUCTOR(可選) — 嵌入 YouTube Short 及認證資訊
6. COURSES — 3 門課程,中間卡片突出顯示,價格區塊
7. TIMELINE — N 週的網格狀學習路徑
8. TESTIMONIALS — 3 張評論卡片,附帶星級評分
9. FAQ — 可展開/收合的問答手風琴
10. CTA + FORM — 漸層區塊,註冊表單 → Google Sheets + 電子郵件
11. FOOTER — 3 欄:品牌、課程、聯絡資訊

流程(必須按順序執行)

第 0 階段:掃描與情境(務必最先執行)

在詢問任何問題之前,請先檢查環境並尋找舊有情境:

  1. 檢查 Mem0 是否可用:

    • 嘗試呼叫 search_memory,查詢詞為:"landing page preference màu font domain"
    • 如果工具不存在 / 回報錯誤 → 完全忽略,立即進入第 1 階段,不要向使用者報告錯誤
    • 如果工具存在且有找到資料 → 回報:"我記得您上次使用 [顏色 X / 字型 Y / 網域 Z]。這次要沿用還是更改?"
    • 如果工具存在但未找到資料 → 正常進行第 1 階段
  2. 儲存新的情境(如果 Mem0 可用) — 在使用者確認完 7 組資訊後,呼叫 add_memory:

    Landing page [ Campaign 名稱]: 顏色=[hex], 字型=Be Vietnam Pro, 網域=[domain], 電子郵件=[email], 試算表=[sheet link]
    
    • 如果 Mem0 不可用 → 跳過此步驟,不影響結果

設計原則: Mem0 是額外功能(漸進式增強),並非強制依賴項。此技能在沒有 Mem0 的機器上也應能完全正常運作。


第 1 階段:收集資訊(逐一詢問各組,等待回覆)

⚠️ 重要: 一次只詢問一組。不要一次問完所有問題。等到使用者回覆完一組後,再詢問下一組。


組別 A — 品牌與顏色

詢問:

為了建立 Landing Page,我需要先了解一些基本資訊。

**第 1 組:品牌**
1. 您的品牌/中心名稱是什麼?(例如:CAE Việt Nam、ABC 中心...)
2. 您的 Logo PNG 網址(或輸入"沒有"以便改用文字代替)
3. 想要使用的主色調?
   - 🔴 CAE 紅色(類似 EEC 頁面) — #8F1A1A + 金色 #FEC46F
   - 🔵 專業海軍藍 — #1A3A5C + 青色 #00C9FF
   - 🟢 清新綠色 — #0D6E3F + 金色 #FFD700
   - ✏️ 我想輸入其他顏色(請提供十六進位色碼)
4. 預期的網域名稱?(例如:uudai.yourdomain.com 或"還没有想到")

組別 B — 英雄區內容

在收到組別 A 的回覆後,詢問:

**第 2 組:頁面頂端區塊(Hero Section)**
1. 您想要顯示的主要標題?(例如:"100% 學術中文獎學金")
2. 標題上方的小標語?(例如:"測試計畫 — 名額有限")
3. 標題下方的簡短描述(1-2 句)?
4. 主要 CTA 按鈕的文字?(例如:"📝 立即註冊"、"🎓 領取獎學金")
5. 是否有 4 個想要顯示的統計數字?(例如:3 個班級、100% 免費、8 週、每班 15 人)

組別 C — 優勢與課程

在收到組別 B 的回覆後,詢問:

**第 3 組:優勢與產品**
1. 列出您的 3-6 個優勢(每個優勢包含:表情符號圖示、簡短標題、1-2 句描述)
   例如:🎓 版權課程 | 從國際夥伴購買版權...
   
2. 列出 1-3 門課程/服務套裝(每個套裝包含):
   - 課程名稱
   - 小徽章(例如:"線上 · 8 週"、"線下 · 河內")
   - 3-4 個主要特色
   - 原價(供劃線刪除用)
   - 優惠價 / "100% 免費" / 折扣百分比
   - 備註(例如:"僅 15 個名額")
   - 哪個課程「最為突出」?

組別 D — 路徑與講師

在收到組別 C 的回覆後,詢問:

**第 4 組:補充內容**
1. 是否有每週的學習路徑?(如果有,請列出各週的主題名稱)
2. 是否有想要介紹的講師/專家?
   - 姓名、職稱
   - YouTube 影片連結(選填)
   - 3 項突出認證/成就
3. 是否有來自客戶的 3 則見證?
   (姓名縮寫、全名、角色、引用內容)

組別 E — 常見問題與聯絡資訊

在收到組別 D 的回覆後,詢問:

**第 5 組:常見問題與聯絡資訊**
1. 列出 5-7 個常見問題及其答案?
2. 聯絡資訊:
   - 辦公室地址
   - 客服專線/Zalo
   - 電子郵件
   - Facebook 粉絲專頁 URL
3. 頁尾版權資訊:"© 2025 [組織名稱]"

組別 F — 表單與後端

在收到組別 E 的回覆後,詢問:

**第 6 組:註冊表單與資料串接**
1. 表單需要收集哪些欄位?
   - [x] 姓名(必填)
   - [x] 電話號碼(必填)
   - [ ] 電子郵件
   - [ ] 地址 / 城市
   - [ ] 課程選擇核取方塊
   - [ ] 備註文字區塊
   - [ ] 其他欄位?

2. 當有人註冊時,哪個電子郵件地址會收到通知?
   (例如:[email protected])

3. 您想要使用的通知郵件主旨?
   (例如:"🔔 您的 Landing Page 有新的註冊!")

4. 麻煩請提供您想要儲存註冊資料的 Google 試算表連結。
   (我會根據上述表單欄位建立腳本,並引導您在該試算表上執行)

⚠️ 使用者提供試算表連結後 → 立即停止並執行第 2 階段。


組別 G — Cloudflare 部署

在收到組別 F 的回覆後,詢問:

**第 7 組:部署資訊(最後一步)**
1. 您的 Cloudflare Account ID?
   (進入 dash.cloudflare.com → 選擇帳戶 → 查看 URL:cloudflare.com/ACCOUNT_ID)
2. 您的 Cloudflare API 金鑰?
   (進入 My Profile → API Tokens → Create Token → 使用 "Edit Cloudflare Pages" 範本)
3. Cloudflare Pages 專案名稱?(小寫、連字號,例如:my-landing-2025)
4. 要綁定的自訂網域?(例如:uudai.yourdomain.com 或"不需要")

第 1.5 階段 — 10 星願景 ⭐(在開始生成之前務必執行)

"不要為數百萬人設計。要設計讓一個人感受到前所未有的驚豔體驗。" — Garry Tan

在撰寫任何程式碼之前,先停下來回答這 4 個問題:

  1. 標題是否「精準命中」?

    • 在 3 秒內閱讀標題:客戶能立刻知道這是為他們準備的嗎?
    • 如果不夠強有力 → 應用本技能中的「文案公式」來改寫
  2. 這個頁面是否有一個「令人難忘」的元素?

    • 一個令人印象深刻的數字?一個大膽的承諾?一個意想不到的好處?
    • 例如:「100% 免費學習 — 僅 15 個名額」→ 清晰、稀缺、立即行動
  3. 這個 Landing Page 可能犯下的致命錯誤是什麼?

    • 表單欄位太多?英雄區缺少社會證明?CTA 按鈕不夠突出?
    • 找出問題並立即在設計中修正
  4. 如果 Steve Jobs 審閱此頁面,他會刪掉什麼?

    • 移除所有與單一目標註冊無關的元素

輸出: 在繼續之前將「願景筆記」加入回應:

🎯 10 星願景:
- 獨特優勢:[..]
- 最終標題:[..]
- 1 個令人難忘的元素:[..]
- 已刪除:[..]

創辦人挑戰規則(適用於願景關卡)

「扮演 CEO — 任務是挑戰平庸,而非認可它。」

如果使用者提供了弱標題(過於通用、未明確指出目標對象、缺乏具體利益),不得立即接受。請改為提出:

⚡ 創辦人模式:
標題「[使用者的標題]」過於通用。我提議 3 個更強而有力的替代方案:

[A] [具體利益] — [數字/時間] — [明確對象]
    例如:「100% 免費學習學術中文 — 僅 15 個名額」

[B] [提問鉤子] + [驚喜結果]
    例如:「您的孩子學習中文 8 週 — 會比國際學生更有自信?」

[C] [大膽承諾] + [證據]
    例如:「4 堂課內無進步 — 全額退款,無需理由」

您選擇哪個方向,或希望我根據其他想法改寫?

何時提出挑戰: 當標題至少缺少以下 3 個要素中的 2 個時:(1) 明確對象、(2) 具體利益、(3) 數字/承諾。


第 2 階段:建立 Google Apps Script(後端)

觸發條件: 使用者已提供 Google 試算表連結(組別 F.4)。

步驟 1 — 生成自訂腳本:

根據位於 templates/google-apps-script.js 的範本,建立一個根據 Landing Page 表單自訂的腳本:

  • 填入 NOTIFICATION_EMAIL = 來自組別 F.2 的電子郵件
  • 填入 EMAIL_SUBJECT = 來自組別 F.3 的主旨
  • 填入 CAMPAIGN_NAME = 來自組別 A.1 的 Campaign 名稱
  • 更新 writeToSheet() 函式,使其欄位數量與組別 F.1 的表單欄位相符
  • 更新 doPost() 函式,使其能根據所選欄位正確解析 e.parameter

步驟 2 — 輸出供使用者複製的程式碼區塊:

生成完成後,在單一區塊中顯示完整程式碼,格式如下:

✅ 我已經為您的 Google 試算表建立了腳本!

以下是您需要複製並貼到試算表中的程式碼:
[程式碼區塊]

📋 在您的 Google 試算表上執行的說明(5 步驟):

① 開啟您剛才提供連結的 Google 試算表 → 進入選單 Extensions → Apps Script
   (或點擊該試算表連結,然後在上方選單中找到 Extensions)

② 刪除編輯區中的所有預設程式碼(Ctrl+A → Delete)

③ 將上述我建立的完整程式碼貼入(Ctrl+V)

④ 按 Ctrl+S 儲存 → 將專案命名為 "Landing Page Handler" → 確定

⑤ 部署腳本:
   • 點擊 "Deploy" 按鈕(右上角)→ "New deployment"
   • 「類型」:選擇 "Web app"
   • 「執行身份」:選擇 "Me (您的電子郵件)"
   • 「誰擁有存取權」:選擇 "Anyone"
   • 點擊 "Deploy" → Google 會要求權限 → 點擊 "Authorize access" → 選擇 Google 帳戶
   • 複製出現的長 URL(格式:https://script.google.com/macros/s/.../exec)

📌 取得該 URL 後,請貼到此處,以便我將其嵌入 Landing Page。

步驟 3 — 等待使用者確認 SHEETS_ENDPOINT URL,然後再繼續第 3 階段。


第 3 階段:生成 Landing Page HTML

根據已收集的所有資訊,建立完整的 index.html 檔案:

需要建立的檔案結構:

  • 單一 index.html 檔案(CSS 內嵌於 <style> 標籤中,不另建獨立檔案)
  • JavaScript 表單提交邏輯內嵌於 <script> 標籤中
  • 不依賴任何框架,僅使用原生 HTML/CSS/JS
  • 完全響應式(行動優先)
  • 使用 Be Vietnam Pro(從 Google Fonts CDN 載入)— 完整支援越南語音符號,可替代 Inter/Montserrat

根據 EEC 模式設計:

  • 配色方案來自組別 A.3
  • 包含藍圖中的所有區塊
  • 如果使用者未提供講師資訊 → 跳過該區塊
  • 如果沒有見證 → 跳過該區塊
  • 如果沒有時間軸 → 跳過該區塊

表單提交模式(必須使用隱藏 iframe — 避免 CORS 問題):

const SHEETS_ENDPOINT = 'USER_GAS_URL'; // 填入來自步驟 2 的 URL

const hiddenFrame = document.createElement('iframe');
hiddenFrame.name = 'hidden_iframe';
hiddenFrame.style.display = 'none';
document.body.appendChild(hiddenFrame);

// 提交時:建立隱藏表單,透過 POST 將資料發送到 GAS 端點,目標指向隱藏 iframe
// 不使用 fetch() — 原生表單 POST 不會被 CORS 阻擋

localStorage 備份:

// 在提交前務必備份到 localStorage
const regs = JSON.parse(localStorage.getItem('lp_registrations') || '[]');
regs.push(data);
localStorage.setItem('lp_registrations', JSON.stringify(regs));

樂觀 UI + GAS 容錯機制(強制執行):

// 1. 立即顯示成功訊息 — 不等待 GAS 回應
function submitForm(data) {
  // 先備份到 localStorage
  backupToLocal(data);

  // 立即顯示成功訊息(樂觀)
  showSuccessMessage();

  // 背景提交 GAS — 不阻塞 UI
  submitToGAS(data).catch(() => {
    // GAS 失敗但 localStorage 已有資料 → 靜默重試
    scheduleRetry(data);
  });
}

// 2. 如果 GAS 失敗則自動重試
function scheduleRetry(data, attempt = 1) {
  if (attempt > 3) return; // 失敗 3 次後放棄
  setTimeout(() => {
    submitToGAS(data).catch(() => scheduleRetry(data, attempt + 1));
  }, attempt * 3000); // 3 秒, 6 秒, 9 秒
}

// 3. GAS 超時設定為 10 秒(不讓使用者無限期等待)
async function submitToGAS(data) {
  const controller = new AbortController();
  const timeout = setTimeout(() => controller.abort(), 10000);
  try {
    // 使用 fetch 的 no-cors 模式(GAS 不回傳回應內容)
    await fetch(SHEETS_ENDPOINT, {
      method: 'POST', mode: 'no-cors',
      body: new URLSearchParams(data),
      signal: controller.signal
    });
  } finally {
    clearTimeout(timeout);
  }
}

注意: 使用 no-cors 模式的 fetch 搭配 URLSearchParams 是隱藏 iframe 的替代方案,不會被 CORS 阻擋。請根據情境擇一使用。


第 3.5 階段 — 瀏覽器驗證(部署前)

觸發條件: index.html 檔案已建立完成。

使用瀏覽器工具進行驗證,然後再告知使用者查看:

  1. 在瀏覽器中開啟檔案(或使用本地伺服器)
  2. 響應式檢查:
    • 行動裝置 375px:選單未破版,表單適配螢幕,文字未被截斷
    • 桌上型電腦 1440px:未過寬,佈局平衡
  3. 使用者體驗檢查:
    • CTA 按鈕在折疊線上方可見,無需滾動
    • 表單提交:輸入測試資料 → 檢查主控台無錯誤
    • FAQ 手風琴展開/收合功能正常
    • 平滑滾動,無卡頓
  4. 視覺檢查:
    • 顏色符合所選色板
    • 字型正確載入(Be Vietnam Pro)
    • 無任何殘留的佔位文字
  5. 截圖與報告: 截取桌上型電腦和行動裝置的螢幕截圖,發送給使用者預覽

⚠️ 必須通過此檢查清單中的所有項目,才能執行第 3.6 階段的優化與第 4 階段的部署。


第 3.6 階段 — 優化調整

在使用者確認內容無誤後,執行一輪打磨:

  • 微動畫: 為每個區塊在滾入視口時添加 fade-in 效果(IntersectionObserver)
  • 懸停效果: 按鈕懸停時輕微縮放(transform: scale(1.03))
  • CTA 脈動: 主要註冊按鈕具有微弱的脈衝動畫以吸引目光
  • 計數器動畫: 統計數字(3 個班級、500+ 學生)在進入視口時從 0 數到目標值
  • 表單回饋: 提交時顯示載入狀態,發送後顯示成功訊息
  • 導航列模糊: 向下滾動時,導航列加入 backdrop-filter: blur() 效果,並產生陰影

第 4 階段:部署至 Cloudflare Pages

使用 Cloudflare API 直接建立部署(無需透過 Git):

步驟 1 — 準備檔案(根據需要進行最佳化):

# 建立新的目錄並放入 index.html
mkdir -p cf-pages-deploy && cd cf-pages-deploy
cp ../index.html ./

# 使用 HTMLMinifier 或類似工具進行最佳化(可選)
# npm install -g html-minifier
# html-minifier --collapse-whitespace --remove-comments --remove-optional-tags \
#   --remove-redundant-attributes --remove-script-type-attributes \
#   --remove-style-link-type-attributes --use-short-doctype -o index.html index.html

步驟 2 — 使用 cURL 建立部署(一次性,無需 Wrangler):

# 建立部署(使用 Cloudflare Pages API)
curl -X POST "https://api.cloudflare.com/client/v4/accounts/YOUR_ACCOUNT_ID/pages/projects/YOUR_PROJECT_NAME/deployments" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: multipart/form-data" \
  -F "index.html=@./index.html"

步驟 3 — 將部署標記為生產環境:

# 取得部署 ID
DEPLOY_ID=$(curl -s \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  "https://api.cloudflare.com/client/v4/accounts/YOUR_ACCOUNT_ID/pages/projects/YOUR_PROJECT_NAME/deployments" | \
  python3 -c "import sys,json; d=json.load(sys.stdin); print([x['id'] for x in d['result'] if x['latest_stage']['name']=='deploy'][0])")

# 設定為生產環境
curl -X PATCH "https://api.cloudflare.com/client/v4/accounts/YOUR_ACCOUNT_ID/pages/projects/YOUR_PROJECT_NAME/deployments/$DEPLOY_ID" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"env_vars":{"ENVIRONMENT":{"value":"production"},"CAMPAIGN_NAME":{"value":"CAMPAIGN_NAME_HERE"}}}'

步驟 4 — 如果使用者有自訂網域(可選):

# 將自訂網域新增至專案
curl -X POST "https://api.cloudflare.com/client/v4/accounts/YOUR_ACCOUNT_ID/pages/projects/YOUR_PROJECT_NAME/domains" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"name":"uudai.yourdomain.com"}'

成功標準

在標記為完成之前,必須滿足以下所有條件:

  • 使用者滿意所有內容
  • Index.html 已生成並通過瀏覽器驗證
  • Google Apps Script 已建立且使用者已成功部署 Web App
  • Landing Page 已部署至 Cloudflare Pages
  • 表單運作正常:送出測試資料後,Google Sheets 中出現新行(使用者應檢查)
  • Mem0(如果可用)已儲存設定以供未來使用

附錄:EEC 複製公式

吸引(Attract)— 英雄區標題公式:

[具體利益] + [數字/時間] + [明確對象]

範例:

  • ❌ 「學習中文」
  • ✅ 「8 週精通學術中文 — 為留學生設計」
  • ✅ 「100% 免費學習 — 僅 15 個名額,立即註冊」

參與(Engage)— 優勢區塊結構:

  • 以「我了解您的痛點」開頭
  • 每個優勢 = 1 個具體結果,而非 1 項功能
  • 在可能的情況下包含社會證明

轉換(Convert)— CTA 最佳實踐:

  • 使用第一人稱(「是的,我要註冊!」勝過「註冊」)
  • 低承諾語言(「了解詳情」勝過「立即購買」)
  • 緊急性與稀缺性(「僅剩 5 個名額」、「優惠將於 24 小時後結束」)

疑難排解

問題解決方案
GAS Web App 部署失敗檢查帳戶權限並確保已啟用 Apps Script API。按照步驟 2 重新部署。
Cloudflare Pages 部署失敗驗證 Account ID 和 API 金鑰是否正確。確保專案名稱尚未被使用。
表單提交但 Sheets 中無資料檢查 GAS Web App URL 是否正確。在瀏覽器開發者工具的網路分頁中驗證 POST 請求是否成功。
字型載入失敗確認 index.html 中的 Google Fonts CSS @import 或 <link> 語法正確。檢查是否有網路限制。
Mem0 不可用這屬於預期行為。技能應在沒有 Mem0 的情況下正常運作。跳過所有 Mem0 相關步驟。

相關技能