feat: 添加两步验证功能,优化用户登录逻辑,更新相关模型和依赖
This commit is contained in:
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
# 未找到初始注册会员时,则创建
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user