重构模型基类
This commit is contained in:
2
main.py
2
main.py
@@ -4,7 +4,7 @@ from pkg.conf import appmeta
|
|||||||
from models.database import init_db
|
from models.database import init_db
|
||||||
from models.migration import migration
|
from models.migration import migration
|
||||||
from pkg.lifespan import lifespan
|
from pkg.lifespan import lifespan
|
||||||
from pkg.JWT import JWT
|
from pkg.JWT import jwt as JWT
|
||||||
from pkg.log import log, set_log_level
|
from pkg.log import log, set_log_level
|
||||||
|
|
||||||
# 添加初始化数据库启动项
|
# 添加初始化数据库启动项
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from typing import Annotated, Optional
|
from typing import Annotated, Optional
|
||||||
from fastapi import Depends, HTTPException
|
from fastapi import Depends, HTTPException
|
||||||
from models.user import User
|
from models.user import User
|
||||||
from pkg.JWT import JWT
|
from pkg.JWT import jwt as JWT
|
||||||
import jwt
|
import jwt
|
||||||
from jwt import InvalidTokenError
|
from jwt import InvalidTokenError
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
from . import response
|
from . import response
|
||||||
|
|
||||||
# 将所有模型导入到这个包的命名空间中
|
# 将所有模型导入到这个包的命名空间中
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from .download import Download
|
from .download import Download
|
||||||
from .file import File
|
from .file import File
|
||||||
from .folder import Folder
|
from .folder import Folder
|
||||||
@@ -24,7 +24,7 @@ from .webdav import WebDAV
|
|||||||
|
|
||||||
# 可以定义一个 __all__ 列表来明确指定可以被 from .models import * 导入的内容
|
# 可以定义一个 __all__ 列表来明确指定可以被 from .models import * 导入的内容
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"BaseModel", "Download", "File", "Folder", "Group", "Node", "Order",
|
"TableBase", "Download", "File", "Folder", "Group", "Node", "Order",
|
||||||
"Policy", "Redeem", "Report", "Setting", "Share", "SourceLink",
|
"Policy", "Redeem", "Report", "Setting", "Share", "SourceLink",
|
||||||
"StoragePack", "Tag", "Task", "User", "WebDAV"
|
"StoragePack", "Tag", "Task", "User", "WebDAV"
|
||||||
]
|
]
|
||||||
@@ -6,7 +6,7 @@ from sqlalchemy.ext.asyncio import AsyncAttrs
|
|||||||
|
|
||||||
utcnow = lambda: datetime.now(tz=timezone.utc)
|
utcnow = lambda: datetime.now(tz=timezone.utc)
|
||||||
|
|
||||||
class BaseModel(SQLModel, AsyncAttrs):
|
class TableBase(SQLModel, AsyncAttrs):
|
||||||
__abstract__ = True
|
__abstract__ = True
|
||||||
|
|
||||||
id: Optional[int] = Field(default=None, primary_key=True, description="主键ID")
|
id: Optional[int] = Field(default=None, primary_key=True, description="主键ID")
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# my_project/database.py
|
|
||||||
|
|
||||||
from sqlmodel import SQLModel
|
from sqlmodel import SQLModel
|
||||||
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
|
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
|
||||||
from sqlmodel.ext.asyncio.session import AsyncSession
|
from sqlmodel.ext.asyncio.session import AsyncSession
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
from sqlmodel import Field, Relationship, Column, func, DateTime
|
from sqlmodel import Field, Relationship, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
@@ -10,7 +10,7 @@ if TYPE_CHECKING:
|
|||||||
from .task import Task
|
from .task import Task
|
||||||
from .node import Node
|
from .node import Node
|
||||||
|
|
||||||
class Download(BaseModel, table=True):
|
class Download(TableBase, table=True):
|
||||||
__tablename__ = 'downloads'
|
__tablename__ = 'downloads'
|
||||||
|
|
||||||
status: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="下载状态: 0=进行中, 1=完成, 2=错误")
|
status: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="下载状态: 0=进行中, 1=完成, 2=错误")
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
from sqlmodel import Field, Relationship, Column, func, DateTime
|
from sqlmodel import Field, Relationship, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
@@ -11,7 +11,7 @@ if TYPE_CHECKING:
|
|||||||
from .policy import Policy
|
from .policy import Policy
|
||||||
from .source_link import SourceLink
|
from .source_link import SourceLink
|
||||||
|
|
||||||
class File(BaseModel, table=True):
|
class File(TableBase, table=True):
|
||||||
__tablename__ = 'files'
|
__tablename__ = 'files'
|
||||||
|
|
||||||
name: str = Field(max_length=255, description="文件名")
|
name: str = Field(max_length=255, description="文件名")
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
from typing import Optional, List, TYPE_CHECKING
|
from typing import Optional, List, TYPE_CHECKING
|
||||||
from sqlmodel import Field, Relationship, UniqueConstraint, Column, func, DateTime
|
from sqlmodel import Field, Relationship, UniqueConstraint, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
@@ -10,7 +10,7 @@ if TYPE_CHECKING:
|
|||||||
from .policy import Policy
|
from .policy import Policy
|
||||||
from .file import File
|
from .file import File
|
||||||
|
|
||||||
class Folder(BaseModel, table=True):
|
class Folder(TableBase, table=True):
|
||||||
__tablename__ = 'folders'
|
__tablename__ = 'folders'
|
||||||
__table_args__ = (UniqueConstraint("name", "parent_id", name="uq_folder_name_parent"),)
|
__table_args__ = (UniqueConstraint("name", "parent_id", name="uq_folder_name_parent"),)
|
||||||
|
|
||||||
|
|||||||
@@ -3,13 +3,13 @@
|
|||||||
from tokenize import group
|
from tokenize import group
|
||||||
from typing import Optional, List, TYPE_CHECKING
|
from typing import Optional, List, TYPE_CHECKING
|
||||||
from sqlmodel import Field, Relationship, text, Column, func, DateTime
|
from sqlmodel import Field, Relationship, text, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .user import User
|
from .user import User
|
||||||
|
|
||||||
class Group(BaseModel, table=True):
|
class Group(TableBase, table=True):
|
||||||
__tablename__ = 'groups'
|
__tablename__ = 'groups'
|
||||||
|
|
||||||
name: str = Field(max_length=255, unique=True, description="用户组名")
|
name: str = Field(max_length=255, unique=True, description="用户组名")
|
||||||
@@ -17,6 +17,7 @@ class Group(BaseModel, table=True):
|
|||||||
max_storage: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="最大存储空间(字节)")
|
max_storage: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="最大存储空间(字节)")
|
||||||
share_enabled: bool = Field(default=False, sa_column_kwargs={"server_default": text("false")}, description="是否允许创建分享")
|
share_enabled: bool = Field(default=False, sa_column_kwargs={"server_default": text("false")}, description="是否允许创建分享")
|
||||||
web_dav_enabled: bool = Field(default=False, sa_column_kwargs={"server_default": text("false")}, description="是否允许使用WebDAV")
|
web_dav_enabled: bool = Field(default=False, sa_column_kwargs={"server_default": text("false")}, description="是否允许使用WebDAV")
|
||||||
|
admin: bool = Field(default=False, description="是否为管理员组")
|
||||||
speed_limit: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="速度限制 (KB/s), 0为不限制")
|
speed_limit: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="速度限制 (KB/s), 0为不限制")
|
||||||
options: Optional[str] = Field(default=None, description="其他选项 (JSON格式)")
|
options: Optional[str] = Field(default=None, description="其他选项 (JSON格式)")
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
from sqlmodel import Field, Relationship, text, Column, func, DateTime
|
from sqlmodel import Field, Relationship, text, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .download import Download
|
from .download import Download
|
||||||
|
|
||||||
class Node(BaseModel, table=True):
|
class Node(TableBase, table=True):
|
||||||
__tablename__ = 'nodes'
|
__tablename__ = 'nodes'
|
||||||
|
|
||||||
status: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="节点状态: 0=正常, 1=离线")
|
status: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="节点状态: 0=正常, 1=离线")
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
from sqlmodel import Field, Relationship, Column, func, DateTime
|
from sqlmodel import Field, Relationship, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .user import User
|
from .user import User
|
||||||
|
|
||||||
class Order(BaseModel, table=True):
|
class Order(TableBase, table=True):
|
||||||
__tablename__ = 'orders'
|
__tablename__ = 'orders'
|
||||||
|
|
||||||
order_no: str = Field(max_length=255, unique=True, index=True, description="订单号,唯一")
|
order_no: str = Field(max_length=255, unique=True, index=True, description="订单号,唯一")
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
from typing import Optional, List, TYPE_CHECKING
|
from typing import Optional, List, TYPE_CHECKING
|
||||||
from sqlmodel import Field, Relationship, text, Column, func, DateTime
|
from sqlmodel import Field, Relationship, text, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .file import File
|
from .file import File
|
||||||
from .folder import Folder
|
from .folder import Folder
|
||||||
|
|
||||||
class Policy(BaseModel, table=True):
|
class Policy(TableBase, table=True):
|
||||||
__tablename__ = 'policies'
|
__tablename__ = 'policies'
|
||||||
|
|
||||||
name: str = Field(max_length=255, unique=True, description="策略名称")
|
name: str = Field(max_length=255, unique=True, description="策略名称")
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from sqlmodel import Field, text, Column, func, DateTime
|
from sqlmodel import Field, text, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
class Redeem(BaseModel, table=True):
|
class Redeem(TableBase, table=True):
|
||||||
__tablename__ = 'redeems'
|
__tablename__ = 'redeems'
|
||||||
|
|
||||||
type: int = Field(description="兑换码类型")
|
type: int = Field(description="兑换码类型")
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
from sqlmodel import Field, Relationship, Column, func, DateTime
|
from sqlmodel import Field, Relationship, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .share import Share
|
from .share import Share
|
||||||
|
|
||||||
class Report(BaseModel, table=True):
|
class Report(TableBase, table=True):
|
||||||
__tablename__ = 'reports'
|
__tablename__ = 'reports'
|
||||||
|
|
||||||
reason: int = Field(description="举报原因代码")
|
reason: int = Field(description="举报原因代码")
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ class UserSettingModel(BaseModel):
|
|||||||
two_factor: bool = Field(default=False, description="是否启用两步验证")
|
two_factor: bool = Field(default=False, description="是否启用两步验证")
|
||||||
uid: int = Field(default=0, description="用户UID")
|
uid: int = Field(default=0, description="用户UID")
|
||||||
|
|
||||||
class FoldObjectModel(BaseModel):
|
class ObjectModel(BaseModel):
|
||||||
id: str = Field(default=..., description="对象ID")
|
id: str = Field(default=..., description="对象ID")
|
||||||
name: str = Field(default=..., description="对象名称")
|
name: str = Field(default=..., description="对象名称")
|
||||||
path: str = Field(default=..., description="对象路径")
|
path: str = Field(default=..., description="对象路径")
|
||||||
@@ -133,5 +133,5 @@ class DirectoryModel(BaseModel):
|
|||||||
目录模型
|
目录模型
|
||||||
'''
|
'''
|
||||||
parent: str = Field(default=..., description="父目录ID")
|
parent: str = Field(default=..., description="父目录ID")
|
||||||
objects: list[FoldObjectModel] = Field(default_factory=list, description="目录下的对象列表")
|
objects: list[ObjectModel] = Field(default_factory=list, description="目录下的对象列表")
|
||||||
policy: PolicyModel = Field(default_factory=PolicyModel, description="存储策略")
|
policy: PolicyModel = Field(default_factory=PolicyModel, description="存储策略")
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
from typing import Optional, Literal
|
from typing import Optional, Literal
|
||||||
from sqlmodel import Field, UniqueConstraint, Column, func, DateTime
|
from sqlmodel import Field, UniqueConstraint, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
SETTINGS_TYPE = Literal[
|
SETTINGS_TYPE = Literal[
|
||||||
@@ -34,7 +34,7 @@ SETTINGS_TYPE = Literal[
|
|||||||
]
|
]
|
||||||
|
|
||||||
# 数据库模型
|
# 数据库模型
|
||||||
class Setting(BaseModel, table=True):
|
class Setting(TableBase, table=True):
|
||||||
__tablename__ = 'settings'
|
__tablename__ = 'settings'
|
||||||
__table_args__ = (UniqueConstraint("type", "name", name="uq_setting_type_name"),)
|
__table_args__ = (UniqueConstraint("type", "name", name="uq_setting_type_name"),)
|
||||||
|
|
||||||
|
|||||||
@@ -3,14 +3,14 @@
|
|||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from sqlmodel import Field, Relationship, text, Column, func, DateTime
|
from sqlmodel import Field, Relationship, text, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .user import User
|
from .user import User
|
||||||
from .report import Report
|
from .report import Report
|
||||||
|
|
||||||
class Share(BaseModel, table=True):
|
class Share(TableBase, table=True):
|
||||||
__tablename__ = 'shares'
|
__tablename__ = 'shares'
|
||||||
|
|
||||||
password: Optional[str] = Field(default=None, max_length=255, description="分享密码(加密后)")
|
password: Optional[str] = Field(default=None, max_length=255, description="分享密码(加密后)")
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
from typing import TYPE_CHECKING, Optional
|
from typing import TYPE_CHECKING, Optional
|
||||||
from sqlmodel import Field, Relationship, Column, func, DateTime
|
from sqlmodel import Field, Relationship, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .file import File
|
from .file import File
|
||||||
|
|
||||||
class SourceLink(BaseModel, table=True):
|
class SourceLink(TableBase, table=True):
|
||||||
__tablename__ = 'source_links'
|
__tablename__ = 'source_links'
|
||||||
|
|
||||||
name: str = Field(max_length=255, description="链接名称")
|
name: str = Field(max_length=255, description="链接名称")
|
||||||
|
|||||||
@@ -3,13 +3,13 @@
|
|||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from sqlmodel import Field, Relationship, Column, func, DateTime
|
from sqlmodel import Field, Relationship, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .user import User
|
from .user import User
|
||||||
|
|
||||||
class StoragePack(BaseModel, table=True):
|
class StoragePack(TableBase, table=True):
|
||||||
__tablename__ = 'storage_packs'
|
__tablename__ = 'storage_packs'
|
||||||
|
|
||||||
name: str = Field(max_length=255, description="容量包名称")
|
name: str = Field(max_length=255, description="容量包名称")
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
from sqlmodel import Field, Relationship, UniqueConstraint, Column, func, DateTime
|
from sqlmodel import Field, Relationship, UniqueConstraint, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .user import User
|
from .user import User
|
||||||
|
|
||||||
class Tag(BaseModel, table=True):
|
class Tag(TableBase, table=True):
|
||||||
__tablename__ = 'tags'
|
__tablename__ = 'tags'
|
||||||
__table_args__ = (UniqueConstraint("name", "user_id", name="uq_tag_name_user"),)
|
__table_args__ = (UniqueConstraint("name", "user_id", name="uq_tag_name_user"),)
|
||||||
|
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
from sqlmodel import Field, Relationship, Column, func, DateTime
|
from sqlmodel import Field, Relationship, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .user import User
|
from .user import User
|
||||||
from .download import Download
|
from .download import Download
|
||||||
|
|
||||||
class Task(BaseModel, table=True):
|
class Task(TableBase, table=True):
|
||||||
__tablename__ = 'tasks'
|
__tablename__ = 'tasks'
|
||||||
|
|
||||||
status: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="任务状态: 0=排队中, 1=处理中, 2=完成, 3=错误")
|
status: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="任务状态: 0=排队中, 1=处理中, 2=完成, 3=错误")
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from sqlmodel import Field, Relationship, Column, func, DateTime
|
from sqlmodel import Field, Relationship, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
from .database import get_session
|
from .database import get_session
|
||||||
from sqlmodel import select
|
from sqlmodel import select
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ if TYPE_CHECKING:
|
|||||||
from .task import Task
|
from .task import Task
|
||||||
from .webdav import WebDAV
|
from .webdav import WebDAV
|
||||||
|
|
||||||
class User(BaseModel, table=True):
|
class User(TableBase, table=True):
|
||||||
__tablename__ = 'users'
|
__tablename__ = 'users'
|
||||||
|
|
||||||
email: str = Field(max_length=100, unique=True, index=True, description="用户邮箱,唯一")
|
email: str = Field(max_length=100, unique=True, index=True, description="用户邮箱,唯一")
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
from sqlmodel import Field, Relationship, UniqueConstraint, text, Column, func, DateTime
|
from sqlmodel import Field, Relationship, UniqueConstraint, text, Column, func, DateTime
|
||||||
from .base import BaseModel
|
from .base import TableBase
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .user import User
|
from .user import User
|
||||||
|
|
||||||
class WebDAV(BaseModel, table=True):
|
class WebDAV(TableBase, table=True):
|
||||||
__tablename__ = 'webdavs'
|
__tablename__ = 'webdavs'
|
||||||
__table_args__ = (UniqueConstraint("name", "user_id", name="uq_webdav_name_user"),)
|
__table_args__ = (UniqueConstraint("name", "user_id", name="uq_webdav_name_user"),)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from typing import Optional
|
from pkg.JWT.jwt import create_access_token, create_refresh_token
|
||||||
from models.setting import Setting
|
from models.setting import Setting
|
||||||
from models.request import LoginRequest
|
from models.request import LoginRequest
|
||||||
from models.response import TokenModel
|
from models.response import TokenModel
|
||||||
@@ -53,7 +53,6 @@ async def Login(LoginRequest: LoginRequest) -> tuple[bool, TokenModel | str]:
|
|||||||
return False, "Account is banned"
|
return False, "Account is banned"
|
||||||
|
|
||||||
# 创建令牌
|
# 创建令牌
|
||||||
from pkg.JWT.JWT import create_access_token, create_refresh_token
|
|
||||||
|
|
||||||
access_token, access_expire = create_access_token(data={'sub': user.email})
|
access_token, access_expire = create_access_token(data={'sub': user.email})
|
||||||
refresh_token, refresh_expire = create_refresh_token(data={'sub': user.email})
|
refresh_token, refresh_expire = create_refresh_token(data={'sub': user.email})
|
||||||
|
|||||||
Reference in New Issue
Block a user