Skip to content

C9 Entertainment City — 產品規格書 (PM 版)

文件版本:v1.0 最後更新:2026-03-01 適用對象:Product Manager / Project Manager 語言:繁體中文


目錄


第 1 章:平台總覽

1.1 平台簡介

C9 Entertainment City 是一套完整的線上娛樂城白牌平台解決方案。平台採用前後端分離架構,包含三個獨立子專案:前台 (c9-ec)、後台管理系統 (c9-ims)、後端 API 伺服器 (c9-be)。

平台的核心設計理念為「白牌架構」(White-Label),意味著同一套程式碼可以透過站點配置 (siteCode) 快速部署為多個不同品牌的娛樂城,每個站點擁有獨立的:

  • 品牌視覺 (Logo、主題色、吉祥物)
  • 遊戲配置 (遊戲商、遊戲分類)
  • VIP 等級與反水規則
  • 金流通道
  • 代理推廣體系
  • 多語系支援

1.2 系統架構圖

                         +-----------------------+
                         |      使用者瀏覽器       |
                         +-----------+-----------+
                                     |
                    +----------------+----------------+
                    |                                  |
          +---------v----------+            +----------v---------+
          |     c9-ec (前台)     |            |    c9-ims (後台)    |
          |   Nuxt 4.2 / Vue 3  |            |  Next.js 16 / React|
          |   Port: 3010        |            |  Port: 3011        |
          +---------+-----------+            +----------+---------+
                    |                                   |
                    |     HTTP API (REST JSON)           |
                    +----------------+------------------+
                                     |
                          +----------v-----------+
                          |     c9-be (後端)       |
                          |   NestJS v11          |
                          |   Port: 8080          |
                          +----+-----+-----+-----+
                               |     |     |
                    +----------+  +--+--+  +----------+
                    |             |     |              |
              +-----v----+  +----v--+  +--v-----+ +---v---------+
              |  MySQL    |  | Redis |  |  R2    | | 外部服務     |
              |  資料庫    |  | 快取   |  | 儲存   | | (金流/遊戲)  |
              +----------+  +-------+  +--------+ +-------------+

1.3 技術棧總覽

前台 (c9-ec)

項目技術版本
框架Nuxt4.2
UI 框架Vue3.5
語言TypeScript-
UI 元件Nuxt UI v4(Tailwind CSS)
狀態管理Pinia-
多語系@nuxtjs/i18n(zh-TW, en-US, zh-CN, th-TH, vi-VN)
表單驗證Zod v4-
測試Vitest + Playwright-
裝置指紋FingerprintJSv5

後台 (c9-ims)

項目技術版本
框架Next.js16.1
UI 框架React19.2
語言TypeScript-
UI 元件shadcn/ui(Radix UI + Tailwind CSS v4)
狀態管理TanStack React Query v5 + Zustand v5-
多語系next-intlv4.8
認證NextAuth5 beta
表格TanStack React Tablev8
表單React Hook Form + Zod v4-
圖表Rechartsv3
富文本編輯器Tiptapv3

後端 (c9-be)

項目技術版本
框架NestJSv11
語言TypeScript5.7 (strict)
資料庫MySQLutf8mb4, TZ +08:00
ORMTypeORM0.3.28
快取Redis(@keyv/redis)
認證JWT + Passport/ AdminJWT
排程@nestjs/schedule(Cron)
API 文件Swagger UI-
EmailResend API-
SMSTwilio-
2FAspeakeasy(TOTP/Google Auth)
匯率tw-exchange(台灣銀行即時匯率)
檔案儲存Cloudflare R2(S3-compatible)

1.4 專案規模統計

c9-ec (前台)

統計項目數量
頁面 (Pages)20
元件 (Components)77+ (含 A1/A2 佈局變體共 121)
Composables45
Stores4 (appStore, gameStore, promoStore, userStore)
API 模組12 (useAuthApi, useGameApi, useDepositApi, useWalletApi, useWithdrawalApi, useVipApi, usePromoApi, useAffiliateApi, useInboxApi, useMissionApi, useSiteConfigApi, useApi)
型別定義檔13 (affiliate, auth, common, deposit, game, inbox, mission, promo, site-config, vip, wallet, withdrawal, index)

c9-ims (後台)

統計項目數量
頁面 (Pages)68
元件 (Components)41 (layout 14 + shared 11 + ui 16)
Hooks15 (useApi, useApiQuery, useMultiSiteTabs, useNotify, usePermissions, useDomainConfig, useInitEnums, useR2Url + 7 API hooks)
API Hooks7 (useAdminApi, useAuthApi, useFinanceApi, useAffiliateApi, useVipApi, useGameApi, useContentApi)
Stores3 (siteFilterStore, enumStore, uiStore)
型別定義檔11

c9-be (後端)

統計項目數量
API 端點205+
資料表 (Tables)49
模組 (Modules)23
服務 (Services)30+
DTO53
Controller25
Entity48
Cron Jobs5
i18n 檔案85 (5 語系 x 17 檔案)
Seeds 腳本19+

1.5 支援語系

語系代碼語言名稱幣別對應
zh-TW繁體中文TWD (新台幣)
en-USEnglishUSD (美元)
zh-CN簡體中文CNY (人民幣)
th-THภาษาไทย (泰語)THB (泰銖)
vi-VNTiếng Việt (越南語)VND (越南盾)

1.6 服務端口

專案開發端口說明
c9-ec3010前台娛樂平台
c9-ims3011後台管理系統
c9-be8080後端 API (prefix: /api)

1.7 統一系統規範

幣別規範

  • 系統內部所有金額一律使用 USD 儲存
  • 資料庫欄位型別:decimal(18,6),精確到小數點後 6 位
  • 入金時由後端透過台灣銀行即時匯率轉換
  • USD 截斷規則:Math.floor(value * 1e6) / 1e6(無條件捨去)

資料精度

用途資料庫型別精度說明
金額decimal(18,6)小數 6 位
匯率decimal(18,10)小數 10 位
百分比decimal(5,2)小數 2 位
倍率decimal(10,2)小數 2 位

統一回應格式

成功回應:
  HTTP 200
  { code: 200, message: "ok", result: <資料>, timestamp: <時間戳>, path: <API路徑> }

業務錯誤:
  HTTP 200
  { code: <非200的錯誤碼>, message: <當前語系錯誤訊息>, timestamp: <時間戳>, path: <API路徑> }

未授權:
  HTTP 401
  { code: 401, message: "Unauthorized" }

認證機制

角色認證方式Token 過期說明
前台用戶JWT Bearer Token7 天支援帳密/Google/Telegram 登入
後台管理員AdminJWT-獨立策略,payload 含 role: 'admin'
後台 IMSNextAuth 5 beta-JWT 策略 + Credentials Provider

第 2 章:功能模組清單

2.1 模組總覽

以下為 C9 平台所有功能模組的完整清單,按分類整理。

2.1.1 認證系統 (Auth) — 17 個端點

