Files
fa053529af 图片请求统一异步处理 (#11)
* fix:未导入unicode包

* feat:图片异步转换

* feat:添加R2支持

* feat:新增文件管理

* fix:修复错误信息双写导致响应异常

* chore:渠道列表中添加快捷启用停止按钮

* fix:修复模型异常终端导致报错的问题

* improve:优化无可用渠道的日志打印,减少日志污染

* fix:在线体验出错缺少提示信息

* fix:修复日志库问题,只有请求日志保存到独立的库中

* feat:新增阿里图片模型说明文档

* fix:阿里千问图片生成

* fix:修复图片异步控制无效问题

* improve:优化文件展示,支持缩略图查看

* feat:实时监控中添加图片异步转换池状态信息

* improve:优化在线体验页面布局

* fix:修复异步任务状态显示异常问题

* feat:图片异步任务停止时等待任务完成后再退出程序

* chore:调整存储路径

---------

Co-authored-by: qian <wuchengqian5@163.com>
Co-authored-by: chengqian <wuchengqian@kkidc.com>
2026-07-18 00:26:13 +08:00

106 lines
4.0 KiB
Go

package v1
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
)
// === 文件存储管理(管理后台) ===
// FileListReq 文件列表(分页 + 筛选)。
type FileListReq struct {
g.Meta `path:"/files" method:"get" mime:"json" tags:"管理后台-文件管理" summary:"文件列表"`
Page int `json:"page" in:"query" d:"1"`
PageSize int `json:"page_size" in:"query" d:"20"`
TenantId int64 `json:"tenant_id" in:"query" dc:"按租户筛选"`
UserId int64 `json:"user_id" in:"query" dc:"按上传者筛选"`
Provider string `json:"provider" in:"query" dc:"存储供应商 s3/minio/r2/oss/cos"`
Category string `json:"category" in:"query" v:"in:|image|export|other" dc:"分类:image/export/other"`
Keyword string `json:"keyword" in:"query" dc:"按原始文件名 / 存储路径模糊匹配"`
StartDate string `json:"start_date" in:"query" dc:"创建时间起 YYYY-MM-DD"`
EndDate string `json:"end_date" in:"query" dc:"创建时间止 YYYY-MM-DD"`
}
type FileItem struct {
Id int64 `json:"id"`
TenantId int64 `json:"tenant_id"`
UserId int64 `json:"user_id"`
OriginalName string `json:"original_name"`
MimeType string `json:"mime_type"`
Size int64 `json:"size"`
StorageProvider string `json:"storage_provider"`
StoragePath string `json:"storage_path"`
Category string `json:"category"` // image | export | other
VirusScanStatus string `json:"virus_scan_status"`
CreatedAt *gtime.Time `json:"created_at"`
}
type FileListRes struct {
List []*FileItem `json:"list"`
Total int `json:"total"`
Page int `json:"page"`
PageSize int `json:"page_size"`
}
// FileStatsReq 存储占用统计(用于 KPI 卡片)。
type FileStatsReq struct {
g.Meta `path:"/files/stats" method:"get" mime:"json" tags:"管理后台-文件管理" summary:"文件存储统计"`
TopN int `json:"top_n" in:"query" d:"10" v:"min:1|max:50" dc:"Top 租户数量"`
}
type FileProviderStat struct {
Provider string `json:"provider"`
Count int64 `json:"count"`
Bytes int64 `json:"bytes"`
}
type FileCategoryStat struct {
Category string `json:"category"`
Count int64 `json:"count"`
Bytes int64 `json:"bytes"`
}
type FileTenantStat struct {
TenantId int64 `json:"tenant_id"`
Count int64 `json:"count"`
Bytes int64 `json:"bytes"`
}
type FileStatsRes struct {
TotalCount int64 `json:"total_count"`
TotalBytes int64 `json:"total_bytes"`
ByProvider []FileProviderStat `json:"by_provider"`
ByCategory []FileCategoryStat `json:"by_category"`
TopTenants []FileTenantStat `json:"top_tenants"`
}
// FileDownloadReq 生成临时预览/下载链接。variant=thumb 返回缩略图(仅图片,OSS/COS 服务端裁剪,其余供应商回退原图),空/original 返回原图。
type FileDownloadReq struct {
g.Meta `path:"/files/{id}/download" method:"get" mime:"json" tags:"管理后台-文件管理" summary:"生成文件预览/下载链接"`
Id int64 `json:"id" in:"path" v:"required|min:1"`
Variant string `json:"variant" in:"query" v:"in:thumb,original" dc:"thumb=缩略图预览,空/original=原图"`
Width int `json:"width" in:"query" d:"400" v:"min:0|max:2048" dc:"缩略图宽度像素,仅 variant=thumb 生效"`
}
type FileDownloadRes struct {
Url string `json:"url"`
}
// FileDeleteReq 删除单个文件(对象 + 记录)。
type FileDeleteReq struct {
g.Meta `path:"/files/{id}" method:"delete" mime:"json" tags:"管理后台-文件管理" summary:"删除文件"`
Id int64 `json:"id" in:"path" v:"required|min:1"`
}
type FileDeleteRes struct{}
// FileCleanupReq 手动触发一次保留期清理(导出 + 图片)。
type FileCleanupReq struct {
g.Meta `path:"/files/cleanup" method:"post" mime:"json" tags:"管理后台-文件管理" summary:"手动清理过期文件"`
}
type FileCleanupRes struct {
ExportsDeleted int `json:"exports_deleted"`
ImagesDeleted int `json:"images_deleted"`
}