feat: 更新数据模型和API路由,优化用户信息获取及设置管理

This commit is contained in:
2025-12-02 21:36:19 +08:00
parent 22c8f7649f
commit 8b6e18f0e2
8 changed files with 171 additions and 72 deletions

View File

@@ -1,8 +1,10 @@
from fastapi import APIRouter, Depends
from loguru import logger
from middleware.auth import AdminRequired
from middleware.dependencies import SessionDep
from models import User
from models.user import UserPublic
from models.response import ResponseModel
# 管理员根目录 /api/admin
@@ -234,17 +236,19 @@ def router_admin_delete_group(group_id: int) -> ResponseModel:
description='Get user information by ID',
dependencies=[Depends(AdminRequired)],
)
def router_admin_get_user(user_id: int) -> ResponseModel:
async def router_admin_get_user(session: SessionDep, user_id: int) -> ResponseModel:
"""
根据用户ID获取用户信息包括用户名、邮箱、注册时间等。
Args:
session(SessionDep): 数据库会话依赖项。
user_id (int): 用户ID。
Returns:
ResponseModel: 包含用户信息的响应模型。
"""
pass
user = await User.get_exist_one(session, user_id)
return ResponseModel(data=user.to_public().model_dump())
@admin_user_router.get(
path='/list',
@@ -252,21 +256,33 @@ def router_admin_get_user(user_id: int) -> ResponseModel:
description='Get user list',
dependencies=[Depends(AdminRequired)],
)
def router_admin_get_users(
async def router_admin_get_users(
session: SessionDep,
page: int = 1,
page_size: int = 20
) -> ResponseModel:
"""
获取用户列表,支持分页。
Args:
session: 数据库会话依赖项。
page (int): 页码默认为1。
page_size (int, optional): 每页显示的用户数量默认为20。
page_size (int): 每页显示的用户数量默认为20。
Returns:
ResponseModel: 包含用户列表的响应模型。
"""
pass
offset = (page - 1) * page_size
users: list[User] = await User.get(
session,
None,
fetch_mode="all",
offset=offset,
limit=page_size
)
return ResponseModel(
data=[user.to_public().model_dump() for user in users]
)
@admin_user_router.post(
path='/create',
@@ -284,21 +300,14 @@ async def router_admin_create_user(
Returns:
ResponseModel: 包含创建结果的响应模型。
"""
try:
existing_user = await User.get(session, User.username == user.username)
if existing_user:
return ResponseModel(
code=400,
message="User with this username already exists."
)
await user.save(session)
except Exception as e:
existing_user = await User.get(session, User.username == user.username)
if existing_user:
return ResponseModel(
code=500,
message=str(e)
code=400,
msg="User with this username already exists."
)
else:
return ResponseModel(data=user.model_dump())
user = await user.save(session)
return ResponseModel(data=user.to_public().model_dump())
@admin_user_router.patch(
path='/{user_id}',

View File

@@ -1,5 +1,6 @@
from fastapi import APIRouter
from sqlalchemy import and_
import json
from middleware.dependencies import SessionDep
from models.response import ResponseModel
@@ -22,6 +23,11 @@ async def _get_setting_bool(session: SessionDep, type_: str, name: str) -> bool:
value = await _get_setting(session, type_, name)
return value == "1" if value else False
async def _get_setting_json(session: SessionDep, type_: str, name: str) -> dict | list | None:
"""获取 JSON 类型设置值"""
value = await _get_setting(session, type_, name)
return json.loads(value) if value else None
@site_router.get(
path="/ping",
@@ -77,7 +83,7 @@ async def router_site_config(session: SessionDep):
"forgetCaptcha": await _get_setting_bool(session, "login", "forget_captcha"),
"emailActive": await _get_setting_bool(session, "login", "email_active"),
"QQLogin": None,
"themes": await _get_setting(session, "basic", "themes"),
"themes": await _get_setting_json(session, "basic", "themes"),
"defaultTheme": await _get_setting(session, "basic", "defaultTheme"),
"score_enabled": None,
"share_score_rate": None,