功能前台頁面後端 API狀態多站點
帳號註冊Modal (Register)POST /auth/register已完成Y (siteCode)
帳號登入Modal (Login)POST /auth/login已完成Y (siteCode)
Google OAuth 登入/redirect/[action]POST /auth/google-login已完成Y (siteCode)
Telegram 登入/redirect/[action]POST /auth/telegram-login已完成Y (siteCode)
二步驟驗證 (2FA)Modal (BindGoogleAuth)POST /auth/google-auth/*已完成Y
發送 Email 驗證碼/user/settingPOST /auth/send-email-verify已完成Y
驗證 Email/user/settingPOST /auth/verify-email已完成Y
發送手機驗證碼/user/settingPOST /auth/send-mobile-verify已完成Y
驗證手機號碼/user/settingPOST /auth/verify-mobile已完成Y
設定密碼Modal (SetPassword)PATCH /auth/set-password已完成Y
修改密碼Modal (EditPassword)PATCH /auth/update-password已完成Y
上傳頭像/user/settingPOST /auth/avatar已完成Y
取得用戶資料多處使用GET /auth/user-detail已完成Y
更新用戶資料/user/settingPATCH /auth/update-profile已完成Y
登出HeaderPOST /auth/logout已完成Y
檢查帳號可用性Modal (Register)GET /auth/check-account已完成Y
取得 Google OAuth URLModal (Login)GET /auth/google-auth-url已完成Y

2.1.2 遊戲系統 (Game) — 17 個端點

功能前台頁面後端 API狀態多站點
遊戲供應商列表/gameGET /game/providers已完成Y (siteCode)
遊戲分類列表/gameGET /game/type-configs已完成Y (siteCode)
啟動遊戲/game/playPOST /game/launch已完成Y
試玩遊戲/game/playPOST /game/demo已完成Y
近期遊玩/gameGET /game/recent已完成Y
遊戲排行榜/gameGET /ranking/list已完成Y
BetSolutions S2S 回調-POST /game/betsolutions/callback已完成Y
RSG S2S 回調-POST /game/rsg/callback已完成Y
[Admin] 遊戲商列表/game/providersGET /game/admin/providers已完成Y
[Admin] 新增遊戲商/game/providersPOST /game/admin/providers已完成Y
[Admin] 更新遊戲商/game/providersPATCH /game/admin/providers/:id已完成Y
[Admin] 刪除遊戲商/game/providersDELETE /game/admin/providers/:id已完成Y
[Admin] 分類列表/game/type-configsGET /game/admin/type-configs已完成Y
[Admin] 新增分類/game/type-configsPOST /game/admin/type-configs已完成Y
[Admin] 更新分類/game/type-configsPATCH /game/admin/type-configs/:id已完成Y
[Admin] 刪除分類/game/type-configsDELETE /game/admin/type-configs/:id已完成Y
[Admin] 跨站複製/game/providersPOST /game/admin/copy-site-data已完成Y

2.1.3 金流管理 — 13 個端點

功能前台頁面後端 API狀態多站點
金流群組列表-GET /vendor/groups已完成Y
金流通道列表/user/depositGET /vendor/channels已完成Y
萬通 ATM 入金/user/depositPOST /vendor/wantong/add-atm已完成Y
萬通信用卡入金/user/depositPOST /vendor/wantong/add-card已完成Y
萬通回調-POST /vendor/wantong/callback已完成Y
USDT 回調-POST /vendor/usdt/callback已完成Y
建立存款訂單/user/depositPOST /deposit已完成Y
存款訂單列表/user/transactionGET /deposit/orders已完成Y
取得匯率/user/depositGET /deposit/exchange-rate已完成-
存款訂單詳情/user/transactionGET /deposit/orders/:id已完成Y
提領申請/user/withdrawalPOST /withdrawal/request已完成Y
提領訂單列表/user/transactionGET /withdrawal/orders已完成Y
提領訂單詳情/user/transactionGET /withdrawal/orders/:id已完成Y

2.1.4 錢包管理 (Wallet) — 9 個端點

功能前台頁面後端 API狀態多站點
新增銀行卡/user/walletPOST /wallet/bank-card/add已完成Y
銀行卡列表/user/walletGET /wallet/bank-card/list已完成Y
刪除銀行卡/user/walletDELETE /wallet/bank-card/:id已完成Y
新增信用卡/user/walletPOST /wallet/credit-card/add已完成Y
信用卡列表/user/walletGET /wallet/credit-card/list已完成Y
刪除信用卡/user/walletDELETE /wallet/credit-card/:id已完成Y
新增加密錢包/user/walletPOST /wallet/crypto-address/add已完成Y
加密錢包列表/user/walletGET /wallet/crypto-address/list已完成Y
刪除加密錢包/user/walletDELETE /wallet/crypto-address/:id已完成Y

2.1.5 VIP 系統 — 13 個端點

功能前台頁面後端 API狀態多站點
VIP 等級列表/user/vipGET /vip/levels已完成Y (siteCode)
用戶 VIP 狀態/user/vipGET /vip/user-status已完成Y
我的返水紀錄/user/vipGET /vip/my-rebates已完成Y
返水規則列表/user/vipGET /vip/rebates已完成Y (siteCode)
[Admin] 等級列表/vip/levelsGET /vip/admin/levels已完成Y
[Admin] 新增等級/vip/levelsPOST /vip/admin/levels已完成Y
[Admin] 更新等級/vip/levelsPATCH /vip/admin/levels/:id已完成Y
[Admin] 刪除等級/vip/levelsDELETE /vip/admin/levels/:id已完成Y
[Admin] 返水 Bulk Upsert/vip/rebatesPOST /vip/admin/rebates/bulk已完成Y
[Admin] 跨站複製/vip/levelsPOST /vip/admin/copy-site-data已完成Y
[Admin] 預覽模板/vip/levelsGET /vip/admin/preview-template已完成Y
[Admin] 帶入模板/vip/levelsPOST /vip/admin/load-template已完成Y
[Admin] VIP 玩家列表/vip/playersGET /admin/reports/vip-players已完成Y

2.1.6 活動系統 (Promo) — 7 個端點

功能前台頁面後端 API狀態多站點
活動列表/promoGET /promo/list已完成Y (siteCode)
活動詳情/promo/[id]GET /promo/:id已完成Y
領取活動/promo/[id]POST /promo/:id/claim已完成Y
活動標籤列表/promoGET /promo/tags已完成Y
[Admin] 新增活動/activity/promos/newPOST /admin/promos/create已完成Y
[Admin] 更新活動/activity/promos/[id]PATCH /admin/promos/:id已完成Y
[Admin] 刪除活動/activity/promosDELETE /admin/promos/:id已完成Y

2.1.7 代理推廣系統 (Affiliate) — 39 個端點

功能前台頁面後端 API狀態多站點
追蹤點擊-POST /affiliate/track-click已完成Y
申請代理/user/affiliatePOST /affiliate/apply-agent已完成Y
代理儀表板/user/affiliateGET /affiliate/dashboard已完成Y
佣金列表/user/affiliateGET /affiliate/commissions已完成Y
結算列表/user/affiliateGET /affiliate/settlements已完成Y
下線列表/user/affiliateGET /affiliate/downlines已完成Y
代理餘額/user/affiliateGET /affiliate/balance已完成Y
申請提款/user/affiliatePOST /affiliate/request-withdrawal已完成Y
提款紀錄/user/affiliateGET /affiliate/withdrawals已完成Y
聯盟資訊/allianceGET /affiliate/alliance-info已完成Y
等級資訊/allianceGET /affiliate/tier-info已完成Y
VIP 里程碑/allianceGET /affiliate/vip-milestones已完成Y
推廣碼列表/user/affiliateGET /affiliate/referral-codes已完成Y
新增推廣碼/user/affiliatePOST /affiliate/referral-codes已完成Y
刪除推廣碼/user/affiliateDELETE /affiliate/referral-codes/:id已完成Y
[Admin] 代理列表/affiliate/agentsGET /affiliate/admin/agents已完成Y
[Admin] 新增代理/affiliate/agentsPOST /affiliate/admin/create-agent已完成Y
[Admin] 結算列表/affiliate/settlementsGET /affiliate/admin/settlements已完成Y
[Admin] 結算審核/affiliate/settlementsPOST /affiliate/admin/settlements/:id/review已完成Y
[Admin] 風控紀錄/affiliate/settlementsGET /affiliate/admin/settlements/:id/risk-logs已完成Y
[Admin] 代理提款列表/affiliate/aff-withdrawalsGET /affiliate/admin/withdrawals已完成Y
[Admin] 提款審核/affiliate/aff-withdrawalsPOST /affiliate/admin/withdrawals/:id/review已完成Y
[Admin] 提款完成/affiliate/aff-withdrawalsPOST /affiliate/admin/withdrawals/:id/complete已完成Y
[Admin] 手動綁定/affiliate/agentsPOST /affiliate/admin/bind已完成Y
[Admin] 綁定紀錄/affiliate/bind-logsGET /affiliate/admin/bind-logs已完成Y
[Admin] 佣金費率列表/affiliate/commission-ratesGET /affiliate/admin/commission-rates已完成Y
[Admin] 更新佣金費率/affiliate/commission-ratesPOST /affiliate/admin/commission-rates已完成Y
[Admin] 刪除佣金費率/affiliate/commission-ratesDELETE /affiliate/admin/commission-rates已完成Y
[Admin] VIP 里程碑列表/affiliate/vip-milestonesGET /affiliate/admin/vip-milestones已完成Y
[Admin] 更新 VIP 里程碑/affiliate/vip-milestonesPOST /affiliate/admin/vip-milestones已完成Y
[Admin] 刪除 VIP 里程碑/affiliate/vip-milestonesDELETE /affiliate/admin/vip-milestones已完成Y
[Admin] 代理等級列表/affiliate/agent-tiersGET /affiliate/admin/agent-tiers已完成Y
[Admin] 更新代理等級/affiliate/agent-tiersPOST /affiliate/admin/agent-tiers已完成Y
[Admin] 刪除代理等級/affiliate/agent-tiersDELETE /affiliate/admin/agent-tiers已完成Y
[Admin] 預覽模板-GET /affiliate/admin/preview-template已完成Y
[Admin] 帶入模板-POST /affiliate/admin/load-template已完成Y
[Admin] 設定代理等級/affiliate/agentsPOST /affiliate/admin/set-agent-tier已完成Y
[Admin] 觸發週結/affiliate/settlementsPOST /affiliate/admin/trigger-settlement已完成Y
[Admin] 觸發日結/affiliate/settlementsPOST /affiliate/admin/trigger-daily-settlement已完成Y

2.1.8 任務系統 (Mission) — 3 個端點

功能前台頁面後端 API狀態多站點
任務列表/missionGET /mission/list已完成Y
任務進度/missionGET /mission/progress已完成Y
領取獎勵/missionPOST /mission/:id/claim已完成Y

2.1.9 站內信 (Inbox) — 7 個端點

功能前台頁面後端 API狀態多站點
通知列表/user/inboxGET /inbox/list已完成Y
通知詳情/user/inboxGET /inbox/:id已完成Y
標記已讀/user/inboxPOST /inbox/:id/read已完成Y
刪除通知/user/inboxDELETE /inbox/:id已完成Y
未讀數量HeaderGET /inbox/unread-count已完成Y
[Admin] 發送通知/mail/inboxPOST /admin/inbox/send已完成Y
[Admin] 通知設定/mail/settingsGET /admin/inbox/settings已完成Y

2.1.10 站點設定 (Site Config) — 8+12 個端點

功能前台頁面後端 API狀態多站點
取得站點設定全站GET /site-config/public已完成Y
取得站點主題全站GET /site-config/theme已完成Y
[Admin] 站點列表/system/site-configGET /site-config/admin/list已完成-
[Admin] 新增站點/system/site-configPOST /site-config/admin已完成-
[Admin] 更新站點/system/site-configPATCH /site-config/admin/:id已完成-
[Admin] 刪除站點/system/site-configDELETE /site-config/admin/:id已完成-
[Admin] 主題列表/system/site-configGET /site-config/admin/:siteConfigId/themes已完成-
[Admin] 新增主題/system/site-configPOST /site-config/admin/:siteConfigId/themes已完成-
[Admin] 更新主題/system/site-configPATCH /site-config/admin/themes/:id已完成-
[Admin] 刪除主題/system/site-configDELETE /site-config/admin/themes/:id已完成-
[Admin] 上傳域名素材/system/site-domainsPOST /site-config/admin/:id/domain-asset已完成-
[Admin] 上傳客服圖示/system/site-customer-servicePOST /site-config/admin/:id/customer-service-icon已完成-
[Admin] 更新吉祥物/system/site-configPATCH /site-config/admin/:siteConfigId/mascots已完成-
[Admin] 取得客服設定/system/site-customer-serviceGET /site-config/admin/:siteCode/customer-service已完成-

2.1.11 風控管理 (Risk Control) — 11 個端點

功能前台頁面後端 API狀態多站點
[Admin] IP 規則列表/risk-control/ip-rulesGET /admin/risk/ip-rules已完成Y
[Admin] 新增 IP 規則/risk-control/ip-rulesPOST /admin/risk/ip-rules已完成Y
[Admin] 更新 IP 規則/risk-control/ip-rulesPATCH /admin/risk/ip-rules/:id已完成Y
[Admin] 刪除 IP 規則/risk-control/ip-rulesDELETE /admin/risk/ip-rules/:id已完成Y
[Admin] IP/FP 查詢/risk-control/ip-checkGET /admin/risk/lookup已完成Y
[Admin] 登入失敗紀錄/players/login-failuresGET /admin/risk/login-failures已完成Y
[Admin] 遊戲黑名單列表/risk-control/game-blacklistGET /admin/risk/game-blacklist已完成Y
[Admin] 新增遊戲黑名單/risk-control/game-blacklistPOST /admin/risk/game-blacklist已完成Y
[Admin] 更新遊戲黑名單/risk-control/game-blacklistPATCH /admin/risk/game-blacklist/:id已完成Y
[Admin] 刪除遊戲黑名單/risk-control/game-blacklistDELETE /admin/risk/game-blacklist/:id已完成Y
遊戲封鎖檢查(遊戲啟動時)內部呼叫 isUserBlockedFromGame()已完成Y

2.1.12 報表 (Reports) — 10 個端點

功能前台頁面後端 API狀態多站點
[Admin] 玩家報表/reports/playersGET /admin/reports/players已完成Y
[Admin] VIP 玩家報表/vip/playersGET /admin/reports/vip-players已完成Y
[Admin] 投注紀錄/reports/bet-recordsGET /admin/reports/bet-records已完成Y
[Admin] 總覽報表/reports/overviewGET /admin/reports/overview已完成Y
[Admin] 損益報表/reports/profit-lossGET /admin/reports/profit-loss已完成Y
[Admin] 遊戲報表/reports/gamesGET /admin/reports/games已完成Y
[Admin] 活動報表/reports/promosGET /admin/reports/promos已完成N (待加入)
[Admin] 玩家摘要/reports/player-summaryGET /admin/reports/player-summary已完成Y
[Admin] R2 日誌/system/cloud-storage-logsGET /admin/reports/r2-logs已完成Y
[Admin] 匯出各報表頁面GET /admin/reports/export已完成Y

2.1.13 系統管理 (Admin) — 18 個端點

功能前台頁面後端 API狀態多站點
[Admin] 管理員登入/loginPOST /admin/login已完成N (全站)
[Admin] 管理員註冊-POST /admin/register已完成N
[Admin] 發送驗證碼/loginPOST /admin/send-verify-code已完成N
[Admin] 驗證 Email-POST /admin/verify-email已完成N
[Admin] 管理員列表/system/adminsGET /admin/list已完成N (全站)
[Admin] 新增管理員/system/admins/newPOST /admin/create已完成N
[Admin] 取得管理員/system/admins/[id]GET /admin/:id已完成N
[Admin] 更新管理員/system/admins/[id]PATCH /admin/:id已完成N
[Admin] 刪除管理員/system/adminsDELETE /admin/:id已完成N
[Admin] 群組列表/system/groupsGET /admin/groups/list已完成N (全站)
[Admin] 新增群組/system/groups/newPOST /admin/groups/create已完成N
[Admin] 取得群組/system/groups/[id]GET /admin/groups/:id已完成N
[Admin] 更新群組/system/groups/[id]PATCH /admin/groups/:id已完成N
[Admin] 刪除群組/system/groupsDELETE /admin/groups/:id已完成N
[Admin] 所有權限/system/groupsGET /admin/permissions/all已完成N
[Admin] 操作紀錄/system/logsGET /admin/logs/list已完成N (全站)
[Admin] R2 操作/system/cloud-storageGET/POST/DELETE /admin/r2/*已完成Y
[Admin] 個人資料Header ProfileGET/PATCH /admin/profile已完成N

2.1.14 其他端點

功能前台頁面後端 API狀態多站點
共用列舉/錯誤碼(前端初始化)GET /common/enums已完成N
排行榜/gameGET /ranking/list已完成Y
投注紀錄/user/bet-recordGET /bet-record/list已完成Y
投注詳情/user/bet-recordGET /bet-record/:id已完成Y
即時賽事/ (首頁)GET /live-sports/matches已完成N
健康檢查-GET /已完成N

第 3 章:前台功能規格 (c9-ec)

前台使用 Nuxt 4.2 (Vue 3.5 + TypeScript) 開發,面向終端用戶。 前台目前使用 a1 佈局方案,所有頁面元件位於 components/A1/ 目錄下。 另有 a2 佈局變體用於多品牌視覺切換。

3.1 首頁

  • 路由/
  • 元件pages/index.vueA1/Home/index.vue
  • 子元件Banner.vueLiveSports.vuePromo.vue

用途說明

首頁是用戶進入平台後的第一個畫面,展示平台的核心內容,包括輪播橫幅、即時體育賽事、推薦活動,以及快速進入遊戲大廳的入口。

使用者故事

  • 作為一個新訪客,我希望在首頁看到平台的核心特色與活動,以便快速了解平台提供的服務。
  • 作為一個已登入用戶,我希望從首頁快速進入我想玩的遊戲,以便節省瀏覽時間。
  • 作為一個體育迷,我希望在首頁看到即時賽事資訊,以便掌握最新賽況。

畫面元素說明

  1. Banner 輪播區

    • 動態橫幅,資料來自後端 API(活動圖片)
    • 支援自動輪播與手動切換
    • 點擊可跳轉至對應活動詳情頁
    • 根據當前語系顯示對應語言的橫幅圖片
  2. 即時體育賽事區 (LiveSports)

    • 顯示正在進行或即將開始的體育賽事
    • 資料來源:API-Football,每 30 分鐘更新一次
    • 顯示隊伍名稱、比分、開賽時間
    • 支援多種體育項目
  3. 推薦活動區 (Promo)

    • 展示平台當前的優惠活動
    • 卡片式排列,每張含活動圖片、標題、簡介
    • 點擊跳轉至活動詳情頁 /promo/[id]
  4. 快速遊戲入口

    • 提供遊戲分類快捷按鈕(體育、老虎機、真人、彩票等)
    • 點擊直接跳轉至遊戲大廳對應分類

相關 API

API方法說明
/site-config/publicGET取得站點設定(Banner、Logo 等)
/promo/listGET取得推薦活動列表
/live-sports/matchesGET取得即時體育賽事

權限要求

  • 無需登入即可瀏覽

多站點行為

  • 根據當前域名自動載入對應站點的 Banner、Logo、主題色
  • 透過 useConfig.tsdomainConfig[hostname] 進行域名設定映射

3.2 遊戲大廳

  • 路由/game
  • 元件pages/game/index.vueA1/Game/index.vue
  • 子元件Lobby.vueProvider.vueSearch.vueListBar.vueLoadMore.vueRankList.vueEmpty.vue

用途說明

遊戲大廳是平台的核心頁面,用戶可在此瀏覽、搜尋及啟動各類遊戲。頁面以 8 種遊戲分類進行組織,每個分類下展示遊戲供應商及其遊戲。

使用者故事

  • 作為一個玩家,我希望按遊戲類型瀏覽遊戲,以便快速找到我感興趣的遊戲。
  • 作為一個玩家,我希望搜尋特定遊戲名稱,以便直接找到目標遊戲。
  • 作為一個回訪玩家,我希望看到最近遊玩的遊戲,以便快速回到之前的遊戲。
  • 作為一個玩家,我希望看到遊戲排行榜,以便了解熱門遊戲。

畫面元素說明

  1. 遊戲分類標籤列 (ListBar)

    • 8 種遊戲類型標籤:體育(1)、老虎機(2)、真人(3)、彩票(4)、棋牌(5)、電競(8)、加密(9)、捕魚(10)
    • 水平捲動標籤列,當前選中分類高亮顯示
    • 切換標籤自動載入對應分類的遊戲供應商
  2. 遊戲供應商卡片區 (Provider)

    • 以供應商為單位展示遊戲
    • 每張供應商卡片顯示供應商名稱、Logo、代表遊戲
    • 展示邏輯:
      • 有子分類的類型:顯示第一款遊戲圖片
      • 無子分類的類型:顯示供應商封面圖
  3. 搜尋功能 (Search)

    • 支援按遊戲名稱搜尋
    • 即時搜尋結果顯示
    • 無結果時顯示空狀態元件 (Empty)
  4. 近期遊玩區

    • 顯示用戶最近遊玩的 10 款遊戲
    • 需登入才顯示
    • 資料來自 GET /game/recent
  5. 遊戲排行榜 (RankList)

    • 顯示熱門遊戲排名
    • 資料來自 GET /ranking/list
  6. 載入更多 (LoadMore)

    • 分頁載入遊戲供應商
    • 點擊「載入更多」顯示下一頁

相關 API

API方法說明
/game/providersGET取得遊戲供應商列表(含 siteCode 篩選)
/game/type-configsGET取得遊戲分類列表(含 siteCode 篩選)
/game/recentGET取得最近遊玩遊戲(需登入)
/ranking/listGET取得遊戲排行榜

權限要求

  • 瀏覽不需登入
  • 「近期遊玩」區塊需登入

多站點行為

  • 遊戲供應商與分類依站點 siteCode 獨立配置
  • 不同站點可擁有不同的遊戲商與分類組合

3.3 遊戲啟動

  • 路由/game/play
  • 元件pages/game/play.vueA1/Game/Play.vue

用途說明

遊戲啟動頁面負責透過 iframe 嵌入第三方遊戲供應商的遊戲畫面。使用者在遊戲大廳選擇遊戲後,會被導向此頁面。

使用者故事

  • 作為一個玩家,我希望點擊遊戲後立即開始遊玩,以便享受無縫的遊戲體驗。
  • 作為一個試玩用戶,我希望不需登入也能試玩遊戲,以便在註冊前體驗遊戲品質。

畫面元素說明

  1. 遊戲 Iframe 區域

    • 全屏嵌入遊戲供應商提供的遊戲 URL
    • 遊戲參數:gameCode + productId
    • 載入中顯示 Loading 狀態
  2. 返回按鈕

    • 提供返回遊戲大廳的導航

互動流程

  1. 使用者在遊戲大廳點擊遊戲
  2. 前端發送 POST /game/launch,帶入 gameCode 與 productId
  3. 後端執行風控檢查:
    • 使用者是否已認證?
    • 遊戲是否存在?
    • 風控黑名單檢查 (isUserBlockedFromGame) → 若被封鎖返回錯誤碼 5010
  4. 後端呼叫遊戲供應商 API(BetSolutions 或 RSG),取得遊戲 URL
  5. 後端非同步記錄 UPSERT GamePlayLog
  6. 前端接收遊戲 URL,透過 iframe 載入遊戲
  7. 遊戲中下注/派彩透過 S2S 回調更新用戶餘額

相關 API

API方法說明
/game/launchPOST啟動遊戲(需登入)
/game/demoPOST試玩遊戲(不需登入)

權限要求

  • 正式遊戲需登入
  • 試玩模式不需登入

多站點行為

  • 遊戲啟動前依據用戶所屬站點進行風控檢查
  • 遊戲供應商 API 金鑰依站點獨立配置

3.4 活動中心

  • 路由/promo
  • 元件pages/promo/index.vueA1/Promo/Center.vue

用途說明

活動中心展示平台所有進行中的優惠活動,支援透過標籤進行分類篩選。

使用者故事

  • 作為一個玩家,我希望瀏覽所有可用的優惠活動,以便找到適合自己的優惠。
  • 作為一個玩家,我希望透過分類標籤篩選活動,以便快速找到特定類型的優惠。

畫面元素說明

  1. 活動標籤篩選列

    • 顯示所有活動標籤(如:新手、VIP、每日、週末等)
    • 支援點選篩選
    • 「全部」選項顯示所有活動
  2. 活動卡片列表

    • 每張卡片包含:
      • 活動圖片(根據裝置顯示 PC 版或行動版圖片)
      • 活動標題(多語系)
      • 活動簡介(多語系)
      • 活動期間
    • 點擊跳轉至活動詳情頁

相關 API

API方法說明
/promo/listGET取得活動列表
/promo/tagsGET取得活動標籤列表

權限要求

  • 無需登入即可瀏覽

3.5 活動詳情

  • 路由/promo/[id]
  • 元件pages/promo/[id].vueA1/Promo/Detail.vue

用途說明

活動詳情頁展示單一活動的完整資訊,包括 HTML 格式的活動內容、領取條件及領取按鈕。

使用者故事

  • 作為一個玩家,我希望查看活動的詳細規則與條件,以便了解如何參與及領取獎勵。
  • 作為一個符合條件的玩家,我希望直接領取活動獎勵,以便快速獲得優惠。

畫面元素說明

  1. 活動圖片

    • 頂部顯示活動的大圖橫幅
  2. 活動內容區

    • HTML 富文本內容(後台使用 Tiptap 編輯器撰寫)
    • 支援多語系內容切換
  3. 領取條件顯示

    • 顯示活動的領取條件(如:存款門檻、VIP 等級、首次存款等)
  4. 領取按鈕

    • 符合條件時可點擊領取
    • 已領取時顯示「已領取」狀態
    • 未登入時提示登入

相關 API

API方法說明
/promo/:idGET取得活動詳情
/promo/:id/claimPOST領取活動獎勵

權限要求

  • 瀏覽不需登入
  • 領取需登入且符合條件

3.6 聯盟推廣

  • 路由/alliance
  • 元件pages/alliance.vueA1/Alliance/index.vue

用途說明

聯盟推廣頁面向潛在代理展示代理推廣計畫的資訊,包括代理等級體系、佣金費率、VIP 里程碑獎勵等。

使用者故事

  • 作為一個有興趣成為代理的用戶,我希望了解代理計畫的獎勵機制,以便評估是否值得加入。
  • 作為一個現有代理,我希望查看各等級的佣金費率,以便了解晉升目標。

畫面元素說明

  1. 代理計畫介紹

    • 三層代理結構說明(上線 → 下線,最多 3 層)
    • 佣金計算方式說明
  2. 代理等級資訊

    • 4 個代理等級:Bronze / Silver / Gold / Platinum
    • 各等級門檻與權益
  3. 佣金費率表

    • 按代理等級 x 遊戲類型顯示佣金比例
  4. VIP 里程碑獎勵

    • 下線達到特定 VIP 等級時的額外獎勵

相關 API

API方法說明
/affiliate/alliance-infoGET取得聯盟計畫資訊
/affiliate/tier-infoGET取得代理等級資訊
/affiliate/vip-milestonesGET取得 VIP 里程碑獎勵

權限要求

  • 無需登入即可瀏覽

3.7 任務系統

  • 路由/mission
  • 元件pages/mission.vueA1/Mission/index.vue

用途說明

任務系統提供每日、每週、每月三種週期的任務,鼓勵用戶持續存款與投注。完成任務可領取額外獎勵。

使用者故事

  • 作為一個活躍玩家,我希望透過完成任務獲得額外獎勵,以便提升遊戲體驗價值。
  • 作為一個玩家,我希望清楚看到任務進度,以便知道還需要多少努力才能完成。

畫面元素說明

  1. 任務分類標籤

    • 每日任務 (daily)
    • 每週任務 (weekly)
    • 每月任務 (monthly)
  2. 任務卡片

    • 每張卡片顯示:
      • 任務名稱
      • 任務描述
      • 進度條(當前值 / 目標值)
      • 獎勵金額
      • 領取按鈕(達成後可領取)
  3. 任務類型

    • 存款任務 (daily_deposit):存入指定金額
    • 投注任務 (weekly_bet):累計投注達標
    • 月度挑戰 (monthly_challenge):綜合目標

互動流程

  1. 用戶查看任務列表與進度
  2. 用戶在平台上存款 → 系統自動更新存款任務進度
  3. 用戶在平台上投注 → 系統自動更新投注任務進度
  4. 進度達到目標 → 領取按鈕啟用
  5. 用戶點擊領取 → POST /mission/:id/claim → 獎勵入帳

相關 API

API方法說明
/mission/listGET取得任務列表
/mission/progressGET取得任務進度
/mission/:id/claimPOST領取任務獎勵

權限要求

  • 需登入

3.8 幫助中心

  • 路由/help
  • 元件pages/help/index.vueA1/Help/Center.vue

用途說明

幫助中心提供常見問題 (FAQ) 的手風琴式展示,協助用戶自助解決常見疑問。

使用者故事

  • 作為一個新用戶,我希望查看常見問題解答,以便快速了解平台操作方式。

畫面元素說明

  1. FAQ 手風琴列表
    • 問題標題可展開/收合
    • 答案支援 HTML 富文本
    • 多語系內容

相關 API

API方法說明
/site-config/publicGET取得站點設定(含 learnMoreConfig FAQ 資料)

權限要求

  • 無需登入

3.9 OAuth 回調

  • 路由/redirect/[action]
  • 元件pages/redirect/[action].vue

用途說明

OAuth 回調頁面處理第三方登入(Google / Telegram)的回調邏輯,接收授權碼後完成登入流程。

互動流程

  1. 用戶在登入彈窗選擇 Google 或 Telegram 登入
  2. 前端重導向至第三方授權頁面
  3. 用戶授權後被重導向回 /redirect/google/redirect/telegram
  4. 前端擷取回調參數(authorization code 或 token)
  5. 前端呼叫後端 API 完成登入
  6. 成功後跳轉至首頁,失敗則顯示錯誤訊息

權限要求

  • 不需登入(登入流程的一部分)

3.10 個人設定

  • 路由/user/setting
  • 元件pages/user/setting.vueA1/User/Setting.vue
  • 相關彈窗EditPassword.vueSetPassword.vueBindGoogleAuth.vueVerifyUserInfo.vue

用途說明

個人設定頁面讓用戶管理自己的帳號資訊,包括個人資料修改、頭像更換、密碼管理、二步驟驗證設定、語系同步等。

使用者故事

  • 作為一個用戶,我希望修改我的個人資料(暱稱、Email、手機),以便保持資訊正確。
  • 作為一個注重安全的用戶,我希望啟用 Google Authenticator 二步驟驗證,以便提升帳號安全性。
  • 作為一個 OAuth 用戶,我希望設定密碼,以便日後也能用帳密登入。

畫面元素說明

  1. 頭像區域

    • 顯示當前頭像
    • 支援上傳新頭像
  2. 基本資料表單

    • 帳號(唯讀)
    • 暱稱(可修改)
    • Email(需驗證碼驗證)
    • 手機號碼(需驗證碼驗證)
    • 生日
  3. 密碼管理

    • 已設定密碼:顯示「修改密碼」按鈕 → EditPassword 彈窗
    • 未設定密碼(OAuth 用戶):顯示「設定密碼」按鈕 → SetPassword 彈窗
  4. 二步驟驗證 (2FA)

    • Google Authenticator 綁定/解除
    • 啟用流程:取得 QR Code + Secret → 掃描後輸入 6 位驗證碼確認
    • 停用流程:輸入當前 TOTP 驗證碼確認身份後關閉
  5. 第三方帳號綁定狀態

    • 顯示 Google / Telegram 綁定狀態
  6. 語系設定

    • 語系切換(同步更新 cookie 與用戶偏好)

相關 API

API方法說明
/auth/user-detailGET取得用戶資料
/auth/update-profilePATCH更新個人資料
/auth/avatarPOST上傳頭像
/auth/set-passwordPATCH設定密碼
/auth/update-passwordPATCH修改密碼
/auth/send-email-verifyPOST發送 Email 驗證碼
/auth/verify-emailPOST驗證 Email
/auth/send-mobile-verifyPOST發送手機驗證碼
/auth/verify-mobilePOST驗證手機
/auth/google-auth/*POSTGoogle Auth 2FA 操作

權限要求

  • 需登入

3.11 存款

  • 路由/user/deposit
  • 元件pages/user/deposit.vueA1/User/Deposit/index.vue
  • 子元件Fiat.vueCredit.vueCrypto.vue

用途說明

存款頁面讓用戶選擇支付方式進行入金操作。支援法幣 ATM 轉帳、信用卡支付、加密貨幣 (USDT) 三種方式。

使用者故事

  • 作為一個玩家,我希望使用我偏好的支付方式存入資金,以便在平台上進行遊戲。
  • 作為一個加密貨幣用戶,我希望使用 USDT 存款,以便享受快速且低手續費的入金體驗。

畫面元素說明

  1. 支付方式標籤

    • 法幣 ATM (Fiat)
    • 信用卡 (Credit)
    • 加密貨幣 (Crypto)
  2. 法幣 ATM 標籤頁 (Fiat.vue)

    • 金流通道選擇(萬通金流)
    • 金額輸入欄位
    • 即時匯率顯示(台灣銀行匯率)
    • 換算後的 USD 金額預覽
    • 提交按鈕
  3. 信用卡標籤頁 (Credit.vue)

    • 金流通道選擇
    • 金額輸入
    • 匯率顯示
    • 提交按鈕
  4. 加密貨幣標籤頁 (Crypto.vue)

    • USDT 入金資訊
    • 支援網路選擇 (TRC-20 / ERC-20)
    • 金額輸入
    • 提交按鈕

互動流程

  1. 用戶選擇支付方式
  2. 選擇金流通道
  3. 輸入存款金額
  4. 系統顯示即時匯率與換算後 USD 金額
  5. 用戶確認提交 → POST /deposit
  6. 後端路由至對應金流商(萬通或 USDT)
  7. 金流商返回支付 URL 或加密地址
  8. 用戶在外部完成支付
  9. 金流商透過 S2S 回調通知後端
  10. 後端更新訂單狀態 → 入帳

相關 API

API方法說明
/vendor/channelsGET取得可用金流通道
/deposit/exchange-rateGET取得即時匯率
/depositPOST建立存款訂單

權限要求

  • 需登入

3.12 提款

  • 路由/user/withdrawal
  • 元件pages/user/withdrawal.vueA1/User/Withdrawal/index.vue

用途說明

提款頁面讓用戶申請將帳戶餘額提領至已綁定的銀行卡或加密錢包。

使用者故事

  • 作為一個玩家,我希望將獲利提領至我的銀行帳戶,以便兌現我的遊戲收益。
  • 作為一個加密貨幣用戶,我希望將獲利提領至我的加密錢包,以便快速收款。

畫面元素說明

  1. 可用餘額顯示

    • 顯示當前可提領金額
  2. 提領目的地選擇

    • 從已綁定的銀行卡中選擇
    • 從已綁定的加密錢包中選擇
    • 提示用戶尚未綁定任何錢包時前往綁定
  3. 金額輸入

    • 輸入提領金額
    • 最低/最高提領限制提示
  4. 提交按鈕

    • 確認提領申請

互動流程

  1. 用戶選擇提領目的地(銀行卡或加密錢包)
  2. 輸入提領金額
  3. 確認提交 → POST /withdrawal/request
  4. 系統扣除餘額,加入凍結金額 (frozenBalance)
  5. 建立提領訂單(狀態:pending)
  6. 等待後台管理員審核
  7. 審核通過 → 管理員上傳匯款憑證 → 完成
  8. 審核拒絕 → 凍結金額退回可用餘額

相關 API

API方法說明
/withdrawal/requestPOST提交提領申請
/wallet/bank-card/listGET取得銀行卡列表
/wallet/crypto-address/listGET取得加密錢包列表

權限要求

  • 需登入

3.13 錢包管理

  • 路由/user/wallet
  • 元件pages/user/wallet.vueA1/User/Wallet/index.vue
  • 子元件Fiat.vueCredit.vueCrypto.vue
  • 相關彈窗AddBankCard.vueAddCreditCard.vueAddCryptoAddress.vueBankCardDetail.vue

用途說明

錢包管理頁面讓用戶管理三種類型的支付錢包:銀行卡、信用卡、加密錢包地址。

使用者故事

  • 作為一個玩家,我希望新增我的銀行卡資訊,以便日後快速存款與提款。
  • 作為一個玩家,我希望查看我所有錢包的審核狀態,以便了解是否可以使用。

畫面元素說明

  1. 錢包類型標籤

    • 銀行卡 (Fiat)
    • 信用卡 (Credit)
    • 加密錢包 (Crypto)
  2. 錢包列表

    • 每張卡片顯示:帳號/地址資訊、綁定狀態、審核狀態
    • 支援刪除操作
  3. 新增按鈕

    • 開啟對應的新增彈窗
  4. 新增銀行卡彈窗 (AddBankCard)

    • 銀行名稱選擇
    • 帳號輸入
    • 持卡人姓名
  5. 新增信用卡彈窗 (AddCreditCard)

    • 信用卡號
    • 持卡人姓名
    • 到期日
  6. 新增加密錢包彈窗 (AddCryptoAddress)

    • 區塊鏈網路選擇 (TRC-20 / ERC-20)
    • 錢包地址
    • 幣種

相關 API

API方法說明
/wallet/bank-card/listGET銀行卡列表
/wallet/bank-card/addPOST新增銀行卡
/wallet/bank-card/:idDELETE刪除銀行卡
/wallet/credit-card/listGET信用卡列表
/wallet/credit-card/addPOST新增信用卡
/wallet/credit-card/:idDELETE刪除信用卡
/wallet/crypto-address/listGET加密錢包列表
/wallet/crypto-address/addPOST新增加密錢包
/wallet/crypto-address/:idDELETE刪除加密錢包

權限要求

  • 需登入

3.14 交易紀錄

  • 路由/user/transaction
  • 元件pages/user/transaction.vueA1/User/Transaction/index.vue
  • 子元件Deposit.vueWithdrawal.vueDividend.vuePromo.vue

用途說明

交易紀錄頁面展示用戶所有的資金變動紀錄,分為四個標籤頁。

使用者故事

  • 作為一個玩家,我希望查看我的所有存款紀錄,以便核對入金情況。
  • 作為一個玩家,我希望追蹤提款申請的處理進度,以便了解何時到帳。

畫面元素說明

  1. 標籤頁

    • 存款紀錄 (Deposit)
    • 提款紀錄 (Withdrawal)
    • 分紅紀錄 (Dividend)
    • 活動獎勵紀錄 (Promo)
  2. 紀錄列表

    • 每筆紀錄顯示:時間、金額、狀態、類型
    • 狀態標籤以顏色區分(待處理/已完成/已拒絕/失敗)
  3. 篩選功能

    • 日期範圍篩選

相關 API

API方法說明
/deposit/ordersGET存款訂單列表
/withdrawal/ordersGET提款訂單列表

權限要求

  • 需登入

3.15 VIP

  • 路由/user/vip
  • 元件pages/user/vip.vueA1/User/Vip/index.vue
  • 子元件StatusCard.vueLevelList.vueBenefits.vueMyRebates.vueRebateTable.vue

用途說明

VIP 頁面展示用戶的 VIP 等級狀態、升級進度、各等級權益,以及個人返水紀錄與返水規則表。

使用者故事

  • 作為一個玩家,我希望查看我的 VIP 等級與升級進度,以便了解還需多少投注才能升級。
  • 作為一個 VIP 玩家,我希望查看我的返水紀錄,以便確認返水金額正確。
  • 作為一個玩家,我希望了解各 VIP 等級的權益差異,以便設定升級目標。

畫面元素說明

  1. VIP 狀態卡片 (StatusCard)

    • 當前 VIP 等級
    • 等級名稱
    • 累計有效投注
    • 升級進度條(目前投注 / 下一等級門檻)
  2. 等級列表 (LevelList)

    • 所有 VIP 等級的完整列表
    • 每個等級顯示:等級名稱、升級門檻 (minChip)、保級門檻 (relegationChip)
    • 當前等級高亮顯示
    • 等級數量動態取得(不硬編碼,支援商戶自行擴充)
  3. 權益說明 (Benefits)

    • 各等級專屬福利說明
  4. 我的返水 (MyRebates)

    • 個人返水紀錄列表
    • 顯示每日返水金額
  5. 返水規則表 (RebateTable)

    • 按遊戲類型(8 種)顯示各 VIP 等級的返水比例
    • 表格形式:行 = VIP 等級,列 = 遊戲類型

相關 API

API方法說明
/vip/levelsGET取得 VIP 等級列表
/vip/user-statusGET取得用戶 VIP 狀態
/vip/my-rebatesGET取得個人返水紀錄
/vip/rebatesGET取得返水規則

權限要求

  • 需登入

多站點行為

  • VIP 等級與返水規則依站點獨立配置
  • 每站可擁有不同的等級數量與返水比例

3.16 代理中心

  • 路由/user/affiliate
  • 元件pages/user/affiliate.vueA1/User/Affiliate/index.vue
  • 子元件Dashboard.vueCommission.vueDownline.vueSettlement.vueWithdrawal.vueAlliance.vue

用途說明

代理中心是代理用戶的管理後台,提供佣金概覽、下線管理、結算紀錄、提款功能等。

使用者故事

  • 作為一個代理,我希望查看我的佣金收益概覽,以便了解推廣成效。
  • 作為一個代理,我希望管理我的推廣碼,以便追蹤不同推廣管道的效果。
  • 作為一個代理,我希望查看下線名單與活躍狀態,以便管理我的推廣網路。
  • 作為一個代理,我希望申請佣金提款,以便兌現我的推廣收益。

畫面元素說明

  1. 儀表板 (Dashboard)

    • 總佣金收入
    • 下線數量(各層級)
    • 本週/本月收入
    • 推廣碼管理(最多 10 個推廣碼)
  2. 佣金紀錄 (Commission)

    • 佣金明細列表
    • 篩選:日期範圍、遊戲類型
  3. 下線管理 (Downline)

    • 三層下線樹狀結構
    • 每個下線顯示:帳號(遮罩)、VIP 等級、累計投注
    • 帳號遮罩:maskAccount() 隱藏中間字元
  4. 結算紀錄 (Settlement)

    • 週結/日結結算紀錄
    • 狀態:待審核/已核准/已拒絕
  5. 提款管理 (Withdrawal)

    • 代理餘額顯示
    • 提款申請
    • 提款紀錄(三階段:待審核 → 已核准 → 已完成)
  6. 聯盟資訊 (Alliance)

    • 代理等級與晉升條件
    • 佣金費率表

相關 API

API方法說明
/affiliate/dashboardGET代理儀表板數據
/affiliate/commissionsGET佣金列表
/affiliate/downlinesGET下線列表
/affiliate/settlementsGET結算紀錄
/affiliate/balanceGET代理餘額
/affiliate/request-withdrawalPOST申請提款
/affiliate/withdrawalsGET提款紀錄
/affiliate/referral-codesGET/POST/DELETE推廣碼管理
/affiliate/apply-agentPOST申請成為代理

權限要求

  • 需登入
  • 部分功能需已成為代理

3.17 投注紀錄

  • 路由/user/bet-record
  • 元件pages/user/bet-record.vueA1/User/BetRecord/index.vue

用途說明

投注紀錄頁面展示用戶的遊戲投注歷史記錄。

使用者故事

  • 作為一個玩家,我希望查看我的投注紀錄,以便追蹤遊戲結果與收益。

畫面元素說明

  1. 篩選列

    • 遊戲類型篩選
    • 日期範圍篩選
    • 投注狀態篩選 (valid / invalid / cancelled)
  2. 投注列表

    • 每筆投注顯示:遊戲名稱、下注金額、派彩金額、有效投注、狀態、時間

相關 API

API方法說明
/bet-record/listGET投注紀錄列表
/bet-record/:idGET投注詳情

權限要求

  • 需登入

3.18 站內信

  • 路由/user/inbox
  • 元件pages/user/inbox.vueA1/User/Inbox/index.vue

用途說明

站內信頁面展示系統通知與管理員發送的訊息。

使用者故事

  • 作為一個用戶,我希望收到平台重要通知,以便及時了解活動資訊與系統公告。

畫面元素說明

  1. 通知列表

    • 標題、摘要、時間
    • 已讀/未讀狀態標記
    • 點擊展開完整內容
  2. 操作

    • 標記已讀
    • 刪除通知

相關 API

API方法說明
/inbox/listGET通知列表
/inbox/:idGET通知詳情
/inbox/:id/readPOST標記已讀
/inbox/:idDELETE刪除通知
/inbox/unread-countGET未讀數量

權限要求

  • 需登入

3.19 KYC 身份驗證

  • 路由/user/kyc
  • 元件pages/user/kyc.vueA1/User/Kyc/index.vue
  • 子元件StatusCard.vueStepBasicInfo.vueStepDocUpload.vueStepLiveness.vueStepReview.vue

用途說明

KYC (Know Your Customer) 身份驗證流程,用於合規性要求的用戶身份確認。

使用者故事

  • 作為一個需要提款的用戶,我希望完成身份驗證,以便順利提領我的資金。

畫面元素說明

  1. 進度指示器

    • 4 步驟進度顯示
  2. 步驟一:基本資料 (StepBasicInfo)

    • 姓名、出生日期、國籍
    • 身份證件號碼
  3. 步驟二:文件上傳 (StepDocUpload)

    • 上傳身份證件正反面
    • 支援身份證、護照、駕照
  4. 步驟三:活體檢測 (StepLiveness)

    • 自拍照驗證
    • 確認為本人操作
  5. 步驟四:審核中 (StepReview)

    • 顯示審核狀態
    • 等待後台審核
  6. 狀態卡片 (StatusCard)

    • 顯示當前 KYC 狀態(未驗證/審核中/已通過/已拒絕)

權限要求

  • 需登入

3.20 挑戰

  • 路由/challenges
  • 元件pages/challenges.vue

用途說明

挑戰頁面為預留頁面,用於未來的挑戰活動功能。

畫面元素說明

  • 目前為 Placeholder 頁面
  • 預計未來加入各類挑戰任務

權限要求

  • 視未來設計而定

3.21 前台共用元件

佈局元件 (Layout)

元件說明
BottomBar.vue行動版底部導航列(5 個圖示入口)
Footer.vue頁尾區域(版權、連結)
LiveChat.vue即時客服嵌入(LiveChat 腳本)
Sidebar.vue側邊欄導航(行動版)
TitleBar.vue頁面標題列(含返回按鈕)

彈窗元件 (Modal)

元件說明
Login.vue登入彈窗(帳密/Google/Telegram)
Register.vue註冊彈窗
Locale.vue語系切換彈窗
Theme.vue主題切換彈窗
ContactSupport.vue聯繫客服彈窗(8 種管道)
AgentTour.vue代理導覽彈窗
BuyCrypto.vue購買加密貨幣引導彈窗
VerifyUserInfo.vue用戶資訊驗證彈窗

共用元件 (Common)

元件說明
ConfirmDialog.vue通用確認對話框
SplashScreen.vue啟動畫面
PromoLinkCard.vue活動連結卡片

第 4 章:後台功能規格 (c9-ims)

後台管理系統使用 Next.js 16 (React 19 + TypeScript) 開發,面向平台管理員。 後台採用 RBAC 權限控制,所有頁面需登入後方可存取。 多數列表頁面已支援多站點 Tab 切換架構。

4.1 儀表板

4.1.1 Dashboard

  • 路由/dashboard
  • 用途:平台營運數據概覽
  • 權限:任何已認證管理員均可檢視
  • 多站點:待實作

操作流程

  1. 管理員登入後自動導向此頁面
  2. 頁面顯示統計卡片(用戶總數、今日存款、今日提款等)
  3. 折線圖展示趨勢數據
  4. 長條圖展示分類統計

畫面元素

  • 統計卡片(4-6 張)
  • 折線圖(趨勢分析)
  • 長條圖(分類比較)
  • 時間範圍選擇器

4.2 系統管理

4.2.1 管理員列表

  • 路由/system/admins
  • 用途:管理所有後台管理員帳號
  • 權限admin:read
  • 多站點:否(全站共用,SiteSelector 自動隱藏)
  • APIGET /admin/list

操作流程

  1. 進入頁面顯示管理員列表
  2. 支援關鍵字搜尋(帳號、Email、名稱)
  3. 每列顯示:ID、帳號、Email、名稱、群組、狀態、建立時間
  4. 操作:編輯、刪除
  5. 右上角「新增管理員」按鈕

篩選條件

  • 關鍵字搜尋

4.2.2 新增管理員

  • 路由/system/admins/new
  • 用途:建立新的管理員帳號
  • 權限admin:write
  • 多站點:否
  • APIPOST /admin/create

操作流程

  1. 填寫管理員資訊(帳號、Email、密碼、名稱)
  2. 選擇所屬群組(決定權限範圍)
  3. 設定帳號狀態(啟用/停用)
  4. 提交後返回列表頁

4.2.3 編輯管理員

  • 路由/system/admins/[id]
  • 用途:修改現有管理員資訊
  • 權限admin:write
  • 多站點:否
  • APIGET /admin/:idPATCH /admin/:id

操作流程

  1. 載入管理員現有資料
  2. 可修改:名稱、Email、密碼、群組、狀態
  3. 提交更新後返回列表頁

4.2.4 群組列表

  • 路由/system/groups
  • 用途:管理權限群組
  • 權限admin-group:read
  • 多站點:否(全站共用,SiteSelector 自動隱藏)
  • APIGET /admin/groups/list

操作流程

  1. 顯示群組列表
  2. 每列顯示:ID、群組名稱、群組類型、成員數量、建立時間
  3. 操作:編輯、刪除
  4. 右上角「新增群組」按鈕

群組類型

類型說明
root最高權限,略過所有權限檢查
super_admin擁有除 site-config 外的所有權限
general_admin僅有讀取權限
custom自訂權限組合

4.2.5 新增群組

  • 路由/system/groups/new
  • 用途:建立新的權限群組
  • 權限admin-group:write
  • 多站點:否
  • APIPOST /admin/groups/createGET /admin/permissions/all

操作流程

  1. 輸入群組名稱
  2. 選擇群組類型
  3. 若為 custom 類型,勾選各權限模組的 read/write 權限
  4. 16 個權限模組的 checkbox 矩陣顯示
  5. 提交後返回列表頁

權限模組 (16 個)

模組說明
admin管理員管理
admin-group群組管理
admin-log操作紀錄
user用戶管理
deposit存款管理
withdrawal提款管理
promo活動管理
promo-tag活動標籤
affiliate代理管理
vipVIP 管理
game遊戲管理
risk風控管理
report報表
vendor金流商管理
finance財務管理
site-config站點設定

4.2.6 編輯群組

  • 路由/system/groups/[id]
  • 用途:修改現有群組的權限配置
  • 權限admin-group:write
  • 多站點:否
  • APIGET /admin/groups/:idPATCH /admin/groups/:id

4.2.7 操作紀錄

  • 路由/system/logs
  • 用途:查詢後台管理員的操作紀錄
  • 權限admin-log:read
  • 多站點:否(全站共用,SiteSelector 自動隱藏)
  • APIGET /admin/logs/list

操作流程

  1. 顯示操作紀錄列表
  2. 每列顯示:時間、管理員、動作、目標、IP、User-Agent

篩選條件

  • 關鍵字搜尋
  • 日期範圍

4.2.8 站點基本設定

  • 路由/system/site-config
  • 用途:管理站點的基礎設定資訊
  • 權限site-config:read / site-config:write
  • 多站點:否(本身就是站點管理)
  • APIGET /site-config/admin/listPOST /site-config/adminPATCH /site-config/admin/:idDELETE /site-config/admin/:id

操作流程

  1. 顯示所有站點列表
  2. 每個站點可編輯:站點名稱、站點代碼 (siteCode)、介紹(多語系)、支援語系列表
  3. 主題管理:每站可新增多組主題色,設定啟用主題
  4. 吉祥物管理:上傳/更新吉祥物圖片列表

主題色彩體系

色彩類別說明
primary主色調
accent強調色
surface表面色
text文字色
border邊框色

4.2.9 客服配置

  • 路由/system/site-customer-service
  • 用途:管理各站點的客服管道配置
  • 權限site-config:read / site-config:write
  • 多站點:是(模式 B — 設定頁)
  • APIGET /site-config/admin/:siteCode/customer-servicePATCH /site-config/admin/:id

操作流程

  1. SiteTabs 切換站點
  2. 每個站點顯示 8 種客服管道設定
  3. 每個管道可設定:多語系標題 (label)、圖示 (icon)、連結 (link)、排序 (sortOrder)、啟用/停用 (enabled)
  4. LiveChat 獨立開關:可嵌入 LiveChat 腳本
  5. 支援「同預設站點」一鍵複製

8 種客服管道

管道說明
lineLINE
telegramTelegram
wechat微信
facebookFacebook
instagramInstagram
twitterTwitter/X
discordDiscord
custom自訂管道

4.2.10 域名設置

  • 路由/system/site-domains
  • 用途:管理站點域名、Logo、Favicon 等品牌素材
  • 權限site-config:read / site-config:write
  • 多站點:是(模式 B)
  • APIPOST /site-config/admin/:id/domain-asset

操作流程

  1. SiteTabs 切換站點
  2. 設定/更新域名 (hostname)
  3. 上傳品牌素材:
    • 小 Logo (logoSmall)
    • 大 Logo (logoBig)
    • Favicon
  4. 設定該站點支援的語系列表 (supportedLocales)
  5. 支援「同預設站點」複製(保留 hostname + supportedLocales,同步其他欄位)

4.2.11 遊戲商配置

  • 路由/system/site-game-providers
  • 用途:管理各站點的遊戲商 API 金鑰與配置
  • 權限site-config:read / site-config:write
  • 多站點:是(模式 B)

操作流程

  1. SiteTabs 切換站點
  2. 每個遊戲商的 API 金鑰與設定
  3. 支援「同預設站點」複製(前端狀態拷貝,需手動儲存)

4.2.12 三方登入配置

  • 路由/system/site-oauth
  • 用途:管理各站點的 OAuth 登入提供者設定
  • 權限site-config:read / site-config:write
  • 多站點:是(模式 B)

操作流程

  1. SiteTabs 切換站點
  2. 設定 Google OAuth:Client ID、Client Secret、Redirect URI
  3. 設定 Telegram Login:Bot Token、Bot Username
  4. 啟用/停用各 OAuth 提供者
  5. 支援「同預設站點」複製

4.2.13 服務商配置

  • 路由/system/site-service-providers
  • 用途:管理各站點的第三方服務提供商設定
  • 權限site-config:read / site-config:write
  • 多站點:是(模式 B)

操作流程

  1. SiteTabs 切換站點
  2. 設定 Resend (Email 服務):API Key、寄件地址
  3. 設定 Twilio (SMS 服務):Account SID、Auth Token、Verify Service SID
  4. 設定 Cloudflare R2 (儲存):Bucket、Endpoint、Access Key
  5. 支援「同預設站點」複製

4.2.14 雲端儲存

  • 路由/system/cloud-storage
  • 用途:Cloudflare R2 檔案瀏覽器
  • 權限admin:read / admin:write
  • 多站點:是(模式 A)
  • APIGET /admin/r2/listPOST /admin/r2/uploadDELETE /admin/r2/deletePOST /admin/r2/movePOST /admin/r2/create-folderDELETE /admin/r2/delete-folder

操作流程

  1. 以檔案瀏覽器形式展示 R2 儲存空間
  2. 支援目錄瀏覽、檔案上傳、檔案刪除、檔案移動
  3. 支援建立/刪除資料夾
  4. 每個檔案操作會記錄到 R2 操作日誌

4.2.15 雲端儲存日誌

  • 路由/system/cloud-storage-logs
  • 用途:R2 檔案操作的稽核日誌
  • 權限admin:read
  • 多站點:是(模式 A)
  • APIGET /admin/reports/r2-logs

操作流程

  1. 顯示 R2 操作紀錄列表
  2. 每列顯示:時間、操作者、動作、檔案路徑、MIME 類型
  3. 支援 OS/瀏覽器解析(User-Agent 解析)
  4. 支援 Detail Dialog 查看完整操作資訊

篩選條件

  • 關鍵字搜尋
  • 日期範圍

4.3 前台佈局配置

4.3.1 底部導航列配置

  • 路由/system/layout-bottom-bar
  • 用途:管理前台行動版底部 Tab 項目
  • 權限site-config:read / site-config:write
  • 多站點:是(模式 B)

操作流程

  1. SiteTabs 切換站點
  2. 配置底部導航列的 Tab 項目
  3. 每個項目可設定:圖示、多語系標題、連結、排序、啟用/停用
  4. 支援「同預設站點」複製

4.3.2 頁尾配置

  • 路由/system/layout-footer
  • 用途:管理前台頁尾區域的連結與版權資訊
  • 權限site-config:read / site-config:write
  • 多站點:是(模式 B)

操作流程

  1. SiteTabs 切換站點
  2. 配置頁尾連結分組
  3. 每組可設定:多語系標題、連結列表、排序
  4. 版權文字設定
  5. 支援「同預設站點」複製

4.3.3 了解更多配置

  • 路由/system/layout-learn-more
  • 用途:管理前台「了解更多」區塊(FAQ)的內容
  • 權限site-config:read / site-config:write
  • 多站點:是(模式 B)

操作流程

  1. SiteTabs 切換站點
  2. 配置 FAQ 項目列表
  3. 每個項目含多語系標題與多語系內容(HTML)
  4. 支援「同預設站點」複製

4.4 玩家管理

4.4.1 全部玩家

  • 路由/players/all
  • 用途:查詢與管理所有前台用戶
  • 權限user:read
  • 多站點:是(模式 A)
  • APIGET /admin/finance/users/list

操作流程

  1. SiteTabs 切換站點
  2. FilterBar 篩選用戶
  3. SimpleTable 顯示用戶列表
  4. 每列顯示:ID、帳號、暱稱、VIP 等級、餘額、狀態、註冊時間
  5. 點擊用戶可進入詳情頁

篩選條件

  • 關鍵字搜尋(帳號、Email、手機)
  • VIP 等級篩選(動態下拉選單,不硬編碼等級數量)
  • 日期範圍

4.4.2 玩家詳情

  • 路由/players/all/[id]
  • 用途:查看單一玩家的完整資訊
  • 權限user:read / user:write
  • 多站點:否(詳情頁)
  • APIGET /admin/finance/users/:idPATCH /admin/finance/users/:id

操作流程

  1. 顯示玩家完整資料:
    • 基本資料(帳號、Email、手機、暱稱、生日)
    • VIP 資訊(等級、累計投注、升級進度)
    • 餘額資訊(可用餘額、凍結金額)
    • 登入紀錄(IP、裝置、時間)
    • 錢包列表(銀行卡、信用卡、加密錢包)
  2. 可編輯用戶資訊
  3. 可調整用戶狀態(啟用/停用)

4.4.3 新註冊玩家

  • 路由/players/new-registrations
  • 用途:查看近期新註冊的用戶
  • 權限user:read
  • 多站點:是(模式 A)

操作流程

  1. SiteTabs 切換站點
  2. 預設顯示近期註冊用戶
  3. 表格內容同「全部玩家」,但預設篩選為近期

篩選條件

  • 關鍵字搜尋
  • VIP 等級篩選(動態)
  • 日期範圍

4.4.4 線上玩家

  • 路由/players/online
  • 用途:查看當前在線的用戶
  • 權限user:read
  • 多站點:是(模式 A)

操作流程

  1. SiteTabs 切換站點
  2. 顯示當前在線用戶列表
  3. 每列顯示:帳號、VIP 等級、最後活躍時間、IP

4.4.5 登入失敗紀錄

  • 路由/players/login-failures
  • 用途:查看用戶登入失敗的紀錄,用於安全監控
  • 權限risk:read
  • 多站點:是(模式 A)
  • APIGET /admin/risk/login-failures

操作流程

  1. SiteTabs 切換站點
  2. 顯示登入失敗紀錄列表
  3. 每列顯示:時間、帳號、IP、裝置、失敗原因

篩選條件

  • 關鍵字搜尋
  • 日期範圍

4.4.6 玩家標籤

  • 路由/players/tags
  • 用途:管理玩家分類標籤
  • 權限user:read / user:write
  • 多站點:規劃中

操作流程

  • 待實作

4.4.7 遊戲重新註冊

  • 路由/players/game-reregistration
  • 用途:重新註冊用戶的遊戲帳號
  • 權限game:write
  • 多站點:規劃中

操作流程

  • 待實作

4.5 活動管理

4.5.1 優惠活動列表

  • 路由/activity/promos
  • 用途:管理平台所有優惠活動
  • 權限promo:read
  • 多站點:是(模式 A)
  • APIGET /admin/promos/list

操作流程

  1. SiteTabs 切換站點
  2. 顯示活動列表
  3. 每列顯示:標題、標籤、狀態、開始日期、結束日期、領取人數
  4. 操作:編輯、刪除
  5. 右上角「新增活動」按鈕

篩選條件

  • 關鍵字搜尋
  • 狀態篩選
  • 日期範圍

4.5.2 新增活動

  • 路由/activity/promos/new
  • 用途:建立新的優惠活動
  • 權限promo:write
  • 多站點:siteCode 從列表頁帶入
  • APIPOST /admin/promos/create

操作流程

  1. 填寫活動基本資訊:
    • 多語系標題
    • 多語系簡介
    • 活動標籤
    • 開始/結束日期
    • 狀態(啟用/停用)
  2. 上傳活動圖片:
    • PC 版圖片(zh-TW / en-US)
    • 行動版圖片(zh-TW / en-US)
  3. 設定領取條件:
    • 存款門檻 (deposit_threshold)
    • VIP 等級要求 (vip_level)
    • 首次存款 (first_deposit)
  4. 使用 Tiptap 富文本編輯器撰寫活動內容(多語系)
  5. 設定打碼量倍率 (turnover multiplier)
  6. 提交建立

4.5.3 編輯活動

  • 路由/activity/promos/[id]
  • 用途:修改現有活動內容
  • 權限promo:write
  • 多站點:詳情頁,已由列表頁帶入 siteCode
  • APIGET /admin/promos/:idPATCH /admin/promos/:id

4.5.4 活動標籤

  • 路由/activity/tags
  • 用途:管理活動的分類標籤
  • 權限promo-tag:read / promo-tag:write
  • 多站點:是(模式 A)
  • APIGET /admin/promo-tags/listPOST /admin/promo-tagsPATCH /admin/promo-tags/:idDELETE /admin/promo-tags/:id

操作流程

  1. SiteTabs 切換站點
  2. 顯示標籤列表
  3. 每個標籤含多語系名稱
  4. 支援新增、編輯、刪除

4.6 郵件管理

4.6.1 站內信管理

  • 路由/mail/inbox
  • 用途:管理員發送站內信給前台用戶
  • 權限admin:read / admin:write
  • 多站點:是(模式 A)
  • APIPOST /admin/inbox/send

操作流程

  1. SiteTabs 切換站點
  2. 顯示已發送的站內信列表
  3. 支援發送新站內信:
    • 選擇收件對象(全體用戶 / 特定用戶 / VIP 等級)
    • 多語系標題
    • 多語系內容(HTML)
  4. 查看發送紀錄

4.6.2 郵件設定

  • 路由/mail/settings
  • 用途:管理自動通知的觸發條件與模板
  • 權限admin:read / admin:write
  • 多站點:是(模式 B)
  • APIGET /admin/inbox/settings

操作流程

  1. SiteTabs 切換站點
  2. 設定各類自動通知的開關
  3. 設定通知模板
  4. 支援「同預設站點」複製

4.7 財務管理

4.7.1 人工調節金額

  • 路由/finance/adjust-balance
  • 用途:手動調整用戶帳戶餘額
  • 權限finance:write
  • 多站點:是(模式 A)
  • APIPOST /admin/finance/adjust-balance

操作流程

  1. SiteTabs 切換站點
  2. 搜尋目標用戶
  3. 輸入調整金額(正值增加,負值扣減)
  4. 輸入備註說明
  5. 確認操作(二次確認對話框)

篩選條件

  • 關鍵字搜尋(帶 siteCode)

4.7.2 存款設置

  • 路由/finance/deposit-settings
  • 用途:管理金流群組與金流通道的配置
  • 權限vendor:read / vendor:write
  • 多站點:是(模式 A)

操作流程

  1. SiteTabs 切換站點
  2. 管理金流群組(Vendor Groups)
  3. 管理金流通道(Vendor Channels)
  4. 配置群組與通道的關聯

4.7.3 存款訂單審核

  • 路由/finance/deposit-review
  • 用途:審核存款訂單
  • 權限deposit:read / deposit:write
  • 多站點:是(模式 A)
  • APIGET /admin/finance/deposit-review/listPOST /admin/finance/deposit-review/:id

操作流程

  1. SiteTabs 切換站點
  2. FilterBar 篩選訂單
  3. SimpleTable 顯示訂單列表
  4. 每列顯示:訂單 ID、用戶、金額、支付方式、狀態、建立時間
  5. 操作:核准 / 拒絕

篩選條件

  • 訂單 ID
  • 用戶 ID
  • 關鍵字
  • 支付方式
  • 訂單狀態
  • 開始日期 / 結束日期

4.7.4 提款訂單管理

  • 路由/finance/withdrawals
  • 用途:審核與管理提款訂單
  • 權限withdrawal:read / withdrawal:write
  • 多站點:是(模式 A)
  • APIGET /admin/finance/withdrawals/listPOST /admin/finance/withdrawals/:id/reviewPOST /admin/finance/withdrawals/:id/complete

操作流程

  1. SiteTabs 切換站點
  2. FilterBar 篩選訂單
  3. SimpleTable 顯示訂單列表
  4. 操作流程(三階段):
    • 待審核 → 核准 / 拒絕
    • 已核准 → 上傳匯款憑證 → 標記完成
    • 已拒絕 → 凍結金額自動退回

篩選條件

  • 訂單 ID
  • 訂單狀態
  • 用戶 ID
  • 關鍵字
  • 區塊鏈網路 (network)
  • 開始日期 / 結束日期

4.7.5 銀行卡管理

  • 路由/finance/bank-cards
  • 用途:管理用戶綁定的銀行卡
  • 權限finance:read / finance:write
  • 多站點:是(模式 A)
  • APIGET /admin/finance/bank-cards/list

操作流程

  1. SiteTabs 切換站點
  2. FilterBar 篩選
  3. 顯示銀行卡列表
  4. 操作:審核(核准/拒絕)、查看詳情

篩選條件

  • 關鍵字
  • 用戶 ID
  • 審核狀態
  • 銀行代碼
  • 持卡人
  • 開始日期 / 結束日期

4.7.6 信用卡管理

  • 路由/finance/credit-cards
  • 用途:管理用戶綁定的信用卡
  • 權限finance:read / finance:write
  • 多站點:是(模式 A)
  • APIGET /admin/finance/credit-cards/list

篩選條件

  • 關鍵字
  • 用戶 ID
  • 審核狀態
  • 持卡人
  • 開始日期 / 結束日期

4.7.7 加密錢包管理

  • 路由/finance/crypto-addresses
  • 用途:管理用戶綁定的加密錢包地址
  • 權限finance:read / finance:write
  • 多站點:是(模式 A)
  • APIGET /admin/finance/crypto-addresses/list

篩選條件

  • 關鍵字
  • 用戶 ID
  • 審核狀態
  • 區塊鏈網路 (network)
  • 幣種 (currency)
  • 開始日期 / 結束日期

4.8 遊戲管理

4.8.1 遊戲供應商管理

  • 路由/game/providers
  • 用途:管理各站點的遊戲供應商配置
  • 權限game:read / game:write
  • 多站點:是(模式 A + 同預設站點 + 帶入模板)
  • APIGET /game/admin/providersPOST /game/admin/providersPATCH /game/admin/providers/:idDELETE /game/admin/providers/:idPOST /game/admin/copy-site-dataGET /game/admin/preview-templatePOST /game/admin/load-template

操作流程

  1. SiteTabs 切換站點
  2. 顯示該站點的遊戲供應商列表
  3. 每列顯示:ID、供應商名稱、供應商代碼 (providerCode)、遊戲類型、狀態、排序
  4. 操作:新增、編輯、刪除
  5. 特殊功能:
    • 同預設站點:將預設站的遊戲商配置複製到目標站(後端 API,transaction 內先刪後插)
    • 帶入模板:預覽預設模板 → 可編輯 → 確認帶入(只影響當前站點)

4.8.2 遊戲類型設定

  • 路由/game/type-configs
  • 用途:管理各站點的遊戲分類配置
  • 權限game:read / game:write
  • 多站點:是(模式 A + 同預設站點 + 帶入模板)
  • APIGET /game/admin/type-configsPOST /game/admin/type-configsPATCH /game/admin/type-configs/:idDELETE /game/admin/type-configs/:id

操作流程

  1. SiteTabs 切換站點
  2. 顯示遊戲分類列表
  3. 每列顯示:遊戲類型、多語系名稱、圖示、排序、狀態
  4. 操作同遊戲供應商管理

4.9 VIP 管理

4.9.1 VIP 等級設定

  • 路由/vip/levels
  • 用途:管理各站點的 VIP 等級配置
  • 權限vip:read / vip:write
  • 多站點:是(模式 A + 同預設站點 + 帶入模板)
  • APIGET /vip/admin/levelsPOST /vip/admin/levelsPATCH /vip/admin/levels/:idDELETE /vip/admin/levels/:idPOST /vip/admin/copy-site-data

操作流程

  1. SiteTabs 切換站點
  2. 顯示 VIP 等級列表
  3. 每列顯示:等級、多語系名稱、升級門檻 (minChip)、保級門檻 (relegationChip)、保級鎖定 (vipHold)、狀態
  4. 操作:新增、編輯、刪除
  5. 特殊功能:同預設站點、帶入模板

重要欄位

欄位說明
levelVIP 等級數字
name多語系等級名稱
minChip升級所需最低有效投注(USD)
relegationChip月度保級所需投注
vipHold保級鎖定(VIP 5+ 可手動啟用)
enabled啟用/停用

4.9.2 返水設定

  • 路由/vip/rebates
  • 用途:管理 VIP 返水規則(按遊戲類型 x VIP 等級配置)
  • 權限vip:read / vip:write
  • 多站點:是(模式 A + 同預設站點 + 帶入模板)
  • APIPOST /vip/admin/rebates/bulk

操作流程

  1. SiteTabs 切換站點
  2. 8 個遊戲類型標籤頁(Sports / Slot / Live / Lottery / Chess / Esports / Crypto / Fish)
  3. 每個標籤頁顯示 N 個 VIP 等級的返水比例
  4. 行內編輯(inline editing):直接修改返水百分比
  5. 修改後的列以琥珀色 (amber) 高亮標記(dirty rows)
  6. 點擊「全部儲存」按鈕一次提交所有變更

互動特色

  • 表格形式:行 = VIP 等級,列 = 返水比例
  • 即時編輯,無需開啟彈窗
  • 批量更新(Bulk Upsert),一次儲存所有變更
  • Unique key: (siteCode, level, gameType)

4.9.3 VIP 玩家列表

  • 路由/vip/players
  • 用途:查看 VIP 玩家的統計資訊
  • 權限vip:read
  • 多站點:是(模式 A)
  • APIGET /admin/reports/vip-players

操作流程

  1. SiteTabs 切換站點
  2. 顯示 VIP 玩家列表
  3. 每列顯示:帳號、VIP 等級、累計投注、餘額

4.9.4 VIP 里程碑

  • 路由/vip/milestones
  • 用途:管理 VIP 里程碑獎勵設定
  • 權限vip:read / vip:write
  • 多站點:是(模式 A)

4.10 報表管理

4.10.1 總覽報表

  • 路由/reports/overview
  • 用途:展示平台整體營運數據
  • 權限report:read
  • 多站點:是(模式 A,使用 useMultiSiteTabs)
  • APIGET /admin/reports/overview

操作流程

  1. SiteTabs 切換站點
  2. 頂部統計卡片:
    • 新註冊人數
    • 存款總額
    • 提款總額
    • 投注總額
    • 毛利
  3. 每日摘要表格:
    • 每列 = 一天的統計數據
    • 欄位包含各項指標

篩選條件

  • 開始日期
  • 結束日期

4.10.2 玩家報表

  • 路由/reports/players
  • 用途:按玩家維度的統計報表
  • 權限report:read
  • 多站點:是(模式 A,使用 useMultiSiteTabs)
  • APIGET /admin/reports/players

篩選條件

  • 關鍵字(帳號、暱稱)
  • VIP 等級(select 下拉,0-15)
  • 開始日期 / 結束日期

4.10.3 玩家摘要

  • 路由/reports/player-summary
  • 用途:玩家綜合摘要報表
  • 權限report:read
  • 多站點:是(模式 A,使用 useMultiSiteTabs)
  • APIGET /admin/reports/player-summary

篩選條件

  • 關鍵字
  • VIP 等級(select 下拉)
  • 排序方式(select)
  • 排序方向(asc / desc)
  • 開始日期 / 結束日期

4.10.4 遊戲報表

  • 路由/reports/games
  • 用途:按遊戲維度的統計報表
  • 權限report:read
  • 多站點:是(模式 A,使用 useMultiSiteTabs)
  • APIGET /admin/reports/games

篩選條件

  • 遊戲類型(select 下拉)
  • 遊戲平台(select 下拉)
  • 開始日期 / 結束日期

4.10.5 投注紀錄報表

  • 路由/reports/bet-records
  • 用途:查詢所有用戶的投注紀錄
  • 權限report:read
  • 多站點:是(模式 A,使用 useMultiSiteTabs)
  • APIGET /admin/reports/bet-records

篩選條件

  • 關鍵字
  • 遊戲類型
  • 遊戲平台
  • 投注狀態
  • 開始日期 / 結束日期

4.10.6 損益報表

  • 路由/reports/profit-loss
  • 用途:按時間維度的損益分析
  • 權限report:read
  • 多站點:是(模式 A,使用 useMultiSiteTabs)
  • APIGET /admin/reports/profit-loss

篩選條件

  • 分組方式(日 / 週 / 月)
  • 遊戲類型
  • 開始日期 / 結束日期

4.10.7 活動報表

  • 路由/reports/promos
  • 用途:活動領取與成效統計
  • 權限report:read
  • 多站點:否(待加入)
  • APIGET /admin/reports/promos

篩選條件

  • 開始日期
  • 結束日期

4.11 風控管理

4.11.1 IP 黑白名單

  • 路由/risk-control/ip-rules
  • 用途:管理 IP 黑名單與白名單規則
  • 權限risk:read / risk:write
  • 多站點:是(模式 A)
  • APIGET /admin/risk/ip-rulesPOST /admin/risk/ip-rulesPATCH /admin/risk/ip-rules/:idDELETE /admin/risk/ip-rules/:id

操作流程

  1. SiteTabs 切換站點
  2. FilterBar 篩選
  3. 顯示 IP 規則列表
  4. 每列顯示:IP、類型(黑名單/白名單)、備註、建立時間
  5. 操作:新增、編輯、刪除

篩選條件

  • 類型(黑名單 / 白名單)
  • IP 關鍵字
  • 開始日期 / 結束日期

4.11.2 IP/裝置指紋查詢

  • 路由/risk-control/ip-check
  • 用途:透過 IP 或裝置指紋反查關聯用戶
  • 權限risk:read
  • 多站點:是(模式 A)
  • APIGET /admin/risk/lookup

操作流程

  1. SiteTabs 切換站點
  2. 輸入查詢關鍵字
  3. 系統回傳關聯用戶列表
  4. 可檢視同 IP / 同裝置的所有帳號

篩選條件

  • 關鍵字(支援 IP / 裝置指紋 / 帳號 / 姓名 / Email / 手機)

4.11.3 遊戲黑名單

  • 路由/risk-control/game-blacklist
  • 用途:封鎖特定用戶進入遊戲
  • 權限risk:read / risk:write
  • 多站點:是(模式 A)
  • APIGET /admin/risk/game-blacklistPOST /admin/risk/game-blacklistPATCH /admin/risk/game-blacklist/:idDELETE /admin/risk/game-blacklist/:id

操作流程

  1. SiteTabs 切換站點
  2. 顯示遊戲黑名單列表
  3. 新增封鎖規則:
    • 選擇用戶
    • 選擇封鎖範圍:
      • 全封鎖:gameType=null, productId=null
      • 類型封鎖:gameType='slot', productId=null
      • 特定遊戲封鎖:gameType='slot', productId=123

篩選條件

  • 用戶 ID
  • 用戶帳號
  • 遊戲類型
  • 開始日期 / 結束日期

4.12 代理中心

4.12.1 代理列表

  • 路由/affiliate/agents
  • 用途:管理所有代理
  • 權限affiliate:read / affiliate:write
  • 多站點:是(模式 A)
  • APIGET /affiliate/admin/agentsPOST /affiliate/admin/create-agentPOST /affiliate/admin/bind

操作流程

  1. SiteTabs 切換站點
  2. 顯示代理列表
  3. 每列顯示:帳號、代理碼、代理等級、下線數、累計佣金
  4. 操作:
    • 新增代理(手動綁定用戶為代理)
    • 手動綁定上下線關係
    • 設定代理等級

4.12.2 佣金費率

  • 路由/affiliate/commission-rates
  • 用途:管理代理佣金費率矩陣
  • 權限affiliate:read / affiliate:write
  • 多站點:是(模式 A)
  • APIGET /affiliate/admin/commission-ratesPOST /affiliate/admin/commission-ratesDELETE /affiliate/admin/commission-rates

操作流程

  1. SiteTabs 切換站點
  2. 顯示佣金費率矩陣:代理等級 (4) x 代理層級 (3) x 遊戲類型 (8)
  3. 模板預設:4 等級 x 3 級別 x 8 遊戲類型 = 96 筆費率

4.12.3 佣金結算

  • 路由/affiliate/settlements
  • 用途:管理佣金結算紀錄與審核
  • 權限affiliate:read / affiliate:write
  • 多站點:是(模式 A)
  • APIGET /affiliate/admin/settlementsPOST /affiliate/admin/settlements/:id/reviewGET /affiliate/admin/settlements/:id/risk-logs

操作流程

  1. SiteTabs 切換站點
  2. 顯示結算紀錄列表
  3. 每列顯示:代理帳號、結算期間、佣金金額、風控狀態、審核狀態
  4. 操作:
    • 審核(核准 / 拒絕)
    • 查看風控紀錄(該結算的風控檢測結果)
  5. 手動觸發結算:
    • 觸發週結:POST /affiliate/admin/trigger-settlement
    • 觸發日結:POST /affiliate/admin/trigger-daily-settlement

4.12.4 代理提款

  • 路由/affiliate/aff-withdrawals
  • 用途:管理代理的提款申請
  • 權限affiliate:read / affiliate:write
  • 多站點:是(模式 A)
  • APIGET /affiliate/admin/withdrawalsPOST /affiliate/admin/withdrawals/:id/reviewPOST /affiliate/admin/withdrawals/:id/complete

操作流程

  1. SiteTabs 切換站點
  2. 顯示代理提款列表
  3. 三階段審核流程:
    • 待審核 → 核准 / 拒絕
    • 已核准 → 標記完成
  4. 每列顯示:代理帳號、提款金額、提款方式、狀態、申請時間

4.12.5 綁定紀錄

  • 路由/affiliate/bind-logs
  • 用途:查看代理與下線的綁定/解綁歷史紀錄
  • 權限affiliate:read
  • 多站點:是(模式 A)
  • APIGET /affiliate/admin/bind-logs

篩選條件

  • 動作類型(綁定/解綁)
  • 推廣碼
  • 日期範圍

4.12.6 代理等級

  • 路由/affiliate/agent-tiers
  • 用途:管理代理等級配置
  • 權限affiliate:read / affiliate:write
  • 多站點:是(模式 A)
  • APIGET /affiliate/admin/agent-tiersPOST /affiliate/admin/agent-tiersDELETE /affiliate/admin/agent-tiers

代理等級列表

等級代碼名稱
bronze銅牌
silver銀牌
gold金牌
platinum白金

4.12.7 VIP 里程碑

  • 路由/affiliate/vip-milestones
  • 用途:管理下線 VIP 等級達標時的獎勵規則
  • 權限affiliate:read / affiliate:write
  • 多站點:是(模式 A)
  • APIGET /affiliate/admin/vip-milestonesPOST /affiliate/admin/vip-milestonesDELETE /affiliate/admin/vip-milestones

操作流程

  1. SiteTabs 切換站點
  2. 設定各 VIP 等級的獎勵金額
  3. 當下線用戶達到指定 VIP 等級時,自動發放獎勵給代理

4.12.8 代理導覽

  • 路由/affiliate/agent-tour
  • 用途:管理代理新手導覽內容
  • 權限affiliate:read / affiliate:write
  • 多站點:是(模式 B — 設定頁)

操作流程

  1. SiteTabs 切換站點
  2. 編輯導覽步驟的多語系內容
  3. 設定導覽流程圖片與說明

4.13 用戶管理

4.13.1 用戶列表

  • 路由/users
  • 用途:前台用戶管理(與玩家管理部分重疊)
  • 權限user:read

4.13.2 新增用戶

  • 路由/users/new
  • 用途:手動建立前台用戶帳號
  • 權限user:write

4.13.3 編輯用戶

  • 路由/users/[id]
  • 用途:編輯前台用戶資訊
  • 權限user:write

4.13.4 角色管理

  • 路由/roles
  • 用途:重導向至 /system/groups
  • 說明:此為轉址頁面,不含獨立功能

4.14 後台共用元件

佈局元件 (Layout)

元件說明
sidebar側邊欄導航(14+ 群組、50+ 項目,含 Feature Flag + RBAC 檢查)
header頂部導航列(含 SiteSelector 站點切換下拉選單)
providersContext Providers(SessionProvider / QueryClientProvider / ThemeProvider 等)
AdminContentWrapper包裹管理頁面,key={selectedSiteCode} 強制 remount 以刷新資料
SiteFilterInitializer啟動時拉取站點列表,填入 siteFilterStore
SiteSelectorHeader 站點切換下拉選單(「全部站點」或選擇單站)
localeGuard檢查當前語系是否在站點 supportedLocales 內
scrollToTop路由變更時自動捲至頂部
google-auth-dialogGoogle Authenticator 2FA 設定對話框
themeInjector注入站點主題 CSS 變數

共用元件 (Shared)

元件說明
SiteTabs多站點 Tab 切換元件
FilterBar篩選列(支援 text / date / select 欄位)
SimpleTable資料表格(含分頁、排序、自訂欄位)
pagination通用分頁元件
StatusBadge狀態標籤(搭配 colorMap)
confirmDialog確認對話框(useConfirm hook)
htmlEditorTiptap HTML 編輯器
exportButtonCSV 匯出按鈕
loadingSpinner載入中動畫
accessDenied無權限提示頁面
templatePreviewDialog模板預覽對話框

第 5 章:業務流程圖

5.1 用戶註冊/登入流程

5.1.1 帳號註冊流程

+------------------+
|   用戶開啟前台    |
+--------+---------+
         |
         v
+------------------+
|  點擊「註冊」按鈕  |
+--------+---------+
         |
         v
+------------------+
| 顯示註冊彈窗      |
| (Register Modal) |
+--------+---------+
         |
         v
+------------------+
| 填寫註冊資訊:     |
| - 帳號 (account)  |
| - 密碼 (password) |
| - 推廣碼 (選填)   |
| - 裝置指紋        |
+--------+---------+
         |
         v
+------------------+      +------------------+
| POST /auth/      |      | 驗證失敗:        |
| register          +----->| - 帳號已存在      |
+--------+---------+      | - 推廣碼無效      |
         |                 +------------------+
         | 驗證成功
         v
+------------------+
| 後端處理:         |
| 1. 檢查帳號唯一性  |
| 2. 密碼 bcrypt 雜湊|
| 3. 建立用戶記錄    |
| 4. 依語系分配      |
|    金流群組        |
| 5. 處理推廣碼綁定  |
+--------+---------+
         |
         v
+------------------+
| 推廣碼處理:       |
| resolveRefCode() |
| 1. 查詢推廣碼     |
| 2. 找到對應代理    |
| 3. 綁定 3 層上下線 |
|    level1/2/3     |
| 4. 記錄綁定日誌    |
+--------+---------+
         |
         v
+------------------+
| 簽發 JWT Token    |
| payload:          |
| - sub: userId     |
| - account         |
| - tokenVersion    |
| 有效期: 7 天       |
+--------+---------+
         |
         v
+------------------+
| 回傳 token +      |
| 用戶資訊          |
| → 登入成功        |
+------------------+

詳細步驟說明:

  1. 帳號驗證:系統檢查同站點 (siteCode) 下帳號是否已存在。帳號唯一約束為 (siteCode, account),不同站點可有相同帳號。

  2. 密碼處理:使用 bcryptjs 進行密碼雜湊,salt rounds 依配置決定。

  3. 用戶建立:在 auth-user 表建立新記錄,自動由 SiteCodeSubscriber 填入 siteCode。

  4. 金流群組分配:根據用戶註冊時的語系自動分配金流群組:

    • zh-TW → TWD 群組
    • en-US → USD 群組
    • zh-CN → CNY 群組
    • th-TH → THB 群組
    • vi-VN → VND 群組
  5. 推廣碼綁定:若用戶註冊時帶有推廣碼 (refCode),系統會:

    • 查詢推廣碼對應的代理用戶
    • 支援聯盟推廣碼的雙重查找(聯盟碼 → 主代理碼)
    • 綁定三層代理結構:level1 (直屬上線)、level2 (上線的上線)、level3 (最上層)
    • 記錄綁定日誌到 affiliate-bind-log
  6. 裝置指紋:前端透過 FingerprintJS v5 生成 visitorId,隨註冊請求一同送出,記錄於登入日誌。

5.1.2 帳號登入流程

用戶輸入帳號密碼
    |
    v
POST /auth/login (含 device 指紋)
    |
    v
查詢用戶 (siteCode + account)
    |
    +-- 帳號不存在 → 錯誤 2001
    |
    v
驗證密碼 (bcrypt.compare)
    |
    +-- 密碼錯誤 → 錯誤 2001,記錄登入失敗 (LOGIN_FAIL)
    |
    v
檢查帳號狀態
    |
    +-- 帳號停用 → 錯誤 2002
    |
    v
檢查 2FA (Google Authenticator)
    |
    +-- 已啟用 2FA → 要求輸入 TOTP 驗證碼
    |                  |
    |                  +-- 驗證碼錯誤 → 錯誤
    |                  |
    |                  +-- 驗證成功 ↓
    |
    v
簽發 JWT Token
    |
    v
記錄登入日誌 (auth-user-login-log)
  - IP 位址
  - 裝置指紋 / User-Agent
  - 登入時間
  - 動作: LOGIN
    |
    v
更新 lastActivityAt
    |
    v
回傳 { token, user }

5.1.3 Google OAuth 登入流程

用戶點擊「Google 登入」
    |
    v
GET /auth/google-auth-url
    → 回傳 Google OAuth 授權 URL
    |
    v
重導向至 Google 授權頁面
    |
    v
用戶授權
    |
    v
Google 回調至 /redirect/google (含 authorization code)
    |
    v
前端擷取 code
    |
    v
POST /auth/google-login { code, device }
    |
    v
後端處理:
  1. 使用 google-auth-library 驗證 code
  2. 取得 Google 用戶資訊 (email, sub, name)
  3. 查詢用戶 (siteCode + google = sub)
     |
     +-- 用戶存在 → 直接登入
     |
     +-- 用戶不存在 → 自動建立帳號
         - account: 自動生成
         - google: payload.sub
         - email: payload.email
    |
    v
若舊用戶 google 欄位為空 → 自動補綁 google
    |
    v
簽發 JWT Token → 登入成功

5.1.4 Telegram 登入流程

用戶點擊「Telegram 登入」
    |
    v
Telegram Login Widget 彈出
    |
    v
用戶授權
    |
    v
Telegram 回調至 /redirect/telegram
    |
    v
POST /auth/telegram-login { telegramId, hash, ... }
    |
    v
後端處理:
  1. 驗證 Telegram hash (HMAC-SHA256)
  2. 查詢用戶 (siteCode + telegram = telegramId)
     |
     +-- 用戶存在 → 直接登入
     +-- 用戶不存在 → 自動建立帳號
    |
    v
簽發 JWT Token → 登入成功

5.1.5 2FA (Google Authenticator) 設定流程

用戶進入個人設定
    |
    v
點擊「啟用 Google Authenticator」
    |
    v
POST /auth/google-auth/generate
    → 後端使用 speakeasy 生成 secret
    → 產生 QR Code (使用 qrcode 套件)
    → 回傳 { qrCode, secret }
    |
    v
用戶使用 Google Authenticator App 掃描 QR Code
    |
    v
用戶輸入 6 位 TOTP 驗證碼
    |
    v
POST /auth/google-auth/verify { token: '123456' }
    → 後端使用 speakeasy.totp.verify() 驗證
    |
    +-- 驗證失敗 → 提示重試
    |
    +-- 驗證成功 → 啟用 2FA,儲存 secret 到用戶記錄
    |
    v
後續登入時需輸入 TOTP 驗證碼

5.2 存款流程

用戶進入存款頁面
    |
    v
選擇支付方式:
  +-- 法幣 ATM (Fiat)
  +-- 信用卡 (Credit)
  +-- 加密貨幣 (Crypto/USDT)
    |
    v
選擇金流通道 (Vendor Channel)
    |
    v
輸入存款金額 (當地幣別)
    |
    v
GET /deposit/exchange-rate
    → 取得台灣銀行即時匯率
    → 顯示換算後 USD 金額
    |
    v
用戶確認金額
    |
    v
POST /deposit
  body: { channelId, amount, paymentMethod }
    |
    v
後端處理:
  1. 驗證用戶身份
  2. 查詢金流通道
  3. 計算 USD 金額:
     amount(本幣) / exchangeRate = USD
     truncateUsd() → 無條件捨去至 6 位小數
  4. 建立 deposit-order (status: 'pending')
  5. 路由至對應金流商:
     |
     +-- 萬通金流 (ATM)
     |   POST /vendor/wantong/add-atm
     |   → 萬通 API 回傳付款資訊 (銀行帳號等)
     |
     +-- 萬通金流 (信用卡)
     |   POST /vendor/wantong/add-card
     |   → 萬通 API 回傳信用卡付款頁 URL
     |
     +-- USDT
         → 回傳加密貨幣收款地址 + QR Code
    |
    v
前端顯示付款資訊
    |
    v
用戶在外部完成支付
    |
    v
金流商透過 S2S 回調通知後端:
  +-- POST /vendor/wantong/callback
  +-- POST /vendor/usdt/callback
    |
    v
後端處理回調:
  1. 驗證回調合法性
  2. 更新 deposit-order 狀態
     +-- 成功: status → 'paid'
     +-- 失敗: status → 'failed'
  3. 若成功:
     - 增加用戶 balance
     - 觸發 MissionService.updateDepositProgress()
     - 記錄交易日誌
    |
    v
管理員可在後台審核(若需要)
  /finance/deposit-review
  → 核准 / 拒絕
    |
    v
存款完成

幣別轉換規則:

  • 系統內部一律使用 USD
  • 入金時透過 tw-exchange 取得台灣銀行即時匯率
  • 轉換公式:USD = localAmount / exchangeRate
  • 截斷規則:Math.floor(value * 1e6) / 1e6(無條件捨去至小數 6 位)

5.3 提款流程

用戶進入提款頁面
    |
    v
系統顯示可用餘額 (balance)
    |
    v
選擇提領目的地:
  +-- 已綁定的銀行卡
  +-- 已綁定的加密錢包
    |
    v
輸入提領金額
    |
    v
POST /withdrawal/request
  body: { amount, walletType, walletId }
    |
    v
後端處理:
  1. 驗證餘額是否足夠
  2. 扣除用戶 balance
  3. 增加 frozenBalance (凍結金額)
  4. 建立 withdrawal-order (status: 'pending')
    |
    v
等待後台管理員審核
  /finance/withdrawals
    |
    +-- 拒絕 (reject)
    |   → frozenBalance 退回 balance
    |   → status: 'rejected'
    |
    +-- 核准 (approve)
        → status: 'approved'
        |
        v
    管理員匯款
        |
        v
    上傳匯款憑證
        |
        v
    標記完成 (complete)
        → frozenBalance 扣減
        → status: 'completed'
    |
    v
提款完成,用戶收到款項

三階段審核流程:

階段狀態操作金額變動
1. 申請pending用戶提交balance(-) → frozenBalance(+)
2. 審核approved / rejected管理員審核rejected: frozenBalance(-) → balance(+)
3. 完成completed管理員標記frozenBalance(-)

5.4 遊戲啟動流程

用戶在遊戲大廳點擊遊戲
    |
    v
前端發送 POST /game/launch
  body: { gameCode, productId }
    |
    v
後端處理:
  1. 驗證用戶已登入 (JwtAuthGuard)
    |
    +-- 未登入 → HTTP 401
    |
    v
  2. 查詢遊戲配置 (game-provider + game-type-config)
    |
    +-- 遊戲不存在 → 錯誤
    |
    v
  3. 風控檢查:
     AdminRiskService.isUserBlockedFromGame(userId, gameCode, productId, siteCode)
     - 查詢 risk-game-blacklist:
       a. 全封鎖:gameType=null, productId=null
       b. 類型封鎖:gameType 匹配
       c. 特定遊戲封鎖:productId 匹配
    |
    +-- 被封鎖 → 錯誤碼 5010
    |
    v
  4. 呼叫遊戲供應商 API:
    |
    +-- BetSolutions:
    |   POST BS_AUTH_URL/auth
    |   → 取得遊戲 URL
    |
    +-- RSG:
        DES 加密請求 → POST RSG_API_URL
        → DES 解密回應 → 取得遊戲 URL
    |
    v
  5. 非同步記錄遊玩紀錄:
     UPSERT game-play-log (userId, gameCode, productId, siteCode)
     → .catch(() => {}) 不阻塞主流程
    |
    v
  6. 回傳遊戲 URL
    |
    v
前端以 iframe 載入遊戲
    |
    v
用戶在遊戲中下注 / 派彩
    |
    v
遊戲供應商透過 S2S 回調通知:
  +-- POST /game/betsolutions/callback
  +-- POST /game/rsg/callback
    |
    v
後端處理 S2S 回調:
  1. 驗證回調合法性
  2. 記錄 game-transaction
  3. 更新用戶 balance (下注扣款 / 派彩加款)
  4. 記錄 bet-order / bet-detail
    |
    v
投注結算後連鎖觸發(同步):
  a. VipService.recalculateUserVip(userId)
     → 檢查 totalEffectiveBet 是否達到下一等級 minChip
     → 若達標:自動升級(只升不降)
  b. PromoService.updatePromoTurnover(userId, betAmount, gameType)
     → 扣減活動打碼量
  c. MissionService.updateBetProgress(userId, betAmount, gameType)
     → 更新任務投注進度

5.5 VIP 升級/保級/降級流程

5.5.1 VIP 升級(即時觸發)

用戶投注結算完成
    |
    v
VipService.recalculateUserVip(userId)
    |
    v
查詢用戶累計有效投注 (totalEffectiveBet)
    |
    v
查詢用戶當前 VIP 等級 (currentLevel)
    |
    v
查詢下一等級的升級門檻 (nextLevel.minChip)
    |
    v
totalEffectiveBet >= nextLevel.minChip ?
    |
    +-- 否 → 不做任何操作
    |
    +-- 是 → 自動升級:
        1. 更新用戶 vipLevel
        2. 檢查是否可再往上升(遞迴檢查)
        3. 觸發 VIP 里程碑檢查:
           → 通知代理上線獲得里程碑獎勵
           → 記錄 alliance-vip-milestone-log

重要規則:

  • VIP 等級只升不降(投注觸發的升級是單向的)
  • 降級只會透過月度保級檢查觸發
  • 每站 VIP 等級獨立配置,等級數量可自由擴充

5.5.2 每日反水結算(Cron: 每日 00:05)

Cron 觸發 (0 5 0 * * *)
    |
    v
遍歷所有站點 (siteCode)
    |
    v
遍歷所有有效用戶
    |
    v
對每個用戶:
  1. 查詢前一天的有效投注(按 8 種遊戲類型分類)
     - Sports (1)
     - Slot (2)
     - Live (3)
     - Lottery (4)
     - Chess (5)
     - Esports (8)
     - Crypto (9)
     - Fish (10)
    |
    v
  2. 查詢用戶 VIP 等級
    |
    v
  3. 查詢該等級各遊戲類型的返水比例
     vip-rebate: unique(siteCode, level, gameType)
    |
    v
  4. 計算返水金額:
     rebateAmount = effectiveBet * rebateRate / 100
     truncateUsd(rebateAmount)
    |
    v
  5. 發放反水:
     - 增加用戶 balance
     - 記錄 vip-rebate-log
    |
    v
結算完成

5.5.3 月度保級檢查(Cron: 每月 1 號 01:00)

Cron 觸發 (0 0 1 1 * *)
    |
    v
遍歷所有站點
    |
    v
遍歷所有 VIP 等級 >= 1 的用戶
    |
    v
對每個用戶:
  1. 查詢當月有效投注 (monthlyEffectiveBet)
  2. 查詢當前 VIP 等級的保級門檻 (relegationChip)
    |
    v
  monthlyEffectiveBet >= relegationChip ?
    |
    +-- 是 (達標):
    |   → relegationMissCount = 0
    |   → 保級成功
    |
    +-- 否 (未達標):
        → relegationMissCount++
        |
        v
    relegationMissCount >= 2 ?
        |
        +-- 否 → 警告,下月繼續觀察
        |
        +-- 是 → 檢查保級鎖定
            |
            v
        vipHold = 1 ?
            |
            +-- 是 → 跳過降級(VIP 5+ 手動鎖定)
            |
            +-- 否 → 降一級
                → vipLevel--
                → relegationMissCount = 0

5.6 代理推廣流程

5.6.1 代理申請與推廣

用戶申請成為代理
    |
    v
POST /affiliate/apply-agent
    |
    v
系統為用戶生成代理碼 (agentCode)
    |
    v
代理可建立推廣碼(最多 10 個)
  POST /affiliate/referral-codes
  → 建立 alliance-referral-code 記錄
  → 支援聯盟碼到主代理碼的雙重查找
    |
    v
代理分享推廣連結
  https://example.com?ref=ABC123
    |
    v
潛在用戶點擊連結
  → POST /affiliate/track-click
  → 記錄 affiliate-click (IP, refCode, timestamp)
    |
    v
用戶註冊時帶入 refCode
  → resolveRefCode()
  → 綁定 3 層代理關係 (level1/2/3)
  → 記錄 affiliate-bind-log

5.6.2 佣金結算流程

每週一 03:00 觸發週結 (Cron: 0 0 3 * * 1)

每日 03:30 觸發日結 (Cron: 0 30 3 * * *)
    |
    v
遍歷所有站點
    |
    v
遍歷所有代理
    |
    v
對每個代理:
  1. 查詢結算期間內下線的有效投注
  2. 按 3 層級別分別計算佣金:
     - level1 (直屬下線)
     - level2 (下線的下線)
     - level3 (第三層下線)
  3. 根據代理等級 (tier) 查詢佣金費率
     alliance-commission-rate: (agentTier, agentLevel, gameType)
  4. 計算佣金 = effectiveBet * commissionRate
    |
    v
風控檢測 (AffiliateRiskService)
  → 檢查異常下線行為
  → 記錄 affiliate-risk-log
    |
    v
建立結算記錄 (affiliate-settlement)
  unique(siteCode, agentId, weekStart)
  status: 'pending'
    |
    v
等待管理員審核
  /affiliate/settlements
    |
    +-- 核准 (approve)
    |   → 佣金入帳 affiliate-balance
    |   → status: 'approved'
    |
    +-- 拒絕 (reject)
        → status: 'rejected'

5.6.3 代理提款流程

代理查看佣金餘額
  GET /affiliate/balance
    |
    v
申請提款
  POST /affiliate/request-withdrawal
  body: { amount, method }
    |
    v
建立 affiliate-withdrawal (status: 'pending')
  → 扣減 affiliate-balance
    |
    v
等待管理員審核
  /affiliate/aff-withdrawals
    |
    +-- 拒絕 → 退回餘額, status: 'rejected'
    |
    +-- 核准 → status: 'approved'
        |
        v
    管理員匯款並標記完成
        → status: 'completed'

5.7 任務系統流程

管理員建立任務 (mission)
  - category: daily_deposit / weekly_bet / monthly_challenge
  - periodType: daily / weekly / monthly
  - tier: 任務層級
  - target: 目標值
  - reward: 獎勵金額
  - unique(siteCode, category, periodType, tier)
    |
    v
用戶在平台進行操作:
    |
    +-- 存款確認 → MissionService.updateDepositProgress()
    |   → 更新 mission-progress 的 currentValue
    |   → unique(siteCode, userId, periodType, periodKey)
    |
    +-- 投注結算 → MissionService.updateBetProgress()
        → 更新 mission-progress 的 currentValue
    |
    v
用戶查看任務列表
  GET /mission/list + GET /mission/progress
    |
    v
任務進度 currentValue >= target ?
    |
    +-- 否 → 顯示進度條
    |
    +-- 是 → 領取按鈕啟用
        |
        v
    用戶點擊領取
      POST /mission/:id/claim
        |
        v
    後端處理:
      1. 驗證任務進度達標
      2. 檢查是否已領取 (mission-claim unique)
      3. 發放獎勵至用戶 balance
      4. 建立 mission-claim 記錄
         unique(siteCode, missionId, userId, periodKey)

5.8 活動領取流程

管理員建立活動 (promo)
  - 多語系標題、內容
  - 條件:deposit_threshold / vip_level / first_deposit
  - 打碼量倍率 (turnoverMultiplier)
  - 獎勵金額
  - 有效期間
    |
    v
用戶瀏覽活動列表
  GET /promo/list
    |
    v
用戶進入活動詳情
  GET /promo/:id
    |
    v
用戶點擊「領取」
  POST /promo/:id/claim
    |
    v
後端處理:
  1. 檢查活動是否在有效期間內
  2. 檢查活動狀態是否為啟用
  3. 檢查用戶是否已領取
     promo-claim unique(siteCode, promoId, userId)
  4. 檢查領取條件:
     +-- deposit_threshold: 用戶累計存款是否達標
     +-- vip_level: 用戶 VIP 等級是否達標
     +-- first_deposit: 是否為首次存款
    |
    +-- 條件不符 → 錯誤訊息
    |
    +-- 條件符合:
        1. 建立 promo-claim 記錄
        2. 發放獎勵至用戶 balance
        3. 設定打碼量要求:
           remainingTurnover = reward * turnoverMultiplier
        4. 後續投注會扣減 remainingTurnover
           (PromoService.updatePromoTurnover)

第 6 章:多站點架構

6.1 白牌架構概念

C9 平台採用白牌 (White-Label) 架構設計,核心理念是:一套程式碼,多個品牌

每個「站點」(Site) 代表一個獨立的娛樂城品牌,擁有:

  • 獨立的品牌視覺(Logo、主題色、吉祥物)
  • 獨立的遊戲配置(可選擇啟用哪些遊戲商與遊戲分類)
  • 獨立的 VIP 體系(等級數量、升級門檻、返水比例皆可不同)
  • 獨立的金流通道
  • 獨立的代理推廣體系
  • 獨立的用戶帳號系統(同帳號可在不同站點各自註冊)
  • 獨立的風控規則
  • 獨立的客服配置

6.2 站點隔離機制

siteCode 欄位

站點隔離的核心是 siteCode 欄位。在 49 張資料表中,有 37 張包含 siteCode 欄位,確保資料按站點隔離。

@Column({ type: 'varchar', length: 30, default: 'C9', comment: '所屬站點代碼' })
@Index()
siteCode: string;

SiteCodeSubscriber

TypeORM Entity Subscriber,在 Entity 插入 (beforeInsert) 時自動填入 siteCode

  • 檢查 Entity metadata 是否有 siteCode 欄位
  • 若有且未手動設定,自動填入環境變數 SITE_CODE(預設 'C9'
  • 若已手動設定(例如透過 @AdminSiteCode() 帶入),則不覆寫

不含 siteCode 的資料表 (12 張)

以下資料表為全站共用,不區分站點:

資料表原因
admin-user管理員帳號全站共用
admin-group權限群組全站共用
admin-operation-log操作紀錄全站共用
r2-operation-logR2 操作紀錄全站共用
vendor-group-channel群組-通道關聯(中間表)
alliance-commission-rate佣金費率全站共用
alliance-agent-tier代理等級全站共用
alliance-vip-milestoneVIP 里程碑全站共用
site-config站點設定表(自身就是站點定義)
site-theme站點主題(透過 siteConfigId 關聯)

6.3 前端站點解析

前台 (c9-ec)

前台透過 useConfig.ts 中的 domainConfig 物件,根據當前瀏覽器的 hostname 判斷站點:

hostname → domainConfig[hostname] → { siteId, siteCode, apiBaseUrl, siteName }

前端自動在 HTTP 請求中注入 site-name header,供後端識別站點。

後台 (c9-ims)

後台的站點切換透過 Header 的 SiteSelector 下拉選單操作:

  1. SiteFilterInitializer:App 啟動時拉取 /site-config/admin/list,取得所有站點列表,填入 siteFilterStore
  2. SiteSelector:Header 中的站點切換下拉選單,提供「全部站點」或選擇單一站點
  3. AdminContentWrapper:以 key={selectedSiteCode} 包裹管理頁面,站點切換時強制 remount,確保所有子頁面重新載入資料
  4. TanStack Query Cache 清除:切換站點時自動清除 TanStack Query 快取

6.4 siteCode 傳遞機制

前台 API

場景Header說明
前台用戶操作site-name: C9自動由 domainConfig 設定

後端透過 @SiteName() decorator 讀取。

後台 Admin API

場景Header 選擇API Client 行為前端處理
全部站點 + TabselectedSiteCode = null不帶 x-site-code手動傳 siteCode query param
獨立站點selectedSiteCode = "C9"自動帶 x-site-code: C9Tab 僅顯示一個站

後端透過 @AdminSiteCode() decorator 讀取:

  • 優先讀 x-site-code header
  • 其次讀 siteCode query param
  • 都沒有則回傳 null(代表全站)

6.5 SiteTabs 元件

SiteTabs 是多站點列表頁面的核心元件,提供站點 Tab 切換功能。

使用 useMultiSiteTabs hook(推薦)

const { visibleSites, activeSiteId, activeSiteCode, handleSiteChange }
  = useMultiSiteTabs({ onSiteChange: () => setPage(1) });

自動處理:

  • 根據 Header SiteSelector 的選擇過濾可見站點
  • 追蹤當前選中的 Tab
  • 推導 activeSiteCode 用於 API 查詢
  • 站點切換時重置分頁

已完成多站點支援的模組 (47 個頁面)

分類頁面數模式
財務管理7模式 A
遊戲管理2模式 A + 同預設站點 + 帶入模板
VIP 管理4模式 A + 同預設站點 + 帶入模板
玩家管理4模式 A
活動管理2模式 A
報表6模式 A
風控管理3模式 A
代理中心8模式 A / 模式 B
站內信2模式 A / 模式 B
系統管理2模式 A
站點設定5模式 B
佈局配置3模式 B

6.6 「同預設站點」功能

提供兩種「從預設站點複製」的模式:

模式 1:前端狀態拷貝

適用 5 個站點設定頁面(三方登入、遊戲商配置、服務商配置、客服配置、域名設置)。

  • 深拷貝預設站的表單資料到目標站
  • 用戶需手動確認並儲存
  • 不直接寫入資料庫

模式 2:後端 API 直接複製

適用遊戲管理、VIP 等 CRUD 列表頁面。

  • 呼叫後端 API:POST /xxx/admin/copy-site-data
  • 參數:{ sourceSiteCode, targetSiteCode, type }
  • 後端在 transaction 內先刪後插
  • 立即生效,自動刷新頁面資料

6.7 模板系統

遊戲管理與 VIP 管理支援「帶入模板」功能:

  1. 預覽GET /xxx/admin/preview-template → 回傳預設模板資料
  2. 編輯:前端顯示 templatePreviewDialog,用戶可修改模板內容
  3. 確認POST /xxx/admin/load-template → atomic transaction 寫入資料庫
  4. 模板只影響當前站點(由 @AdminSiteCode() 決定寫入站點)

第 7 章:多語系支援

7.1 支援語系總覽

語系代碼語言前台 (c9-ec)後台 (c9-ims)後端 (c9-be)幣別映射
zh-TW繁體中文YYYTWD (新台幣)
en-USEnglishYYYUSD (美元)
zh-CN簡體中文YYYCNY (人民幣)
th-THภาษาไทยYYYTHB (泰銖)
vi-VNTiếng ViệtYYYVND (越南盾)

7.2 各專案多語系策略

前台 (c9-ec)

項目說明
框架@nuxtjs/i18n
策略no_prefix (cookie 儲存語系偏好)
URL 行為URL 中不顯示語系前綴
切換方式語系切換彈窗 (Locale Modal)
儲存位置Cookie
同步切換語系時同步更新用戶偏好到後端

後台 (c9-ims)

項目說明
框架next-intl v4.8
策略no_prefix (cookie 儲存,NEXT_LOCALE)
URL 行為URL 中不顯示語系前綴
檔案格式扁平 key-value JSON
檔案路徑src/messages/{locale}.json
使用方式const t = useTranslations("namespace")t("key")

i18n key 格式範例:

"system.admins.title": "管理員管理"
"common.save": "儲存"
"common.cancel": "取消"
"nav.dashboard": "儀表板"

後端 (c9-be)

項目說明
框架nestjs-i18n v10.6
預設語系zh-TW (fallback)
解析器HeaderResolver(['locales']) → AcceptLanguageResolver()
前端傳遞HTTP header locales: zh-TW
檔案數量5 語系 x 17 JSON 檔案 = 85 個
檔案路徑src/i18n/{locale}/*.json

7.3 後端 i18n 檔案清單 (每語系 17 個)

檔案名稱用途
adminError.json後台管理錯誤碼
affiliateError.json代理推廣錯誤碼
authError.json認證錯誤碼
betRecordError.json投注紀錄錯誤碼
depositError.json存款錯誤碼
game.json遊戲相關文字
gameError.json遊戲錯誤碼
inboxError.json站內信錯誤碼
liveSports.json即時體育文字
missionError.json任務錯誤碼
promoError.json活動錯誤碼
ranking.json排行榜文字
siteConfigError.json站點設定錯誤碼
vendorError.json金流錯誤碼
vipError.jsonVIP 錯誤碼
walletError.json錢包錯誤碼
withdrawalError.json提領錯誤碼

7.4 多語系內容儲存

資料庫多語系欄位

資料庫中的多語系內容使用 JSON 格式儲存,欄位型別為 json

json
{
  "zh-TW": "繁體中文內容",
  "en-US": "English content",
  "zh-CN": "简体中文内容",
  "th-TH": "เนื้อหาภาษาไทย",
  "vi-VN": "Nội dung tiếng Việt"
}

使用此格式的欄位包括:

  • VIP 等級名稱 (vip-level.name)
  • 活動標題/簡介/內容 (promo.title, promo.description, promo.content)
  • 活動標籤名稱 (promo-tag.name)
  • 通知標題/內容 (notification.title, notification.content)
  • 任務名稱/描述 (mission.name, mission.description)
  • 站點名稱/介紹 (site-config.name, site-config.description)
  • 客服管道標題 (customerServiceConfig[].label)
  • 了解更多 FAQ (learnMoreConfig[].title, learnMoreConfig[].content)

後端解析方法

後端使用 resolveText(json) 工具函式解析多語系 JSON:

  1. 優先使用當前請求語系的文字
  2. Fallback 到 zh-TW
  3. 再 Fallback 到 JSON 中的第一個值
  4. 最終 Fallback 到空字串

7.5 翻譯工作流程

新增翻譯 key 的規範

後台 (c9-ims):

  1. src/messages/zh-TW.json 新增 key
  2. 必須同步更新全部 5 個語系檔案:zh-TW, en-US, zh-CN, th-TH, vi-VN
  3. 使用扁平 key 格式(dot notation):"module.section.key": "翻譯內容"

後端 (c9-be):

  1. src/i18n/zh-TW/xxxError.json 新增錯誤碼
  2. 必須同步更新全部 5 個語系目錄下的對應檔案
  3. 錯誤碼 JSON 結構:{ "section": { "code": "錯誤訊息" } }

ICU 格式注意事項

後台使用 next-intl,其內部使用 ICU 訊息格式。大括號 {} 會被解析為變數佔位符:

  • 正確"格式為 '{'變數名'}'" → 顯示 格式為 {變數名}
  • 錯誤"格式為 {變數名}" → 會導致 IntlError: FORMATTING_ERROR

7.6 語系同步機制

前台切換語系
    |
    v
更新 Cookie (no_prefix 策略)
    |
    v
API 請求自動帶入 locales header
    |
    v
後端根據 locales header 回傳對應語系內容
    |
    v
前端更新頁面顯示

第 8 章:排程任務

8.1 排程任務總覽

#排程名稱Cron 表達式執行時間模組服務
1每日 VIP 反水結算0 5 0 * * *每日 00:05VIPVipService
2月度 VIP 保級檢查0 0 1 1 * *每月 1 號 01:00VIPVipService
3代理佣金週結0 0 3 * * 1每週一 03:00AffiliateAffiliateSettlementService
4代理佣金日結0 30 3 * * *每日 03:30AffiliateAffiliateSettlementService
5即時賽事快取更新0 */30 * * * *每 30 分鐘LiveSportsLiveSportsService

