From 47a475622701d83e8f5b3bd0185b9e523f5caec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8E=E5=B0=8F=E4=B8=98?= Date: Mon, 22 Dec 2025 15:12:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E9=80=89=E9=A1=B9=E6=A8=A1=E5=9E=8B=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E4=B8=8E=E7=AD=96=E7=95=A5=E7=9A=84=E5=85=B3=E7=B3=BB?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=96=B0=E7=9B=B8=E5=85=B3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/README.md | 164 +++++++++++++++++++++++++++------------------ models/__init__.py | 2 +- models/policy.py | 49 ++++++++++++-- 3 files changed, 142 insertions(+), 73 deletions(-) diff --git a/models/README.md b/models/README.md index 7f43608..2f192f1 100644 --- a/models/README.md +++ b/models/README.md @@ -188,11 +188,31 @@ models/ | `dir_name_rule` | `str?` | 目录命名规则 | | `file_name_rule` | `str?` | 文件命名规则 | | `is_origin_link_enable` | `bool` | 是否开启源链接访问 | -| `options` | `str?` | 其他选项(JSON 格式) | + +**关系**: +- `options`: 一对一关联 PolicyOptions --- -### 7. Object(统一对象) +### 7. PolicyOptions(存储策略选项) + +**表名**: `policyoptions` +**基类**: `UUIDTableBase` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | `UUID` | 主键 | +| `policy_id` | `UUID` | 关联的策略(外键,唯一) | +| `token` | `str?` | 访问令牌 | +| `file_type` | `str?` | 允许的文件类型 | +| `mimetype` | `str?` | MIME 类型 | +| `od_redirect` | `str?` | OneDrive 重定向地址 | +| `chunk_size` | `int` | 分片上传大小(字节),默认 50MB | +| `s3_path_style` | `bool` | 是否使用 S3 路径风格 | + +--- + +### 8. Object(统一对象) **表名**: `object` **基类**: `UUIDTableBase` @@ -219,7 +239,7 @@ models/ --- -### 8. SourceLink(源链接) +### 9. SourceLink(源链接) **表名**: `sourcelink` **基类**: `TableBase` @@ -233,7 +253,7 @@ models/ --- -### 9. Share(分享) +### 10. Share(分享) **表名**: `share` **基类**: `TableBase` @@ -255,7 +275,7 @@ models/ --- -### 10. Report(举报) +### 11. Report(举报) **表名**: `report` **基类**: `TableBase` @@ -269,7 +289,7 @@ models/ --- -### 11. Tag(标签) +### 12. Tag(标签) **表名**: `tag` **基类**: `TableBase` @@ -288,7 +308,7 @@ models/ --- -### 12. Task(任务) +### 13. Task(任务) **表名**: `task` **基类**: `TableBase` @@ -305,7 +325,7 @@ models/ --- -### 13. Download(离线下载) +### 14. Download(离线下载) **表名**: `download` **基类**: `UUIDTableBase` @@ -332,7 +352,7 @@ models/ --- -### 14. Node(节点) +### 15. Node(节点) **表名**: `node` **基类**: `TableBase` @@ -352,7 +372,7 @@ models/ --- -### 15. Order(订单) +### 16. Order(订单) **表名**: `order` **基类**: `TableBase` @@ -372,7 +392,7 @@ models/ --- -### 16. Redeem(兑换码) +### 17. Redeem(兑换码) **表名**: `redeem` **基类**: `TableBase` @@ -388,7 +408,7 @@ models/ --- -### 17. StoragePack(容量包) +### 18. StoragePack(容量包) **表名**: `storagepack` **基类**: `TableBase` @@ -404,7 +424,7 @@ models/ --- -### 18. WebDAV(WebDAV 账户) +### 19. WebDAV(WebDAV 账户) **表名**: `webdav` **基类**: `TableBase` @@ -423,7 +443,7 @@ models/ --- -### 19. Setting(系统设置) +### 20. Setting(系统设置) **表名**: `setting` **基类**: `TableBase` @@ -448,52 +468,56 @@ models/ ``` ┌─────────────────────────────────────────────────────────┐ -│ 一对一关系 │ +│ 一对一关系 │ ├─────────────────────────────────────────────────────────┤ │ │ -│ Group ◄────────────────────────► GroupOptions │ +│ Group ◄────────────────────────> GroupOptions │ │ group_id (unique FK) │ │ │ +│ Policy ◄───────────────────────> PolicyOptions │ +│ policy_id (unique FK) │ +│ │ └─────────────────────────────────────────────────────────┘ ``` | 主表 | 从表 | 外键 | 说明 | |------|------|------|------| | Group | GroupOptions | `group_id` (unique) | 每个用户组有且仅有一个选项配置 | +| Policy | PolicyOptions | `policy_id` (unique) | 每个存储策略有且仅有一个扩展选项 | --- ### 一对多关系 ``` -┌─────────────────────────────────────────────────────────────────────────────┐ -│ 一对多关系 │ -├─────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────► Download │ -│ │ │ -│ ├──────► Object ◄──────┬──────► SourceLink │ -│ │ │ ▲ │ │ -│ │ │ │ └──────► Share ──────► Report│ -│ Group ──────► User ───┼─────────┘ │ │ +┌──────────────────────────────────────────────────────────────────────────────┐ +│ 一对多关系 │ +├──────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌──────> Download │ +│ │ │ +│ ├──────> Object ◄──────┬──────> SourceLink │ +│ │ │ ↑ │ │ +│ │ │ │ └──────> Share ──────> Report │ +│ Group ──────> User ───┼─────────┘ │ │ │ │ │ │ (自引用:parent-children) │ -│ │ ├──────► Order │ -│ │ │ │ -│ │ ├──────► StoragePack │ -│ │ │ │ -│ │ ├──────► Tag │ -│ │ │ │ -│ │ ├──────► Task ──────► Download │ -│ │ │ ▲ │ -│ │ ├──────► WebDAV │ │ -│ │ │ │ │ -│ │ └──────► UserAuthn │ │ -│ │ │ │ -│ └──────► Policy ──────► Object │ │ -│ │ │ -│ Node ───────────────┘ │ -│ │ -└─────────────────────────────────────────────────────────────────────────────┘ +│ │ ├──────> Order │ +│ │ │ │ +│ │ ├──────> StoragePack │ +│ │ │ │ +│ │ ├──────> Tag │ +│ │ │ │ +│ │ ├──────> Task ──────> Download │ +│ │ │ ↑ │ +│ │ ├──────> WebDAV │ │ +│ │ │ │ │ +│ │ └──────> UserAuthn │ │ +│ │ │ │ +│ └──────> Policy ──────> Object │ │ +│ │ │ +│ Node ───────────────┘ │ +│ │ +└──────────────────────────────────────────────────────────────────────────────┘ ``` | 一端 | 多端 | 外键 | 说明 | @@ -523,13 +547,13 @@ models/ ``` ┌─────────────────────────────────────────────────────────┐ -│ 多对多关系 │ +│ 多对多关系 │ ├─────────────────────────────────────────────────────────┤ │ │ -│ Group ◄────── GroupPolicyLink ──────► Policy │ +│ Group ◄────── GroupPolicyLink ──────> Policy │ │ │ -│ - 一个用户组可以使用多个存储策略 │ -│ - 一个存储策略可以被多个用户组使用 │ +│ - 一个用户组可以使用多个存储策略 │ +│ - 一个存储策略可以被多个用户组使用 │ │ │ └─────────────────────────────────────────────────────────┘ ``` @@ -545,20 +569,20 @@ models/ ``` ┌──────────────┐ │ Setting │ - │ (独立表) │ + │ (独立表) │ └──────────────┘ ┌──────────────┐ │ Redeem │ - │ (独立表) │ + │ (独立表) │ └──────────────┘ ┌──────────────┐ 1:1 ┌──────────────┐ -│ Group │◄────────────►│ GroupOptions │ +│ Group │◄────────────>│ GroupOptions │ │ │ └──────────────┘ │ │ │ │──────┐ M:N ┌──────────────────┐ -│ │ └──────►│ GroupPolicyLink │◄───┐ +│ │ └──────>│ GroupPolicyLink │◄───┐ └──────┬───────┘ └──────────────────┘ │ │ │ │ 1:N │ @@ -566,44 +590,44 @@ models/ ┌──────────────┐ ┌──────────────┐ │ │ User │ │ Policy │◄───────┘ │ │ │ │ -│ │ └──────┬───────┘ -│ │ │ 1:N +│ │ │ │◄────────────>┌───────────────┐ +│ │ └──────┬───────┘ 1:1 │ PolicyOptions │ +│ │ │ 1:N └───────────────┘ │ │──────────────┐ │ └──────┬───────┘ │ │ │ │ ▼ │ 1:N │ ┌──────────────┐ ┌──────────────┐ - │ │ │ Object │◄────►│ Object │ + │ │ │ Object │◄────>│ Object │ │ │ │ │ │ (children) │ │ │ │ │ └──────────────┘ ├──────────────────────┼─┤ │ │ │ └──────┬───────┘ │ │ │ - │ │ │ 1:N - │ │ ├─────────────►┌──────────────┐ - │ │ │ │ SourceLink │ + │ │ │ 1:N ┌──────────────┐ + │ │ ├─────────────>│ SourceLink │ │ │ │ └──────────────┘ + │ │ │ │ │ │ - │ │ │ 1:N - │ │ └─────────────►┌──────────────┐ - │ │ │ Share │ - │ │ │ │─────► Report + │ │ │ 1:N ┌──────────────┐ + │ │ └─────────────>│ Share │─────> Report │ │ └──────────────┘ + │ │ │ │ - ├──► Download ◄────────┼───────────────────────── Task + ├──> Download ◄────────┼───────────────────────── Task │ ▲ │ │ │ │ │ │ │ │ └─────────────┼─────────────────────── Node │ │ - ├──► Order │ + ├──> Order │ │ │ - ├──► StoragePack │ + ├──> StoragePack │ │ │ - ├──► Tag │ + ├──> Tag │ │ │ - ├──► WebDAV │ + ├──> WebDAV │ │ │ - └──► UserAuthn │ + └──> UserAuthn │ │ │ ``` @@ -667,6 +691,12 @@ class AvatarType(StrEnum): | `GroupOptionsBase` | 用户组选项基础字段 | | `GroupResponse` | 用户组响应 | +### 存储策略相关 + +| DTO | 说明 | +|-----|------| +| `PolicyOptionsBase` | 存储策略选项基础字段 | + ### 对象相关 | DTO | 说明 | diff --git a/models/__init__.py b/models/__init__.py index 4b68932..d4f1d78 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -29,7 +29,7 @@ from .object import ( PolicyResponse, ) from .order import Order -from .policy import Policy, PolicyType +from .policy import Policy, PolicyOptions, PolicyOptionsBase, PolicyType from .redeem import Redeem from .report import Report from .setting import Setting, SettingsType, SiteConfigResponse diff --git a/models/policy.py b/models/policy.py index 7b0bbdb..8f25e2c 100644 --- a/models/policy.py +++ b/models/policy.py @@ -20,10 +20,45 @@ class GroupPolicyLink(SQLModelBase, table=True): policy_id: UUID = Field(foreign_key="policy.id", primary_key=True) """存储策略UUID""" + class PolicyType(StrEnum): LOCAL = "local" S3 = "s3" + +class PolicyOptionsBase(SQLModelBase): + """存储策略选项的基础模型""" + + token: str | None = None + """访问令牌""" + + file_type: str | None = None + """允许的文件类型""" + + mimetype: str | None = None + """MIME类型""" + + od_redirect: str | None = None + """OneDrive重定向地址""" + + chunk_size: int = Field(default=52428800, sa_column_kwargs={"server_default": "52428800"}) + """分片上传大小(字节),默认50MB""" + + s3_path_style: bool = Field(default=False, sa_column_kwargs={"server_default": text("false")}) + """是否使用S3路径风格""" + + +class PolicyOptions(PolicyOptionsBase, UUIDTableBase, table=True): + """存储策略选项模型(与Policy一对一关联)""" + + policy_id: UUID = Field(foreign_key="policy.id", unique=True) + """关联的策略UUID""" + + # 反向关系 + policy: "Policy" = Relationship(back_populates="options") + """关联的策略""" + + class Policy(UUIDTableBase, table=True): """存储策略模型""" @@ -50,6 +85,7 @@ class Policy(UUIDTableBase, table=True): secret_key: str | None = Field(default=None) """Secret Key""" + max_size: int = Field(default=0, sa_column_kwargs={"server_default": "0"}) """允许上传的最大文件尺寸(字节)""" @@ -64,11 +100,14 @@ class Policy(UUIDTableBase, table=True): is_origin_link_enable: bool = Field(default=False, sa_column_kwargs={"server_default": text("false")}) """是否开启源链接访问""" - - options: str | None = Field(default=None) - """其他选项 (JSON格式)""" - # options 示例: {"token":"","file_type":null,"mimetype":"","od_redirect":"http://127.0.0.1:8000/...","chunk_size":52428800,"s3_path_style":false} - + + # 一对一关系:策略选项 + options: PolicyOptions | None = Relationship( + back_populates="policy", + sa_relationship_kwargs={"uselist": False}, + ) + """策略的扩展选项""" + # 关系 objects: list["Object"] = Relationship(back_populates="policy") """策略下的所有对象"""