Files
sionrui/yudao-module-tik/DESIGN.md

283 lines
7.5 KiB
Markdown
Raw Normal View History

2025-11-16 19:35:55 +08:00
# Tik 文件管理模块设计文档
## 一、模块概述
Tik 文件管理模块负责用户文件的上传、存储、管理和分组功能,支持多种文件类型(视频、图片、音频等)和分类管理。
## 二、表结构设计
### 2.1 核心表
#### 1. `tik_user_file` - 用户文件表
**作用**:存储用户上传的文件元数据
**关键字段**
- `file_path` (varchar(1024)): **完整OSS路径**,格式:`{手机号MD5}/{租户ID}/{分类}/{日期}/{文件名}_{时间戳}.ext`
- `file_url` (varchar(1024)): 文件访问URL预签名URL或公开URL
- `oss_root_path` (varchar(256)): OSS根路径用于快速定位用户文件目录
- `file_category`: 文件分类video/generate/audio/mix/voice
- `file_id`: 关联 `infra_file.id`(可选,用于关联系统文件表)
**索引设计**
- `idx_user_id`: 用户ID索引
- `idx_file_category`: 文件分类索引
- `idx_user_tenant`: 用户+租户联合索引
- `idx_create_time`: 创建时间索引
#### 2. `tik_user_oss_init` - OSS初始化记录表
**作用**记录用户OSS目录初始化状态和路径信息
**关键字段**
- `mobile_md5`: 手机号MD5值用于生成OSS路径
- `oss_root_path`: OSS根路径
- `video_path`, `generate_path`, `audio_path`, `mix_path`, `voice_path`: 各分类目录路径
- `init_status`: 初始化状态0-未初始化1-已初始化)
**设计要点**
- 懒加载策略:首次上传时自动初始化
- 路径格式:`{手机号MD5}/{租户ID}/{分类}`
#### 3. `tik_file_group` - 文件分组表
**作用**:用户自定义文件分组(支持层级分组)
**关键字段**
- `parent_id`: 父分组ID0表示根分组
- `sort`: 排序字段
#### 4. `tik_user_file_group` - 文件分组关联表
**作用**:文件与分组的关联关系(支持一个文件属于多个分组)
**设计要点**
- 多对多关系
- 唯一索引:`uk_file_group` (file_id, group_id)
#### 5. `tik_user_quota` - 用户配额表
**作用**管理用户存储配额和VIP等级
**关键字段**
- `total_storage`: 总存储空间(字节)
- `used_storage`: 已使用存储空间(字节)
- `vip_level`: VIP等级
## 三、架构设计
### 3.1 分层架构
```
Controller 层 (AppTikUserFileController)
Service 层 (TikUserFileService)
Mapper 层 (TikUserFileMapper)
DataObject 层 (TikUserFileDO)
```
### 3.2 核心服务
#### 1. TikUserFileService - 文件管理服务
**职责**
- 文件上传(带配额校验)
- 文件查询(分页、筛选)
- 文件删除(逻辑删除 + 物理删除)
- 预签名URL生成
**关键流程**
1. **上传流程**
```
校验文件分类 → 校验配额 → 获取OSS目录 → 生成完整路径 → 上传到OSS → 保存元数据 → 更新配额
```
2. **删除流程**
```
校验权限 → 物理删除OSS文件 → 逻辑删除记录 → 释放配额
```
#### 2. TikOssInitService - OSS初始化服务
**职责**
- 初始化用户OSS目录结构
- 获取OSS路径信息
- 懒加载策略实现
**设计要点**
- OSS目录是虚拟的不需要显式创建
- 首次上传时自动初始化
- 路径格式:`{手机号MD5}/{租户ID}/{分类}`
#### 3. TikFileGroupService - 文件分组服务
**职责**
- 分组CRUD
- 层级分组支持
#### 4. TikUserQuotaService - 配额管理服务
**职责**
- 配额校验
- 配额更新
- VIP等级管理
## 四、路径设计
### 4.1 OSS路径结构
```
{手机号MD5}/{租户ID}/{分类}/{日期}/{文件名}_{时间戳}.ext
```
**示例**
```
abc123def45678901234567890123456/1/video/20250101/my_video_1234567890123.mp4
```
**路径组成部分**
1. **手机号MD5** (32字符): 用户唯一标识,保护隐私
2. **租户ID**: 多租户隔离
3. **分类** (video/generate/audio/mix/voice): 文件分类
4. **日期** (yyyyMMdd): 按日期分目录,便于管理
5. **文件名+时间戳**: 保证唯一性,避免覆盖
### 4.2 路径存储策略
- **file_path**: 存储完整OSS路径用于物理删除
- **file_url**: 存储访问URL用于前端展示
- **oss_root_path**: 存储根路径(用于快速定位)
## 五、设计亮点
### 5.1 优点
1. **分层清晰**Controller → Service → Mapper → DO职责明确
2. **配额管理**:上传前校验,删除后释放
3. **多租户支持**:通过 tenant_id 隔离
4. **懒加载策略**OSS目录按需初始化
5. **路径设计合理**:包含用户、租户、分类、日期等信息
6. **分组功能**:支持多分组、层级分组
### 5.2 需要改进的地方
1. **物理删除OSS文件**
- 当前只做了逻辑删除OSS文件未删除
- 建议:删除时调用 FileService 或 FileClient 删除OSS文件
- 或者:定期清理已逻辑删除的文件
2. **file_path 字段长度**
- 当前varchar(512)
- 建议varchar(1024) 更安全
3. **文件关联 infra_file 表**
- `file_id` 字段存在但未充分利用
- 建议:上传时关联 infra_file 表,便于统一管理
4. **预览图生成**
- 视频封面和图片缩略图功能未实现
- 建议:异步生成预览图
5. **批量操作优化**
- 删除文件时逐个删除OSS文件可能较慢
- 建议:批量删除或异步删除
## 六、数据流
### 6.1 上传流程
```
前端上传文件
Controller 接收
Service 校验(分类、配额)
获取OSS目录懒加载初始化
生成完整路径
上传到OSSFileApi
保存元数据到 tik_user_file
更新配额tik_user_quota
返回文件ID
```
### 6.2 查询流程
```
前端请求文件列表
Controller 接收查询参数
Service 查询数据库(分页、筛选)
转换为VO生成预览URL
返回分页结果
```
### 6.3 删除流程
```
前端请求删除
Controller 接收文件ID列表
Service 校验权限
物理删除OSS文件TODO
逻辑删除数据库记录
释放配额
返回成功
```
## 七、API设计
### 7.1 文件管理API
- `POST /api/tik/file/upload` - 上传文件
- `GET /api/tik/file/page` - 分页查询
- `DELETE /api/tik/file/delete-batch` - 批量删除
- `GET /api/tik/file/video/play-url` - 获取视频播放URL
- `GET /api/tik/file/audio/play-url` - 获取音频播放URL
- `GET /api/tik/file/preview-url` - 获取预览URL
### 7.2 分组管理API
- `POST /api/tik/file/group/create` - 创建分组
- `PUT /api/tik/file/group/update` - 更新分组
- `DELETE /api/tik/file/group/delete` - 删除分组
- `GET /api/tik/file/group/list` - 查询分组列表
- `POST /api/tik/file/group/add-files` - 添加文件到分组
- `POST /api/tik/file/group/remove-files` - 从分组移除文件
## 八、总结
### 8.1 表结构建议
1. **必须修改**
- `file_path` 字段长度512 → 1024
2. **可选优化**
- 添加 `file_path` 索引(如果经常按路径查询)
- 添加 `file_id` 索引(如果关联 infra_file 表)
### 8.2 功能完善建议
1. **物理删除OSS文件**:删除时调用 FileService 删除OSS文件
2. **预览图生成**:实现视频封面和图片缩略图异步生成
3. **文件关联**:充分利用 `file_id` 关联 infra_file 表
4. **批量操作优化**:优化批量删除性能
### 8.3 整体评价
**设计评分8.5/10**
- ✅ 架构清晰,分层合理
- ✅ 路径设计合理,支持多租户
- ✅ 配额管理完善
- ⚠️ 物理删除功能缺失
- ⚠️ 预览图功能未实现
- ⚠️ 部分字段未充分利用