- 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>
- README.md: update scan login section to reflect WeChat OAuth flow
- DEPLOY.md: add WeChat environment variables configuration
- 联调测试方案.md: update test case A01 for new login flow
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>
## Changes
### Docker Compose Configuration
- Add WECHAT_APP_ID environment variable to server service
- Add WECHAT_APP_SECRET environment variable to server service
- Add WECHAT_REDIRECT_URI environment variable to server service
## Purpose
Enable WeChat Open Platform QR code login functionality by passing
WeChat credentials from .env file to the server container.
## Testing
- All containers started successfully
- Server loaded configuration correctly
- WeChat login endpoints are now available
Co-Authored-By: Claude Sonnet 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
### Program Configuration
- Update programs.json with actual program names:
- 节目一:青苹果乐园
- 节目二:五百年桑田沧海
- 节目三:我的中国心
- 节目四:萍聚
- 节目五:追光而行,共赴新程
- 节目六:粉红色的回忆
- 节目七:敬业狂想曲
### Dockerfile Update
- Add config directory copy to Dockerfile
- Ensure program configuration is included in production build
Co-Authored-By: Claude Sonnet 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 Caddyfile with automatic HTTPS configuration
- Add Dockerfile.caddy for frontend build with Caddy
- Update docker-compose.yml to use Caddy service
- Update DEPLOY.md with simplified deployment instructions
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>
Admin Control Panel:
- Add full AdminControl.vue with 3 sections (Voting, Lottery, Global)
- Add AdminLogin.vue with access code gate (20268888)
- Add admin.ts store with state persistence
- Add admin.types.ts with state machine types
- Add router guards for /admin/director-console
Voting System Fixes:
- Add voting status check before accepting votes (VOTING_CLOSED error)
- Fix client to display server error messages
- Fix button disabled logic to prevent ambiguity in paused state
- Auto-generate userId on connect to fix UNAUTHORIZED error
Big Screen Enhancements:
- Add LiveVotingView.vue with particle system
- Add LotteryMachine.ts with 3-stage animation (Galaxy/Storm/Reveal)
- Add useSocketClient.ts composable
- Fix MainDisplay.vue SCSS syntax error
- Add admin state sync listener in display store
Server Updates:
- Add admin.service.ts for state management
- Add isVotingOpen() and getVotingStatus() methods
- Add admin socket event handlers
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>