feat: Phase 1 完成 — 基础设施 + 用户认证 + 管理端 + 端到端验证

Phase 1 (基础设施与用户认证) 全部 11 个 Task 开发完成:

后端 (Go):
- Auth 模块: 注册/登录/JWT(有状态)/Profile/密码修改
- Admin 模块: 用户列表/详情/禁用/启用/角色分配/创建用户
- 中间件: JWT认证 + RBAC角色权限 + 请求日志 + CORS + Panic恢复
- Dockerfile 多阶段构建 + Docker Compose 全栈部署

前台 (uni-app):
- 登录/注册页面 + 自定义 TabBar + 个人中心
- 请求封装 + 状态管理 (Pinia)

管理端 (Vue 3 + Element Plus):
- 登录/仪表盘/用户列表/用户详情
- Axios 封装 + 路由守卫 + Pinia 状态管理

验证:
- 全流程 API 端到端测试通过
- Playwright 页面自动化验证通过
- code-reviewer 代码审查通过

Made-with: Cursor
This commit is contained in:
bujinyuan
2026-03-02 11:31:24 +08:00
parent e9bd4dd204
commit 4d03215fe4
63 changed files with 15908 additions and 102 deletions

115
frontend/src/api/auth.js Normal file
View File

@@ -0,0 +1,115 @@
/**
* 认证模块 API
*
* 对应后端路由:/api/v1/auth/*
* 接口文档见docs/api/frontend/auth.md
*
* 所有 API 函数返回 Promiseresolve 时返回完整响应体 { code, message, data }
*/
import { post, get, put } from '@/utils/request'
/**
* 用户注册
* POST /api/v1/auth/register
*
* @param {Object} data - 注册信息
* @param {string} data.username - 用户名3-50 字符,全局唯一)
* @param {string} data.email - 邮箱地址(全局唯一)
* @param {string} data.password - 登录密码6-50 字符)
* @param {string} [data.nickname] - 昵称(选填,默认与用户名相同)
* @returns {Promise<Object>} { token, refresh_token, expires_in, user }
*/
const register = (data) => {
return post('/api/v1/auth/register', data, { needAuth: false })
}
/**
* 用户登录
* POST /api/v1/auth/login
*
* @param {Object} data - 登录信息
* @param {string} data.account - 用户名或邮箱(自动识别)
* @param {string} data.password - 登录密码
* @returns {Promise<Object>} { token, refresh_token, expires_in, user }
*/
const login = (data) => {
return post('/api/v1/auth/login', data, { needAuth: false })
}
/**
* 退出登录
* POST /api/v1/auth/logout
*
* 服务端会从 Redis 中删除该用户的 Token使其立即失效
* 客户端需同步清除本地存储的 Token由 store 层处理)
*
* @returns {Promise<Object>}
*/
const logout = () => {
return post('/api/v1/auth/logout')
}
/**
* 刷新 Token
* POST /api/v1/auth/refresh-token
*
* 使用 Refresh Token 获取新的 Access Token 和 Refresh Token
* 新 Token 会覆盖 Redis 中的旧值(单设备登录)
*
* @param {string} refreshToken - Refresh Token
* @returns {Promise<Object>} { token, refresh_token, expires_in, user }
*/
const refreshToken = (refreshToken) => {
return post('/api/v1/auth/refresh-token', { refresh_token: refreshToken }, { needAuth: false })
}
/**
* 获取个人信息
* GET /api/v1/auth/profile
*
* 返回完整用户信息(含 phone、created_at 等额外字段)
*
* @returns {Promise<Object>} UserInfo 对象
*/
const getProfile = () => {
return get('/api/v1/auth/profile')
}
/**
* 更新个人信息
* PUT /api/v1/auth/profile
*
* @param {Object} data - 需要更新的字段(均为可选)
* @param {string} [data.nickname] - 新昵称
* @param {string} [data.avatar] - 新头像 URL
* @param {number} [data.gender] - 性别0=未知1=男2=女)
* @param {string} [data.phone] - 手机号
* @returns {Promise<Object>} 更新后的完整 UserInfo
*/
const updateProfile = (data) => {
return put('/api/v1/auth/profile', data)
}
/**
* 修改密码
* PUT /api/v1/auth/password
*
* @param {Object} data - 密码信息
* @param {string} data.old_password - 原密码
* @param {string} data.new_password - 新密码6-50 字符)
* @returns {Promise<Object>}
*/
const changePassword = (data) => {
return put('/api/v1/auth/password', data)
}
export default {
register,
login,
logout,
refreshToken,
getProfile,
updateProfile,
changePassword
}