- 数据模型初步规划 - 基类 - ID:UUIDv7 - 创建时间 - 更新时间 - User - 用户名 唯一 - 昵称 - Argon2化的密码 - 用户当前的状态 `正常/手动封禁/系统封禁` 用 StrEnum 存储 - 已用存储空间 - 用户积分 - 默认用户组 - Optional[两步验证密钥] - Optional[WebAuthn 凭证] - Optional[头像地址] -> None为昵称首字/图片/Gavatar头像 - Optional[当前用户组过期时间] -> 用户组过期后回退默认用户组 - 用户的个人设置 计划中 考虑 BaseModel 进行嵌套 - Group `与 User 的关系:一个用户组可以有多个用户,但一个用户只能在一个用户组中` - 组名 唯一 - list[[允许的存储策略, 该策略下最大允许使用的容量, 该策略下允许上传文件的白名单/黑名单]] - 默认存储策略 - bool[分享内容] - bool[是否管理员组] - 速度限制 - bool[打包下载] - bool[创建压缩/解压缩任务] - bool[WebDAV] - bool[WebDAV 反代] - bool[离线下载] - Object `计划:把 file 和 folder 合并为一个 Object 表,通过对象类型区分` - 对象名 - 区分大小写 - 禁止名称为特殊字段 (如 `/`, `\`, `:`, `*`, `?`, `<`, `>`, `:`, `"`) - 对象类型[file, folder, link] - 当对象类型为file时 - 源文件名 - 文件大小 - 分块上传会话ID - 文件MD5, SHA1, SHA256 - 文件元数据 - 音频:歌名、歌手名、专辑、流派... - 图片: 尺寸、ISO、曝光、拍摄设备、地理位置... - 其他需要记录的元数据 - 当对象类型为 folder 时 - 当前文件夹的视图(网格/列表/画廊) - 排序规则(按名称/大小/上传时间/修改时间) - 排序方式(升序/降序) - 当对象类型为 link 时 - 目标对象ID - 外键 - 用户ID 用于确保该对象的归属 - 目录ID 用于定位该对象存在哪个目录 - 策略ID 用于定位该对象存储于哪个存储策略 - Policy - 存储策略名 - 策略类型(如 `本机`, `从机`, `s3`, `OSS`, `COS` 等) - 服务器地址(本机则为路径) - 存储桶名称 - 允许上传文件的最大字节数 - 目录命名规则 - 文件命名规则 - 文件后缀白名单/黑名单 - 分片上传大小 - `待研究` - Tag - 标签名称 - 标签图标 - 标签颜色 - 外键 - 用户ID 用于确保该标签的归属 - 运行环境与目标 - 数据库类型:主要支持 PostgreSQL 18,考虑兼容 SQLite/MySQL/早期版本PostgreSQL - 驱动版本:做一定的向下兼容,主要支持 Python 3.13+ - 异步栈:全量异步 AsyncSession,不接受兼容同步 - 业务语义与数据模型 - 时间与时区:统一存储 UTC,再根据用户选择的时区计算本地化时间 - 文件/目录命名规则 - 文件名在同一目录下唯一 - 目录名在同一账户下的同一父目录下唯一 - 资源分享 - 用户可以分享单个文件,也可以分享整个目录 - 关系与级联 - 删除文件夹时,同时删除该文件夹内的所有子文件夹及其所有文件 - 删除用户时,同时删除该用户的所有文件,文件夹,分享,Tag - 文件预览与编辑 - 预览应用 Literal['嵌入网页式应用', 'WOPI协议式应用'] - 是否启用 - WOPI协议式应用 `https://{server_host}/hosting/discovery` - 嵌入网页式应用 - 图标 - 名称 - 支持的文件类型列表 - 预览URL模板 支持魔法变量 - 最大文件大小 - 平台 支持列表 ['all', 'mobile', 'desktop'] - 是否在新窗口打开