8.2 每日 VIP 反水結算

基本資訊

項目說明
Cron0 5 0 * * *
執行時間每日 00:05
服務VipService
影響資料表vip-rebate-log, auth-user

詳細流程

  1. 遍歷所有站點:逐一處理每個站點的反水結算

  2. 查詢前日有效投注

    • 時間範圍:前一天 00:00:00 ~ 23:59:59
    • 按用戶 x 遊戲類型 (8 種) 彙總有效投注金額
  3. 查詢返水規則

    • 根據用戶 VIP 等級查詢 vip-rebate
    • unique key: (siteCode, level, gameType)
    • 每個等級的每種遊戲類型可有不同的返水比例
  4. 計算返水金額

    rebateAmount = effectiveBet * rebateRate / 100
    rebateAmount = truncateUsd(rebateAmount)  // 無條件捨去至 6 位小數
  5. 發放反水

    • 增加用戶 balance
    • 建立 vip-rebate-log 記錄

注意事項

  • 每站獨立計算,VIP 等級與返水規則按站點配置
  • 8 種遊戲類型各自計算:Sports, Slot, Live, Lottery, Chess, Esports, Crypto, Fish
  • 返水金額使用 USD 無條件捨去規則

8.3 月度 VIP 保級檢查

基本資訊

項目說明
Cron0 0 1 1 * *
執行時間每月 1 號 01:00
服務VipService
影響資料表auth-user

