奧微官網
Vibe Coding 從零開始 / 換成你的點子 / 第 21 課

VIBE CODING · 第 21 課

做出自己的網頁與管理後台

上一課你的產品有了資料和 API。這一課照做小店預約的順序,一段一段加上網頁和管理後台,做到你在第 06 課寫下的及格線。

  1. PHASE 01認識 Vibe Coding 和工具
  2. PHASE 02第一次做出東西
  3. PHASE 03規劃你的產品
  4. PHASE 04做出小店預約
  5. PHASE 05上線前要懂的事
  6. PHASE 06換成你的點子
  7. PHASE 07往商用產品前進
  • 網頁
  • 後台
  • App
Docker
  • API
  • 資料庫
  • Redis
  • 測試收信匣

這一課動到:網頁、後台(Redis、測試收信匣用得到才做)

你現在在這裡:第 6 階段的第二課。上一課你的產品有了核心流程的資料和 API,這一課加上給人用的網頁和管理後台。

怎麼替自己的產品做出網頁和管理後台?

照做小店預約的順序來:先做使用者的網頁、再讓它像樣又好用,接著做管理後台和設定,需要的話再加防止重複和通知信。每一段都用同一套提示詞,把小森髮廊換成你的產品。每做完一段就對照第 06 課寫的及格線,全部做到才算完成。

六段對照:你做過的每一課

這一課把第 09 到 14 課濃縮成六段,每一段對應一課。做小店預約時卡住的地方,可以回到那一課看。

第 1 段:使用者的網頁
對應第 09 課。使用者從頭到尾走完你的核心流程。
第 2 段:像樣又好用
對應第 10 課。logo、配色和字體一致;填錯有提示、不能選的看得出來、送出後有成功畫面,手機上也正常。
第 3 段:管理後台
對應第 11 課。管理的人登入、看資料、改狀態;密碼不存原文。
第 4 段:不改程式也能改設定
對應第 12 課。價格、名額、時間這類會變的東西,管理的人自己在後台改。
第 5 段:防止重複(可以跳過)
對應第 13 課。有名額、時段或數量上限,怕兩個人同時搶到的產品才需要。
第 6 段:通知信(可以跳過)
對應第 14 課。需要讓使用者收到確認或提醒的產品才需要。

及格線:這一課的完成條件

第 06 課產品說明裡的「做到什麼程度算及格」,就是這一課的完成條件。它像考試的及格分數,先求每一項都做到,不求每一項都做到最好。小店預約的客人和店家,換成你的產品就是「使用者」和「管理的人」,例如補習班的家長和老師。

成果預覽:你的產品有了畫面和後台

以補習班課程報名為例:http://localhost:3000 左上角有 logo,列出國中數學、英文會話、程式入門三門課,國中數學的秋季第 1 梯是灰色的額滿;右邊是報名後的「已收到您的報名」,附報名編號。
以補習班課程報名為例:http://localhost:3000 左上角有 logo,列出國中數學、英文會話、程式入門三門課,國中數學的秋季第 1 梯是灰色的額滿;右邊是報名後的「已收到您的報名」,附報名編號。
http://localhost:3001 的櫃台管理後台:登入後的「報名名單」列出每一筆報名,最上面 #5 是剛剛在網頁送出的那一筆,有效的報名旁邊有「取消」按鈕。
http://localhost:3001 的櫃台管理後台:登入後的「報名名單」列出每一筆報名,最上面 #5 是剛剛在網頁送出的那一筆,有效的報名旁邊有「取消」按鈕。

你的畫面和這裡不同是正常的:產品不同,網頁和後台長得也不同。使用者走得完核心流程、管理的人在後台看得到同一筆資料,就是做對了。

上課前:準備好這四樣

上一課的專案
「文件」裡你在第 20 課建的專案資料夾,http://localhost:8000/docs 看得到你的 API。還沒做好的話,先回第 20 課做完。
你的及格線
專案資料夾裡的 product-brief.md,看「做到什麼程度算及格」和第 20 課加上的「核心流程」兩段。
做圖
請 Codex 畫 logo 要用 ChatGPT 付費方案,第 10 課說明過。沒有的話,準備一張自己的圖片,或先用純文字 logo。
Chrome 瀏覽器
第 10 課裝好的 Chrome,縮成手機寬度檢查時用。

這三步要你自己按

確認工作箱在跑、讓 Codex 在哪裡工作、想一組後台密碼,都要你自己來。挑哪一款 logo,也是你決定。

