作者 yangfu

Merge remote-tracking branch 'origin/test'

@@ -541,3 +541,18 @@ extractMethod: 提取方法(1.by-date:按日期 2.by-number:按数值) @@ -541,3 +541,18 @@ extractMethod: 提取方法(1.by-date:按日期 2.by-number:按数值)
541 ``` 541 ```
542 convertType:转换类型 STRING 数值: INT 小数: FLOAT 日期: DATE 时间: DATETIME 542 convertType:转换类型 STRING 数值: INT 小数: FLOAT 日期: DATE 时间: DATETIME
543 ``` 543 ```
  544 +
  545 +## 优化点
  546 +- [] 0.测试服务、数据库的上限(QPS,TPS)查询瓶颈的接口
  547 +
  548 +- [] 1.模型详情缓存(tables、query_set)
  549 +
  550 +- [] 2.列表搜索缓存 (tables、query_set),减轻数据库压力
  551 +
  552 +```
  553 +更新、删除、重命名
  554 +get list:queryset:cxxx:*
  555 +删除所有匹配的缓存
  556 +
  557 +消息队列更新事件、确保缓存一定移除成功、缓存时间控制
  558 +```
@@ -21,3 +21,4 @@ STARROCKS_PORT = 9030 @@ -21,3 +21,4 @@ STARROCKS_PORT = 9030
21 21
22 BLACK_LIST_USER = 0 22 BLACK_LIST_USER = 0
23 BLACK_LIST_COMPANY = 1612991734952759296 23 BLACK_LIST_COMPANY = 1612991734952759296
  24 +WHITE_LIST_USERS = 22,23
@@ -18,4 +18,7 @@ CREATE INDEX IF NOT EXISTS idx_logs_company_id_operator_name ON metadata.logs US @@ -18,4 +18,7 @@ CREATE INDEX IF NOT EXISTS idx_logs_company_id_operator_name ON metadata.logs US
18 CREATE INDEX IF NOT EXISTS idx_logs_company_id_created_at ON metadata.logs USING btree((context->>'companyId'),created_at); 18 CREATE INDEX IF NOT EXISTS idx_logs_company_id_created_at ON metadata.logs USING btree((context->>'companyId'),created_at);
19 19
20 /*mapping_rules*/ 20 /*mapping_rules*/
21 -CREATE INDEX IF NOT EXISTS idx_mapping_rules_company_id_table_id_file_id ON metadata.mapping_rules USING btree((context->>'companyId'),table_id,file_id);  
  21 +CREATE INDEX IF NOT EXISTS idx_mapping_rules_company_id_table_id_file_id ON metadata.mapping_rules USING btree((context->>'companyId'),table_id,file_id);
  22 +
  23 +/*query_sets*/
  24 +CREATE INDEX IF NOT EXISTS idx_query_sets_company_id_type_deleted_at ON metadata.query_sets USING btree((context->>'companyId'),type,deleted_at);
@@ -117,6 +117,8 @@ spec: @@ -117,6 +117,8 @@ spec:
117 value: "1" 117 value: "1"
118 - name: BLACK_LIST_COMPANY 118 - name: BLACK_LIST_COMPANY
119 value: "1646025721363042304" 119 value: "1646025721363042304"
  120 + - name: WHITE_LIST_USERS
  121 + value: "0"
