- Change "结果展示" to "投票结果" in global controls
- Add program edit modal with name, team, performer, remark fields
- Add move up/down buttons for program reordering
- Add delete program with confirmation
- Add "添加节目" button for creating new programs
- Add responsive styles for mobile view
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add OnboardingTour component with step-by-step guidance
- Add useOnboarding composable for state management
- Reset onboarding on logout for re-viewing
- 4 steps: welcome, award selection, program voting, progress
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Left: username + logout button (stacked)
- Center: page title
- Right: larger progress ring (56px)
- Remove connection status (shown in WeChat navbar)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move username to top-left position
- Center the page title
- Move logout button to bottom-left
- Show connection status with latency on top-right
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Program and Award tables to Prisma schema
- Update program-config.service to support database with JSON fallback
- Update ProgramCard.vue display logic for dynamic teamName/performer
- Add seed script to import data from JSON config
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add wechat-mp.service.ts for MP web authorization
- Add wechat-mp.routes.ts with /api/mp endpoints
- Update EntryQRCode.vue to show H5 URL QR code
- Update HomeView.vue with WeChat auth detection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update mobile HomeView to show WeChat scan login instructions
- Remove manual name/department input form from mobile client
- Add firework particle effects to big screen background
- Remove department field from login flow types
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add WeChat service for OAuth2 authentication flow
- Add WeChat routes (/api/wechat/login, /api/wechat/callback)
- Add WeChat types for login state and responses
- Update EntryQRCode component to support WeChat login
- Add WeChat config options (appId, appSecret, redirectUri)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## Changes
### Database Integration
- Add MySQL 8.0 service to docker-compose.yml
- Configure DATABASE_URL environment variable for server
- Add health check for MySQL service
- Create mysql_data volume for data persistence
### Dockerfile Improvements
- Generate Prisma Client in builder stage
- Copy Prisma Client from correct pnpm workspace location
- Ensure Prisma Client is available in production container
### Client-Mobile Fixes
- Remove deprecated StampDock.vue component
- Fix voting store API usage in VotingPage.vue
- Add type assertion for userTickets in connection.ts
- Add remark property to AwardConfig interface in voting.ts
## Testing
- All containers start successfully
- Database connection established
- Redis connection working
- 94 participants restored from Redis
- Vote data synced (20 votes)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add emit('stateChange') to notify frontend clients when
lottery round is redrawn, so UI updates correctly.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Convert stats-section to collapsible details element
- Add expand/collapse indicator (▶/▼)
- Save screen space on mobile devices
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add redrawCurrentRound() method to clear current round winners
- Add /api/admin/lottery/redraw API endpoint
- Rename "重置" to "重置本轮" (reset current round state only)
- Add "重抽本轮" button (clear winners and allow re-draw)
- Rename "紧急操作" to "数据管理" with clearer button labels
- Change "高级清理" to collapsible "开发者选项"
- Update confirmation modal text for clarity
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The default configuration was missing poolTag for all rounds,
causing the lottery to draw from all participants instead of
filtering by generation/zodiac tags when prizes.json fails to load.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add server Dockerfile with multi-stage build
- Add frontend Dockerfile with Nginx
- Add docker-compose.yml for orchestration
- Add Nginx config with SSL support
- Add deployment documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Auto-play lottery music when storm starts
- Auto-play fanfare when winners revealed
- Auto-stop music when lottery completes
- Add EventEmitter to broadcast async state changes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add click-to-unlock overlay on big screen
- Play silent audio to unlock browser audio context
- Show unlock prompt before allowing audio playback
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add audio player to display store with play/stop functions
- Listen for music state changes from AdminState sync
- Support bgm, lottery, and fanfare audio tracks
- Create audio directory structure
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add getStats() method to participantService for tag distribution
- Update participants API to return tagDistribution statistics
- Load existing participants on AdminControl mount
- Add mobile responsive styles for import section
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add scan login service with Redis-based token management
- Add scan login API routes for token generation and validation
- Add QRCodeLogin component for PC-side QR code display
- Add EntryQRCode component for mass login scenarios
- Add ScanLoginView for mobile-side login form
- Add localStorage persistence for user identity
- Add logout functionality to mobile client
- Add auto-redirect for logged-in users
- Add admin console control for QR code display on big screen
- Add socket event forwarding from admin to screen display
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Change all big screen backgrounds to pure Chinese red (#c41230)
- Remove vignette effect for consistent display on different screens
- Unify all prize data to match prizes.json configuration
- Add demo participants fallback when no data imported
- Fix particle visibility reset in startGalaxy()
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix ES module import issue in admin.service.ts (require -> import)
- Fix lottery reveal ghosting by hiding name particles on complete
- Add participant import from Excel with tag calculation
- Add prize configuration service with JSON persistence
- Constrain winners overlay to scroll area dimensions
- Fix macOS lsof syntax in stop script
- Add HorseRace view and renderer (WIP)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update AdminControl.vue with improved controls
- Enhance VoteResultsView.vue with better display
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add PostcardItem.vue component with Chinese postal aesthetics
- Add PostcardGrid.vue container with 4x2 CSS Grid layout
- Add Postmark.vue component for real-time vote stamp visualization
- Update LiveVotingView.vue with cream paper theme (#FDFBF7)
- Add Year of the Horse 2026 stamp image
- Add responsive breakpoints for different screen sizes
- Enhance admin service with program voting control
- Add vote stamp accumulation for big screen display
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>