步驟 1打開 Docker Desktop,確認只有你的專案在跑

  1. 打開 Docker Desktop,點左邊的「Containers」。
  2. 你的專案那一組要是綠色的執行中,shop-booking 那一組要是停止的。
Docker Desktop 的容器列表:上面搜尋 class-signup,你的專案那一組都在執行中;下面搜尋 shop-booking,那一組是已停止。
Docker Desktop 的容器列表:上面搜尋 class-signup,你的專案那一組都在執行中;下面搜尋 shop-booking,那一組是已停止。

做完應看到:只有你的專案在跑,http://localhost:8000/docs 打開是你的 API。

如果兩組都在跑:按 shop-booking 那一列的停止按鈕,再按你的專案那一列的啟動按鈕。

步驟 2在 App 打開你的專案,開新對話

  1. 打開 ChatGPT 桌面 App,確認上方選的是「Codex」。
  2. 選「打開資料夾」,選「文件」裡你的專案資料夾,按「New chat」開新對話。
App 裡打開你的專案資料夾、開好新對話的畫面。
示意圖App 裡打開你的專案資料夾、開好新對話的畫面。

做完應看到:新對話的畫面標示著你的專案資料夾。

步驟 3想好後台的練習用密碼

  1. 想一組只在這個專案練習用的密碼,寫在自己的筆記裡。
  2. 不要用你平常真正在用的密碼,第 3 段會把它寫進提示詞。

做完應看到:筆記裡有一組練習用的帳號 owner 和密碼。

Windows:Docker Desktop 從開始選單打開,左邊一樣有「Containers」;Codex 的提示詞不用改。

操作步驟:照第 09–14 課的順序,一段一段加上去

每做完一段,都請 Codex 存一個版本,改壞了才退得回來(第 05 課的存檔點):

這一段完成了,請幫這個專案存一個版本,說明寫「(換成這一段的名稱,例如:第 21 課第 1 段:使用者的網頁)」。

步驟 1請 Codex 排出這一課要做哪幾段

  1. 在 Codex 貼上下面這段,送出。
請讀 product-brief.md 的「核心流程」和「做到什麼程度算及格」,再讀 AGENTS.md。
這一課要做出使用者的網頁和管理後台,順序是:1. 使用者的網頁 2. 像樣又好用 3. 管理後台 4. 不改程式也能改設定 5. 防止同一個名額或時段被搶兩次(Redis) 6. 通知信(Mailpit)。
請告訴我,照我的及格線,這六段哪些要做、哪些用不到可以跳過,各用一句白話說原因。先不要改檔案。
Codex 逐段回答要做或可以跳過,每段附一句原因。
示意圖Codex 逐段回答要做或可以跳過,每段附一句原因。

做完應看到:六段各自標著「要做」或「可以跳過」。第 1 到 4 段通常都要做。

步驟 2第 1 段:做出使用者的網頁

  1. 複製下面這段,把括號換成你的核心流程,送出。
  2. Codex 做好後,用瀏覽器打開 http://localhost:3000,自己走一次。
請照 AGENTS.md,在 web/ 資料夾用 React 做出(換成使用者是誰,例如:家長)用的網頁,接上第 20 課做好的 API,走完 product-brief.md 的核心流程:
1. (換成第一步,例如:列出課程,讓家長選一門)
2. (換成第二步,例如:列出這門課的場次和剩下的名額,讓家長選一場)
3. (換成填資料那一步,例如:填學生姓名、家長電話、Email,按「確認報名」)
4. 送出後,在畫面上用一行字告訴使用者已經送出。
讓網頁跟著 Docker 一起跑,打開 http://localhost:3000 就能用。外觀先不用管,下一段再做。
做好後你自己用內建瀏覽器走一次,告訴我怎麼打開。
走完核心流程後,家長頁出現「已收到您的報名」,附報名編號 #5,和學生、課程、梯次、上課時間、學費。
走完核心流程後,家長頁出現「已收到您的報名」,附報名編號 #5,和學生、課程、梯次、上課時間、學費。

做完應看到:你在網頁上從頭走到尾,最後看到已經送出。再請 Codex「查資料庫裡最新的一筆,用白話告訴我內容」,內容就是你剛剛填的。

步驟 3第 2 段:讓網頁像樣又好用

  1. 先貼第一段提示詞,請 Codex 畫 3 款 logo,挑一款。沒有付費方案的話跳過這一段,改用第二段的「純文字 logo」。
  2. 再貼第二段提示詞,把 logo 放上去,順便把好用的三件事做好。
  3. 想要最上面放一張主視覺,照第 10 課的主視覺提示詞,把小森髮廊換成你的產品。
