feat: 添加存储策略选项模型及其与策略的关系,更新相关文档

This commit is contained in:
2025-12-22 15:12:13 +08:00
parent 6c3a601259
commit 47a4756227
3 changed files with 142 additions and 73 deletions

View File

@@ -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. WebDAVWebDAV 账户)
### 19. WebDAVWebDAV 账户)
**表名**: `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 | 说明 |

View File

@@ -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

View File

@@ -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"})
"""允许上传的最大文件尺寸(字节)"""
@@ -65,9 +101,12 @@ 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")