platform-vue/docs/七牛云区域配置流程图.md

18 KiB

七牛云区域配置流程图

问题:区域不匹配

┌─────────────────────────────────────────────────────────────┐
│                      修复前(错误)                           │
└─────────────────────────────────────────────────────────────┘

前端代码                    后端数据库                七牛云服务器
┌──────────┐              ┌──────────┐              ┌──────────┐
│          │              │          │              │          │
│ 硬编码:   │              │ 配置:     │              │ 实际:     │
│ region:  │              │ qiniu_   │              │ bucket   │
│ z0 (华东) │  ────X────>  │ region:  │  ────X────>  │ 在 z2    │
│          │   不匹配      │ z2 (华南) │   不匹配      │ (华南)   │
│          │              │          │              │          │
└──────────┘              └──────────┘              └──────────┘
                                                           │
                                                           ▼
                                                    ┌──────────┐
                                                    │  错误:    │
                                                    │ incorrect│
                                                    │  region  │
                                                    └──────────┘

解决方案:动态获取区域

┌─────────────────────────────────────────────────────────────┐
│                      修复后(正确)                           │
└─────────────────────────────────────────────────────────────┘

前端                      后端                      七牛云
┌──────────┐            ┌──────────┐            ┌──────────┐
│          │            │          │            │          │
│ 1. 请求   │            │ 2. 查询   │            │          │
│ 获取配置  │  ───────>  │ 数据库    │            │          │
│          │            │          │            │          │
└──────────┘            └──────────┘            └──────────┘
     │                       │
     │                       ▼
     │                  ┌──────────┐
     │                  │ 返回:     │
     │  <───────────    │ region:  │
     │                  │ 'z2'     │
     │                  └──────────┘
     ▼
┌──────────┐
│ 3. 调用   │
│ getQiniu │
│ Region() │
└──────────┘
     │
     ▼
┌──────────┐            ┌──────────┐            ┌──────────┐
│ 4. 使用   │            │          │            │          │
│ qiniu.   │            │          │            │ 5. 上传   │
│ region.  │  ───────────────────────────────>  │ 成功 ✓   │
│ z2       │     上传到 up-z2.qiniup.com        │          │
│          │                                    │          │
└──────────┘                                    └──────────┘

详细流程

┌─────────────────────────────────────────────────────────────┐
│                    完整上传流程                               │
└─────────────────────────────────────────────────────────────┘

用户操作                前端                    后端                    七牛云
   │                    │                      │                      │
   │ 1. 点击上传         │                      │                      │
   ├──────────────────> │                      │                      │
   │                    │                      │                      │
   │                    │ 2. GET /platform/    │                      │
   │                    │    storage/config    │                      │
   │                    ├─────────────────────>│                      │
   │                    │                      │                      │
   │                    │                      │ 3. 查询数据库         │
   │                    │                      │    storage_type:     │
   │                    │                      │    'qiniu'           │
   │                    │                      │    qiniu_region:     │
   │                    │                      │    'z2'              │
   │                    │                      │                      │
   │                    │ 4. 返回配置           │                      │
   │                    │ { storageType:       │                      │
   │                    │   'qiniu',           │                      │
   │                    │   qiniuRegion: 'z2' }│                      │
   │                    │<─────────────────────│                      │
   │                    │                      │                      │
   │                    │ 5. GET /platform/    │                      │
   │                    │    qiniu/token       │                      │
   │                    ├─────────────────────>│                      │
   │                    │                      │                      │
   │                    │                      │ 6. 生成上传凭证       │
   │                    │                      │    (使用 AccessKey   │
   │                    │                      │     和 SecretKey)    │
   │                    │                      │                      │
   │                    │ 7. 返回 token 和配置  │                      │
   │                    │ { token: '...',      │                      │
   │                    │   region: 'z2',      │                      │
   │                    │   bucket: '...',     │                      │
   │                    │   uploadUrl:         │                      │
   │                    │   'up-z2.qiniup.com' }                      │
   │                    │<─────────────────────│                      │
   │                    │                      │                      │
   │                    │ 8. 调用              │                      │
   │                    │    getQiniuRegion('z2')                     │
   │                    │    返回: qiniu.region.z2                    │
   │                    │                      │                      │
   │                    │ 9. 直接上传文件       │                      │
   │                    │    (使用 qiniu-js SDK)                      │
   │                    ├──────────────────────────────────────────> │
   │                    │                      │                      │
   │                    │                      │                      │ 10. 接收文件
   │                    │                      │                      │     存储到 z2
   │                    │                      │                      │     (华南)
   │                    │                      │                      │
   │                    │ 11. 返回上传结果      │                      │
   │                    │ { key: '...',        │                      │
   │                    │   hash: '...',       │                      │
   │                    │   size: ... }        │                      │
   │                    │<──────────────────────────────────────────│
   │                    │                      │                      │
   │                    │ 12. POST /platform/  │                      │
   │                    │     qiniu/save       │                      │
   │                    │ { key, hash, size,   │                      │
   │                    │   name, mimeType }   │                      │
   │                    ├─────────────────────>│                      │
   │                    │                      │                      │
   │                    │                      │ 13. 保存到数据库      │
   │                    │                      │     system_file 表   │
   │                    │                      │                      │
   │                    │ 14. 返回文件信息      │                      │
   │                    │ { url: '...',        │                      │
   │                    │   id: 123,           │                      │
   │                    │   name: '...' }      │                      │
   │                    │<─────────────────────│                      │
   │                    │                      │                      │
   │ 15. 显示上传成功    │                      │                      │
   │<──────────────────│                      │                      │
   │                    │                      │                      │

