a620906209 43720482c4
Run Tests / test (pull_request) Successful in 2m3s
feat(verification): 教練審核流程完整版——狀態機/證照送審/Admin 裁決/通知
實作 openspec change provider-verification-workflow(25/25 tasks):
- is_verified 升級為 verification_status 四狀態機(unsubmitted/pending/
  approved/rejected),migration 自動轉換既有資料,API 以 accessor 保留
  is_verified 相容輸出
- 教練端:證照上傳(≤3 張、複用 CompressesImages)、送審、駁回原因
  顯示與重送(/coach/verification 新頁面)
- Admin 端:審核佇列、通過/駁回(原因必填)、撤銷 approved;移除
  toggle-verified 端點(防繞過狀態機);裁決後 flush 課程快取
- 通知:審核通過/駁回(站內+Email,駁回含原因)
- 可見性與預約入口改判 approved(行為等價)
- 測試 +18(ProviderVerificationTest 10、AdminVerificationTest 8),
  既有 4 個測試檔 helper 遷移;Swagger 同步
- 規格同步:provider-verification 全面改寫、admin-user-management
  toggle 段落改為移除聲明

容器內全套件 173 passed / 439 assertions。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:26:12 +08:00
2025-05-12 01:22:09 +08:00
2025-05-11 03:45:17 +08:00
2026-05-29 02:29:00 +08:00
2025-05-11 03:45:17 +08:00
2025-05-11 03:45:17 +08:00
2025-05-11 03:45:17 +08:00
2025-05-11 03:45:17 +08:00
2025-05-11 03:45:17 +08:00
2025-05-11 03:45:17 +08:00

CFDive Platform

潛水課程媒合平台 — 連結潛水教練與學員,提供課程瀏覽、線上預約、即時訊息、評價與通知等完整服務。


功能概覽

會員(Member

  • 註冊 / 登入(Email + Google OAuth
  • 瀏覽、搜尋、篩選潛水課程
  • 查看課程時段並送出預約
  • 與教練即時訊息(文字 + 圖片,含已讀回執)
  • 對完成的課程留下評價(支援匿名、有幫助投票)
  • 站內通知(Bell Icon 即時更新 + 瀏覽器推播)

教練(Provider

  • 課程 CRUD(含封面 + 相簿圖片上傳)
  • 課程時段管理
  • 預約管理(確認 / 拒絕 / 完成 / 取消)
  • 與學員即時訊息

管理員(Admin

  • 平台統計數據(會員數、教練數、課程數)
  • 會員與教練帳號管理(啟用 / 停用 / 審核)
  • 課程、預約、評價管理

技術棧

層級 技術
後端 PHP 8.x / Laravel 11
前端 Vue 3 + Vite + Tailwind CSS
資料庫 MySQL 8.0
快取 Redis
即時通訊 Laravel ReverbWebSocketwss://ws.hank-space.com
認證 Laravel Sanctum + Google OAuth
容器 Docker / Docker Compose
API 文件 Swagger UIl5-swagger
錯誤監控 Sentry
CI/CD Gitea Actions(自動部署至 VPS

API 文件

共 73 個端點,涵蓋:

  • 認證(Email + Google OAuth
  • 公開課程查詢
  • 會員預約 / 訊息 / 評價 / 通知
  • 教練課程 / 時段 / 預約管理
  • 管理員後台

健康檢查

GET /health

回傳 DB、Redis、Cache 狀態,供 UptimeRobot 監控使用。全部正常回 200,任一異常回 503。


本地開發

啟動

docker compose up -d
服務 URL
API / 前端 http://localhost:8080
phpMyAdmin http://localhost:8081
Mailpit http://localhost:8025
Reverb WebSocket ws://localhost:8085

環境設定

複製 .env.example.env,填入以下必要值:

REVERB_APP_KEY=        # 32 字元隨機字串
REVERB_APP_SECRET=     # 32 字元隨機字串
SENTRY_LARAVEL_DSN=    # Sentry DSN(留空則停用)
S
Description
No description provided
Readme 1.9 MiB
Languages
PHP 71.1%
Vue 17.3%
HTML 4.1%
Blade 4.1%
JavaScript 2.8%
Other 0.6%