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,121 @@
<script setup lang="ts">
import { useRouter } from 'vue-router';
const router = useRouter();
function goBack() {
router.push('/');
}
</script>
<template>
<div class="admin-control">
<header class="header">
<button class="back-btn" @click="goBack"> 返回</button>
<h1 class="title">管理控制台</h1>
</header>
<main class="content">
<div class="control-panel">
<h2>抽奖控制</h2>
<div class="controls">
<button class="control-btn">开始抽奖</button>
<button class="control-btn danger">停止抽奖</button>
</div>
</div>
<div class="control-panel">
<h2>显示模式</h2>
<div class="controls">
<button class="control-btn">待机画面</button>
<button class="control-btn">投票结果</button>
<button class="control-btn">抽奖画面</button>
</div>
</div>
</main>
</div>
</template>
<style lang="scss" scoped>
@import '../assets/styles/variables.scss';
.admin-control {
width: 100%;
height: 100%;
background: #1a1a1a;
color: white;
}
.header {
display: flex;
align-items: center;
gap: 20px;
padding: 20px 30px;
border-bottom: 1px solid #333;
.back-btn {
background: none;
border: 1px solid #666;
color: #999;
padding: 8px 16px;
border-radius: 4px;
cursor: pointer;
&:hover {
border-color: #999;
color: white;
}
}
.title {
font-size: 24px;
}
}
.content {
padding: 30px;
display: flex;
flex-direction: column;
gap: 30px;
}
.control-panel {
background: #222;
border-radius: 8px;
padding: 20px;
h2 {
font-size: 18px;
margin-bottom: 16px;
color: #999;
}
.controls {
display: flex;
gap: 12px;
}
.control-btn {
padding: 12px 24px;
background: #333;
border: 1px solid #444;
color: white;
border-radius: 6px;
cursor: pointer;
transition: all 0.2s;
&:hover {
background: #444;
}
&.danger {
border-color: #ff4d4f;
color: #ff4d4f;
&:hover {
background: rgba(#ff4d4f, 0.1);
}
}
}
}
</style>