新增获取用户信息 /api/user/me

This commit is contained in:
2025-07-17 23:26:36 +08:00
parent e98c46f44a
commit 6f83022a79
2 changed files with 67 additions and 18 deletions

View File

@@ -1,6 +1,6 @@
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from typing import Literal, Union, Optional from typing import Literal, Union, Optional
from datetime import datetime, timedelta, timezone from datetime import datetime, timezone
from uuid import uuid4 from uuid import uuid4
class ResponseModel(BaseModel): class ResponseModel(BaseModel):
@@ -14,16 +14,35 @@ class TokenModel(BaseModel):
access_token: str = Field(default=None, description="访问令牌") access_token: str = Field(default=None, description="访问令牌")
refresh_expires: datetime = Field(default=None, description="刷新令牌的过期时间") refresh_expires: datetime = Field(default=None, description="刷新令牌的过期时间")
refresh_token: str = Field(default=None, description="刷新令牌") refresh_token: str = Field(default=None, description="刷新令牌")
class userModel(ResponseModel): class groupModel(BaseModel):
id: str = Field(default=None, description="用户ID") id: int = Field(default=None, description="用户ID")
name: str = Field(default=None, description="用户组名称")
allowShare: bool = Field(default=False, description="是否允许分享")
allowRomoteDownload: bool = Field(default=False, description="是否允许离线下载")
allowArchiveDownload: bool = Field(default=False, description="是否允许打包下载")
shareFree: bool = Field(default=False, description="是否允许免积分下载分享")
shareDownload: bool = Field(default=False, description="是否允许下载分享")
compress: bool = Field(default=False)
webdav: bool = Field(default=False, description="是否允许WebDAV")
allowWebDAVProxy: bool = Field(default=False, description="是否允许WebDAV代理")
relocate: bool = Field(default=False, description="是否使用重定向的下载链接")
sourceBatch: int = Field(default=0)
selectNode: bool = Field(default=False, description="是否允许选择离线下载节点")
advanceDelete: bool = Field(default=False, description="是否允许高级删除")
class userModel(BaseModel):
id: int = Field(default=None, description="用户ID")
username: str = Field(default=None, description="用户名") username: str = Field(default=None, description="用户名")
email: Optional[str] = Field(default=None, description="用户邮箱") nickname: str = Field(default=None, description="用户昵称")
avatar: Optional[str] = Field(default=None, description="用户头像URL") status: int = Field(default=0, description="用户状态")
is_active: bool = Field(default=True, description="用户是否激活") avatar: Literal['default', 'gravatar', 'file'] = Field(default='default', description="头像类型")
is_admin: bool = Field(default=False, description="用户是否为管理员") created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc), description="用户创建时间")
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc), description="账户创建时间") preferred_theme: str = Field(default="#607D8B", description="用户首选主题")
updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc), description="账户更新时间") score: int = Field(default=0, description="用户积分")
anonymous: bool = Field(default=False, description="是否为匿名用户")
group: groupModel = Field(default_factory=None, description="用户所属用户组")
tags: list = Field(default_factory=list, description="用户标签列表")
class SiteConfigModel(ResponseModel): class SiteConfigModel(ResponseModel):
title: str = Field(default="DiskNext", description="网站标题") title: str = Field(default="DiskNext", description="网站标题")

View File

@@ -1,9 +1,12 @@
from typing import Annotated from typing import Annotated
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from fastapi.security import OAuth2PasswordRequestForm from fastapi.security import OAuth2PasswordRequestForm
from middleware.auth import SignRequired from middleware.auth import AuthRequired, SignRequired
from models.response import ResponseModel, TokenModel import models
from models.response import ResponseModel, TokenModel, userModel, groupModel
from deprecated import deprecated
from pkg.log import log from pkg.log import log
import service.user.login
user_router = APIRouter( user_router = APIRouter(
prefix="/user", prefix="/user",
@@ -24,9 +27,6 @@ user_settings_router = APIRouter(
async def router_user_session( async def router_user_session(
form_data: Annotated[OAuth2PasswordRequestForm, Depends()] form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
) -> TokenModel: ) -> TokenModel:
import service.user.login
username = form_data.username username = form_data.username
password = form_data.password password = form_data.password
@@ -111,6 +111,10 @@ def router_user_qq() -> ResponseModel:
""" """
pass pass
@deprecated(
version="0.0.1",
reason="邮件中带链接的激活易使得被收件服务器误判为垃圾邮件,新版更换为验证码方式"
)
@user_router.get( @user_router.get(
path='/activate/{id}', path='/activate/{id}',
summary='邮件激活', summary='邮件激活',
@@ -205,16 +209,42 @@ def router_user_avatar(id: str, size: int = 128) -> ResponseModel:
path='/me', path='/me',
summary='获取用户信息', summary='获取用户信息',
description='Get user information.', description='Get user information.',
dependencies=[Depends(SignRequired)], dependencies=[Depends(dependency=AuthRequired)],
response_model=ResponseModel,
) )
def router_user_me() -> ResponseModel: async def router_user_me(
user: Annotated[models.user.User, Depends(AuthRequired)],
) -> ResponseModel:
""" """
Get user information. Get user information.
Returns: Returns:
dict: A dictionary containing user information. dict: A dictionary containing user information.
""" """
pass
group = await models.Group.get(id=user.group_id)
user_group = groupModel(
id=group.id,
name=group.name,
allowShare=group.share_enabled,
)
users = userModel(
id=user.id,
username=user.email,
nickname=user.nick,
status=user.status,
created_at=user.created_at,
score=user.score,
group=user_group,
).model_dump()
return ResponseModel(
data=users
)
@user_router.get( @user_router.get(
path='/storage', path='/storage',