Bon de commande
Commandez vos produits cosmétiques LPG en ligne
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
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」即代表尚未套用)。