YD-WEB/public/competition/default-avatar.svg
ltx 84b7b0f893 feat(website): add competition results and service deployment
- Add the event results page with schedule, rankings, Battle bracket, athletes, records, bilingual labels, and navigation entry.
- Add the read/write competition data service, a complete Excel example, empty public state, and validation smoke tests.
- Handle Furion statusCode/data responses from the production API and retain static fallback for the public page.
- Document Docker sidecar deployment beside test_eventapi, persistent storage, private admin access, Nginx routing, and OSS asset rewriting.

Verification:
- node server/competition-api.smoke.mjs
- node scripts/competition-response-test.mjs
- node scripts/battle-layout-test.mjs
- npm run build -- --base=https://assets.example.test/static/test/
- npm run rewrite:oss -- https://assets.example.test/static/test/
- Production /api/competition/state returned HTTP 200 after the sidecar started.

Deployment note: publish the updated YD-WEB static build before public results can consume the unwrapped API response. The event remains unpublished until an administrator saves and publishes data.
2026-10-20 13:38:23 +08:00

2 lines
461 B
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 500" role="img" aria-label="暂无照片"><rect width="400" height="500" fill="#242824"/><circle cx="200" cy="180" r="74" fill="#4b5149"/><path d="M63 449c10-98 57-153 137-153s127 55 137 153" fill="#4b5149"/><path d="M32 32h336v436H32z" fill="none" stroke="#8f9b87" stroke-width="2"/><text x="200" y="477" fill="#d6dfd0" font-family="sans-serif" font-size="18" text-anchor="middle">NO PHOTO</text></svg>