区域映射关系

┌─────────────────────────────────────────────────────────────┐
│                  getQiniuRegion() 函数                        │
└─────────────────────────────────────────────────────────────┘

数据库配置          函数输入          函数输出              上传地址
┌──────────┐      ┌──────────┐      ┌──────────┐      ┌──────────────────┐
│ qiniu_   │      │          │      │          │      │                  │
│ region:  │ ───> │ 'z0'     │ ───> │ qiniu.   │ ───> │ up-z0.qiniup.com │
│ 'z0'     │      │          │      │ region.z0│      │ (华东)            │
└──────────┘      └──────────┘      └──────────┘      └──────────────────┘

┌──────────┐      ┌──────────┐      ┌──────────┐      ┌──────────────────┐
│ qiniu_   │      │          │      │          │      │                  │
│ region:  │ ───> │ 'z1'     │ ───> │ qiniu.   │ ───> │ up-z1.qiniup.com │
│ 'z1'     │      │          │      │ region.z1│      │ (华北)            │
└──────────┘      └──────────┘      └──────────┘      └──────────────────┘

┌──────────┐      ┌──────────┐      ┌──────────┐      ┌──────────────────┐
│ qiniu_   │      │          │      │          │      │                  │
│ region:  │ ───> │ 'z2'     │ ───> │ qiniu.   │ ───> │ up-z2.qiniup.com │
│ 'z2'     │      │          │      │ region.z2│      │ (华南) ✓ 当前     │
└──────────┘      └──────────┘      └──────────┘      └──────────────────┘

┌──────────┐      ┌──────────┐      ┌──────────┐      ┌──────────────────┐
│ qiniu_   │      │          │      │          │      │                  │
│ region:  │ ───> │ 'na0'    │ ───> │ qiniu.   │ ───> │ up-na0.qiniup.com│
│ 'na0'    │      │          │      │ region.  │      │ (北美)            │
│          │      │          │      │ na0      │      │                  │
└──────────┘      └──────────┘      └──────────┘      └──────────────────┘

┌──────────┐      ┌──────────┐      ┌──────────┐      ┌──────────────────┐
│ qiniu_   │      │          │      │          │      │                  │
│ region:  │ ───> │ 'as0'    │ ───> │ qiniu.   │ ───> │ up-as0.qiniup.com│
│ 'as0'    │      │          │      │ region.  │      │ (新加坡)          │
│          │      │          │      │ as0      │      │                  │
└──────────┘      └──────────┘      └──────────┘      └──────────────────┘

┌──────────┐      ┌──────────┐      ┌──────────┐      ┌──────────────────────┐
│ qiniu_   │      │          │      │          │      │                      │
│ region:  │ ───> │'cn-east-2'──────>│ qiniu.   │ ───> │up-cn-east-2.qiniup.  │
│'cn-east-2'      │          │      │ region.  │      │com (华东-浙江2)       │
│          │      │          │      │ cnEast2  │      │                      │
└──────────┘      └──────────┘      └──────────┘      └──────────────────────┘

代码对比

修复前(硬编码)

// ❌ 错误:硬编码区域
const config = {
  useCdnDomain: true,
  region: qiniu.region.z0,  // 总是使用华东
};

修复后(动态配置)

// ✓ 正确:动态获取区域
const { region } = tokenRes.data;  // 从后端获取: 'z2'
const qiniuRegion = getQiniuRegion(region);  // 转换为: qiniu.region.z2

const config = {
  useCdnDomain: true,
  region: qiniuRegion,  // 使用正确的区域
};

优势对比

┌─────────────────────────────────────────────────────────────┐
│                      硬编码方式                               │
└─────────────────────────────────────────────────────────────┘

缺点:
❌ 区域固定,无法灵活切换
❌ 修改区域需要改代码、重新部署
❌ 容易出现区域不匹配错误
❌ 不同环境需要不同的代码版本

┌─────────────────────────────────────────────────────────────┐
│                      动态配置方式                             │
└─────────────────────────────────────────────────────────────┘

优点:
✓ 区域灵活,可随时切换
✓ 修改区域只需改数据库配置
✓ 自动使用正确的区域
✓ 所有环境使用同一套代码
✓ 支持多租户不同区域配置

更新日期

2026-04-09