$imagegen 請替「(換成你的產品名)」畫 3 款 logo 給我挑。
(換成一兩句產品介紹,例如:社區裡的小型數學教室,給國中生上課,感覺認真、明亮、親切。)
圖案用簡單的線條,縮小放在手機畫面左上角也要看得清楚。
logo 裡不要放任何文字,名稱我會用網頁上的文字排;背景用白色。
請把我選的(換成第幾款)logo 存進 web/ 資料夾,放在網頁左上角,旁邊用文字寫「(換成你的產品名)」。沒有 logo 圖的話,改用文字和顏色排一個簡單的 logo。
從 logo 的顏色挑一個主色、一個輔助色,整個網頁的按鈕、標題和連結都用這兩個顏色,全站統一用一種好讀的中文字體。
再做到這三件事:
1. 填錯有提示:(換成必填的欄位,例如:學生姓名、家長電話、Email)沒填或格式不對時,不要送出,在那一格下面用紅字寫出哪裡要改。
2. 不能選的看得出來:(換成你的情況,例如:名額已滿的場次)改成灰色、寫「額滿」、不能點。
3. 送出後有成功畫面:列出這次的內容,再放一個回到首頁的按鈕。
改完請用內建瀏覽器,用電腦寬度和 390 像素寬各走一次,告訴我結果。
上面是 3 款 logo 草案(方案 2 是網站採用的);下面是放上 logo 後的網頁:額滿的秋季第 1 梯是灰色,報名資料空著或填錯時,欄位下方出現紅字。
上面是 3 款 logo 草案(方案 2 是網站採用的);下面是放上 logo 後的網頁:額滿的秋季第 1 梯是灰色,報名資料空著或填錯時,欄位下方出現紅字。

做完應看到:網頁有 logo、顏色一致;故意少填一欄,送不出去並出現紅字;在 Chrome 縮成手機寬度也不用左右滑。

縮成手機寬度時跑版:回它「在 390 像素寬打開時,(寫出你看到的問題)。請修好,並用 390 像素寬和電腦寬度各檢查一次」。

步驟 4第 3 段:做出管理後台

  1. 複製下面這段,把括號換成你的產品和練習用密碼,送出。
  2. 用瀏覽器打開 http://localhost:3001,用 owner 和你的密碼登入。
請做出(換成管理的人,例如:補習班老師)用的管理後台,畫面放在 admin/ 資料夾,用瀏覽器打開 http://localhost:3001。
1. 登入:建立一個管理帳號,帳號是 owner,密碼是「(換成你想好的練習用密碼)」。資料庫裡不要存密碼原文,只存雜湊過的值。
2. 登入後列出(換成要看的資料,例如:每一場的報名名單),顯示(換成要看的欄位,例如:學生姓名、家長電話、課程、場次、狀態)。
3. 每一筆旁邊加上(換成要做的動作,例如:「取消」和「標記已到課」)按鈕,取消前先跳出確認,狀態改完列表上要看得出來。
4. 沒登入的人打開後台,只看得到登入畫面。
後端的登入和管理功能放在 backend/app/routers/admin.py,API 放在 /api/admin/ 底下,照 AGENTS.md 的規矩。做好後跑起來,告訴我怎麼打開。
左:櫃台管理後台的登入畫面,密碼顯示成圓點;右:登入後的報名名單,最上面 #5 是步驟 2 在網頁送出的那一筆,旁邊有「取消」按鈕。
左:櫃台管理後台的登入畫面,密碼顯示成圓點;右:登入後的報名名單,最上面 #5 是步驟 2 在網頁送出的那一筆,旁邊有「取消」按鈕。

做完應看到:登入後看得到你在網頁送出的那一筆;按一個動作後,狀態跟著變。沒登入時只看得到登入畫面。

步驟 5第 4 段:不改程式也能改設定

  1. 複製下面這段,把括號換成管理的人要能自己改的東西,送出。
  2. 在後台改一項設定,回到 http://localhost:3000 重新整理。
