提交 9f32c29d authored 作者: mooncake9527's avatar mooncake9527

修改csv exporter 支持 upload oss or export file

上级 ddcbca28
...@@ -120,7 +120,7 @@ func nacosConf() { ...@@ -120,7 +120,7 @@ func nacosConf() {
Cfg.ConfCenter.Nacos.ContextPath = contextPath Cfg.ConfCenter.Nacos.ContextPath = contextPath
Cfg.ConfCenter.Nacos.Username = username Cfg.ConfCenter.Nacos.Username = username
Cfg.ConfCenter.Nacos.Password = password Cfg.ConfCenter.Nacos.Password = password
logger.Debug("[conf]nacos ", logger.Any("conf", Cfg.ConfCenter.Nacos)) // logger.Debug("[conf]nacos ", logger.Any("conf", Cfg.ConfCenter.Nacos))
} }
func consulConf() { func consulConf() {
......
...@@ -7,7 +7,6 @@ import ( ...@@ -7,7 +7,6 @@ import (
"github.com/nacos-group/nacos-sdk-go/clients/config_client" "github.com/nacos-group/nacos-sdk-go/clients/config_client"
"github.com/nacos-group/nacos-sdk-go/common/constant" "github.com/nacos-group/nacos-sdk-go/common/constant"
"github.com/nacos-group/nacos-sdk-go/vo" "github.com/nacos-group/nacos-sdk-go/vo"
"gitlab.wanzhuangkj.com/tush/xpkg/pkg/logger"
"gitlab.wanzhuangkj.com/tush/xpkg/pkg/xerrors/xerror" "gitlab.wanzhuangkj.com/tush/xpkg/pkg/xerrors/xerror"
"go.uber.org/zap" "go.uber.org/zap"
) )
...@@ -63,7 +62,7 @@ func (x *NacosClient) Connect() *NacosClient { ...@@ -63,7 +62,7 @@ func (x *NacosClient) Connect() *NacosClient {
constant.WithUsername(x.cfg.Username), // 用户名 constant.WithUsername(x.cfg.Username), // 用户名
constant.WithPassword(x.cfg.Password), // 密码 constant.WithPassword(x.cfg.Password), // 密码
) )
logger.Debug("[conf][nacos]", logger.Any("x.cfg", x.cfg)) // logger.Debug("[conf][nacos]", logger.Any("x.cfg", x.cfg))
serverConfigs := make([]constant.ServerConfig, 0, len(x.cfg.IPs)) serverConfigs := make([]constant.ServerConfig, 0, len(x.cfg.IPs))
for _, ip := range x.cfg.IPs { for _, ip := range x.cfg.IPs {
serverConfig := constant.NewServerConfig( serverConfig := constant.NewServerConfig(
......
...@@ -2,11 +2,17 @@ package csvexporter ...@@ -2,11 +2,17 @@ package csvexporter
import ( import (
"bytes" "bytes"
"context"
"fmt"
"io"
"path/filepath"
"github.com/gin-gonic/gin"
"github.com/gocarina/gocsv" "github.com/gocarina/gocsv"
"github.com/jinzhu/copier" "github.com/jinzhu/copier"
"gitlab.wanzhuangkj.com/tush/xpkg/config" "gitlab.wanzhuangkj.com/tush/xpkg/config"
"gitlab.wanzhuangkj.com/tush/xpkg/pkg/oss" "gitlab.wanzhuangkj.com/tush/xpkg/pkg/oss"
"gitlab.wanzhuangkj.com/tush/xpkg/utils/ctxUtils"
"gitlab.wanzhuangkj.com/tush/xpkg/xcommon/odao" "gitlab.wanzhuangkj.com/tush/xpkg/xcommon/odao"
) )
...@@ -14,7 +20,10 @@ type CSVExporter[T any] struct { ...@@ -14,7 +20,10 @@ type CSVExporter[T any] struct {
pageSize int pageSize int
page PageFn[T] page PageFn[T]
total TotalFn total TotalFn
fileURL FileURLFn filename FileURLFn
err error
content []byte
fileURL string
} }
type PageFn[T any] func(offset int) ([]*T, error) type PageFn[T any] func(offset int) ([]*T, error)
...@@ -27,32 +36,39 @@ type IPageReq interface { ...@@ -27,32 +36,39 @@ type IPageReq interface {
odao.Query odao.Query
} }
func New[T any](pageSize int, total TotalFn, page PageFn[T], fileURL FileURLFn) *CSVExporter[T] { func New[T any](pageSize int, total TotalFn, page PageFn[T], filename FileURLFn) *CSVExporter[T] {
return &CSVExporter[T]{ return &CSVExporter[T]{
pageSize: pageSize, pageSize: pageSize,
total: total, total: total,
page: page, page: page,
fileURL: fileURL, filename: filename,
} }
} }
func (x *CSVExporter[T]) Export() (string, error) { func (x *CSVExporter[T]) Export() *CSVExporter[T] {
if x.err != nil {
return x
}
total, err := x.total() total, err := x.total()
if err != nil { if err != nil {
return "", err x.err = err
return x
} }
var rs []*T var rs []*T
if total > 0 { if total > 0 {
rs, err = x.nestedLoop(total) rs, err = x.nestedLoop(total)
if err != nil { if err != nil {
return "", err x.err = err
return x
} }
} }
csvBytes, err := gocsv.MarshalBytes(&rs) content, err := gocsv.MarshalBytes(&rs)
if err != nil { if err != nil {
return "", err x.err = err
return x
} }
return x.upload(x.fileURL(), bytes.NewBuffer(csvBytes)) x.content = content
return x
} }
func (x *CSVExporter[T]) nestedLoop(total int64) ([]*T, error) { func (x *CSVExporter[T]) nestedLoop(total int64) ([]*T, error) {
...@@ -65,7 +81,6 @@ func (x *CSVExporter[T]) nestedLoop(total int64) ([]*T, error) { ...@@ -65,7 +81,6 @@ func (x *CSVExporter[T]) nestedLoop(total int64) ([]*T, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
if len(rs) == 0 { if len(rs) == 0 {
break break
} }
...@@ -75,13 +90,54 @@ func (x *CSVExporter[T]) nestedLoop(total int64) ([]*T, error) { ...@@ -75,13 +90,54 @@ func (x *CSVExporter[T]) nestedLoop(total int64) ([]*T, error) {
return ret, nil return ret, nil
} }
func (x *CSVExporter[T]) upload(fileURL string, buffer *bytes.Buffer) (fileUrl string, err error) { func (x *CSVExporter[T]) Upload() *CSVExporter[T] {
if x.err != nil {
return x
}
ossCfg := oss.AliOssConfig{} ossCfg := oss.AliOssConfig{}
config.Read(func(c *config.Config) { config.Read(func(c *config.Config) {
copier.Copy(&ossCfg, c.Oss) copier.Copy(&ossCfg, c.Oss)
}) })
if fileUrl, _, err = oss.OSS.UploadFile(buffer, fileURL, &ossCfg); err != nil { if fileUrl, _, err := oss.OSS.UploadFile(bytes.NewBuffer(x.content), x.filename(), &ossCfg); err != nil {
return "", err x.err = err
return x
} else {
x.fileURL = fileUrl
}
return x
}
func (x *CSVExporter[T]) WriteToGin(c *gin.Context) *CSVExporter[T] {
if x.err != nil {
return x
}
filename := filepath.Base(x.filename())
c.Header("Content-Type", "application/octet-stream")
c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filename))
if _, err := io.Copy(c.Writer, bytes.NewBuffer(x.content)); err != nil {
x.err = err
return x
}
c.Writer.Flush()
return x
}
func (x *CSVExporter[T]) WriteToCtx(ctx context.Context) *CSVExporter[T] {
if x.err != nil {
return x
}
c, err := ctxUtils.GetGinCtx(ctx)
if err != nil {
x.err = err
return x
} }
return fileUrl, nil return x.WriteToGin(c)
}
func (x *CSVExporter[T]) Err() error {
return x.err
}
func (x *CSVExporter[T]) URI() (string, error) {
return x.fileURL, x.err
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论