# 管理员登录功能测试指南

## 测试前准备

### 1. 执行数据库脚本
确保已执行 `sql/emotion_museum.sql` 脚本，该脚本会：
- 创建 `t_admin` 表
- 初始化默认管理员账号

### 2. 启动应用
```bash
cd backend-single
mvn spring-boot:run
```

## 测试用例

### 测试1: 管理员登录

**请求**:
```bash
curl -X POST http://localhost:8080/api/admin/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "account": "admin",
    "password": "admin123"
  }'
```

**预期响应**:
```json
{
  "code": 200,
  "message": "登录成功",
  "data": {
    "accessToken": "eyJhbGciOiJIUzUxMiJ9...",
    "refreshToken": "eyJhbGciOiJIUzUxMiJ9...",
    "expiresIn": 86400,
    "adminInfo": {
      "id": "xxx",
      "account": "admin",
      "username": "系统管理员",
      "email": "admin@emotion-museum.com",
      "phone": "13800138000",
      "role": "super_admin",
      "status": 1
    },
    "loginTime": "2025-10-27 10:00:00"
  },
  "timestamp": 1698393600000
}
```

### 测试2: 错误的密码

**请求**:
```bash
curl -X POST http://localhost:8080/api/admin/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "account": "admin",
    "password": "wrongpassword"
  }'
```

**预期响应**:
```json
{
  "code": 500,
  "message": "账号或密码错误",
  "data": null,
  "timestamp": 1698393600000
}
```

### 测试3: 获取管理员信息

**请求**:
```bash
curl -X GET http://localhost:8080/api/admin/auth/info \
  -H "Authorization: Bearer {从登录接口获取的accessToken}"
```

**预期响应**:
```json
{
  "code": 200,
  "message": "操作成功",
  "data": {
    "id": "xxx",
    "account": "admin",
    "username": "系统管理员",
    "email": "admin@emotion-museum.com",
    "role": "super_admin",
    "status": 1
  },
  "timestamp": 1698393600000
}
```

### 测试4: 访问管理员接口（分页查询管理员）

**请求**:
```bash
curl -X GET "http://localhost:8080/api/admin/page?current=1&size=10" \
  -H "Authorization: Bearer {accessToken}"
```

**预期响应**:
```json
{
  "code": 200,
  "message": "操作成功",
  "data": {
    "records": [
      {
        "id": "xxx",
        "account": "admin",
        "username": "系统管理员",
        "role": "super_admin",
        ...
      }
    ],
    "total": 1,
    "current": 1,
    "size": 10,
    "pages": 1
  },
  "timestamp": 1698393600000
}
```

### 测试5: 普通用户Token访问管理员接口（应该被拒绝）

**请求**:
```bash
# 先用普通用户登录获取Token
curl -X POST http://localhost:8080/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "13800138001",
    "smsCode": "123456"
  }'

# 使用普通用户Token访问管理员接口
curl -X GET http://localhost:8080/api/admin/page \
  -H "Authorization: Bearer {普通用户的accessToken}"
```

**预期响应**:
```json
{
  "code": 403,
  "message": "无权限访问",
  "data": null
}
```

### 测试6: 管理员登出

**请求**:
```bash
curl -X POST http://localhost:8080/api/admin/auth/logout \
  -H "Authorization: Bearer {accessToken}"
```

**预期响应**:
```json
{
  "code": 200,
  "message": "登出成功",
  "data": null,
  "timestamp": 1698393600000
}
```

### 测试7: 刷新Token

**请求**:
```bash
curl -X POST http://localhost:8080/api/admin/auth/refreshToken \
  -H "Content-Type: application/json" \
  -d '{
    "refreshToken": "{从登录接口获取的refreshToken}"
  }'
```

**预期响应**:
```json
{
  "code": 200,
  "message": "令牌刷新成功",
  "data": {
    "accessToken": "新的accessToken",
    "refreshToken": "新的refreshToken",
    "expiresIn": 86400,
    ...
  },
  "timestamp": 1698393600000
}
```

## 使用Postman测试

### 1. 导入环境变量
创建环境变量：
- `baseUrl`: http://localhost:8080/api
- `adminToken`: (登录后自动设置)

### 2. 管理员登录请求配置
- **Method**: POST
- **URL**: `{{baseUrl}}/admin/auth/login`
- **Headers**: 
  - Content-Type: application/json
- **Body** (raw JSON):
```json
{
  "account": "admin",
  "password": "admin123"
}
```
- **Tests** (自动保存Token):
```javascript
if (pm.response.code === 200) {
    const response = pm.response.json();
    pm.environment.set("adminToken", response.data.accessToken);
}
```

### 3. 其他请求配置
在需要认证的请求中添加Header：
- **Key**: Authorization
- **Value**: Bearer {{adminToken}}

## 验证要点

1. ✅ 管理员可以使用账号密码登录
2. ✅ 登录成功返回带有userType=admin的Token
3. ✅ 管理员Token可以访问 `/admin/**` 路径
4. ✅ 普通用户Token无法访问管理员接口（返回403）
5. ✅ 管理员Token无法访问普通用户接口
6. ✅ 登录信息被正确记录（最后登录时间、登录次数）
7. ✅ Token刷新功能正常
8. ✅ 登出功能正常

## 常见问题

### Q1: 登录返回401
**原因**: 账号或密码错误
**解决**: 检查账号密码是否正确，确认数据库中有初始管理员数据

### Q2: 访问接口返回403
**原因**: 使用了错误类型的Token
**解决**: 确保使用管理员Token访问管理员接口

### Q3: Token验证失败
**原因**: Token过期或无效
**解决**: 重新登录或使用refreshToken刷新

### Q4: 数据库连接失败
**原因**: Redis或MySQL未启动
**解决**: 确保Redis和MySQL服务正常运行