請在管理後台加上「設定」頁,讓管理的人不改程式就能調整:(換成要能改的設定,例如:課程名稱、學費、每場名額、上課時間、停課日)。
改完存進資料庫,使用者的網頁要馬上跟著變,不用重新啟動。
設定用的 API 放在 /api/admin/ 底下,只有登入的人能用。改完告訴我怎麼試。
上面:後台「課程與梯次設定」把國中數學秋季第 1 梯的總名額改成 2,有效報名 2 人、剩餘 0 名;下面:家長頁重新整理後,這一梯變成灰色的額滿。
上面:後台「課程與梯次設定」把國中數學秋季第 1 梯的總名額改成 2,有效報名 2 人、剩餘 0 名;下面:家長頁重新整理後,這一梯變成灰色的額滿。

做完應看到:在後台改的設定,使用者的網頁重新整理後就變了。

步驟 6第 5 段:防止同一個名額被搶兩次(用不到就跳過)

Redis 像櫃台先把時段夾住的夾子:有人正在訂,就先夾住,另一個人訂不走。步驟 1 裡 Codex 說可以跳過的話,直接做下一步。

  1. 複製下面這段,把括號換成你的產品會被搶的東西,送出。
我的產品裡,(換成會被搶的東西,例如:每一場的最後一個名額)可能同時被兩個人搶。請用 Redis 防止重複:
1. 送出時,先用 Redis 把它夾住,夾住的人才能存進資料庫。
2. 沒夾到的人,網頁顯示「(換成你要的說明,例如:這一場剛額滿,請選別的場次)」。
3. 夾子最多夾 30 秒,萬一沒完成會自動放開。
Docker 裡已經有 Redis,直接用它。改完你自己用兩個同時送出的請求試一次,告訴我是不是只有一個成功。
Codex 回報兩個同時送出的請求只有一個成功,另一個收到「剛額滿」的說明。
示意圖Codex 回報兩個同時送出的請求只有一個成功,另一個收到「剛額滿」的說明。

做完應看到:Codex 回報只有一個成功。想親手搶一次,照第 13 課開兩個視窗試。

步驟 7第 6 段:通知信(用不到就跳過)

  1. 複製下面這段,把括號換成你的產品什麼時候寄信、信裡寫什麼,送出。不需要取消的產品,把第 3 項刪掉。
  2. 在網頁上走一次核心流程,打開 http://localhost:8025 看信。
請在(換成寄信的時機,例如:報名成功)時,寄一封信到使用者填的 Email。信一律寄到 Docker 裡的測試收信匣 Mailpit,不要設定任何真實的寄信帳號或密碼。
1. 主旨寫「(換成主旨,例如:晨光數學教室 報名確認)」。
2. 內容寫(換成信裡要有的資料,例如:學生姓名、課程、場次時間、學費)。
3. 最後附一個取消連結:每一筆產生一組別人猜不到的取消碼,只放在這封信的連結裡;取消後,管理後台看得到狀態變成已取消。
4. 寄信失敗時,原本的動作照樣成立,但要記下錯誤。
改完重新啟動服務,告訴我改了哪些檔案、怎麼在 http://localhost:8025 看到信。

做完應看到:測試收信匣裡有一封信,內容對得上你剛剛填的資料。有做取消連結的,點下去能取消,後台也跟著變。

步驟 8對照及格線,用 VS Code 看改了哪些檔案,存一個版本

  1. 貼上第一段提示詞,請 Codex 逐項對照你的及格線。
  2. 還沒做到的,一次補一項:「請補上及格線裡的(換成還沒做到的那一項),改完用內建瀏覽器走一次,告訴我結果,再存一個版本。」
  3. 全部做到後,在 VS Code 打開你的專案,看左邊多了 web/、admin/ 這些資料夾,再貼第二段提示詞。
請對照 product-brief.md 的「做到什麼程度算及格」,逐項告訴我現在「做到了」還是「還沒做到」;還沒做到的,說明還差什麼。這一課跳過的段落,請標「這一課跳過」。先不要改檔案。
請列出這一課你新增和修改了哪些檔案,每個用一句白話說它在做什麼。
再對照 AGENTS.md,告訴我有沒有哪個檔案管了不只一件事,或使用者的網頁和管理後台混在同一個資料夾。
列完請幫我存一個版本,說明寫「第 21 課:網頁與管理後台達到及格線」。
VS Code 左邊的檔案列表看得到 admin/、backend/、web/,裡面是後台和網頁的 React 檔案;右邊打開的是 AGENTS.md。
VS Code 左邊的檔案列表看得到 admin/、backend/、web/,裡面是後台和網頁的 React 檔案;右邊打開的是 AGENTS.md。

做完應看到:及格線每一項都是「做到了」或「這一課跳過」,Codex 回報版本已經存好。

