# 羽动俱乐部 - 羽毛球/网球俱乐部管理系统 一个完整的羽毛球/网球俱乐部会员管理系统,包含微信小程序端和后台管理界面。 ## 项目结构 ``` yingsha/ ├── server/ # Node.js 后端服务 ├── admin/ # Vue3 后台管理界面 ├── miniprogram/ # 微信小程序 └── README.md ``` ## 技术栈 - **后端**: Node.js + Express + Sequelize + MySQL + WebSocket - **管理后台**: Vue 3 + Element Plus + Pinia + Vite - **小程序**: 原生微信小程序 ## 功能特性 ### 小程序端 - 用户自动注册,生成唯一会员码 - 天梯排名系统(按战力值排序,区分男女) - 挑战赛(扫码发起挑战,实时通知) - 排位赛(单循环赛制,自动匹配,淘汰赛) - 积分商城(兑换商品,二维码核销) - 多门店支持 ### 后台管理 - 用户管理(超级管理员) - 门店管理(多门店) - 天梯用户管理(等级、战力值) - 比赛管理(挑战赛、排位赛) - 积分行为管理(扫码加分) - 积分商品管理 - 兑换订单管理(扫码核销) - 系统用户管理(权限控制) ## 快速开始 ### 1. 后端服务 ```bash cd server # 安装依赖 npm install # 配置环境变量 copy env-template.txt .env # Windows # cp env-template.txt .env # Linux/Mac # 编辑 .env 文件,填入实际配置 # 初始化数据库(首次运行) npm run db:init # 启动服务 npm run dev ``` ## 环境变量配置 在 `server` 目录下创建 `.env` 文件,配置以下参数: ### 必需配置 | 参数 | 说明 | 示例 | | ------------- | ------------------------------ | -------------------- | | `DB_PASSWORD` | MySQL 数据库密码 | `your_password` | | `JWT_SECRET` | JWT 签名密钥(建议 32 位以上) | `a1b2c3d4...` | | `WX_APPID` | 微信小程序 AppID | `wx1234567890abcdef` | | `WX_SECRET` | 微信小程序 AppSecret | `your_secret_key` | ### 可选配置 | 参数 | 默认值 | 说明 | | ---------------- | ------------- | -------------------------------------- | | `NODE_ENV` | `development` | 运行环境:`development` / `production` | | `PORT` | `3000` | 服务端口 | | `DB_HOST` | `localhost` | 数据库主机 | | `DB_PORT` | `3306` | 数据库端口 | | `DB_NAME` | `yingsha` | 数据库名称 | | `DB_USER` | `root` | 数据库用户名 | | `JWT_EXPIRES_IN` | `7d` | Token 过期时间 | ### 生成 JWT 密钥 ```bash node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" ``` ### 完整配置示例 ```ini # 服务器配置 NODE_ENV=development PORT=3000 # 数据库配置 DB_HOST=localhost DB_PORT=3306 DB_NAME=yingsha DB_USER=root DB_PASSWORD=your_password # JWT 配置 JWT_SECRET=your_32_character_secret_key_here JWT_EXPIRES_IN=7d # 微信小程序配置 WX_APPID=wx1234567890abcdef WX_SECRET=your_wechat_secret_key ``` > ⚠️ **安全提示**:`.env` 文件包含敏感信息,请勿提交到版本控制系统 ### 2. 后台管理界面 ```bash cd admin # 安装依赖 npm install # 配置环境变量(可选,用于地图功能) copy env-template.txt .env.local # Windows # cp env-template.txt .env.local # Linux/Mac # 启动开发服务 npm run dev ``` 访问 http://localhost:8080,默认账号:`admin` / `admin123` #### 管理后台环境变量 在 `admin` 目录下创建 `.env.local` 文件(详细模板见 `admin/env-template.txt`): | 参数 | 必需 | 默认值 | 说明 | | ------------------------- | ---- | -------------------- | ------------------- | | `VITE_API_URL` | 否 | `/api` | 后端 API 地址 | | `VITE_AMAP_KEY` | 是\* | 无 | 高德地图 JS API Key | | `VITE_AMAP_SECURITY_CODE` | 是\* | 无 | 高德地图安全密钥 | | `VITE_APP_TITLE` | 否 | `羽动俱乐部管理后台` | 应用标题 | > \*注:如不使用门店地址定位功能,可不配置高德地图相关参数 **完整配置示例:** ```ini # 后端 API 地址(使用 Vite 代理时保持默认) VITE_API_URL=/api # 高德地图配置(用于门店地址定位) VITE_AMAP_KEY=your_amap_js_api_key VITE_AMAP_SECURITY_CODE=your_security_code # 应用标题 VITE_APP_TITLE=羽动俱乐部管理后台 ``` #### 高德地图配置说明 门店管理中的地址定位功能需要配置高德地图 JS API: 1. 访问 [高德开放平台](https://console.amap.com/) 注册账号 2. 进入「应用管理」→「我的应用」→「创建新应用」 3. 添加 Key,选择「Web 端(JS API)」 4. 在应用详情页生成「安全密钥」 5. 将 Key 和安全密钥填入 `admin/.env.local`: - `VITE_AMAP_KEY` = 你的 Key - `VITE_AMAP_SECURITY_CODE` = 你的安全密钥 > 💡 高德地图提供免费配额,个人开发者每日调用量足够使用 ### 3. 微信小程序 1. 使用微信开发者工具打开 `miniprogram` 目录 2. 修改 `app.js` 中的 `baseUrl` 为你的后端服务地址 3. 在 `project.config.json` 中填入你的小程序 AppID ## 数据库 使用 MySQL 数据库,首次运行 `npm run db:init` 会自动创建表结构和初始数据。 ### 主要数据表 | 表名 | 说明 | | -------------- | ---------- | | users | 小程序用户 | | stores | 门店 | | ladder_users | 天梯用户 | | matches | 比赛 | | match_games | 对局 | | point_actions | 积分行为 | | point_products | 积分商品 | | point_orders | 兑换订单 | | system_users | 后台用户 | ## 战力值计算规则 - 基础胜场分:+15 分 - 基础负场分:-5 分 - 以下克上:分差 ≥100 时,额外+10%分差奖励 - 新手保护:Lv1-2 前 5 场输分减半 - 单场封顶:±50 分 - 比赛权重:日常 x1.0,挑战赛 x1.5,总决赛 x2.0 ## 升降级规则 - 月度排位赛冠亚军:晋升 - 月度排位赛末位:降级 - 每月至少 3 场比赛才计入排名 ## 等级说明 | 等级 | 名称 | 描述 | | ---- | ---- | ---------------------------- | | Lv1 | 新锐 | 掌握基础动作,能进行多拍回合 | | Lv2 | 精锐 | 技术较全面,具备初步战术意识 | | Lv3 | 高手 | 技术稳定,战术意图清晰 | | Lv4 | 大师 | 俱乐部顶尖战力 | | Lv5 | 宗师 | 技术全面,俱乐部标杆 | ## 主题配色 - 主色:`#FF6B35` 活力橙 - 辅助色:`#2EC4B6` 清新青 - 强调色:`#FFBA08` 能量黄 - 深色背景:`#1A1A2E` - 浅色背景:`#F8F9FA` ## 许可证 MIT License