輕鬆發起與參加團購
Translation pending
CommerceTypeScript · JavaScriptGitHub @weber-yuanOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗基於 Next.js 開發的團購管理平台,支援建立團購、訂單管理、後台管理等功能。
1. 安裝相依套件
npm install
2. 建立環境變數檔案
在專案根目錄建立 .env.local:
TURSO_DATABASE_URL=libsql://your-db.turso.io
TURSO_AUTH_TOKEN=your-auth-token
JWT_SECRET=your-jwt-secret
BLOB_READ_WRITE_TOKEN=your-vercel-blob-token
3. 初始化資料庫結構
TURSO_DATABASE_URL=... TURSO_AUTH_TOKEN=... node scripts/setup-db.mjs
4. 啟動開發伺服器
npm run dev
開啟瀏覽器前往 http://localhost:3000。
初始化資料庫時會建立一個 admin 帳號,密碼來源為:
ADMIN_PASSWORD 環境變數 → 使用該值setup-db.mjs 執行時印出一次(請當下記下來)⚠️ 不再有寫死的固定預設密碼。請在初始化後立即登入並於「個人資料」頁更改為強密碼。
忘記密碼可透過「忘記密碼」頁面以電子郵件自助重設(需帳號已設定 email),或聯繫管理員由後台直接重設。
npm run dev # 啟動開發伺服器(localhost:3000)
npm run build # 正式環境建置
npm run start # 啟動正式伺服器
npm run lint # 執行 ESLint
清除 Next.js 快取(遇到建置問題時使用):
rm -rf .next && npm run dev
src/
├── app/
│ ├── api/ # API Route Handlers
│ ├── buy/ # 公開團購頁面
│ ├── my-orders/ # 我的訂單
│ ├── forgot-password/ # 忘記密碼
│ ├── reset-password/ # 重設密碼
│ ├── dashboard/ # 使用者後台(含個人資料頁)
│ └── admin/ # 管理員後台
├── components/ # 共用元件(Navbar、GlassCard、GroupBuyForm)
├── lib/
│ ├── db.ts # Turso 資料庫連線
│ ├── auth.ts # JWT 驗證工具(jsonwebtoken,Node 端)
│ ├── jwt-secret.ts # JWT secret 單一來源(正式環境強制要求)
│ ├── email.ts # 寄送重設密碼信件
│ └── utils.ts # 共用工具函式
└── proxy.ts # 路由保護(/dashboard、/admin);以 jose 驗證 JWT
scripts/
└── setup-db.mjs # 資料庫初始化與管理員建立
| 狀態 | 首頁顯示 | 直接連結可瀏覽 | 可提交訂單 |
|---|---|---|---|
| 進行中(is_public = 1) | ✅ | ✅ 任何人 | ✅ |
| 已到期 | ❌(自動鎖定後隱藏) | ✅ 任何人(顯示「已鎖定」) | ❌ |
| 手動鎖定 | ❌ | ✅ 任何人(顯示「已鎖定」) | ❌ |
| 未公開(is_public = 0) | ❌ | ✅ 任何人(仍可直接開) | ✅(若未到期且未鎖定) |
說明:
autoLockExpired() 於每次讀取 /api/group-buys 或 /api/group-buys/[id] 時執行),手動鎖定與到期鎖定在資料庫狀態上一致,首頁均不顯示。/buy/[slug] 頁面無身份驗證保護,知道連結的人皆可瀏覽;鎖定時頁面會顯示已截止提示並隱藏報名表單。使用 Turso 雲端 SQLite。資料表包含:users、group_buys、options、orders、order_items、password_reset_tokens。
Schema 不自動遷移,需手動執行 scripts/setup-db.mjs 初始化或重設。
src/proxy.ts 跑在 Edge runtime(Vercel),改用 jose 驗證 JWT,而非 jsonwebtoken(後者依賴 Node crypto,在 Edge 會拋錯,曾導致進入 /dashboard 一律被導回登入)。Node 端 API 仍以 jsonwebtoken 簽發,兩者用同一把 HS256 secret,完全相容。src/lib/jwt-secret.ts 是 secret 的單一來源;正式環境(NODE_ENV=production)未設定即直接拋錯,不再有任何寫死的 fallback,避免有人用公開原始碼偽造管理員 token。請勿從部署平台移除此變數。next.config.ts 對所有路由套用 HSTS、X-Frame-Options: DENY、X-Content-Type-Options: nosniff、Referrer-Policy、Permissions-Policy。待強化(demo 階段未做):登入失敗次數限制、CSP(需 nonce)、上傳檔案 magic-byte 檢查、密碼強度規則。
master 會自動觸發正式部署)TURSO_DATABASE_URLTURSO_AUTH_TOKENJWT_SECRET(必填;未設定正式站會無法啟動)BLOB_READ_WRITE_TOKEN(連結 Vercel Blob Store 後自動注入)NEXT_PUBLIC_BASE_URL(完整網域,選填)ADMIN_PASSWORD(選填;供 setup-db.mjs 建立管理員時使用)EMAIL_HOST、EMAIL_PORT、EMAIL_USER、EMAIL_PASS(SMTP,選填)環境變數新增 / 修改後需重新部署才會套用到正式站(Vercel 顯示「Needs Attention」即代表尚未套用)。