詳細流程

  1. 遍歷所有站點

  2. 遍歷所有 VIP >= 1 的用戶

  3. 查詢當月有效投注

    • 彙總用戶當月所有有效投注 (totalEffectiveBet)
  4. 與保級門檻比較

    • 查詢用戶當前 VIP 等級的 relegationChip
  5. 判定結果

    • 達標relegationMissCount = 0
    • 未達標relegationMissCount++
    • 連續 2 月未達標relegationMissCount >= 2 → 降一級
    • 保級鎖定vipHold = 1 → 跳過降級(VIP 5+ 手動鎖定功能)

保級規則表

條件動作
月投注 >= relegationChip保級成功,missCount 歸零
月投注 < relegationChip,missCount < 2警告,missCount+1
月投注 < relegationChip,missCount >= 2,vipHold=0降一級
月投注 < relegationChip,missCount >= 2,vipHold=1跳過降級

8.4 代理佣金週結

基本資訊

項目說明
Cron0 0 3 * * 1
執行時間每週一 03:00
服務AffiliateSettlementService
影響資料表affiliate-settlement, affiliate-balance, affiliate-commission, affiliate-risk-log

詳細流程

  1. 遍歷所有站點

  2. 計算結算期間:上週一 00:00 ~ 上週日 23:59

  3. 遍歷所有代理

  4. 彙總下線有效投注

    • 按 3 層級別 (level1/2/3) 分別計算
    • 按 8 種遊戲類型分類
  5. 查詢佣金費率

    • 根據代理等級 (tier) 查詢 alliance-commission-rate
    • unique: (agentTier, agentLevel, gameType)
  6. 計算佣金

    commission = effectiveBet * commissionRate
  7. 風控檢測

    • AffiliateRiskService 檢查異常行為
    • 記錄 affiliate-risk-log
  8. 建立結算記錄

    • affiliate-settlement (status: 'pending')
    • unique: (siteCode, agentId, weekStart)
  9. 等待管理員審核

佣金費率矩陣

維度選項
代理等級 (tier)bronze / silver / gold / platinum (4 級)
代理層級 (level)level1 / level2 / level3 (3 層)
遊戲類型 (gameType)8 種
合計4 x 3 x 8 = 96 筆費率

8.5 代理佣金日結

基本資訊

項目說明
Cron0 30 3 * * *
執行時間每日 03:30
服務AffiliateSettlementService
影響資料表同週結

說明

日結為週結的替代結算方式,流程與週結相同,但結算期間為前一天。管理員可在後台手動觸發結算。


8.6 即時賽事快取更新

基本資訊

項目說明
Cron0 */30 * * * *
執行時間每 30 分鐘
服務LiveSportsService
快取Redis

