登山管理平台。成員可瀏覽年度攀登行程、檢視山岳簡介、註冊活動、簽署數位免責聲明、提交 GCash 付款,並追蹤註冊情況。管理員可管理攀登、審核註冊、驗證付款、統計交通人數,等等。
AI 翻譯
Climb management portal. Members browse the annual climb schedule, view mountain profiles, register for events, sign digital waivers, submit GCash payments, and track their registrations. Administrators manage climbs, review registrations, verify payments, track transportation headcounts, and all.
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Event management portal for the Metropolitan Mountaineering Society (MMS). Members browse the annual climb schedule, view mountain profiles, register for events, sign digital waivers, submit GCash payments, and track their registrations. Administrators manage climbs, review registrations, verify payments, track transportation headcounts, and manage user accounts.檢視完整 README ↗Event management portal for the Metropolitan Mountaineering Society (MMS), reused each season with a new set of climbs. Members browse the schedule, view mountain profiles, register (or join a waitlist), sign digital waivers, submit GCash payments and required documents, and track their climbs. Administrators manage climbs, review registrations, verify payments, track climb money and service headcounts, and manage user accounts.
graph TB
subgraph Browser["User Browser"]
SPA["React SPA\n(Vite + React 19)"]
end
subgraph Firebase["Firebase Platform"]
FH["Firebase Hosting\n(CDN)"]
FA["Firebase Auth\n(Email + Google)"]
FS["Cloud Firestore\n(openclimbs DB)"]
ST["Firebase Storage\n(photos, proofs)"]
CF["Cloud Functions v2\n(Node 22)"]
end
subgraph External["External"]
BV["Brevo\n(Email)"]
end
SPA -->|served from| FH
SPA --> FA
SPA --> FS
SPA --> ST
SPA --> CF
FS -->|document triggers| CF
CF --> BV
| Layer | Technology |
|---|---|
| Frontend | React 19, Vite 8, React Router 7 |
| Hosting | Firebase Hosting |
| Database | Cloud Firestore (openclimbs DB) |
| Authentication | Firebase Auth (Email + Google) |
| Storage | Firebase Storage |
| Backend Functions | Cloud Functions v2 (Node 22) |
| Transactional Email | Brevo SMTP API |
| Testing (Frontend) | Vitest, Testing Library |
| Testing (Functions) | Jest |
failedRequests error logsequenceDiagram
autonumber
actor M as Member
participant SPA as React App
participant ST as Firebase Storage
participant FS as Firestore
participant CF as Cloud Functions
participant EM as Brevo Email
actor AD as Admin
M->>SPA: Browse schedule, select climb
M->>SPA: Sign in (Email or Google)
M->>SPA: Fill registration form, select fees, sign waiver
M->>SPA: (optional) Scan GCash QR, pay, upload receipt
SPA->>ST: Upload GCash proof / documents
ST-->>SPA: file URLs
SPA->>FS: Create registration {status: pending, paymentStatus: submitted | unpaid}
FS-->>M: My Climbs — pending
FS->>CF: onRegistrationCreated trigger
CF->>FS: Increment registrationCount (auto-waitlist when full)
CF->>EM: Confirmation email to member + officer notification
EM-->>M: Registration Received email with waiver link
AD->>FS: Review GCash proof in Admin > Payments
AD->>FS: Set paymentStatus = verified
AD->>FS: Review registration in Admin > Climbs
AD->>FS: Update status = confirmed / waitlisted / cancelled
FS->>CF: onRegistrationUpdated trigger
CF->>EM: Status update email to member
EM-->>M: Status email
src/
pages/ route screens; page-only parts in pages/event, pages/register, pages/admin/climbForm
components/ shared UI (Modal, TextField, AuthLayout, …)
contexts/ hooks/ auth state and reusable hooks
services/ the only code that talks to Firebase (ADR 0004)
utils/ pure domain logic (fees, payments, schedules)
data/ styles/ static content, design tokens
public/ static files served as-is at / (icons, manifest, logo)
functions/ Cloud Functions: src/{triggers,scheduled,callables,email,shared}, tests/, scripts/
firebase/ Firestore/Storage rules and indexes, CORS, storage lifecycle
tests/ unit, component, accessibility, integration, e2e, performance
scripts/ CLI helpers that use the web API key from .env
tools/ configs for dependency-cruiser, jscpd, secretlint, semantic-release; the CSS-collision
check and the inline-style ratchet list (knip's config lives in package.json)
docs/ guides/ (what it is) · solution-plans/ (how we deliver) · adr/ (why)
The root keeps only what a tool must find there: package.json, the Vite,
ESLint, editor and Firebase configs, index.html (Vite's entry), CONTEXT.md
(read by the domain-modeling skill) and skills-lock.json.
npm install && npm --prefix functions install
cp .env.example .env # fill in VITE_FIREBASE_*
npm run dev # http://localhost:5173
npm run qa # every quality gate, as CI runs it
Emulators, admin setup and the workflow: CONTRIBUTING.md.
Deploys happen from CI on push to develop: DEPLOYMENT.md.
| Question | Read |
|---|---|
| How is it built? | ARCHITECTURE · DATA · API · SECURITY |
| How do I work on it? | CONTRIBUTING · TESTING · CODE-QUALITY · TROUBLESHOOTING |
| How do I use it? | USER_MANUAL |
| How do we deliver it? | docs/solution-plans/ — web plan, release notes, quality harness |
| Why is it like this? | docs/adr/ |
| What do the words mean? | CONTEXT.md — domain glossary |