appointment_system/ADMIN_FIX_GUIDE.md
2025-12-11 22:50:18 +08:00

307 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 管理后台数据显示问题 - 快速修复指南
## ✅ 诊断结果
经过测试确认:
- ✅ 数据库中有 7 个用户数据
- ✅ 后端 API 完全正常(已测试用户列表和统计接口)
- ✅ 后端运行在 http://localhost:3000
- ❌ 管理后台前端无法显示数据
## 🎯 问题原因
管理后台前端可能存在以下问题之一:
1. 管理后台服务未启动
2. 浏览器缓存或 localStorage 问题
3. 前端 API 请求失败但未显示错误
4. Token 过期或无效
## 🚀 立即修复步骤
### 步骤 1: 启动管理后台(如果未启动)
```bash
cd admin
npm run dev
```
管理后台应该运行在: http://localhost:3001
### 步骤 2: 清除浏览器缓存和数据
1. 打开管理后台 http://localhost:3001
2. 按 F12 打开开发者工具
3. 在 Console 中执行以下命令清除所有数据:
```javascript
// 清除所有 localStorage
localStorage.clear();
// 刷新页面
location.reload();
```
### 步骤 3: 重新登录
使用以下凭据登录:
- 用户名: `admin`
- 密码: `admin123`
### 步骤 4: 检查浏览器控制台
登录后,如果还是看不到数据:
1. 按 F12 打开开发者工具
2. 切换到 **Console** 标签,查看是否有错误
3. 切换到 **Network** 标签
4. 刷新页面
5. 查看 API 请求:
- 找到 `/api/v1/admin/users` 请求
- 点击查看响应内容
- 检查状态码(应该是 200
### 步骤 5: 手动测试 API在浏览器 Console 中)
如果登录成功,在浏览器 Console 中执行:
```javascript
// 检查 token 是否存在
console.log('Token:', localStorage.getItem('admin_token'));
// 手动测试用户列表 API
fetch('/api/v1/admin/users?page=1&limit=20', {
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('admin_token')
}
})
.then(r => r.json())
.then(d => {
console.log('用户数据:', d);
console.log('用户数量:', d.data?.users?.length);
})
.catch(e => console.error('错误:', e));
// 手动测试统计 API
fetch('/api/v1/admin/statistics/dashboard', {
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('admin_token')
}
})
.then(r => r.json())
.then(d => {
console.log('统计数据:', d);
})
.catch(e => console.error('错误:', e));
```
## 🐛 常见问题排查
### 问题 1: 管理后台无法启动
**错误**: `npm run dev` 失败
**解决**:
```bash
cd admin
rm -rf node_modules package-lock.json
npm install
npm run dev
```
### 问题 2: API 请求返回 401
**原因**: Token 过期或无效
**解决**:
1. 清除 localStorage: `localStorage.clear()`
2. 重新登录
### 问题 3: API 请求返回 CORS 错误
**原因**: 后端 CORS 配置问题
**解决**: 后端已配置代理,确保:
- 后端运行在 3000 端口
- 管理后台运行在 3001 端口
### 问题 4: 页面显示空白或加载中
**原因**: 前端代码错误或 API 响应格式不匹配
**解决**: 查看浏览器 Console 的错误信息
### 问题 5: 数据显示为 0 或空
**检查**:
1. Network 标签中 API 是否返回数据
2. Console 是否有 JavaScript 错误
3. 响应数据格式是否正确
## 📝 验证数据的 SQL 命令
如果需要直接查看数据库:
```sql
-- 连接数据库
mysql -u root -p overseas_appointment
-- 查看用户数量
SELECT COUNT(*) as total FROM user;
-- 查看用户列表
SELECT id, nickname, wechat_open_id, status, created_at
FROM user
ORDER BY created_at DESC
LIMIT 10;
-- 查看预约统计
SELECT status, COUNT(*) as count
FROM appointment
GROUP BY status;
-- 查看提现统计
SELECT status, COUNT(*) as count
FROM withdrawal
GROUP BY status;
```
## 🔍 调试技巧
### 添加请求日志
`admin/src/utils/api.js` 的请求拦截器中添加日志:
```javascript
api.interceptors.request.use(
(config) => {
console.log('🚀 API Request:', config.method.toUpperCase(), config.url);
const token = localStorage.getItem('admin_token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
},
(error) => {
console.error('❌ Request Error:', error);
return Promise.reject(error)
}
)
api.interceptors.response.use(
(response) => {
console.log('✅ API Response:', response.config.url, response.status, response.data);
return response
},
async (error) => {
console.error('❌ Response Error:', error.config?.url, error.response?.status, error.response?.data);
// ... 其他错误处理代码
}
)
```
### 检查响应格式
确认 API 返回的数据格式:
```javascript
// 期望的格式
{
"code": 0,
"message": "Success",
"data": {
"users": [...],
"pagination": {...}
}
}
```
## ✨ 快速测试脚本
创建一个测试文件 `admin/test-api.html`:
```html
<!DOCTYPE html>
<html>
<head>
<title>API 测试</title>
</head>
<body>
<h1>管理后台 API 测试</h1>
<button onclick="testLogin()">1. 测试登录</button>
<button onclick="testUsers()">2. 测试用户列表</button>
<button onclick="testStats()">3. 测试统计数据</button>
<pre id="result"></pre>
<script>
let token = '';
const output = document.getElementById('result');
async function testLogin() {
try {
const res = await fetch('http://localhost:3000/api/v1/admin/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: 'admin', password: 'admin123' })
});
const data = await res.json();
token = data.data.token;
output.textContent = '登录成功!\n' + JSON.stringify(data, null, 2);
} catch (e) {
output.textContent = '登录失败: ' + e.message;
}
}
async function testUsers() {
if (!token) {
output.textContent = '请先登录!';
return;
}
try {
const res = await fetch('http://localhost:3000/api/v1/admin/users?page=1&limit=20', {
headers: { 'Authorization': 'Bearer ' + token }
});
const data = await res.json();
output.textContent = '用户列表:\n' + JSON.stringify(data, null, 2);
} catch (e) {
output.textContent = '获取用户失败: ' + e.message;
}
}
async function testStats() {
if (!token) {
output.textContent = '请先登录!';
return;
}
try {
const res = await fetch('http://localhost:3000/api/v1/admin/statistics/dashboard', {
headers: { 'Authorization': 'Bearer ' + token }
});
const data = await res.json();
output.textContent = '统计数据:\n' + JSON.stringify(data, null, 2);
} catch (e) {
output.textContent = '获取统计失败: ' + e.message;
}
}
</script>
</body>
</html>
```
用浏览器打开这个文件,依次点击按钮测试 API。
## 📞 需要帮助?
如果以上步骤都无法解决问题,请提供:
1. 浏览器 Console 的完整错误信息(截图)
2. Network 标签中失败的 API 请求详情(截图)
3. 管理后台启动日志
4. 执行 `npm run dev` 的输出
## ✅ 成功标志
修复成功后,你应该能看到:
- ✅ 用户管理页面显示 7 个用户
- ✅ 数据统计显示:总用户数 7活跃预约 0待审核提现 0
- ✅ 所有页面数据正常加载