feat: initialize Annual Gala Interactive System monorepo

- Set up pnpm workspace with 4 packages: shared, server, client-mobile, client-screen
- Implement Redis atomic voting with Lua scripts (HINCRBY + distributed lock)
- Add optimistic UI with IndexedDB queue for offline resilience
- Configure Socket.io with auto-reconnection (infinite retries)
- Separate mobile (Vant) and big screen (Pixi.js) dependencies

Tech stack:
- Frontend Mobile: Vue 3 + Vant + Socket.io-client
- Frontend Screen: Vue 3 + Pixi.js + GSAP
- Backend: Express + Socket.io + Redis + Prisma/MySQL

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
empty
2026-01-15 01:19:36 +08:00
commit e7397d22a9
74 changed files with 14088 additions and 0 deletions

View File

@@ -0,0 +1,57 @@
import { Router, IRouter } from 'express';
const router: IRouter = Router();
/**
* GET /api/admin/stats
* Get system statistics
*/
router.get('/stats', async (_req, res, next) => {
try {
// TODO: Implement admin stats
return res.json({
success: true,
data: {
totalUsers: 0,
totalVotes: 0,
activeConnections: 0,
},
});
} catch (error) {
next(error);
}
});
/**
* POST /api/admin/draw/start
* Start a lucky draw
*/
router.post('/draw/start', async (_req, res, next) => {
try {
// TODO: Implement draw start
return res.json({
success: true,
message: 'Draw started',
});
} catch (error) {
next(error);
}
});
/**
* POST /api/admin/draw/stop
* Stop the current draw
*/
router.post('/draw/stop', async (_req, res, next) => {
try {
// TODO: Implement draw stop
return res.json({
success: true,
message: 'Draw stopped',
});
} catch (error) {
next(error);
}
});
export default router;