fix bugs
This commit is contained in:
181
doc/裁判邀请功能使用说明.md
Normal file
181
doc/裁判邀请功能使用说明.md
Normal file
@@ -0,0 +1,181 @@
|
||||
# 裁判邀请功能使用说明
|
||||
|
||||
## 功能概述
|
||||
|
||||
裁判邀请模块用于为武术赛事邀请裁判,通过生成邀请码的方式让裁判登录系统并回复邀请。
|
||||
|
||||
## 完整操作流程
|
||||
|
||||
### 1. 准备工作
|
||||
|
||||
#### 1.1 创建赛事
|
||||
- 进入"赛事管理"模块
|
||||
- 创建新的赛事
|
||||
- 确保赛事状态为"进行中"
|
||||
|
||||
#### 1.2 添加裁判
|
||||
- 进入"评委管理"模块
|
||||
- 点击"新增评委"按钮
|
||||
- 填写裁判基本信息:
|
||||
- 姓名、性别、手机号、身份证号
|
||||
- 裁判类型(主裁判/普通裁判)
|
||||
- 等级/职称
|
||||
- 擅长项目
|
||||
- 保存裁判信息
|
||||
|
||||
### 2. 生成邀请码
|
||||
|
||||
#### 方式一:从评委库导入(推荐)
|
||||
|
||||
这是为新裁判生成邀请码的主要方式。
|
||||
|
||||
**操作步骤:**
|
||||
1. 进入"裁判邀请"页面
|
||||
2. 选择赛事(页面顶部下拉框)
|
||||
3. 点击"从评委库导入"按钮
|
||||
4. 在弹出的对话框中:
|
||||
- 可以搜索裁判(按姓名、手机号、类型)
|
||||
- 勾选需要邀请的裁判(支持多选)
|
||||
- 查看已选择的裁判数量
|
||||
5. 点击"确定导入"按钮
|
||||
6. 系统自动为选中的裁判批量生成邀请码
|
||||
7. 生成成功后,邀请列表会自动刷新
|
||||
|
||||
**特点:**
|
||||
- ✅ 支持批量操作
|
||||
- ✅ 可以搜索和筛选裁判
|
||||
- ✅ 自动生成邀请码
|
||||
- ✅ 适合首次邀请裁判
|
||||
|
||||
#### 方式二:批量生成邀请码
|
||||
|
||||
用于为已有邀请记录但未生成邀请码的裁判批量生成。
|
||||
|
||||
**操作步骤:**
|
||||
1. 在邀请列表中勾选需要生成邀请码的记录
|
||||
2. 点击"批量生成邀请码"按钮
|
||||
3. 确认操作
|
||||
4. 系统为选中的裁判生成邀请码
|
||||
|
||||
**注意:**
|
||||
- ⚠️ 只能为已有邀请记录的裁判生成
|
||||
- ⚠️ 如果是新裁判,请使用"从评委库导入"
|
||||
|
||||
#### 方式三:单个生成邀请码
|
||||
|
||||
用于为单个裁判生成或重新生成邀请码。
|
||||
|
||||
**操作步骤:**
|
||||
1. 在邀请列表中找到目标裁判
|
||||
2. 如果未生成邀请码:点击"生成邀请码"按钮
|
||||
3. 如果已有邀请码:点击邀请码旁边的刷新图标"重新生成"
|
||||
4. 邀请码会自动复制到剪贴板
|
||||
|
||||
### 3. 发送邀请
|
||||
|
||||
生成邀请码后,需要将邀请码发送给裁判:
|
||||
|
||||
**发送方式:**
|
||||
- 📧 邮件:将邀请码通过邮件发送
|
||||
- 📱 短信:将邀请码通过短信发送
|
||||
- 💬 微信/其他:通过即时通讯工具发送
|
||||
|
||||
**邀请码使用:**
|
||||
- 裁判收到邀请码后,访问系统登录页面
|
||||
- 输入邀请码进行登录
|
||||
- 查看赛事信息并回复邀请(接受/拒绝)
|
||||
|
||||
### 4. 管理邀请
|
||||
|
||||
#### 4.1 查看邀请状态
|
||||
|
||||
邀请状态说明:
|
||||
- 🟡 **待回复**:已发送邀请,裁判尚未回复
|
||||
- 🟢 **已接受**:裁判已接受邀请
|
||||
- 🔴 **已拒绝**:裁判已拒绝邀请
|
||||
- ⚪ **已取消**:管理员已取消邀请
|
||||
|
||||
#### 4.2 邀请操作
|
||||
|
||||
**对于"待回复"状态的邀请:**
|
||||
- **重发**:重新发送邀请通知
|
||||
- **提醒**:发送提醒消息催促裁判回复
|
||||
- **取消**:取消邀请(需填写取消原因)
|
||||
|
||||
**对于"已接受"状态的邀请:**
|
||||
- **确认**:确认裁判参与(可进行后续的场地、项目分配)
|
||||
|
||||
**所有邀请:**
|
||||
- **查看**:查看邀请详细信息
|
||||
- **复制邀请码**:点击邀请码即可复制
|
||||
|
||||
### 5. 统计信息
|
||||
|
||||
页面顶部显示四个统计卡片:
|
||||
- 📊 **总邀请数**:已发送的邀请总数
|
||||
- ⏰ **待回复**:等待裁判回复的邀请数
|
||||
- ✅ **已接受**:裁判已接受的邀请数
|
||||
- ❌ **已拒绝**:裁判已拒绝的邀请数
|
||||
|
||||
### 6. 导出数据
|
||||
|
||||
点击"导出数据"按钮可以导出当前筛选条件下的邀请列表为Excel文件。
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q1: 为什么"批量生成邀请码"按钮是灰色的?
|
||||
**A:** 可能的原因:
|
||||
1. 未选择赛事
|
||||
2. 赛事列表正在加载
|
||||
3. 未勾选任何邀请记录
|
||||
|
||||
### Q2: 如何为新裁判生成邀请码?
|
||||
**A:** 使用"从评委库导入"功能:
|
||||
1. 先在"评委管理"中添加裁判
|
||||
2. 在"裁判邀请"页面点击"从评委库导入"
|
||||
3. 选择裁判并确认导入
|
||||
|
||||
### Q3: 邀请码可以重复使用吗?
|
||||
**A:** 不可以。每个邀请码只能使用一次。如果需要重新邀请,请使用"重新生成"功能。
|
||||
|
||||
### Q4: 邀请码有效期是多久?
|
||||
**A:** 默认有效期为30天。过期后需要重新生成。
|
||||
|
||||
### Q5: 如何知道裁判是否收到邀请?
|
||||
**A:**
|
||||
- 查看邀请状态,如果裁判已登录并回复,状态会更新
|
||||
- 可以使用"提醒"功能发送提醒消息
|
||||
- 建议通过电话或其他方式确认裁判是否收到
|
||||
|
||||
## 技术说明
|
||||
|
||||
### 邀请码生成规则
|
||||
- 每个赛事+裁判组合生成唯一邀请码
|
||||
- 邀请码包含角色信息(主裁判/普通裁判)
|
||||
- 可以预分配场地和项目
|
||||
|
||||
### 数据关联
|
||||
```
|
||||
赛事 (Competition)
|
||||
↓
|
||||
邀请记录 (JudgeInvite)
|
||||
↓
|
||||
裁判 (Judge)
|
||||
```
|
||||
|
||||
### API接口
|
||||
- 生成邀请码:`POST /api/blade-martial/judgeInvite/generate`
|
||||
- 批量生成:`POST /api/blade-martial/judgeInvite/generate/batch`
|
||||
- 重新生成:`PUT /api/blade-martial/judgeInvite/regenerate/{inviteId}`
|
||||
- 邀请列表:`GET /api/blade-martial/judgeInvite/list`
|
||||
- 邀请统计:`GET /api/blade-martial/judgeInvite/statistics`
|
||||
|
||||
## 更新日志
|
||||
|
||||
### 2025-12-13
|
||||
- ✨ 新增"从评委库导入"功能
|
||||
- ✨ 支持裁判搜索和筛选
|
||||
- ✨ 优化邀请码生成流程
|
||||
- 🐛 修复按钮禁用逻辑问题
|
||||
- 🐛 修复赛事选择初始化问题
|
||||
- 💄 优化用户界面和交互体验
|
||||
260
doc/赛事列表加载问题排查指南.md
Normal file
260
doc/赛事列表加载问题排查指南.md
Normal file
@@ -0,0 +1,260 @@
|
||||
# 赛事列表加载问题排查指南
|
||||
|
||||
## 问题现象
|
||||
|
||||
- 赛事下拉框显示"无数据"
|
||||
- 所有按钮(发送邀请、批量生成邀请码等)无法点击
|
||||
- 页面显示"暂无数据"
|
||||
|
||||
## 排查步骤
|
||||
|
||||
### 1. 检查浏览器控制台
|
||||
|
||||
打开浏览器开发者工具(F12),查看Console标签页:
|
||||
|
||||
**查看日志输出:**
|
||||
```
|
||||
赛事列表API返回: {...}
|
||||
解析后的赛事列表: [...]
|
||||
```
|
||||
|
||||
**可能的错误信息:**
|
||||
- `加载赛事列表失败: Network Error` - 网络连接问题
|
||||
- `加载赛事列表失败: 404` - API路径错误
|
||||
- `加载赛事列表失败: 500` - 后端服务错误
|
||||
|
||||
### 2. 检查Network请求
|
||||
|
||||
在开发者工具的Network标签页中:
|
||||
|
||||
1. 刷新页面
|
||||
2. 找到 `/api/martial/competition/list` 请求
|
||||
3. 查看请求状态:
|
||||
- **200**: 请求成功,检查返回数据
|
||||
- **404**: API路径不存在
|
||||
- **500**: 后端服务错误
|
||||
- **Failed**: 网络连接失败
|
||||
|
||||
4. 查看Response数据结构:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"records": [...], // 赛事列表
|
||||
"total": 10
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 检查后端服务
|
||||
|
||||
#### 3.1 确认后端服务是否启动
|
||||
|
||||
**Windows:**
|
||||
```bash
|
||||
netstat -ano | findstr 8888
|
||||
```
|
||||
|
||||
**Linux/Mac:**
|
||||
```bash
|
||||
netstat -tuln | grep 8888
|
||||
```
|
||||
|
||||
如果没有输出,说明后端服务未启动。
|
||||
|
||||
#### 3.2 启动后端服务
|
||||
|
||||
进入后端项目目录:
|
||||
```bash
|
||||
cd martial-master
|
||||
mvn spring-boot:run
|
||||
```
|
||||
|
||||
或者使用IDE(IDEA/Eclipse)启动。
|
||||
|
||||
### 4. 检查数据库数据
|
||||
|
||||
#### 4.1 连接数据库
|
||||
|
||||
使用数据库客户端(Navicat、DBeaver等)连接:
|
||||
- Host: 127.0.0.1
|
||||
- Port: 3306
|
||||
- Database: martial_db
|
||||
- Username: root
|
||||
- Password: 123456
|
||||
|
||||
#### 4.2 执行检查SQL
|
||||
|
||||
运行项目根目录下的 `check_data.sql` 文件:
|
||||
|
||||
```sql
|
||||
-- 检查赛事数据
|
||||
SELECT * FROM martial_competition LIMIT 10;
|
||||
|
||||
-- 检查赛事总数
|
||||
SELECT COUNT(*) FROM martial_competition;
|
||||
```
|
||||
|
||||
**如果赛事表为空:**
|
||||
需要先创建赛事数据。
|
||||
|
||||
### 5. 创建测试数据
|
||||
|
||||
#### 5.1 创建赛事
|
||||
|
||||
进入"赛事管理"页面,点击"新增赛事",填写:
|
||||
- 赛事名称:测试赛事
|
||||
- 赛事编码:TEST001
|
||||
- 主办单位:测试单位
|
||||
- 地区:北京
|
||||
- 详细地点:测试地点
|
||||
- 报名时间:选择日期范围
|
||||
- 比赛时间:选择日期范围
|
||||
|
||||
保存后,赛事列表应该就能显示了。
|
||||
|
||||
#### 5.2 创建裁判
|
||||
|
||||
进入"评委管理"页面,点击"新增评委",填写:
|
||||
- 姓名:张三
|
||||
- 性别:男
|
||||
- 手机号:13800138000
|
||||
- 身份证号:110101199001011234
|
||||
- 裁判类型:普通裁判
|
||||
- 等级/职称:一级
|
||||
|
||||
### 6. 检查API配置
|
||||
|
||||
#### 6.1 检查前端API配置
|
||||
|
||||
查看 `martial-web/src/axios/index.js` 或类似文件:
|
||||
|
||||
```javascript
|
||||
const baseURL = process.env.VUE_APP_API_BASE_URL || '/api'
|
||||
```
|
||||
|
||||
确认API基础路径配置正确。
|
||||
|
||||
#### 6.2 检查代理配置
|
||||
|
||||
查看 `martial-web/vite.config.js` 或 `vue.config.js`:
|
||||
|
||||
```javascript
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: 'http://localhost:8888',
|
||||
changeOrigin: true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
确认代理配置指向正确的后端地址。
|
||||
|
||||
### 7. 常见问题解决
|
||||
|
||||
#### 问题1: CORS跨域错误
|
||||
|
||||
**错误信息:**
|
||||
```
|
||||
Access to XMLHttpRequest at 'http://localhost:8888/api/...' from origin 'http://localhost:5173' has been blocked by CORS policy
|
||||
```
|
||||
|
||||
**解决方案:**
|
||||
1. 检查后端CORS配置
|
||||
2. 使用代理配置
|
||||
3. 确保前后端端口配置正确
|
||||
|
||||
#### 问题2: 404 Not Found
|
||||
|
||||
**可能原因:**
|
||||
1. API路径错误
|
||||
2. 后端Controller路径配置错误
|
||||
3. 后端服务未启动
|
||||
|
||||
**解决方案:**
|
||||
1. 检查API路径:`/api/martial/competition/list`
|
||||
2. 检查后端Controller注解:`@RequestMapping("/martial/competition")`
|
||||
3. 启动后端服务
|
||||
|
||||
#### 问题3: 数据结构不匹配
|
||||
|
||||
**现象:**
|
||||
API返回数据,但前端解析失败。
|
||||
|
||||
**解决方案:**
|
||||
查看控制台日志,确认数据结构:
|
||||
```javascript
|
||||
console.log('赛事列表API返回:', res)
|
||||
console.log('解析后的赛事列表:', records)
|
||||
```
|
||||
|
||||
如果数据结构不对,修改前端解析逻辑。
|
||||
|
||||
### 8. 快速测试
|
||||
|
||||
#### 8.1 使用Postman测试API
|
||||
|
||||
**请求:**
|
||||
```
|
||||
GET http://localhost:8888/api/martial/competition/list?current=1&size=10
|
||||
```
|
||||
|
||||
**期望返回:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"success": true,
|
||||
"data": {
|
||||
"records": [
|
||||
{
|
||||
"id": 1,
|
||||
"competitionName": "测试赛事",
|
||||
"status": 1,
|
||||
...
|
||||
}
|
||||
],
|
||||
"total": 1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 8.2 使用curl测试
|
||||
|
||||
```bash
|
||||
curl -X GET "http://localhost:8888/api/martial/competition/list?current=1&size=10"
|
||||
```
|
||||
|
||||
### 9. 临时解决方案
|
||||
|
||||
如果急需使用,可以临时修改代码,手动添加测试数据:
|
||||
|
||||
```javascript
|
||||
// 在 loadCompetitionList 函数中添加
|
||||
competitionList.value = [
|
||||
{
|
||||
id: 1,
|
||||
competitionName: '测试赛事',
|
||||
status: 1
|
||||
}
|
||||
]
|
||||
queryParams.competitionId = 1
|
||||
```
|
||||
|
||||
**注意:** 这只是临时方案,不要提交到代码库。
|
||||
|
||||
### 10. 联系支持
|
||||
|
||||
如果以上步骤都无法解决问题,请提供以下信息:
|
||||
|
||||
1. 浏览器控制台完整错误日志
|
||||
2. Network请求的详细信息(Request/Response)
|
||||
3. 后端服务日志
|
||||
4. 数据库查询结果
|
||||
|
||||
## 修改记录
|
||||
|
||||
### 2025-12-13
|
||||
- ✨ 添加详细的日志输出
|
||||
- ✨ 优化数据解析逻辑,支持多种返回格式
|
||||
- ✨ 移除status=1的限制,查询所有赛事
|
||||
- 📝 创建排查指南文档
|
||||
Reference in New Issue
Block a user