120 volumes: 122 volumes:
121 - name: accesslogs 123 - name: accesslogs
122 emptyDir: {} 124 emptyDir: {}
@@ -45,5 +45,7 @@ require ( @@ -45,5 +45,7 @@ require (
45 45
46 replace ( 46 replace (
47 github.com/extrame/xls v0.0.1 => github.com/tiptok/xls v1.0.1 47 github.com/extrame/xls v0.0.1 => github.com/tiptok/xls v1.0.1
48 - github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 => github.com/tiptok/egglib-go v0.0.0-20220421085958-9682d0ac42c1 48 + //github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 => github.com/tiptok/egglib-go v0.0.0-20220421085958-9682d0ac42c1
  49 + github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 => github.com/tiptok/egglib-go v1.0.0
  50 +
49 ) 51 )
@@ -311,12 +311,12 @@ func (querySetService *QuerySetService) SearchQuerySet(ctx *domain.Context, sear @@ -311,12 +311,12 @@ func (querySetService *QuerySetService) SearchQuerySet(ctx *domain.Context, sear
311 if err != nil { 311 if err != nil {
312 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 312 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
313 } 313 }
314 - if err := transactionContext.StartTransaction(); err != nil {  
315 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
316 - }  
317 - defer func() {  
318 - transactionContext.RollbackTransaction()  
319 - }() 314 + //if err := transactionContext.StartTransaction(); err != nil {
  315 + // return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  316 + //}
  317 + //defer func() {
  318 + // transactionContext.RollbackTransaction()
  319 + //}()
320 320
321 QuerySetRepository, _, _ := factory.FastPgQuerySet(transactionContext, 0) 321 QuerySetRepository, _, _ := factory.FastPgQuerySet(transactionContext, 0)
322 options := utils.ObjectToMap(searchQuerySetQuery) 322 options := utils.ObjectToMap(searchQuerySetQuery)
@@ -361,9 +361,9 @@ func (querySetService *QuerySetService) SearchQuerySet(ctx *domain.Context, sear @@ -361,9 +361,9 @@ func (querySetService *QuerySetService) SearchQuerySet(ctx *domain.Context, sear
361 361
362 var result = dto.NewQuerySetDtoList(querySets) 362 var result = dto.NewQuerySetDtoList(querySets)
363 363
364 - if err := transactionContext.CommitTransaction(); err != nil {  
365 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
366 - } 364 + //if err := transactionContext.CommitTransaction(); err != nil {
  365 + // return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  366 + //}
367 return map[string]interface{}{ 367 return map[string]interface{}{
368 "count": count, 368 "count": count,
369 "querySets": result, 369 "querySets": result,
@@ -426,6 +426,15 @@ func (tableService *TableService) ApplyOn(ctx *domain.Context, cmd *command.Appl @@ -426,6 +426,15 @@ func (tableService *TableService) ApplyOn(ctx *domain.Context, cmd *command.Appl
426 } else { 426 } else {
427 table.TableInfo.SetApplyOn(cmd.Module) 427 table.TableInfo.SetApplyOn(cmd.Module)
428 } 428 }
  429 + if !ctx.Access() {
  430 + for i := range cmd.Modules {
  431 + // 字库应用于数控目前限制在3万条记录以内,在字库的应用于数控按钮上增加判断,如果超过3万条,
  432 + // 错误提示:普通用户数据限制在3万条记录,如需使用更多数据,请联系管理员,需针对公司配置应用记录上限数值,未配置默认3万条
  433 + if cmd.Modules[i] == domain.ModuleDigitalCenter && table.RowCount > 30000 {
  434 + return nil, factory.FastError(fmt.Errorf("普通用户数据限制在3万条记录,如需使用更多数据,请联系管理员,需针对公司配置应用记录上限数值,未配置默认3万条"))
  435 + }
  436 + }
  437 + }
429 438
430 table, err = tableRepository.Save(table) 439 table, err = tableRepository.Save(table)
431 if err != nil { 440 if err != nil {
@@ -19,12 +19,12 @@ func (tableService *TableService) TableObjectSearch(searchQuery *query.SearchTab @@ -19,12 +19,12 @@ func (tableService *TableService) TableObjectSearch(searchQuery *query.SearchTab
19 if err != nil { 19 if err != nil {
20 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 20 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
21 } 21 }
22 - if err := transactionContext.StartTransaction(); err != nil {  
23 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
24 - }  
25 - defer func() {  
26 - transactionContext.RollbackTransaction()  
27 - }() 22 + //if err := transactionContext.StartTransaction(); err != nil {
  23 + // return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  24 + //}
  25 + //defer func() {
  26 + // transactionContext.RollbackTransaction()
  27 + //}()
28 28
29 tableRepository, _, _ := factory.FastPgTable(transactionContext, 0) 29 tableRepository, _, _ := factory.FastPgTable(transactionContext, 0)
30 _, tables, err := tableRepository.Find(utils.ObjectToMap(searchQuery)) 30 _, tables, err := tableRepository.Find(utils.ObjectToMap(searchQuery))
@@ -112,9 +112,9 @@ func (tableService *TableService) TableObjectSearch(searchQuery *query.SearchTab @@ -112,9 +112,9 @@ func (tableService *TableService) TableObjectSearch(searchQuery *query.SearchTab
112 groupItem.LoadGroup(querySetGroup) 112 groupItem.LoadGroup(querySetGroup)
113 response = append(response, groupItem) 113 response = append(response, groupItem)
114 } 114 }
115 - if err := transactionContext.CommitTransaction(); err != nil {  
116 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
117 - } 115 + //if err := transactionContext.CommitTransaction(); err != nil {
  116 + // return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  117 + //}
118 118
119 sort.Slice(response, func(i, j int) bool { 119 sort.Slice(response, func(i, j int) bool {
120 item1 := response[i] 120 item1 := response[i]
@@ -21,12 +21,12 @@ func (tableService *TableService) TablePreview(ctx *domain.Context, cmd *command @@ -21,12 +21,12 @@ func (tableService *TableService) TablePreview(ctx *domain.Context, cmd *command
21 if err != nil { 21 if err != nil {
22 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 22 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
23 } 23 }
24 - if err := transactionContext.StartTransaction(); err != nil {  
25 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
26 - }  
27 - defer func() {  
28 - transactionContext.RollbackTransaction()  
29 - }() 24 + //if err := transactionContext.StartTransaction(); err != nil {
  25 + // return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  26 + //}
  27 + //defer func() {
  28 + // transactionContext.RollbackTransaction()
  29 + //}()
30 var dataTable *domain.DataTable 30 var dataTable *domain.DataTable
31 var table *domain.Table 31 var table *domain.Table
32 var cacheMiss bool 32 var cacheMiss bool
@@ -91,8 +91,8 @@ func (tableService *TableService) TablePreview(ctx *domain.Context, cmd *command @@ -91,8 +91,8 @@ func (tableService *TableService) TablePreview(ctx *domain.Context, cmd *command
91 // 存储缓存 91 // 存储缓存
92 cache.SetDataTable(table.TableId, dataTable) 92 cache.SetDataTable(table.TableId, dataTable)
93 } 93 }
94 - if err := transactionContext.CommitTransaction(); err != nil {  
95 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
96 - } 94 + //if err := transactionContext.CommitTransaction(); err != nil {
  95 + // return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  96 + //}
97 return response, nil 97 return response, nil
98 } 98 }
@@ -2,6 +2,8 @@ package constant @@ -2,6 +2,8 @@ package constant
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "strconv"
  6 + "strings"
5 ) 7 )
6 8
7 var SERVICE_NAME = "character-library-metadata-bastion" 9 var SERVICE_NAME = "character-library-metadata-bastion"
@@ -26,8 +28,9 @@ var BYTE_CORE_HOST = "http://192.168.100.34:8303" @@ -26,8 +28,9 @@ var BYTE_CORE_HOST = "http://192.168.100.34:8303"
26 28
27 var AUTH_SERVER_HOST = "http://digital-platform-dev.fjmaimaimai.com" 29 var AUTH_SERVER_HOST = "http://digital-platform-dev.fjmaimaimai.com"
28 30
29 -var BlacklistUser int64  
30 -var BlackListCompany int64 31 +var BLACK_LIST_USER int64
  32 +var BLACK_LIST_COMPANY int64
  33 +var WHITE_LIST_USERS []int
31 34
32 //var CUSTOMER_ACCOUNT = []int64{3129687560814592, 3129687690100739, 3492238958608384} 35 //var CUSTOMER_ACCOUNT = []int64{3129687560814592, 3129687690100739, 3492238958608384}
33 36
@@ -53,6 +56,12 @@ func init() { @@ -53,6 +56,12 @@ func init() {
53 PPROF_ON = Configurator.DefaultBool("PPROF_ON", PPROF_ON) 56 PPROF_ON = Configurator.DefaultBool("PPROF_ON", PPROF_ON)
54 CACHE_PREFIX = SERVICE_NAME + ":" + SERVICE_ENV 57 CACHE_PREFIX = SERVICE_NAME + ":" + SERVICE_ENV
55 58
56 - BlacklistUser = Configurator.DefaultInt64("BLACK_LIST_USER", BlacklistUser)  
57 - BlackListCompany = Configurator.DefaultInt64("BLACK_LIST_COMPANY", BlackListCompany) 59 + BLACK_LIST_USER = Configurator.DefaultInt64("BLACK_LIST_USER", BLACK_LIST_USER)
  60 + BLACK_LIST_COMPANY = Configurator.DefaultInt64("BLACK_LIST_COMPANY", BLACK_LIST_COMPANY)
  61 +
  62 + whiteListUsers := strings.Split(Configurator.DefaultString("WHITE_LIST_USERS", ""), ",")
  63 + for _, userId := range whiteListUsers {
  64 + v, _ := strconv.Atoi(userId)
  65 + WHITE_LIST_USERS = append(WHITE_LIST_USERS, v)
  66 + }
58 } 67 }
1 package domain 1 package domain
2 2
  3 +import "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/constant"
  4 +
3 type Context struct { 5 type Context struct {
4 // 公司 6 // 公司
5 CompanyId int `json:"companyId"` 7 CompanyId int `json:"companyId"`
@@ -38,3 +40,12 @@ const ( @@ -38,3 +40,12 @@ const (
38 ContextWithLogLevel = "WithLogLevel" 40 ContextWithLogLevel = "WithLogLevel"
39 ContextWithLogMsg = "WithLogMsg" 41 ContextWithLogMsg = "WithLogMsg"
40 ) 42 )
  43 +
  44 +func (c *Context) Access() bool {
  45 + for _, userId := range constant.WHITE_LIST_USERS {
  46 + if userId == c.OperatorId {
  47 + return true
  48 + }
  49 + }
  50 + return false
  51 +}
@@ -71,7 +71,7 @@ func (t *DataTable) OptionalValue(args ...string) []string { @@ -71,7 +71,7 @@ func (t *DataTable) OptionalValue(args ...string) []string {
71 if len(match) > 0 && !strings.Contains(t.Data[i][0], match) { 71 if len(match) > 0 && !strings.Contains(t.Data[i][0], match) {
72 continue 72 continue
73 } 73 }
74 - if filedType == Float.ToString() { 74 + if filedType == Float.ToString() || filedType == Date.ToString() {
75 values = append(values, RoundFieldValue(&Field{SQLType: filedType}, t.Data[i][0])) 75 values = append(values, RoundFieldValue(&Field{SQLType: filedType}, t.Data[i][0]))
76 continue 76 continue
77 } 77 }
@@ -272,6 +272,10 @@ func RoundFieldValue(f *Field, v string) string { @@ -272,6 +272,10 @@ func RoundFieldValue(f *Field, v string) string {
272 } 272 }
273 return utils.AssertString(fv) //fmt.Sprintf("%v", fv) 273 return utils.AssertString(fv) //fmt.Sprintf("%v", fv)
274 } 274 }
  275 + // TODO:计算表 Count(日期)类型是日期类型,0 的话下面日期解析成当前时间,计算表类型需要修改
  276 + if fv, err := strconv.ParseFloat(v, 64); err == nil {
  277 + return utils.AssertString(fv)
  278 + }
275 if f.SQLType == Datetime.ToString() { 279 if f.SQLType == Datetime.ToString() {
276 fv, err := xtime.Parse(v) 280 fv, err := xtime.Parse(v)
277 if err != nil { 281 if err != nil {
@@ -336,6 +340,11 @@ func MakeToInterfaces(fields []*Field) func([]string) []interface{} { @@ -336,6 +340,11 @@ func MakeToInterfaces(fields []*Field) func([]string) []interface{} {
336 if fields[i].SQLType == Float.ToString() { 340 if fields[i].SQLType == Float.ToString() {
337 v = RoundFieldValue(fields[i], v) 341 v = RoundFieldValue(fields[i], v)
338 } 342 }
  343 + if fields[i].SQLType == Date.ToString() {
  344 + v = RoundFieldValue(fields[i], v)
  345 + output[i] = v
  346 + continue
  347 + }
339 convValue, err := ValueToType(v, fields[i].SQLType) 348 convValue, err := ValueToType(v, fields[i].SQLType)
340 if err == nil { 349 if err == nil {
341 output[i] = convValue 350 output[i] = convValue
@@ -140,7 +140,12 @@ func NewFormulaCalculate(table *domain.Table, queryComponent *domain.QueryCompon @@ -140,7 +140,12 @@ func NewFormulaCalculate(table *domain.Table, queryComponent *domain.QueryCompon
140 } 140 }
141 if queryComponent.Formula != nil { 141 if queryComponent.Formula != nil {
142 formula := queryComponent.Formula 142 formula := queryComponent.Formula
143 - res.DatabaseTableName = formula.TableFields[0].TableSqlName 143 + // res.DatabaseTableName = formula.TableFields[0].TableSqlName
  144 + // TODO:支持常量
  145 + res.DatabaseTableName = ""
  146 + if len(formula.TableFields) > 0 {
  147 + res.DatabaseTableName = formula.TableFields[0].TableSqlName
  148 + }
144 exprSql := formula.ExprSql 149 exprSql := formula.ExprSql
145 if queryComponent.Formula.MixTableModel() { 150 if queryComponent.Formula.MixTableModel() {
146 exprSql = queryComponent.Formula.Complete() 151 exprSql = queryComponent.Formula.Complete()
@@ -153,6 +158,14 @@ func NewFormulaCalculate(table *domain.Table, queryComponent *domain.QueryCompon @@ -153,6 +158,14 @@ func NewFormulaCalculate(table *domain.Table, queryComponent *domain.QueryCompon
153 CalculateFieldName: table.DataFields[0].SQLName, 158 CalculateFieldName: table.DataFields[0].SQLName,
154 }) 159 })
155 } 160 }
  161 + if len(queryComponent.Formula.TableFields) == 0 && len(queryComponent.Formula.ExprSql) > 0 {
  162 + res.FormulaCalculateFields = append(res.FormulaCalculateFields, &FormulaCalculateField{
  163 + DatabaseTableName: "",
  164 + FieldSchema: NewFieldSchema(domain.TableField{}),
  165 + CalculateExpression: exprSql,
  166 + CalculateFieldName: table.DataFields[0].SQLName,
  167 + })
  168 + }
156 //res.FormulaCalculateFields = append(res.FormulaCalculateFields, &FormulaCalculateField{ 169 //res.FormulaCalculateFields = append(res.FormulaCalculateFields, &FormulaCalculateField{
157 // DatabaseTableName: res.DatabaseTableName, 170 // DatabaseTableName: res.DatabaseTableName,
158 // FieldSchema: NewFieldSchemaFromField(table.DataFields[0]), 171 // FieldSchema: NewFieldSchemaFromField(table.DataFields[0]),
@@ -46,6 +46,17 @@ func (f *TemporaryFileInfo) SetFile(file *domain.File) *TemporaryFileInfo { @@ -46,6 +46,17 @@ func (f *TemporaryFileInfo) SetFile(file *domain.File) *TemporaryFileInfo {
46 } 46 }
47 47
48 func (f *TemporaryFileInfo) SetFields(fields []*domain.Field) *TemporaryFileInfo { 48 func (f *TemporaryFileInfo) SetFields(fields []*domain.Field) *TemporaryFileInfo {
  49 + // 保留原有字段的类型(底层拆分的时候类型会变掉,无法处理,此处做特殊处理)
  50 + for i := range fields {
  51 + for j := range f.Fields {
  52 + if f.Fields[j].Name == fields[i].Name {
  53 + if f.Fields[j].SQLType != fields[i].SQLType {
  54 + fields[i].SQLType = f.Fields[j].SQLType
  55 + break
  56 + }
  57 + }
  58 + }
  59 + }
49 f.Fields = fields 60 f.Fields = fields
50 return f 61 return f
51 } 62 }
@@ -128,7 +128,7 @@ func (repository *QuerySetRepository) Remove(querySet *domain.QuerySet) (*domain @@ -128,7 +128,7 @@ func (repository *QuerySetRepository) Remove(querySet *domain.QuerySet) (*domain
128 return querySet, nil 128 return querySet, nil
129 } 129 }
130 func (repository *QuerySetRepository) FindOne(queryOptions map[string]interface{}) (*domain.QuerySet, error) { 130 func (repository *QuerySetRepository) FindOne(queryOptions map[string]interface{}) (*domain.QuerySet, error) {
131 - tx := repository.transactionContext.PgTx 131 + tx := repository.transactionContext.DB()
132 querySetModel := new(models.QuerySet) 132 querySetModel := new(models.QuerySet)
133 query := sqlbuilder.BuildQuery(tx.Model(querySetModel), queryOptions) 133 query := sqlbuilder.BuildQuery(tx.Model(querySetModel), queryOptions)
134 WhereContext(query, queryOptions) 134 WhereContext(query, queryOptions)
@@ -152,7 +152,7 @@ func (repository *QuerySetRepository) FindOne(queryOptions map[string]interface{ @@ -152,7 +152,7 @@ func (repository *QuerySetRepository) FindOne(queryOptions map[string]interface{
152 } 152 }
153 } 153 }
154 func (repository *QuerySetRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.QuerySet, error) { 154 func (repository *QuerySetRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.QuerySet, error) {
155 - tx := repository.transactionContext.PgTx 155 + tx := repository.transactionContext.DB()
156 var querySetModels []*models.QuerySet 156 var querySetModels []*models.QuerySet
157 querySets := make([]*domain.QuerySet, 0) 157 querySets := make([]*domain.QuerySet, 0)
158 query := sqlbuilder.BuildQuery(tx.Model(&querySetModels), queryOptions) 158 query := sqlbuilder.BuildQuery(tx.Model(&querySetModels), queryOptions)
@@ -133,7 +133,7 @@ func (repository *TableRepository) Remove(table *domain.Table) (*domain.Table, e @@ -133,7 +133,7 @@ func (repository *TableRepository) Remove(table *domain.Table) (*domain.Table, e
133 return table, nil 133 return table, nil
134 } 134 }
135 func (repository *TableRepository) FindOne(queryOptions map[string]interface{}) (*domain.Table, error) { 135 func (repository *TableRepository) FindOne(queryOptions map[string]interface{}) (*domain.Table, error) {
136 - tx := repository.transactionContext.PgTx 136 + tx := repository.transactionContext.DB()
137 tableModel := new(models.Table) 137 tableModel := new(models.Table)
138 query := sqlbuilder.BuildQuery(tx.Model(tableModel), queryOptions) 138 query := sqlbuilder.BuildQuery(tx.Model(tableModel), queryOptions)
139 WhereContext(query, queryOptions) 139 WhereContext(query, queryOptions)
@@ -161,7 +161,7 @@ func (repository *TableRepository) FindOne(queryOptions map[string]interface{}) @@ -161,7 +161,7 @@ func (repository *TableRepository) FindOne(queryOptions map[string]interface{})
161 } 161 }
162 } 162 }
163 func (repository *TableRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.Table, error) { 163 func (repository *TableRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.Table, error) {
164 - tx := repository.transactionContext.PgTx 164 + tx := repository.transactionContext.DB()
165 var tableModels []*models.Table 165 var tableModels []*models.Table
166 tables := make([]*domain.Table, 0) 166 tables := make([]*domain.Table, 0)
167 query := sqlbuilder.BuildQuery(tx.Model(&tableModels), queryOptions) 167 query := sqlbuilder.BuildQuery(tx.Model(&tableModels), queryOptions)
@@ -6,12 +6,14 @@ import ( @@ -6,12 +6,14 @@ import (
6 "github.com/beego/beego/v2/server/web" 6 "github.com/beego/beego/v2/server/web"
7 "github.com/beego/beego/v2/server/web/context" 7 "github.com/beego/beego/v2/server/web/context"
8 "github.com/linmadan/egglib-go/web/beego/filters" 8 "github.com/linmadan/egglib-go/web/beego/filters"
  9 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/constant"
9 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" 10 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
10 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/port/beego/controllers" 11 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/port/beego/controllers"
11 "net/http" 12 "net/http"
12 "os" 13 "os"
13 "strconv" 14 "strconv"
14 "strings" 15 "strings"
  16 + "time"
15 17
16 . "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/log" 18 . "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/log"
17 _ "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/port/beego/routers" 19 _ "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/port/beego/routers"
@@ -24,6 +26,7 @@ func init() { @@ -24,6 +26,7 @@ func init() {
24 web.BConfig.Listen.HTTPPort = 8080 26 web.BConfig.Listen.HTTPPort = 8080
25 web.BConfig.Listen.EnableAdmin = false 27 web.BConfig.Listen.EnableAdmin = false
26 web.BConfig.WebConfig.CommentRouterPath = "/pkg/port/beego/routers" 28 web.BConfig.WebConfig.CommentRouterPath = "/pkg/port/beego/routers"
  29 + web.BConfig.Log.AccessLogs = true
27 if os.Getenv("RUN_MODE") != "" { 30 if os.Getenv("RUN_MODE") != "" {
28 web.BConfig.RunMode = os.Getenv("RUN_MODE") 31 web.BConfig.RunMode = os.Getenv("RUN_MODE")
29 } 32 }
@@ -53,14 +56,18 @@ func init() { @@ -53,14 +56,18 @@ func init() {
53 56
54 web.InsertFilter("/*", web.BeforeRouter, filters.AllowCors()) 57 web.InsertFilter("/*", web.BeforeRouter, filters.AllowCors())
55 web.InsertFilter("/*", web.BeforeRouter, JwtFilter()) 58 web.InsertFilter("/*", web.BeforeRouter, JwtFilter())
  59 + web.InsertFilter("/*", web.BeforeRouter, RequestCostBefore())
56 web.InsertFilter("/*", web.BeforeExec, controllers.BlacklistFilter(controllers.BlacklistRouters)) 60 web.InsertFilter("/*", web.BeforeExec, controllers.BlacklistFilter(controllers.BlacklistRouters))
57 web.InsertFilter("/*", web.BeforeExec, CreateRequestLogFilter(true)) // filters.CreateRequstLogFilter(Logger) 61 web.InsertFilter("/*", web.BeforeExec, CreateRequestLogFilter(true)) // filters.CreateRequstLogFilter(Logger)
58 - web.InsertFilter("/*", web.AfterExec, filters.CreateResponseLogFilter(Logger), web.WithReturnOnOutput(false)) 62 + if constant.SERVICE_ENV == "dev" { //|| web.BConfig.RunMode =="test"
  63 + web.InsertFilter("/*", web.AfterExec, filters.CreateResponseLogFilter(Logger), web.WithReturnOnOutput(false))
  64 + }
  65 + web.InsertFilter("/*", web.AfterExec, RequestCostAfter(150), web.WithReturnOnOutput(false))
59 } 66 }
60 67
61 func CreateRequestLogFilter(console bool) func(ctx *context.Context) { 68 func CreateRequestLogFilter(console bool) func(ctx *context.Context) {
62 return func(ctx *context.Context) { 69 return func(ctx *context.Context) {
63 - msg := fmt.Sprintf("beego | %v | %v \n %v", ctx.Input.Method(), ctx.Input.URL(), string(ctx.Input.RequestBody)) 70 + msg := fmt.Sprintf("beego | %v | %v | %v \n %v", ctx.Input.Method(), strings.Split(ctx.Request.RemoteAddr, ":")[0], ctx.Input.URL(), string(ctx.Input.RequestBody))
64 logs.Debug(msg) 71 logs.Debug(msg)
65 if console { 72 if console {
66 fmt.Println(msg) 73 fmt.Println(msg)
@@ -89,3 +96,23 @@ func JwtFilter() func(ctx *context.Context) { @@ -89,3 +96,23 @@ func JwtFilter() func(ctx *context.Context) {
89 } 96 }
90 } 97 }
91 } 98 }
  99 +func RequestCostBefore() func(ctx *context.Context) {
  100 + return func(ctx *context.Context) {
  101 + ctx.Input.SetData("cost-begin", time.Now().UnixMilli())
  102 + }
  103 +}
  104 +
  105 +func RequestCostAfter(maxCost int64) func(ctx *context.Context) {
  106 + return func(ctx *context.Context) {
  107 + t := ctx.Input.GetData("cost-begin")
  108 + if t != nil {
  109 + costBegin := t.(int64)
  110 + costEnd := time.Now().UnixMilli()
  111 + cost := costEnd - costBegin
  112 + if cost > 0 && maxCost > 0 && cost > maxCost {
  113 + msg := fmt.Sprintf("beego | %v | %v | %v | 耗时:%v \n %v", ctx.Input.Method(), strings.Split(ctx.Request.RemoteAddr, ":")[0], ctx.Input.URL(), time.Duration(cost)*time.Millisecond, string(ctx.Input.RequestBody))
  114 + logs.Warn(msg)
  115 + }
  116 + }
  117 + }
  118 +}
@@ -129,9 +129,9 @@ func BlacklistFilter(black map[string]bool) func(ctx *context.Context) { @@ -129,9 +129,9 @@ func BlacklistFilter(black map[string]bool) func(ctx *context.Context) {
129 if !ok { 129 if !ok {
130 return 130 return
131 } 131 }
132 - if userToken.UserId > 0 && userToken.UserId == constant.BlacklistUser { 132 + if userToken.UserId > 0 && userToken.UserId == constant.BLACK_LIST_USER {
133 goto CheckBlackList 133 goto CheckBlackList
134 - } else if userToken.CompanyId > 0 && userToken.UserId == 0 && userToken.CompanyId == constant.BlackListCompany { 134 + } else if userToken.CompanyId > 0 && userToken.UserId == 0 && userToken.CompanyId == constant.BLACK_LIST_COMPANY {
135 goto CheckBlackList 135 goto CheckBlackList
136 } else { 136 } else {
137 return 137 return