From 3ed275bd7e43ed518818cdd0d283e8c6ce85fd62 Mon Sep 17 00:00:00 2001 From: qhd <1766646056@qq.com> Date: Wed, 18 Mar 2026 13:17:59 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=B0=86=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E4=BB=8EMongoDB=E8=BF=81=E7=A7=BB=E8=87=B3PostgreSQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.yml | 52 +++++++++++++--- dao/file_dao.go | 16 +++-- dao/mongo_dao.go | 95 ----------------------------- dao/tenant_oss_total.go | 48 ++++++++++----- go.mod | 12 ++-- go.sum | 37 ++++++----- main.go | 18 +----- model/dto/file_dto.go | 14 +++-- model/dto/tenant_oss_total.go | 11 ++-- model/entity/file.go | 29 ++++++--- model/entity/tenant_oss_total.go | 24 +++++--- service/file_service.go | 14 +++-- service/tenant_oss_total_service.go | 21 +++---- update.sql | 87 +++++++++++++++++++++++++- 14 files changed, 268 insertions(+), 210 deletions(-) delete mode 100644 dao/mongo_dao.go diff --git a/config.yml b/config.yml index cb4801b..953789f 100644 --- a/config.yml +++ b/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: @@ -44,4 +74,8 @@ filePrefix: "116.204.74.41:9000" # 文件存储初始化容量大小配置 oss: - capacitySize: 500 #文件存储初始化容量(单位MB) \ No newline at end of file + capacitySize: 500 #文件存储初始化容量(单位MB) + +cache: + localTTL: 60 + redisTTL: 300 \ No newline at end of file diff --git a/dao/file_dao.go b/dao/file_dao.go index 0c0c520..5353fe1 100644 --- a/dao/file_dao.go +++ b/dao/file_dao.go @@ -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 } diff --git a/dao/mongo_dao.go b/dao/mongo_dao.go deleted file mode 100644 index bb2192f..0000000 --- a/dao/mongo_dao.go +++ /dev/null @@ -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 -} diff --git a/dao/tenant_oss_total.go b/dao/tenant_oss_total.go index bd497e2..4025785 100644 --- a/dao/tenant_oss_total.go +++ b/dao/tenant_oss_total.go @@ -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 + } + 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() + } if err != nil { return err } - filter = append(filter, bson.M{"tenantId": v.TenantId}) - update = append(update, bson.M{"$set": buildUpdateData}) - } - _, 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 } diff --git a/go.mod b/go.mod index bc5b2d0..8303fc3 100644 --- a/go.mod +++ b/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 diff --git a/go.sum b/go.sum index 0363cc8..f3e5db0 100644 --- a/go.sum +++ b/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= diff --git a/main.go b/main.go index d0b35fa..3cefe4f 100644 --- a/main.go +++ b/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 {} } diff --git a/model/dto/file_dto.go b/model/dto/file_dto.go index 8df638f..831fb7d 100644 --- a/model/dto/file_dto.go +++ b/model/dto/file_dto.go @@ -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"` - UsedOssSize int `json:"usedOssSize"` - TotalOssSize int `json:"totalOssSize"` - Updater interface{} `json:"updater"` + TenantId uint64 `json:"tenantId"` + UsedOssSize int `json:"usedOssSize"` + TotalOssSize int `json:"totalOssSize"` + Updater string `json:"updater"` } diff --git a/model/dto/tenant_oss_total.go b/model/dto/tenant_oss_total.go index 334a589..890d2b9 100644 --- a/model/dto/tenant_oss_total.go +++ b/model/dto/tenant_oss_total.go @@ -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 更新使用存储总量响应 diff --git a/model/entity/file.go b/model/entity/file.go index a3496c3..4aaecac 100644 --- a/model/entity/file.go +++ b/model/entity/file.go @@ -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", } diff --git a/model/entity/tenant_oss_total.go b/model/entity/tenant_oss_total.go index 0b387cf..c0508f9 100644 --- a/model/entity/tenant_oss_total.go +++ b/model/entity/tenant_oss_total.go @@ -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", } diff --git a/service/file_service.go b/service/file_service.go index 726b839..36aec6a 100644 --- a/service/file_service.go +++ b/service/file_service.go @@ -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 diff --git a/service/tenant_oss_total_service.go b/service/tenant_oss_total_service.go index 6b160b7..30c9ade 100644 --- a/service/tenant_oss_total_service.go +++ b/service/tenant_oss_total_service.go @@ -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 { diff --git a/update.sql b/update.sql index 807d512..eb90bc4 100644 --- a/update.sql +++ b/update.sql @@ -1 +1,86 @@ ------------张斌2025-06-16 15:00:00-------------- \ No newline at end of file +-----------张斌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表语句--------------------------- \ No newline at end of file