正在显示
10 个修改的文件
包含
171 行增加
和
7 行删除
| @@ -4,6 +4,7 @@ go 1.16 | @@ -4,6 +4,7 @@ go 1.16 | ||
| 4 | 4 | ||
| 5 | require ( | 5 | require ( |
| 6 | github.com/ajg/form v1.5.1 // indirect | 6 | github.com/ajg/form v1.5.1 // indirect |
| 7 | + github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible // indirect | ||
| 7 | github.com/beego/beego/v2 v2.0.1 | 8 | github.com/beego/beego/v2 v2.0.1 |
| 8 | github.com/bwmarrin/snowflake v0.3.0 | 9 | github.com/bwmarrin/snowflake v0.3.0 |
| 9 | github.com/dgrijalva/jwt-go v3.2.0+incompatible | 10 | github.com/dgrijalva/jwt-go v3.2.0+incompatible |
| @@ -5,6 +5,9 @@ import ( | @@ -5,6 +5,9 @@ import ( | ||
| 5 | "fmt" | 5 | "fmt" |
| 6 | "github.com/beego/beego/v2/client/httplib" | 6 | "github.com/beego/beego/v2/client/httplib" |
| 7 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/excel" | 7 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/excel" |
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/log" | ||
| 10 | + "os" | ||
| 8 | "time" | 11 | "time" |
| 9 | 12 | ||
| 10 | "github.com/linmadan/egglib-go/core/application" | 13 | "github.com/linmadan/egglib-go/core/application" |
| @@ -315,7 +318,7 @@ func (fileService *FileService) ExportFile(ctx *domain.Context, cmd *command.Exp | @@ -315,7 +318,7 @@ func (fileService *FileService) ExportFile(ctx *domain.Context, cmd *command.Exp | ||
| 315 | return nil, factory.FastError(err) | 318 | return nil, factory.FastError(err) |
| 316 | } | 319 | } |
| 317 | 320 | ||
| 318 | - f, err := httplib.Get(file.FileInfo.Url).Bytes() | 321 | + f, err := httplib.Get(domain.ConvertFileUrlToInternal(file.FileInfo.Url)).Bytes() |
| 319 | if err != nil { | 322 | if err != nil { |
| 320 | return nil, factory.FastError(err) | 323 | return nil, factory.FastError(err) |
| 321 | } | 324 | } |
| @@ -333,7 +336,31 @@ func (fileService *FileService) ExportFile(ctx *domain.Context, cmd *command.Exp | @@ -333,7 +336,31 @@ func (fileService *FileService) ExportFile(ctx *domain.Context, cmd *command.Exp | ||
| 333 | return nil, factory.FastError(err) | 336 | return nil, factory.FastError(err) |
| 334 | } | 337 | } |
| 335 | 338 | ||
| 339 | + var ( | ||
| 340 | + config = utils.RouterConfig{ | ||
| 341 | + OssEndPoint: "oss-cn-hangzhou.aliyuncs-internal.com", | ||
| 342 | + AccessKeyID: "LTAI4Fz1LUBW2fXp6QWaJHRS", | ||
| 343 | + AccessKeySecret: "aLZXwK8pgrs10Ws03qcN7NsrSXFVsg", | ||
| 344 | + BuckName: "byte-bank", | ||
| 345 | + } | ||
| 346 | + key = fmt.Sprintf("byte-bank/%v/%v", time.Now().Format("2006-01-02"), filename) | ||
| 347 | + ) | ||
| 348 | + bucket, bucketErr := utils.NewBucket(config) | ||
| 349 | + if bucketErr == nil && bucket != nil { | ||
| 350 | + log.Logger.Info(fmt.Sprintf("end-point:%v key:%v", config.OssEndPoint, key)) | ||
| 351 | + f, _ := os.Open(path) | ||
| 352 | + if err = utils.CreateObjects(bucket, utils.Object{ | ||
| 353 | + Key: key, | ||
| 354 | + Value: f, | ||
| 355 | + }); err != nil { | ||
| 356 | + log.Logger.Error(err.Error()) | ||
| 357 | + } else { | ||
| 358 | + response.Url = domain.ConvertInternalFileUrlToPublic(fmt.Sprintf("https://%v.%v/%v", config.BuckName, config.OssEndPoint, key)) | ||
| 359 | + } | ||
| 360 | + } | ||
| 361 | + if len(response.Url) == 0 { | ||
| 336 | response.Url = domain.DownloadUrl(filename) | 362 | response.Url = domain.DownloadUrl(filename) |
| 363 | + } | ||
| 337 | response.FileName = file.FileInfo.Name | 364 | response.FileName = file.FileInfo.Name |
| 338 | response.Ext = domain.XLSX | 365 | response.Ext = domain.XLSX |
| 339 | 366 |
| @@ -17,6 +17,7 @@ type TablePreviewCommand struct { | @@ -17,6 +17,7 @@ type TablePreviewCommand struct { | ||
| 17 | PageSize int `json:"pageSize"` | 17 | PageSize int `json:"pageSize"` |
| 18 | Where domain.Where `json:"where"` | 18 | Where domain.Where `json:"where"` |
| 19 | UseCache bool `json:"useCache"` | 19 | UseCache bool `json:"useCache"` |
| 20 | + HiddenData bool `json:"hiddenData"` // 隐藏数据,只返回结构 | ||
| 20 | } | 21 | } |
| 21 | 22 | ||
| 22 | func (cmd *TablePreviewCommand) Valid(validation *validation.Validation) { | 23 | func (cmd *TablePreviewCommand) Valid(validation *validation.Validation) { |
| @@ -16,6 +16,7 @@ type TablePreviewDto struct { | @@ -16,6 +16,7 @@ type TablePreviewDto struct { | ||
| 16 | Fields []*domain.Field `json:"fields"` | 16 | Fields []*domain.Field `json:"fields"` |
| 17 | Data interface{} `json:"grid"` | 17 | Data interface{} `json:"grid"` |
| 18 | //Total int64 `json:"total"` | 18 | //Total int64 `json:"total"` |
| 19 | + HiddenData bool `json:"-"` | ||
| 19 | } | 20 | } |
| 20 | 21 | ||
| 21 | func (d *TablePreviewDto) Load(m *domain.Table, dataTable *domain.DataTable, objectType string) *TablePreviewDto { | 22 | func (d *TablePreviewDto) Load(m *domain.Table, dataTable *domain.DataTable, objectType string) *TablePreviewDto { |
| @@ -26,6 +27,12 @@ func (d *TablePreviewDto) Load(m *domain.Table, dataTable *domain.DataTable, obj | @@ -26,6 +27,12 @@ func (d *TablePreviewDto) Load(m *domain.Table, dataTable *domain.DataTable, obj | ||
| 26 | d.Fields = dataTable.MatchFields(m.Fields(true)) | 27 | d.Fields = dataTable.MatchFields(m.Fields(true)) |
| 27 | d.Data = domain.GripData(domain.ToFieldData(m.Fields(true), dataTable.Data, false), dataTable.Total) | 28 | d.Data = domain.GripData(domain.ToFieldData(m.Fields(true), dataTable.Data, false), dataTable.Total) |
| 28 | //d.Total = dataTable.Total | 29 | //d.Total = dataTable.Total |
| 30 | + if d.HiddenData { | ||
| 31 | + d.Data = map[string]interface{}{ | ||
| 32 | + "list": make([]map[string]string, 0), | ||
| 33 | + "total": 0, | ||
| 34 | + } | ||
| 35 | + } | ||
| 29 | return d | 36 | return d |
| 30 | } | 37 | } |
| 31 | 38 |
| @@ -42,7 +42,7 @@ func (tableService *TableService) TablePreview(ctx *domain.Context, cmd *command | @@ -42,7 +42,7 @@ func (tableService *TableService) TablePreview(ctx *domain.Context, cmd *command | ||
| 42 | cacheMiss = true | 42 | cacheMiss = true |
| 43 | } | 43 | } |
| 44 | } | 44 | } |
| 45 | - response := &dto.TablePreviewDto{} | 45 | + response := &dto.TablePreviewDto{HiddenData: cmd.HiddenData} |
| 46 | if dataTable == nil { | 46 | if dataTable == nil { |
| 47 | switch table.TableType { | 47 | switch table.TableType { |
| 48 | case domain.CalculateSet.ToString(): | 48 | case domain.CalculateSet.ToString(): |
| 1 | package domain | 1 | package domain |
| 2 | 2 | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/constant" | ||
| 5 | + "strings" | ||
| 6 | +) | ||
| 7 | + | ||
| 3 | // FileInfo 文件信息 | 8 | // FileInfo 文件信息 |
| 4 | type FileInfo struct { | 9 | type FileInfo struct { |
| 5 | // 名称 | 10 | // 名称 |
| @@ -17,3 +22,31 @@ type FileInfo struct { | @@ -17,3 +22,31 @@ type FileInfo struct { | ||
| 17 | // 行号 | 22 | // 行号 |
| 18 | HeaderRow int `json:"headerRow"` | 23 | HeaderRow int `json:"headerRow"` |
| 19 | } | 24 | } |
| 25 | + | ||
| 26 | +// ConvertFileUrlToInternal 传递内网地址 | ||
| 27 | +// byte-bank.oss-cn-hangzhou 当oss与字库同属于这个节点下面,使用内网进行传输 | ||
| 28 | +func ConvertFileUrlToInternal(fileUrl string) string { | ||
| 29 | + if constant.SERVICE_ENV != "prod" { | ||
| 30 | + return fileUrl | ||
| 31 | + } | ||
| 32 | + var bucketRegion = "https://byte-bank.oss-cn-hangzhou" | ||
| 33 | + var bucketInternalRegion = "https://byte-bank.oss-cn-hangzhou-internal" | ||
| 34 | + if strings.HasPrefix(fileUrl, bucketRegion) { | ||
| 35 | + return strings.Replace(fileUrl, bucketRegion, bucketInternalRegion, 1) | ||
| 36 | + } | ||
| 37 | + return fileUrl | ||
| 38 | +} | ||
| 39 | + | ||
| 40 | +// ConvertInternalFileUrlToPublic 转内网地址为外网地址 | ||
| 41 | +func ConvertInternalFileUrlToPublic(fileUrl string) string { | ||
| 42 | + //var bucketRegion = "https://byte-bank.oss-cn-hangzhou" | ||
| 43 | + //var bucketInternalRegion = "https://byte-bank.oss-cn-hangzhou-internal" | ||
| 44 | + //if strings.HasPrefix(fileUrl, bucketInternalRegion) { | ||
| 45 | + // return strings.Replace(fileUrl, bucketInternalRegion, bucketRegion, 1) | ||
| 46 | + //} | ||
| 47 | + var internal = "-internal" | ||
| 48 | + if strings.Contains(fileUrl, internal) { | ||
| 49 | + return strings.Replace(fileUrl, internal, "", 1) | ||
| 50 | + } | ||
| 51 | + return fileUrl | ||
| 52 | +} |
| 1 | package bytelib | 1 | package bytelib |
| 2 | 2 | ||
| 3 | -import "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" | 3 | +import ( |
| 4 | + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" | ||
| 5 | +) | ||
| 4 | 6 | ||
| 5 | func DomainFieldsToColumnSchemas(fields []*domain.Field) []domain.ColumnSchema { | 7 | func DomainFieldsToColumnSchemas(fields []*domain.Field) []domain.ColumnSchema { |
| 6 | result := make([]domain.ColumnSchema, 0) | 8 | result := make([]domain.ColumnSchema, 0) |
| @@ -10,6 +10,7 @@ type RequestCheckoutTablesQuery struct { | @@ -10,6 +10,7 @@ type RequestCheckoutTablesQuery struct { | ||
| 10 | OriginalTableId string `json:"originalTableId"` | 10 | OriginalTableId string `json:"originalTableId"` |
| 11 | IsFromOriginalTable bool `json:"isFromOriginalTable"` | 11 | IsFromOriginalTable bool `json:"isFromOriginalTable"` |
| 12 | TableFileUrl string `json:"tableFileUrl"` | 12 | TableFileUrl string `json:"tableFileUrl"` |
| 13 | + TableFileUrlInternal string `json:"tableFileUrlInternal"` | ||
| 13 | ColumnSchemas []domain.ColumnSchema `json:"columnSchemas"` | 14 | ColumnSchemas []domain.ColumnSchema `json:"columnSchemas"` |
| 14 | PageNumber int `json:"pageNumber"` | 15 | PageNumber int `json:"pageNumber"` |
| 15 | PageSize int `json:"pageSize"` | 16 | PageSize int `json:"pageSize"` |
| @@ -44,7 +45,8 @@ func NewRequestCheckoutTablesQuery(param domain.ReqLoadDataTable) RequestCheckou | @@ -44,7 +45,8 @@ func NewRequestCheckoutTablesQuery(param domain.ReqLoadDataTable) RequestCheckou | ||
| 44 | return RequestCheckoutTablesQuery{ | 45 | return RequestCheckoutTablesQuery{ |
| 45 | OriginalTableId: param.OriginalTableId, | 46 | OriginalTableId: param.OriginalTableId, |
| 46 | IsFromOriginalTable: isSourceFile, | 47 | IsFromOriginalTable: isSourceFile, |
| 47 | - TableFileUrl: tableFileUrl, | 48 | + TableFileUrl: domain.ConvertFileUrlToInternal(tableFileUrl), |
| 49 | + TableFileUrlInternal: tableFileUrl, | ||
| 48 | ColumnSchemas: param.ColumnSchemas, | 50 | ColumnSchemas: param.ColumnSchemas, |
| 49 | PageNumber: param.PageNumber, | 51 | PageNumber: param.PageNumber, |
| 50 | PageSize: param.PageSize, | 52 | PageSize: param.PageSize, |
| @@ -135,6 +137,7 @@ type ( | @@ -135,6 +137,7 @@ type ( | ||
| 135 | RequestCheckoutTablesGenerateMasterTable struct { | 137 | RequestCheckoutTablesGenerateMasterTable struct { |
| 136 | OriginalTableId string `json:"originalTableId"` | 138 | OriginalTableId string `json:"originalTableId"` |
| 137 | CheckoutTableFileUrl string `json:"checkoutTableFileUrl"` | 139 | CheckoutTableFileUrl string `json:"checkoutTableFileUrl"` |
| 140 | + CheckoutTableFileUrlInternal string `json:"checkoutTableFileUrlInternal"` | ||
| 138 | ColumnSchemas []domain.ColumnSchema `json:"columnSchemas"` | 141 | ColumnSchemas []domain.ColumnSchema `json:"columnSchemas"` |
| 139 | MasterTableName string `json:"masterTableName"` | 142 | MasterTableName string `json:"masterTableName"` |
| 140 | FieldSchemas []FieldSchema `json:"fieldSchemas"` | 143 | FieldSchemas []FieldSchema `json:"fieldSchemas"` |
| @@ -155,7 +158,8 @@ type ( | @@ -155,7 +158,8 @@ type ( | ||
| 155 | func NewRequestCheckoutTablesGenerateMasterTable(param domain.ReqGenerateTable) RequestCheckoutTablesGenerateMasterTable { | 158 | func NewRequestCheckoutTablesGenerateMasterTable(param domain.ReqGenerateTable) RequestCheckoutTablesGenerateMasterTable { |
| 156 | request := RequestCheckoutTablesGenerateMasterTable{ | 159 | request := RequestCheckoutTablesGenerateMasterTable{ |
| 157 | OriginalTableId: fmt.Sprintf("%v", param.FileId), | 160 | OriginalTableId: fmt.Sprintf("%v", param.FileId), |
| 158 | - CheckoutTableFileUrl: param.FileUrl, | 161 | + CheckoutTableFileUrl: domain.ConvertFileUrlToInternal(param.FileUrl), |
| 162 | + CheckoutTableFileUrlInternal: param.FileUrl, | ||
| 159 | ColumnSchemas: DomainFieldsToColumnSchemas(param.Table.DataFields), | 163 | ColumnSchemas: DomainFieldsToColumnSchemas(param.Table.DataFields), |
| 160 | MasterTableName: param.Table.SQLName, | 164 | MasterTableName: param.Table.SQLName, |
| 161 | FieldSchemas: ToFieldSchemas(param.Table.DataFields), | 165 | FieldSchemas: ToFieldSchemas(param.Table.DataFields), |
| @@ -169,6 +173,7 @@ type ( | @@ -169,6 +173,7 @@ type ( | ||
| 169 | //MasterTableId string `json:"masterTableId"` | 173 | //MasterTableId string `json:"masterTableId"` |
| 170 | OriginalTableId string `json:"originalTableId"` | 174 | OriginalTableId string `json:"originalTableId"` |
| 171 | CheckoutTableFileUrl string `json:"checkoutTableFileUrl"` | 175 | CheckoutTableFileUrl string `json:"checkoutTableFileUrl"` |
| 176 | + CheckoutTableFileUrlInternal string `json:"checkoutTableFileUrlInternal"` | ||
| 172 | DatabaseTableName string `json:"databaseTableName"` | 177 | DatabaseTableName string `json:"databaseTableName"` |
| 173 | ColumnSchemas []domain.ColumnSchema `json:"columnSchemas"` | 178 | ColumnSchemas []domain.ColumnSchema `json:"columnSchemas"` |
| 174 | FieldSchemas []FieldSchema `json:"fieldSchemas"` | 179 | FieldSchemas []FieldSchema `json:"fieldSchemas"` |
| @@ -193,7 +198,8 @@ func NewTableAppendRequest(param domain.ReqAppendData) TableAppendRequest { | @@ -193,7 +198,8 @@ func NewTableAppendRequest(param domain.ReqAppendData) TableAppendRequest { | ||
| 193 | columnSchemas := DomainFieldsToColumnSchemas(param.From) | 198 | columnSchemas := DomainFieldsToColumnSchemas(param.From) |
| 194 | req := TableAppendRequest{ | 199 | req := TableAppendRequest{ |
| 195 | OriginalTableId: intToString(param.FileId), | 200 | OriginalTableId: intToString(param.FileId), |
| 196 | - CheckoutTableFileUrl: param.FileUrl, | 201 | + CheckoutTableFileUrl: domain.ConvertFileUrlToInternal(param.FileUrl), |
| 202 | + CheckoutTableFileUrlInternal: param.FileUrl, | ||
| 197 | DatabaseTableName: param.Table.SQLName, | 203 | DatabaseTableName: param.Table.SQLName, |
| 198 | ColumnSchemas: DomainFieldsToColumnSchemas(param.ExcelTable.DataFields), //这里主要需要传递原文件所有字段 param.From | 204 | ColumnSchemas: DomainFieldsToColumnSchemas(param.ExcelTable.DataFields), //这里主要需要传递原文件所有字段 param.From |
| 199 | FieldSchemas: ToFieldSchemas(param.Table.DataFields), | 205 | FieldSchemas: ToFieldSchemas(param.Table.DataFields), |
| @@ -41,7 +41,7 @@ func (ptr *FlushDataTableService) Flush(ctx *domain.Context, fileId int, table * | @@ -41,7 +41,7 @@ func (ptr *FlushDataTableService) Flush(ctx *domain.Context, fileId int, table * | ||
| 41 | // 临时文件 -》校验文件 | 41 | // 临时文件 -》校验文件 |
| 42 | var newUrl string | 42 | var newUrl string |
| 43 | if response != nil { | 43 | if response != nil { |
| 44 | - newUrl = response.Url | 44 | + newUrl = domain.ConvertInternalFileUrlToPublic(response.Url) |
| 45 | } | 45 | } |
| 46 | log.Logger.Info("更新文件地址", map[string]interface{}{"from_url": file.FileInfo.Url, "to_url": newUrl, "sourceFileId": file.SourceFileId}) | 46 | log.Logger.Info("更新文件地址", map[string]interface{}{"from_url": file.FileInfo.Url, "to_url": newUrl, "sourceFileId": file.SourceFileId}) |
| 47 | switch sourceFile.FileType { | 47 | switch sourceFile.FileType { |
pkg/infrastructure/utils/oss.go
0 → 100644
| 1 | +package utils | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/aliyun/aliyun-oss-go-sdk/oss" | ||
| 6 | + "github.com/google/uuid" | ||
| 7 | + "io" | ||
| 8 | + "path" | ||
| 9 | + "time" | ||
| 10 | +) | ||
| 11 | + | ||
| 12 | +type RouterConfig struct { | ||
| 13 | + OssEndPoint string | ||
| 14 | + AccessKeyID string | ||
| 15 | + AccessKeySecret string | ||
| 16 | + BuckName string | ||
| 17 | + AppProject string | ||
| 18 | + | ||
| 19 | + RegionID string | ||
| 20 | + RoleArn string | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +type ( | ||
| 24 | + CreateStsAuthRequest struct { | ||
| 25 | + Files []string `json:"files"` | ||
| 26 | + } | ||
| 27 | + CreateStsAuthResponse struct { | ||
| 28 | + Certificate interface{} `json:"certificate"` | ||
| 29 | + Files []BuckObject `json:"files"` | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | + Object struct { | ||
| 33 | + Key string | ||
| 34 | + Value io.Reader | ||
| 35 | + } | ||
| 36 | + BuckObject struct { | ||
| 37 | + DefaultHost string `json:"host"` | ||
| 38 | + Key string `json:"key"` | ||
| 39 | + Path string `json:"path"` | ||
| 40 | + FileName string `json:"fileName"` | ||
| 41 | + } | ||
| 42 | +) | ||
| 43 | + | ||
| 44 | +func NewBucket(config RouterConfig) (*oss.Bucket, error) { | ||
| 45 | + client, err := oss.New(config.OssEndPoint, config.AccessKeyID, config.AccessKeySecret) | ||
| 46 | + if err != nil { | ||
| 47 | + return nil, err | ||
| 48 | + } | ||
| 49 | + bucket, err := client.Bucket(config.BuckName) | ||
| 50 | + if err != nil { | ||
| 51 | + return nil, err | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + return bucket, nil | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +func CreateObjects(bucket *oss.Bucket, objects ...Object) error { | ||
| 58 | + for _, object := range objects { | ||
| 59 | + err := bucket.PutObject(object.Key, object.Value) | ||
| 60 | + if err != nil { | ||
| 61 | + return err | ||
| 62 | + } | ||
| 63 | + } | ||
| 64 | + return nil | ||
| 65 | +} | ||
| 66 | + | ||
| 67 | +func DeleteObjects(bucket *oss.Bucket, objects ...string) error { | ||
| 68 | + for _, object := range objects { | ||
| 69 | + err := bucket.DeleteObject(object) | ||
| 70 | + if err != nil { | ||
| 71 | + return err | ||
| 72 | + } | ||
| 73 | + } | ||
| 74 | + return nil | ||
| 75 | +} | ||
| 76 | + | ||
| 77 | +func GetFileName(projectName, filename string) string { | ||
| 78 | + date := time.Now().Format("20060102") | ||
| 79 | + ext := path.Ext(filename) | ||
| 80 | + if len(projectName) == 0 { | ||
| 81 | + projectName = "default" | ||
| 82 | + } | ||
| 83 | + uid, _ := uuid.NewUUID() | ||
| 84 | + filename = fmt.Sprintf("%v%v", uid.String(), ext) | ||
| 85 | + sourcePath := fmt.Sprintf("%v/%v/%v", projectName, date, filename) | ||
| 86 | + return sourcePath | ||
| 87 | +} |
-
请 注册 或 登录 后发表评论