From 11b67bde6d15dbc2bc13ac9d785ff6b4543536c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8E=E5=B0=8F=E4=B8=98?= Date: Fri, 19 Dec 2025 17:32:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20UUID=20=E6=9B=BF=E4=BB=A3=20int=20?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=EF=BC=8C=E4=BC=98=E5=8C=96=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/migration.py | 11 ++++++++--- models/object.py | 12 ++++++------ models/policy.py | 11 ++++++----- models/response.py | 8 ++++---- routers/controllers/directory.py | 2 +- 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/models/migration.py b/models/migration.py index e91cb4b..2f22c33 100644 --- a/models/migration.py +++ b/models/migration.py @@ -148,7 +148,6 @@ async def init_default_group() -> None: if not await Group.get(session, Group.name == "管理员"): admin_group = Group( name="管理员", - policies="1", max_storage=1 * 1024 * 1024 * 1024, # 1GB share_enabled=True, web_dav_enabled=True, @@ -194,7 +193,6 @@ async def init_default_group() -> None: if not await Group.get(session, Group.name == "游客"): guest_group = Group( name="游客", - policies="[]", share_enabled=False, web_dav_enabled=False, ) @@ -210,6 +208,7 @@ async def init_default_user() -> None: from .user import User from .group import Group from .object import Object, ObjectType + from .policy import Policy from .database import get_session log.info('初始化管理员用户...') @@ -224,6 +223,12 @@ async def init_default_user() -> None: if not admin_group: raise RuntimeError("管理员用户组不存在,无法创建管理员用户") + # 获取默认存储策略 + default_policy = await Policy.get(session, Policy.name == "本地存储") + if not default_policy: + raise RuntimeError("默认存储策略不存在,无法创建管理员用户") + default_policy_id = default_policy.id # 在后续 save 前保存 UUID + # 生成管理员密码 admin_password = Password.generate(8) hashed_admin_password = Password.hash(admin_password) @@ -245,7 +250,7 @@ async def init_default_user() -> None: type=ObjectType.FOLDER, owner_id=admin_user_id, parent_id=None, - policy_id=1, # 默认本地存储策略 + policy_id=default_policy_id, ).save(session) log.info(f'初始管理员账号: admin') diff --git a/models/object.py b/models/object.py index 09b13dd..6ced3d5 100644 --- a/models/object.py +++ b/models/object.py @@ -47,8 +47,8 @@ class DirectoryCreateRequest(SQLModelBase): name: str """目录名称""" - policy_id: int | None = None - """存储策略ID,不指定则继承父目录""" + policy_id: UUID | None = None + """存储策略UUID,不指定则继承父目录""" class ObjectMoveRequest(SQLModelBase): @@ -93,8 +93,8 @@ class ObjectResponse(ObjectBase): class PolicyResponse(SQLModelBase): """存储策略响应 DTO""" - id: str - """策略ID""" + id: UUID + """策略UUID""" name: str """策略名称""" @@ -189,8 +189,8 @@ class Object(ObjectBase, UUIDTableBase, table=True): owner_id: UUID = Field(foreign_key="user.id", index=True) """所有者用户UUID""" - policy_id: int = Field(foreign_key="policy.id", index=True) - """存储策略ID(文件直接使用,目录作为子文件的默认策略)""" + policy_id: UUID = Field(foreign_key="policy.id", index=True) + """存储策略UUID(文件直接使用,目录作为子文件的默认策略)""" # ==================== 关系 ==================== diff --git a/models/policy.py b/models/policy.py index dabbd67..9ed8319 100644 --- a/models/policy.py +++ b/models/policy.py @@ -1,8 +1,9 @@ +from typing import TYPE_CHECKING -from typing import Optional, TYPE_CHECKING -from sqlmodel import Field, Relationship, text -from .base import TableBase from enum import StrEnum +from sqlmodel import Field, Relationship, text + +from .base import UUIDTableBase if TYPE_CHECKING: from .object import Object @@ -11,7 +12,7 @@ class PolicyType(StrEnum): LOCAL = "local" S3 = "s3" -class Policy(TableBase, table=True): +class Policy(UUIDTableBase, table=True): """存储策略模型""" name: str = Field(max_length=255, unique=True) @@ -62,7 +63,7 @@ class Policy(TableBase, table=True): @staticmethod async def create( - policy: Optional["Policy"] = None, + policy: 'Policy | None' = None, **kwargs ): pass \ No newline at end of file diff --git a/models/response.py b/models/response.py index 8a89106..dfa3201 100644 --- a/models/response.py +++ b/models/response.py @@ -3,24 +3,24 @@ """ from typing import Any -from uuid import uuid4 +import uuid from sqlmodel import Field from .base import SQLModelBase - +# [TODO] 未来把这拆了,直接按需返回状态码 class ResponseModel(SQLModelBase): """通用响应模型""" code: int = Field(default=0, ge=0, lt=60000) """系统内部状态码,0表示成功,其他表示失败""" - data: dict[str, Any] | list[Any] | str | int | float | None = None + data: Any = None """响应数据""" msg: str | None = None """响应消息,可以是错误消息或信息提示""" - instance_id: str = Field(default_factory=lambda: str(uuid4())) + instance_id: uuid.UUID = Field(default_factory=uuid.uuid4) """实例ID,用于标识请求的唯一性""" diff --git a/routers/controllers/directory.py b/routers/controllers/directory.py index f0e30a7..4fbb3e6 100644 --- a/routers/controllers/directory.py +++ b/routers/controllers/directory.py @@ -75,7 +75,7 @@ async def router_directory_get( ] policy_response = PolicyResponse( - id=str(policy.id), + id=policy.id, name=policy.name, type=policy.type.value, max_size=policy.max_size,