个人中心

This commit is contained in:
朱潮 2026-02-26 18:11:22 +08:00
parent c751c7997e
commit 912d5ebbed
2 changed files with 166 additions and 1 deletions

View File

@ -463,6 +463,18 @@ class UserSearchResponse(BaseModel):
email: Optional[str] = None
class UserProfileUpdateRequest(BaseModel):
"""用户更新个人信息请求"""
username: Optional[str] = None
email: Optional[str] = None
class ChangePasswordRequest(BaseModel):
"""用户修改密码请求"""
old_password: str
new_password: str
# --- 模型相关(已废弃,模型管理已迁移到 New API---
@ -2438,6 +2450,159 @@ async def get_current_user(authorization: Optional[str] = Header(None)):
)
@router.patch("/api/v1/users/me", response_model=UserInfoResponse)
async def update_current_user(
request: UserProfileUpdateRequest,
authorization: Optional[str] = Header(None)
):
"""
更新当前用户信息
Args:
request: 更新请求username email
authorization: Bearer token
Returns:
UserInfoResponse: 更新后的用户信息
"""
valid, user_id, current_username = await verify_user_auth(authorization)
if not valid:
raise HTTPException(
status_code=401,
detail="Invalid token"
)
pool = get_db_pool_manager().pool
async with pool.connection() as conn:
async with conn.cursor() as cursor:
# 构建更新字段
update_fields = []
values = []
if request.username is not None:
# 检查用户名是否已被其他用户使用
await cursor.execute("""
SELECT id FROM agent_user WHERE username = %s AND id != %s
""", (request.username, user_id))
if await cursor.fetchone():
raise HTTPException(
status_code=400,
detail="用户名已存在"
)
update_fields.append("username = %s")
values.append(request.username)
if request.email is not None:
# 检查邮箱是否已被其他用户使用
await cursor.execute("""
SELECT id FROM agent_user WHERE email = %s AND id != %s
""", (request.email, user_id))
if await cursor.fetchone():
raise HTTPException(
status_code=400,
detail="邮箱已被使用"
)
update_fields.append("email = %s")
values.append(request.email)
if not update_fields:
raise HTTPException(
status_code=400,
detail="No fields to update"
)
update_fields.append("updated_at = NOW()")
values.append(user_id)
await cursor.execute(f"""
UPDATE agent_user
SET {', '.join(update_fields)}
WHERE id = %s
RETURNING id, username, email, is_admin, created_at, last_login
""", values)
row = await cursor.fetchone()
if not row:
raise HTTPException(
status_code=404,
detail="User not found"
)
await conn.commit()
return UserInfoResponse(
id=str(row[0]),
username=row[1],
email=row[2],
is_admin=row[3] or False,
created_at=row[4].isoformat() if row[4] else "",
last_login=row[5].isoformat() if row[5] else None
)
@router.post("/api/v1/users/me/change-password", response_model=SuccessResponse)
async def change_current_user_password(
request: ChangePasswordRequest,
authorization: Optional[str] = Header(None)
):
"""
修改当前用户密码
Args:
request: 修改密码请求old_password, new_password
authorization: Bearer token
Returns:
SuccessResponse: 操作结果
"""
valid, user_id, _ = await verify_user_auth(authorization)
if not valid:
raise HTTPException(
status_code=401,
detail="Invalid token"
)
pool = get_db_pool_manager().pool
async with pool.connection() as conn:
async with conn.cursor() as cursor:
# 验证旧密码
old_password_hash = hash_password(request.old_password)
await cursor.execute("""
SELECT id FROM agent_user WHERE id = %s AND password_hash = %s
""", (user_id, old_password_hash))
row = await cursor.fetchone()
if not row:
raise HTTPException(
status_code=400,
detail="原密码错误"
)
# 更新新密码
new_password_hash = hash_password(request.new_password)
await cursor.execute("""
UPDATE agent_user
SET password_hash = %s,
updated_at = NOW()
WHERE id = %s
RETURNING username
""", (new_password_hash, user_id))
user_row = await cursor.fetchone()
await conn.commit()
return SuccessResponse(
success=True,
message="密码修改成功"
)
@router.get("/api/v1/users", response_model=List[UserSearchResponse])
async def search_users(
q: str = "",

View File

@ -117,6 +117,6 @@ NEW_API_ADMIN_KEY = os.getenv("NEW_API_ADMIN_KEY", "")
# ============================================================
# Single Agent Mode Configuration
# ============================================================
SINGLE_AGENT_MODE = os.getenv("SINGLE_AGENT_MODE", "true") == "true"
SINGLE_AGENT_MODE = os.getenv("SINGLE_AGENT_MODE", "false") == "true"
TEMPLATE_BOT_ID = os.getenv("TEMPLATE_BOT_ID", "403a2b63-88e4-4db1-b712-8dcf31fc98ea")
TEMPLATE_BOT_NAME = os.getenv("TEMPLATE_BOT_NAME", "智能助手")