Windows:在 Chrome 按 F12 或 Ctrl + Shift + I 打開開發人員工具,點手機和平板的圖示切到手機模式,和第 10 課一樣;其他步驟和提示詞都不用改。

成果檢查

成功的樣子:

  • 在 http://localhost:3000 從頭到尾走得完你的核心流程,送出後有成功畫面。
  • 故意填錯會出現紅字,不能選的看得出來,縮成手機寬度也正常。
  • http://localhost:3001 要先登入,登入後看得到你剛剛在網頁送出的那一筆,也改得了狀態。
  • 在後台改一項設定,使用者的網頁重新整理後跟著變。
  • 有做第 5、6 段的:Codex 試過同時送出只有一個成功;http://localhost:8025 收得到信。
  • Codex 對照及格線,每一項都是「做到了」或「這一課跳過」,也存好了第 21 課的版本。

還沒成功的樣子:網頁走到一半出錯、後台看不到網頁送出的資料、改了設定網頁沒變,或及格線還有「還沒做到」。照下面「卡住時怎麼辦」處理。

畫面和截圖不一樣是正常的,你的產品本來就和補習班不同。看結果就好:走得完、看得到、改得動。

卡住時怎麼辦

http://localhost:3000 打不開

我在瀏覽器打不開 http://localhost:3000。請檢查使用者的網頁有沒有跟著 Docker 跑起來、有沒有被 shop-booking 佔用,找出原因修好,改完告訴我改了什麼。

網頁打開了,列表是空的

http://localhost:3000 打開了,但列表是空的。請確認網頁有沒有接上 http://localhost:8000 的 API、資料庫裡有沒有示範資料,自己打開網頁試一次,找出原因修好,改完告訴我改了什麼。

後台看不到網頁送出的資料

我在使用者的網頁送出了一筆,填的姓名是「(換成你填的姓名)」,管理後台卻看不到。請檢查這一筆有沒有存進資料庫、後台讀的是不是同一個資料庫、列表有沒有篩掉它,修好後告訴我原因。

在後台改了設定,網頁沒變

我在管理後台把(換成你改的設定)改了,使用者的網頁重新整理後還是舊的。請檢查設定有沒有存進資料庫、網頁是不是每次都向 API 拿最新的設定,修好後告訴我原因。

及格線有一項一直做不好

及格線裡的(換成那一項)一直做不好。請把它拆成幾個小步驟,每一步做完讓我在瀏覽器確認,再做下一步;每一步確認後存一個版本。

Codex 做了及格線以外的功能

這一課只做到 product-brief.md 的及格線。請把及格線以外新增的功能拿掉,列出拿掉了哪些,確認核心流程還走得通,再存一個版本。

改壞了

我改壞了,請把專案退回上一個版本,退回後告訴我改回了什麼。

練習:說得出資料走了哪幾站

自己在使用者的網頁送出一筆,再到管理後台找到它。接著請 Codex 說給你聽,這筆資料經過了哪些地方:

請用白話告訴我,使用者在 http://localhost:3000 按下送出之後,資料經過哪幾站才存進資料庫,管理的人又是怎麼在 http://localhost:3001 看到它的?每一站在專案的哪個資料夾?

在 VS Code 照著 Codex 說的資料夾點開看看。說得出「網頁在 web/、後台在 admin/、規則和資料在 backend/」,下一課加 App 和測試時就不會迷路。

常見問題

我的產品一定要有管理後台嗎?

大多數產品都需要。資料存進來後,總要有人看、改狀態、調整設定;沒有後台,這些事只能請 Codex 直接改資料庫。只有自己一個人用的小工具,才可以先不做。

哪些段落可以跳過?

防止重複和通知信可以看情況跳過。有名額、時段或數量上限,才需要防止兩個人同時搶到;需要讓使用者收到確認或提醒,才需要通知信。拿不定主意,就請 Codex 對照你的及格線判斷。

做到什麼程度才算完成?

做到你在第 06 課寫的「做到什麼程度算及格」。請 Codex 逐項對照,每一項都是「做到了」就算完成;還沒做到的,一項一項補。

沒有付費方案,logo 怎麼辦?

可以請 Codex 用網頁的文字和顏色排一個簡單的 logo,或放一張你自己的圖片。畫面配色一致、看得出是同一個產品,比 logo 精不精美更重要。

來源與版本

官方資料查閱日:2026-09-29。Codex、Chrome 與 Docker Desktop 的按鈕名稱可能隨版本改變;這一課沿用第 09–14 課的提示詞。獨立教學,非 OpenAI、Meta、Google 的官方課程。