认证接口
认证模块提供用户注册、登录、信息管理等功能,挂载于 /api/auth。
用户注册
POST /api/auth/register
创建新用户账号。注册成功后直接返回 JWT Token,无需再次登录。
请求体
{
"username": "student01", // 必填,唯一,3-50位
"email": "stu@example.com", // 必填,唯一,有效邮箱格式
"password": "pass123", // 必填,最少6位
"displayName": "张三", // 必填,显示名称
"role": "student", // 可选,默认 "student"(student/teacher)
"grade": "高中二年级", // 可选
"subjects": ["数学", "物理"] // 可选,JSON 数组
}
成功响应 201
{
"success": true,
"message": "注册成功",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"username": "student01",
"email": "stu@example.com",
"displayName": "张三",
"role": "student",
"grade": "高中二年级"
}
}
}
错误响应
| 状态码 | 原因 |
|---|---|
400 | 必填项缺失或密码不足6位 |
409 | 用户名或邮箱已存在 |
用户登录
POST /api/auth/login
支持用户名或邮箱登录,成功后返回 JWT Token 和用户信息。
请求体
{
"username": "student01", // 用户名或邮箱均可
"password": "pass123"
}
成功响应 200
{
"success": true,
"message": "登录成功",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"username": "student01",
"email": "stu@example.com",
"displayName": "张三",
"role": "student",
"grade": "高中二年级",
"subjects": ["数学", "物理"],
"avatar": null
}
}
}
获取当前用户信息
GET /api/auth/me
需要认证
成功响应 200
{
"success": true,
"data": {
"id": "550e8400-...",
"username": "student01",
"email": "stu@example.com",
"display_name": "张三",
"displayName": "张三",
"role": "student",
"grade": "高中二年级",
"subjects": ["数学", "物理"],
"avatar": null,
"created_at": "2024-01-01T00:00:00.000Z",
"last_login": "2024-01-15T08:00:00.000Z"
}
}
更新用户资料
PUT /api/auth/profile
需要认证
请求体
{
"displayName": "李四",
"grade": "高中三年级",
"subjects": ["数学", "化学", "英语"],
"avatar": "https://example.com/avatar.png"
}
成功响应 200
{ "success": true, "message": "更新成功" }
修改密码
PUT /api/auth/password
需要认证
请求体
{
"oldPassword": "pass123",
"newPassword": "newpass456" // 最少6位
}
获取用户列表
GET /api/auth/users
需要认证
返回平台内所有活跃用户的基本信息,用于分享功能的用户选择。
成功响应 200
{
"success": true,
"data": [
{
"id": "550e8400-...",
"username": "student01",
"display_name": "张三",
"role": "student",
"grade": "高中二年级",
"avatar": null
}
]
}