feat: 添加访问令牌管理功能并升级至 0.2.4

- 新增 Management Token(访问令牌)功能,支持创建、更新、删除和管理
- 前端添加访问令牌管理页面,支持普通用户和管理员
- 后端实现完整的令牌生命周期管理 API
- 添加数据库迁移脚本创建 management_tokens 表
- Nginx 配置添加 gzip 压缩,优化响应传输
- Dialog 组件添加 persistent 属性,防止意外关闭
- 为管理后台 API 添加详细的中文文档注释
- 简化多处类型注解,统一代码风格
This commit is contained in:
fawney19
2026-01-07 14:55:07 +08:00
parent f6a6410626
commit 0061fc04b7
59 changed files with 6265 additions and 648 deletions

View File

@@ -26,6 +26,18 @@ pipeline = ApiRequestPipeline()
# 管理员端点
@router.post("")
async def create_user_endpoint(request: Request, db: Session = Depends(get_db)):
"""
创建用户
创建新用户账号(管理员专用)。
**请求体**:
- `email`: 邮箱地址
- `username`: 用户名
- `password`: 密码
- `role`: 角色user/admin
- `quota_usd`: 配额USD
"""
adapter = AdminCreateUserAdapter()
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@@ -33,18 +45,33 @@ async def create_user_endpoint(request: Request, db: Session = Depends(get_db)):
@router.get("")
async def list_users(
request: Request,
skip: int = Query(0, ge=0),
limit: int = Query(100, ge=1, le=1000),
role: Optional[str] = None,
is_active: Optional[bool] = None,
skip: int = Query(0, ge=0, description="跳过记录数"),
limit: int = Query(100, ge=1, le=1000, description="返回记录数"),
role: Optional[str] = Query(None, description="按角色筛选user/admin"),
is_active: Optional[bool] = Query(None, description="按状态筛选"),
db: Session = Depends(get_db),
):
"""
获取用户列表
分页获取用户列表,支持按角色和状态筛选。
**返回字段**: id, email, username, role, quota_usd, used_usd, is_active, created_at 等
"""
adapter = AdminListUsersAdapter(skip=skip, limit=limit, role=role, is_active=is_active)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@router.get("/{user_id}")
async def get_user(user_id: str, request: Request, db: Session = Depends(get_db)): # UUID
async def get_user(user_id: str, request: Request, db: Session = Depends(get_db)):
"""
获取用户详情
获取指定用户的详细信息。
**路径参数**:
- `user_id`: 用户 ID (UUID)
"""
adapter = AdminGetUserAdapter(user_id=user_id)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@@ -55,19 +82,51 @@ async def update_user(
request: Request,
db: Session = Depends(get_db),
):
"""
更新用户信息
更新指定用户的信息,包括角色、配额、权限等。
**路径参数**:
- `user_id`: 用户 ID (UUID)
**请求体** (均为可选):
- `email`: 邮箱地址
- `username`: 用户名
- `role`: 角色
- `quota_usd`: 配额
- `is_active`: 是否启用
- `allowed_providers`: 允许的提供商列表
- `allowed_models`: 允许的模型列表
"""
adapter = AdminUpdateUserAdapter(user_id=user_id)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@router.delete("/{user_id}")
async def delete_user(user_id: str, request: Request, db: Session = Depends(get_db)): # UUID
async def delete_user(user_id: str, request: Request, db: Session = Depends(get_db)):
"""
删除用户
永久删除指定用户。不能删除最后一个管理员账户。
**路径参数**:
- `user_id`: 用户 ID (UUID)
"""
adapter = AdminDeleteUserAdapter(user_id=user_id)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@router.patch("/{user_id}/quota")
async def reset_user_quota(user_id: str, request: Request, db: Session = Depends(get_db)):
"""Reset user quota (set used_usd to 0)"""
"""
重置用户配额
将用户的已用配额used_usd重置为 0。
**路径参数**:
- `user_id`: 用户 ID (UUID)
"""
adapter = AdminResetUserQuotaAdapter(user_id=user_id)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@@ -76,10 +135,17 @@ async def reset_user_quota(user_id: str, request: Request, db: Session = Depends
async def get_user_api_keys(
user_id: str,
request: Request,
is_active: Optional[bool] = None,
is_active: Optional[bool] = Query(None, description="按状态筛选"),
db: Session = Depends(get_db),
):
"""获取用户的所有API Keys不包括独立Keys"""
"""
获取用户的 API 密钥列表
获取指定用户的所有 API 密钥(不包括独立密钥)。
**路径参数**:
- `user_id`: 用户 ID (UUID)
"""
adapter = AdminGetUserKeysAdapter(user_id=user_id, is_active=is_active)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@@ -90,7 +156,23 @@ async def create_user_api_key(
request: Request,
db: Session = Depends(get_db),
):
"""为用户创建API Key"""
"""
为用户创建 API 密钥
为指定用户创建新的 API 密钥。
**路径参数**:
- `user_id`: 用户 ID (UUID)
**请求体**:
- `name`: 密钥名称
- `allowed_providers`: 允许的提供商(可选)
- `allowed_models`: 允许的模型(可选)
- `rate_limit`: 速率限制(可选)
- `expire_days`: 过期天数(可选)
**返回**: 包含完整密钥值的响应(仅此一次显示)
"""
adapter = AdminCreateUserKeyAdapter(user_id=user_id)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@@ -102,7 +184,15 @@ async def delete_user_api_key(
request: Request,
db: Session = Depends(get_db),
):
"""删除用户的API Key"""
"""
删除用户的 API 密钥
删除指定用户的指定 API 密钥。
**路径参数**:
- `user_id`: 用户 ID (UUID)
- `key_id`: 密钥 ID
"""
adapter = AdminDeleteUserKeyAdapter(user_id=user_id, key_id=key_id)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)