# 平台搭建设计方案 ## 一、技术选型确认 ### 后端技术栈 - **语言**:Go 1.21+ LTS - **Web框架**:Gin - **ORM**:GORM - **数据库**:MySQL 8.0 - **配置管理**:Viper - **日志**:Zap - **JWT**:golang-jwt/jwt - **参数验证**:go-playground/validator - **实时通信**:HTTP长轮询(暂不用WebSocket) ### 前端技术栈 - **框架**:Vue 3.4+ - **构建工具**:Vite - **状态管理**:Pinia - **HTTP客户端**:Axios - **管理后台UI**:Element Plus - **移动端UI**:Vant - **动画**:Canvas 2D ### 部署环境 - **云服务**:阿里云ECS(2核4G) - **Web服务器**:Nginx - **数据库**:MySQL 8.0 - **容器化**:Docker Compose(开发环境) --- ## 二、模块边界划分 ### 后端模块 1. **api层**:HTTP路由和控制器 2. **model层**:数据模型定义 3. **service层**:业务逻辑处理 4. **repository层**:数据访问层 5. **middleware层**:中间件(CORS、Auth、Logger、RateLimit) 6. **pkg层**:工具包(JWT、密码、验证、响应) 7. **config层**:配置管理 ### 前端模块(3个独立项目) 1. **admin**:管理后台 2. **screen**:大屏幕展示 3. **mobile**:移动端H5 --- ## 三、文件清单与职责 ### 后端文件结构 ``` backend/ ├── cmd/ │ └── server/ │ └── main.go # 程序入口,初始化配置、数据库、路由 ├── internal/ │ ├── api/ │ │ ├── v1/ │ │ │ ├── auth.go # 认证相关接口 │ │ │ ├── activity.go # 活动管理接口 │ │ │ ├── checkin.go # 签到接口 │ │ │ ├── danmaku.go # 弹幕接口 │ │ │ ├── lottery.go # 抽奖接口 │ │ │ ├── moneygame.go # 数钱游戏接口 │ │ │ └── order.go # 订单接口 │ │ └── router.go # 路由配置 │ ├── model/ │ │ ├── user.go # 用户模型 │ │ ├── activity.go # 活动模型 │ │ ├── checkin.go # 签到模型 │ │ ├── danmaku.go # 弹幕模型 │ │ ├── lottery.go # 抽奖模型 │ │ ├── moneygame.go # 数钱游戏模型 │ │ └── order.go # 订单模型 │ ├── service/ │ │ ├── auth.go # 认证业务逻辑 │ │ ├── activity.go # 活动业务逻辑 │ │ ├── checkin.go # 签到业务逻辑 │ │ ├── danmaku.go # 弹幕业务逻辑 │ │ ├── lottery.go # 抽奖业务逻辑 │ │ ├── moneygame.go # 数钱游戏业务逻辑 │ │ └── order.go # 订单业务逻辑 │ ├── repository/ │ │ ├── user.go # 用户数据访问 │ │ ├── activity.go # 活动数据访问 │ │ ├── checkin.go # 签到数据访问 │ │ ├── danmaku.go # 弹幕数据访问 │ │ ├── lottery.go # 抽奖数据访问 │ │ ├── moneygame.go # 数钱游戏数据访问 │ │ └── order.go # 订单数据访问 │ ├── middleware/ │ │ ├── cors.go # 跨域中间件 │ │ ├── auth.go # 认证中间件 │ │ ├── logger.go # 日志中间件 │ │ └── rate_limit.go # 限流中间件 │ ├── pkg/ │ │ ├── jwt.go # JWT工具 │ │ ├── password.go # 密码加密工具 │ │ ├── validator.go # 参数验证工具 │ │ └── response.go # 统一响应格式 │ └── config/ │ └── config.go # 配置加载和管理 ├── config/ │ ├── config.yaml # 开发环境配置 │ └── config.prod.yaml # 生产环境配置 ├── scripts/ │ ├── build.sh # 构建脚本 │ └── deploy.sh # 部署脚本 ├── go.mod └── go.sum ``` ### 前端文件结构(admin示例) ``` frontend/admin/ ├── public/ │ └── favicon.ico ├── src/ │ ├── api/ # API接口定义 │ │ ├── auth.js │ │ ├── activity.js │ │ ├── checkin.js │ │ ├── danmaku.js │ │ ├── lottery.js │ │ ├── moneygame.js │ │ └── order.js │ ├── assets/ # 静态资源 │ ├── components/ # 公共组件 │ ├── router/ # 路由配置 │ ├── stores/ # Pinia状态管理 │ ├── utils/ # 工具函数 │ ├── views/ # 页面视图 │ │ ├── auth/ │ │ ├── activity/ │ │ ├── checkin/ │ │ ├── lottery/ │ │ └── moneygame/ │ ├── App.vue │ └── main.js ├── .env.development # 开发环境变量 ├── .env.production # 生产环境变量 ├── index.html ├── package.json └── vite.config.js ``` --- ## 四、核心数据结构定义 ### 配置结构 ```go type Config struct { Server ServerConfig Database DatabaseConfig JWT JWTConfig Log LogConfig } type ServerConfig struct { Port string Mode string // debug/release } type DatabaseConfig struct { Host string Port string User string Password string DBName string } type JWTConfig struct { Secret string Expire int // hours } type LogConfig struct { Level string Output string } ``` ### 统一响应格式 ```go type Response struct { Code int `json:"code"` Message string `json:"message"` Data interface{} `json:"data,omitempty"` } ``` --- ## 五、核心接口定义 ### 认证接口 - `POST /api/v1/auth/register` - 用户注册 - `POST /api/v1/auth/login` - 用户登录 ### 活动接口(需认证) - `POST /api/v1/activity` - 创建活动 - `GET /api/v1/activity` - 获取活动列表 - `GET /api/v1/activity/:id` - 获取活动详情 - `PUT /api/v1/activity/:id` - 更新活动 - `DELETE /api/v1/activity/:id` - 删除活动 ### 签到接口 - `POST /api/v1/mobile/checkin` - 扫码签到(公开) - `GET /api/v1/activity/:activityId/checkin` - 获取签到列表(需认证) - `GET /api/v1/activity/:activityId/checkin/export` - 导出签到列表(需认证) ### 弹幕接口 - `POST /api/v1/mobile/danmaku` - 发送弹幕(公开) - `GET /api/v1/mobile/danmaku/:activityId` - 获取弹幕列表(公开,长轮询) ### 抽奖接口 - `POST /api/v1/activity/:activityId/lottery` - 创建抽奖(需认证) - `GET /api/v1/activity/:activityId/lottery` - 获取抽奖列表(需认证) - `POST /api/v1/activity/:activityId/lottery/:id/draw` - 执行抽奖(需认证) - `GET /api/v1/activity/:activityId/lottery/:id/winners` - 获取中奖名单(需认证) ### 数钱游戏接口 - `POST /api/v1/activity/:activityId/moneygame` - 创建游戏(需认证) - `GET /api/v1/activity/:activityId/moneygame` - 获取游戏列表(需认证) - `POST /api/v1/activity/:activityId/moneygame/:id/start` - 开始游戏(需认证) - `POST /api/v1/mobile/moneygame/:id/tap` - 点击数钱(公开) - `GET /api/v1/activity/:activityId/moneygame/:id/rank` - 获取排名(公开) ### 订单接口 - `POST /api/v1/order` - 创建订单(需认证) - `GET /api/v1/order` - 获取订单列表(需认证) - `POST /api/v1/order/:id/pay` - 支付订单(需认证) --- ## 六、数据库表创建顺序 1. **users** - 用户表(基础表) 2. **activities** - 活动表(依赖users) 3. **checkins** - 签到表(依赖activities) 4. **danmakus** - 弹幕表(依赖activities) 5. **lotteries** - 抽奖表(依赖activities) 6. **lottery_winners** - 中奖记录表(依赖lotteries和checkins) 7. **money_games** - 数钱游戏表(依赖activities) 8. **money_game_records** - 游戏记录表(依赖money_games和checkins) 9. **orders** - 订单表(依赖users和activities) --- ## 七、任务拆分 ### 阶段1:后端项目初始化 1. 创建backend目录 2. 初始化Go模块(go mod init) 3. 创建项目目录结构(cmd/internal/config/scripts) 4. 安装依赖包(gin, gorm, viper, zap, jwt等) 5. 创建配置文件(config.yaml和config.prod.yaml) 6. 实现配置加载功能(internal/config/config.go) 7. 实现日志初始化功能(使用Zap) 8. 实现统一响应格式工具(internal/pkg/response.go) 9. 实现JWT工具(internal/pkg/jwt.go) 10. 实现密码加密工具(internal/pkg/password.go) 11. 实现参数验证工具(internal/pkg/validator.go) ### 阶段2:数据库初始化 1. 创建数据库(live_cloud) 2. 实现数据库连接初始化(internal/config/config.go中添加InitDB函数) 3. 创建用户模型(internal/model/user.go) 4. 创建活动模型(internal/model/activity.go) 5. 创建签到模型(internal/model/checkin.go) 6. 创建弹幕模型(internal/model/danmaku.go) 7. 创建抽奖模型(internal/model/lottery.go) 8. 创建中奖记录模型(internal/model/lottery_winner.go) 9. 创建数钱游戏模型(internal/model/moneygame.go) 10. 创建游戏记录模型(internal/model/moneygame_record.go) 11. 创建订单模型(internal/model/order.go) 12. 实现数据库自动迁移(在main.go中调用AutoMigrate) ### 阶段3:中间件开发 1. 实现CORS中间件(internal/middleware/cors.go) 2. 实现认证中间件(internal/middleware/auth.go) 3. 实现日志中间件(internal/middleware/logger.go) 4. 实现限流中间件(internal/middleware/rate_limit.go) ### 阶段4:Repository层开发 1. 实现用户Repository(internal/repository/user.go) 2. 实现活动Repository(internal/repository/activity.go) 3. 实现签到Repository(internal/repository/checkin.go) 4. 实现弹幕Repository(internal/repository/danmaku.go) 5. 实现抽奖Repository(internal/repository/lottery.go) 6. 实现数钱游戏Repository(internal/repository/moneygame.go) 7. 实现订单Repository(internal/repository/order.go) ### 阶段5:Service层开发 1. 实现认证Service(internal/service/auth.go) 2. 实现活动Service(internal/service/activity.go) 3. 实现签到Service(internal/service/checkin.go) 4. 实现弹幕Service(internal/service/danmaku.go) 5. 实现抽奖Service(internal/service/lottery.go) 6. 实现数钱游戏Service(internal/service/moneygame.go) 7. 实现订单Service(internal/service/order.go) ### 阶段6:API层开发 1. 实现路由配置(internal/api/router.go) 2. 实现认证接口(internal/api/v1/auth.go) 3. 实现活动接口(internal/api/v1/activity.go) 4. 实现签到接口(internal/api/v1/checkin.go) 5. 实现弹幕接口(internal/api/v1/danmaku.go) 6. 实现抽奖接口(internal/api/v1/lottery.go) 7. 实现数钱游戏接口(internal/api/v1/moneygame.go) 8. 实现订单接口(internal/api/v1/order.go) ### 阶段7:主程序入口 1. 实现main.go(cmd/server/main.go) 2. 加载配置 3. 初始化日志 4. 初始化数据库 5. 设置路由 6. 启动HTTP服务器 ### 阶段8:前端项目初始化(3个独立项目) 1. 创建frontend目录 2. 初始化admin项目(npm create vite@latest) 3. 安装admin依赖(vue-router, pinia, axios, element-plus) 4. 创建admin项目目录结构(src/api, src/components, src/router, src/stores, src/views, src/utils) 5. 初始化screen项目(npm create vite@latest) 6. 安装screen依赖(vue-router, pinia, axios) 7. 创建screen项目目录结构 8. 初始化mobile项目(npm create vite@latest) 9. 安装mobile依赖(vue-router, pinia, axios, vant) 10. 创建mobile项目目录结构 ### 阶段9:前端基础配置 1. 配置Vite(vite.config.js) 2. 配置环境变量(.env.development和.env.production) 3. 配置Axios(src/utils/request.js) 4. 配置路由(src/router/index.js) 5. 配置Pinia(src/stores/index.js) 6. 配置Element Plus(admin项目) 7. 配置Vant(mobile项目) ### 阶段10:Docker开发环境 1. 创建docker-compose.yml 2. 配置MySQL服务 3. 创建启动脚本 ### 阶段11:构建和部署脚本 1. 创建后端构建脚本(scripts/build.sh) 2. 创建后端部署脚本(scripts/deploy.sh) 3. 配置前端打包(vite build) --- ## 八、配置文件模板 ### config.yaml(开发环境) ```yaml server: port: "8080" mode: "debug" database: host: "localhost" port: "3306" user: "root" password: "123456" dbname: "live_cloud" jwt: secret: "your-secret-key-change-in-production" expire: 24 log: level: "debug" output: "stdout" ``` ### config.prod.yaml(生产环境) ```yaml server: port: "8080" mode: "release" database: host: "your-mysql-host" port: "3306" user: "your-mysql-user" password: "your-mysql-password" dbname: "live_cloud" jwt: secret: "your-production-secret-key" expire: 24 log: level: "info" output: "file" ``` ### docker-compose.yml ```yaml version: '3.8' services: mysql: image: mysql:8.0 container_name: live_cloud_mysql environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: live_cloud ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql volumes: mysql_data: ``` --- ## 九、注意事项 1. **编码规范**:使用`gofmt`格式化Go代码,使用ESLint和Prettier格式化前端代码 2. **日志记录**:在关键操作处添加日志记录,便于问题排查 3. **错误处理**:统一错误处理和响应格式 4. **参数验证**:所有输入参数都需要验证 5. **安全防护**: - 密码使用BCrypt加密 - JWT Token有效期控制 - SQL注入防护(使用GORM参数化查询) - XSS防护(前端输入过滤) 6. **性能优化**: - 数据库查询使用索引 - 避免N+1查询 - 合理使用连接池 7. **测试**:后续需要添加单元测试和集成测试 --- **记录时间**:2026年1月31日 **状态**:待确认