詳細流程

  1. 呼叫 API-Football 外部 API 取得最新賽事資料
  2. 解析回應資料(比賽隊伍、比分、狀態、開賽時間等)
  3. 將結果存入 Redis 快取
  4. 前台透過 GET /live-sports/matches 從快取讀取
  5. 快取 TTL 隨 Cron 週期自動更新

第 9 章:API 端點總覽

9.1 端點統計

模組端點數路徑前綴
Auth (認證)17/api/auth
Game (遊戲)17/api/game
Wallet (錢包)9/api/wallet
Vendor (金流)9/api/vendor
Deposit (存款)4/api/deposit
Withdrawal (提領)7/api/withdrawal
Promo (活動)7/api/promo
VIP13/api/vip
Affiliate (代理)39/api/affiliate
Inbox (站內信)7/api/inbox
Mission (任務)3/api/mission
SiteConfig (站點設定)8/api/site-config
Ranking (排行榜)1/api/ranking
BetRecord (投注紀錄)2/api/bet-record
LiveSports (即時賽事)1/api/live-sports
Common (共用)1/api/common
Admin (後台管理)90+/api/admin
合計205+

9.2 認證模組 (Auth) — 17 個端點

#方法路由認證說明
1POST/auth/register帳號註冊
2POST/auth/login帳號登入
3GET/auth/google-auth-url取得 Google OAuth URL
4POST/auth/google-loginGoogle OAuth 登入
5POST/auth/telegram-loginTelegram 登入
6GET/auth/check-account檢查帳號可用性
7GET/auth/user-detailJWT取得用戶資料
8PATCH/auth/update-profileJWT更新個人資料
9POST/auth/avatarJWT上傳頭像
10PATCH/auth/set-passwordJWT設定密碼(OAuth 用戶首次設定)
11PATCH/auth/update-passwordJWT修改密碼
12POST/auth/send-email-verifyJWT發送 Email 驗證碼
13POST/auth/verify-emailJWT驗證 Email
14POST/auth/send-mobile-verifyJWT發送手機驗證碼
15POST/auth/verify-mobileJWT驗證手機
16POST/auth/google-auth/*JWTGoogle Auth 2FA 操作 (generate/verify/disable)
17POST/auth/logoutJWT登出

9.3 遊戲模組 (Game) — 17 個端點

#方法路由認證說明
1GET/game/providers可選JWT遊戲供應商列表
2GET/game/type-configs可選JWT遊戲分類列表
3POST/game/launchJWT啟動遊戲
4POST/game/demo試玩遊戲
5GET/game/recentJWT近期遊玩遊戲
6POST/game/betsolutions/callbackBetSolutions S2S 回調
7POST/game/rsg/callbackRSG S2S 回調
8GET/game/admin/providersAdminJWT[Admin] 遊戲商列表
9POST/game/admin/providersAdminJWT[Admin] 新增遊戲商
10PATCH/game/admin/providers/:idAdminJWT[Admin] 更新遊戲商
11DELETE/game/admin/providers/:idAdminJWT[Admin] 刪除遊戲商
12GET/game/admin/type-configsAdminJWT[Admin] 分類列表
13POST/game/admin/type-configsAdminJWT[Admin] 新增分類
14PATCH/game/admin/type-configs/:idAdminJWT[Admin] 更新分類
15DELETE/game/admin/type-configs/:idAdminJWT[Admin] 刪除分類
16GET/game/admin/preview-templateAdminJWT[Admin] 預覽模板
17POST/game/admin/load-templateAdminJWT[Admin] 帶入模板

9.4 錢包模組 (Wallet) — 9 個端點

#方法路由認證說明
1POST/wallet/bank-card/addJWT新增銀行卡
2GET/wallet/bank-card/listJWT銀行卡列表
3DELETE/wallet/bank-card/:idJWT刪除銀行卡
4POST/wallet/credit-card/addJWT新增信用卡
5GET/wallet/credit-card/listJWT信用卡列表
6DELETE/wallet/credit-card/:idJWT刪除信用卡
7POST/wallet/crypto-address/addJWT新增加密錢包
8GET/wallet/crypto-address/listJWT加密錢包列表
9DELETE/wallet/crypto-address/:idJWT刪除加密錢包

9.5 金流模組 (Vendor) — 9 個端點

#方法路由認證說明
1GET/vendor/groupsJWT金流群組列表
2GET/vendor/channelsJWT金流通道列表
3POST/vendor/wantong/add-atmJWT萬通 ATM 入金
4POST/vendor/wantong/add-cardJWT萬通信用卡入金
5POST/vendor/wantong/callback萬通 S2S 回調
6POST/vendor/usdt/callbackUSDT S2S 回調
7GET/vendor/admin/groupsAdminJWT[Admin] 群組列表
8GET/vendor/admin/channelsAdminJWT[Admin] 通道列表
9POST/vendor/admin/groupsAdminJWT[Admin] 管理群組

9.6 存款模組 (Deposit) — 4 個端點

#方法路由認證說明
1POST/depositJWT建立存款訂單
2GET/deposit/ordersJWT存款訂單列表
3GET/deposit/orders/:idJWT存款訂單詳情
4GET/deposit/exchange-rateJWT取得即時匯率

9.7 提領模組 (Withdrawal) — 7 個端點

#方法路由認證說明
1POST/withdrawal/requestJWT提領申請
2GET/withdrawal/ordersJWT提領訂單列表
3GET/withdrawal/orders/:idJWT提領訂單詳情
4GET/withdrawal/admin/listAdminJWT[Admin] 提領列表
5POST/withdrawal/admin/:id/reviewAdminJWT[Admin] 審核
6POST/withdrawal/admin/:id/upload-proofAdminJWT[Admin] 上傳憑證
7POST/withdrawal/admin/:id/completeAdminJWT[Admin] 標記完成

9.8 活動模組 (Promo) — 7 個端點

#方法路由認證說明
1GET/promo/list可選JWT活動列表
2GET/promo/tags活動標籤列表
3GET/promo/:id可選JWT活動詳情
4POST/promo/:id/claimJWT領取活動
5POST/admin/promos/createAdminJWT[Admin] 新增活動
6PATCH/admin/promos/:idAdminJWT[Admin] 更新活動
7DELETE/admin/promos/:idAdminJWT[Admin] 刪除活動

9.9 VIP 模組 — 13 個端點

#方法路由認證說明
1GET/vip/levels可選JWTVIP 等級列表
2GET/vip/user-statusJWT用戶 VIP 狀態
3GET/vip/my-rebatesJWT我的返水紀錄
4GET/vip/rebates可選JWT返水規則列表
5GET/vip/admin/levelsAdminJWT[Admin] 等級列表
6POST/vip/admin/levelsAdminJWT[Admin] 新增等級
7PATCH/vip/admin/levels/:idAdminJWT[Admin] 更新等級
8DELETE/vip/admin/levels/:idAdminJWT[Admin] 刪除等級
9POST/vip/admin/rebates/bulkAdminJWT[Admin] 返水批量更新
10POST/vip/admin/copy-site-dataAdminJWT[Admin] 跨站複製
11GET/vip/admin/preview-templateAdminJWT[Admin] 預覽模板
12POST/vip/admin/load-templateAdminJWT[Admin] 帶入模板
13GET/admin/reports/vip-playersAdminJWT[Admin] VIP 玩家報表

9.10 代理模組 (Affiliate) — 39 個端點

前台端點 (15 個)

#方法路由認證說明
1POST/affiliate/track-click追蹤推廣點擊
2POST/affiliate/apply-agentJWT申請成為代理
3GET/affiliate/dashboardJWT代理儀表板
4GET/affiliate/commissionsJWT佣金列表
5GET/affiliate/settlementsJWT結算紀錄
6GET/affiliate/downlinesJWT下線列表
7GET/affiliate/balanceJWT代理餘額
8POST/affiliate/request-withdrawalJWT申請提款
9GET/affiliate/withdrawalsJWT提款紀錄

聯盟公開端點 (6 個)

#方法路由認證說明
10GET/affiliate/alliance-info聯盟資訊
11GET/affiliate/tier-info代理等級資訊
12GET/affiliate/vip-milestonesVIP 里程碑
13GET/affiliate/referral-codesJWT推廣碼列表
14POST/affiliate/referral-codesJWT新增推廣碼
15DELETE/affiliate/referral-codes/:idJWT刪除推廣碼

Admin 端點 (24 個)

#方法路由認證說明
16GET/affiliate/admin/agentsAdminJWT代理列表
17POST/affiliate/admin/create-agentAdminJWT新增代理
18GET/affiliate/admin/settlementsAdminJWT結算列表
19POST/affiliate/admin/settlements/:id/reviewAdminJWT結算審核
20GET/affiliate/admin/settlements/:id/risk-logsAdminJWT風控紀錄
21GET/affiliate/admin/withdrawalsAdminJWT代理提款列表
22POST/affiliate/admin/withdrawals/:id/reviewAdminJWT提款審核
23POST/affiliate/admin/withdrawals/:id/completeAdminJWT提款完成
24POST/affiliate/admin/bindAdminJWT手動綁定
25GET/affiliate/admin/bind-logsAdminJWT綁定紀錄
26GET/affiliate/admin/commission-ratesAdminJWT佣金費率列表
27POST/affiliate/admin/commission-ratesAdminJWT更新佣金費率
28DELETE/affiliate/admin/commission-ratesAdminJWT刪除佣金費率
29GET/affiliate/admin/vip-milestonesAdminJWTVIP 里程碑列表
30POST/affiliate/admin/vip-milestonesAdminJWT更新 VIP 里程碑
31DELETE/affiliate/admin/vip-milestonesAdminJWT刪除 VIP 里程碑
32GET/affiliate/admin/agent-tiersAdminJWT代理等級列表
33POST/affiliate/admin/agent-tiersAdminJWT更新代理等級
34DELETE/affiliate/admin/agent-tiersAdminJWT刪除代理等級
35GET/affiliate/admin/preview-templateAdminJWT預覽模板
36POST/affiliate/admin/load-templateAdminJWT帶入模板
37POST/affiliate/admin/set-agent-tierAdminJWT設定代理等級
38POST/affiliate/admin/trigger-settlementAdminJWT觸發週結
39POST/affiliate/admin/trigger-daily-settlementAdminJWT觸發日結

9.11 站內信模組 (Inbox) — 7 個端點

#方法路由認證說明
1GET/inbox/listJWT通知列表
2GET/inbox/:idJWT通知詳情
3POST/inbox/:id/readJWT標記已讀
4DELETE/inbox/:idJWT刪除通知
5GET/inbox/unread-countJWT未讀數量
6POST/admin/inbox/sendAdminJWT[Admin] 發送通知
7GET/admin/inbox/settingsAdminJWT[Admin] 通知設定

9.12 站點設定模組 (Site Config) — 8+12 個端點

公開端點 (2 個)

#方法路由認證說明
1GET/site-config/public取得站點公開設定
2GET/site-config/theme取得站點主題

Admin 端點 (12 個)

#方法路由認證說明
3GET/site-config/admin/listAdminJWT站點列表
4POST/site-config/adminAdminJWT新增站點
5PATCH/site-config/admin/:idAdminJWT更新站點
6DELETE/site-config/admin/:idAdminJWT刪除站點
7GET/site-config/admin/:siteConfigId/themesAdminJWT主題列表
8POST/site-config/admin/:siteConfigId/themesAdminJWT新增主題
9PATCH/site-config/admin/themes/:idAdminJWT更新主題
10DELETE/site-config/admin/themes/:idAdminJWT刪除主題
11POST/site-config/admin/:id/domain-assetAdminJWT上傳域名素材
12POST/site-config/admin/:id/customer-service-iconAdminJWT上傳客服圖示
13PATCH/site-config/admin/:siteConfigId/mascotsAdminJWT更新吉祥物
14GET/site-config/admin/:siteCode/customer-serviceAdminJWT取得客服設定

9.13 其他模組

Mission (任務) — 3 個端點

#方法路由認證說明
1GET/mission/listJWT任務列表
2GET/mission/progressJWT任務進度
3POST/mission/:id/claimJWT領取任務獎勵

Ranking (排行榜) — 1 個端點

#方法路由認證說明
1GET/ranking/list可選JWT排行榜列表

BetRecord (投注紀錄) — 2 個端點

#方法路由認證說明
1GET/bet-record/listJWT投注紀錄列表
2GET/bet-record/:idJWT投注詳情

LiveSports (即時賽事) — 1 個端點

#方法路由認證說明
1GET/live-sports/matches即時賽事列表

Common (共用) — 1 個端點

#方法路由認證說明
1GET/common/enums共用列舉 + ERROR_CODES

9.14 後台管理模組 (Admin) — 90+ 個端點

認證管理 (4 個)

#方法路由說明
1POST/admin/login管理員登入
2POST/admin/register管理員註冊
3POST/admin/send-verify-code發送驗證碼
4POST/admin/verify-email驗證 Email

個人資料 (4 個)

#方法路由說明
5GET/admin/profile取得個人資料
6PATCH/admin/profile更新個人資料
7POST/admin/google-auth/generate生成 2FA QR Code
8POST/admin/google-auth/verify驗證 2FA

管理員 CRUD (5 個)

#方法路由權限說明
9GET/admin/listadmin:read管理員列表
10POST/admin/createadmin:write新增管理員
11GET/admin/:idadmin:read取得管理員
12PATCH/admin/:idadmin:write更新管理員
13DELETE/admin/:idadmin:write刪除管理員

群組 CRUD (5 個)

#方法路由權限說明
14GET/admin/groups/listadmin-group:read群組列表
15POST/admin/groups/createadmin-group:write新增群組
16GET/admin/groups/:idadmin-group:read取得群組
17PATCH/admin/groups/:idadmin-group:write更新群組
18DELETE/admin/groups/:idadmin-group:write刪除群組

權限 (1 個)

#方法路由說明
19GET/admin/permissions/all取得所有權限列表

操作紀錄 (1 個)

#方法路由權限說明
20GET/admin/logs/listadmin-log:read查詢操作紀錄

財務管理 (16 個)

#方法路由權限說明
21GET/admin/finance/users/listuser:read前台用戶列表
22GET/admin/finance/users/:iduser:read用戶詳情
23PATCH/admin/finance/users/:iduser:write更新用戶
24POST/admin/finance/adjust-balancefinance:write手動調帳
25GET/admin/finance/deposit-review/listdeposit:read存款訂單列表
26POST/admin/finance/deposit-review/:iddeposit:write存款審核
27GET/admin/finance/withdrawals/listwithdrawal:read提款列表
28POST/admin/finance/withdrawals/:id/reviewwithdrawal:write提款審核
29POST/admin/finance/withdrawals/:id/completewithdrawal:write提款完成
30GET/admin/finance/bank-cards/listfinance:read銀行卡列表
31-35CRUD/admin/finance/bank-cards/*finance:write銀行卡管理
36-40CRUD/admin/finance/credit-cards/*finance:write信用卡管理
41-45CRUD/admin/finance/crypto-addresses/*finance:write加密地址管理

風控管理 (10 個)

#方法路由權限說明
46-49CRUD/admin/risk/ip-rules/*risk:read/writeIP 黑白名單
50GET/admin/risk/lookuprisk:readIP/FP 反查
51GET/admin/risk/login-failuresrisk:read登入失敗紀錄
52-55CRUD/admin/risk/game-blacklist/*risk:read/write遊戲黑名單

報表 (10 個)

#方法路由權限說明
56GET/admin/reports/playersreport:read玩家報表
57GET/admin/reports/vip-playersreport:readVIP 玩家報表
58GET/admin/reports/bet-recordsreport:read投注紀錄
59GET/admin/reports/overviewreport:read總覽報表
60GET/admin/reports/profit-lossreport:read損益報表
61GET/admin/reports/gamesreport:read遊戲報表
62GET/admin/reports/promosreport:read活動報表
63GET/admin/reports/player-summaryreport:read玩家摘要
64GET/admin/reports/r2-logsreport:readR2 日誌
65GET/admin/reports/exportreport:readCSV 匯出

活動管理 (8 個)

#方法路由權限說明
66GET/admin/promos/listpromo:read活動列表
67POST/admin/promos/createpromo:write新增活動
68PATCH/admin/promos/:idpromo:write更新活動
69DELETE/admin/promos/:idpromo:write刪除活動
70-73CRUD/admin/promo-tags/*promo-tag:read/write活動標籤管理

R2 檔案操作 (6 個)

#方法路由說明
74GET/admin/r2/list列出檔案
75POST/admin/r2/upload上傳檔案
76DELETE/admin/r2/delete刪除檔案
77POST/admin/r2/move移動檔案
78POST/admin/r2/create-folder建立資料夾
79DELETE/admin/r2/delete-folder刪除資料夾

金流商管理 (9 個)

#方法路由權限說明
80-84CRUD/admin/vendor-groups/*vendor:read/write金流群組管理
85-88CRUD/admin/vendor-channels/*vendor:read/write金流通道管理
89GET/POST/admin/users/:userId/vendor-groupuser:write用戶金流群組分配

第 10 章:資料庫概覽

10.1 資料庫基本設定

項目設定值
資料庫類型MySQL
字元集utf8mb4
時區+08:00 (UTC+8)
ORMTypeORM 0.3.28
自動同步僅開發環境 (synchronize: isDev)
資料表總數49 張
含 siteCode37 張
不含 siteCode12 張

10.2 資料表分類總覽

分類資料表數資料表列表
用戶認證2auth-user, auth-user-login-log
金流3vendor-group, vendor-channel, vendor-group-channel
存提款2deposit-order, withdrawal-order
錢包3bank-card, credit-card, crypto-address
遊戲6game-provider, game-type-config, game-transaction, game-play-log, bet-order, bet-detail
VIP3vip-level, vip-rebate, vip-rebate-log
活動3promo, promo-claim, promo-tag
排行1rank-list
代理7affiliate-commission, affiliate-settlement, affiliate-balance, affiliate-withdrawal, affiliate-click, affiliate-bind-log, affiliate-risk-log
聯盟5alliance-commission-rate, alliance-agent-tier, alliance-vip-milestone, alliance-vip-milestone-log, alliance-referral-code
站內信2notification, notification-read
站點2site-config, site-theme
任務3mission, mission-progress, mission-claim
風控2risk-ip-rule, risk-game-blacklist
後台3admin-user, admin-group, admin-operation-log
儲存1r2-operation-log

10.3 用戶認證 (2 張)

auth-user

項目說明
用途前台用戶帳號
siteCodeY
主要欄位id, siteCode, account, password, email, mobile, nickname, birthday, balance, frozenBalance, vipLevel, totalEffectiveBet, relegationMissCount, vipHold, vendorGroupId, agentCode, level1AgentId, level2AgentId, level3AgentId, google, telegram, googleAuthSecret, googleAuthEnabled, avatar, status, tokenVersion, locale, lastActivityAt, device
唯一約束(siteCode, account), (siteCode, email), (siteCode, mobile), (siteCode, telegram), (siteCode, google), (siteCode, agentCode)

auth-user-login-log

項目說明
用途用戶登入紀錄(含登入成功、失敗、登出)
siteCodeY
主要欄位id, siteCode, userId, action, ip, device, lastUse
索引(userId, lastUse), (ip)

10.4 金流 (3 張)

vendor-group

項目說明
用途金流群組(按幣別/語系分組)
siteCodeY
主要欄位id, siteCode, name, currency, status

vendor-channel

項目說明
用途金流通道(具體的支付方式)
siteCodeY
主要欄位id, siteCode, name, providerCode, paymentMethod, minAmount, maxAmount, fee, status

vendor-group-channel

項目說明
用途金流群組與通道的多對多關聯表
siteCodeN(透過 groupId/channelId 關聯)
主要欄位id, groupId, channelId
唯一約束(groupId, channelId)

10.5 存提款 (2 張)

deposit-order

項目說明
用途存款訂單
siteCodeY
主要欄位id, siteCode, userId, channelId, amount, amountUsd, exchangeRate, paymentMethod, vendorOrderId, status, callbackData
狀態值pending, created, paid, failed, cancelled

withdrawal-order

項目說明
用途提領訂單
siteCodeY
主要欄位id, siteCode, userId, amount, walletType, walletId, status, reviewNote, proofUrl
狀態值pending, approved, rejected, completed

10.6 錢包 (3 張)

bank-card

項目說明
用途用戶綁定的銀行卡
siteCodeY
主要欄位id, siteCode, userId, bankCode, bankName, accountNumber, cardHolder, status

credit-card

項目說明
用途用戶綁定的信用卡
siteCodeY
主要欄位id, siteCode, userId, cardNumber, cardHolder, expiryDate, status

crypto-address

項目說明
用途用戶綁定的加密錢包地址
siteCodeY
主要欄位id, siteCode, userId, network, currency, address, status

10.7 遊戲 (6 張)

game-provider

項目說明
用途遊戲供應商配置
siteCodeY
主要欄位id, siteCode, gameCode, providerCode, name, gameType, coverImage, status, sortOrder
唯一約束(siteCode, gameCode)

game-type-config

項目說明
用途遊戲分類配置
siteCodeY
主要欄位id, siteCode, gameType, name, icon, status, sortOrder
唯一約束(siteCode, gameType)

game-transaction

項目說明
用途遊戲交易記錄(下注/派彩)
siteCodeY
主要欄位id, siteCode, userId, gameCode, productId, transactionType, amount, balanceBefore, balanceAfter

game-play-log

項目說明
用途用戶遊玩紀錄(用於「近期遊玩」功能)
siteCodeY
主要欄位id, siteCode, userId, gameCode, productId, lastPlayedAt
唯一約束(siteCode, userId, gameCode, productId)

bet-order

項目說明
用途投注注單
siteCodeY
主要欄位id, siteCode, userId, gameCode, productId, gameType, betAmount, betEffective, payoutAmount, status
狀態值valid, invalid, cancelled

bet-detail

項目說明
用途注單明細(投注的詳細記錄)
siteCodeY
主要欄位id, siteCode, betOrderId, roundId, betAmount, payoutAmount

10.8 VIP (3 張)

vip-level

項目說明
用途VIP 等級配置(每站獨立)
siteCodeY
主要欄位id, siteCode, level, name(JSON), minChip, relegationChip, upgradeBonus, monthlyBonus, birthdayBonus, vipHold, enabled, sortOrder
唯一約束(siteCode, level)

vip-rebate

項目說明
用途VIP 返水規則(每站 x 每級 x 每遊戲類型)
siteCodeY
主要欄位id, siteCode, level, gameType, rebateRate
唯一約束(siteCode, level, gameType)

vip-rebate-log

項目說明
用途VIP 反水發放紀錄
siteCodeY
主要欄位id, siteCode, userId, level, gameType, effectiveBet, rebateRate, rebateAmount, settleDate

10.9 活動 (3 張)

promo

項目說明
用途優惠活動
siteCodeY
主要欄位id, siteCode, title(JSON), description(JSON), content(JSON), imgPc(JSON), imgMobile(JSON), tagId, conditions(JSON), turnoverMultiplier, reward, startDate, endDate, status

promo-claim

項目說明
用途活動領取記錄
siteCodeY
主要欄位id, siteCode, promoId, userId, rewardAmount, remainingTurnover
唯一約束(siteCode, promoId, userId)

promo-tag

項目說明
用途活動分類標籤
siteCodeY
主要欄位id, siteCode, name(JSON), sortOrder
唯一約束(siteCode, name)

10.10 排行 (1 張)

rank-list

項目說明
用途遊戲排行榜
siteCodeY
主要欄位id, siteCode, userId, gameCode, score, rank

10.11 代理 (7 張)

affiliate-commission

項目說明
用途代理佣金記錄
siteCodeY
主要欄位id, siteCode, agentId, memberId, level, gameType, betAmount, commissionRate, commissionAmount

affiliate-settlement

項目說明
用途佣金結算記錄
siteCodeY
主要欄位id, siteCode, agentId, weekStart, totalCommission, status, reviewNote
唯一約束(siteCode, agentId, weekStart)
狀態值pending, approved, rejected

affiliate-balance

項目說明
用途代理佣金餘額
siteCodeY
主要欄位id, siteCode, userId, balance, totalEarned, totalWithdrawn

affiliate-withdrawal

項目說明
用途代理提款記錄
siteCodeY
主要欄位id, siteCode, agentId, amount, method, status
狀態值pending, approved, rejected, completed

affiliate-click

項目說明
用途推廣連結點擊追蹤
siteCodeY
主要欄位id, siteCode, refCode, ip, userAgent

affiliate-bind-log

項目說明
用途代理綁定/解綁紀錄
siteCodeY
主要欄位id, siteCode, agentId, memberId, action, refCode

affiliate-risk-log

項目說明
用途代理結算風控檢測紀錄
siteCodeY
主要欄位id, siteCode, settlementId, riskType, detail, result

10.12 聯盟 (5 張)

alliance-commission-rate

項目說明
用途聯盟佣金費率配置
siteCodeN(全站共用)
主要欄位id, agentTier, agentLevel, gameType, commissionRate
唯一約束(agentTier, agentLevel, gameType)

alliance-agent-tier

項目說明
用途代理等級配置
siteCodeN(全站共用)
主要欄位id, tierCode, name(JSON), minDownlines, minMonthlyBet
唯一約束(tierCode)

alliance-vip-milestone

項目說明
用途VIP 里程碑獎勵規則
siteCodeN(全站共用)
主要欄位id, vipLevel, rewardAmount
唯一約束(vipLevel)

alliance-vip-milestone-log

項目說明
用途VIP 里程碑獎勵發放紀錄
siteCodeY
主要欄位id, siteCode, agentId, memberId, vipLevel, rewardAmount
唯一約束(siteCode, agentId, memberId, vipLevel)

alliance-referral-code

項目說明
用途聯盟推廣碼
siteCodeY
主要欄位id, siteCode, userId, code, parentAgentCode
唯一約束(siteCode, code)
限制每人最多 10 個推廣碼

10.13 站內信 (2 張)

notification

項目說明
用途站內信/通知
siteCodeY
主要欄位id, siteCode, title(JSON), content(JSON), targetType, targetId, senderId

notification-read

項目說明
用途通知已讀記錄
siteCodeY
主要欄位id, siteCode, userId, notificationId
唯一約束(siteCode, userId, notificationId)

10.14 站點 (2 張)

site-config

項目說明
用途站點基本設定(站點定義表)
siteCodeN(自身就是站點定義)
主要欄位id, siteCode, name(JSON), description(JSON), supportedLocales, activeThemeId, features(JSON), logoSmall, logoBig, favicon, customerServiceConfig(JSON), learnMoreConfig(JSON), mascots(JSON), hostname

site-theme

項目說明
用途站點主題色彩配置
siteCodeN(透過 siteConfigId 關聯)
主要欄位id, siteConfigId, name, primary, accent, surface, text, border

10.15 任務 (3 張)

mission

項目說明
用途任務定義
siteCodeY
主要欄位id, siteCode, category, periodType, tier, name(JSON), description(JSON), target, reward, enabled
唯一約束(siteCode, category, periodType, tier)

mission-progress

項目說明
用途用戶任務進度
siteCodeY
主要欄位id, siteCode, userId, periodType, periodKey, currentValue
唯一約束(siteCode, userId, periodType, periodKey)

mission-claim

項目說明
用途任務獎勵領取記錄
siteCodeY
主要欄位id, siteCode, missionId, userId, periodKey, rewardAmount
唯一約束(siteCode, missionId, userId, periodKey)

10.16 風控 (2 張)

risk-ip-rule

項目說明
用途IP 黑白名單規則
siteCodeY
主要欄位id, siteCode, ip, type, note
type 值blacklist, whitelist

risk-game-blacklist

項目說明
用途遊戲封鎖名單
siteCodeY
主要欄位id, siteCode, userId, gameType, productId, note
封鎖範圍gameType=null+productId=null (全封鎖)、gameType+productId=null (類型封鎖)、gameType+productId (特定遊戲)

10.17 後台 (3 張)

admin-user

項目說明
用途後台管理員帳號
siteCodeN(全站共用)
主要欄位id, email, password, name, groupId, status, tokenVersion, googleAuthSecret, googleAuthEnabled

admin-group

項目說明
用途管理員權限群組
siteCodeN(全站共用)
主要欄位id, name, groupType, permissions(JSON)
groupType 值root, super_admin, general_admin, custom

admin-operation-log

項目說明
用途管理員操作紀錄
siteCodeN(全站共用)
主要欄位id, adminId, action, target, detail, ip, userAgent

10.18 儲存 (1 張)

r2-operation-log

項目說明
用途Cloudflare R2 檔案操作紀錄
siteCodeN(全站共用)
主要欄位id, adminId, action, filePath, fileSize, mimeType, ip, userAgent

第 11 章:錯誤碼體系

11.1 統一回應格式

所有 API 回應遵循統一的 JSON 格式:

成功回應

json
{
  "code": 200,
  "message": "ok",
  "result": { ... },
  "timestamp": "2026-03-01T12:00:00.000Z",
  "path": "/api/auth/login"
}

業務錯誤回應

json
{
  "code": 2001,
  "message": "帳號或密碼錯誤",
  "timestamp": "2026-03-01T12:00:00.000Z",
  "path": "/api/auth/login"
}
  • HTTP Status 一律為 200(僅 401 Unauthorized 例外)
  • code 為 200 表示成功,非 200 為業務錯誤
  • message 為當前語系的錯誤訊息(由後端 i18n 翻譯)

未授權回應

json
{
  "code": 401,
  "message": "Unauthorized"
}

11.2 錯誤碼組織方式

後端 i18n JSON 結構

錯誤碼定義在後端 i18n JSON 檔案中,結構如下:

json
// src/i18n/zh-TW/authError.json
{
  "register": {
    "2001": "帳號已存在",
    "2002": "推廣碼不存在",
    "2003": "Email 已存在"
  },
  "login": {
    "2001": "帳號或密碼錯誤",
    "2002": "帳號已停用"
  }
}

i18n key 格式:{featureFile}.{section}.{code} 例如:authError.register.2001 → "帳號已存在"

後端拋出錯誤方式

typescript
throw new HttpException(
  { code: 2001, message: this.i18n.t('authError.register.2001') },
  HttpStatus.BAD_REQUEST
);

規則:

  • 錯誤碼從 2001 起遞增
  • 各功能模組獨立編號
  • 一律透過 this.i18n.t() 翻譯,禁止硬寫錯誤文字
  • HTTP Status 被 AllExceptionsFilter 正規化為 200

11.3 前端錯誤碼查表機制

ERROR_CODES API

前端啟動時呼叫 GET /common/enums,取得完整的錯誤碼對照表。

後端 CommonService.onModuleInit() 會遞迴掃描 i18n/zh-TW/*.json,找出所有數字 key,建構 code map。呼叫 getEnums() 時翻譯為當前語系回傳。

I18N_PATH_MAP

錯誤碼以 API 路徑為索引,透過 I18N_PATH_MAP 映射:

i18n PrefixAPI Path
authError.register/api/auth/register
authError.login/api/auth/login
walletError.bankCard.add/api/wallet/bank-card/add
vendorError.wantong/api/vendor/wantong/add-atm, /api/vendor/wantong/add-card
promoError/api/promo/:id, /api/admin/promos/create, /api/admin/promos/:id
vipError.levels/api/vip/levels, /api/vip/levels/:id
gameError.launch/api/game/launch
affiliateError.trackClick/api/affiliate/track-click
adminError.login/api/admin/login
depositError/api/deposit
withdrawalError/api/withdrawal/request
inboxError/api/inbox/*
missionError/api/mission/*
siteConfigError/api/site-config/*

共 32+ 條映射,支援萬用 :id 參數匹配。

前端三層錯誤處理

前端 API 呼叫時的錯誤處理層級:

  1. 第一層:Store 查表

    • errorCodes[path][code](來自 /common/enums,支援 :id 萬用)
    • 自動匹配 API 路徑並查找對應錯誤訊息
  2. 第二層:呼叫端覆寫

    • API 呼叫時可傳入 errorMessage: string | Record<code, msg>
    • 覆寫特定錯誤碼的顯示訊息
  3. 第三層:自動 Toast

    • toast.error(message)
    • 可用 errorToast: false 停用自動 Toast

11.4 錯誤碼分類

認證相關 (authError)

SectionCode說明
register2001帳號已存在
register2002推廣碼不存在
register2003Email 已存在
login2001帳號或密碼錯誤
login2002帳號已停用
login2003需要 2FA 驗證

後台管理 (adminError)

SectionCode說明
login2001Email 或密碼錯誤
login2002帳號已停用
register2001Email 已存在
register2002驗證碼錯誤

遊戲相關 (gameError)

SectionCode說明
launch5010用戶被風控封鎖

錢包相關 (walletError)

SectionCode說明
bankCard.add2001銀行卡已存在
creditCard.add2001信用卡已存在
cryptoAddress.add2001地址已存在

存款相關 (depositError)

SectionCode說明
deposit2001金流通道不存在
deposit2002金額超出範圍

提領相關 (withdrawalError)

SectionCode說明
request2001餘額不足
request2002錢包不存在

第 12 章:附錄

12.1 術語表

術語 (中文)術語 (English)說明
白牌White-Label同一套系統可部署為不同品牌
站點Site一個獨立的娛樂城品牌
站點代碼siteCode站點唯一識別碼 (如 C9)
前台Frontend (EC)面向終端用戶的娛樂平台
後台Admin Panel (IMS)內部管理系統
多站點Multi-Site / Multi-Tenant一套系統支援多個站點
遊戲商Game Provider遊戲內容供應商
遊戲分類Game Type Config遊戲類型設定
金流商Vendor金流服務提供商
金流通道Vendor Channel具體的支付方式
金流群組Vendor Group金流通道的分組(按幣別)
存款Deposit入金操作
提款 / 提領Withdrawal出金操作
凍結金額Frozen Balance提款申請中被凍結的金額
返水RebateVIP 玩家的投注回饋
保級Retention / RelegationVIP 等級維持機制
打碼量Turnover活動獎勵的投注要求
有效投注Effective Bet計入統計的有效投注金額
佣金Commission代理推廣的獎勵金額
結算Settlement佣金的定期結算
週結Weekly Settlement每週結算一次佣金
日結Daily Settlement每日結算一次佣金
代理碼Agent Code代理的唯一識別碼
推廣碼Referral Code代理的推廣連結代碼
上線Upline代理推廣的上級
下線Downline代理推廣的下級
三層代理3-level Affiliate最多 3 層的代理結構
聯盟Alliance代理推廣聯盟體系
代理等級Agent Tier代理的等級分類
VIP 里程碑VIP Milestone下線達 VIP 等級時的額外獎勵
站內信Notification / Inbox系統內部通知訊息
活動Promo / Promotion優惠活動
活動標籤Promo Tag活動的分類標籤
風控Risk Control風險控制管理
黑名單Blacklist封鎖名單
白名單Whitelist允許名單
裝置指紋Device Fingerprint裝置唯一識別 (FingerprintJS)
S2S 回調Server-to-Server Callback伺服器間的通知回調
轉帳錢包Transfer Wallet遊戲使用的轉帳錢包模式
RBACRole-Based Access Control基於角色的存取控制
2FATwo-Factor Authentication二步驟驗證
TOTPTime-based One-Time Password基於時間的一次性密碼
JWTJSON Web TokenJSON 網路令牌
OAuthOpen Authorization開放授權標準
ORMObject-Relational Mapping物件關聯映射
DTOData Transfer Object資料傳輸物件
CRUDCreate, Read, Update, Delete增刪改查
R2Cloudflare R2Cloudflare 物件儲存服務
i18nInternationalization國際化(多語系)
ICUInternational Components for UnicodeUnicode 國際化元件
OKLCHOK Lightness Chroma Hue色彩空間模型
CronCron Expression排程時間表達式
seedSeed Data種子資料(測試用初始資料)

12.2 縮寫對照表

縮寫全稱中文
ECEntertainment City娛樂城
IMSInternal Management System內部管理系統
BEBackend後端
PMProduct/Project Manager產品/專案經理
APIApplication Programming Interface應用程式介面
UIUser Interface使用者介面
UXUser Experience使用者體驗
DBDatabase資料庫
KYCKnow Your Customer認識你的客戶
VIPVery Important Person貴賓
ATMAutomated Teller Machine自動櫃員機
USDTTether (USD Tether)泰達幣
TRC-20TRON Token Standard波場代幣標準
ERC-20Ethereum Token Standard以太坊代幣標準
TWDNew Taiwan Dollar新台幣
USDUnited States Dollar美元
CNYChinese Yuan人民幣
THBThai Baht泰銖
VNDVietnamese Dong越南盾
QRQuick Response快速回應碼
FAQFrequently Asked Questions常見問題
CSSCascading Style Sheets層疊樣式表
HTMLHyperText Markup Language超文本標記語言
JSONJavaScript Object NotationJavaScript 物件表示法
CSVComma-Separated Values逗號分隔值
TTLTime To Live存活時間
HMACHash-based Message Authentication Code雜湊訊息認證碼
DESData Encryption Standard資料加密標準
SHASecure Hash Algorithm安全雜湊演算法
IPInternet Protocol網際網路協定
FPFingerprint指紋
UAUser Agent使用者代理

12.3 遊戲類型對照表

遊戲類型 ID英文名稱中文名稱說明
1SPORTS體育體育賽事投注
2SLOT老虎機電子老虎機遊戲
3LIVE真人真人荷官遊戲
4LOTTERY彩票彩票類遊戲
5CHESS棋牌棋牌類遊戲
8ESPORTS電競電子競技投注
9CRYPTO加密加密貨幣相關遊戲
10FISH捕魚捕魚類遊戲

打碼量權重 (TURNOVER_WEIGHT):

遊戲類型權重
Sports (1)1.0
Slot (2)1.0
Live (3)1.0
Lottery (4)1.0
Chess (5)1.0
Esports (8)1.0
Crypto (9)0.5
Fish (10)0.5

12.4 權限模組對照表

模組代碼模組名稱說明read 權限write 權限
admin管理員管理管理後台管理員帳號admin:readadmin:write
admin-group群組管理管理權限群組admin-group:readadmin-group:write
admin-log操作紀錄查看管理員操作日誌admin-log:readadmin-log:write
user用戶管理管理前台用戶user:readuser:write
deposit存款管理存款訂單審核deposit:readdeposit:write
withdrawal提款管理提款訂單審核withdrawal:readwithdrawal:write
promo活動管理優惠活動 CRUDpromo:readpromo:write
promo-tag活動標籤活動標籤 CRUDpromo-tag:readpromo-tag:write
affiliate代理管理代理推廣管理affiliate:readaffiliate:write
vipVIP 管理VIP 等級/返水管理vip:readvip:write
game遊戲管理遊戲商/分類管理game:readgame:write
risk風控管理風控規則管理risk:readrisk:write
report報表各類報表查看report:readreport:write
vendor金流商管理金流群組/通道管理vendor:readvendor:write
finance財務管理錢包審核/調帳finance:readfinance:write
site-config站點設定站點基本設定管理site-config:readsite-config:write

權限總數:16 模組 x 2 操作 (read/write) = 32 個權限 key

12.5 群組類型對照表

群組類型 (groupType)名稱權限範圍說明
root最高管理員全部權限略過所有權限檢查,擁有最高權限
super_admin超級管理員全部(除 site-config)擁有除站點設定外的所有權限
general_admin一般管理員僅讀取所有模組的 read 權限,無 write 權限
custom自訂群組依 permissions 設定根據 permissions JSON 陣列中的權限 key 決定

12.6 幣別對照表

幣別代碼名稱語系映射說明
TWD新台幣zh-TW台灣法幣
USD美元en-US系統內部統一幣別
CNY人民幣zh-CN中國法幣
THB泰銖th-TH泰國法幣
VND越南盾vi-VN越南法幣

12.7 訂單狀態對照表

存款訂單 (deposit-order)

狀態說明
pending待處理(訂單已建立,等待付款)
created已建立(金流商已回應)
paid已付款(金流商回調確認)
failed失敗
cancelled已取消

提款訂單 (withdrawal-order)

狀態說明
pending待審核
approved已核准(等待匯款)
rejected已拒絕(凍結金額退回)
completed已完成(匯款完成)

投注注單 (bet-order)

狀態說明
valid有效投注
invalid無效投注
cancelled已取消

代理結算 (affiliate-settlement)

狀態說明
pending待審核
approved已核准(佣金入帳)
rejected已拒絕

代理提款 (affiliate-withdrawal)

狀態說明
pending待審核
approved已核准
rejected已拒絕
completed已完成

12.8 登入動作類型

動作說明
LOGIN登入成功
LOGOUT登出
LOGIN_FAIL登入失敗
DEL移除紀錄
UNCAPTURED未補獲

12.9 任務類別與週期

任務類別 (category)

類別說明
daily_deposit每日存款任務
weekly_bet每週投注任務
monthly_challenge每月綜合挑戰

任務週期 (periodType)

週期說明periodKey 格式
daily每日YYYY-MM-DD
weekly每週YYYY-WW
monthly每月YYYY-MM

12.10 客服管道類型

管道代碼名稱說明
lineLINELINE 即時通訊
telegramTelegramTelegram 通訊
wechat微信微信通訊
facebookFacebookFacebook Messenger
instagramInstagramInstagram DM
twitterTwitter/XTwitter/X 私訊
discordDiscordDiscord 伺服器
custom自訂自訂客服管道

12.11 代理等級

等級代碼名稱說明
bronze銅牌基礎代理等級
silver銀牌中級代理等級
gold金牌高級代理等級
platinum白金最高代理等級

12.12 風控封鎖範圍

遊戲黑名單封鎖範圍

gameTypeproductId封鎖範圍
nullnull封鎖用戶所有遊戲
'slot'null封鎖用戶該類型所有遊戲
'slot'123封鎖用戶特定遊戲

IP 規則類型

類型說明
blacklist黑名單(封鎖該 IP)
whitelist白名單(允許該 IP)

12.13 資料庫唯一約束完整清單

以下為所有資料表中的複合唯一約束 (Unique Constraints),這些約束確保資料的一致性與正確性。

#Entity (資料表)唯一欄位組合業務說明
1auth-user(siteCode, account)同站帳號唯一
2auth-user(siteCode, email)同站 Email 唯一
3auth-user(siteCode, mobile)同站手機唯一
4auth-user(siteCode, telegram)同站 Telegram 唯一
5auth-user(siteCode, google)同站 Google 唯一
6auth-user(siteCode, agentCode)同站代理碼唯一
7vip-level(siteCode, level)同站 VIP 等級唯一
8vip-rebate(siteCode, level, gameType)同站等級+遊戲類型唯一
9game-provider(siteCode, gameCode)同站遊戲碼唯一
10game-type-config(siteCode, gameType)同站遊戲類型唯一
11game-play-log(siteCode, userId, gameCode, productId)同站用戶+遊戲唯一
12promo-claim(siteCode, promoId, userId)同站活動+用戶唯一
13promo-tag(siteCode, name)同站標籤名唯一
14notification-read(siteCode, userId, notificationId)同站用戶+通知唯一
15affiliate-settlement(siteCode, agentId, weekStart)同站代理+週起始唯一
16alliance-commission-rate(agentTier, agentLevel, gameType)等級+層級+遊戲類型唯一
17alliance-agent-tier(tierCode)等級代碼唯一
18alliance-vip-milestone(vipLevel)VIP 等級唯一
19alliance-vip-milestone-log(siteCode, agentId, memberId, vipLevel)同站代理+會員+VIP 唯一
20alliance-referral-code(siteCode, code)同站推廣碼唯一
21vendor-group-channel(groupId, channelId)群組+通道唯一
22mission(siteCode, category, periodType, tier)同站類別+週期+層級唯一
23mission-progress(siteCode, userId, periodType, periodKey)同站用戶+週期唯一
24mission-claim(siteCode, missionId, userId, periodKey)同站任務+用戶+週期唯一

12.14 投注後連鎖觸發詳細說明

每筆遊戲投注結算完成後,系統會自動觸發以下連鎖操作。這些操作是同步執行的,確保資料一致性。

觸發條件

當遊戲供應商透過 S2S 回調通知後端一筆投注已結算時:

連鎖操作一:VIP 等級重算

VipService.recalculateUserVip(userId)
  |
  v
1. 查詢用戶所有有效投注的累計金額
   SELECT COALESCE(SUM(betEffective), 0) FROM bet-order WHERE userId = ? AND status = 'valid'
  |
  v
2. 查詢用戶當前 VIP 等級
  |
  v
3. 查詢所有比當前等級高的 VIP 等級
   按 minChip 排序
  |
  v
4. 逐一比較:totalEffectiveBet >= level.minChip ?
   找到最高可達到的等級
  |
  v
5. 若新等級 > 當前等級:
   - 更新 auth-user.vipLevel
   - 觸發 VIP 里程碑檢查(通知代理上線)

重要規則:

  • 只升不降:投注觸發的等級變動永遠是向上的
  • 降級只發生在月度保級檢查(Cron Job)
  • 每站 VIP 等級獨立配置

連鎖操作二:活動打碼量更新

PromoService.updatePromoTurnover(userId, betAmount, gameType)
  |
  v
1. 查詢用戶所有未完成打碼量的活動領取記錄 (promo-claim)
   WHERE remainingTurnover > 0
  |
  v
2. 計算打碼量扣減:
   weightedBet = betAmount * TURNOVER_WEIGHT[gameType]
   (CRYPTO 和 FISH 類型權重為 0.5,其他為 1.0)
  |
  v
3. 更新 remainingTurnover:
   remainingTurnover = MAX(0, remainingTurnover - weightedBet)
  |
  v
4. 當 remainingTurnover = 0 時,標記打碼量已完成

連鎖操作三:任務投注進度更新

MissionService.updateBetProgress(userId, betAmount, gameType)
  |
  v
1. 查詢用戶當前週期的投注任務進度 (mission-progress)
   WHERE periodType = 'weekly' AND periodKey = 當前週
  |
  v
2. 更新 currentValue += betAmount
  |
  v
3. 用戶可在任務頁面查看進度並領取獎勵

非同步操作:遊戲遊玩記錄

GameService.recordGamePlay(userId, gameCode, productId)
  → UPSERT game-play-log (更新 lastPlayedAt)
  → .catch(() => {})  // 不阻塞主流程

12.15 金流群組自動分配規則

用戶註冊時,系統根據用戶的語系自動分配金流群組。分配對照如下:

用戶語系對應幣別分配的金流群組說明
zh-TWTWDTWD 群組台灣用戶使用新台幣通道
en-USUSDUSD 群組英語用戶使用美元通道
zh-CNCNYCNY 群組中國用戶使用人民幣通道
th-THTHBTHB 群組泰國用戶使用泰銖通道
vi-VNVNDVND 群組越南用戶使用越南盾通道

分配邏輯位於 AuthService.register() 中,透過 LOCALE_CURRENCY_MAP 查找對應幣別,再查找該幣別的金流群組。

12.16 Cache Key 命名慣例

後端使用 Redis 快取,key 命名遵循以下格式:

cache:{module}:{type}:{id}
Cache KeyTTL說明
cache:auth📺60s用戶 token version(驗證 JWT 時使用)
cache:admin📺60s管理員 token version
cache:admin-group:perms:60s群組權限列表(RBAC 檢查時使用)
cache:vip:levels1 小時VIP 等級列表
cache:common:enums:1 小時錯誤碼查詢表(依語系快取)
cache:online:60s用戶在線狀態(節流 lastActivityAt 更新)
cache:live-sports:matches30 分鐘即時體育賽事資料

12.17 前台 Composable 完整清單

Composable用途說明
useApiAPI 統一入口Facade pattern,合併所有 API 模組
useHttpHTTP 請求封裝Axios 攔截器、錯誤處理、site-name 注入
useAuth認證狀態管理登入/登出/用戶資訊
useConfig站點配置domainConfig 域名映射
useDevice裝置偵測行動版/桌面版判斷
useFingerprint裝置指紋FingerprintJS v5 整合
useGame遊戲邏輯遊戲啟動、遊戲列表
useLayout佈局管理佈局切換 (a1/a2)
useTheme主題管理主題色切換、CSS 變數注入
useExchangeRate匯率即時匯率查詢
useCash金額格式化USD 金額顯示處理
usePaymentChannels支付通道金流通道選擇邏輯
useRefCode推廣碼推廣碼解析與綁定
useAffiliate代理功能代理推廣相關邏輯
useAgentTour代理導覽新手代理導覽流程
useInbox站內信站內信讀取與管理
useKycKYC 驗證身份驗證流程
usePreventZoom防止縮放行動版防止手勢縮放
useR2UrlR2 URLCloudflare R2 圖片 URL 產生
useApiTypesAPI 型別API 回應型別定義

API Composables (12 個)

Composable模組主要方法
useAuthApi認證register, login, googleLogin, telegramLogin, getUserDetail, updateProfile, setPassword, updatePassword, uploadAvatar, sendEmailVerify, verifyEmail
useGameApi遊戲getProviders, getTypeConfigs, launchGame, demoGame, getRecentGames
useDepositApi存款createDeposit, getDepositOrders, getExchangeRate
useWalletApi錢包addBankCard, getBankCards, deleteBankCard, addCreditCard, getCreditCards, deleteCreditCard, addCryptoAddress, getCryptoAddresses, deleteCryptoAddress
useWithdrawalApi提領requestWithdrawal, getWithdrawalOrders
useVipApiVIPgetLevels, getUserStatus, getMyRebates, getRebates
usePromoApi活動getPromoList, getPromoDetail, claimPromo, getPromoTags
useAffiliateApi代理getDashboard, getCommissions, getSettlements, getDownlines, getBalance, requestWithdrawal, getWithdrawals, getReferralCodes, createReferralCode, deleteReferralCode, applyAgent, getAllianceInfo, getTierInfo, getVipMilestones
useInboxApi站內信getNotifications, getNotification, markAsRead, deleteNotification, getUnreadCount
useMissionApi任務getMissionList, getMissionProgress, claimMission
useSiteConfigApi站點設定getPublicConfig, getTheme

12.18 後台 API Hook 方法清單

useAdminApi

方法說明
login管理員登入
register管理員註冊
getAdminList管理員列表
createAdmin新增管理員
getAdmin取得管理員
updateAdmin更新管理員
deleteAdmin刪除管理員
getGroupList群組列表
createGroup新增群組
getGroup取得群組
updateGroup更新群組
deleteGroup刪除群組
getAllPermissions取得所有權限
getOperationLogs查詢操作紀錄
getR2FilesR2 檔案列表
uploadR2File上傳 R2 檔案
deleteR2File刪除 R2 檔案
moveR2File移動 R2 檔案
createR2Folder建立 R2 資料夾
deleteR2Folder刪除 R2 資料夾
getR2LogsR2 操作日誌

useFinanceApi

方法說明
getUserList前台用戶列表
getUserDetail用戶詳情
updateUser更新用戶
adjustBalance手動調帳
getDepositReviewList存款訂單列表
reviewDeposit存款審核
getWithdrawalList提款列表
reviewWithdrawal提款審核
completeWithdrawal提款完成
uploadWithdrawalProof上傳匯款憑證
getBankCardList銀行卡列表
reviewBankCard銀行卡審核
getCreditCardList信用卡列表
reviewCreditCard信用卡審核
getCryptoAddressList加密地址列表
reviewCryptoAddress加密地址審核
assignVendorGroup用戶金流群組分配

useContentApi

方法說明
getPromoList活動列表
createPromo新增活動
updatePromo更新活動
deletePromo刪除活動
getPromoTagList活動標籤列表
createPromoTag新增活動標籤
updatePromoTag更新活動標籤
deletePromoTag刪除活動標籤
getSiteConfigs站點列表
createSiteConfig新增站點
updateSiteConfig更新站點
deleteSiteConfig刪除站點
getSiteThemes主題列表
createSiteTheme新增主題
updateSiteTheme更新主題
deleteSiteTheme刪除主題
uploadDomainAsset上傳域名素材
uploadCustomerServiceIcon上傳客服圖示
updateMascots更新吉祥物
getCustomerService取得客服設定
sendNotification發送站內信
getNotificationSettings通知設定
getIpRulesIP 規則列表
createIpRule新增 IP 規則
updateIpRule更新 IP 規則
deleteIpRule刪除 IP 規則
lookupRiskIP/FP 查詢
getLoginFailures登入失敗紀錄
getGameBlacklist遊戲黑名單列表
createGameBlacklist新增遊戲黑名單
updateGameBlacklist更新遊戲黑名單
deleteGameBlacklist刪除遊戲黑名單
getReportPlayers玩家報表
getReportVipPlayersVIP 玩家報表
getReportBetRecords投注紀錄報表
getReportOverview總覽報表
getReportProfitLoss損益報表
getReportGames遊戲報表
getReportPromos活動報表
getReportPlayerSummary玩家摘要報表
exportReport匯出報表 (CSV)

useGameApi (後台)

方法說明
getGameProviders遊戲商列表
createGameProvider新增遊戲商
updateGameProvider更新遊戲商
deleteGameProvider刪除遊戲商
getGameTypeConfigs遊戲分類列表
createGameTypeConfig新增遊戲分類
updateGameTypeConfig更新遊戲分類
deleteGameTypeConfig刪除遊戲分類
previewGameTemplate預覽遊戲模板
loadGameTemplate帶入遊戲模板
copyGameSiteData跨站複製遊戲資料

useVipApi (後台)

方法說明
getVipLevelsVIP 等級列表
createVipLevel新增 VIP 等級
updateVipLevel更新 VIP 等級
deleteVipLevel刪除 VIP 等級
bulkUpsertRebates批量更新返水規則
copyVipSiteData跨站複製 VIP 資料
previewVipTemplate預覽 VIP 模板
loadVipTemplate帶入 VIP 模板

useAffiliateApi (後台)

方法說明
getAgents代理列表
createAgent新增代理
getSettlements結算列表
reviewSettlement結算審核
getSettlementRiskLogs結算風控紀錄
getAffWithdrawals代理提款列表
reviewAffWithdrawal代理提款審核
completeAffWithdrawal代理提款完成
adminBind手動綁定
getBindLogs綁定紀錄
getCommissionRates佣金費率列表
upsertCommissionRates更新佣金費率
deleteCommissionRates刪除佣金費率
getVipMilestonesVIP 里程碑列表
upsertVipMilestones更新 VIP 里程碑
deleteVipMilestones刪除 VIP 里程碑
getAgentTiers代理等級列表
upsertAgentTiers更新代理等級
deleteAgentTiers刪除代理等級
previewAffTemplate預覽代理模板
loadAffTemplate帶入代理模板
setAgentTier設定代理等級
triggerSettlement觸發週結
triggerDailySettlement觸發日結

12.19 Seed 資料腳本清單

後端提供 19+ 個 seed 腳本用於建立測試資料:

#腳本名稱用途執行方式
1seed-all.ts全資料表假資料(主入口)npx ts-node scripts/seed-all.ts
2seed-site-config.ts站點設定種子資料由 seed-all 呼叫
3seed-vendor.ts金流群組/通道種子資料由 seed-all 呼叫
4seed-deposit.ts存款訂單種子資料由 seed-all 呼叫
5seed-deposit-order.ts存款訂單(獨立版本)獨立執行
6seed-vip.tsVIP 等級/反水種子資料由 seed-all 呼叫
7seed-bet-record.ts投注紀錄種子資料由 seed-all 呼叫
8seed-ranking.ts排行榜種子資料由 seed-all 呼叫
9seed-ranking-users.ts排行榜用戶種子資料由 seed-all 呼叫
10seed-inbox.ts站內信種子資料由 seed-all 呼叫
11seed-mission.ts任務系統種子資料由 seed-all 呼叫
12seed-withdrawal.ts提領訂單種子資料由 seed-all 呼叫
13seed-learn-more.ts了解更多 FAQ 種子資料由 seed-all 呼叫
14seed-layout-defaults.ts前台佈局預設配置由 seed-all 呼叫
15seed-agent-promo.ts代理活動種子資料由 seed-all 呼叫
16assign-all-channels.ts分配所有金流通道獨立執行
17clear-deposit.ts清除存款資料獨立執行
18generate-promo-images.ts活動橫幅圖片生成 + R2 上傳獨立執行
19generate-mascot-avatars.ts吉祥物頭像生成 + R2 上傳獨立執行

seed-all.ts 執行後會建立:

  • 5 個站點配置
  • 每站 30 個測試用戶
  • 完整的金流群組與通道
  • VIP 等級與返水規則
  • 測試用的投注紀錄、存款/提領訂單
  • 站內信、任務、活動等資料

12.20 環境變數清單

必要環境變數

變數名稱說明範例值
DB_HOST資料庫主機localhost
DB_PORT資料庫端口3306
DB_USER資料庫使用者root
DB_PASSWORD資料庫密碼password
DB_DATABASE資料庫名稱c9
REDIS_URLRedis 連線 URLredis://localhost:6379
JWT_SECRET前台 JWT 密鑰your-jwt-secret
SITE_CODE預設站點代碼C9
R2_BUCKET_NAMER2 儲存桶名稱c9-storage
R2_ENDPOINTR2 API 端點https://xxxx.r2.cloudflarestorage.com
R2_ACCESS_KEY_IDR2 存取金鑰 IDyour-access-key
R2_SECRET_ACCESS_KEYR2 存取密鑰your-secret-key
R2_PUBLIC_URLR2 公開 URLhttps://cdn.example.com

應用程式變數

變數名稱說明預設值
PORT伺服器端口8080
NODE_ENV執行環境development
APP_NAME應用名稱(2FA issuer 用)C9
API_DOMAINAPI 域名(金流回調用)http://localhost:8080
FRONTEND_URL前台 URL(代理分享連結用)http://localhost:3000
TZ時區Asia/Seoul

Admin 變數

變數名稱說明預設值
ADMIN_JWT_SECRET後台 JWT 密鑰fallback JWT_SECRET
ADMIN_DEFAULT_PASSWORD預設管理員密碼root
ADMIN_DEFAULT_EMAIL預設管理員 Emailroot
ADMIN_DEFAULT_NAME預設管理員名稱Root

OAuth 變數 (選填)

變數名稱說明
GOOGLE_CLIENT_IDGoogle OAuth Client ID
GOOGLE_CLIENT_SECRETGoogle OAuth Client Secret
GOOGLE_REDIRECT_URIGoogle OAuth Redirect URI
TELEGRAM_BOT_TOKENTelegram Bot Token
TELEGRAM_BOT_USERNAMETelegram Bot Username

服務提供商變數 (選填)

變數名稱說明
RESEND_API_KEYResend (Email) API Key
RESEND_FROMResend 寄件地址
TWILIO_ACCOUNT_SIDTwilio Account SID
TWILIO_AUTH_TOKENTwilio Auth Token
TWILIO_VERIFY_SERVICE_SIDTwilio Verify Service SID

遊戲商變數 (選填)

變數名稱說明
BS_API_URLBetSolutions API URL
BS_AUTH_URLBetSolutions Auth URL
BS_MERCHANT_IDBetSolutions Merchant ID
BS_PRIVATE_KEYBetSolutions Private Key
RSG_API_URLRSG API URL
RSG_CLIENT_IDRSG Client ID
RSG_CLIENT_SECRETRSG Client Secret
RSG_DES_KEYRSG DES 加密金鑰
RSG_DES_IVRSG DES 初始向量
RSG_SYSTEM_CODERSG System Code
RSG_WEB_IDRSG Web ID

其他變數 (選填)

變數名稱說明
LIVE_SPORTS_API_KEYAPI-Football 即時賽事 API Key

12.21 後台側邊欄導航結構

後台側邊欄包含 14+ 個導航群組,50+ 個導航項目。每個項目都有對應的 RBAC 權限檢查:

群組項目路由所需權限
儀表板儀表板/dashboard(任何認證用戶)
系統管理管理員管理/system/adminsadmin:read
群組管理/system/groupsadmin-group:read
操作紀錄/system/logsadmin-log:read
站點設定/system/site-configsite-config:read
客服配置/system/site-customer-servicesite-config:read
域名設置/system/site-domainssite-config:read
遊戲商配置/system/site-game-providerssite-config:read
三方登入/system/site-oauthsite-config:read
服務商配置/system/site-service-providerssite-config:read
雲端儲存/system/cloud-storageadmin:read
雲端儲存日誌/system/cloud-storage-logsadmin:read
前台佈局底部導航列/system/layout-bottom-barsite-config:read
頁尾/system/layout-footersite-config:read
了解更多/system/layout-learn-moresite-config:read
玩家管理全部玩家/players/alluser:read
新註冊/players/new-registrationsuser:read
線上玩家/players/onlineuser:read
登入失敗/players/login-failuresrisk:read
玩家標籤/players/tagsuser:read
遊戲重新註冊/players/game-reregistrationgame:write
活動管理優惠活動/activity/promospromo:read
活動標籤/activity/tagspromo-tag:read
郵件站內信/mail/inboxadmin:read
郵件設定/mail/settingsadmin:read
財務管理人工調帳/finance/adjust-balancefinance:write
存款設置/finance/deposit-settingsvendor:read
存款審核/finance/deposit-reviewdeposit:read
提款管理/finance/withdrawalswithdrawal:read
銀行卡/finance/bank-cardsfinance:read
信用卡/finance/credit-cardsfinance:read
加密錢包/finance/crypto-addressesfinance:read
遊戲管理遊戲供應商/game/providersgame:read
遊戲類型/game/type-configsgame:read
VIP 管理VIP 等級/vip/levelsvip:read
返水設定/vip/rebatesvip:read
VIP 玩家/vip/playersvip:read
VIP 里程碑/vip/milestonesvip:read
報表總覽/reports/overviewreport:read
玩家報表/reports/playersreport:read
玩家摘要/reports/player-summaryreport:read
遊戲報表/reports/gamesreport:read
投注紀錄/reports/bet-recordsreport:read
損益報表/reports/profit-lossreport:read
活動報表/reports/promosreport:read
風控管理IP 規則/risk-control/ip-rulesrisk:read
IP/FP 查詢/risk-control/ip-checkrisk:read
遊戲黑名單/risk-control/game-blacklistrisk:read
代理中心代理列表/affiliate/agentsaffiliate:read
佣金費率/affiliate/commission-ratesaffiliate:read
佣金結算/affiliate/settlementsaffiliate:read
代理提款/affiliate/aff-withdrawalsaffiliate:read
綁定紀錄/affiliate/bind-logsaffiliate:read
代理等級/affiliate/agent-tiersaffiliate:read
VIP 里程碑/affiliate/vip-milestonesaffiliate:read
代理導覽/affiliate/agent-touraffiliate:read

12.22 前台 Store 結構

Store用途持久化主要狀態
appStore全域應用狀態-siteConfig, theme, locale, isLoading
userStore用戶狀態-user, token, isLoggedIn, balance
gameStore遊戲狀態-providers, typeConfigs, currentGame, recentGames
promoStore活動狀態-promos, tags, currentPromo

12.23 後台 Store 結構

Store用途持久化主要狀態
siteFilterStoreHeader 站點選擇sessionStorageselectedSiteCode, sites
enumStore後端枚舉快取-errorCodes, gameTypes
uiStoreUI 狀態-sidebarExpanded, currentTheme

12.24 專案啟動指令

一鍵啟動

指令說明
yarn dev同時啟動三個專案(concurrently)
yarn dev:ec只啟動前台 (http://localhost:3010)
yarn dev:ims只啟動後台 (http://localhost:3011)
yarn dev:be只啟動後端 (http://localhost:8080/api)

一鍵 Commit

指令說明
yarn commit統一 commit 三個專案(互動式 git-cz)
yarn push依序 commit + push 三個專案
yarn push:all只推送未 push 的 commit
yarn push:ec只推送 c9-ec
yarn push:ims只推送 c9-ims
yarn push:be只推送 c9-be

首次安裝

# 根目錄
cd c9 && yarn install

# 各子專案
cd c9-ec && yarn install
cd c9-ims && pnpm install
cd c9-be && yarn install

各子專案指令

c9-ec (前台)

指令說明
yarn dev開發模式
yarn build正式建置
yarn preview預覽正式版
yarn test單元測試 (Vitest)
yarn test:unit只跑單元測試
yarn test:nuxt只跑元件測試
yarn test:e2eE2E 測試 (Playwright)
yarn lint程式碼檢查
yarn format格式化

c9-ims (後台)

指令說明
yarn dev:a1開發模式 a1 站點 (Turbopack)
yarn build:a1建置 a1 站點
yarn start:a1啟動正式版
yarn typecheckTypeScript 類型檢查
yarn lint程式碼檢查
yarn format格式化

c9-be (後端)

指令說明
yarn dev開發模式
yarn build正式建置
yarn start:prod正式啟動
yarn test單元測試 (Jest)
yarn test:e2eE2E 測試
yarn lint程式碼檢查
yarn format格式化 (Prettier)
npx ts-node scripts/seed-all.ts資料庫假資料

12.25 資料表欄位完整規格

以下為核心資料表的欄位完整規格,包含欄位名稱、DB 型別、是否為空、預設值、說明。

auth-user(前台用戶帳號)

#欄位名稱DB 型別可空預設值說明
1idint (PK, AI)N-主鍵
2accountvarchar(50)N-帳號
3passwordvarchar(255)N-密碼 (bcrypt hash)
4namevarchar(50)N-用戶暱稱
5emailvarchar(50)Ynull電子信箱
6emailVerifyCodevarchar(6)Ynull信箱驗證碼
7mobilevarchar(30)Ynull手機號碼
8mobileVerifyCodevarchar(40)Ynull手機驗證碼 (E.164 格式)
9telegramvarchar(50)YnullTelegram ID
10googlevarchar(50)YnullGoogle OAuth ID
11vipLevelvarchar(4)N'1'VIP 等級
12vipProgressvarchar(3)Y'0'VIP 進度 (百分比)
13totalEffectiveBetdecimal(18,6)N0累計有效投注流水 (USD)
14relegationMissCounttinyint(1)N0連續未達保級月數
15vipHoldtinyint(1)N0VIP 保級鎖定 (1=手動保持等級)
16googleAuthSecretvarchar(32)YnullGoogle Authenticator Secret
17googleAuthEnabledtinyint(1)N0Google 2FA 啟用狀態
18tokenVersionintN0Token 版本號 (遞增可強制登出)
19balancedecimal(18,6)N0USD 餘額
20frozenBalancedecimal(18,6)N0凍結中金額 (提領審核中)
21withdrawalVerifyCodevarchar(6)Ynull提領用郵箱驗證碼
22localevarchar(10)N'zh-TW'使用者語系偏好
23avatarvarchar(255)Ynull用戶頭像 URL (吉祥物)
24vendorGroupIdintYnull所屬金流群組 ID
25agentCodevarchar(20)Ynull代理推廣碼 (null=非代理)
26level1AgentIdintYnull一級代理 (直屬上線) user ID
27level2AgentIdintYnull二級代理 user ID
28level3AgentIdintYnull三級代理 user ID
29agentTourCompletedAtdatetimeYnull代理導覽完成時間
30agentTourDismissedAtdatetimeYnull代理導覽跳過時間
31lastActivityAtdatetimeYnull最後活動時間
32siteCodevarchar(30)N'C9'所屬站點代碼
33createdAtdatetimeNCURRENT_TIMESTAMP建立時間

索引列表:

索引名稱索引欄位類型
IDX_site_account(siteCode, account)UNIQUE
IDX_site_email(siteCode, email)UNIQUE
IDX_site_mobile(siteCode, mobile)UNIQUE
IDX_site_telegram(siteCode, telegram)UNIQUE
IDX_site_google(siteCode, google)UNIQUE
IDX_site_agentCode(siteCode, agentCode)UNIQUE
IDX_level1AgentId(level1AgentId)INDEX
IDX_vendorGroupId(vendorGroupId)INDEX
IDX_lastActivityAt(lastActivityAt)INDEX
IDX_siteCode(siteCode)INDEX

deposit-order(存款訂單)

#欄位名稱DB 型別可空預設值說明
1idint (PK, AI)N-主鍵
2userIdintN-用戶 ID
3channelIdintN-金流通道 ID
4channelNamevarchar(30)N-金流通道名稱 (e.g. wantong)
5currencyvarchar(10)N'TWD'幣別
6subOrdervarchar(24)N-商家訂單編號 (UNIQUE)
7orderAmountdecimal(18,6)N0用戶輸入金額 (USDT)
8vendorAmountintN0送出給金流商的金額 (原幣整數)
9paymentMethodvarchar(10)N-支付方式 fiat/credit/crypto
10statusvarchar(20)N'pending'訂單狀態
11payAmountintN0實際繳款金額 (原幣)
12payTimevarchar(50)Ynull繳款時間
13usdAmountdecimal(18,6)N0入帳 USD 金額
14exchangeRatedecimal(18,10)N0使用的匯率
15resultUrltextYnull金流商付款頁面 URL
16vendorRequestjsonYnull送出給金流商的請求與回應
17callbackDatajsonYnull回調原始資料
18proofImagevarchar(500)Ynull繳費證明圖片 URL
19rejectReasonvarchar(200)Ynull拒絕原因
20reviewedByvarchar(50)Ynull審核人
21siteCodevarchar(30)N'C9'所屬站點代碼
22createdAtdatetimeNCURRENT_TIMESTAMP建立時間
23updatedAtdatetimeNCURRENT_TIMESTAMP更新時間

索引列表:

索引名稱索引欄位類型
IDX_userId_status(userId, status)INDEX
IDX_subOrder(subOrder)UNIQUE
IDX_siteCode(siteCode)INDEX

withdrawal-order(提領訂單)

#欄位名稱DB 型別可空預設值說明
1idint (PK, AI)N-主鍵
2userIdintN-用戶 ID
3amountdecimal(18,6)N-提領金額 (USD)
4cryptoAddressIdintN-提領目標錢包 ID
5addressvarchar(255)N-快照:錢包地址
6networkvarchar(20)N-快照:鏈路 (TRC-20)
7statusvarchar(20)N'pending'狀態
8rejectReasonvarchar(255)Ynull拒絕原因
9reviewedByvarchar(50)Ynull審核人帳號
10reviewedAtdatetimeYnull審核時間
11proofKeyvarchar(500)Ynull代付證明 R2 key
12proofOriginalNamevarchar(255)Ynull代付證明原始檔名
13completedByvarchar(50)Ynull完成出款操作員帳號
14completedAtdatetimeYnull完成時間
15siteCodevarchar(30)N'C9'所屬站點代碼
16createdAtdatetimeNCURRENT_TIMESTAMP建立時間
17updatedAtdatetimeNCURRENT_TIMESTAMP更新時間

提領三階段流程:

pending (待審核)
  → approved (已核准)     ← reviewWithdrawal(approve)
  → rejected (已拒絕)     ← reviewWithdrawal(reject) → 退回 frozenBalance
approved (已核准)
  → completed (已完成)    ← completeWithdrawal → 上傳匯款憑證

vip-level(VIP 等級配置)

#欄位名稱DB 型別可空預設值說明
1idint (PK, AI)N-主鍵
2levelintN-VIP 等級編號
3siteCodevarchar(30)N'C9'所屬站點代碼
4namejsonN-等級名稱 (多語系 JSON)
5tiervarchar(20)N-階級:bronze/gold/platinum/diamond
6minChipdecimal(18,6)N0升級所需最低累計籌碼 (USD)
7relegationChipdecimal(18,6)N0保級所需月投注額 (USD)
8sortOrderintN1排序權重
9enabledtinyint(1)N1是否啟用
10createdAtdatetimeNCURRENT_TIMESTAMP建立時間
11updatedAtdatetimeNCURRENT_TIMESTAMP更新時間

name JSON 格式範例:

json
{
  "zh-TW": "青銅 I",
  "en-US": "Bronze I",
  "zh-CN": "青铜 I",
  "th-TH": "บรอนซ์ I",
  "vi-VN": "Đồng I"
}

affiliate-settlement(代理佣金結算)

#欄位名稱DB 型別可空預設值說明
1idint (PK, AI)N-主鍵
2agentIdintN-代理 user ID
3weekStartdateN-週結算開始日 (Monday)
4weekEnddateN-週結算結束日 (Sunday)
5activeMemberCountintN0本週活躍下線人數
6totalNetLossdecimal(18,6)N0下線總淨輸 (USD)
7level1Commissiondecimal(18,6)N0一級佣金 (USD)
8level2Commissiondecimal(18,6)N0二級佣金 (USD)
9level3Commissiondecimal(18,6)N0三級佣金 (USD)
10totalCommissiondecimal(18,6)N0佣金總額 (USD)
11gameTypeBreakdownjsonYnull各遊戲類型佣金分解
12periodTypevarchar(10)N'weekly'結算週期:weekly/daily
13statusvarchar(20)N'pending'結算狀態
14riskFlaggedtinyint(1)N0是否有風控標記
15riskReasonstextYnull風控原因 (JSON array)
16reviewedByvarchar(50)Ynull審核人帳號
17reviewedAtdatetimeYnull審核時間
18siteCodevarchar(30)N'C9'所屬站點代碼
19createdAtdatetimeNCURRENT_TIMESTAMP建立時間
20updatedAtdatetimeNCURRENT_TIMESTAMP更新時間

結算狀態流程:

Cron 觸發 → pending (待審核)
  → 風控檢測 → riskFlagged = 1 → pendingReview (需人工審核)
  → 無異常 → approved (自動核准) → 佣金入 affiliate-balance
  → 人工審核 → approved / rejected

site-config(站點基本設定)

#欄位名稱DB 型別可空預設值說明
1idint (PK, AI)N-主鍵
2siteCodevarchar(30)N-站點代碼 (UNIQUE)
3prefixvarchar(30)N-白牌前綴 (UNIQUE),對應 R2 路徑
4layoutvarchar(30)N'a1'前台模板代碼
5siteNamejsonN-站點名稱 (多語系)
6siteDescriptionjsonN-站點介紹 (多語系)
7supportedLocalesjsonN-支援語系陣列
8activeThemeIdintYnull當前使用的主題 ID
9mascotsjsonYnull吉祥物清單
10agentTourEnabledtinyint(1)N1代理導覽功能開關
11agentTourIntervalSecintN604800代理導覽重新提醒間隔(秒)
12depositMethodsjsonYnull存款通路開關
13bottomBarEnabledtinyint(1)N1下導列功能開關
14bottomBarConfigjsonYnull下導列配置
15footerConfigjsonYnull頁腳配置
16learnMoreConfigjsonYnull站點介紹 FAQ 配置
17customerServiceConfigjsonYnull客服設置
18domainsjsonYnull域名設置
19oauthProvidersjsonYnull三方登入設定
20gameProvidersjsonYnull遊戲商 API 設定
21serviceProvidersjsonYnull服務商設定
22templateVariablesjsonYnull模板變數
23notificationConfigjsonYnull自動通知設定
24enabledtinyint(1)N1是否啟用
25createdAtdatetimeNCURRENT_TIMESTAMP建立時間
26updatedAtdatetimeNCURRENT_TIMESTAMP更新時間

JSON 欄位結構詳細說明:

depositMethods 結構

json
{
  "fiat": true,
  "credit": true,
  "crypto": true
}

customerServiceConfig 結構

json
{
  "channels": [
    {
      "type": "line",
      "label": { "zh-TW": "LINE 客服", "en-US": "LINE Support" },
      "icon": "line-icon-url",
      "link": "https://line.me/...",
      "sortOrder": 1,
      "enabled": true
    }
  ],
  "liveChatScript": "<script>...</script>",
  "liveChatEnabled": false
}

domains 結構

json
[
  {
    "hostname": "www.c9.com",
    "browserTitle": "C9 Entertainment",
    "browserDescription": "Best online entertainment platform",
    "logoSmall": "https://cdn.example.com/logo-small.png",
    "logoBig": "https://cdn.example.com/logo-big.png",
    "favicon": "https://cdn.example.com/favicon.ico",
    "supportedLocales": ["zh-TW", "en-US"]
  }
]

oauthProviders 結構

json
{
  "google": {
    "clientId": "xxx.apps.googleusercontent.com",
    "clientSecret": "xxx",
    "redirectUri": "https://www.c9.com/redirect/google-callback"
  },
  "telegram": {
    "botToken": "xxx:xxx",
    "botUsername": "C9Bot"
  },
  "domainWhitelist": ["www.c9.com", "m.c9.com"]
}

gameProviders 結構

json
{
  "rsg": {
    "apiUrl": "https://api.rsg.com",
    "clientId": "xxx",
    "clientSecret": "xxx",
    "desKey": "xxx",
    "desIv": "xxx",
    "systemCode": "xxx",
    "webId": "xxx"
  },
  "betsolutions": {
    "apiUrl": "https://api.betsolutions.com",
    "authUrl": "https://auth.betsolutions.com",
    "merchantId": "12345",
    "privateKey": "xxx"
  },
  "liveSports": {
    "apiKey": "xxx"
  }
}

serviceProviders 結構

json
{
  "resend": {
    "apiKey": "re_xxx",
    "from": "noreply@c9.com"
  },
  "twilio": {
    "accountSid": "ACxxx",
    "authToken": "xxx",
    "verifyServiceSid": "VAxxx"
  },
  "r2": {
    "bucketName": "c9-storage",
    "endpoint": "https://xxx.r2.cloudflarestorage.com",
    "accessKeyId": "xxx",
    "secretAccessKey": "xxx",
    "publicUrl": "https://cdn.c9.com"
  }
}

notificationConfig 結構

json
{
  "welcomeRegistration": true,
  "depositSuccess": true,
  "withdrawalApproved": true,
  "withdrawalRejected": true,
  "withdrawalCompleted": true
}

bottomBarConfig 結構

json
{
  "mobile": [
    {
      "icon": "home",
      "label": { "zh-TW": "首頁", "en-US": "Home" },
      "link": "/",
      "sortOrder": 1,
      "enabled": true
    },
    {
      "icon": "game",
      "label": { "zh-TW": "遊戲", "en-US": "Games" },
      "link": "/game",
      "sortOrder": 2,
      "enabled": true
    }
  ],
  "desktop": []
}

footerConfig 結構

json
[
  {
    "title": { "zh-TW": "關於我們", "en-US": "About Us" },
    "icon": "info",
    "sortOrder": 1,
    "enabled": true,
    "links": [
      {
        "label": { "zh-TW": "隱私政策", "en-US": "Privacy Policy" },
        "link": "/help",
        "icon": "shield",
        "sortOrder": 1
      }
    ]
  }
]

learnMoreConfig 結構

json
[
  {
    "question": { "zh-TW": "如何註冊帳號?", "en-US": "How to register?" },
    "answer": { "zh-TW": "點擊右上角註冊按鈕...", "en-US": "Click the register button..." },
    "sortOrder": 1,
    "enabled": true
  }
]

game-provider(遊戲供應商)

#欄位名稱DB 型別可空預設值說明
1idint (PK, AI)N-主鍵
2gameCodevarchar(255)N-遊戲代碼
3siteCodevarchar(30)N'C9'所屬站點代碼
4providerCodevarchar(20)N''對接遊戲商 API:rsg / betsolutions
5gameTypeintN-遊戲類型 (1-10)
6areaBlocktinyint(1)N0地區封鎖
7maintaintinyint(1)N0維護中
8enabletinyint(1)N1是否啟用
9labeljsonYnull多語系顯示名稱
10sortOrderintN0排序權重 (越小越前)
11isHottinyint(1)N0是否為熱門遊戲
12createdAtdatetimeNCURRENT_TIMESTAMP建立時間

12.26 後台列表頁面欄位規格

以下列出各後台列表頁面的表格欄位,供開發及設計參考。

管理員列表 (/system/admins)

欄位說明排序
#序號-
帳號管理員 Email-
名稱管理員名稱-
群組所屬權限群組-
狀態啟用/停用 (StatusBadge)-
2FAGoogle Auth 啟用狀態-
建立時間createdAt-
操作編輯、刪除-

群組列表 (/system/groups)

欄位說明排序
#序號-
群組名稱name-
群組類型groupType (StatusBadge)-
成員數該群組的管理員數量-
權限數permissions 陣列長度-
建立時間createdAt-
操作編輯、刪除-

操作紀錄 (/system/logs)

欄位說明排序
#序號-
時間createdAtY (desc)
管理員操作者帳號-
動作action 描述-
目標操作對象-
IP來源 IP 地址-
詳情展開查看完整 detail-

存款訂單 (/finance/deposit-review)

欄位說明排序
#序號-
訂單編號subOrder-
用戶 IDuserId-
用戶帳號account (join auth-user)-
支付方式paymentMethod (fiat/credit/crypto)-
申請金額orderAmount (USD)-
入帳金額usdAmount (USD)-
匯率exchangeRate-
狀態status (StatusBadge)-
申請時間createdAtY (desc)
操作審核 (approve/reject)-

提款訂單 (/finance/withdrawals)

欄位說明排序
#序號-
用戶 IDuserId-
用戶帳號account (join auth-user)-
提領金額amount (USD)-
目標地址address (快照)-
鏈路network (TRC-20 等)-
狀態status (StatusBadge)-
審核人reviewedBy-
申請時間createdAtY (desc)
操作審核/上傳憑證/完成-

銀行卡列表 (/finance/bank-cards)

欄位說明排序
#序號-
用戶 IDuserId-
用戶帳號account-
銀行代碼bankCode-
銀行名稱bankName-
帳號accountNumber (部分遮罩)-
持卡人cardHolder-
狀態status (StatusBadge)-
建立時間createdAtY (desc)
操作審核 (approve/reject)-

信用卡列表 (/finance/credit-cards)

欄位說明排序
#序號-
用戶 IDuserId-
用戶帳號account-
卡號cardNumber (部分遮罩)-
持卡人cardHolder-
到期日expiryDate-
狀態status (StatusBadge)-
建立時間createdAtY (desc)
操作審核 (approve/reject)-

加密地址列表 (/finance/crypto-addresses)

欄位說明排序
#序號-
用戶 IDuserId-
用戶帳號account-
鏈路network (TRC-20/ERC-20)-
幣種currency (USDT)-
地址address (部分遮罩)-
狀態status (StatusBadge)-
建立時間createdAtY (desc)
操作審核 (approve/reject)-

活動列表 (/activity/promos)

欄位說明排序
#序號-
縮圖imgPc 預覽-
標題title (當前語系)-
標籤tagId → tag name-
類型conditions.type-
獎勵reward (USD)-
打碼倍率turnoverMultiplier-
狀態status (StatusBadge)-
開始日期startDate-
結束日期endDate-
操作編輯、刪除-

活動標籤 (/activity/tags)

欄位說明排序
#序號-
名稱name (多語系,顯示當前語系)-
排序sortOrder-
建立時間createdAt-
操作編輯、刪除-

VIP 等級列表 (/vip/levels)

欄位說明排序
#序號-
等級level 編號Y (asc)
名稱name (當前語系)-
階級tier (bronze/gold/platinum/diamond)-
升級門檻minChip (USD)-
保級門檻relegationChip (USD)-
排序sortOrder-
狀態enabled (StatusBadge)-
操作編輯、刪除-

VIP 返水設定 (/vip/rebates)

欄位說明排序
VIP 等級level (行標題)Y (asc)
SportsrebateRate for gameType=1-
SlotrebateRate for gameType=2-
LiverebateRate for gameType=3-
LotteryrebateRate for gameType=4-
ChessrebateRate for gameType=5-
EsportsrebateRate for gameType=8-
CryptorebateRate for gameType=9-
FishrebateRate for gameType=10-

返水設定以矩陣表格呈現(等級 x 遊戲類型),每格為 decimal(5,2) 百分比值。

遊戲供應商列表 (/game/providers)

欄位說明排序
#序號-
遊戲代碼gameCode-
名稱label (當前語系)-
對接商providerCode (rsg/betsolutions)-
遊戲類型gameType (中文名稱)-
排序sortOrderY (asc)
熱門isHot (icon)-
維護maintain (icon)-
狀態enable (StatusBadge)-
操作編輯、刪除-

遊戲分類列表 (/game/type-configs)

欄位說明排序
#序號-
遊戲類型gameType ID + 名稱-
名稱name (當前語系)-
圖示icon URL 預覽-
排序sortOrderY (asc)
狀態enable (StatusBadge)-
操作編輯、刪除-

代理列表 (/affiliate/agents)

欄位說明排序
#序號-
用戶 IDuserId-
帳號account-
代理碼agentCode-
代理等級agentTier-
直屬下線數level1DownlineCount-
總下線數totalDownlineCount-
累計佣金totalEarned (USD)-
建立時間createdAtY (desc)
操作查看詳情-

佣金結算列表 (/affiliate/settlements)

欄位說明排序
#序號-
代理 IDagentId-
代理帳號agentAccount-
結算週期weekStart ~ weekEnd-
類型periodType (weekly/daily)-
活躍下線activeMemberCount-
下線淨輸totalNetLoss (USD)-
佣金總額totalCommission (USD)-
風控riskFlagged (icon)-
狀態status (StatusBadge)-
操作審核、查看風控紀錄-

IP 黑白名單 (/risk-control/ip-rules)

欄位說明排序
#序號-
IP 地址ip-
類型type (blacklist/whitelist)-
備註note-
建立時間createdAtY (desc)
操作編輯、刪除-

遊戲黑名單 (/risk-control/game-blacklist)

欄位說明排序
#序號-
用戶 IDuserId-
用戶帳號account-
遊戲類型gameType (名稱或 "全部")-
遊戲 IDproductId (名稱或 "全部")-
備註note-
建立時間createdAtY (desc)
操作編輯、刪除-

投注紀錄報表 (/reports/bet-records)

欄位說明排序
#序號-
用戶 IDuserId-
用戶帳號account-
遊戲代碼gameCode-
遊戲類型gameType (名稱)-
遊戲平台providerCode-
投注金額betAmount (USD)-
有效投注betEffective (USD)-
派彩金額payoutAmount (USD)-
狀態status (StatusBadge)-
時間createdAtY (desc)

玩家報表 (/reports/players)

欄位說明排序
#序號-
用戶 IDuserId-
帳號account-
VIP 等級vipLevel-
餘額balance (USD)-
總投注totalBet (USD)-
總派彩totalPayout (USD)-
總存款totalDeposit (USD)-
總提款totalWithdrawal (USD)-
註冊時間createdAtY (desc)

損益報表 (/reports/profit-loss)

欄位說明排序
日期/週/月分組維度Y (desc)
存款金額totalDeposit (USD)-
提款金額totalWithdrawal (USD)-
投注金額totalBet (USD)-
派彩金額totalPayout (USD)-
反水金額totalRebate (USD)-
活動獎勵totalPromo (USD)-
淨利潤netProfit (USD)-

遊戲報表 (/reports/games)

欄位說明排序
遊戲代碼gameCode-
遊戲名稱gameName (當前語系)-
遊戲類型gameType (名稱)-
遊戲平台providerCode-
總投注totalBet (USD)-
總派彩totalPayout (USD)-
投注人次betCount-
RTPreturnToPlayer (%)-

總覽報表 (/reports/overview)

統計卡片 (Summary Cards):

卡片說明
總用戶數平台註冊用戶總數
今日新增今日新註冊用戶數
今日存款今日存款總額 (USD)
今日提款今日提款總額 (USD)
今日投注今日投注總額 (USD)
今日派彩今日派彩總額 (USD)

每日摘要表格 (Daily Summary):

欄位說明
日期date
新增用戶newUsers
活躍用戶activeUsers
存款金額deposits (USD)
提款金額withdrawals (USD)
投注金額bets (USD)
派彩金額payouts (USD)
淨利潤netProfit (USD)

12.27 前台元件樹狀結構

以下為前台 (c9-ec) A1 佈局的元件樹狀結構,展示各頁面的主要元件組成。

A1/
├── Layout/
│   ├── BottomBar.vue           # 行動版底部導航列
│   ├── Footer.vue              # 頁尾(含連結群組、版權資訊)
│   ├── LiveChat.vue            # LiveChat 嵌入腳本元件
│   ├── Sidebar.vue             # 左側側邊欄(行動版抽屜)
│   └── TitleBar.vue            # 頂部標題列

├── Home/
│   ├── index.vue               # 首頁主元件
│   ├── Banner.vue              # 輪播橫幅
│   ├── Promo.vue               # 活動快捷入口
│   └── LiveSports.vue          # 即時賽事比分

├── Game/
│   ├── index.vue               # 遊戲大廳主元件
│   ├── Lobby.vue               # 遊戲大廳(遊戲列表 + 類型篩選)
│   ├── Provider.vue            # 遊戲商標籤切換
│   ├── ListBar.vue             # 遊戲列表工具列
│   ├── Search.vue              # 遊戲搜尋
│   ├── RankList.vue            # 遊戲排行榜
│   ├── LoadMore.vue            # 載入更多按鈕
│   ├── Empty.vue               # 無遊戲提示
│   └── Play.vue                # 遊戲進行頁面(iframe 嵌入)

├── Promo/
│   ├── Center.vue              # 活動中心列表
│   └── Detail.vue              # 活動詳情頁

├── Mission/
│   └── index.vue               # 任務系統(日/週/月任務列表 + 進度條)

├── Help/
│   └── Center.vue              # 幫助中心(手風琴 FAQ)

├── Alliance/
│   └── index.vue               # 聯盟資訊頁面

├── User/
│   ├── Setting.vue             # 個人設定(帳號資訊、密碼修改、2FA、語系、Avatar)
│   │
│   ├── Deposit/
│   │   ├── index.vue           # 存款主頁(支付方式選擇)
│   │   ├── Fiat.vue            # 法幣存款(ATM/銀行轉帳)
│   │   ├── Credit.vue          # 信用卡存款
│   │   └── Crypto.vue          # 加密貨幣存款
│   │
│   ├── Withdrawal/
│   │   └── index.vue           # 提領主頁(錢包選擇 + 金額輸入 + 驗證)
│   │
│   ├── Wallet/
│   │   ├── index.vue           # 錢包管理主頁
│   │   ├── Fiat.vue            # 銀行卡管理
│   │   ├── Credit.vue          # 信用卡管理
│   │   └── Crypto.vue          # 加密地址管理
│   │
│   ├── Vip/
│   │   ├── index.vue           # VIP 主頁
│   │   ├── StatusCard.vue      # VIP 狀態卡片(等級、進度條)
│   │   ├── Benefits.vue        # VIP 權益展示
│   │   ├── LevelList.vue       # VIP 等級列表
│   │   ├── RebateTable.vue     # 返水費率表
│   │   └── MyRebates.vue       # 我的返水紀錄
│   │
│   ├── Affiliate/
│   │   ├── index.vue           # 代理推廣主頁
│   │   ├── Dashboard.vue       # 代理儀表板(概覽數據)
│   │   ├── Commission.vue      # 佣金紀錄
│   │   ├── Settlement.vue      # 結算紀錄
│   │   ├── Downline.vue        # 下線管理
│   │   ├── Withdrawal.vue      # 代理提款
│   │   └── Alliance.vue        # 聯盟資訊
│   │
│   ├── Transaction/
│   │   ├── index.vue           # 交易紀錄主頁
│   │   ├── Deposit.vue         # 存款紀錄
│   │   ├── Withdrawal.vue      # 提款紀錄
│   │   ├── Dividend.vue        # 分紅紀錄
│   │   └── Promo.vue           # 活動獎勵紀錄
│   │
│   ├── BetRecord/
│   │   └── index.vue           # 投注紀錄
│   │
│   ├── Inbox/
│   │   └── index.vue           # 站內信
│   │
│   └── Kyc/
│       ├── index.vue           # KYC 身份驗證主頁
│       ├── StatusCard.vue      # KYC 狀態卡片
│       ├── StepBasicInfo.vue   # 步驟一:基本資料
│       ├── StepDocUpload.vue   # 步驟二:文件上傳
│       ├── StepLiveness.vue    # 步驟三:活體驗證
│       └── StepReview.vue      # 步驟四:審核中

├── Modal/
│   ├── Login.vue               # 登入彈窗(帳密 + Google + Telegram)
│   ├── Register.vue            # 註冊彈窗
│   ├── Locale.vue              # 語系切換彈窗
│   ├── Theme.vue               # 主題切換彈窗
│   ├── ContactSupport.vue      # 聯繫客服彈窗(8 種管道列表)
│   ├── AgentTour.vue           # 代理導覽彈窗(新手引導)
│   ├── BuyCrypto.vue           # 購買加密貨幣引導彈窗
│   ├── VerifyUserInfo.vue      # 用戶資訊驗證彈窗
│   ├── EditPassword.vue        # 修改密碼彈窗
│   ├── SetPassword.vue         # 設定密碼彈窗(OAuth 用戶首次設定)
│   ├── BindGoogleAuth.vue      # 綁定 Google Authenticator 彈窗
│   ├── AddBankCard.vue         # 新增銀行卡彈窗
│   ├── AddCreditCard.vue       # 新增信用卡彈窗
│   ├── AddCryptoAddress.vue    # 新增加密地址彈窗
│   └── BankCardDetail.vue      # 銀行卡詳情彈窗

└── PromoLinkCard.vue           # 活動連結卡片(共用)

12.28 前台 Store 完整清單

Store 檔案Store 名稱持久化主要狀態
auth.tsuseAuthStorelocalStorage (token)user, token, isAuthenticated, loginType
config.tsuseConfigStore-siteConfig, theme, domainConfig
game.tsuseGameStore-providers, typeConfigs, searchKeyword, activeType
modal.tsuseModalStore-loginVisible, registerVisible, localeVisible, themeVisible, supportVisible, agentTourVisible
deposit.tsuseDepositStore-selectedChannel, amount, currency, exchangeRate

useAuthStore 方法列表

方法說明
setToken(token)設定 JWT Token(寫入 localStorage)
clearToken()清除 Token
setUser(user)設定用戶資訊
logout()登出(清除 token + user)
refreshUserDetail()重新取得用戶資訊

useModalStore 方法列表

方法說明
openLogin()開啟登入彈窗
openRegister()開啟註冊彈窗
openLocale()開啟語系選擇彈窗
openTheme()開啟主題選擇彈窗
openSupport()開啟客服彈窗
openAgentTour()開啟代理導覽彈窗
closeAll()關閉所有彈窗

useConfigStore 方法列表

方法說明
fetchPublicConfig()取得站點公開設定
fetchTheme()取得站點主題
applyTheme(theme)套用主題 CSS 變數
getSiteName()取得站點名稱(當前語系)

12.29 後台 Sidebar 導航結構完整清單

以下為後台 sidebar 的完整導航結構,包含群組、項目、路由、權限、圖示。

群組項目路由權限圖示
儀表板儀表板/dashboard-LayoutDashboard
系統管理管理員管理/system/adminsadmin:readUsers
系統管理群組管理/system/groupsadmin-group:readShield
系統管理操作紀錄/system/logsadmin-log:readFileText
系統管理站點基本設定/system/site-configsite-config:readSettings
系統管理三方登入/system/site-oauthsite-config:readKey
系統管理遊戲商配置/system/site-game-providerssite-config:readGamepad2
系統管理服務商配置/system/site-service-providerssite-config:readServer
系統管理客服配置/system/site-customer-servicesite-config:readHeadphones
系統管理域名設置/system/site-domainssite-config:readGlobe
系統管理雲端儲存/system/cloud-storageadmin:readCloud
系統管理雲端儲存日誌/system/cloud-storage-logsadmin:readHistory
前台佈局底部導航列/system/layout-bottom-barsite-config:readDock
前台佈局頁尾/system/layout-footersite-config:readPanelBottom
前台佈局了解更多/system/layout-learn-moresite-config:readHelpCircle
玩家管理全部玩家/players/alluser:readUsers
玩家管理新註冊玩家/players/new-registrationsuser:readUserPlus
玩家管理線上玩家/players/onlineuser:readActivity
玩家管理登入失敗紀錄/players/login-failuresuser:readAlertTriangle
玩家管理玩家標籤/players/tagsuser:readTag
玩家管理遊戲重新註冊/players/game-reregistrationuser:readRefreshCw
遊戲管理遊戲供應商/game/providersgame:readGamepad
遊戲管理遊戲類型設定/game/type-configsgame:readLayers
VIPVIP 等級/vip/levelsvip:readCrown
VIP返水設定/vip/rebatesvip:readPercent
VIPVIP 玩家/vip/playersvip:readStar
VIPVIP 里程碑/vip/milestonesvip:readFlag
活動管理優惠活動/activity/promospromo:readGift
活動管理活動標籤/activity/tagspromo-tag:readTags
郵件管理站內信/mail/inboxadmin:readMail
郵件管理郵件設定/mail/settingsadmin:readMailCog
財務管理人工調節金額/finance/adjust-balancefinance:writeCalculator
財務管理存款設置/finance/deposit-settingsvendor:readSettings2
財務管理存款訂單/finance/deposit-reviewdeposit:readFileInput
財務管理提款訂單/finance/withdrawalswithdrawal:readFileOutput
財務管理銀行卡列表/finance/bank-cardsfinance:readCreditCard
財務管理信用卡列表/finance/credit-cardsfinance:readCreditCard
財務管理虛擬錢包地址/finance/crypto-addressesfinance:readWallet
代理中心代理列表/affiliate/agentsaffiliate:readNetwork
代理中心佣金費率/affiliate/commission-ratesaffiliate:readPercent
代理中心佣金結算/affiliate/settlementsaffiliate:readReceipt
代理中心代理提領/affiliate/aff-withdrawalsaffiliate:readArrowDownCircle
代理中心綁定紀錄/affiliate/bind-logsaffiliate:readLink
代理中心代理等級/affiliate/agent-tiersaffiliate:readLayers
代理中心VIP 里程碑/affiliate/vip-milestonesaffiliate:readFlag
代理中心代理導覽/affiliate/agent-touraffiliate:readCompass
風控管理IP 黑白名單/risk-control/ip-rulesrisk:readShield
風控管理IP/FP 檢查/risk-control/ip-checkrisk:readSearch
風控管理遊戲黑名單/risk-control/game-blacklistrisk:readBan
報表總覽/reports/overviewreport:readBarChart3
報表玩家報表/reports/playersreport:readUsers
報表玩家摘要/reports/player-summaryreport:readFileBarChart
報表投注紀錄/reports/bet-recordsreport:readDices
報表損益報表/reports/profit-lossreport:readTrendingUp
報表遊戲報表/reports/gamesreport:readGamepad2
報表活動報表/reports/promosreport:readGift

總計:14 個群組、55+ 個導航項目


12.30 主題色彩系統

主題色 CSS 變數(OKLCH 色彩空間)

後台使用 OKLCH 色彩空間定義主題色。每個站點可建立多組主題,透過 activeThemeId 切換。

CSS 變數用途範例值
--color-primary主色oklch(0.7 0.2 250)
--color-primary-light主色淺oklch(0.85 0.15 250)
--color-primary-dark主色深oklch(0.55 0.25 250)
--color-accent強調色oklch(0.75 0.18 130)
--color-accent-light強調色淺oklch(0.88 0.12 130)
--color-accent-dark強調色深oklch(0.6 0.22 130)
--color-surface表面色oklch(0.98 0.01 250)
--color-surface-alt替代表面色oklch(0.95 0.02 250)
--color-text文字色oklch(0.2 0.02 250)
--color-text-muted次要文字色oklch(0.55 0.02 250)
--color-border邊框色oklch(0.85 0.01 250)
--color-border-light淺邊框色oklch(0.92 0.01 250)

前台內建主題預設

前台 (c9-ec) 內建 6 組主題預設,各站點可透過後台自訂或使用預設:

主題名稱主色調風格說明
經典深藍深藍色穩重專業的經典娛樂城風格
炫金奢華金色高端奢華的 VIP 風格
科技紫紫色現代科技感風格
極光綠綠色清新自然的環保風格
烈焰紅紅色熱情活力的刺激風格
霓虹粉粉紅年輕時尚的潮流風格

site-theme 資料表

欄位DB 型別說明
idint (PK)主鍵
siteConfigIdint (FK)關聯站點 ID
namevarchar(50)主題名稱
primaryvarchar(100)主色
primaryLightvarchar(100)主色淺
primaryDarkvarchar(100)主色深
accentvarchar(100)強調色
accentLightvarchar(100)強調色淺
accentDarkvarchar(100)強調色深
surfacevarchar(100)表面色
surfaceAltvarchar(100)替代表面色
textvarchar(100)文字色
textMutedvarchar(100)次要文字色
bordervarchar(100)邊框色
borderLightvarchar(100)淺邊框色
createdAtdatetime建立時間
updatedAtdatetime更新時間

12.31 API 請求/回應範例

以下為核心 API 的請求與回應範例,供前後端對接參考。

用戶註冊

Request:

POST /api/auth/register
Headers:
  Content-Type: application/json
  site-name: C9
  locales: zh-TW

Body:
{
  "account": "user001",
  "password": "P@ssw0rd123",
  "name": "測試用戶",
  "refCode": "AGT123",
  "device": "fp_abc123def456"
}

Response (Success):

json
{
  "code": 200,
  "message": "ok",
  "result": {
    "token": "eyJhbGciOiJIUzI1NiIs...",
    "user": {
      "id": 42,
      "account": "user001",
      "name": "測試用戶",
      "email": null,
      "vipLevel": "1",
      "balance": "0.000000",
      "locale": "zh-TW",
      "avatar": null,
      "agentCode": null
    }
  },
  "timestamp": "2026-03-01T12:00:00.000Z",
  "path": "/api/auth/register"
}

Response (Error):

json
{
  "code": 2001,
  "message": "帳號已存在",
  "timestamp": "2026-03-01T12:00:00.000Z",
  "path": "/api/auth/register"
}

用戶登入

Request:

POST /api/auth/login
Headers:
  Content-Type: application/json
  site-name: C9
  locales: zh-TW

Body:
{
  "account": "user001",
  "password": "P@ssw0rd123",
  "device": "fp_abc123def456"
}

Response (Success):

json
{
  "code": 200,
  "message": "ok",
  "result": {
    "token": "eyJhbGciOiJIUzI1NiIs...",
    "user": {
      "id": 42,
      "account": "user001",
      "name": "測試用戶",
      "email": "user001@test.com",
      "vipLevel": "3",
      "balance": "1250.500000",
      "frozenBalance": "100.000000",
      "locale": "zh-TW",
      "avatar": "https://cdn.c9.com/mascots/01.png",
      "agentCode": "AGT042",
      "googleAuthEnabled": 0
    }
  },
  "timestamp": "2026-03-01T12:00:00.000Z",
  "path": "/api/auth/login"
}

建立存款訂單

Request:

POST /api/deposit
Headers:
  Content-Type: application/json
  Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
  site-name: C9
  locales: zh-TW

Body:
{
  "channelId": 1,
  "paymentMethod": "fiat",
  "amount": 100
}

Response (Success):

json
{
  "code": 200,
  "message": "ok",
  "result": {
    "orderId": 156,
    "subOrder": "DEP20260301120000001",
    "orderAmount": "100.000000",
    "vendorAmount": 3080,
    "currency": "TWD",
    "exchangeRate": "30.800000000",
    "paymentUrl": "https://pay.vendor.com/order?id=xxx",
    "status": "created"
  },
  "timestamp": "2026-03-01T12:00:00.000Z",
  "path": "/api/deposit"
}

後台管理員登入

Request:

POST /api/admin/login
Headers:
  Content-Type: application/json
  locales: zh-TW

Body:
{
  "email": "admin@c9.com",
  "password": "admin123",
  "totpCode": "123456"
}

Response (Success):

json
{
  "code": 200,
  "message": "ok",
  "result": {
    "token": "eyJhbGciOiJIUzI1NiIs...",
    "admin": {
      "id": 1,
      "email": "admin@c9.com",
      "name": "Root Admin",
      "groupId": 1,
      "groupType": "root",
      "googleAuthEnabled": 1
    }
  },
  "timestamp": "2026-03-01T12:00:00.000Z",
  "path": "/api/admin/login"
}

後台列表查詢 (分頁)

Request:

GET /api/admin/finance/deposit-review/list?page=1&pageSize=20&status=pending&siteCode=C9
Headers:
  Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
  x-site-code: C9
  locales: zh-TW

Response (Success):

json
{
  "code": 200,
  "message": "ok",
  "result": {
    "items": [
      {
        "id": 156,
        "userId": 42,
        "account": "user001",
        "subOrder": "DEP20260301120000001",
        "paymentMethod": "fiat",
        "orderAmount": "100.000000",
        "usdAmount": "0.000000",
        "exchangeRate": "30.800000000",
        "status": "pending",
        "siteCode": "C9",
        "createdAt": "2026-03-01T12:00:00.000Z"
      }
    ],
    "pagination": {
      "page": 1,
      "pageSize": 20,
      "total": 1,
      "totalPages": 1
    }
  },
  "timestamp": "2026-03-01T12:00:00.000Z",
  "path": "/api/admin/finance/deposit-review/list"
}

取得錯誤碼 (共用列舉)

Request:

GET /api/common/enums
Headers:
  locales: zh-TW

Response:

json
{
  "code": 200,
  "message": "ok",
  "result": {
    "ERROR_CODES": {
      "/api/auth/register": {
        "2001": "帳號已存在",
        "2002": "推廣碼不存在",
        "2003": "Email 已存在"
      },
      "/api/auth/login": {
        "2001": "帳號或密碼錯誤",
        "2002": "帳號已停用"
      },
      "/api/game/launch": {
        "5010": "您已被限制進入此遊戲"
      }
    }
  }
}

12.32 資料精度計算範例

USD 截斷規則

所有 USD 金額使用 decimal(18,6) 儲存,計算後使用無條件捨去 (Math.floor):

truncateUsd(value) = Math.floor(value * 1e6) / 1e6

計算範例:

原始值截斷後說明
100.1234567100.123456保留 6 位小數
50.999999950.999999無條件捨去,非四捨五入
0.0000010.000001最小有效金額
0.00000010.000000低於精度被捨去

匯率換算範例

以 TWD → USD 為例:

用戶存入 TWD 30,000
當前匯率 1 USD = 30.80 TWD (decimal(18,10))

usdAmount = 30000 / 30.80 = 974.025974025...
truncateUsd(974.025974025...) = 974.025974

入帳金額 = USD 974.025974

返水計算範例

以 VIP 3 等級、Slot 遊戲為例:

用戶 VIP 等級 = 3
遊戲類型 = Slot (2)
返水費率 = 0.50% (decimal(5,2))
昨日有效投注 = USD 10,000.000000

反水金額 = 10000.000000 * 0.50 / 100
         = 50.000000

truncateUsd(50.000000) = USD 50.000000

發放:auth-user.balance += 50.000000
記錄:vip-rebate-log 新增一筆

活動打碼量計算範例

以首存活動為例:

活動:首存送 50%,打碼倍率 = 15x
用戶存款 = USD 100.000000
活動獎勵 = 100.000000 * 50% = USD 50.000000

所需打碼量 = 50.000000 * 15 = USD 750.000000

用戶投注:
  Slot 投注 500 (權重 1.0) → 打碼扣減 500
  剩餘打碼量 = 750 - 500 = 250

  Crypto 投注 200 (權重 0.5) → 打碼扣減 100
  剩餘打碼量 = 250 - 100 = 150

  Live 投注 200 (權重 1.0) → 打碼扣減 200
  剩餘打碼量 = max(0, 150 - 200) = 0 → 打碼完成

12.33 多語系 JSON 欄位慣例

欄位儲存格式

系統中所有需要多語系的欄位統一使用 JSON 格式儲存,key 為語系代碼,value 為對應語言文字:

json
{
  "zh-TW": "繁體中文文字",
  "en-US": "English Text",
  "zh-CN": "简体中文文字",
  "th-TH": "ข้อความภาษาไทย",
  "vi-VN": "Văn bản tiếng Việt"
}

使用此格式的資料表欄位

資料表欄位名稱用途
site-configsiteName站點名稱
site-configsiteDescription站點介紹
vip-levelnameVIP 等級名稱
game-providerlabel遊戲商顯示名稱
game-type-configname遊戲分類名稱
promotitle活動標題
promodescription活動描述
promocontent活動內容 (HTML)
promoimgPcPC 版橫幅圖片 URL
promoimgMobile手機版橫幅圖片 URL
promo-tagname活動標籤名稱
notificationtitle站內信標題
notificationcontent站內信內容 (HTML)
missionname任務名稱
missiondescription任務描述
alliance-agent-tiername代理等級名稱

後端 resolveText() 函數

resolveText(jsonField, locale?)

解析順序:
1. jsonField[currentLocale]     → 當前語系
2. jsonField['zh-TW']           → zh-TW fallback
3. Object.values(jsonField)[0]  → 第一個有值的語系
4. ''                           → 空字串 fallback

12.34 系統安全機制

密碼安全

項目規格
雜湊演算法bcrypt (bcryptjs)
雜湊輪數10 rounds (預設)
密碼儲存只儲存 hash,永不儲存明文
密碼驗證bcrypt.compare()

JWT Token 安全

項目前台用戶後台管理員
SecretJWT_SECRETADMIN_JWT_SECRET (fallback JWT_SECRET)
過期時間7 天7 天
Payloadsub, account, tokenVersionsub, email, tokenVersion, role, groupId, groupType
Token Version支援(強制登出機制)支援(強制登出機制)
Cache TTL60 秒 (token version 快取)60 秒 (token version 快取)

Token Version 強制登出機制

1. 正常登入:生成 JWT,寫入 tokenVersion (例如 5)
2. JWT 驗證:
   a. 取 cache:auth:tv:{userId}
   b. cache miss → 查 DB → 寫入 cache (60s TTL)
   c. 比對 JWT.payload.tokenVersion === DB.tokenVersion
   d. 不一致 → 401 Unauthorized

3. 強制登出:
   a. DB: auth-user.tokenVersion++ (從 5 → 6)
   b. Cache 過期 (最多 60s)
   c. 下次 JWT 驗證時 5 !== 6 → 401

效果:更改密碼後最多 60 秒內所有舊 token 失效

2FA (Google Authenticator)

項目說明
演算法TOTP (Time-based One-Time Password)
speakeasy
Secret 儲存auth-user.googleAuthSecret / admin-user.googleAuthSecret
啟用標記googleAuthEnabled (0/1)
驗證碼6 位數字,30 秒有效期
QR Code使用 qrcode 庫生成

CORS 設定

origin: true          → 允許所有來源(開發環境)
credentials: true     → 允許攜帶 cookie

Request Validation

ValidationPipe:
  whitelist: true     → 自動移除 DTO 未定義的欄位
  transform: true     → 自動型別轉換 (query string → number)

12.35 開發環境 Port 分配

服務PortURL
c9-ec (前台)3010http://localhost:3010
c9-ims (後台)3011http://localhost:3011
c9-be (後端)8080http://localhost:8080/api
Swagger UI8080http://localhost:8080/api/docs
MySQL3306localhost:3306
Redis6379localhost:6379

12.36 業務規則邊界條件

以下列出各模組的業務規則邊界條件與特殊情境處理,供開發及 QA 測試參考。

用戶註冊相關

規則說明
帳號唯一性同一 siteCode 下帳號不可重複
Email 唯一性同一 siteCode 下 email 不可重複(null 除外)
手機唯一性同一 siteCode 下手機不可重複(null 除外)
推廣碼綁定註冊時若帶 refCode,自動綁定上線代理(最多 3 層)
推廣碼不存在推廣碼無效時回傳錯誤碼 2002,不建立帳號
金流群組分配註冊時根據語系自動分配金流群組
OAuth 自動綁定Google/Telegram 登入時,新用戶自動建立帳號
OAuth 補綁既有用戶 Google 欄位為空時,登入後自動補綁
裝置指紋若前端傳入 device,記錄於 login-log;否則 fallback UA
初始 VIP新用戶預設 VIP 等級 = 1
初始餘額新用戶預設 balance = 0.000000

存款相關

規則說明
金額限制受金流通道 minAmount / maxAmount 限制
匯率快照建立訂單時快照當前匯率,不隨後續變動
重複入金防護同一 subOrder 不可重複建立 (UNIQUE 約束)
回調冪等性金流商可能多次回調,需檢查訂單狀態避免重複入帳
USD 截斷入帳金額使用 truncateUsd() 無條件捨去
任務進度存款確認後自動更新存款任務進度
通路開關受 site-config.depositMethods 控制(fiat/credit/crypto)

提領相關

規則說明
餘額檢查提領金額 + 凍結金額 <= 餘額
凍結機制提領申請時立即凍結金額 (balance -= amount, frozenBalance += amount)
審核拒絕拒絕時退回凍結金額 (balance += amount, frozenBalance -= amount)
審核通過核准後凍結金額不變,等待操作員匯款
完成出款匯款後上傳憑證,標記完成 (frozenBalance -= amount)
錢包驗證提領目標錢包需已通過審核 (status = 'approved')
地址快照提領時快照錢包地址,即使後續更改也不影響

VIP 相關

規則說明
只升不降投注觸發的等級變動永遠只向上
月度保級每月 1 號 01:00 檢查,未達保級門檻 relegationMissCount++
降級門檻連續 2 個月未達保級 → 降一級 (relegationMissCount >= 2)
保級鎖定vipHold = 1 時不降級(VIP 5+ 手動鎖定)
等級不限每站 VIP 等級數量不限(不硬編碼 15 級)
反水計算每日 00:05 結算,按用戶當前 VIP 等級 x 8 種遊戲類型計算
反水精度rebateAmount = truncateUsd(effectiveBet * rebateRate / 100)
跨站獨立VIP 等級和反水規則每站獨立配置

代理推廣相關

規則說明
三層限制代理綁定最多 3 層 (level1, level2, level3)
推廣碼上限每人最多 10 個推廣碼
帳號遮罩代理視角下線帳號使用 maskAccount() 遮罩中間字元
佣金計算基於下線淨輸 (net loss) 按各遊戲類型 x 代理等級費率計算
風控標記結算時自動檢測異常下線(新帳號大量投注、IP 重複等)
審核流程有風控標記的結算需人工審核,無標記的自動核准
日結/週結週結每週一 03:00,日結每日 03:30
提款三階段pending → approved → completed

遊戲相關

規則說明
風控檢查啟動遊戲前檢查 risk-game-blacklist(錯誤碼 5010)
封鎖優先序全封鎖 > 類型封鎖 > 特定遊戲封鎖
投注連鎖投注結算後同步觸發:VIP 重算、打碼量更新、任務進度
遊玩記錄遊戲啟動後非同步 UPSERT game-play-log(不阻塞主流程)
轉帳錢包遊戲內下注/派彩透過 S2S 回調更新用戶餘額
試玩模式部分遊戲支援未登入試玩(使用 OptionalJwtAuthGuard)

活動相關

規則說明
領取唯一性同一用戶同一活動只能領取一次 (UNIQUE 約束)
打碼量領取獎勵後需完成 reward * turnoverMultiplier 的投注才可提領
打碼權重Crypto 和 Fish 類型投注權重為 0.5,其他為 1.0
多語系內容title, description, content 均為多語系 JSON
圖片imgPc 和 imgMobile 分別為 PC 版和手機版橫幅
時間限制活動有 startDate / endDate,過期無法領取
條件觸發conditions.type 支援 any / first_deposit / deposit_amount

站內信相關

規則說明
發送對象支援全體用戶 / 特定用戶 / VIP 等級群組
已讀記錄notification-read 表記錄每個用戶的已讀狀態
未讀計數前端定期拉取未讀數量(badge 顯示)
多語系標題和內容均為多語系 JSON
刪除行為用戶端刪除為軟刪除(標記已讀),不刪除原始通知
自動通知支援 5 種自動通知(受 notificationConfig 控制)

任務系統相關

規則說明
進度更新存款後自動更新存款任務進度,投注後自動更新投注任務進度
週期重置每日/每週/每月任務各自獨立的 periodKey
領取條件進度 >= 目標值才可領取獎勵
領取唯一性同一任務同一週期只能領取一次 (UNIQUE 約束)
層級機制同類任務可設定多個 tier(低階到高階,獎勵遞增)

12.37 QA 測試重點清單

以下為各模組的 QA 測試重點,供測試團隊參考。

認證測試

  • [ ] 帳號註冊(正常流程 + 重複帳號 + 無效推廣碼)
  • [ ] 帳號登入(正常 + 錯誤密碼 + 停用帳號)
  • [ ] Google OAuth 登入(新用戶自動建立 + 舊用戶補綁)
  • [ ] Telegram 登入(新用戶自動建立)
  • [ ] 2FA 啟用/停用(QR Code → 驗證碼確認)
  • [ ] JWT Token 過期測試(7 天後失效)
  • [ ] Token Version 強制登出(修改密碼後驗證)
  • [ ] 多站點帳號隔離(不同 siteCode 相同帳號可共存)

存款測試

  • [ ] 法幣存款(ATM 流程完整測試)
  • [ ] 信用卡存款(建立訂單 + 回調確認)
  • [ ] 加密貨幣存款(USDT 流程)
  • [ ] 匯率快照正確性(訂單建立時固定)
  • [ ] 金額精度(decimal(18,6) 截斷驗證)
  • [ ] 重複回調冪等性測試
  • [ ] 金額範圍限制(min/max)
  • [ ] 任務進度自動更新驗證

提領測試

  • [ ] 正常提領流程(申請 → 審核 → 完成)
  • [ ] 餘額不足被拒絕
  • [ ] 凍結金額正確性(申請時凍結,拒絕時退回)
  • [ ] 錢包未審核不可提領
  • [ ] 地址快照驗證(提領後修改錢包不影響)
  • [ ] 匯款憑證上傳
  • [ ] 並行提領金額凍結一致性

VIP 測試

  • [ ] 投注累積自動升級
  • [ ] 只升不降規則驗證
  • [ ] 月度保級(未達標 + 連續 2 月降級)
  • [ ] VIP Hold 保級鎖定
  • [ ] 每日反水結算正確性
  • [ ] 反水精度(truncateUsd 驗證)
  • [ ] 跨站 VIP 獨立性
  • [ ] 模板帶入測試

多站點測試

  • [ ] Header 選「全部站點」時 Tab 正確顯示
  • [ ] Header 選獨立站點時 Tab 僅顯示該站
  • [ ] 站點切換時資料正確刷新
  • [ ] siteCode 篩選正確性(API level)
  • [ ] 「同預設站點」複製功能
  • [ ] 模板帶入僅影響當前站
  • [ ] AdminContentWrapper key remount 機制
  • [ ] x-site-code header 傳遞正確性

權限測試

  • [ ] root 群組全權限通過
  • [ ] super_admin 除 site-config 外全通過
  • [ ] general_admin 只有 read 權限
  • [ ] custom 群組依 permissions 設定
  • [ ] 未授權操作返回 403
  • [ ] 權限快取 60s TTL 測試

12.38 後端模組間依賴關係

以下列出後端各模組之間的依賴關係,幫助理解系統架構。

模組依賴圖

AppModule
├── AuthModule ← → AffiliateModule (forwardRef 循環依賴)
│   └── 依賴:JwtModule, CacheModule, SiteConfigModule

├── GameModule
│   ├── 子模組:BetSolutionsModule, RsgModule
│   ├── 依賴:AuthModule (用戶查詢), VipModule (等級重算), PromoModule (打碼量), MissionModule (任務進度)
│   └── 匯入:AdminModule (export AdminRiskService 用於遊戲封鎖檢查)

├── DepositModule ← → VendorModule (forwardRef 循環依賴)
│   └── 依賴:AuthModule (用戶餘額), MissionModule (存款任務進度)

├── VendorModule
│   ├── 子模組:WantongModule, UsdtModule
│   └── 依賴:DepositModule (訂單更新)

├── VipModule
│   ├── 依賴:AuthModule (用戶 VIP 等級更新), AffiliateModule (VIP 里程碑通知)
│   └── Cron:每日反水結算、月度保級檢查

├── AffiliateModule
│   ├── 5 個 Service:core, settlement, risk, withdrawal, alliance
│   ├── 依賴:AuthModule (用戶查詢)
│   └── Cron:週結、日結

├── PromoModule
│   └── 依賴:AuthModule (用戶餘額增減)

├── AdminModule
│   ├── 3 個 Service:admin, admin-report, admin-risk
│   ├── 依賴:幾乎所有其他模組(作為管理入口)
│   └── OnModuleInit:ensureDefaultAdmin()

├── SiteConfigModule
│   └── 被大多數模組依賴(站點設定查詢)

├── R2Module (@Global)
│   └── 被 AdminModule, SiteConfigModule 依賴(檔案上傳)

├── TimeModule (@Global)
│   └── 被所有使用時間的模組依賴

├── CommonModule
│   └── OnModuleInit:掃描 i18n 建構 ERROR_CODES

├── WalletModule
│   └── 聚合:BankCardModule, CreditCardModule, CryptoAddressModule

├── InboxModule
│   └── 依賴:AuthModule (用戶查詢)

├── WithdrawalModule
│   └── 依賴:AuthModule (餘額凍結/解凍), WalletModule (錢包驗證)

├── MissionModule
│   └── 依賴:AuthModule (用戶餘額增減)

├── LiveSportsModule
│   └── Cron:每 30 分鐘快取 API-Football 資料

├── RankingModule
│   └── 依賴:BetRecordModule (投注資料)

└── BetRecordModule
    └── 獨立模組(僅查詢)

循環依賴解決方式

循環依賴解決方式說明
AuthModule ↔ AffiliateModuleforwardRef(() => AffiliateModule)用戶註冊時需綁定代理,代理功能需查詢用戶
DepositModule ↔ VendorModuleforwardRef(() => VendorModule)存款建立需路由至金流商,金流商回調需更新存款訂單

全域模組

模組裝飾器說明
R2Module@Global()Cloudflare R2 檔案上傳,所有模組可直接注入 R2Service
TimeModule@Global()moment-timezone wrapper,所有模組可直接注入 TimeService
CacheModuleisGlobal: trueRedis/in-memory 快取,所有模組可直接注入 CACHE_MANAGER
ConfigModuleisGlobal: true環境變數,所有模組可直接注入 ConfigService
I18nModule-多語系,透過 I18nService 注入

12.39 API 分頁慣例

分頁參數

所有列表 API 統一使用以下分頁參數:

參數類型預設值說明
pagenumber1頁碼(從 1 開始)
pageSize / limitnumber20每頁筆數

分頁回應格式

json
{
  "items": [...],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "total": 156,
    "totalPages": 8
  }
}

parsePagination() 工具函數

後端使用 parsePagination(query) 正規化分頁參數:

Input:  { page: '2', pageSize: '30' }
Output: { skip: 30, take: 30, page: 2, pageSize: 30 }

Input:  { page: undefined, pageSize: undefined }
Output: { skip: 0, take: 20, page: 1, pageSize: 20 }

Input:  { page: '-1', pageSize: '0' }
Output: { skip: 0, take: 20, page: 1, pageSize: 20 }  (自動修正)

日期範圍篩選

後端使用 applyDateRange(qb, column, startDate, endDate) 工具函數:

applyDateRange(qb, 'order.createdAt', '2026-01-01', '2026-03-01')

生成 SQL:
  order.createdAt >= '2026-01-01 00:00:00'
  AND order.createdAt <= '2026-03-01 23:59:59'

12.40 R2 檔案儲存路徑慣例

R2 路徑結構

Cloudflare R2 的檔案路徑遵循以下慣例:

{sitePrefix}/
├── promos/                    # 活動橫幅圖片
│   ├── {promoId}/
│   │   ├── pc.jpg             # PC 版橫幅
│   │   └── mobile.jpg         # 手機版橫幅
├── avatars/                   # 用戶頭像/吉祥物
│   ├── mascot-01.png
│   ├── mascot-02.png
│   └── ...
├── domains/                   # 域名相關素材
│   ├── {hostname}/
│   │   ├── logo-small.png     # 小 Logo
│   │   ├── logo-big.png       # 大 Logo
│   │   └── favicon.ico        # Favicon
├── customer-service/          # 客服管道圖示
│   ├── line.png
│   ├── telegram.png
│   └── ...
├── withdrawals/               # 提領匯款憑證
│   ├── {orderId}/
│   │   └── proof.jpg
└── uploads/                   # 管理員上傳的其他檔案
    └── ...

R2 URL 產生

前端使用 useR2Url() composable / hook 產生完整的 R2 公開 URL:

R2_PUBLIC_URL + '/' + filePath
例如:https://cdn.c9.com/c9/promos/1/pc.jpg

檔案操作限制

操作限制說明
上傳大小10MB單檔最大上傳大小
允許格式jpg, jpeg, png, gif, webp, svg, ico圖片檔案
命名規則自動重新命名(避免衝突)使用 UUID 或 timestamp
日誌記錄所有操作記錄到 r2-operation-log含操作者、IP、UA

12.41 版本歷程

版本日期變更說明
v1.02026-03-01初版,涵蓋完整平台規格

文件結束

本文件涵蓋 C9 Entertainment City 平台的完整產品規格, 包含 3 個子專案、205+ 個 API 端點、49 張資料表、68 個後台頁面、20 個前台頁面的詳細規格說明。 全文共 12 章、41 個附錄小節。

如需更新,請同步修改本文件與相關子專案的 CLAUDE.md。

最後更新: