feat: 添加两步验证功能,优化用户登录逻辑,更新相关模型和依赖

This commit is contained in:
2025-12-19 14:11:24 +08:00
parent 89e837d91c
commit b7c5d5aec7
13 changed files with 248 additions and 76 deletions

View File

@@ -25,7 +25,7 @@ class GroupOptionsBase(SQLModelBase):
"""是否允许分享下载"""
share_free: bool = False
"""是否免积分分享"""
"""是否免积分获取需要积分的内容"""
relocate: bool = False
"""是否允许文件重定位"""
@@ -136,3 +136,22 @@ class Group(GroupBase, TableBase, table=True):
back_populates="previous_group",
sa_relationship_kwargs={"foreign_keys": "User.previous_group_id"}
)
def to_response(self) -> "GroupResponse":
"""转换为响应 DTO"""
opts = self.options
return GroupResponse(
id=self.id,
name=self.name,
allow_share=self.share_enabled,
webdav=self.web_dav_enabled,
share_download=opts.share_download if opts else False,
share_free=opts.share_free if opts else False,
relocate=opts.relocate if opts else False,
source_batch=opts.source_batch if opts else 0,
select_node=opts.select_node if opts else False,
advance_delete=opts.advance_delete if opts else False,
allow_remote_download=opts.aria2 if opts else False,
allow_archive_download=opts.archive_download if opts else False,
allow_webdav_proxy=opts.webdav_proxy if opts else False,
)

View File

@@ -15,8 +15,8 @@ async def migration() -> None:
log.info('开始进行数据库初始化...')
await init_default_settings()
await init_default_group()
await init_default_policy()
await init_default_group()
await init_default_user()
log.info('数据库初始化结束')
@@ -147,6 +147,7 @@ async def init_default_group() -> None:
if not await Group.get(session, Group.id == 1):
admin_group = await Group(
name="管理员",
policies="1",
max_storage=1 * 1024 * 1024 * 1024, # 1GB
share_enabled=True,
web_dav_enabled=True,
@@ -158,7 +159,10 @@ async def init_default_group() -> None:
archive_download=True,
archive_task=True,
share_download=True,
share_free=True,
aria2=True,
select_node=True,
advance_delete=True,
).save(session)
# 未找到初始注册会员时,则创建

View File

@@ -84,8 +84,8 @@ class PolicyResponse(SQLModelBase):
max_size: int = 0
"""单文件最大限制单位字节0表示不限制"""
file_type: list[str] = []
"""允许的文件类型列表,空列表表示不限制"""
file_type: list[str] | None = None
"""允许的文件类型列表,None 表示不限制"""
class DirectoryResponse(SQLModelBase):

View File

@@ -1,4 +1,5 @@
from datetime import datetime
from enum import StrEnum
from typing import Literal, Optional, TYPE_CHECKING
from sqlmodel import Field, Relationship
@@ -26,6 +27,13 @@ Option 需求
- 切换到不同存储策略是否提醒
"""
class AvatarType(StrEnum):
"""头像类型枚举"""
DEFAULT = "default"
GRAVATAR = "gravatar"
FILE = "file"
# ==================== Base 模型 ====================
@@ -227,7 +235,7 @@ class User(UserBase, TableBase, table=True):
username: str = Field(max_length=50, unique=True, index=True)
"""用户名,唯一,一经注册不可更改"""
nick: str | None = Field(default=None, max_length=50)
nickname: str | None = Field(default=None, max_length=50)
"""用于公开展示的名字,可使用真实姓名或昵称"""
password: str = Field(max_length=255)
@@ -242,7 +250,7 @@ class User(UserBase, TableBase, table=True):
two_factor: str | None = Field(default=None, min_length=32, max_length=32)
"""两步验证密钥"""
avatar: str | None = Field(default=None, max_length=255)
avatar: str = Field(default="default", max_length=255)
"""头像地址"""
options: str | None = None