go-platform/docs/storage-config-guide.md
2026-04-09 16:26:38 +08:00

254 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 存储配置功能说明
## 功能概述
系统支持两种文件存储方式:
1. **本地存储**:文件存储在服务器本地磁盘
2. **七牛云存储**:文件存储在七牛云对象存储服务
## 数据库变更
### 新增表
**表名**: `yz_system_storage_config`
**字段说明**:
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | bigint(20) | 主键ID |
| storage_type | varchar(20) | 存储类型: local/qiniu |
| qiniu_access_key | varchar(255) | 七牛云AccessKey |
| qiniu_secret_key | varchar(255) | 七牛云SecretKey |
| qiniu_bucket | varchar(128) | 七牛云Bucket名称 |
| qiniu_domain | varchar(255) | 七牛云CDN域名 |
| qiniu_region | varchar(50) | 七牛云存储区域 |
| create_time | datetime | 创建时间 |
| update_time | datetime | 更新时间 |
### 执行迁移
```bash
# 在MySQL中执行迁移脚本
mysql -u your_user -p your_database < go/migrations/add_storage_config_table.sql
```
## 后端实现
### 新增文件
1. **模型文件**: `go/models/storage_config.go`
- 定义 `StorageConfig` 模型
- 提供 `GetStorageConfig()` 方法获取配置
2. **控制器文件**: `go/controllers/storage_config.go`
- `GetStorageConfig`: 获取存储配置
- `SaveStorageConfig`: 保存存储配置
3. **路由注册**: `go/routers/platform/platform.go`
```go
beego.Router("/platform/storageConfig", &controllers.StorageConfigController{}, "get:GetStorageConfig")
beego.Router("/platform/saveStorageConfig", &controllers.StorageConfigController{}, "post:SaveStorageConfig")
```
### API接口
#### 获取存储配置
```
GET /platform/storageConfig
```
**响应示例**:
```json
{
"code": 200,
"msg": "success",
"data": {
"storage_type": "qiniu",
"qiniu_access_key": "your_access_key",
"qiniu_secret_key": "your_secret_key",
"qiniu_bucket": "your_bucket",
"qiniu_domain": "https://cdn.example.com",
"qiniu_region": "z0"
}
}
```
#### 保存存储配置
```
POST /platform/saveStorageConfig
```
**请求体**:
```json
{
"storage_type": "qiniu",
"qiniu_access_key": "your_access_key",
"qiniu_secret_key": "your_secret_key",
"qiniu_bucket": "your_bucket",
"qiniu_domain": "https://cdn.example.com",
"qiniu_region": "z0"
}
```
## 前端实现
### 新增文件
1. **API文件**: `platform/src/api/sitesettings.js`
- 新增 `getStorageConfig()` 方法
- 新增 `saveStorageConfig()` 方法
2. **组件文件**: `platform/src/views/system/platformsettings/components/storageSettings.vue`
- 存储配置表单组件
- 支持本地存储和七牛云存储切换
- 表单验证和数据持久化
3. **页面更新**: `platform/src/views/system/platformsettings/index.vue`
- 新增"存储配置"标签页
### 使用说明
1. 登录平台管理后台
2. 进入"系统设置" -> "平台设置"
3. 切换到"存储配置"标签页
4. 选择存储类型:
- **本地存储**:无需额外配置
- **七牛云存储**:需要填写以下信息
### 七牛云配置步骤
1. **注册七牛云账号**
- 访问 https://www.qiniu.com/
- 注册并完成实名认证
2. **创建存储空间**
- 登录七牛云控制台
- 进入"对象存储" -> "空间管理"
- 点击"新建空间"
- 填写空间名称Bucket
- 选择存储区域
- 设置访问控制(建议选择"公开"
3. **获取密钥**
- 进入"个人中心" -> "密钥管理"
- 查看或创建 AccessKey 和 SecretKey
4. **配置CDN域名**
- 在存储空间详情页,进入"域名管理"
- 添加自定义域名或使用测试域名
- 完成域名备案和CNAME解析
- 获取CDN加速域名
5. **填写配置信息**
- AccessKey: 从密钥管理获取
- SecretKey: 从密钥管理获取
- Bucket: 存储空间名称
- CDN域名: 完整的域名地址(如 https://cdn.example.com
- 存储区域: 选择创建空间时的区域
### 存储区域对照表
| 区域名称 | 区域代码 |
|---------|---------|
| 华东-浙江 | z0 |
| 华北-河北 | z1 |
| 华南-广东 | z2 |
| 北美-洛杉矶 | na0 |
| 亚太-新加坡 | as0 |
| 华东-浙江2 | cn-east-2 |
## 后续开发建议
### 文件上传服务改造
需要修改文件上传相关的代码,根据 `storage_type` 选择不同的存储方式:
```go
// 示例代码
func UploadFile(file *multipart.FileHeader) (string, error) {
cfg, _ := models.GetStorageConfig()
switch cfg.StorageType {
case "qiniu":
return uploadToQiniu(file, cfg)
case "local":
return uploadToLocal(file)
default:
return uploadToLocal(file)
}
}
```
### 七牛云SDK集成
需要安装七牛云Go SDK
```bash
go get github.com/qiniu/go-sdk/v7
```
示例上传代码:
```go
import (
"github.com/qiniu/go-sdk/v7/auth/qbox"
"github.com/qiniu/go-sdk/v7/storage"
)
func uploadToQiniu(file *multipart.FileHeader, cfg *models.StorageConfig) (string, error) {
mac := qbox.NewMac(cfg.QiniuAccessKey, cfg.QiniuSecretKey)
putPolicy := storage.PutPolicy{
Scope: cfg.QiniuBucket,
}
upToken := putPolicy.UploadToken(mac)
// 配置上传参数
cfg := storage.Config{
Zone: &storage.ZoneHuadong, // 根据 cfg.QiniuRegion 选择
UseHTTPS: true,
UseCdnDomains: false,
}
formUploader := storage.NewFormUploader(&cfg)
ret := storage.PutRet{}
// 执行上传
err := formUploader.PutFile(context.Background(), &ret, upToken, key, localFile, nil)
if err != nil {
return "", err
}
// 返回完整URL
return cfg.QiniuDomain + "/" + ret.Key, nil
}
```
## 注意事项
1. **安全性**
- SecretKey 在数据库中明文存储,建议后续加密处理
- 生产环境建议使用环境变量或密钥管理服务
2. **成本**
- 七牛云存储和流量会产生费用
- 建议设置合理的存储策略和CDN缓存规则
3. **迁移**
- 切换存储方式时,已有文件不会自动迁移
- 需要手动迁移或保持双存储支持
4. **备份**
- 重要文件建议定期备份
- 七牛云支持跨区域备份功能
## 测试清单
- [ ] 数据库表创建成功
- [ ] 后端API接口正常
- [ ] 前端页面显示正常
- [ ] 本地存储配置保存成功
- [ ] 七牛云配置保存成功
- [ ] 表单验证正常工作
- [ ] 配置切换功能正常
- [ ] 数据持久化正常