refactor: 将数据库从MongoDB迁移至PostgreSQL
This commit is contained in:
50
config.yml
50
config.yml
@@ -4,15 +4,45 @@ server:
|
||||
rate:
|
||||
limit: 200
|
||||
burst: 300
|
||||
mongo:
|
||||
|
||||
# Database.
|
||||
database:
|
||||
default:
|
||||
address: "116.204.74.41:17027"
|
||||
username: "root"
|
||||
password: "M0ng0DB@Pass2026!"
|
||||
database: "oss"
|
||||
maxPoolSize: 100
|
||||
minPoolSize: 10
|
||||
connectTimeout: "10s"
|
||||
- type: "pgsql"
|
||||
host: "116.204.74.41"
|
||||
port: "15432"
|
||||
user: "postgres"
|
||||
pass: "123456"
|
||||
name: "oss"
|
||||
role: "master"
|
||||
maxIdle: "5"
|
||||
maxOpen: "20"
|
||||
maxLifetime: "60s"
|
||||
charset: "utf8mb4" #数据库编码
|
||||
debug: true
|
||||
dryRun: false #空跑
|
||||
createdAt: "created_at" # (可选)自动创建时间字段名称
|
||||
updatedAt: "updated_at" # (可选)自动更新时间字段名称
|
||||
deletedAt: "deleted_at" # (可选)软删除时间字段名称
|
||||
timeMaintainDisabled: false # (可选)是否完全关闭时间更新特性,为true时CreatedAt/UpdatedAt/DeletedAt都将失效
|
||||
- type: "pgsql"
|
||||
host: "116.204.74.41"
|
||||
port: "15432"
|
||||
user: "postgres"
|
||||
pass: "123456"
|
||||
name: "oss"
|
||||
role: "slave"
|
||||
maxIdle: "5"
|
||||
maxOpen: "20"
|
||||
maxLifetime: "60s"
|
||||
charset: "utf8mb4" #数据库编码
|
||||
debug: true
|
||||
dryRun: false #空跑
|
||||
createdAt: "created_at" # (可选)自动创建时间字段名称
|
||||
updatedAt: "updated_at" # (可选)自动更新时间字段名称
|
||||
deletedAt: "deleted_at" # (可选)软删除时间字段名称
|
||||
timeMaintainDisabled: false # (可选)是否完全关闭时间更新特性,为true时CreatedAt/UpdatedAt/DeletedAt都将失效
|
||||
|
||||
redis:
|
||||
# 集群模式配置方法
|
||||
default:
|
||||
@@ -45,3 +75,7 @@ filePrefix: "116.204.74.41:9000"
|
||||
# 文件存储初始化容量大小配置
|
||||
oss:
|
||||
capacitySize: 500 #文件存储初始化容量(单位MB)
|
||||
|
||||
cache:
|
||||
localTTL: 60
|
||||
redisTTL: 300
|
||||
@@ -3,18 +3,24 @@ package dao
|
||||
import (
|
||||
"context"
|
||||
"oss/consts"
|
||||
"oss/model/dto"
|
||||
"oss/model/entity"
|
||||
|
||||
"gitea.com/red-future/common/db/mongo"
|
||||
"gitea.com/red-future/common/db/gfdb"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"github.com/gogf/gf/v2/util/guid"
|
||||
)
|
||||
|
||||
var File = &file{}
|
||||
|
||||
type file struct {
|
||||
}
|
||||
type file struct{}
|
||||
|
||||
// Insert 插入
|
||||
func (d *file) Insert(ctx context.Context, entity *entity.File) (err error) {
|
||||
_, err = mongo.DB().Insert(ctx, []interface{}{&entity}, consts.FileCollection)
|
||||
func (d *file) Insert(ctx context.Context, req *dto.UploadFile) (res *entity.File, err error) {
|
||||
if err = gconv.Struct(req, &res); err != nil {
|
||||
return
|
||||
}
|
||||
res.Bid = guid.S()
|
||||
_, err = gfdb.DB(ctx).Model(ctx, consts.FileCollection).Insert(&res)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -1,95 +0,0 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"context"
|
||||
commonMongo "gitea.com/red-future/common/db/mongo"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"go.mongodb.org/mongo-driver/v2/bson"
|
||||
"go.mongodb.org/mongo-driver/v2/mongo"
|
||||
"go.mongodb.org/mongo-driver/v2/mongo/options"
|
||||
)
|
||||
|
||||
// MongoDAO MongoDB原生查询(不需要token验证)
|
||||
var MongoDAO = &mongoDAO{}
|
||||
|
||||
type mongoDAO struct{}
|
||||
|
||||
// SaveOrUpdate 原生批量增加或修改
|
||||
func (d *mongoDAO) SaveOrUpdate(ctx context.Context, filter []bson.M, update []bson.M, collection string, opts ...options.Lister[options.UpdateManyOptions]) (result *mongo.BulkWriteResult, err error) {
|
||||
db := commonMongo.GetDB()
|
||||
if len(filter) == 0 || len(update) == 0 {
|
||||
err = gerror.New("缺少查询条件或更新数据")
|
||||
return
|
||||
}
|
||||
if len(filter) != len(update) {
|
||||
err = gerror.New("查询条件和更新数据的数量必须一致")
|
||||
return
|
||||
}
|
||||
// 构建批量操作模型
|
||||
var models []mongo.WriteModel
|
||||
for i := 0; i < len(filter); i++ {
|
||||
if g.IsEmpty(filter[i]["tenantId"]) && g.IsEmpty(gconv.Map(update[i]["$set"])["updater"]) {
|
||||
return nil, gerror.New("tenantId不能为空")
|
||||
}
|
||||
if g.IsEmpty(filter[i]["updater"]) && g.IsEmpty(gconv.Map(update[i]["$set"])["updater"]) {
|
||||
return nil, gerror.New("updater不能为空")
|
||||
}
|
||||
// 处理过滤器
|
||||
filter[i]["isDeleted"] = false
|
||||
// 处理更新数据
|
||||
if setDoc, exists := update[i]["$set"].(bson.M); exists {
|
||||
setDoc["updater"] = gconv.Map(update[i]["$set"])["updater"]
|
||||
setDoc["updatedAt"] = gtime.Now().Time
|
||||
} else {
|
||||
// 如果没有$set字段,则创建一个
|
||||
setDoc := bson.M{}
|
||||
setDoc["updater"] = gconv.Map(update[i]["$set"])["updater"]
|
||||
setDoc["updatedAt"] = gtime.Now().Time
|
||||
update[i]["$set"] = setDoc
|
||||
}
|
||||
// 创建更新操作模型
|
||||
updateModel := mongo.NewUpdateOneModel()
|
||||
updateModel.SetFilter(filter[i])
|
||||
updateModel.SetUpdate(update[i])
|
||||
updateModel.SetUpsert(true) // 默认不插入新文档
|
||||
// 处理选项参数
|
||||
if len(opts) > 0 {
|
||||
for _, opt := range opts {
|
||||
var updateOpts options.UpdateManyOptions
|
||||
optFuncs := opt.List()
|
||||
for _, fn := range optFuncs {
|
||||
fn(&updateOpts)
|
||||
}
|
||||
if updateOpts.Upsert != nil {
|
||||
updateModel.SetUpsert(*updateOpts.Upsert)
|
||||
}
|
||||
}
|
||||
}
|
||||
models = append(models, updateModel)
|
||||
}
|
||||
// 执行批量操作,无序执行提高性能
|
||||
bulkOpts := options.BulkWrite().SetOrdered(false)
|
||||
bulkResult, err := db.Collection(collection).BulkWrite(ctx, models, bulkOpts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// 清理相关缓存
|
||||
for i := 0; i < len(filter); i++ {
|
||||
var tenantId any
|
||||
if g.IsEmpty(filter[i]["tenantId"]) {
|
||||
tenantId = filter[i]["tenantId"]
|
||||
}
|
||||
if g.IsEmpty(gconv.Map(update[i]["$set"])["tenantId"]) {
|
||||
tenantId = gconv.Map(update[i]["$set"])["tenantId"]
|
||||
}
|
||||
err = commonMongo.DB().CleanRedis(ctx, filter[i], tenantId, collection)
|
||||
if err != nil {
|
||||
glog.Warning(ctx, "清理Redis缓存失败:", err)
|
||||
}
|
||||
}
|
||||
return bulkResult, nil
|
||||
}
|
||||
@@ -6,38 +6,58 @@ import (
|
||||
"oss/model/dto"
|
||||
"oss/model/entity"
|
||||
|
||||
"gitea.com/red-future/common/db/mongo"
|
||||
"gitea.com/red-future/common/db/gfdb"
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"go.mongodb.org/mongo-driver/v2/bson"
|
||||
"github.com/gogf/gf/v2/util/guid"
|
||||
)
|
||||
|
||||
var TenantOssTotal = &tenantOssTotal{}
|
||||
|
||||
type tenantOssTotal struct {
|
||||
}
|
||||
type tenantOssTotal struct{}
|
||||
|
||||
// SaveOrUpdate 增加或更新
|
||||
func (d *tenantOssTotal) SaveOrUpdate(ctx context.Context, updateData []*dto.UpdateUsedOssReq) (err error) {
|
||||
if !g.IsEmpty(updateData) {
|
||||
var filter, update []bson.M
|
||||
for _, v := range updateData {
|
||||
buildUpdateData, err := mongo.BuildUpdateData(ctx, v)
|
||||
model := gfdb.DB(ctx).Model(ctx, consts.TenantOssTotalCollection).Where(gdb.Map{"tenant_id": v.TenantId})
|
||||
// 检查是否存在
|
||||
count, err := model.Count()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
filter = append(filter, bson.M{"tenantId": v.TenantId})
|
||||
update = append(update, bson.M{"$set": buildUpdateData})
|
||||
if count > 0 {
|
||||
// 更新
|
||||
_, err = model.Data(gdb.Map{
|
||||
"used_oss_size": v.UsedOssSize,
|
||||
"total_oss_size": v.TotalOssSize,
|
||||
"updater": v.Updater,
|
||||
}).Update()
|
||||
} else {
|
||||
// 插入
|
||||
_, err = gfdb.DB(ctx).Model(ctx, consts.TenantOssTotalCollection).Data(gdb.Map{
|
||||
"bid": guid.S(),
|
||||
"tenant_id": v.TenantId,
|
||||
"used_oss_size": v.UsedOssSize,
|
||||
"total_oss_size": v.TotalOssSize,
|
||||
"creator": v.Updater,
|
||||
"updater": v.Updater,
|
||||
}).Insert()
|
||||
}
|
||||
_, err = MongoDAO.SaveOrUpdate(ctx, filter, update, consts.TenantOssTotalCollection)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (d *tenantOssTotal) GetOneByTenantId(ctx context.Context, req *dto.GetByTenantIdReq) (res *entity.TenantOssTotal, err error) {
|
||||
filter := bson.M{"tenantId": req.TenantId}
|
||||
err = mongo.DB().FindOne(ctx, filter, &res, consts.TenantOssTotalCollection)
|
||||
model := gfdb.DB(ctx).Model(ctx, consts.TenantOssTotalCollection).Where(entity.TenantOssCol.TenantId, req.TenantId)
|
||||
record, err := model.One()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = record.Struct(&res)
|
||||
return
|
||||
}
|
||||
|
||||
12
go.mod
12
go.mod
@@ -4,9 +4,9 @@ go 1.25.5
|
||||
|
||||
require (
|
||||
gitea.com/red-future/common v0.0.3
|
||||
github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.10.0
|
||||
github.com/gogf/gf/contrib/nosql/redis/v2 v2.9.5
|
||||
github.com/gogf/gf/v2 v2.9.5
|
||||
go.mongodb.org/mongo-driver/v2 v2.4.1
|
||||
github.com/gogf/gf/v2 v2.10.0
|
||||
)
|
||||
|
||||
//replace gitea.com/red-future/common => ../common
|
||||
@@ -21,7 +21,7 @@ require (
|
||||
github.com/dgraph-io/ristretto v0.1.1 // indirect
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||
github.com/emirpasic/gods v1.18.1 // indirect
|
||||
github.com/emirpasic/gods/v2 v2.0.0-alpha // indirect
|
||||
github.com/fatih/color v1.18.0 // indirect
|
||||
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||
github.com/go-ini/ini v1.67.0 // indirect
|
||||
@@ -52,6 +52,7 @@ require (
|
||||
github.com/klauspost/compress v1.18.0 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.11 // indirect
|
||||
github.com/klauspost/crc32 v1.3.0 // indirect
|
||||
github.com/lib/pq v1.10.9 // indirect
|
||||
github.com/magiconair/properties v1.8.10 // indirect
|
||||
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
@@ -61,15 +62,11 @@ require (
|
||||
github.com/minio/minio-go/v7 v7.0.97 // indirect
|
||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/nats-io/nats.go v1.48.0 // indirect
|
||||
github.com/nats-io/nkeys v0.4.11 // indirect
|
||||
github.com/nats-io/nuid v1.0.1 // indirect
|
||||
github.com/olekukonko/errors v1.1.0 // indirect
|
||||
github.com/olekukonko/ll v0.0.9 // indirect
|
||||
github.com/olekukonko/tablewriter v1.1.0 // indirect
|
||||
github.com/philhofer/fwd v1.2.0 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/rabbitmq/amqp091-go v1.10.0 // indirect
|
||||
github.com/redis/go-redis/v9 v9.12.1 // indirect
|
||||
github.com/rivo/uniseg v0.4.7 // indirect
|
||||
github.com/rs/xid v1.6.0 // indirect
|
||||
@@ -80,6 +77,7 @@ require (
|
||||
github.com/xdg-go/scram v1.1.2 // indirect
|
||||
github.com/xdg-go/stringprep v1.0.4 // indirect
|
||||
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
|
||||
go.mongodb.org/mongo-driver/v2 v2.4.1 // indirect
|
||||
go.opencensus.io v0.23.0 // indirect
|
||||
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
|
||||
go.opentelemetry.io/otel v1.38.0 // indirect
|
||||
|
||||
37
go.sum
37
go.sum
@@ -1,6 +1,6 @@
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
gitea.com/red-future/common v0.0.2 h1:KjiIyZo0JeSN9ldXofuGkFifJ/H66kTybOU34Yew7R0=
|
||||
gitea.com/red-future/common v0.0.2/go.mod h1:CUurYN0elToJTwB2pX9wSnjQqZv9D/Vxbo5ueb7i9BI=
|
||||
gitea.com/red-future/common v0.0.3 h1:2/lRXkJeeD7A+YmMmST83iv2NdFTzi6FFmTxZLQEaIM=
|
||||
gitea.com/red-future/common v0.0.3/go.mod h1:mq4smQZFI5nYul6gvLH7ScnC/26bAOcTvR3hP625NYY=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||
@@ -50,8 +50,8 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cu
|
||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
||||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
|
||||
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
|
||||
github.com/emirpasic/gods/v2 v2.0.0-alpha h1:dwFlh8pBg1VMOXWGipNMRt8v96dKAIvBehtCt6OtunU=
|
||||
github.com/emirpasic/gods/v2 v2.0.0-alpha/go.mod h1:W0y4M2dtBB9U5z3YlghmpuUhiaZT2h6yoeE+C1sCp6A=
|
||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||
@@ -75,14 +75,16 @@ github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4
|
||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.10.0 h1:39+jbTenm7KBj4hO2C8ANAxVHpX/7OuRDs1VcGC9ylA=
|
||||
github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.10.0/go.mod h1:B0s0fVzn0W220E8UTpSGzrrGKsop5KcB90twBeLCiz0=
|
||||
github.com/gogf/gf/contrib/nosql/redis/v2 v2.9.5 h1:Ku7p3CvGchxC7zPSgArf/tZs2w9Yb8tS/gH5ADN+p9g=
|
||||
github.com/gogf/gf/contrib/nosql/redis/v2 v2.9.5/go.mod h1:cjy18NsSLZQf5zaLAzuo7B2gr8GGjCTWDTEPY7T+6FI=
|
||||
github.com/gogf/gf/contrib/registry/consul/v2 v2.9.5 h1:eUqwJ/qNH8lJ6yssiqskazgp1ACQuNU6zXlLOZVuXTQ=
|
||||
github.com/gogf/gf/contrib/registry/consul/v2 v2.9.5/go.mod h1:sjQyMry9+0POYZCA6lHXBxO77WoNKkruJpRB4xKqk5k=
|
||||
github.com/gogf/gf/contrib/trace/otlphttp/v2 v2.9.5 h1:tHUEZYB5GTqEYYVDYnlGobf1xISARKDE4KHVlgjwTec=
|
||||
github.com/gogf/gf/contrib/trace/otlphttp/v2 v2.9.5/go.mod h1:cfzTn2HS9RDX8f5pUVkbGxUWcSosouqfNQ1G6cY0V88=
|
||||
github.com/gogf/gf/v2 v2.9.5 h1:1scfOdHbMP854oQaiLejl+eL+c4xfuvtWmmZiDJxbKs=
|
||||
github.com/gogf/gf/v2 v2.9.5/go.mod h1:VUb5eyJKpvW77O/dXsbbLNO/Kjrg0UycIiq0lRiBjjo=
|
||||
github.com/gogf/gf/v2 v2.10.0 h1:rzDROlyqGMe/eM6dCalSR8dZOuMIdLhmxKSH1DGhbFs=
|
||||
github.com/gogf/gf/v2 v2.10.0/go.mod h1:Svl1N+E8G/QshU2DUbh/3J/AJauqCgUnxHurXWR4Qx0=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
@@ -168,8 +170,7 @@ github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b
|
||||
github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=
|
||||
github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
|
||||
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||
github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
|
||||
github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
||||
github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
|
||||
@@ -198,6 +199,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
|
||||
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE=
|
||||
github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
@@ -218,8 +221,9 @@ github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6T
|
||||
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
|
||||
github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=
|
||||
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
|
||||
github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
|
||||
github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
|
||||
github.com/minio/crc64nvme v1.1.0 h1:e/tAguZ+4cw32D+IO/8GSf5UVr9y+3eJcxZI2WOO/7Q=
|
||||
github.com/minio/crc64nvme v1.1.0/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg=
|
||||
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
|
||||
@@ -237,12 +241,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/nats-io/nats.go v1.48.0 h1:pSFyXApG+yWU/TgbKCjmm5K4wrHu86231/w84qRVR+U=
|
||||
github.com/nats-io/nats.go v1.48.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g=
|
||||
github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0=
|
||||
github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE=
|
||||
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
|
||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
||||
github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM=
|
||||
github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y=
|
||||
github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI=
|
||||
@@ -275,8 +273,6 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b
|
||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
||||
github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
|
||||
github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
|
||||
github.com/redis/go-redis/v9 v9.12.1 h1:k5iquqv27aBtnTm2tIkROUDp8JBXhXZIVu1InSgvovg=
|
||||
github.com/redis/go-redis/v9 v9.12.1/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
|
||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
@@ -351,8 +347,7 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
|
||||
golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU=
|
||||
golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ=
|
||||
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8=
|
||||
golang.org/x/exp v0.0.0-20250128144449-3edf0e91c1ae h1:COZdc9Ut6wLq7MO9GIYxfZl4n4ScmgqQLoHocKXrxco=
|
||||
golang.org/x/exp v0.0.0-20250128144449-3edf0e91c1ae/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
@@ -360,6 +355,8 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
|
||||
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
@@ -437,6 +434,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
|
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
|
||||
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
||||
18
main.go
18
main.go
@@ -6,12 +6,12 @@ import (
|
||||
"oss/service"
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
"github.com/gogf/gf/v2/os/gtimer"
|
||||
|
||||
"gitea.com/red-future/common/http"
|
||||
"gitea.com/red-future/common/jaeger"
|
||||
_ "github.com/gogf/gf/contrib/drivers/pgsql/v2"
|
||||
_ "github.com/gogf/gf/contrib/nosql/redis/v2"
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
"github.com/gogf/gf/v2/os/gtimer"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -30,18 +30,6 @@ func main() {
|
||||
}
|
||||
})
|
||||
|
||||
// 启动消息队列消费者
|
||||
//if err := message.StartConsumers(ctx, &message.RedisMessageConfig{
|
||||
// StreamKey: mongo.LogRedisKey,
|
||||
// GroupName: consts.GroupName,
|
||||
// ConsumerName: consts.ConsumerName,
|
||||
// BatchSize: consts.BatchSize,
|
||||
// AutoAck: consts.AutoAck,
|
||||
// HandleFunc: logService.OperationLog.AddOperationLog,
|
||||
//}); err != nil {
|
||||
// return
|
||||
//}
|
||||
|
||||
// 保持应用运行
|
||||
select {}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,12 @@ type UploadFileReq struct {
|
||||
File *ghttp.UploadFile `json:"file" type:"file"` // 文件URL
|
||||
}
|
||||
|
||||
type UploadFile struct {
|
||||
TenantId uint64 `json:"tenantId"`
|
||||
FileURL string `json:"fileURL"`
|
||||
FileSize int `json:"fileSize"`
|
||||
}
|
||||
|
||||
// UploadFileRes 上传文件响应
|
||||
type UploadFileRes struct {
|
||||
FileURL string `json:"fileURL" dc:"上传地址"`
|
||||
@@ -18,8 +24,8 @@ type UploadFileRes struct {
|
||||
}
|
||||
|
||||
type TenantOssTotal struct {
|
||||
TenantId interface{} `json:"tenantId"`
|
||||
TenantId uint64 `json:"tenantId"`
|
||||
UsedOssSize int `json:"usedOssSize"`
|
||||
TotalOssSize int `json:"totalOssSize"`
|
||||
Updater interface{} `json:"updater"`
|
||||
Updater string `json:"updater"`
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
package dto
|
||||
|
||||
import (
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"oss/model/entity"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
)
|
||||
|
||||
// GetByTenantIdReq 根据租户id获取存储总量请求
|
||||
@@ -20,10 +21,10 @@ type GetByTenantIdRes struct {
|
||||
type UpdateUsedOssReq struct {
|
||||
g.Meta `path:"/GetOneByTenantId" method:"get" tags:"租户存储总量管理" summary:"更新使用存储总量" dc:"更新使用存储总量"`
|
||||
|
||||
TenantId interface{} `json:"tenantId" v:"required#租户id不能为空"`
|
||||
UsedOssSize int `bson:"usedOssSize" json:"usedOssSize"`
|
||||
TotalOssSize int `bson:"totalOssSize" json:"totalOssSize"`
|
||||
Updater interface{} `json:"updater" v:"required#更新人不能为空"`
|
||||
TenantId uint64 `json:"tenantId" v:"required#租户id不能为空"`
|
||||
UsedOssSize int `json:"usedOssSize"`
|
||||
TotalOssSize int `json:"totalOssSize"`
|
||||
Updater string `json:"updater" v:"required#更新人不能为空"`
|
||||
}
|
||||
|
||||
// UpdateUsedOssRes 更新使用存储总量响应
|
||||
|
||||
@@ -1,20 +1,31 @@
|
||||
package entity
|
||||
|
||||
import (
|
||||
"oss/consts"
|
||||
|
||||
"gitea.com/red-future/common/beans"
|
||||
)
|
||||
|
||||
// File 存储文件实体
|
||||
type File struct {
|
||||
beans.MongoBaseDO `bson:",inline"` // 嵌入基础字段:Id, Creator, CreatedAt, Updater, UpdatedAt, TenantId, IsDeleted
|
||||
// 基础信息
|
||||
FileURL string `bson:"fileURL" json:"fileURL"` // 图URL
|
||||
FileSize int `bson:"fileSize" json:"fileSize"`
|
||||
beans.SQLBaseDO `orm:",inherit"` // 嵌入基础字段:Id, Bid, Creator, CreatedAt, Updater, UpdatedAt, Deleter, DeletedAt, IsDeleted
|
||||
// 业务字段
|
||||
Bid string `orm:"bid" json:"bid"`
|
||||
TenantId uint64 `orm:"tenant_id" json:"tenantId"` // 租户ID
|
||||
FileURL string `orm:"file_url" json:"fileURL"` // 文件URL
|
||||
FileSize int `orm:"file_size" json:"fileSize"`
|
||||
}
|
||||
|
||||
// CollectionName 存储集合名称
|
||||
func (File) CollectionName() string {
|
||||
return consts.FileCollection
|
||||
type fileCol struct {
|
||||
beans.SQLBaseCol
|
||||
Bid string
|
||||
TenantId string
|
||||
FileURL string
|
||||
FileSize string
|
||||
}
|
||||
|
||||
var FileCol = fileCol{
|
||||
SQLBaseCol: beans.DefSQLBaseCol,
|
||||
Bid: "bid",
|
||||
TenantId: "tenant_id",
|
||||
FileURL: "file_url",
|
||||
FileSize: "file_size",
|
||||
}
|
||||
|
||||
@@ -1,20 +1,28 @@
|
||||
package entity
|
||||
|
||||
import (
|
||||
"oss/consts"
|
||||
|
||||
"gitea.com/red-future/common/beans"
|
||||
)
|
||||
|
||||
// TenantOssTotal 租户储存服务总计实体
|
||||
type TenantOssTotal struct {
|
||||
beans.MongoBaseDO `bson:",inline"` // 嵌入基础字段:Id, Creator, CreatedAt, Updater, UpdatedAt, TenantId, IsDeleted
|
||||
beans.SQLBaseDO `orm:",inherit"` // 嵌入基础字段:Id, Creator, CreatedAt, Updater, UpdatedAt, TenantId, IsDeleted
|
||||
// 基础信息
|
||||
UsedOssSize int `bson:"usedOssSize" json:"usedOssSize"`
|
||||
TotalOssSize int `bson:"totalOssSize" json:"totalOssSize"`
|
||||
TenantId uint64 `orm:"tenant_id" json:"tenantId"` // 租户ID
|
||||
UsedOssSize int `orm:"used_oss_size" json:"usedOssSize"`
|
||||
TotalOssSize int `orm:"total_oss_size" json:"totalOssSize"`
|
||||
}
|
||||
|
||||
// CollectionName 租户储存服务总计集合名称
|
||||
func (TenantOssTotal) CollectionName() string {
|
||||
return consts.TenantOssTotalCollection
|
||||
type tenantOssCol struct {
|
||||
beans.SQLBaseCol
|
||||
TenantId string
|
||||
UsedOssSize string
|
||||
TotalOssSize string
|
||||
}
|
||||
|
||||
var TenantOssCol = tenantOssCol{
|
||||
SQLBaseCol: beans.DefSQLBaseCol,
|
||||
TenantId: "tenant_id",
|
||||
UsedOssSize: "used_oss_size",
|
||||
TotalOssSize: "total_oss_size",
|
||||
}
|
||||
|
||||
@@ -3,13 +3,14 @@ package service
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
"oss/consts"
|
||||
"oss/dao"
|
||||
"oss/model/dto"
|
||||
"oss/model/entity"
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
|
||||
"gitea.com/red-future/common/minio"
|
||||
"gitea.com/red-future/common/redis"
|
||||
"gitea.com/red-future/common/utils"
|
||||
@@ -51,18 +52,18 @@ func (f *file) UploadFile(ctx context.Context, req *dto.UploadFileReq) (res *dto
|
||||
getByTenantIdReq := &dto.GetByTenantIdReq{
|
||||
TenantId: user.TenantId,
|
||||
}
|
||||
tenantOssTotalRes, err := TenantOssTotal.GetOneByTenantId(ctx, getByTenantIdReq)
|
||||
tenantOssTotalRes, err := dao.TenantOssTotal.GetOneByTenantId(ctx, getByTenantIdReq)
|
||||
if err != nil {
|
||||
glog.Errorf(ctx, "查询数据库-获取租户存储容量总数失败: %v", err)
|
||||
return err
|
||||
}
|
||||
if tenantOssTotalRes == nil || tenantOssTotalRes.TenantOssTotal == nil || g.IsEmpty(tenantOssTotalRes.Id) || tenantOssTotalRes.Id.IsZero() {
|
||||
if tenantOssTotalRes == nil || g.IsEmpty(tenantOssTotalRes.Id) {
|
||||
// 数据库中没有该租户的记录,创建默认配置
|
||||
tenantOssTotalEntity.TenantId = user.TenantId
|
||||
tenantOssTotalEntity.UsedOssSize = 0
|
||||
tenantOssTotalEntity.TotalOssSize = g.Cfg().MustGet(ctx, "oss.capacitySize").Int() * 1024 * 1024
|
||||
} else {
|
||||
tenantOssTotalEntity = tenantOssTotalRes.TenantOssTotal
|
||||
tenantOssTotalEntity = tenantOssTotalRes
|
||||
}
|
||||
} else {
|
||||
// 反序列化-redis获取租户存储容量总数
|
||||
@@ -104,11 +105,12 @@ func (f *file) UploadFile(ctx context.Context, req *dto.UploadFileReq) (res *dto
|
||||
return nil, err
|
||||
}
|
||||
// 插入数据库
|
||||
ossEntity := &entity.File{
|
||||
ossEntity := &dto.UploadFile{
|
||||
TenantId: tenantId,
|
||||
FileURL: fileURL,
|
||||
FileSize: fileSize,
|
||||
}
|
||||
if err = dao.File.Insert(ctx, ossEntity); err != nil {
|
||||
if _, err = dao.File.Insert(ctx, ossEntity); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// 返回图片url
|
||||
|
||||
@@ -2,12 +2,14 @@ package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"gitea.com/red-future/common/redis"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"oss/consts"
|
||||
"oss/dao"
|
||||
"oss/model/dto"
|
||||
|
||||
"gitea.com/red-future/common/beans"
|
||||
"gitea.com/red-future/common/redis"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
type tenantOssTotal struct{}
|
||||
@@ -15,17 +17,10 @@ type tenantOssTotal struct{}
|
||||
// TenantOssTotal 存储文件服务
|
||||
var TenantOssTotal = new(tenantOssTotal)
|
||||
|
||||
func (s *tenantOssTotal) GetOneByTenantId(ctx context.Context, req *dto.GetByTenantIdReq) (res *dto.GetByTenantIdRes, err error) {
|
||||
e, err := dao.TenantOssTotal.GetOneByTenantId(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &dto.GetByTenantIdRes{
|
||||
TenantOssTotal: e,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *tenantOssTotal) UpdateUsedOssSize(ctx context.Context) (err error) {
|
||||
ctx = context.WithValue(ctx, "user", &beans.User{
|
||||
UserName: "admin",
|
||||
})
|
||||
// 使用 Keys 取出所有key
|
||||
keys, err := redis.RedisClient().Keys(ctx, consts.OssTotalKey)
|
||||
if err != nil {
|
||||
|
||||
85
update.sql
85
update.sql
@@ -1 +1,86 @@
|
||||
-----------张斌2025-06-16 15:00:00--------------
|
||||
|
||||
--------------------pgsql创建file表语句---------------------------
|
||||
|
||||
-- 存储文件表
|
||||
CREATE TABLE IF NOT EXISTS file (
|
||||
-- 基础字段
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
bid VARCHAR(64) NOT NULL,
|
||||
creator VARCHAR(64) NOT NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updater VARCHAR(64) NOT NULL,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
deleter VARCHAR(64),
|
||||
deleted_at timestamp(6),
|
||||
|
||||
-- 文件核心字段
|
||||
tenant_id BIGINT NOT NULL,
|
||||
file_url VARCHAR(512) NOT NULL,
|
||||
file_size INT NOT NULL DEFAULT 0,
|
||||
|
||||
-- 唯一索引 & 普通索引
|
||||
CONSTRAINT uk_file_bid UNIQUE (bid)
|
||||
);
|
||||
-- 为文件表添加索引
|
||||
CREATE INDEX idx_file_tenant_id ON file(tenant_id);
|
||||
CREATE INDEX idx_file_file_size ON file(file_size);
|
||||
|
||||
-- 文件表字段注释
|
||||
COMMENT ON TABLE file IS '存储文件表';
|
||||
COMMENT ON COLUMN file.id IS '主键ID';
|
||||
COMMENT ON COLUMN file.bid IS '业务ID';
|
||||
COMMENT ON COLUMN file.creator IS '创建人';
|
||||
COMMENT ON COLUMN file.created_at IS '创建时间';
|
||||
COMMENT ON COLUMN file.updater IS '更新人';
|
||||
COMMENT ON COLUMN file.updated_at IS '更新时间';
|
||||
COMMENT ON COLUMN file.deleter IS '删除人(软删)';
|
||||
COMMENT ON COLUMN file.deleted_at IS '删除时间(软删)';
|
||||
COMMENT ON COLUMN file.tenant_id IS '租户ID';
|
||||
COMMENT ON COLUMN file.file_url IS '文件URL';
|
||||
COMMENT ON COLUMN file.file_size IS '文件大小(字节)';
|
||||
|
||||
--------------------pgsql创建file表语句---------------------------
|
||||
|
||||
|
||||
--------------------pgsql创建tenant_oss_total表语句---------------------------
|
||||
|
||||
-- 租户存储服务总计表
|
||||
CREATE TABLE IF NOT EXISTS tenant_oss_total (
|
||||
-- 基础字段
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
bid VARCHAR(64) NOT NULL,
|
||||
creator VARCHAR(64) NOT NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updater VARCHAR(64) NOT NULL,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
deleter VARCHAR(64),
|
||||
deleted_at timestamp(6),
|
||||
|
||||
-- 租户存储字段
|
||||
tenant_id BIGINT NOT NULL,
|
||||
used_oss_size INT NOT NULL DEFAULT 0,
|
||||
total_oss_size INT NOT NULL DEFAULT 0,
|
||||
|
||||
-- 唯一索引 & 普通索引
|
||||
CONSTRAINT uk_tenant_oss_total_tenant_id UNIQUE (tenant_id)
|
||||
);
|
||||
-- 为租户存储表添加索引
|
||||
CREATE INDEX idx_tenant_oss_total_used_size ON tenant_oss_total(used_oss_size);
|
||||
CREATE INDEX idx_tenant_oss_total_total_size ON tenant_oss_total(total_oss_size);
|
||||
|
||||
-- 租户存储表字段注释
|
||||
COMMENT ON TABLE tenant_oss_total IS '租户存储服务总计表';
|
||||
COMMENT ON COLUMN tenant_oss_total.id IS '主键ID';
|
||||
COMMENT ON COLUMN tenant_oss_total.bid IS '业务ID';
|
||||
COMMENT ON COLUMN tenant_oss_total.creator IS '创建人';
|
||||
COMMENT ON COLUMN tenant_oss_total.created_at IS '创建时间';
|
||||
COMMENT ON COLUMN tenant_oss_total.updater IS '更新人';
|
||||
COMMENT ON COLUMN tenant_oss_total.updated_at IS '更新时间';
|
||||
COMMENT ON COLUMN tenant_oss_total.deleter IS '删除人(软删)';
|
||||
COMMENT ON COLUMN tenant_oss_total.deleted_at IS '删除时间(软删)';
|
||||
COMMENT ON COLUMN tenant_oss_total.tenant_id IS '租户ID';
|
||||
COMMENT ON COLUMN tenant_oss_total.used_oss_size IS '已使用存储大小(字节)';
|
||||
COMMENT ON COLUMN tenant_oss_total.total_oss_size IS '总存储大小(字节)';
|
||||
|
||||
--------------------pgsql创建tenant_oss_total表语句---------------------------
|
||||
Reference in New Issue
Block a user