From 77ac18c21bcde92f9e8115b19f80e70e3b6e9b36 Mon Sep 17 00:00:00 2001 From: PandaX-Go Date: Sun, 25 Aug 2024 19:58:05 +0800 Subject: [PATCH] =?UTF-8?q?[=E4=BC=98=E5=8C=96]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/develop/api/gen.go | 2 +- apps/develop/api/table.go | 8 +- apps/develop/entity/dev_gen_table.go | 2 +- apps/develop/gen/gen.go | 4 +- apps/develop/router/gen.go | 2 +- apps/develop/router/table.go | 4 +- apps/develop/services/gen_table.go | 4 +- apps/device/api/device.go | 10 +- apps/device/api/device_alarm.go | 6 +- apps/device/api/device_cmd.go | 6 +- apps/device/api/device_group.go | 8 +- apps/device/api/product.go | 10 +- apps/device/api/product_category.go | 8 +- apps/device/api/product_ota.go | 10 +- apps/device/api/product_template.go | 10 +- apps/device/router/device.go | 4 +- apps/device/router/device_alarm.go | 4 +- apps/device/router/device_cmd.go | 4 +- apps/device/router/device_group.go | 2 +- apps/device/router/product.go | 4 +- apps/device/router/product_category.go | 2 +- apps/device/router/product_ota.go | 4 +- apps/device/router/product_template.go | 4 +- apps/device/services/product_category.go | 2 +- apps/job/api/job.go | 10 +- apps/job/api/log_job.go | 6 +- apps/job/jobs/jobbase.go | 4 +- apps/job/router/job.go | 4 +- apps/job/router/job_log.go | 4 +- apps/log/api/log_login.go | 8 +- apps/log/api/log_oper.go | 8 +- apps/log/entity/log_login.go | 2 +- apps/log/entity/log_oper.go | 2 +- apps/log/router/login_log.go | 4 +- apps/log/router/oper_log.go | 4 +- apps/rule/api/rulechain.go | 12 +- apps/rule/api/rulechain_log.go | 6 +- apps/rule/router/rulechain.go | 4 +- apps/rule/router/rulechain_log.go | 4 +- apps/system/api/api.go | 10 +- apps/system/api/config.go | 8 +- apps/system/api/dict.go | 8 +- apps/system/api/menu.go | 6 +- apps/system/api/notice.go | 8 +- apps/system/api/organization.go | 6 +- apps/system/api/post.go | 8 +- apps/system/api/role.go | 10 +- apps/system/api/system.go | 6 +- apps/system/api/tenant.go | 6 +- apps/system/api/upload.go | 6 +- apps/system/api/user.go | 14 +- apps/system/entity/api.go | 2 +- apps/system/entity/config.go | 2 +- apps/system/entity/dict.go | 2 +- apps/system/entity/menu.go | 2 +- apps/system/entity/notice.go | 2 +- apps/system/entity/organization.go | 2 +- apps/system/entity/post.go | 2 +- apps/system/entity/role.go | 4 +- apps/system/entity/tenant.go | 2 +- apps/system/entity/user.go | 2 +- apps/system/router/api.go | 6 +- apps/system/router/config.go | 4 +- apps/system/router/dict.go | 4 +- apps/system/router/menu.go | 2 +- apps/system/router/notice.go | 4 +- apps/system/router/organization.go | 2 +- apps/system/router/post.go | 4 +- apps/system/router/role.go | 4 +- apps/system/router/tenant.go | 4 +- apps/system/router/upload.go | 2 +- apps/system/router/user.go | 4 +- apps/system/services/api.go | 2 +- apps/system/services/tenant.go | 2 +- go.mod | 38 +- go.sum | 20 +- iothub/hook_message_work/hook_message_work.go | 2 +- iothub/netbase/hook_base.go | 4 +- kit/biz/assets.go | 73 -- kit/biz/bizerror.go | 35 - kit/cache/cache.go | 25 - kit/cache/timed_cache.go | 434 ------------ kit/captcha/captcha.go | 28 - kit/casbin/casbin.go | 81 --- kit/casbin/casbin_model.go | 16 - kit/file/file.go | 143 ---- kit/file/zipfiles.go | 61 -- kit/flow/edge.go | 33 - kit/flow/flow.go | 40 -- kit/flow/node.go | 39 -- kit/httpclient/fetch.go | 256 ------- kit/logger/logger.go | 64 -- kit/mail/mail.go | 64 -- kit/mail/mail_test.go | 19 - kit/model/base_model.go | 33 - kit/model/jsonb.go | 36 - kit/model/login_account.go | 39 -- kit/model/model.go | 199 ------ kit/model/page.go | 15 - kit/model/result.go | 62 -- kit/oauth/github.go | 184 ----- kit/oauth/provider.go | 97 --- kit/oauth/wechat.go | 166 ----- kit/oss/aliyun.go | 88 --- kit/oss/build.go | 40 -- kit/oss/minio.go | 95 --- kit/oss/oss.go | 16 - kit/oss/qiniu.go | 115 --- kit/rediscli/rediscli.go | 52 -- kit/restfulx/log_handler.go | 15 - kit/restfulx/permission_handler.go | 16 - kit/restfulx/req_ctx.go | 135 ---- kit/restfulx/restfulx.go | 116 ---- kit/sms/aliyun.go | 44 -- kit/sms/sms.go | 14 - kit/starter/gorm.go | 80 --- kit/starter/tdengine.go | 27 - kit/token/token.go | 151 ---- kit/utils/charset.go | 79 --- kit/utils/ddm.go | 34 - kit/utils/ddm_test.go | 26 - kit/utils/excel.go | 53 -- kit/utils/excel_test.go | 19 - kit/utils/float_to_f.go | 26 - kit/utils/ip.go | 57 -- kit/utils/json_utils.go | 14 - kit/utils/regexp.go | 42 -- kit/utils/str_utils.go | 201 ------ kit/utils/str_utils_test.go | 24 - kit/utils/struct_utils_test.go | 194 ------ kit/utils/sturct_utils.go | 654 ------------------ kit/utils/template.go | 28 - kit/utils/tree_utils.go | 74 -- kit/utils/yml.go | 27 - kit/ws/msg.go | 27 - kit/ws/ws.go | 97 --- main.go | 8 +- pkg/cache/device_etoken.go | 2 +- pkg/cache/product_rule.go | 2 +- pkg/cache/sub_device.go | 2 +- pkg/config/config.go | 4 +- pkg/config/jwt.go | 2 +- pkg/initialize/table.go | 2 +- pkg/middleware/log.go | 12 +- pkg/middleware/oper.go | 4 +- pkg/middleware/permission.go | 8 +- .../nodes/action_create_alarm_node.go | 4 +- .../action_rpc_request_from_device_node.go | 4 +- .../action_rpc_request_to_device_node.go | 4 +- pkg/rule_engine/nodes/external_ding_node.go | 2 +- .../nodes/external_restapi_node.go | 2 +- pkg/rule_engine/nodes/external_wechat_node.go | 2 +- pkg/tdengine/tdengine.go | 2 +- pkg/tool/base_test.go | 4 +- pkg/transport/http_server.go | 5 +- resource/template/go/api.template | 6 +- resource/template/go/router.template | 4 +- 157 files changed, 249 insertions(+), 5190 deletions(-) delete mode 100644 kit/biz/assets.go delete mode 100644 kit/biz/bizerror.go delete mode 100644 kit/cache/cache.go delete mode 100644 kit/cache/timed_cache.go delete mode 100644 kit/captcha/captcha.go delete mode 100644 kit/casbin/casbin.go delete mode 100644 kit/casbin/casbin_model.go delete mode 100644 kit/file/file.go delete mode 100644 kit/file/zipfiles.go delete mode 100644 kit/flow/edge.go delete mode 100644 kit/flow/flow.go delete mode 100644 kit/flow/node.go delete mode 100644 kit/httpclient/fetch.go delete mode 100644 kit/logger/logger.go delete mode 100644 kit/mail/mail.go delete mode 100644 kit/mail/mail_test.go delete mode 100644 kit/model/base_model.go delete mode 100644 kit/model/jsonb.go delete mode 100644 kit/model/login_account.go delete mode 100644 kit/model/model.go delete mode 100644 kit/model/page.go delete mode 100644 kit/model/result.go delete mode 100644 kit/oauth/github.go delete mode 100644 kit/oauth/provider.go delete mode 100644 kit/oauth/wechat.go delete mode 100644 kit/oss/aliyun.go delete mode 100644 kit/oss/build.go delete mode 100644 kit/oss/minio.go delete mode 100644 kit/oss/oss.go delete mode 100644 kit/oss/qiniu.go delete mode 100644 kit/rediscli/rediscli.go delete mode 100644 kit/restfulx/log_handler.go delete mode 100644 kit/restfulx/permission_handler.go delete mode 100644 kit/restfulx/req_ctx.go delete mode 100644 kit/restfulx/restfulx.go delete mode 100644 kit/sms/aliyun.go delete mode 100644 kit/sms/sms.go delete mode 100644 kit/starter/gorm.go delete mode 100644 kit/starter/tdengine.go delete mode 100644 kit/token/token.go delete mode 100644 kit/utils/charset.go delete mode 100644 kit/utils/ddm.go delete mode 100644 kit/utils/ddm_test.go delete mode 100644 kit/utils/excel.go delete mode 100644 kit/utils/excel_test.go delete mode 100644 kit/utils/float_to_f.go delete mode 100644 kit/utils/ip.go delete mode 100644 kit/utils/json_utils.go delete mode 100644 kit/utils/regexp.go delete mode 100644 kit/utils/str_utils.go delete mode 100644 kit/utils/str_utils_test.go delete mode 100644 kit/utils/struct_utils_test.go delete mode 100644 kit/utils/sturct_utils.go delete mode 100644 kit/utils/template.go delete mode 100644 kit/utils/tree_utils.go delete mode 100644 kit/utils/yml.go delete mode 100644 kit/ws/msg.go delete mode 100644 kit/ws/ws.go diff --git a/apps/develop/api/gen.go b/apps/develop/api/gen.go index 318b9e4..ed37f3b 100644 --- a/apps/develop/api/gen.go +++ b/apps/develop/api/gen.go @@ -1,9 +1,9 @@ package api import ( + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/develop/gen" "pandax/apps/develop/services" - "pandax/kit/restfulx" ) type GenApi struct { diff --git a/apps/develop/api/table.go b/apps/develop/api/table.go index ed3dec1..4401bee 100644 --- a/apps/develop/api/table.go +++ b/apps/develop/api/table.go @@ -1,14 +1,14 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/develop/api/vo" "pandax/apps/develop/entity" "pandax/apps/develop/gen" "pandax/apps/develop/services" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" "strings" "sync" ) diff --git a/apps/develop/entity/dev_gen_table.go b/apps/develop/entity/dev_gen_table.go index 070c547..ca34edf 100644 --- a/apps/develop/entity/dev_gen_table.go +++ b/apps/develop/entity/dev_gen_table.go @@ -1,6 +1,6 @@ package entity -import "pandax/kit/model" +import "github.com/PandaXGO/PandaKit/model" type DevGenTable struct { TableId int64 `gorm:"primaryKey;autoIncrement" json:"tableId"` // 编号 diff --git a/apps/develop/gen/gen.go b/apps/develop/gen/gen.go index 870819d..48f8c7d 100644 --- a/apps/develop/gen/gen.go +++ b/apps/develop/gen/gen.go @@ -9,12 +9,12 @@ import ( "sync" "text/template" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/develop/entity" "pandax/apps/develop/services" sysEntity "pandax/apps/system/entity" sysServices "pandax/apps/system/services" - "pandax/kit/biz" - "pandax/kit/utils" "pandax/pkg/global" "github.com/kakuilan/kgo" diff --git a/apps/develop/router/gen.go b/apps/develop/router/gen.go index 880b316..0e69e62 100644 --- a/apps/develop/router/gen.go +++ b/apps/develop/router/gen.go @@ -1,9 +1,9 @@ package router import ( + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/develop/api" "pandax/apps/develop/services" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/develop/router/table.go b/apps/develop/router/table.go index d6a6696..8554996 100644 --- a/apps/develop/router/table.go +++ b/apps/develop/router/table.go @@ -1,12 +1,12 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/develop/api" "pandax/apps/develop/api/vo" "pandax/apps/develop/entity" "pandax/apps/develop/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/develop/services/gen_table.go b/apps/develop/services/gen_table.go index 2eff361..91b3ecc 100644 --- a/apps/develop/services/gen_table.go +++ b/apps/develop/services/gen_table.go @@ -2,9 +2,9 @@ package services import ( "errors" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/develop/entity" - "pandax/kit/biz" - "pandax/kit/utils" "pandax/pkg/global" "pandax/pkg/global/model" ) diff --git a/apps/device/api/device.go b/apps/device/api/device.go index 60fedb3..764156f 100644 --- a/apps/device/api/device.go +++ b/apps/device/api/device.go @@ -7,10 +7,10 @@ package api // ========================================================================== import ( "fmt" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/pkg/cache" "pandax/pkg/global" "strings" @@ -166,7 +166,7 @@ func (p *DeviceApi) InsertDevice(rc *restfulx.ReqCtx) { data.OrgId = rc.LoginAccount.OrganizationId list, _ := p.DeviceApp.FindList(entity.Device{Name: data.Name}) biz.IsTrue(!(list != nil && len(*list) > 0), fmt.Sprintf("名称%s已存在,设置其他命名", data.Name)) - data.Id = utils.GenerateTdID("d") + data.Id = utils.GenerateID("d") data.LinkStatus = global.INACTIVE data.LastAt = time.Now() data.Protocol = product.ProtocolName diff --git a/apps/device/api/device_alarm.go b/apps/device/api/device_alarm.go index b7347b1..0e8741b 100644 --- a/apps/device/api/device_alarm.go +++ b/apps/device/api/device_alarm.go @@ -2,9 +2,9 @@ package api // ========================================================================== import ( - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "strings" "pandax/apps/device/entity" diff --git a/apps/device/api/device_cmd.go b/apps/device/api/device_cmd.go index 7fc6491..8413567 100644 --- a/apps/device/api/device_cmd.go +++ b/apps/device/api/device_cmd.go @@ -3,9 +3,9 @@ package api // ========================================================================== import ( "encoding/json" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" devicerpc "pandax/pkg/device_rpc" "strings" diff --git a/apps/device/api/device_group.go b/apps/device/api/device_group.go index 67efcc7..7219ed5 100644 --- a/apps/device/api/device_group.go +++ b/apps/device/api/device_group.go @@ -1,11 +1,11 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/device/entity" "pandax/apps/device/services" - "pandax/kit/biz" - "pandax/kit/restfulx" - "pandax/kit/utils" "strings" ) @@ -80,7 +80,7 @@ func (p *DeviceGroupApi) GetDeviceGroup(rc *restfulx.ReqCtx) { func (p *DeviceGroupApi) InsertDeviceGroup(rc *restfulx.ReqCtx) { var data entity.DeviceGroup restfulx.BindJsonAndValid(rc, &data) - data.Id = utils.GenerateID() + data.Id = utils.GenerateID("dg") data.Owner = rc.LoginAccount.UserName data.OrgId = rc.LoginAccount.OrganizationId p.DeviceGroupApp.Insert(data) diff --git a/apps/device/api/product.go b/apps/device/api/product.go index 69c9ab2..ed17160 100644 --- a/apps/device/api/product.go +++ b/apps/device/api/product.go @@ -7,10 +7,10 @@ package api // ========================================================================== import ( "fmt" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/pkg/global" "strings" @@ -112,7 +112,7 @@ func (p *ProductApi) GetProduct(rc *restfulx.ReqCtx) { func (p *ProductApi) InsertProduct(rc *restfulx.ReqCtx) { var data entity.Product restfulx.BindJsonAndValid(rc, &data) - data.Id = utils.GenerateTdID("p") + data.Id = utils.GenerateID("p") data.Owner = rc.LoginAccount.UserName data.OrgId = rc.LoginAccount.OrganizationId // 如果未设置规则链,默认为主链 diff --git a/apps/device/api/product_category.go b/apps/device/api/product_category.go index 4af297a..5c738ad 100644 --- a/apps/device/api/product_category.go +++ b/apps/device/api/product_category.go @@ -1,11 +1,11 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/device/entity" "pandax/apps/device/services" - "pandax/kit/biz" - "pandax/kit/restfulx" - "pandax/kit/utils" "strings" ) @@ -66,7 +66,7 @@ func (p *ProductCategoryApi) GetProductCategory(rc *restfulx.ReqCtx) { func (p *ProductCategoryApi) InsertProductCategory(rc *restfulx.ReqCtx) { var data entity.ProductCategory restfulx.BindJsonAndValid(rc, &data) - data.Id = utils.GenerateID() + data.Id = utils.GenerateID("pc") data.Owner = rc.LoginAccount.UserName data.OrgId = rc.LoginAccount.OrganizationId p.ProductCategoryApp.Insert(data) diff --git a/apps/device/api/product_ota.go b/apps/device/api/product_ota.go index 459d943..2a6664f 100644 --- a/apps/device/api/product_ota.go +++ b/apps/device/api/product_ota.go @@ -2,10 +2,10 @@ package api // ========================================================================== import ( - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/pkg/tool" "path" "strings" @@ -56,7 +56,7 @@ func (p *ProductOtaApi) InsertProductOta(rc *restfulx.ReqCtx) { // 生成文件MD5值 md5, err := tool.GetFileMd5(path.Join(filePath, data.Url)) biz.ErrIsNil(err, "读取文件md5校验值错误") - data.Id = utils.GenerateID() + data.Id = utils.GenerateID("ota") data.Check = md5 p.ProductOtaApp.Insert(data) } diff --git a/apps/device/api/product_template.go b/apps/device/api/product_template.go index 4be8d97..62f48c2 100644 --- a/apps/device/api/product_template.go +++ b/apps/device/api/product_template.go @@ -2,10 +2,10 @@ package api import ( "encoding/json" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/pkg/global" "strings" @@ -59,7 +59,7 @@ func (p *ProductTemplateApi) GetProductTemplate(rc *restfulx.ReqCtx) { func (p *ProductTemplateApi) InsertProductTemplate(rc *restfulx.ReqCtx) { var data entity.ProductTemplate restfulx.BindJsonAndValid(rc, &data) - data.Id = utils.GenerateID() + data.Id = utils.GenerateID("pt") if data.Classify == entity.ATTRIBUTES_TSL || data.Classify == entity.TELEMETRY_TSL { // 向超级表及子表中添加字段 len := 100 diff --git a/apps/device/router/device.go b/apps/device/router/device.go index 8b5732a..ff466bf 100644 --- a/apps/device/router/device.go +++ b/apps/device/router/device.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/device/api" "pandax/apps/device/entity" "pandax/apps/device/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/device/router/device_alarm.go b/apps/device/router/device_alarm.go index 5b8708a..15ae1da 100644 --- a/apps/device/router/device_alarm.go +++ b/apps/device/router/device_alarm.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/device/api" "pandax/apps/device/entity" "pandax/apps/device/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/device/router/device_cmd.go b/apps/device/router/device_cmd.go index ec90138..1c03fa8 100644 --- a/apps/device/router/device_cmd.go +++ b/apps/device/router/device_cmd.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/device/api" "pandax/apps/device/entity" "pandax/apps/device/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/device/router/device_group.go b/apps/device/router/device_group.go index a8f3568..4df9a91 100644 --- a/apps/device/router/device_group.go +++ b/apps/device/router/device_group.go @@ -1,10 +1,10 @@ package router import ( + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/device/api" "pandax/apps/device/entity" "pandax/apps/device/services" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/device/router/product.go b/apps/device/router/product.go index f9ac2d6..a124ad9 100644 --- a/apps/device/router/product.go +++ b/apps/device/router/product.go @@ -1,12 +1,12 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/device/api" "pandax/apps/device/entity" "pandax/apps/device/services" ruleService "pandax/apps/rule/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/device/router/product_category.go b/apps/device/router/product_category.go index a1adf02..7503493 100644 --- a/apps/device/router/product_category.go +++ b/apps/device/router/product_category.go @@ -1,10 +1,10 @@ package router import ( + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/device/api" "pandax/apps/device/entity" "pandax/apps/device/services" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/device/router/product_ota.go b/apps/device/router/product_ota.go index ad99ca4..a8576bd 100644 --- a/apps/device/router/product_ota.go +++ b/apps/device/router/product_ota.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/device/api" "pandax/apps/device/entity" "pandax/apps/device/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/device/router/product_template.go b/apps/device/router/product_template.go index 34862e7..a85b639 100644 --- a/apps/device/router/product_template.go +++ b/apps/device/router/product_template.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/device/api" "pandax/apps/device/entity" "pandax/apps/device/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/device/services/product_category.go b/apps/device/services/product_category.go index c40ac6a..1e6ef9f 100644 --- a/apps/device/services/product_category.go +++ b/apps/device/services/product_category.go @@ -2,8 +2,8 @@ package services import ( "errors" + "github.com/PandaXGO/PandaKit/biz" "pandax/apps/device/entity" - "pandax/kit/biz" "pandax/pkg/global" ) diff --git a/apps/job/api/job.go b/apps/job/api/job.go index c76682e..a6d35ed 100644 --- a/apps/job/api/job.go +++ b/apps/job/api/job.go @@ -1,14 +1,14 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/job/api/from" "pandax/apps/job/entity" "pandax/apps/job/jobs" "pandax/apps/job/services" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" "strings" ) @@ -19,7 +19,7 @@ type JobApi struct { func (j *JobApi) CreateJob(rc *restfulx.ReqCtx) { var job entity.SysJob restfulx.BindQuery(rc, &job) - job.Id = utils.GenerateID() + job.Id = utils.GenerateID("j") job.Owner = rc.LoginAccount.UserName job.OrgId = rc.LoginAccount.OrganizationId _, err := j.JobApp.Insert(job) diff --git a/apps/job/api/log_job.go b/apps/job/api/log_job.go index 5976f3e..ab3ec10 100644 --- a/apps/job/api/log_job.go +++ b/apps/job/api/log_job.go @@ -1,11 +1,11 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/job/entity" "pandax/apps/job/services" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" "strings" ) diff --git a/apps/job/jobs/jobbase.go b/apps/job/jobs/jobbase.go index fa962e2..49bdcea 100644 --- a/apps/job/jobs/jobbase.go +++ b/apps/job/jobs/jobbase.go @@ -2,11 +2,11 @@ package jobs import ( "fmt" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/job/entity" logEntity "pandax/apps/job/entity" "pandax/apps/job/services" logServices "pandax/apps/job/services" - "pandax/kit/utils" "pandax/pkg/global" "sync" "time" @@ -52,7 +52,7 @@ type ExecJob struct { func (e *ExecJob) Run() { startTime := time.Now() jobLog := logEntity.JobLog{Name: e.Name, EntryId: e.EntryId, TargetInvoke: e.InvokeTarget, Status: "0"} - jobLog.Id = utils.GenerateID() + jobLog.Id = utils.GenerateID("j") jobLog.OrgId = e.OrgId jobLog.Owner = e.Owner var obj = jobList[e.InvokeTarget] diff --git a/apps/job/router/job.go b/apps/job/router/job.go index dce425e..e23ee1a 100644 --- a/apps/job/router/job.go +++ b/apps/job/router/job.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/job/api" "pandax/apps/job/entity" "pandax/apps/job/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/job/router/job_log.go b/apps/job/router/job_log.go index 05eb664..e47022f 100644 --- a/apps/job/router/job_log.go +++ b/apps/job/router/job_log.go @@ -1,10 +1,10 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/job/api" "pandax/apps/job/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/log/api/log_login.go b/apps/log/api/log_login.go index 08fc976..a7d8a46 100644 --- a/apps/log/api/log_login.go +++ b/apps/log/api/log_login.go @@ -1,12 +1,12 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/log/entity" "pandax/apps/log/services" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" ) type LogLoginApi struct { diff --git a/apps/log/api/log_oper.go b/apps/log/api/log_oper.go index aed6f7b..285006c 100644 --- a/apps/log/api/log_oper.go +++ b/apps/log/api/log_oper.go @@ -1,12 +1,12 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/log/entity" "pandax/apps/log/services" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" ) type LogOperApi struct { diff --git a/apps/log/entity/log_login.go b/apps/log/entity/log_login.go index 3aee1a4..2f6d7ea 100644 --- a/apps/log/entity/log_login.go +++ b/apps/log/entity/log_login.go @@ -1,7 +1,7 @@ package entity import ( - "pandax/kit/model" + "github.com/PandaXGO/PandaKit/model" "time" ) diff --git a/apps/log/entity/log_oper.go b/apps/log/entity/log_oper.go index 4eeb2be..fdee662 100644 --- a/apps/log/entity/log_oper.go +++ b/apps/log/entity/log_oper.go @@ -1,7 +1,7 @@ package entity import ( - "pandax/kit/model" + "github.com/PandaXGO/PandaKit/model" ) type LogOper struct { diff --git a/apps/log/router/login_log.go b/apps/log/router/login_log.go index 029c603..85c5117 100644 --- a/apps/log/router/login_log.go +++ b/apps/log/router/login_log.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/log/api" "pandax/apps/log/entity" "pandax/apps/log/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/log/router/oper_log.go b/apps/log/router/oper_log.go index 52e8d95..69dfa95 100644 --- a/apps/log/router/oper_log.go +++ b/apps/log/router/oper_log.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/log/api" "pandax/apps/log/entity" "pandax/apps/log/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/rule/api/rulechain.go b/apps/rule/api/rulechain.go index 21d7984..0467815 100644 --- a/apps/rule/api/rulechain.go +++ b/apps/rule/api/rulechain.go @@ -1,12 +1,12 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/rule/entity" "pandax/apps/rule/services" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" "pandax/pkg/rule_engine" "strings" ) @@ -84,7 +84,7 @@ func (p *RuleChainApi) GetRuleChain(rc *restfulx.ReqCtx) { func (p *RuleChainApi) InsertRuleChain(rc *restfulx.ReqCtx) { var data entity.RuleChain restfulx.BindJsonAndValid(rc, &data) - data.Id = utils.GenerateID() + data.Id = utils.GenerateID("rc") data.Owner = rc.LoginAccount.UserName data.OrgId = rc.LoginAccount.OrganizationId _, err := p.RuleChainApp.Insert(data) @@ -115,7 +115,7 @@ func (p *RuleChainApi) CloneRuleChain(rc *restfulx.ReqCtx) { one, err := p.RuleChainApp.FindOne(id) biz.ErrIsNil(err, "规则链不存在") one.RuleName = one.RuleName + "-克隆" - one.Id = utils.GenerateID() + one.Id = utils.GenerateID("rc") one.Root = "0" _, err = p.RuleChainApp.Insert(*one) biz.ErrIsNil(err, "克隆规则链失败") diff --git a/apps/rule/api/rulechain_log.go b/apps/rule/api/rulechain_log.go index 0a7d9a4..bfa7c8c 100644 --- a/apps/rule/api/rulechain_log.go +++ b/apps/rule/api/rulechain_log.go @@ -1,11 +1,11 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/rule/entity" "pandax/apps/rule/services" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" "pandax/pkg/rule_engine/nodes" ) diff --git a/apps/rule/router/rulechain.go b/apps/rule/router/rulechain.go index 8c8d55e..2b9e286 100644 --- a/apps/rule/router/rulechain.go +++ b/apps/rule/router/rulechain.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/rule/api" "pandax/apps/rule/entity" "pandax/apps/rule/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/rule/router/rulechain_log.go b/apps/rule/router/rulechain_log.go index 466672a..2e3f81c 100644 --- a/apps/rule/router/rulechain_log.go +++ b/apps/rule/router/rulechain_log.go @@ -1,10 +1,10 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/rule/api" "pandax/apps/rule/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/system/api/api.go b/apps/system/api/api.go index 20a4103..751fe24 100644 --- a/apps/system/api/api.go +++ b/apps/system/api/api.go @@ -1,13 +1,13 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/casbin" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" entity "pandax/apps/system/entity" services "pandax/apps/system/services" - "pandax/kit/biz" - "pandax/kit/casbin" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" "pandax/pkg/global" ) diff --git a/apps/system/api/config.go b/apps/system/api/config.go index b58a21e..736868a 100644 --- a/apps/system/api/config.go +++ b/apps/system/api/config.go @@ -1,12 +1,12 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" entity "pandax/apps/system/entity" services "pandax/apps/system/services" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" ) type ConfigApi struct { diff --git a/apps/system/api/dict.go b/apps/system/api/dict.go index 110056c..5c4404d 100644 --- a/apps/system/api/dict.go +++ b/apps/system/api/dict.go @@ -2,12 +2,12 @@ package api import ( "fmt" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" entity "pandax/apps/system/entity" services "pandax/apps/system/services" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" "pandax/pkg/global" ) diff --git a/apps/system/api/menu.go b/apps/system/api/menu.go index a50d5fa..2c2d9d9 100644 --- a/apps/system/api/menu.go +++ b/apps/system/api/menu.go @@ -1,12 +1,12 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/system/api/vo" entity "pandax/apps/system/entity" services "pandax/apps/system/services" - "pandax/kit/biz" - "pandax/kit/restfulx" - "pandax/kit/utils" ) type MenuApi struct { diff --git a/apps/system/api/notice.go b/apps/system/api/notice.go index d1c5f03..dffdaf1 100644 --- a/apps/system/api/notice.go +++ b/apps/system/api/notice.go @@ -1,12 +1,12 @@ package api import ( + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" "strings" ) diff --git a/apps/system/api/organization.go b/apps/system/api/organization.go index 184e6ef..1a03d59 100644 --- a/apps/system/api/organization.go +++ b/apps/system/api/organization.go @@ -3,12 +3,12 @@ package api import ( "errors" "fmt" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/system/api/vo" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/biz" - "pandax/kit/restfulx" - "pandax/kit/utils" "pandax/pkg/global" ) diff --git a/apps/system/api/post.go b/apps/system/api/post.go index 6a52cb4..f502bcf 100644 --- a/apps/system/api/post.go +++ b/apps/system/api/post.go @@ -3,12 +3,12 @@ package api import ( "errors" "fmt" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/biz" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" "pandax/pkg/global" ) diff --git a/apps/system/api/role.go b/apps/system/api/role.go index 506ed33..857cc24 100644 --- a/apps/system/api/role.go +++ b/apps/system/api/role.go @@ -3,13 +3,13 @@ package api import ( "errors" "fmt" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/casbin" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" entity "pandax/apps/system/entity" services "pandax/apps/system/services" - "pandax/kit/biz" - "pandax/kit/casbin" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" "pandax/pkg/global" ) diff --git a/apps/system/api/system.go b/apps/system/api/system.go index d81c7c7..62bea16 100644 --- a/apps/system/api/system.go +++ b/apps/system/api/system.go @@ -2,9 +2,9 @@ package api import ( "fmt" - "pandax/kit/biz" - "pandax/kit/restfulx" - "pandax/kit/ws" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/ws" "pandax/pkg/middleware" "runtime" diff --git a/apps/system/api/tenant.go b/apps/system/api/tenant.go index f9380ea..3dd6e3e 100644 --- a/apps/system/api/tenant.go +++ b/apps/system/api/tenant.go @@ -1,11 +1,11 @@ package api import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/model" - "pandax/kit/restfulx" - "pandax/kit/utils" ) type SysTenantsApi struct { diff --git a/apps/system/api/upload.go b/apps/system/api/upload.go index 7dfa097..24eaae9 100644 --- a/apps/system/api/upload.go +++ b/apps/system/api/upload.go @@ -2,9 +2,9 @@ package api import ( "fmt" - "pandax/kit/biz" - "pandax/kit/oss" - "pandax/kit/restfulx" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/oss" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/pkg/config" "pandax/pkg/global" "pandax/pkg/tool" diff --git a/apps/system/api/user.go b/apps/system/api/user.go index 9d8fa1d..deaf174 100644 --- a/apps/system/api/user.go +++ b/apps/system/api/user.go @@ -1,11 +1,11 @@ package api import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/token" "pandax/apps/system/api/form" "pandax/apps/system/api/vo" "pandax/apps/system/entity" - "pandax/kit/model" - "pandax/kit/token" "github.com/dgrijalva/jwt-go" "github.com/emicklei/go-restful/v3" @@ -15,12 +15,12 @@ import ( logEntity "pandax/apps/log/entity" logServices "pandax/apps/log/services" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/captcha" + filek "github.com/PandaXGO/PandaKit/file" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/system/services" - "pandax/kit/biz" - "pandax/kit/captcha" - filek "pandax/kit/file" - "pandax/kit/restfulx" - "pandax/kit/utils" "pandax/pkg/global" "strings" "time" diff --git a/apps/system/entity/api.go b/apps/system/entity/api.go index 07021a5..1b50abe 100644 --- a/apps/system/entity/api.go +++ b/apps/system/entity/api.go @@ -1,6 +1,6 @@ package entity -import "pandax/kit/model" +import "github.com/PandaXGO/PandaKit/model" type SysApi struct { model.BaseAutoModel diff --git a/apps/system/entity/config.go b/apps/system/entity/config.go index 05cc664..62ff5c7 100644 --- a/apps/system/entity/config.go +++ b/apps/system/entity/config.go @@ -1,6 +1,6 @@ package entity -import "pandax/kit/model" +import "github.com/PandaXGO/PandaKit/model" type SysConfig struct { ConfigId int64 `json:"configId" gorm:"primaryKey;AUTO_INCREMENT;comment:主键编码"` diff --git a/apps/system/entity/dict.go b/apps/system/entity/dict.go index 03bc592..5bccf7a 100644 --- a/apps/system/entity/dict.go +++ b/apps/system/entity/dict.go @@ -1,6 +1,6 @@ package entity -import "pandax/kit/model" +import "github.com/PandaXGO/PandaKit/model" type SysDictData struct { DictCode int64 `json:"dictCode" gorm:"primary_key;AUTO_INCREMENT"` diff --git a/apps/system/entity/menu.go b/apps/system/entity/menu.go index 91f7863..2d89ba5 100644 --- a/apps/system/entity/menu.go +++ b/apps/system/entity/menu.go @@ -1,6 +1,6 @@ package entity -import "pandax/kit/model" +import "github.com/PandaXGO/PandaKit/model" type SysMenu struct { MenuId int64 `json:"menuId" gorm:"primary_key;AUTO_INCREMENT"` diff --git a/apps/system/entity/notice.go b/apps/system/entity/notice.go index 2b7b987..67141c7 100644 --- a/apps/system/entity/notice.go +++ b/apps/system/entity/notice.go @@ -1,6 +1,6 @@ package entity -import "pandax/kit/model" +import "github.com/PandaXGO/PandaKit/model" type SysNotice struct { NoticeId int64 `json:"noticeId" gorm:"primary_key;AUTO_INCREMENT"` diff --git a/apps/system/entity/organization.go b/apps/system/entity/organization.go index 860dbef..b27ea1c 100644 --- a/apps/system/entity/organization.go +++ b/apps/system/entity/organization.go @@ -1,6 +1,6 @@ package entity -import "pandax/kit/model" +import "github.com/PandaXGO/PandaKit/model" // 组织组织 type SysOrganization struct { diff --git a/apps/system/entity/post.go b/apps/system/entity/post.go index b57e3a4..cb02b63 100644 --- a/apps/system/entity/post.go +++ b/apps/system/entity/post.go @@ -1,6 +1,6 @@ package entity -import "pandax/kit/model" +import "github.com/PandaXGO/PandaKit/model" type SysPost struct { PostId int64 `gorm:"primary_key;AUTO_INCREMENT" json:"postId"` diff --git a/apps/system/entity/role.go b/apps/system/entity/role.go index 38121c0..c605a5f 100644 --- a/apps/system/entity/role.go +++ b/apps/system/entity/role.go @@ -1,8 +1,8 @@ package entity import ( - "pandax/kit/casbin" - "pandax/kit/model" + "github.com/PandaXGO/PandaKit/casbin" + "github.com/PandaXGO/PandaKit/model" ) const ( diff --git a/apps/system/entity/tenant.go b/apps/system/entity/tenant.go index 582af65..b856cf2 100644 --- a/apps/system/entity/tenant.go +++ b/apps/system/entity/tenant.go @@ -1,7 +1,7 @@ package entity import ( - "pandax/kit/model" + "github.com/PandaXGO/PandaKit/model" "time" ) diff --git a/apps/system/entity/user.go b/apps/system/entity/user.go index 3ac6753..467917f 100644 --- a/apps/system/entity/user.go +++ b/apps/system/entity/user.go @@ -1,6 +1,6 @@ package entity -import "pandax/kit/model" +import "github.com/PandaXGO/PandaKit/model" type LoginM struct { Username string `gorm:"type:varchar(64)" json:"username"` diff --git a/apps/system/router/api.go b/apps/system/router/api.go index 7aadf6e..d63dab7 100644 --- a/apps/system/router/api.go +++ b/apps/system/router/api.go @@ -1,12 +1,12 @@ package router import ( + "github.com/PandaXGO/PandaKit/casbin" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/system/api" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/casbin" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/system/router/config.go b/apps/system/router/config.go index 6d8945c..6cdd81d 100644 --- a/apps/system/router/config.go +++ b/apps/system/router/config.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/system/api" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/system/router/dict.go b/apps/system/router/dict.go index 751c38f..e276c7b 100644 --- a/apps/system/router/dict.go +++ b/apps/system/router/dict.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/system/api" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/system/router/menu.go b/apps/system/router/menu.go index 6c9a1d2..65d5524 100644 --- a/apps/system/router/menu.go +++ b/apps/system/router/menu.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/system/api" "pandax/apps/system/api/vo" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/system/router/notice.go b/apps/system/router/notice.go index 866301d..ccbcf45 100644 --- a/apps/system/router/notice.go +++ b/apps/system/router/notice.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/system/api" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/system/router/organization.go b/apps/system/router/organization.go index 32e78ed..e204e33 100644 --- a/apps/system/router/organization.go +++ b/apps/system/router/organization.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/system/api" "pandax/apps/system/api/vo" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/system/router/post.go b/apps/system/router/post.go index 0441625..a7f52ae 100644 --- a/apps/system/router/post.go +++ b/apps/system/router/post.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/system/api" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/system/router/role.go b/apps/system/router/role.go index 5cc5c40..3144dd0 100644 --- a/apps/system/router/role.go +++ b/apps/system/router/role.go @@ -1,11 +1,11 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/system/api" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/system/router/tenant.go b/apps/system/router/tenant.go index a406496..af5902c 100644 --- a/apps/system/router/tenant.go +++ b/apps/system/router/tenant.go @@ -7,11 +7,11 @@ package router **/ import ( + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/system/api" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/model" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/system/router/upload.go b/apps/system/router/upload.go index 2186350..1c81880 100644 --- a/apps/system/router/upload.go +++ b/apps/system/router/upload.go @@ -1,8 +1,8 @@ package router import ( + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/system/api" - "pandax/kit/restfulx" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" diff --git a/apps/system/router/user.go b/apps/system/router/user.go index af288ee..bef236f 100644 --- a/apps/system/router/user.go +++ b/apps/system/router/user.go @@ -1,18 +1,18 @@ package router import ( + "github.com/PandaXGO/PandaKit/model" "pandax/apps/system/api" "pandax/apps/system/api/form" "pandax/apps/system/api/vo" "pandax/apps/system/entity" "pandax/apps/system/services" - "pandax/kit/model" restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" + "github.com/PandaXGO/PandaKit/restfulx" logServices "pandax/apps/log/services" - "pandax/kit/restfulx" ) func InitUserRouter(container *restful.Container) { diff --git a/apps/system/services/api.go b/apps/system/services/api.go index d1617d7..85ed30b 100644 --- a/apps/system/services/api.go +++ b/apps/system/services/api.go @@ -2,8 +2,8 @@ package services import ( "errors" + "github.com/PandaXGO/PandaKit/casbin" "pandax/apps/system/entity" - "pandax/kit/casbin" "pandax/pkg/global" "gorm.io/gorm" diff --git a/apps/system/services/tenant.go b/apps/system/services/tenant.go index 2adf005..c0c4f9f 100644 --- a/apps/system/services/tenant.go +++ b/apps/system/services/tenant.go @@ -6,8 +6,8 @@ package services * @Date 2022/7/14 17:49 **/ import ( + "github.com/PandaXGO/PandaKit/biz" "pandax/apps/system/entity" - "pandax/kit/biz" "pandax/pkg/global" ) diff --git a/go.mod b/go.mod index 7374ad8..4a29844 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,8 @@ module pandax go 1.19 require ( + github.com/PandaXGO/PandaKit v0.0.0-20240825114426-1e96ee147767 github.com/Shopify/sarama v1.38.1 - github.com/aliyun/alibaba-cloud-sdk-go v1.61.1443 - github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible - github.com/casbin/casbin/v2 v2.37.4 - github.com/casbin/gorm-adapter/v3 v3.4.6 github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/didip/tollbooth v4.0.2+incompatible github.com/dop251/goja v0.0.0-20231027120936-b396bb4c349d @@ -15,43 +12,32 @@ require ( github.com/emicklei/go-restful-openapi/v2 v2.9.0 github.com/emicklei/go-restful/v3 v3.9.0 github.com/go-openapi/spec v0.20.6 - github.com/go-playground/validator/v10 v10.8.0 - github.com/go-redis/redis/v8 v8.11.5 github.com/golang-queue/queue v0.1.3 github.com/google/uuid v1.3.0 - github.com/gorilla/schema v1.2.0 github.com/gorilla/websocket v1.5.0 github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible github.com/kakuilan/kgo v0.1.8 - github.com/lib/pq v1.10.4 - github.com/minio/minio-go/v7 v7.0.36 github.com/mitchellh/mapstructure v1.5.0 - github.com/mojocn/base64Captcha v1.3.5 github.com/mssola/user_agent v0.5.3 github.com/nats-io/nats.go v1.31.0 - github.com/pkg/errors v0.9.1 - github.com/qiniu/go-sdk/v7 v7.11.0 github.com/robfig/cron/v3 v3.0.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.5.0 github.com/taosdata/driver-go/v3 v3.5.0 github.com/xuri/excelize/v2 v2.4.1 golang.org/x/crypto v0.18.0 - golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 - golang.org/x/text v0.14.0 google.golang.org/grpc v1.48.0 google.golang.org/protobuf v1.31.0 - gopkg.in/yaml.v3 v3.0.1 - gorm.io/driver/mysql v1.2.0 - gorm.io/driver/postgres v1.2.3 gorm.io/gorm v1.22.3 ) require ( github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible // indirect github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46 // indirect - github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect + github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible // indirect github.com/brianvoe/gofakeit/v6 v6.0.2 // indirect + github.com/casbin/casbin/v2 v2.37.4 // indirect + github.com/casbin/gorm-adapter/v3 v3.4.6 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/denisenkom/go-mssqldb v0.11.0 // indirect @@ -61,13 +47,14 @@ require ( github.com/eapache/go-resiliency v1.3.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 // indirect github.com/eapache/queue v1.1.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/go-ole/go-ole v1.2.5 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.19.15 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect + github.com/go-playground/validator/v10 v10.8.0 // indirect + github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect github.com/go-sql-driver/mysql v1.6.0 // indirect github.com/goccy/go-json v0.9.7 // indirect @@ -75,7 +62,9 @@ require ( github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/go-cmp v0.5.8 // indirect github.com/google/pprof v0.0.0-20230207041349-798e818bf904 // indirect + github.com/gorilla/schema v1.2.0 // indirect github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect @@ -95,22 +84,26 @@ require ( github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.2 // indirect - github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.4 // indirect github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/leodido/go-urn v1.2.1 // indirect + github.com/lib/pq v1.10.4 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/minio/md5-simd v1.1.2 // indirect + github.com/minio/minio-go/v7 v7.0.36 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/mojocn/base64Captcha v1.3.5 // indirect github.com/nats-io/nkeys v0.4.7 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/qiniu/go-sdk/v7 v7.11.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/richardlehane/mscfb v1.0.3 // indirect github.com/richardlehane/msoleps v1.0.1 // indirect @@ -121,11 +114,14 @@ require ( golang.org/x/net v0.10.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect - google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect gopkg.in/ini.v1 v1.66.6 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/driver/mysql v1.2.0 // indirect + gorm.io/driver/postgres v1.2.3 // indirect gorm.io/driver/sqlserver v1.2.1 // indirect gorm.io/plugin/dbresolver v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index 1f71d43..aac05cf 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,8 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1 github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/PandaXGO/PandaKit v0.0.0-20240825114426-1e96ee147767 h1:BIqJr9wDWt8iT06FrCnAUIYcRJd0/1tI/am/kTSK814= +github.com/PandaXGO/PandaKit v0.0.0-20240825114426-1e96ee147767/go.mod h1:tU7vFsbU3xx9U1Ka7L9qlLldFRtemahQDd7iH+LBplk= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= @@ -12,13 +14,10 @@ github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSd github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46 h1:5sXbqlSomvdjlRbWyNqkPsJ3Fg+tQZCbgeX1VGljbQY= github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/aliyun/alibaba-cloud-sdk-go v1.61.1443 h1:rCVskInhkRcnsRgrvsZjmHRsjXxfQNdrHaU8CgV2vrg= -github.com/aliyun/alibaba-cloud-sdk-go v1.61.1443/go.mod h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU= github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible h1:ht2+VfbXtNLGhCsnTMc6/N26nSTBK6qdhktjYyjJQkk= github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA= -github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/brianvoe/gofakeit/v6 v6.0.2 h1:MDvplMAKJMcKZDwQvsIbhT7BV/8UF/3EEy2n14ynUyA= github.com/brianvoe/gofakeit/v6 v6.0.2/go.mod h1:palrJUk4Fyw38zIFB/uBZqsgzW5VsNllhHKKwAebzew= github.com/casbin/casbin/v2 v2.37.4 h1:RWSKPjaZ8JlOBlcW1bI/FTII8OPxvQ9jVy9JwyNL6DQ= @@ -88,7 +87,6 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -128,7 +126,6 @@ github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= github.com/golang-queue/queue v0.1.3 h1:FGIrn8e0fN8EmL3glP0rFEcYVtWUGMEeqX4h4nnzh40= github.com/golang-queue/queue v0.1.3/go.mod h1:h/PhaoMwT5Jc4sQNus7APgWBUItm6QC9k6JtmwrsRos= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= @@ -140,7 +137,6 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= @@ -164,6 +160,7 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20230207041349-798e818bf904 h1:4/hN5RUoecvl+RmJRE2YxKWtnnQls6rQjjW5oV7qg2U= github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= @@ -256,13 +253,10 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI= github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible h1:jdpOPRN1zP63Td1hDQbZW73xKmzDvZHzVdNYxhnTMDA= github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible/go.mod h1:1c7szIrayyPPB/987hsnvNzLushdWf4o/79s3P08L8A= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -315,7 +309,6 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 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/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= @@ -447,7 +440,6 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -464,8 +456,6 @@ golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 h1:2o1E+E8TpNLklK9nHiPiK1uzIYrIHt+cQx3ynCwq9V8= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -498,7 +488,6 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -541,8 +530,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -577,7 +564,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= diff --git a/iothub/hook_message_work/hook_message_work.go b/iothub/hook_message_work/hook_message_work.go index a85cc67..1c469b2 100644 --- a/iothub/hook_message_work/hook_message_work.go +++ b/iothub/hook_message_work/hook_message_work.go @@ -4,11 +4,11 @@ import ( "context" "encoding/json" "fmt" + "github.com/PandaXGO/PandaKit/biz" "pandax/apps/device/services" ruleEntity "pandax/apps/rule/entity" ruleService "pandax/apps/rule/services" "pandax/iothub/netbase" - "pandax/kit/biz" "pandax/pkg/cache" "pandax/pkg/global" "pandax/pkg/global/model" diff --git a/iothub/netbase/hook_base.go b/iothub/netbase/hook_base.go index 6341d1c..cd25af3 100644 --- a/iothub/netbase/hook_base.go +++ b/iothub/netbase/hook_base.go @@ -2,10 +2,10 @@ package netbase import ( "encoding/json" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/device/entity" "pandax/apps/device/services" exhook "pandax/iothub/server/emqxserver/protobuf" - "pandax/kit/utils" "pandax/pkg/cache" "pandax/pkg/global" "pandax/pkg/global/model" @@ -100,7 +100,7 @@ func CreateSubTableField(productId, ty string, fields map[string]interface{}) { } tsl := entity.ProductTemplate{} tsl.Pid = productId - tsl.Id = utils.GenerateID() + tsl.Id = utils.GenerateID("tsl") tsl.Name = key tsl.Type = interfaceType tsl.Key = key diff --git a/kit/biz/assets.go b/kit/biz/assets.go deleted file mode 100644 index b510aea..0000000 --- a/kit/biz/assets.go +++ /dev/null @@ -1,73 +0,0 @@ -package biz - -import ( - "fmt" - "pandax/kit/utils" - "reflect" -) - -func ErrIsNil(err error, msg string, params ...any) { - if err != nil { - if err.Error() == "record not found" { - return - } - panic(NewBizErr(fmt.Sprintf(msg, params...))) - } -} - -func ErrIsNilAppendErr(err error, msg string) { - if err != nil { - panic(NewBizErr(fmt.Sprintf(msg, err.Error()))) - } -} - -func IsNil(err error) { - switch t := err.(type) { - case *BizError: - panic(any(t)) - case error: - panic(any(NewBizErr(fmt.Sprintf("非业务异常: %s", err.Error())))) - } -} - -func IsTrue(exp bool, msg string, params ...any) { - if !exp { - panic(any(NewBizErr(fmt.Sprintf(msg, params...)))) - } -} - -func IsTrueBy(exp bool, err BizError) { - if !exp { - panic(any(err)) - } -} - -func NotEmpty(str string, msg string, params ...any) { - if str == "" { - panic(any(NewBizErr(fmt.Sprintf(msg, params...)))) - } -} - -func NotNil(data any, msg string) { - if reflect.ValueOf(data).IsNil() { - panic(NewBizErr(msg)) - } -} - -func NotBlank(data any, msg string) { - if utils.IsBlank(reflect.ValueOf(data)) { - panic(NewBizErr(msg)) - } -} - -func IsEquals(data1 any, data2 any, msg string) { - if !reflect.DeepEqual(data1, data2) { - panic(NewBizErr(msg)) - } -} - -func Nil(data any, msg string) { - if !reflect.ValueOf(data).IsNil() { - panic(NewBizErr(msg)) - } -} diff --git a/kit/biz/bizerror.go b/kit/biz/bizerror.go deleted file mode 100644 index d846c7b..0000000 --- a/kit/biz/bizerror.go +++ /dev/null @@ -1,35 +0,0 @@ -package biz - -// 业务错误 -type BizError struct { - code int16 - err string -} - -var ( - Success *BizError = NewBizErrCode(200, "success") - BizErr *BizError = NewBizErrCode(400, "biz error") - ServerError *BizError = NewBizErrCode(500, "服务器异常,请联系管理员") - PermissionErr *BizError = NewBizErrCode(4001, "没有权限操作,可能是TOKEN过期了,请先登录") - CasbinErr *BizError = NewBizErrCode(403, "没有API接口访问权限,请联系管理员") -) - -// 错误消息 -func (e *BizError) Error() string { - return e.err -} - -// 错误码 -func (e *BizError) Code() int16 { - return e.code -} - -// 创建业务逻辑错误结构体,默认为业务逻辑错误 -func NewBizErr(msg string) *BizError { - return &BizError{code: BizErr.code, err: msg} -} - -// 创建业务逻辑错误结构体,可设置指定错误code -func NewBizErrCode(code int16, msg string) *BizError { - return &BizError{code: code, err: msg} -} diff --git a/kit/cache/cache.go b/kit/cache/cache.go deleted file mode 100644 index 7da1431..0000000 --- a/kit/cache/cache.go +++ /dev/null @@ -1,25 +0,0 @@ -package cache - -type Cache interface { - // 添加缓存,如果缓存则返回错误 - Add(k string, v any) error - - // 如果不存在则添加缓存值,否则直接返回 - AddIfAbsent(k string, v any) - - // 如果存在则直接返回,否则调用getValue回调函数获取值并添加该缓存值 - // @return 缓存值 - ComputeIfAbsent(k string, getValueFunc func(string) (any, error)) (any, error) - - // 获取缓存值,参数1为值,参数2->是否存在该缓存 - Get(k string) (any, bool) - - // 缓存数量 - Count() int - - // 删除缓存 - Delete(k string) - - // 清空所有缓存 - Clear() -} diff --git a/kit/cache/timed_cache.go b/kit/cache/timed_cache.go deleted file mode 100644 index 4c8ac3a..0000000 --- a/kit/cache/timed_cache.go +++ /dev/null @@ -1,434 +0,0 @@ -package cache - -import ( - "encoding/gob" - "fmt" - "io" - "os" - "sync" - "time" -) - -type Item struct { - Value any // 对象 - Expiration int64 // 缓存有效时间 - UseCount int64 // 使用次数 - AccessTime int64 // 访问时间 -} - -// 是否过期 -func (item Item) Expired() bool { - if item.Expiration == 0 { - return false - } - return time.Now().UnixNano() > item.AccessTime+item.Expiration -} - -// 是否过期 -// @return 值 and 是否过期 -func (item *Item) GetValue(updateAccessTime bool) (any, bool) { - isExpired := item.Expired() - // 更新最后访问时间,用于增加值的有效期 - if !isExpired && updateAccessTime { - item.AccessTime = time.Now().UnixNano() - } - item.UseCount = item.UseCount + 1 - return item.Value, isExpired -} - -const ( - // 无过期时间 - NoExpiration time.Duration = -1 - // 默认过期时间 - DefaultExpiration time.Duration = 0 - // 默认清理缓存时间差 - DefaultCleanupInterval = 10 -) - -type TimedCache struct { - *timedcache -} - -type timedcache struct { - defaultExpiration time.Duration - updateAccessTime bool // 是否更新最后访问时间 - items map[any]*Item - mu sync.RWMutex - onEvicted func(any, any) // 移除时回调函数 - janitor *janitor -} - -// Add an item to the cache only if an item doesn't already exist for the given -// key, or if the existing item has expired. Returns an error otherwise. -func (c *timedcache) Add(k any, x any, d time.Duration) error { - c.mu.Lock() - defer c.mu.Unlock() - _, found := c.get(k) - if found { - return fmt.Errorf("Item %s already exists", k) - } - c.set(k, x, d) - return nil -} - -func (c *timedcache) Put(k any, x any) { - c.mu.Lock() - defer c.mu.Unlock() - c.set(k, x, c.defaultExpiration) -} - -func (c *timedcache) AddIfAbsent(k any, x any) { - c.mu.Lock() - defer c.mu.Unlock() - _, found := c.get(k) - if found { - return - } - c.set(k, x, c.defaultExpiration) -} - -func (c *timedcache) ComputeIfAbsent(k any, getValueFunc func(any) (any, error)) (any, error) { - c.mu.Lock() - defer c.mu.Unlock() - value, found := c.get(k) - if found { - return value, nil - } - value, err := getValueFunc(k) - if err != nil { - return nil, err - } - - c.set(k, value, c.defaultExpiration) - return value, nil -} - -func (c *timedcache) set(k any, x any, d time.Duration) { - var e int64 - if d == DefaultExpiration { - d = c.defaultExpiration - } - if d > 0 { - e = d.Nanoseconds() - } - c.items[k] = &Item{ - Value: x, - Expiration: e, - AccessTime: time.Now().UnixNano(), - } -} - -// Get an item from the cache. Returns the item or nil, and a bool indicating -// whether the key was found. -func (c *timedcache) Get(k any) (any, bool) { - c.mu.RLock() - defer c.mu.RUnlock() - return c.get(k) -} - -func (c *timedcache) get(k any) (any, bool) { - item, found := c.items[k] - if !found { - return nil, false - } - - value, expired := item.GetValue(c.updateAccessTime) - if expired { - // c.Delete(k) - return nil, false - } - return value, true -} - -// Increment an item of type int, int8, int16, int32, int64, uintptr, uint, -// uint8, uint32, or uint64, float32 or float64 by n. Returns an error if the -// item's value is not an integer, if it was not found, or if it is not -// possible to increment it by n. To retrieve the incremented value, use one -// of the specialized methods, e.g. IncrementInt64. -func (c *timedcache) Increment(k any, n int64) error { - c.mu.Lock() - v, found := c.items[k] - if !found || v.Expired() { - c.mu.Unlock() - return fmt.Errorf("Item %s not found", k) - } - switch v.Value.(type) { - case int: - v.Value = v.Value.(int) + int(n) - case int8: - v.Value = v.Value.(int8) + int8(n) - case int16: - v.Value = v.Value.(int16) + int16(n) - case int32: - v.Value = v.Value.(int32) + int32(n) - case int64: - v.Value = v.Value.(int64) + n - case uint: - v.Value = v.Value.(uint) + uint(n) - case uintptr: - v.Value = v.Value.(uintptr) + uintptr(n) - case uint8: - v.Value = v.Value.(uint8) + uint8(n) - case uint16: - v.Value = v.Value.(uint16) + uint16(n) - case uint32: - v.Value = v.Value.(uint32) + uint32(n) - case uint64: - v.Value = v.Value.(uint64) + uint64(n) - case float32: - v.Value = v.Value.(float32) + float32(n) - case float64: - v.Value = v.Value.(float64) + float64(n) - default: - c.mu.Unlock() - return fmt.Errorf("The value for %s is not an integer", k) - } - c.items[k] = v - c.mu.Unlock() - return nil -} - -// Returns the number of items in the cache. This may include items that have -// expired, but have not yet been cleaned up. -func (c *timedcache) Count() int { - c.mu.RLock() - n := len(c.items) - c.mu.RUnlock() - return n -} - -// Copies all unexpired items in the cache into a new map and returns it. -func (c *timedcache) Items() map[any]*Item { - c.mu.RLock() - defer c.mu.RUnlock() - m := make(map[any]*Item, len(c.items)) - now := time.Now().UnixNano() - for k, v := range c.items { - // "Inlining" of Expired - if v.Expiration > 0 { - if now > (v.Expiration + v.AccessTime) { - continue - } - } - m[k] = v - } - return m -} - -// 删除指定key的数据 -func (c *timedcache) Delete(k any) { - c.mu.Lock() - v, evicted := c.delete(k) - c.mu.Unlock() - if evicted { - c.onEvicted(k, v) - } -} - -func (c *timedcache) delete(k any) (any, bool) { - // 如果有移除回调函数,则返回值及是否有删除回调函数用于进行回调处理 - if c.onEvicted != nil { - if v, found := c.items[k]; found { - delete(c.items, k) - return v.Value, true - } - } - delete(c.items, k) - return nil, false -} - -type keyAndValue struct { - key any - value any -} - -// Delete all expired items from the cache. -func (c *timedcache) DeleteExpired() { - var evictedItems []keyAndValue - now := time.Now().UnixNano() - c.mu.Lock() - for k, v := range c.items { - // "Inlining" of expired - if v.Expiration > 0 && now > (v.Expiration+v.AccessTime) { - ov, evicted := c.delete(k) - if evicted { - evictedItems = append(evictedItems, keyAndValue{k, ov}) - } - } - } - c.mu.Unlock() - for _, v := range evictedItems { - c.onEvicted(v.key, v.value) - } -} - -// 清空所有缓存 -func (c *timedcache) Clear() { - c.mu.Lock() - c.items = map[any]*Item{} - c.mu.Unlock() -} - -// Write the cache's items (using Gob) to an io.Writer. -// -// NOTE: This method is deprecated in favor of c.Items() and NewFrom() (see the -// documentation for NewFrom().) -func (c *timedcache) Save(w io.Writer) (err error) { - enc := gob.NewEncoder(w) - defer func() { - var err any - err = recover() - if err != nil { - err = fmt.Errorf("Error registering item types with Gob library") - } - }() - c.mu.RLock() - defer c.mu.RUnlock() - for _, v := range c.items { - gob.Register(v.Value) - } - err = enc.Encode(&c.items) - return -} - -// Save the cache's items to the given filename, creating the file if it -// doesn't exist, and overwriting it if it does. -// -// NOTE: This method is deprecated in favor of c.Items() and NewFrom() (see the -// documentation for NewFrom().) -func (c *timedcache) SaveFile(fname string) error { - fp, err := os.Create(fname) - if err != nil { - return err - } - err = c.Save(fp) - if err != nil { - fp.Close() - return err - } - return fp.Close() -} - -// Add (Gob-serialized) cache items from an io.Reader, excluding any items with -// keys that already exist (and haven't expired) in the current cache. -// -// NOTE: This method is deprecated in favor of c.Items() and NewFrom() (see the -// documentation for NewFrom().) -func (c *timedcache) Load(r io.Reader) error { - dec := gob.NewDecoder(r) - items := map[string]*Item{} - err := dec.Decode(&items) - if err == nil { - c.mu.Lock() - defer c.mu.Unlock() - for k, v := range items { - ov, found := c.items[k] - if !found || ov.Expired() { - c.items[k] = v - } - } - } - return err -} - -// Load and add cache items from the given filename, excluding any items with -// keys that already exist in the current cache. -// -// NOTE: This method is deprecated in favor of c.Items() and NewFrom() (see the -// documentation for NewFrom().) -func (c *timedcache) LoadFile(fname string) error { - fp, err := os.Open(fname) - if err != nil { - return err - } - err = c.Load(fp) - if err != nil { - fp.Close() - return err - } - return fp.Close() -} - -type janitor struct { - Interval time.Duration - stop chan bool -} - -func (j *janitor) Run(c *timedcache) { - ticker := time.NewTicker(j.Interval) - for { - select { - case <-ticker.C: - c.DeleteExpired() - case <-j.stop: - ticker.Stop() - return - } - } -} - -func stopJanitor(c *TimedCache) { - c.janitor.stop <- true -} - -func runJanitor(c *timedcache, ci time.Duration) { - j := &janitor{ - Interval: ci, - stop: make(chan bool), - } - c.janitor = j - go j.Run(c) -} - -func newCache(de time.Duration, m map[any]*Item) *timedcache { - if de == 0 { - de = -1 - } - c := &timedcache{ - defaultExpiration: de, - items: m, - } - return c -} - -func newCacheWithJanitor(de time.Duration, ci time.Duration, m map[any]*Item) *TimedCache { - c := newCache(de, m) - // This trick ensures that the janitor goroutine (which--granted it - // was enabled--is running DeleteExpired on c forever) does not keep - // the returned C object from being garbage collected. When it is - // garbage collected, the finalizer stops the janitor goroutine, after - // which c can be collected. - C := &TimedCache{c} - if ci > 0 { - runJanitor(c, ci) - // runtime.SetFinalizer(C, stopJanitor) - } - return C -} - -// Return a new cache with a given default expiration duration and cleanup -// interval. If the expiration duration is less than one (or NoExpiration), -// the items in the cache never expire (by default), and must be deleted -// manually. If the cleanup interval is less than one, expired items are not -// deleted from the cache before calling c.DeleteExpired(). -func NewTimedCache(defaultExpiration, cleanupInterval time.Duration) *TimedCache { - items := make(map[any]*Item) - return newCacheWithJanitor(defaultExpiration, cleanupInterval, items) -} - -// 调用删除函数时,会回调该剔除函数 -func (c *TimedCache) OnEvicted(f func(any, any)) *TimedCache { - c.mu.Lock() - c.onEvicted = f - c.mu.Unlock() - return c -} - -// 是否更新最后访问时间,是则会更新最后访问时间 -// 即只要在指定缓存时间内都没有访问该缓存,则会失效,反之失效开始时间点为最后访问时间 -func (c *TimedCache) WithUpdateAccessTime(update bool) *TimedCache { - c.mu.Lock() - c.updateAccessTime = update - c.mu.Unlock() - return c -} diff --git a/kit/captcha/captcha.go b/kit/captcha/captcha.go deleted file mode 100644 index 5d4d2f0..0000000 --- a/kit/captcha/captcha.go +++ /dev/null @@ -1,28 +0,0 @@ -package captcha - -import ( - "pandax/kit/biz" - - "github.com/mojocn/base64Captcha" -) - -var store = base64Captcha.DefaultMemStore -var driver base64Captcha.Driver = base64Captcha.NewDriverDigit(80, 240, 4, 0.7, 80) - -// 生成验证码 -func Generate() (string, string, string) { - c := base64Captcha.NewCaptcha(driver, store) - // 获取 - id, b64s, err := c.Generate() - biz.ErrIsNilAppendErr(err, "获取验证码错误: %s") - return id, b64s, "answer" -} - -// 验证验证码 -func Verify(id string, val string) bool { - if id == "" || val == "" { - return false - } - // 同时清理掉这个图片 - return store.Verify(id, val, true) -} diff --git a/kit/casbin/casbin.go b/kit/casbin/casbin.go deleted file mode 100644 index 0f5c7b3..0000000 --- a/kit/casbin/casbin.go +++ /dev/null @@ -1,81 +0,0 @@ -package casbin - -import ( - "pandax/kit/biz" - "pandax/kit/starter" - "sync" - - "github.com/casbin/casbin/v2" - gormadapter "github.com/casbin/gorm-adapter/v3" -) - -type CasbinService struct { - ModelPath string -} - -func (c *CasbinService) UpdateCasbin(roleKey string, casbinInfos []CasbinRule) error { - c.ClearCasbin(0, roleKey) - rules := [][]string{} - for _, v := range casbinInfos { - rules = append(rules, []string{roleKey, v.Path, v.Method}) - } - e := c.GetCasbinEnforcer() - success, err := e.AddPolicies(rules) - if err != nil { - return err - } - if !success { - return biz.NewBizErr("存在相同api,添加失败,请联系管理员") - } - return nil -} - -func (c *CasbinService) UpdateCasbinApi(oldPath string, newPath string, oldMethod string, newMethod string) error { - err := starter.Db.Table("casbin_rule").Model(&CasbinRule{}).Where("v1 = ? AND v2 = ?", oldPath, oldMethod).Updates(map[string]interface{}{ - "v1": newPath, - "v2": newMethod, - }).Error - if err != nil { - return biz.NewBizErr("修改api失败") - } - return nil -} - -func (c *CasbinService) GetPolicyPathByRoleId(roleKey string) []CasbinRule { - e := c.GetCasbinEnforcer() - list := e.GetFilteredPolicy(0, roleKey) - pathMaps := make([]CasbinRule, len(list)) - for i, v := range list { - pathMaps[i] = CasbinRule{ - Path: v[1], - Method: v[2], - } - } - return pathMaps -} - -func (c *CasbinService) ClearCasbin(v int, p ...string) bool { - e := c.GetCasbinEnforcer() - success, _ := e.RemoveFilteredPolicy(v, p...) - return success -} - -var ( - syncedEnforcer *casbin.SyncedEnforcer - once sync.Once -) - -func (c *CasbinService) GetCasbinEnforcer() *casbin.SyncedEnforcer { - once.Do(func() { - a, err := gormadapter.NewAdapterByDB(starter.Db) - if err != nil { - panic(biz.NewBizErr("新建权限适配器失败")) - } - syncedEnforcer, err = casbin.NewSyncedEnforcer(c.ModelPath, a) - if err != nil { - panic(biz.NewBizErr("新建权限适配器失败")) - } - }) - _ = syncedEnforcer.LoadPolicy() - return syncedEnforcer -} diff --git a/kit/casbin/casbin_model.go b/kit/casbin/casbin_model.go deleted file mode 100644 index 6bdf48f..0000000 --- a/kit/casbin/casbin_model.go +++ /dev/null @@ -1,16 +0,0 @@ -package casbin - -type CasbinRule struct { - Ptype string `json:"ptype" gorm:"column:ptype"` - RoleKey string `json:"roleKey" gorm:"column:v0"` - Path string `json:"path" gorm:"column:v1"` - Method string `json:"method" gorm:"column:v2"` - V3 string `json:"v3" gorm:"column:v3"` - V4 string `json:"v4" gorm:"column:v4"` - V5 string `json:"v5" gorm:"column:v5"` - Id int `json:"id" gorm:"primary_key;AUTO_INCREMENT;column:id"` -} - -func (CasbinRule) TableName() string { - return "casbin_rule" -} diff --git a/kit/file/file.go b/kit/file/file.go deleted file mode 100644 index acefb70..0000000 --- a/kit/file/file.go +++ /dev/null @@ -1,143 +0,0 @@ -package utilFile - -import ( - "io" - "mime/multipart" - "net/http" - "os" - "pandax/kit/biz" - "path/filepath" - "strconv" - "sync" -) - -const ( - MaxConcurrency = 16 // 最大并发数 -) - -type DownloadTask struct { - URL string - FilePath string -} - -func DownloadFileWithConcurrency(url, filepath string) error { - resp, err := http.Head(url) - if err != nil { - return err - } - defer resp.Body.Close() - - fileSize, err := strconv.Atoi(resp.Header.Get("Content-Length")) - if err != nil { - return err - } - - file, err := os.OpenFile(filepath, os.O_RDWR|os.O_CREATE, 0666) - if err != nil { - return err - } - defer file.Close() - - // 检查本地文件大小 - localFileSize, err := file.Seek(0, io.SeekEnd) - if err != nil { - return err - } - - // 计算剩余未下载的文件大小 - remainingSize := fileSize - int(localFileSize) - - // 计算每个片段的大小 - chunkSize := remainingSize / MaxConcurrency - - // 创建等待组,用于等待所有goroutine完成 - var wg sync.WaitGroup - wg.Add(MaxConcurrency) - - // 创建并发下载任务 - for i := 0; i < MaxConcurrency; i++ { - start := localFileSize + int64(i*chunkSize) - end := start + int64(chunkSize) - 1 - - // 最后一个片段的结束位置可能超过文件大小,需要修正 - if i == MaxConcurrency-1 { - end = int64(fileSize) - 1 - } - - go func(index int, start, end int64) { - defer wg.Done() - - err := downloadChunk(url, filepath, start, end) - if err != nil { - biz.NewBizErr("文件下载失败") - // 处理下载错误 - } - }(i, start, end) - } - - // 等待所有goroutine完成 - wg.Wait() - - return nil -} - -func downloadChunk(url, filepath string, start, end int64) error { - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return err - } - - // 设置Range头部 - req.Header.Set("Range", "bytes="+strconv.FormatInt(start, 10)+"-"+strconv.FormatInt(end, 10)) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - file, err := os.OpenFile(filepath, os.O_RDWR, 0666) - if err != nil { - return err - } - defer file.Close() - - _, err = file.Seek(start, io.SeekStart) - if err != nil { - return err - } - - _, err = io.CopyN(file, resp.Body, end-start+1) - if err != nil { - return err - } - - return nil -} - -func SaveUploadedFile(file *multipart.FileHeader, dst string) error { - src, err := file.Open() - if err != nil { - return err - } - defer src.Close() - - out, err := os.Create(dst) - if err != nil { - return err - } - defer out.Close() - - _, err = io.Copy(out, src) - return err -} - -func IsExcl(fpath string) bool { - ext := filepath.Ext(fpath) - switch ext { - case "xls", "xlsx": - return true - default: - return false - } -} diff --git a/kit/file/zipfiles.go b/kit/file/zipfiles.go deleted file mode 100644 index 818b15a..0000000 --- a/kit/file/zipfiles.go +++ /dev/null @@ -1,61 +0,0 @@ -package utilFile - -import ( - "archive/zip" - "io" - "os" - "strings" -) - -func ZipFiles(filename string, files []string, oldForm, newForm string) error { - newZipFile, err := os.Create(filename) - if err != nil { - return err - } - defer newZipFile.Close() - - zipWriter := zip.NewWriter(newZipFile) - defer zipWriter.Close() - - for _, file := range files { - err = compressFile(file, oldForm, newForm, zipWriter) - if err != nil { - return err - } - } - - return nil -} - -func compressFile(file, oldForm, newForm string, zipWriter *zip.Writer) error { - zipFile, err := os.Open(file) - if err != nil { - return err - } - defer zipFile.Close() - - info, err := zipFile.Stat() - if err != nil { - return err - } - - header, err := zip.FileInfoHeader(info) - if err != nil { - return err - } - - header.Name = strings.Replace(file, oldForm, newForm, -1) - header.Method = zip.Deflate - - writer, err := zipWriter.CreateHeader(header) - if err != nil { - return err - } - - _, err = io.Copy(writer, zipFile) - if err != nil { - return err - } - - return nil -} \ No newline at end of file diff --git a/kit/flow/edge.go b/kit/flow/edge.go deleted file mode 100644 index 89ee956..0000000 --- a/kit/flow/edge.go +++ /dev/null @@ -1,33 +0,0 @@ -package flow - -import "pandax/kit/utils" - -type Edge struct { - Id string `json:"id"` - Type string `json:"type"` - SourceNodeId string `json:"sourceNodeId"` //当前节点 - TargetNodeId string `json:"targetNodeId"` //下一节点 - StartPoint Point `json:"startPoint"` - EndPoint Point `json:"endPoint"` - Properties Properties `json:"properties"` - PointsList []Point `json:"pointsList"` -} - -type Point struct { - X int `json:"x"` - Y int `json:"y"` -} - -func (edge *Edge) getTargetNode(sourceNodeId string) string { - if edge.SourceNodeId == sourceNodeId { - return edge.TargetNodeId - } - return "" -} - -func (edge *Edge) GetProperties(data any) error { - if err := utils.Map2Struct(edge.Properties, data); err != nil { - return err - } - return nil -} diff --git a/kit/flow/flow.go b/kit/flow/flow.go deleted file mode 100644 index 4966549..0000000 --- a/kit/flow/flow.go +++ /dev/null @@ -1,40 +0,0 @@ -package flow - -type Flow struct { - Nodes []Node `json:"nodes"` - Edges []Edge `json:"edges"` -} - -func (f *Flow) GetStartNode(ty string) *Node { - for _, node := range f.Nodes { - if node.IsStartNode(ty) { - return &node - } - } - return nil -} - -func (f *Flow) GetTargetNodeId(sourceNodeId string) string { - for _, edge := range f.Edges { - return edge.getTargetNode(sourceNodeId) - } - return "" -} - -func (f *Flow) GetTargetNode(sourceNodeId string) *Node { - for _, edge := range f.Edges { - if edge.SourceNodeId == sourceNodeId { - return f.GetNode(edge.TargetNodeId) - } - } - return nil -} - -func (f *Flow) GetNode(nodeId string) *Node { - for _, node := range f.Nodes { - if node.Id == nodeId { - return &node - } - } - return nil -} diff --git a/kit/flow/node.go b/kit/flow/node.go deleted file mode 100644 index 650bd98..0000000 --- a/kit/flow/node.go +++ /dev/null @@ -1,39 +0,0 @@ -package flow - -import ( - "pandax/kit/utils" -) - -type Properties map[string]any - -type Node struct { - Id string `json:"id"` - Type string `json:"type"` - X int `json:"x"` - Y int `json:"y"` - Text Text `json:"text"` - Properties Properties `json:"properties"` -} - -type Text struct { - X int `json:"x"` - Y int `json:"y"` - Value string `json:"value"` -} - -func (node *Node) IsStartNode(ty string) bool { - return node.Type == ty -} - -func (node *Node) GetProperties(data any) error { - if err := utils.Map2Struct(node.Properties, data); err != nil { - return err - } - return nil -} - -type NodeFunc func(*Node) - -func (node *Node) RunNodeFunc(nodeFunc NodeFunc) { - nodeFunc(node) -} diff --git a/kit/httpclient/fetch.go b/kit/httpclient/fetch.go deleted file mode 100644 index 7efda14..0000000 --- a/kit/httpclient/fetch.go +++ /dev/null @@ -1,256 +0,0 @@ -package httpclient - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "mime/multipart" - "net/http" - "os" - "time" -) - -var client = &http.Client{} - -// 默认超时 -const DefTimeout = 60 - -type RequestWrapper struct { - url string - method string - timeout int - body io.Reader - header map[string]string -} - -type MultipartFile struct { - FieldName string // 字段名 - FileName string // 文件名 - FilePath string // 文件路径,文件路径不为空,则优先读取文件路径的内容 - Bytes []byte // 文件内容 -} - -// 创建一个请求 -func NewRequest(url string) *RequestWrapper { - return &RequestWrapper{url: url} -} - -func (r *RequestWrapper) Url(url string) *RequestWrapper { - r.url = url - return r -} - -func (r *RequestWrapper) Header(name, value string) *RequestWrapper { - if r.header == nil { - r.header = make(map[string]string) - } - r.header[name] = value - return r -} - -func (r *RequestWrapper) Timeout(timeout int) *RequestWrapper { - r.timeout = timeout - return r -} - -func (r *RequestWrapper) GetByParam(paramMap map[string]string) *ResponseWrapper { - var params string - for k, v := range paramMap { - if params != "" { - params += "&" - } else { - params += "?" - } - params += k + "=" + v - } - r.url += params - return r.Get() -} - -func (r *RequestWrapper) Get() *ResponseWrapper { - r.method = "GET" - r.body = nil - return request(r) -} - -func (r *RequestWrapper) Delete() *ResponseWrapper { - r.method = "DELETE" - r.body = nil - return request(r) -} - -func (r *RequestWrapper) PostJson(body string) *ResponseWrapper { - buf := bytes.NewBufferString(body) - r.method = "POST" - r.body = buf - if r.header == nil { - r.header = make(map[string]string) - } - r.header["Content-type"] = "application/json" - return request(r) -} - -func (r *RequestWrapper) PostText(body string) *ResponseWrapper { - buf := bytes.NewBufferString(body) - r.method = "POST" - r.body = buf - if r.header == nil { - r.header = make(map[string]string) - } - r.header["Content-Type"] = "text/plain" - return request(r) -} - -func (r *RequestWrapper) PutJson(body string) *ResponseWrapper { - buf := bytes.NewBufferString(body) - r.method = "PUT" - r.body = buf - if r.header == nil { - r.header = make(map[string]string) - } - r.header["Content-type"] = "application/json" - return request(r) -} - -func (r *RequestWrapper) PostObj(body any) *ResponseWrapper { - marshal, err := json.Marshal(body) - if err != nil { - return createRequestError(errors.New("解析json obj错误")) - } - return r.PostJson(string(marshal)) -} - -func (r *RequestWrapper) PostParams(params string) *ResponseWrapper { - buf := bytes.NewBufferString(params) - r.method = "POST" - r.body = buf - if r.header == nil { - r.header = make(map[string]string) - } - r.header["Content-type"] = "application/x-www-form-urlencoded" - return request(r) -} - -func (r *RequestWrapper) PostMulipart(files []MultipartFile, reqParams map[string]string) *ResponseWrapper { - buf := &bytes.Buffer{} - // 文件写入 buf - writer := multipart.NewWriter(buf) - for _, uploadFile := range files { - var reader io.Reader - // 如果文件路径不为空,则读取该路径文件,否则使用bytes - if uploadFile.FilePath != "" { - file, err := os.Open(uploadFile.FilePath) - if err != nil { - return createRequestError(err) - } - defer file.Close() - reader = file - } else { - reader = bytes.NewBuffer(uploadFile.Bytes) - } - - part, err := writer.CreateFormFile(uploadFile.FieldName, uploadFile.FileName) - if err != nil { - return createRequestError(err) - } - _, err = io.Copy(part, reader) - } - // 如果有其他参数,则写入body - for k, v := range reqParams { - if err := writer.WriteField(k, v); err != nil { - return createRequestError(err) - } - } - if err := writer.Close(); err != nil { - return createRequestError(err) - } - - r.method = "POST" - r.body = buf - if r.header == nil { - r.header = make(map[string]string) - } - r.header["Content-type"] = writer.FormDataContentType() - return request(r) -} - -type ResponseWrapper struct { - StatusCode int - Body []byte - Header http.Header -} - -func (r *ResponseWrapper) IsSuccess() bool { - return r.StatusCode == 200 -} - -func (r *ResponseWrapper) BodyToObj(objPtr any) error { - _ = json.Unmarshal(r.Body, &objPtr) - return r.getError() -} - -func (r *ResponseWrapper) BodyToString() (string, error) { - return string(r.Body), r.getError() -} - -func (r *ResponseWrapper) BodyToMap() (map[string]any, error) { - var res map[string]any - err := json.Unmarshal(r.Body, &res) - if err != nil { - return nil, err - } - return res, r.getError() -} - -func (r *ResponseWrapper) getError() error { - if !r.IsSuccess() { - return errors.New(string(r.Body)) - } - return nil -} - -func request(rw *RequestWrapper) *ResponseWrapper { - wrapper := &ResponseWrapper{StatusCode: 0, Header: make(http.Header)} - timeout := rw.timeout - if timeout > 0 { - client.Timeout = time.Duration(timeout) * time.Second - } else { - timeout = DefTimeout - } - - req, err := http.NewRequest(rw.method, rw.url, rw.body) - if err != nil { - return createRequestError(err) - } - setRequestHeader(req, rw.header) - resp, err := client.Do(req) - if err != nil { - wrapper.Body = []byte(fmt.Sprintf("执行HTTP请求错误-%s", err.Error())) - return wrapper - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - wrapper.Body = []byte(fmt.Sprintf("读取HTTP请求返回值失败-%s", err.Error())) - return wrapper - } - wrapper.StatusCode = resp.StatusCode - wrapper.Body = body - wrapper.Header = resp.Header - - return wrapper -} - -func setRequestHeader(req *http.Request, header map[string]string) { - req.Header.Set("User-Agent", "golang/mayfly") - for k, v := range header { - req.Header.Set(k, v) - } -} - -func createRequestError(err error) *ResponseWrapper { - return &ResponseWrapper{0, []byte(fmt.Sprintf("创建HTTP请求错误-%s", err.Error())), make(http.Header)} -} diff --git a/kit/logger/logger.go b/kit/logger/logger.go deleted file mode 100644 index dbee893..0000000 --- a/kit/logger/logger.go +++ /dev/null @@ -1,64 +0,0 @@ -package logger - -import ( - "fmt" - "os" - "strings" - "time" - - "github.com/sirupsen/logrus" -) - -var Log *logrus.Logger - -func InitLog(fileName, level string) *logrus.Logger { - Log = logrus.New() - Log.SetFormatter(new(LogFormatter)) - Log.SetReportCaller(true) - - // 根据配置文件设置日志级别 - if level != "" { - l, err := logrus.ParseLevel(level) - if err != nil { - panic(any(fmt.Sprintf("日志级别不存在: %s", level))) - } - Log.SetLevel(l) - } else { - Log.SetLevel(logrus.DebugLevel) - } - if fileName != "" { - file, err := os.OpenFile(fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModeAppend|0666) - if err != nil { - panic(any(fmt.Sprintf("创建日志文件失败: %s", err.Error()))) - } - Log.Out = file - } - - return Log -} - -type LogFormatter struct{} - -func (l *LogFormatter) Format(entry *logrus.Entry) ([]byte, error) { - timestamp := time.Now().Local().Format("2006-01-02 15:04:05.000") - level := entry.Level - logMsg := fmt.Sprintf("%s [%s]", timestamp, strings.ToUpper(level.String())) - // 如果存在调用信息,且为error级别以上记录文件及行号 - if caller := entry.Caller; caller != nil { - var fp string - // 全路径切割,只获取项目相关路径, - // 即/Users/hml/Desktop/project/go/pandax/test.go只获取/test.go - ps := strings.Split(caller.File, "pandax/") - if len(ps) >= 2 { - fp = ps[1] - } else { - fp = ps[0] - } - logMsg = logMsg + fmt.Sprintf(" [%s:%d]", fp, caller.Line) - } - for k, v := range entry.Data { - logMsg = logMsg + fmt.Sprintf(" [%s=%v]", k, v) - } - logMsg = logMsg + fmt.Sprintf(" : %s\n", entry.Message) - return []byte(logMsg), nil -} diff --git a/kit/mail/mail.go b/kit/mail/mail.go deleted file mode 100644 index 90803e7..0000000 --- a/kit/mail/mail.go +++ /dev/null @@ -1,64 +0,0 @@ -package email - -import ( - "crypto/tls" - "fmt" - "net/smtp" - "strings" - - "github.com/jordan-wright/email" -) - -type Mail struct { - Host string `json:"host"` // 服务器地址 - Port int `json:"port"` // 服务器端口 - From string `json:"from"` // 邮箱账号 - Nickname string `json:"nickname"` // 发件人 - Secret string `json:"secret"` // 邮箱密码 - IsSSL bool `json:"isSsl"` // 是否开启ssl -} - -func (m Mail) Email(to, subject string, body string) error { - tos := strings.Split(to, ",") - return m.send(tos, subject, body) -} - -//@function: ErrorToEmail -//@description: 给email中间件错误发送邮件到指定邮箱 -//@param: subject string, body string -//@return: error - -func (m Mail) ErrorToEmail(to, subject string, body string) error { - tos := strings.Split(to, ",") - if tos[len(tos)-1] == "" { // 判断切片的最后一个元素是否为空,为空则移除 - tos = tos[:len(tos)-1] - } - return m.send(tos, subject, body) -} - -//@function: send -//@description: Email发送方法 -//@param: subject string, body string -//@return: error - -func (m Mail) send(to []string, subject string, body string) error { - - auth := smtp.PlainAuth("", m.From, m.Secret, m.Host) - e := email.NewEmail() - if m.Nickname != "" { - e.From = fmt.Sprintf("%s <%s>", m.Nickname, m.From) - } else { - e.From = m.From - } - e.To = to - e.Subject = subject - e.HTML = []byte(body) - var err error - hostAddr := fmt.Sprintf("%s:%d", m.Host, m.Port) - if m.IsSSL { - err = e.SendWithTLS(hostAddr, auth, &tls.Config{ServerName: m.Host}) - } else { - err = e.Send(hostAddr, auth) - } - return err -} diff --git a/kit/mail/mail_test.go b/kit/mail/mail_test.go deleted file mode 100644 index 2e70e75..0000000 --- a/kit/mail/mail_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package email - -import "testing" - - -// 自行替换测试账户信息 -func TestMail_Email(t *testing.T) { - ma := Mail{ - Host: "smtp.163.com", - Port: 25, - From: "x@163.com", - Nickname: "x", - Secret: "x", - IsSSL: false, - } - - email := ma.Email("xx@163.com", "ceshi", "ceshibody") - t.Log(email) -} diff --git a/kit/model/base_model.go b/kit/model/base_model.go deleted file mode 100644 index faaa5c0..0000000 --- a/kit/model/base_model.go +++ /dev/null @@ -1,33 +0,0 @@ -package model - -import ( - "gorm.io/gorm" - "time" -) - -// BaseAutoModel 使用代码生成需要此,不能自由命名id -type BaseAutoModel struct { - Id int `gorm:"primary_key;AUTO_INCREMENT;column:id" json:"id" form:"id"` - CreatedAt time.Time `gorm:"column:create_time" json:"createTime" form:"createTime"` - UpdatedAt time.Time `gorm:"column:update_time" json:"updateTime" form:"updateTime"` - DeletedAt gorm.DeletedAt `gorm:"column:delete_time" sql:"index" json:"-"` -} - -// BaseAutoModelD 表想要硬删除使用他 -type BaseAutoModelD struct { - Id int `gorm:"primary_key;AUTO_INCREMENT;column:id" json:"id" form:"id"` - CreatedAt time.Time `gorm:"column:create_time" json:"createTime" form:"createTime"` - UpdatedAt time.Time `gorm:"column:update_time" json:"updateTime" form:"updateTime"` -} - -type BaseModel struct { - CreatedAt time.Time `gorm:"column:create_time" json:"createTime" form:"createTime"` - UpdatedAt time.Time `gorm:"column:update_time" json:"updateTime" form:"updateTime"` - DeletedAt gorm.DeletedAt `gorm:"column:delete_time" sql:"index" json:"-"` -} - -// BaseModelD 硬删除 -type BaseModelD struct { - CreatedAt time.Time `gorm:"column:create_time" json:"createTime" form:"create_time"` - UpdatedAt time.Time `gorm:"column:update_time" json:"updateTime" form:"update_time"` -} diff --git a/kit/model/jsonb.go b/kit/model/jsonb.go deleted file mode 100644 index aa0f5e1..0000000 --- a/kit/model/jsonb.go +++ /dev/null @@ -1,36 +0,0 @@ -package model - -import ( - "database/sql/driver" - "encoding/json" - "errors" -) - -type JSONB map[string]interface{} - -func (a JSONB) Value() (driver.Value, error) { - return json.Marshal(a) -} - -func (a *JSONB) Scan(value interface{}) error { - b, ok := value.([]byte) - if !ok { - return errors.New("type assertion to []byte failed") - } - return json.Unmarshal(b, &a) -} - -// JSONBS Interface for JSONB Field of yourTableName Table -type JSONBS []interface{} - -func (a JSONBS) Value() (driver.Value, error) { - return json.Marshal(a) -} - -func (a *JSONBS) Scan(value interface{}) error { - b, ok := value.([]byte) - if !ok { - return errors.New("type assertion to []byte failed") - } - return json.Unmarshal(b, &a) -} diff --git a/kit/model/login_account.go b/kit/model/login_account.go deleted file mode 100644 index 0154bf3..0000000 --- a/kit/model/login_account.go +++ /dev/null @@ -1,39 +0,0 @@ -package model - -import "time" - -type AppContext struct { -} - -type LoginAccount struct { - UserId int64 - TenantId int64 - OrganizationId int64 - RoleId int64 - DeptId int64 - PostId int64 - Username string - RoleKey string -} - -type OauthAccount struct { - ID uint `json:"id" gorm:"autoIncrement;primaryKey"` - Name string `json:"name" gorm:"size:100;not null;unique"` - Password string `json:"-" gorm:"size:256;"` - Email string `json:"email" gorm:"size:256;"` - Avatar string `json:"avatar" gorm:"size:256;"` - AuthInfos []AuthInfo `json:"authInfos" gorm:"foreignKey:UserId;references:ID"` -} - -type AuthInfo struct { - ID uint `json:"id" gorm:"autoIncrement;primaryKey"` - UserId uint `json:"userId" gorm:"size:256"` - Url string `json:"url" gorm:"size:256"` - AuthType string `json:"authType" gorm:"size:256"` - AuthId string `json:"authId" gorm:"size:256"` - AccessToken string `json:"-" gorm:"size:256"` - RefreshToken string `json:"-" gorm:"size:256"` - Expiry time.Time `json:"-"` - - BaseModel -} diff --git a/kit/model/model.go b/kit/model/model.go deleted file mode 100644 index c37f664..0000000 --- a/kit/model/model.go +++ /dev/null @@ -1,199 +0,0 @@ -package model - -import ( - "fmt" - "pandax/kit/biz" - "pandax/kit/starter" - "strconv" - - "strings" - "time" - - "gorm.io/gorm" -) - -type Model struct { - BaseAutoModel - CreatorId int64 `json:"creatorId"` - Creator string `json:"creator"` //创建者 - ModifierId int64 `json:"modifierId"` - Modifier string `json:"modifier"` //修改者 -} - -// 设置基础信息. 如创建时间,修改时间,创建者,修改者信息 -func (m *Model) SetBaseInfo(account *LoginAccount) { - nowTime := time.Now() - isCreate := m.Id == 0 - if isCreate { - m.CreatedAt = nowTime - } - m.UpdatedAt = nowTime - - if account == nil { - return - } - id := account.UserId - name := account.Username - if isCreate { - m.CreatorId = id - m.Creator = name - } - m.Modifier = name - m.ModifierId = id -} - -// 事务 -func Tx(funcs ...func(db *gorm.DB) error) (err error) { - tx := starter.Db.Begin() - defer func() { - var err any - err = recover() - if err != nil { - tx.Rollback() - err = fmt.Errorf("%v", err) - } - }() - for _, f := range funcs { - err = f(tx) - if err != nil { - tx.Rollback() - return - } - } - err = tx.Commit().Error - return -} - -// 根据id获取实体对象。model需为指针类型(需要将查询出来的值赋值给model) -// -// 若error不为nil则为不存在该记录 -func GetById(model any, id uint64, cols ...string) error { - return starter.Db.Select(cols).Where("id = ?", id).First(model).Error -} - -// 根据id列表查询 -func GetByIdIn(model any, list any, ids []uint64, orderBy ...string) { - var orderByStr string - if orderBy == nil { - orderByStr = "id desc" - } else { - orderByStr = strings.Join(orderBy, ",") - } - starter.Db.Model(model).Where("id in (?)", ids).Order(orderByStr).Find(list) -} - -// 根据id列表查询 model可以是对象,也可以是map[string]interface{} -func CountBy(model any) int64 { - var count int64 - starter.Db.Model(model).Where(model).Count(&count) - return count -} - -// 根据id更新model,更新字段为model中不为空的值,即int类型不为0,ptr类型不为nil这类字段值 -func UpdateById(model any) error { - return starter.Db.Model(model).Updates(model).Error -} -func UpdateByWhere(model any, where any) error { - return starter.Db.Model(model).Where(where).Updates(model).Error -} - -// 根据id删除model -func DeleteById(model any, id uint64) error { - return starter.Db.Delete(model, "id = ?", id).Error -} - -// 根据条件删除 -func DeleteByCondition(model any) error { - return starter.Db.Where(model).Delete(model).Error -} - -// 插入model -func Insert(model any) error { - return starter.Db.Create(model).Error -} - -// 获取满足model中不为空的字段值条件的所有数据. -// -// list为数组类型 如 var users *[]User,可指定为非model结构体,即只包含需要返回的字段结构体 -func ListBy(model any, list any, cols ...string) { - starter.Db.Model(model).Select(cols).Where(model).Find(list) -} - -// 获取满足model中不为空的字段值条件的所有数据. -// -// list为数组类型 如 var users *[]User,可指定为非model结构体 -func ListByOrder(model any, list any, order ...string) { - var orderByStr string - if order == nil { - orderByStr = "id desc" - } else { - orderByStr = strings.Join(order, ",") - } - starter.Db.Model(model).Where(model).Order(orderByStr).Find(list) -} - -// 获取满足model中不为空的字段值条件的单个对象。model需为指针类型(需要将查询出来的值赋值给model) -// -// 若 error不为nil,则为不存在该记录 -func GetBy(model any, cols ...string) error { - return starter.Db.Select(cols).Where(model).First(model).Error -} - -// 获取满足conditionModel中不为空的字段值条件的单个对象。model需为指针类型(需要将查询出来的值赋值给model) -// toModel 需要查询的字段 -// 若 error不为nil,则为不存在该记录 -func GetByConditionTo(conditionModel any, toModel any) error { - return starter.Db.Model(conditionModel).Where(conditionModel).First(toModel).Error -} - -// 获取分页结果 -func GetPage(pageParam *PageParam, conditionModel any, toModels any, orderBy ...string) *ResultPage { - var count int64 - err := starter.Db.Model(conditionModel).Where(conditionModel).Count(&count).Error - biz.ErrIsNilAppendErr(err, " 查询错误:%s") - if count == 0 { - return &ResultPage{Total: 0, Data: []string{}} - } - - page := pageParam.PageNum - pageSize := pageParam.PageSize - var orderByStr string - if orderBy == nil { - orderByStr = "id desc" - } else { - orderByStr = strings.Join(orderBy, ",") - } - err = starter.Db.Model(conditionModel).Where(conditionModel).Order(orderByStr).Limit(pageSize).Offset((page - 1) * pageSize).Find(toModels).Error - biz.ErrIsNil(err, "查询失败") - return &ResultPage{Total: count, Data: toModels} -} - -// 根据sql获取分页对象 -func GetPageBySql(sql string, param *PageParam, toModel any, args ...any) *ResultPage { - db := starter.Db - selectIndex := strings.Index(sql, "SELECT ") + 7 - fromIndex := strings.Index(sql, " FROM") - selectCol := sql[selectIndex:fromIndex] - countSql := strings.Replace(sql, selectCol, "COUNT(*) AS total ", 1) - // 查询count - var count int - db.Raw(countSql, args...).Scan(&count) - if count == 0 { - return &ResultPage{Total: 0, Data: []string{}} - } - // 分页查询 - limitSql := sql + " LIMIT " + strconv.Itoa(param.PageNum-1) + ", " + strconv.Itoa(param.PageSize) - err := db.Raw(limitSql).Scan(toModel).Error - biz.ErrIsNil(err, "查询失败") - return &ResultPage{Total: int64(count), Data: toModel} -} - -func GetListBySql(sql string, params ...any) []map[string]any { - var maps []map[string]any - starter.Db.Raw(sql, params).Scan(&maps) - return maps -} - -func GetListBySql2Model(sql string, toEntity any, params ...any) error { - return starter.Db.Raw(sql, params).Find(toEntity).Error -} diff --git a/kit/model/page.go b/kit/model/page.go deleted file mode 100644 index 5242ebd..0000000 --- a/kit/model/page.go +++ /dev/null @@ -1,15 +0,0 @@ -package model - -// 分页参数 -type PageParam struct { - PageNum int `json:"pageNum"` - PageSize int `json:"pageSize"` - Params string `json:"params"` -} - -type ResultPage struct { - Total int64 `json:"total"` - PageNum int64 `json:"pageNum"` - PageSize int64 `json:"pageSize"` - Data any `json:"data"` -} diff --git a/kit/model/result.go b/kit/model/result.go deleted file mode 100644 index 1efb5b1..0000000 --- a/kit/model/result.go +++ /dev/null @@ -1,62 +0,0 @@ -package model - -import ( - "encoding/json" - "fmt" - "pandax/kit/biz" -) - -const ( - SuccessCode = 200 - SuccessMsg = "success" -) - -// 统一返回结果结构体 -type Result struct { - Code int16 `json:"code"` - Msg string `json:"msg"` - Data any `json:"data"` -} - -// 将Result转为json字符串 -func (r *Result) ToJson() string { - jsonData, err := json.Marshal(r) - if err != nil { - fmt.Println("data转json错误") - } - return string(jsonData) -} - -// 判断该Result是否为成功状态 -func (r *Result) IsSuccess() bool { - return r.Code == SuccessCode -} - -// 返回成功状态的Result -// data 成功附带的数据消息 -func Success(data any) *Result { - return &Result{Code: SuccessCode, Msg: SuccessMsg, Data: data} -} - -// 返回成功状态的Result -// data 成功不附带数据 -func SuccessNoData() *Result { - return &Result{Code: SuccessCode, Msg: SuccessMsg} -} - -func Error(bizerr *biz.BizError) *Result { - return &Result{Code: bizerr.Code(), Msg: bizerr.Error()} -} - -// 返回服务器错误Result -func ServerError() *Result { - return Error(biz.ServerError) -} - -func TokenError() *Result { - return Error(biz.PermissionErr) -} - -func ErrorBy(code int16, msg string) *Result { - return &Result{Code: code, Msg: msg} -} diff --git a/kit/oauth/github.go b/kit/oauth/github.go deleted file mode 100644 index 8872cc0..0000000 --- a/kit/oauth/github.go +++ /dev/null @@ -1,184 +0,0 @@ -package oauth - -import ( - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "strconv" - "strings" - "time" - - "golang.org/x/oauth2" -) - -type GithubAuth struct { - Client *http.Client - Config *oauth2.Config -} - -func NewGithubAuth(clientId string, clientSecret string) *GithubAuth { - auth := &GithubAuth{ - Config: &oauth2.Config{ - Scopes: []string{"user:email", "read:user"}, - Endpoint: oauth2.Endpoint{ - AuthURL: "https://github.com/login/oauth/authorize", - TokenURL: "https://github.com/login/oauth/access_token", - }, - ClientID: clientId, - ClientSecret: clientSecret, - }, - Client: defaultHttpClient, - } - - return auth -} - -type GithubToken struct { - AccessToken string `json:"access_token"` - TokenType string `json:"token_type"` - Scope string `json:"scope"` - Error string `json:"error"` -} - -func (auth *GithubAuth) GetToken(code string) (*oauth2.Token, error) { - if len(auth.Config.ClientID) == 0 || len(auth.Config.ClientSecret) == 0 { - return nil, fmt.Errorf("Github OAuth client id or secret is empty, please set in config first") - } - - params := &struct { - Code string `json:"code"` - ClientId string `json:"client_id"` - ClientSecret string `json:"client_secret"` - }{code, auth.Config.ClientID, auth.Config.ClientSecret} - data, err := auth.postWithBody(params, auth.Config.Endpoint.TokenURL) - if err != nil { - return nil, err - } - pToken := &GithubToken{} - if err = json.Unmarshal(data, pToken); err != nil { - return nil, err - } - if pToken.Error != "" { - return nil, fmt.Errorf("err: %s", pToken.Error) - } - - token := &oauth2.Token{ - AccessToken: pToken.AccessToken, - TokenType: "Bearer", - } - - return token, nil - -} - -// https://github.com/login/oauth/authorize?client_id=85db232fde2c9320ece7&redirect_uri=http://localhost:8080/api/auth/github&scope=user&state=weave_state -type GitHubUserInfo struct { - Login string `json:"login"` - ID int `json:"id"` - NodeId string `json:"node_id"` - AvatarUrl string `json:"avatar_url"` - GravatarId string `json:"gravatar_id"` - Url string `json:"url"` - HtmlUrl string `json:"html_url"` - FollowersUrl string `json:"followers_url"` - FollowingUrl string `json:"following_url"` - GistsUrl string `json:"gists_url"` - StarredUrl string `json:"starred_url"` - SubscriptionsUrl string `json:"subscriptions_url"` - OrganizationsUrl string `json:"organizations_url"` - ReposUrl string `json:"repos_url"` - EventsUrl string `json:"events_url"` - ReceivedEventsUrl string `json:"received_events_url"` - Type string `json:"type"` - SiteAdmin bool `json:"site_admin"` - Name string `json:"name"` - Company string `json:"company"` - Blog string `json:"blog"` - Location string `json:"location"` - Email string `json:"email"` - Hireable bool `json:"hireable"` - Bio string `json:"bio"` - TwitterUsername interface{} `json:"twitter_username"` - PublicRepos int `json:"public_repos"` - PublicGists int `json:"public_gists"` - Followers int `json:"followers"` - Following int `json:"following"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` - PrivateGists int `json:"private_gists"` - TotalPrivateRepos int `json:"total_private_repos"` - OwnedPrivateRepos int `json:"owned_private_repos"` - DiskUsage int `json:"disk_usage"` - Collaborators int `json:"collaborators"` - TwoFactorAuthentication bool `json:"two_factor_authentication"` - Plan struct { - Name string `json:"name"` - Space int `json:"space"` - Collaborators int `json:"collaborators"` - PrivateRepos int `json:"private_repos"` - } `json:"plan"` -} - -func (auth *GithubAuth) GetUserInfo(token *oauth2.Token) (*UserInfo, error) { - req, err := http.NewRequest("GET", "https://api.github.com/user", nil) - if err != nil { - return nil, err - } - req.Header.Add("Authorization", "token "+token.AccessToken) - resp, err := auth.Client.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - var githubUserInfo GitHubUserInfo - err = json.Unmarshal(body, &githubUserInfo) - if err != nil { - return nil, err - } - - user := &UserInfo{ - ID: strconv.Itoa(githubUserInfo.ID), - Url: githubUserInfo.Url, - AuthType: GithubAuthType, - Username: githubUserInfo.Login, - DisplayName: githubUserInfo.Name, - Email: githubUserInfo.Email, - AvatarUrl: githubUserInfo.AvatarUrl, - } - return user, nil -} - -func (auth *GithubAuth) postWithBody(body interface{}, url string) ([]byte, error) { - bs, err := json.Marshal(body) - if err != nil { - return nil, err - } - r := strings.NewReader(string(bs)) - req, _ := http.NewRequest("POST", url, r) - req.Header.Set("Accept", "application/json") - req.Header.Set("Content-Type", "application/json") - resp, err := auth.Client.Do(req) - if err != nil { - return nil, err - } - data, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { - return - } - }(resp.Body) - - return data, nil -} diff --git a/kit/oauth/provider.go b/kit/oauth/provider.go deleted file mode 100644 index 81eae73..0000000 --- a/kit/oauth/provider.go +++ /dev/null @@ -1,97 +0,0 @@ -package oauth - -import ( - "fmt" - "net" - "net/http" - "pandax/kit/model" - "time" - - "golang.org/x/oauth2" -) - -const ( - GithubAuthType = "github" - WeChatAuthType = "wechat" - EmptyAuthType = "nil" -) - -var ( - defaultHttpClient = &http.Client{ - Transport: &http.Transport{ - Dial: (&net.Dialer{ - Timeout: 5 * time.Second, - }).Dial, - TLSHandshakeTimeout: 5 * time.Second, - }, - Timeout: 10 * time.Second, - } -) - -func IsEmptyAuthType(authType string) bool { - return authType == "" || authType == EmptyAuthType -} - -type OAuthConfig struct { - AuthType string `yaml:"authType"` - ClientId string `yaml:"clientId"` - ClientSecret string `yaml:"clientSecret"` -} - -type UserInfo struct { - ID string - Url string - AuthType string - Username string - DisplayName string - Email string - AvatarUrl string -} - -func (ui *UserInfo) User() *model.OauthAccount { - return &model.OauthAccount{ - Name: ui.Username, - Email: ui.Email, - Avatar: ui.AvatarUrl, - AuthInfos: []model.AuthInfo{ - { - AuthType: ui.AuthType, - AuthId: ui.ID, - Url: ui.Url, - }, - }, - } -} - -type OAuthManager struct { - conf map[string]OAuthConfig -} - -func NewOAuthManager(conf map[string]OAuthConfig) *OAuthManager { - return &OAuthManager{ - conf: conf, - } -} - -func (m *OAuthManager) GetAuthProvider(authType string) (AuthProvider, error) { - var provider AuthProvider - conf, ok := m.conf[authType] - if !ok { - return nil, fmt.Errorf("auth type %s not found in config", authType) - } - switch authType { - case GithubAuthType: - provider = NewGithubAuth(conf.ClientId, conf.ClientSecret) - case WeChatAuthType: - provider = NewWeChatAuth(conf.ClientId, conf.ClientSecret) - default: - return nil, fmt.Errorf("unknown auth type: %s", authType) - } - - return provider, nil -} - -type AuthProvider interface { - GetToken(code string) (*oauth2.Token, error) - GetUserInfo(token *oauth2.Token) (*UserInfo, error) -} diff --git a/kit/oauth/wechat.go b/kit/oauth/wechat.go deleted file mode 100644 index 2fad989..0000000 --- a/kit/oauth/wechat.go +++ /dev/null @@ -1,166 +0,0 @@ -package oauth - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strings" - "time" - - "golang.org/x/oauth2" -) - -type WeChatAuth struct { - Client *http.Client - Config *oauth2.Config -} - -func NewWeChatAuth(clientId string, clientSecret string) *WeChatAuth { - auth := &WeChatAuth{ - Config: &oauth2.Config{ - Scopes: []string{"snsapi_login"}, - Endpoint: oauth2.Endpoint{ - TokenURL: "https://graph.qq.com/oauth2.0/token", - }, - ClientID: clientId, - ClientSecret: clientSecret, - }, - Client: defaultHttpClient, - } - - return auth -} - -type WechatAccessToken struct { - AccessToken string `json:"access_token"` //Interface call credentials - ExpiresIn int64 `json:"expires_in"` //access_token interface call credential timeout time, unit (seconds) - RefreshToken string `json:"refresh_token"` //User refresh access_token - Openid string `json:"openid"` //Unique ID of authorized user - Scope string `json:"scope"` //The scope of user authorization, separated by commas. (,) - Unionid string `json:"unionid"` //This field will appear if and only if the website application has been authorized by the user's UserInfo. -} - -// GetToken use code get access_token (*operation of getting code ought to be done in front) -// get more detail via: https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html -func (auth *WeChatAuth) GetToken(code string) (*oauth2.Token, error) { - params := url.Values{} - params.Add("grant_type", "authorization_code") - params.Add("appid", auth.Config.ClientID) - params.Add("secret", auth.Config.ClientSecret) - params.Add("code", code) - - accessTokenUrl := fmt.Sprintf("https://api.weixin.qq.com/sns/oauth2/access_token?%s", params.Encode()) - tokenResponse, err := auth.Client.Get(accessTokenUrl) - if err != nil { - return nil, err - } - - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { - return - } - }(tokenResponse.Body) - - buf := new(bytes.Buffer) - _, err = buf.ReadFrom(tokenResponse.Body) - if err != nil { - return nil, err - } - - // {"errcode":40163,"errmsg":"code been used, rid: 6206378a-793424c0-2e4091cc"} - if strings.Contains(buf.String(), "errcode") { - return nil, fmt.Errorf(buf.String()) - } - - var wechatAccessToken WechatAccessToken - if err = json.Unmarshal(buf.Bytes(), &wechatAccessToken); err != nil { - return nil, err - } - - token := oauth2.Token{ - AccessToken: wechatAccessToken.AccessToken, - TokenType: "WeChatAccessToken", - RefreshToken: wechatAccessToken.RefreshToken, - Expiry: time.Time{}, - } - - raw := make(map[string]string) - raw["Openid"] = wechatAccessToken.Openid - token.WithExtra(raw) - - return &token, nil -} - -//{ -// "openid": "of_Hl5zVpyj0vwzIlAyIlnXe1234", -// "nickname": "飞翔的企鹅", -// "sex": 1, -// "language": "zh_CN", -// "city": "Shanghai", -// "province": "Shanghai", -// "country": "CN", -// "headimgurl": "https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTK6xc7vGca4KtibJib5dslRianc9VHt9k2N7fewYOl8fak7grRM7nS5V6HcvkkIkGThWUXPjDbXkQFYA\/132", -// "privilege": [], -// "unionid": "oxW9O1VAL8x-zfWP2hrqW9c81234" -//} - -type WechatUserInfo struct { - Openid string `json:"openid"` // The ID of an ordinary user, which is unique to the current developer account - Nickname string `json:"nickname"` // Ordinary user nickname - Sex int `json:"sex"` // Ordinary user gender, 1 is male, 2 is female - Language string `json:"language"` - City string `json:"city"` // City filled in by general user's personal data - Province string `json:"province"` // Province filled in by ordinary user's personal information - Country string `json:"country"` // Country, such as China is CN - Headimgurl string `json:"headimgurl"` // User avatar, the last value represents the size of the square avatar (there are optional values of 0, 46, 64, 96, 132, 0 represents a 640*640 square avatar), this item is empty when the user does not have a avatar - Privilege []string `json:"privilege"` // User Privilege information, json array, such as Wechat Woka user (chinaunicom) - Unionid string `json:"unionid"` // Unified user identification. For an application under a WeChat open platform account, the unionid of the same user is unique. -} - -// GetUserInfo use WechatAccessToken gotten before return WechatUserInfo -// get more detail via: https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Authorized_Interface_Calling_UnionID.html -func (auth *WeChatAuth) GetUserInfo(token *oauth2.Token) (*UserInfo, error) { - var wechatUserInfo WechatUserInfo - accessToken := token.AccessToken - openid := token.Extra("Openid") - - userInfoUrl := fmt.Sprintf("https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s", accessToken, openid) - resp, err := auth.Client.Get(userInfoUrl) - if err != nil { - return nil, err - } - - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { - return - } - }(resp.Body) - - buf := new(bytes.Buffer) - _, err = buf.ReadFrom(resp.Body) - if err != nil { - return nil, err - } - if err = json.Unmarshal(buf.Bytes(), &wechatUserInfo); err != nil { - return nil, err - } - - id := wechatUserInfo.Unionid - if id == "" { - id = wechatUserInfo.Openid - } - - userInfo := UserInfo{ - ID: id, - AuthType: WeChatAuthType, - Username: wechatUserInfo.Nickname, - DisplayName: wechatUserInfo.Nickname, - AvatarUrl: wechatUserInfo.Headimgurl, - } - return &userInfo, nil -} diff --git a/kit/oss/aliyun.go b/kit/oss/aliyun.go deleted file mode 100644 index 33f3956..0000000 --- a/kit/oss/aliyun.go +++ /dev/null @@ -1,88 +0,0 @@ -package oss - -import ( - "github.com/pkg/errors" - "io" - - aliOssSdk "github.com/aliyun/aliyun-oss-go-sdk/oss" -) - -//oss 上传配置 -type AliConfig struct { - AccessKey string `json:"access_key"` - SecretKey string `json:"secret_key"` - Bucket string `json:"bucket"` - Endpoint string `json:"endpoint"` -} - -//oss 根据参数来创建 Bucket -func (c *AliConfig) CreateBucket() (bucket *aliOssSdk.Bucket, err error) { - // Endpoint以杭州为例,其它Region请按实际情况填写。 - endpoint := c.Endpoint - // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 - accessKeyId := c.AccessKey - accessKeySecret := c.SecretKey - bucketName := c.Bucket - // 创建OSSClient实例。 - ossClient, err := aliOssSdk.New(endpoint, accessKeyId, accessKeySecret) - if err != nil { - return nil, errors.Wrapf(err, "创建 aliyun OSSClient实例失败") - } - // 获取存储空间。 - bucket, err = ossClient.Bucket(bucketName) - if err != nil { - return nil, errors.Wrapf(err, "获取 aliyun OSS 存储空间失败") - } - return -} - -//oss 上传客户端 -type aliOss struct { - bucket *aliOssSdk.Bucket -} - -func NewAliOss(c AliConfig) Driver { - bucket, err := c.CreateBucket() - if err != nil { - panic(any(err)) - } - return &aliOss{ - bucket: bucket, - } -} - -// Put 上传 -func (c *aliOss) Put(objectName string, localFileName string) error { - err := c.bucket.PutObjectFromFile(objectName, localFileName) - if err != nil { - return errors.Wrapf(err, "put oss file fail") - } - return nil -} - -func (c *aliOss) PutObj(objectName string, file io.Reader) error { - err := c.bucket.PutObject(objectName, file) - if err != nil { - return errors.Wrapf(err, "put oss file fail") - } - return nil -} - -// Get 下载 -func (c *aliOss) Get(objectName, downloadedFileName string) error { - err := c.bucket.GetObjectToFile(objectName, downloadedFileName) - if err != nil { - return errors.Wrapf(err, "get oss file fail") - } - return nil -} - -// Del 删除 -func (c *aliOss) Del(objectName string) error { - // 删除文件。 - err := c.bucket.DeleteObject(objectName) - if err != nil { - return errors.Wrapf(err, "del oss file fail") - } - return nil -} diff --git a/kit/oss/build.go b/kit/oss/build.go deleted file mode 100644 index 5bb346a..0000000 --- a/kit/oss/build.go +++ /dev/null @@ -1,40 +0,0 @@ -package oss - -import ( - "net/http" - "os" - "path" - "time" - - "github.com/google/uuid" -) - -func BuildName(fileName, fileType string) (string, error) { - t := time.Now().Format("20060102") - newUUID, _ := uuid.NewUUID() - ext := path.Ext(fileName) - return t + "/" + fileType + "/" + newUUID.String() + ext, nil -} - -func GetFileContentType(fileName string) (string, error) { - - out, err := os.Open(fileName) - if err != nil { - return "", err - } - defer out.Close() - - // Only the first 512 bytes are used to sniff the content type. - buffer := make([]byte, 512) - - _, err = out.Read(buffer) - if err != nil { - return "", err - } - - // Use the net/http package's handy DectectContentType function. Always returns a valid - // content-type by returning "application/octet-stream" if no others seemed to match. - contentType := http.DetectContentType(buffer) - - return contentType, nil -} diff --git a/kit/oss/minio.go b/kit/oss/minio.go deleted file mode 100644 index da335dc..0000000 --- a/kit/oss/minio.go +++ /dev/null @@ -1,95 +0,0 @@ -package oss - -import ( - "context" - "github.com/minio/minio-go/v7" - "github.com/minio/minio-go/v7/pkg/credentials" - "github.com/pkg/errors" - "io" - "log" -) - -//oss 上传配置 -type MiniOConfig struct { - Endpoint string - AccessKeyID string - SecretAccessKey string - BucketName string - Location string - UseSSL bool - TargetFilePath string -} - -func (m *MiniOConfig) CreateClient() *minio.Client { - client, err := minio.New(m.Endpoint, &minio.Options{ - Creds: credentials.NewStaticV4(m.AccessKeyID, m.SecretAccessKey, ""), - Secure: m.UseSSL, - }) - if err != nil { - log.Fatalln(err) - } - isExists, err := client.BucketExists(context.Background(), m.BucketName) - if err != nil { - log.Println(err) - return nil - } - - if !isExists { - err = client.MakeBucket(context.Background(), m.BucketName, minio.MakeBucketOptions{Region: m.Location}) - if err != nil { - log.Println(err) - return nil - } - } - return client -} - -type minioOss struct { - client *minio.Client - bucketName string -} - -func NewMiniOss(c MiniOConfig) Driver { - client := c.CreateClient() - return &minioOss{ - client: client, - bucketName: c.BucketName, - } -} - -// contentType 需要上传的文件类型 例如application/zip -func (m *minioOss) Put(objectName, localFileName string) error { - contentType, err := GetFileContentType(localFileName) - if err != nil { - return err - } - _, err = m.client.FPutObject(context.Background(), m.bucketName, objectName, localFileName, minio.PutObjectOptions{ContentType: contentType}) - if err != nil { - return errors.Wrapf(err, "put oss file fail") - } - return nil -} - -func (m *minioOss) PutObj(objectName string, file io.Reader) error { - _, err := m.client.PutObject(context.Background(), m.bucketName, objectName, file, -1, minio.PutObjectOptions{}) - if err != nil { - return errors.Wrapf(err, "put oss file fail") - } - return nil -} - -func (m *minioOss) Get(objectName, downloadedFileName string) error { - err := m.client.FGetObject(context.Background(), m.bucketName, objectName, downloadedFileName, minio.GetObjectOptions{}) - if err != nil { - return errors.Wrapf(err, "get oss file fail") - } - return nil -} - -func (m *minioOss) Del(objectName string) error { - err := m.client.RemoveObject(context.Background(), m.bucketName, objectName, minio.RemoveObjectOptions{GovernanceBypass: true}) - if err != nil { - return errors.Wrapf(err, "qiniu oss del file fail") - } - return nil -} diff --git a/kit/oss/oss.go b/kit/oss/oss.go deleted file mode 100644 index 3ecfcd4..0000000 --- a/kit/oss/oss.go +++ /dev/null @@ -1,16 +0,0 @@ -package oss - -import "io" - -// Driver oss驱动接口定义 -type Driver interface { - - //上传 - Put(objectName, localFileName string) error - - PutObj(objectName string, file io.Reader) error - //下载 - Get(objectName, downloadedFileName string) error - //删除 - Del(objectName string) error -} diff --git a/kit/oss/qiniu.go b/kit/oss/qiniu.go deleted file mode 100644 index 1ea7b3a..0000000 --- a/kit/oss/qiniu.go +++ /dev/null @@ -1,115 +0,0 @@ -package oss - -import ( - "context" - "io" - utilFile "pandax/kit/file" - - "github.com/pkg/errors" - "github.com/qiniu/go-sdk/v7/auth/qbox" - "github.com/qiniu/go-sdk/v7/storage" -) - -type QiniuConfig struct { - AccessKey string - SecretKey string - Bucket string - PolicyExpires uint64 // 上传凭证的有效时间,单位秒 - Zone *storage.Zone // 空间所在的机房 - UseHTTPS bool // 是否使用https域名 - UseCdnDomains bool // 是否使用cdn加速域名 - CentralRsHost string // 中心机房的RsHost,用于list bucket - Domain string // 外链域名 -} - -type qiniuOss struct { - config QiniuConfig -} - -func NewQnOss(config QiniuConfig) Driver { - return &qiniuOss{ - config: config, - } -} - -func (q *qiniuOss) Put(objectName, localFileName string) error { - // 鉴权 - mac := qbox.NewMac(q.config.AccessKey, q.config.SecretKey) - // 上传策略 - putPolicy := storage.PutPolicy{ - Scope: q.config.Bucket, - Expires: q.config.PolicyExpires, - } - // 获取上传token - upToken := putPolicy.UploadToken(mac) - - // 上传Config对象 - cfg := storage.Config{ - Zone: q.config.Zone, //指定上传的区域 - UseHTTPS: q.config.UseHTTPS, // 是否使用https域名 - UseCdnDomains: q.config.UseCdnDomains, //是否使用CDN上传加速 - } - // 构建表单上传的对象 - formUploader := storage.NewFormUploader(&cfg) - ret := storage.PutRet{} - // 上传文件 - err := formUploader.PutFile(context.Background(), &ret, upToken, objectName, localFileName, nil) - if err != nil { - return errors.Wrapf(err, "qiniu oss put file fail") - } - return nil -} - -func (q *qiniuOss) PutObj(objectName string, file io.Reader) error { - // 鉴权 - mac := qbox.NewMac(q.config.AccessKey, q.config.SecretKey) - // 上传策略 - putPolicy := storage.PutPolicy{ - Scope: q.config.Bucket, - Expires: q.config.PolicyExpires, - } - // 获取上传token - upToken := putPolicy.UploadToken(mac) - - // 上传Config对象 - cfg := storage.Config{ - Zone: q.config.Zone, //指定上传的区域 - UseHTTPS: q.config.UseHTTPS, // 是否使用https域名 - UseCdnDomains: q.config.UseCdnDomains, //是否使用CDN上传加速 - } - // 构建表单上传的对象 - formUploader := storage.NewFormUploader(&cfg) - ret := storage.PutRet{} - - // 上传文件 - err := formUploader.Put(context.Background(), &ret, upToken, objectName, file, 0, nil) - if err != nil { - return errors.Wrapf(err, "qiniu oss put file fail") - } - return nil -} - -func (q *qiniuOss) Get(objectName, downloadedFileName string) error { - publicAccessURL := storage.MakePublicURL(q.config.Domain, objectName) - err := utilFile.DownloadFileWithConcurrency(publicAccessURL, downloadedFileName) - if err != nil { - return errors.Wrapf(err, "qiniu oss get file fail") - } - return nil -} - -func (q *qiniuOss) Del(objectName string) error { - mac := qbox.NewMac(q.config.AccessKey, q.config.SecretKey) - cfg := storage.Config{ - Zone: q.config.Zone, //指定上传的区域 - UseHTTPS: q.config.UseHTTPS, // 是否使用https域名 - UseCdnDomains: q.config.UseCdnDomains, //是否使用CDN上传加速 - } - bucketManager := storage.NewBucketManager(mac, &cfg) - - err := bucketManager.Delete(q.config.Bucket, objectName) - if err != nil { - return errors.Wrapf(err, "qiniu oss del file fail") - } - return nil -} diff --git a/kit/rediscli/rediscli.go b/kit/rediscli/rediscli.go deleted file mode 100644 index f3bce49..0000000 --- a/kit/rediscli/rediscli.go +++ /dev/null @@ -1,52 +0,0 @@ -package rediscli - -import ( - "context" - "fmt" - "github.com/go-redis/redis/v8" - "time" -) - -type RedisDB struct { - *redis.Client -} - -func NewRedisClient(host, password string, port, db int) (*RedisDB, error) { - rdb := redis.NewClient(&redis.Options{ - Addr: fmt.Sprintf("%s:%d", host, port), - Password: password, - DB: db, - }) - - if _, err := rdb.Ping(context.Background()).Result(); err != nil { - return nil, err - } - - return &RedisDB{ - Client: rdb, - }, nil -} - -func (rdb *RedisDB) HGet(key, field string, obj interface{}) error { - return rdb.Client.HGet(context.Background(), key, field).Scan(obj) -} - -func (rdb *RedisDB) HSet(key, field string, val interface{}) error { - return rdb.Client.HSet(context.Background(), key, field, val).Err() -} - -func (rdb *RedisDB) HDel(key string, fields ...string) error { - return rdb.Client.HDel(context.Background(), key, fields...).Err() -} - -func (rdb *RedisDB) Get(key string, obj interface{}) error { - return rdb.Client.Get(context.Background(), key).Scan(obj) -} - -func (rdb *RedisDB) GetResult(key string) (string, error) { - return rdb.Client.Get(context.Background(), key).Result() -} - -func (rdb *RedisDB) Set(key string, val interface{}, expir time.Duration) error { - return rdb.Client.Set(context.Background(), key, val, expir).Err() -} diff --git a/kit/restfulx/log_handler.go b/kit/restfulx/log_handler.go deleted file mode 100644 index fc39caf..0000000 --- a/kit/restfulx/log_handler.go +++ /dev/null @@ -1,15 +0,0 @@ -package restfulx - -type LogInfo struct { - LogResp bool // 是否记录返回结果 - Description string // 请求描述 -} - -func NewLogInfo(description string) *LogInfo { - return &LogInfo{Description: description, LogResp: false} -} - -func (i *LogInfo) WithLogResp(logResp bool) *LogInfo { - i.LogResp = logResp - return i -} diff --git a/kit/restfulx/permission_handler.go b/kit/restfulx/permission_handler.go deleted file mode 100644 index 65db4bf..0000000 --- a/kit/restfulx/permission_handler.go +++ /dev/null @@ -1,16 +0,0 @@ -package restfulx - -type Permission struct { - NeedToken bool // 是否需要token - NeedCasbin bool // 是否进行权限 api路径权限验证 -} - -func (p *Permission) WithNeedToken(needToken bool) *Permission { - p.NeedToken = needToken - return p -} - -func (p *Permission) WithNeedCasBin(needCasBin bool) *Permission { - p.NeedCasbin = needCasBin - return p -} diff --git a/kit/restfulx/req_ctx.go b/kit/restfulx/req_ctx.go deleted file mode 100644 index 8592668..0000000 --- a/kit/restfulx/req_ctx.go +++ /dev/null @@ -1,135 +0,0 @@ -package restfulx - -import ( - "pandax/kit/biz" - "pandax/kit/token" - "time" - - "github.com/emicklei/go-restful/v3" - "github.com/go-playground/validator/v10" -) - -// 处理函数 -type HandlerFunc func(*ReqCtx) - -type ReqCtx struct { - Request *restful.Request - Response *restful.Response - // NeedToken bool // 是否需要token - RequiredPermission *Permission // 需要的权限信息,默认为nil,需要校验token - LoginAccount *token.Claims // 登录账号信息,只有校验token后才会有值 - - LogInfo *LogInfo // 日志相关信息 - ReqParam any // 请求参数,主要用于记录日志 - ResData any // 响应结果 - Err any // 请求错误 - Validate *validator.Validate - Timed int64 // 执行时间 - NoRes bool // 无需返回结果,即文件下载等 -} - -func (rc *ReqCtx) Handle(handler HandlerFunc) { - request := rc.Response - defer func() { - var err any - err = recover() - if err != nil { - rc.Err = err - ErrorRes(request, err) - } - // 应用所有请求后置处理器 - ApplyHandlerInterceptor(afterHandlers, rc) - }() - biz.IsTrue(rc.Request != nil, "Request == nil") - - // 默认为不记录请求参数,可在handler回调函数中覆盖赋值 - rc.ReqParam = 0 - // 默认响应结果为nil,可在handler中赋值 - rc.ResData = nil - - // 调用请求前所有处理器 - err := ApplyHandlerInterceptor(beforeHandlers, rc) - if err != nil { - panic(err) - } - - begin := time.Now() - handler(rc) - rc.Timed = time.Now().Sub(begin).Milliseconds() - if !rc.NoRes { - SuccessRes(rc.Response, rc.ResData) - } -} - -func (rc *ReqCtx) Download(filename string) { - rc.NoRes = true - Download(rc, filename) -} - -func NewReqCtx(request *restful.Request, response *restful.Response) *ReqCtx { - return &ReqCtx{ - Request: request, - Response: response, - LogInfo: NewLogInfo("默认日志信息"), - Validate: validator.New(), - RequiredPermission: &Permission{NeedToken: true, NeedCasbin: true}, - } -} - -// 调用该方法设置请求描述,则默认记录日志,并不记录响应结果 -func (r *ReqCtx) WithLog(model string) *ReqCtx { - r.LogInfo.Description = model - return r -} - -func (r *ReqCtx) NoAppend() *ReqCtx { - r.NoRes = true - return r -} - -// 设置请求上下文需要的权限信息 -func (r *ReqCtx) WithRequiredPermission(permission *Permission) *ReqCtx { - r.RequiredPermission = permission - return r -} - -// 是否需要token -func (r *ReqCtx) WithNeedToken(needToken bool) *ReqCtx { - r.RequiredPermission.NeedToken = needToken - return r -} - -// 是否需要Casbin -func (r *ReqCtx) WithNeedCasbin(needCasbin bool) *ReqCtx { - r.RequiredPermission.NeedCasbin = needCasbin - return r -} - -// 处理器拦截器函数 -type HandlerInterceptorFunc func(*ReqCtx) error -type HandlerInterceptors []HandlerInterceptorFunc - -var ( - beforeHandlers HandlerInterceptors - afterHandlers HandlerInterceptors -) - -// 使用前置处理器函数 -func UseBeforeHandlerInterceptor(b HandlerInterceptorFunc) { - beforeHandlers = append(beforeHandlers, b) -} - -// 使用后置处理器函数 -func UseAfterHandlerInterceptor(b HandlerInterceptorFunc) { - afterHandlers = append(afterHandlers, b) -} - -// 应用指定处理器拦截器,如果有一个错误则直接返回错误 -func ApplyHandlerInterceptor(his HandlerInterceptors, rc *ReqCtx) any { - for _, handler := range his { - if err := handler(rc); err != nil { - return err - } - } - return nil -} diff --git a/kit/restfulx/restfulx.go b/kit/restfulx/restfulx.go deleted file mode 100644 index 91303c7..0000000 --- a/kit/restfulx/restfulx.go +++ /dev/null @@ -1,116 +0,0 @@ -package restfulx - -import ( - "encoding/json" - "net/http" - "pandax/kit/biz" - "pandax/kit/logger" - "pandax/kit/model" - "strconv" - - "github.com/emicklei/go-restful/v3" - "github.com/gorilla/schema" -) - -// 绑定并校验请求结构体参数 结构体添加 例如: validate:"required" validate:"required,gt=10" -func BindJsonAndValid(rc *ReqCtx, data any) { - if err := rc.Request.ReadEntity(data); err != nil { - panic(any(biz.NewBizErr(err.Error()))) - } - if err := rc.Validate.Struct(data); err != nil { - panic(any(biz.NewBizErr("传参格式错误:" + err.Error()))) - } -} - -// BindQuery 绑定查询字符串到 -func BindQuery(rc *ReqCtx, data any) { - if err := rc.Request.ReadEntity(data); err != nil { - panic(any(biz.NewBizErr(err.Error()))) - } -} - -// PathParamsToAny 获取虽有路径中的参数 -func PathParamsToAny(rc *ReqCtx, in any) { - vars := make(map[string]any) - for k, v := range rc.Request.PathParameters() { - vars[k] = v - } - marshal, _ := json.Marshal(vars) - err := json.Unmarshal(marshal, in) - biz.ErrIsNil(err, "error get path value encoding unmarshal") - return -} - -// QueryParamsToAny 获取所有Query的参数 -func QueryParamsToAny(rc *ReqCtx, in any) { - err := rc.Request.Request.ParseForm() - biz.ErrIsNil(err, "error get ParseForm value encoding unmarshal") - decoder := schema.NewDecoder() - err = decoder.Decode(in, rc.Request.Request.Form) - biz.ErrIsNil(err, "error get path value encoding unmarshal") - return -} - -// GetPageQueryParam 获取分页参数 -func GetPageQueryParam(rc *ReqCtx) *model.PageParam { - return &model.PageParam{PageNum: QueryInt(rc, "pageNum", 1), PageSize: QueryInt(rc, "pageSize", 10)} -} - -// QueryInt 获取查询参数中指定参数值,并转为int -func QueryInt(rc *ReqCtx, qm string, defaultInt int) int { - qv := rc.Request.QueryParameter(qm) - if qv == "" { - return defaultInt - } - qvi, err := strconv.Atoi(qv) - biz.ErrIsNil(err, "query param not int") - return qvi -} - -// QueryParam QueryParam -func QueryParam(rc *ReqCtx, key string) string { - return rc.Request.QueryParameter(key) -} - -// PathParamInt 获取路径参数 -func PathParamInt(rc *ReqCtx, pm string) int { - value, _ := strconv.Atoi(rc.Request.PathParameter(pm)) - return value -} -func PathParam(rc *ReqCtx, pm string) string { - return rc.Request.PathParameter(pm) -} - -// 文件下载 -func Download(rc *ReqCtx, filename string) { - rc.Response.Header().Add("success", "true") - rc.Response.Header().Set("Content-Length", "-1") - rc.Response.Header().Set("Content-Disposition", "attachment; filename="+filename) - http.ServeFile( - rc.Response.ResponseWriter, - rc.Request.Request, filename) -} - -// 返回统一成功结果 -func SuccessRes(response *restful.Response, data any) { - response.WriteEntity(model.Success(data)) -} - -// 返回失败结果集 -func ErrorRes(response *restful.Response, err any) { - switch t := err.(type) { - case *biz.BizError: - response.WriteEntity(model.Error(t)) - break - case error: - response.WriteEntity(model.ServerError()) - logger.Log.Error(t) - break - case string: - response.WriteEntity(model.ServerError()) - logger.Log.Error(t) - break - default: - logger.Log.Error(t) - } -} diff --git a/kit/sms/aliyun.go b/kit/sms/aliyun.go deleted file mode 100644 index ce1d84f..0000000 --- a/kit/sms/aliyun.go +++ /dev/null @@ -1,44 +0,0 @@ -package sms - -import ( - "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi" - "github.com/pkg/errors" -) - -type AliConfig struct { - accessKeyId string - accessSecret string - RegionId string -} - -type AliSms struct { - config AliConfig -} - -func NewAliSms(AliConfig AliConfig) *AliSms { - return &AliSms{ - config: AliConfig, - } -} - -func (a *AliSms) Send(PhoneNumbers, SignName, TemplateCode, TemplateParam string) error { - //客户端 - client, err := dysmsapi.NewClientWithAccessKey(a.config.RegionId, a.config.accessKeyId, a.config.accessSecret) - if err != nil { - return errors.Wrapf(err, "ali sms client init fail") - } - //参数处理 - request := dysmsapi.CreateSendSmsRequest() - request.Scheme = "https" - request.PhoneNumbers = PhoneNumbers - request.SignName = SignName - request.TemplateCode = TemplateCode - //json格式 - request.TemplateParam = TemplateParam - //发送 - _, err = client.SendSms(request) - if err != nil { - return errors.Wrapf(err, "ali sms send fail") - } - return nil -} diff --git a/kit/sms/sms.go b/kit/sms/sms.go deleted file mode 100644 index 06d9ef8..0000000 --- a/kit/sms/sms.go +++ /dev/null @@ -1,14 +0,0 @@ -package sms - -type Sms interface { - Send(PhoneNumbers, SignName, TemplateCode, TemplateParam string) error -} - -func NewDefaultSms(use string) Sms { - switch use { - case "AliYun": - return NewAliSms(AliConfig{}) - default: - panic(any("sms driver err")) - } -} diff --git a/kit/starter/gorm.go b/kit/starter/gorm.go deleted file mode 100644 index 145db62..0000000 --- a/kit/starter/gorm.go +++ /dev/null @@ -1,80 +0,0 @@ -package starter - -import ( - "database/sql" - "pandax/kit/logger" - "time" - - "gorm.io/driver/mysql" - "gorm.io/driver/postgres" - "gorm.io/gorm" - - gormlog "gorm.io/gorm/logger" - - _ "github.com/lib/pq" -) - -var Db *gorm.DB - -type DbGorm struct { - Type string - Dsn string - MaxIdleConns int - MaxOpenConns int -} - -func (dg *DbGorm) GormInit() *gorm.DB { - switch dg.Type { - case "mysql": - Db = dg.GormMysql() - case "postgresql": - Db = dg.GormPostgresql() - } - return Db -} -func (dg *DbGorm) GormMysql() *gorm.DB { - - logger.Log.Infof("连接mysql [%s]", dg.Dsn) - mysqlConfig := mysql.Config{ - DSN: dg.Dsn, // DSN data source name - DefaultStringSize: 191, // string 类型字段的默认长度 - DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持 - DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引 - DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列 - SkipInitializeWithVersion: false, // 根据版本自动配置 - } - ormConfig := &gorm.Config{Logger: gormlog.Default.LogMode(gormlog.Silent)} - db, err := gorm.Open(mysql.New(mysqlConfig), ormConfig) - if err != nil { - logger.Log.Panicf("连接mysql失败! [%s]", err.Error()) - return nil - } - sqlDB, _ := db.DB() - sqlDB.SetMaxIdleConns(dg.MaxIdleConns) - sqlDB.SetMaxOpenConns(dg.MaxOpenConns) - return db -} - -func (dg *DbGorm) GormPostgresql() *gorm.DB { - - db, err := sql.Open("postgres", dg.Dsn) - if err != nil { - logger.Log.Panicf("连接postgresql失败! [%s]", err.Error()) - } - ormConfig := &gorm.Config{} - gormDb, err := gorm.Open(postgres.New(postgres.Config{ - Conn: db, - }), ormConfig) - if err != nil { - logger.Log.Panicf("连接postgresql失败! [%s]", err.Error()) - } - sqlDB, err := gormDb.DB() - // SetMaxIdleConns 设置空闲连接池中连接的最大数量 - sqlDB.SetMaxIdleConns(dg.MaxIdleConns) - // SetMaxOpenConns 设置打开数据库连接的最大数量。 - sqlDB.SetMaxOpenConns(dg.MaxOpenConns) - // SetConnMaxLifetime 设置了连接可复用的最大时间。 - sqlDB.SetConnMaxLifetime(time.Hour) - - return gormDb -} diff --git a/kit/starter/tdengine.go b/kit/starter/tdengine.go deleted file mode 100644 index 5310097..0000000 --- a/kit/starter/tdengine.go +++ /dev/null @@ -1,27 +0,0 @@ -package starter - -import ( - "database/sql" - "fmt" -) - -type TaosDB struct { - Username string - Password string - Host string - Port int - Dbname string - Config string //配置 - Db *sql.DB -} - -func (d *TaosDB) InitTdDB() error { - dsn := fmt.Sprintf("%s:%s@%s(%s:%d)/%s", - d.Username, d.Password, "http", d.Host, d.Port, d.Dbname) - if d.Config != "" { - dsn = fmt.Sprintf("%s&%s", dsn, d.Config) - } - var err error - d.Db, err = sql.Open("taosRestful", dsn) - return err -} diff --git a/kit/token/token.go b/kit/token/token.go deleted file mode 100644 index c687c7e..0000000 --- a/kit/token/token.go +++ /dev/null @@ -1,151 +0,0 @@ -package token - -import ( - "errors" - "fmt" - "strings" - "time" - - "github.com/dgrijalva/jwt-go" -) - -type Claims struct { - UserId int64 - TenantId int64 - OrganizationId int64 //组织Id - UserName string - RoleId int64 - RoleKey string - DeptId int64 - PostId int64 - jwt.StandardClaims -} - -type JWT struct { - SignedKeyID string - SignedKey []byte - SignedMethod jwt.SigningMethod -} - -var ( - TokenExpired = errors.New("token is expired") - TokenNotValidYet = errors.New("token not active yet") - TokenMalformed = errors.New("that's not even a token") - TokenInvalid = errors.New("couldn't handle this token") - UnsupportedSignMethod = errors.New("unsupported sign method") -) - -func NewJWT(kid string, key []byte, method jwt.SigningMethod) *JWT { - return &JWT{ - SignedKeyID: kid, - SignedKey: key, - SignedMethod: method, - } -} - -// CreateToken 创建一个token -func (j *JWT) CreateToken(claims Claims) (string, error) { - token := jwt.NewWithClaims(jwt.SigningMethodHS256, &claims) - key, err := j.getKey() - if err != nil { - return "", err - } - return token.SignedString(key) -} - -// ParseToken 解析 token -func (j *JWT) ParseToken(tokenString string) (*Claims, error) { - token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (i interface{}, e error) { - if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { - return nil, fmt.Errorf("parse error") - } - key, err := j.getKey() - if err != nil { - return nil, err - } - return key, nil - }) - if err != nil { - if ve, ok := err.(*jwt.ValidationError); ok { - if ve.Errors&jwt.ValidationErrorMalformed != 0 { - return nil, TokenMalformed - } else if ve.Errors&jwt.ValidationErrorExpired != 0 { - // Token is expired - return nil, TokenExpired - } else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 { - return nil, TokenNotValidYet - } else { - return nil, TokenInvalid - } - } - } - if token != nil { - if claims, ok := token.Claims.(*Claims); ok && token.Valid { - return claims, nil - } - return nil, TokenInvalid - - } else { - return nil, TokenInvalid - - } - -} - -// 更新token -func (j *JWT) RefreshToken(tokenString string) (string, error) { - jwt.TimeFunc = func() time.Time { - return time.Unix(0, 0) - } - token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) { - key, err := j.getKey() - if err != nil { - return nil, err - } - return key, nil - }) - if err != nil { - return "", err - } - - if claims, ok := token.Claims.(*Claims); ok && token.Valid { - jwt.TimeFunc = time.Now - claims.StandardClaims.ExpiresAt = time.Now().Unix() + 60*60*24*7 - return j.CreateToken(*claims) - } - return "", TokenInvalid -} - -func (j *JWT) getKey() (interface{}, error) { - if j.isEs() { - v, err := jwt.ParseECPrivateKeyFromPEM(j.SignedKey) - if err != nil { - return nil, err - } - return v, nil - } else if j.isRsOrPS() { - v, err := jwt.ParseRSAPrivateKeyFromPEM(j.SignedKey) - if err != nil { - return nil, err - } - return v, nil - } else if j.isHs() { - return j.SignedKey, nil - } else { - return nil, UnsupportedSignMethod - } -} - -func (a *JWT) isEs() bool { - return strings.HasPrefix(a.SignedMethod.Alg(), "ES") -} - -func (a *JWT) isRsOrPS() bool { - isRs := strings.HasPrefix(a.SignedMethod.Alg(), "RS") - isPs := strings.HasPrefix(a.SignedMethod.Alg(), "PS") - return isRs || isPs -} - -func (a *JWT) isHs() bool { - return strings.HasPrefix(a.SignedMethod.Alg(), "HS") -} diff --git a/kit/utils/charset.go b/kit/utils/charset.go deleted file mode 100644 index c878a4e..0000000 --- a/kit/utils/charset.go +++ /dev/null @@ -1,79 +0,0 @@ -package utils - -import ( - "bytes" - "errors" - "fmt" - "io" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/ianaindex" - "golang.org/x/text/transform" -) - -var ( - // Alias for charsets. - charsetAlias = map[string]string{ - "HZGB2312": "HZ-GB-2312", - "hzgb2312": "HZ-GB-2312", - "GB2312": "HZ-GB-2312", - "gb2312": "HZ-GB-2312", - } -) - -func Convert(dstCharset string, srcCharset string, src string) (dst string, err error) { - if dstCharset == srcCharset { - return src, nil - } - dst = src - // Converting `src` to UTF-8. - e, err := getEncoding(srcCharset) - if err != nil { - return "", err - } - if srcCharset != "UTF-8" { - if e != nil { - tmp, err := io.ReadAll( - transform.NewReader(bytes.NewReader([]byte(src)), e.NewDecoder()), - ) - if err != nil { - return "", errors.New(fmt.Sprintf(`convert string "%s" to utf8 failed`, srcCharset)) - } - src = string(tmp) - } else { - return dst, errors.New(fmt.Sprintf(`unsupported srcCharset "%s"`, srcCharset)) - } - } - // Do the converting from UTF-8 to `dstCharset`. - if dstCharset != "UTF-8" { - if e != nil { - tmp, err := io.ReadAll( - transform.NewReader(bytes.NewReader([]byte(src)), e.NewEncoder()), - ) - if err != nil { - return "", errors.New(fmt.Sprintf(`convert string from utf8 to "%s" failed`, srcCharset)) - } - dst = string(tmp) - } else { - return dst, errors.New(fmt.Sprintf(`unsupported dstCharset "%s"`, srcCharset)) - } - } else { - dst = src - } - return dst, nil -} - -func ToUTF8(srcCharset string, src string) (dst string, err error) { - return Convert("UTF-8", srcCharset, src) -} - -func UTF8To(dstCharset string, src string) (dst string, err error) { - return Convert(dstCharset, "UTF-8", src) -} - -func getEncoding(charset string) (encoding.Encoding, error) { - if c, ok := charsetAlias[charset]; ok { - charset = c - } - return ianaindex.MIB.Encoding(charset) -} diff --git a/kit/utils/ddm.go b/kit/utils/ddm.go deleted file mode 100644 index cd109c8..0000000 --- a/kit/utils/ddm.go +++ /dev/null @@ -1,34 +0,0 @@ -package utils - -/** - * @Description 添加qq群467890197 交流学习 - * @Author 熊猫 - * @Date 2022/1/13 17:16 - **/ - -func DdmKey(data string) string { - if len(data) < 6 { - return data - } - return data[:3] + "****" + data[len(data)-3:] -} - -func IsDdmKey(data string) bool { - return len(data) > 6 && data[3:len(data)-3] == "****" -} - -func DdmMail(data string) string { - return data[:3] + "****" + data[len(data)-8:] -} - -func ISDdmMail(data string) bool { - return len(data) > 11 && data[3:len(data)-8] == "****" -} - -func DdmPassword(data string) string { - return "******" -} - -func IsDdmPassword(data string) bool { - return data == "******" -} diff --git a/kit/utils/ddm_test.go b/kit/utils/ddm_test.go deleted file mode 100644 index 3f1cd99..0000000 --- a/kit/utils/ddm_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package utils - -import ( - "testing" -) - -/** - * @Description 添加qq群467890197 交流学习 - * @Author 熊猫 - * @Date 2022/1/17 10:01 - **/ - -func TestDdmKey(t *testing.T) { - aa := "fsdfsf535343sdfsdf3" - bb := "23423423@qq.com" - - key := DdmKey(aa) - t.Log(key) - ddmKey := IsDdmKey(key) - t.Log(ddmKey) - - mail := DdmMail(bb) - t.Log(mail) - ismail := ISDdmMail(mail) - t.Log(ismail) -} diff --git a/kit/utils/excel.go b/kit/utils/excel.go deleted file mode 100644 index 44e0f47..0000000 --- a/kit/utils/excel.go +++ /dev/null @@ -1,53 +0,0 @@ -package utils - -import ( - "fmt" - "github.com/xuri/excelize/v2" - "path/filepath" - "reflect" -) - -func ExportExcel(head []string, datas [][]any, filePath string) error { - excel := excelize.NewFile() - excel.SetSheetRow("Sheet1", "A1", &head) - for i, data := range datas { - axis := fmt.Sprintf("A%d", i+2) - excel.SetSheetRow("Sheet1", axis, &data) - } - excel.SaveAs(filePath) - return nil -} - -func GetFileName(path, filename string) string { - fn := filepath.Base(filename) - ext := filepath.Ext(fn) - if ext == "" { - fn += ".xlsx" - } - - return path + fn -} - -func InterfaceToExcel(data any, fileName string) { - heads := make([]string, 0) - datas := make([][]any, 0) - v := reflect.ValueOf(data) - max := int64(v.Len()) - for i := 0; i < int(max); i++ { - u := v.Index(i).Interface() - var key = reflect.TypeOf(u) - var val = reflect.ValueOf(u) - num := key.NumField() - if i == 0 { - for i := 0; i < num; i++ { - heads = append(heads, key.Field(i).Name) - } - } - field := make([]any, 0) - for i := 0; i < num; i++ { - field = append(field, val.Field(i).Interface()) - } - datas = append(datas, field) - } - ExportExcel(heads, datas, fileName) -} diff --git a/kit/utils/excel_test.go b/kit/utils/excel_test.go deleted file mode 100644 index a0d74ab..0000000 --- a/kit/utils/excel_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package utils - -import ( - "testing" -) - -type User struct { - Name string `json:"name"` - Age int64 `json:"age"` -} - -func TestExportExcel(t *testing.T) { - us := make([]User, 0) - us = append(us, User{Name: "张三", Age: 12}) - us = append(us, User{Name: "李四", Age: 23}) - name := GetFileName("./", "字典.xlsx") - t.Log(name) - InterfaceToExcel(us, name) -} diff --git a/kit/utils/float_to_f.go b/kit/utils/float_to_f.go deleted file mode 100644 index 3a8b911..0000000 --- a/kit/utils/float_to_f.go +++ /dev/null @@ -1,26 +0,0 @@ -package utils - -import ( - "fmt" - "strconv" -) - -func ParseFloat2F(value float64) float64 { - newValue, err := strconv.ParseFloat(fmt.Sprintf("%.2f", value), 64) - if err != nil { - fmt.Println("保留2位小数, 转换float出错") - return value - } - return newValue - -} - -func ParseStringToInt64(value string) int64 { - - newValue, err := strconv.ParseInt(value, 10, 64) - if err != nil { - fmt.Println("string转换int64出错") - return 0 - } - return newValue -} diff --git a/kit/utils/ip.go b/kit/utils/ip.go deleted file mode 100644 index a27a7e2..0000000 --- a/kit/utils/ip.go +++ /dev/null @@ -1,57 +0,0 @@ -package utils - -import ( - "fmt" - "net" - "pandax/kit/httpclient" -) - -const UNKNOWN = "XX XX" - -// GetRealAddressByIP 获取真实地址 -func GetRealAddressByIP(ip string) string { - if ip == "127.0.0.1" || ip == "localhost" { - return "内部IP" - } - url := fmt.Sprintf("http://whois.pconline.com.cn/ipJson.jsp?json=true&ip=%s", ip) - - res := httpclient.NewRequest(url).Get() - if res == nil || res.StatusCode != 200 { - return UNKNOWN - } - dst, _ := ToUTF8("GBK", string(res.Body)) - toMap := Json2Map(dst) - pro := "" - city := "" - if tPro, ok := toMap["pro"].(string); ok { - pro = tPro - } - if tCity, ok := toMap["city"].(string); ok { - city = tCity - } - return fmt.Sprintf("%s %s", pro, city) -} - -// 获取局域网ip地址 -func GetLocaHonst() string { - netInterfaces, err := net.Interfaces() - if err != nil { - fmt.Println("net.Interfaces failed, err:", err.Error()) - } - - for i := 0; i < len(netInterfaces); i++ { - if (netInterfaces[i].Flags & net.FlagUp) != 0 { - addrs, _ := netInterfaces[i].Addrs() - - for _, address := range addrs { - if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { - if ipnet.IP.To4() != nil { - return ipnet.IP.String() - } - } - } - } - - } - return "" -} diff --git a/kit/utils/json_utils.go b/kit/utils/json_utils.go deleted file mode 100644 index 10822f5..0000000 --- a/kit/utils/json_utils.go +++ /dev/null @@ -1,14 +0,0 @@ -package utils - -import ( - "encoding/json" -) - -func Json2Map(jsonStr string) map[string]any { - var res map[string]any - if jsonStr == "" { - return res - } - _ = json.Unmarshal([]byte(jsonStr), &res) - return res -} diff --git a/kit/utils/regexp.go b/kit/utils/regexp.go deleted file mode 100644 index 78b0d7b..0000000 --- a/kit/utils/regexp.go +++ /dev/null @@ -1,42 +0,0 @@ -package utils - -import ( - "regexp" - "sync" -) - -var ( - regexMu = sync.RWMutex{} - // Cache for regex object. - // Note that: - // 1. It uses sync.RWMutex ensuring the concurrent safety. - // 2. There's no expiring logic for this map. - regexMap = make(map[string]*regexp.Regexp) -) - -// getRegexp returns *regexp.Regexp object with given `pattern`. -// It uses cache to enhance the performance for compiling regular expression pattern, -// which means, it will return the same *regexp.Regexp object with the same regular -// expression pattern. -// -// It is concurrent-safe for multiple goroutines. -func GetRegexp(pattern string) (regex *regexp.Regexp, err error) { - // Retrieve the regular expression object using reading lock. - regexMu.RLock() - regex = regexMap[pattern] - regexMu.RUnlock() - if regex != nil { - return - } - // If it does not exist in the cache, - // it compiles the pattern and creates one. - regex, err = regexp.Compile(pattern) - if err != nil { - return - } - // Cache the result object using writing lock. - regexMu.Lock() - regexMap[pattern] = regex - regexMu.Unlock() - return -} diff --git a/kit/utils/str_utils.go b/kit/utils/str_utils.go deleted file mode 100644 index 1a5e849..0000000 --- a/kit/utils/str_utils.go +++ /dev/null @@ -1,201 +0,0 @@ -package utils - -import ( - "bytes" - "encoding/base64" - "github.com/kakuilan/kgo" - "math/rand" - "strings" - "text/template" - "time" -) - -func UnicodeIndex(str, substr string) int { - // 子串在字符串的字节位置 - result := strings.Index(str, substr) - if result >= 0 { - // 获得子串之前的字符串并转换成[]byte - prefix := []byte(str)[0:result] - // 将子串之前的字符串转换成[]rune - rs := []rune(string(prefix)) - // 获得子串之前的字符串的长度,便是子串在字符串的字符位置 - result = len(rs) - } - - return result -} - -func ReplaceString(pattern, replace, src string) (string, error) { - if r, err := GetRegexp(pattern); err == nil { - return r.ReplaceAllString(src, replace), nil - } else { - return "", err - } -} - -func Contains(haystack, needle string, startOffset ...int) int { - length := len(haystack) - offset := 0 - if len(startOffset) > 0 { - offset = startOffset[0] - } - if length == 0 || offset > length || -offset > length { - return -1 - } - - if offset < 0 { - offset += length - } - pos := strings.Index(strings.ToLower(haystack[offset:]), strings.ToLower(needle)) - if pos == -1 { - return -1 - } - return pos + offset -} - -// 字符串模板解析 -func TemplateResolve(temp string, data any) string { - t, _ := template.New("string-temp").Parse(temp) - var tmplBytes bytes.Buffer - - err := t.Execute(&tmplBytes, data) - if err != nil { - panic(err) - } - return tmplBytes.String() -} - -func ReverStrTemplate(temp, str string, res map[string]any) { - index := UnicodeIndex(temp, "{") - ei := UnicodeIndex(temp, "}") + 1 - next := kgo.KStr.Trim(temp[ei:], " ") - nextContain := UnicodeIndex(next, "{") - nextIndexValue := next - if nextContain != -1 { - nextIndexValue = kgo.KStr.Substr(next, 0, nextContain) - } - key := temp[index+1 : ei-1] - // 如果后面没有内容了,则取字符串的长度即可 - var valueLastIndex int - if nextIndexValue == "" { - valueLastIndex = kgo.KStr.MbStrlen(str) - } else { - valueLastIndex = UnicodeIndex(str, nextIndexValue) - } - value := kgo.KStr.Trim(kgo.KStr.Substr(str, index, valueLastIndex), " ") - res[key] = value - // 如果后面的还有需要解析的,则递归调用解析 - if nextContain != -1 { - ReverStrTemplate(next, kgo.KStr.Trim(kgo.KStr.Substr(str, UnicodeIndex(str, value)+kgo.KStr.MbStrlen(value), kgo.KStr.MbStrlen(str))), res) - } -} - -func B2S(bs []uint8) string { - ba := []byte{} - for _, b := range bs { - ba = append(ba, byte(b)) - } - return string(ba) -} - -func IdsStrToIdsIntGroup(keys string) []int64 { - IDS := make([]int64, 0) - ids := strings.Split(keys, ",") - for i := 0; i < len(ids); i++ { - ID := kgo.KConv.Str2Int(ids[i]) - IDS = append(IDS, int64(ID)) - } - return IDS -} - -// 获取部门 -// isP 是父ID 否则子ID -func DeptPCIds(deptIds []string, id int64, isP bool) []int64 { - pRes := make([]int64, 0) - cRes := make([]int64, 0) - is := true - for _, deptId := range deptIds { - did := kgo.KConv.Str2Int64(deptId) - if is { - pRes = append(pRes, did) - } - if kgo.KConv.Str2Int64(deptId) == id { - is = false - } - if !is { - cRes = append(cRes, did) - } - } - if isP { - return pRes - } else { - return cRes - } -} - -// 获取组织 -// isP 是父ID 否则子ID -func OrganizationPCIds(orgIds []string, id int64, isP bool) []int64 { - pRes := make([]int64, 0) - cRes := make([]int64, 0) - is := true - for _, orgId := range orgIds { - did := kgo.KConv.Str2Int64(orgId) - if is { - pRes = append(pRes, did) - } - if kgo.KConv.Str2Int64(orgId) == id { - is = false - } - if !is { - cRes = append(cRes, did) - } - } - if isP { - return pRes - } else { - return cRes - } -} - -func GenerateID() string { - rand.Seed(time.Now().UnixNano()) - id := make([]byte, 7) // 由于base64编码会增加字符数,这里使用7个字节生成10位ID - _, err := rand.Read(id) - if err != nil { - panic(err) // 错误处理,根据实际情况进行处理 - } - return base64.URLEncoding.EncodeToString(id)[:10] -} - -const ( - letterBytes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" -) - -func RandString(n int) string { - rand.Seed(time.Now().UnixNano()) - output := make([]byte, n) - // We will take n bytes, one byte for each character of output. - randomness := make([]byte, n) - // read all random - _, err := rand.Read(randomness) - if err != nil { - panic(err) - } - l := len(letterBytes) - // fill output - for pos := range output { - // get random item - random := randomness[pos] - // random % 64 - randomPos := random % uint8(l) - // put into output - output[pos] = letterBytes[randomPos] - } - - return string(output) -} - -func GenerateTdID(px string) string { - return px + RandString(9) -} diff --git a/kit/utils/str_utils_test.go b/kit/utils/str_utils_test.go deleted file mode 100644 index be9751e..0000000 --- a/kit/utils/str_utils_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package utils - -import ( - "log" - "strings" - "testing" -) - -func TestIdsStrToIdsIntGroup(t *testing.T) { - group := IdsStrToIdsIntGroup("aaa") - t.Log(len(group)) -} - -func TestGetRealAddressByIP(t *testing.T) { - ip := GetRealAddressByIP("58.57.107.34") - t.Log(ip) -} - -func TestDeptPCIds(t *testing.T) { - split := strings.Split(strings.Trim("/0/2", "/"), "/") - log.Println("split", split) - ids := DeptPCIds(split, 2, true) - t.Log(ids) -} diff --git a/kit/utils/struct_utils_test.go b/kit/utils/struct_utils_test.go deleted file mode 100644 index 21e84df..0000000 --- a/kit/utils/struct_utils_test.go +++ /dev/null @@ -1,194 +0,0 @@ -package utils - -import ( - "fmt" - "reflect" - "strings" - "testing" - "time" -) - -type Src struct { - Id *int64 `json:"id"` - Username string `json:"username"` - CreateTime time.Time `json:"time"` - UpdateTime time.Time - Inner *SrcInner -} - -type SrcInner struct { - Name string - Desc string - Id int64 - Dest *Dest -} - -type Dest struct { - Username string - Id int64 - CreateTime time.Time - Inner *DestInner -} - -type DestInner struct { - Desc string -} - -func TestDeepFields(t *testing.T) { - ////src := Src{Username: "test", Id: 1000, CreateTime: time.Now()} - //si := SrcInner{Desc: "desc"} - //src.Inner = &si - ////src.Id = 1222 - //dest := new(Dest) - //err := structutils.Copy(dest, src) - //if err != nil { - // fmt.Println(err.Error()) - //} else { - // fmt.Println(dest) - //} - -} - -func TestGetFieldNames(t *testing.T) { - //names := structutils.GetFieldNames(new(Src)) - //fmt.Println(names) -} - -func TestMaps2Structs(t *testing.T) { - mapInstance := make(map[string]any) - mapInstance["Username"] = "liang637210" - mapInstance["Id"] = 28 - mapInstance["CreateTime"] = time.Now() - mapInstance["Creator"] = "createor" - mapInstance["Inner.Id"] = 10 - mapInstance["Inner.Name"] = "hahah" - mapInstance["Inner.Desc"] = "inner desc" - mapInstance["Inner.Dest.Username"] = "inner dest uername" - mapInstance["Inner.Dest.Inner.Desc"] = "inner dest inner desc" - - mapInstance2 := make(map[string]any) - mapInstance2["Username"] = "liang6372102" - mapInstance2["Id"] = 282 - mapInstance2["CreateTime"] = time.Now() - mapInstance2["Creator"] = "createor2" - mapInstance2["Inner.Id"] = 102 - mapInstance2["Inner.Name"] = "hahah2" - mapInstance2["Inner.Desc"] = "inner desc2" - mapInstance2["Inner.Dest.Username"] = "inner dest uername2" - mapInstance2["Inner.Dest.Inner.Desc"] = "inner dest inner desc2" - - maps := make([]map[string]any, 2) - maps[0] = mapInstance - maps[1] = mapInstance2 - res := new([]Src) - err := Maps2Structs(maps, res) - if err != nil { - fmt.Println(err) - } -} - -func TestMap2Struct(t *testing.T) { - mapInstance := make(map[string]any) - mapInstance["Username"] = "liang637210" - mapInstance["Id"] = 12 - mapInstance["CreateTime"] = time.Now() - mapInstance["Creator"] = "createor" - mapInstance["Inner.Id"] = nil - mapInstance["Inner.Name"] = "hahah" - mapInstance["Inner.Desc"] = "inner desc" - mapInstance["Inner.Dest.Username"] = "inner dest uername" - mapInstance["Inner.Dest.Inner.Desc"] = "inner dest inner desc" - - //innerMap := make(map[string]interface{}) - //innerMap["Name"] = "Innername" - - //a := new(Src) - ////a.Inner = new(SrcInner) - // - //stime := time.Now().UnixNano() - //for i := 0; i < 1000000; i++ { - // err := structutils.Map2Struct(mapInstance, a) - // if err != nil { - // fmt.Println(err) - // } - //} - //etime := time.Now().UnixNano() - //fmt.Println(etime - stime) - //if err != nil { - // fmt.Println(err) - //} else { - // fmt.Println(a) - //} - - s := new(Src) - //name, b := structutils.IndirectType(reflect.TypeOf(s)).FieldByName("Inner") - //if structutils.IndirectType(name.Type).Kind() != reflect.Struct { - // fmt.Println(name.Name + "不是结构体") - //} else { - // //innerType := name.Type - // innerValue := structutils.Indirect(reflect.ValueOf(s)).FieldByName("Inner") - // //if innerValue.IsValid() && innerValue.IsNil() { - // // innerValue.Set(reflect.New(innerValue.Type().Elem())) - // //} - // if !innerValue.IsValid() { - // fmt.Println("is valid") - // } else { - // //innerValue.Set(reflect.New(innerValue.Type())) - // fmt.Println(innerValue.CanSet()) - // fmt.Println(innerValue.CanAddr()) - // //mapstructure.Decode(innerMap, innerValue.Addr().Interface()) - // } - // - //} - // - //fmt.Println(name, b) - //将 map 转换为指定的结构体 - // if err := decode(mapInstance, &s); err != nil { - // fmt.Println(err) - // } - fmt.Printf("map2struct后得到的 struct 内容为:%v", s) -} - -func getPrefixKeyMap(m map[string]any) map[string]map[string]any { - key2map := make(map[string]map[string]any) - for k, v := range m { - if !strings.Contains(k, ".") { - continue - } - lastIndex := strings.LastIndex(k, ".") - prefix := k[0:lastIndex] - m2 := key2map[prefix] - if m2 == nil { - key2map[prefix] = map[string]any{k[lastIndex+1:]: v} - } else { - m2[k[lastIndex+1:]] = v - } - delete(m, k) - } - return key2map -} - -func TestReflect(t *testing.T) { - type dog struct { - LegCount int - } - // 获取dog实例的反射值对象 - valueOfDog := reflect.ValueOf(&dog{}).Elem() - - // 获取legCount字段的值 - vLegCount := valueOfDog.FieldByName("LegCount") - - fmt.Println(vLegCount.CanSet()) - fmt.Println(vLegCount.CanAddr()) - // 尝试设置legCount的值(这里会发生崩溃) - vLegCount.SetInt(4) -} - -func TestTemplateResolve(t *testing.T) { - d := make(map[string]string) - d["Name"] = "黄先生" - d["Age"] = "23jlfdsjf" - resolve := TemplateResolve("{{.Name}} is name, and {{.Age}} is age", d) - fmt.Println(resolve) - -} diff --git a/kit/utils/sturct_utils.go b/kit/utils/sturct_utils.go deleted file mode 100644 index dc51d60..0000000 --- a/kit/utils/sturct_utils.go +++ /dev/null @@ -1,654 +0,0 @@ -package utils - -import ( - "database/sql" - "encoding/json" - "errors" - "fmt" - "reflect" - "strconv" - "strings" -) - -// Copy copy things,引用至copier -func Copy(toValue any, fromValue any) (err error) { - var ( - isSlice bool - amount = 1 - from = Indirect(reflect.ValueOf(fromValue)) - to = Indirect(reflect.ValueOf(toValue)) - ) - - if !to.CanAddr() { - return errors.New("copy to value is unaddressable") - } - - // Return is from value is invalid - if !from.IsValid() { - return - } - - fromType := IndirectType(from.Type()) - toType := IndirectType(to.Type()) - - // Just set it if possible to assign - // And need to do copy anyway if the type is struct - if fromType.Kind() != reflect.Struct && from.Type().AssignableTo(to.Type()) { - to.Set(from) - return - } - - if fromType.Kind() != reflect.Struct || toType.Kind() != reflect.Struct { - return - } - - if to.Kind() == reflect.Slice { - isSlice = true - if from.Kind() == reflect.Slice { - amount = from.Len() - } - } - - for i := 0; i < amount; i++ { - var dest, source reflect.Value - - if isSlice { - // source - if from.Kind() == reflect.Slice { - source = Indirect(from.Index(i)) - } else { - source = Indirect(from) - } - // dest - dest = Indirect(reflect.New(toType).Elem()) - } else { - source = Indirect(from) - dest = Indirect(to) - } - - // check source - if source.IsValid() { - fromTypeFields := deepFields(fromType) - //fmt.Printf("%#v", fromTypeFields) - // Copy from field to field or method - for _, field := range fromTypeFields { - name := field.Name - - if fromField := source.FieldByName(name); fromField.IsValid() { - // has field - if toField := dest.FieldByName(name); toField.IsValid() { - if toField.CanSet() { - if !set(toField, fromField) { - if err := Copy(toField.Addr().Interface(), fromField.Interface()); err != nil { - return err - } - } - } - } else { - // try to set to method - var toMethod reflect.Value - if dest.CanAddr() { - toMethod = dest.Addr().MethodByName(name) - } else { - toMethod = dest.MethodByName(name) - } - - if toMethod.IsValid() && toMethod.Type().NumIn() == 1 && fromField.Type().AssignableTo(toMethod.Type().In(0)) { - toMethod.Call([]reflect.Value{fromField}) - } - } - } - } - - // Copy from method to field - for _, field := range deepFields(toType) { - name := field.Name - - var fromMethod reflect.Value - if source.CanAddr() { - fromMethod = source.Addr().MethodByName(name) - } else { - fromMethod = source.MethodByName(name) - } - - if fromMethod.IsValid() && fromMethod.Type().NumIn() == 0 && fromMethod.Type().NumOut() == 1 { - if toField := dest.FieldByName(name); toField.IsValid() && toField.CanSet() { - values := fromMethod.Call([]reflect.Value{}) - if len(values) >= 1 { - set(toField, values[0]) - } - } - } - } - } - if isSlice { - if dest.Addr().Type().AssignableTo(to.Type().Elem()) { - to.Set(reflect.Append(to, dest.Addr())) - } else if dest.Type().AssignableTo(to.Type().Elem()) { - to.Set(reflect.Append(to, dest)) - } - } - } - return -} - -// 对结构体的每个字段以及字段值执行doWith回调函数, 包括匿名属性的字段 -func DoWithFields(str any, doWith func(fType reflect.StructField, fValue reflect.Value) error) error { - t := IndirectType(reflect.TypeOf(str)) - if t.Kind() != reflect.Struct { - return errors.New("非结构体") - } - - fieldNum := t.NumField() - v := Indirect(reflect.ValueOf(str)) - for i := 0; i < fieldNum; i++ { - ft := t.Field(i) - fv := v.Field(i) - // 如果是匿名属性,则递归调用该方法 - if ft.Anonymous { - DoWithFields(fv.Interface(), doWith) - continue - } - err := doWith(ft, fv) - if err != nil { - return err - } - } - return nil -} - -func deepFields(reflectType reflect.Type) []reflect.StructField { - var fields []reflect.StructField - - if reflectType = IndirectType(reflectType); reflectType.Kind() == reflect.Struct { - for i := 0; i < reflectType.NumField(); i++ { - v := reflectType.Field(i) - if v.Anonymous { - fields = append(fields, deepFields(v.Type)...) - } else { - fields = append(fields, v) - } - } - } - - return fields -} - -func Indirect(reflectValue reflect.Value) reflect.Value { - for reflectValue.Kind() == reflect.Ptr { - reflectValue = reflectValue.Elem() - } - return reflectValue -} - -func IndirectType(reflectType reflect.Type) reflect.Type { - for reflectType.Kind() == reflect.Ptr || reflectType.Kind() == reflect.Slice { - reflectType = reflectType.Elem() - } - return reflectType -} - -func set(to, from reflect.Value) bool { - if from.IsValid() { - if to.Kind() == reflect.Ptr { - //set `to` to nil if from is nil - if from.Kind() == reflect.Ptr && from.IsNil() { - to.Set(reflect.Zero(to.Type())) - return true - } else if to.IsNil() { - to.Set(reflect.New(to.Type().Elem())) - } - to = to.Elem() - } - - if from.Type().ConvertibleTo(to.Type()) { - to.Set(from.Convert(to.Type())) - } else if scanner, ok := to.Addr().Interface().(sql.Scanner); ok { - err := scanner.Scan(from.Interface()) - if err != nil { - return false - } - } else if from.Kind() == reflect.Ptr { - return set(to, from.Elem()) - } else { - return false - } - } - return true -} - -func Map2Struct(m map[string]any, s any) error { - toValue := Indirect(reflect.ValueOf(s)) - if !toValue.CanAddr() { - return errors.New("to value is unaddressable") - } - - innerStructMaps := getInnerStructMaps(m) - if len(innerStructMaps) != 0 { - for k, v := range innerStructMaps { - var fieldV reflect.Value - if strings.Contains(k, ".") { - fieldV = getFiledValueByPath(k, toValue) - } else { - fieldV = toValue.FieldByName(k) - } - - if !fieldV.CanSet() || !fieldV.CanAddr() { - continue - } - fieldT := fieldV.Type().Elem() - if fieldT.Kind() != reflect.Struct { - return errors.New(k + "不是结构体") - } - // 如果值为nil,则默认创建一个并赋值 - if fieldV.IsNil() { - fieldV.Set(reflect.New(fieldT)) - } - err := Map2Struct(v, fieldV.Addr().Interface()) - if err != nil { - return err - } - } - } - var err error - for k, v := range m { - if v == nil { - continue - } - k = strings.Title(k) - // 如果key含有下划线,则将其转为驼峰 - if strings.Contains(k, "_") { - k = Case2Camel(k) - } - - fieldV := toValue.FieldByName(k) - if !fieldV.CanSet() { - continue - } - - err = decode(k, v, fieldV) - if err != nil { - return err - } - } - - return nil -} - -func Maps2Structs(maps []map[string]any, structs any) error { - structsV := reflect.Indirect(reflect.ValueOf(structs)) - valType := structsV.Type() - valElemType := valType.Elem() - sliceType := reflect.SliceOf(valElemType) - - length := len(maps) - - valSlice := structsV - if valSlice.IsNil() { - // Make a new slice to hold our result, same size as the original data. - valSlice = reflect.MakeSlice(sliceType, length, length) - } - - for i := 0; i < length; i++ { - err := Map2Struct(maps[i], valSlice.Index(i).Addr().Interface()) - if err != nil { - return err - } - } - structsV.Set(valSlice) - return nil -} - -func getFiledValueByPath(path string, value reflect.Value) reflect.Value { - split := strings.Split(path, ".") - for _, v := range split { - if value.Type().Kind() == reflect.Ptr { - // 如果值为nil,则创建并赋值 - if value.IsNil() { - value.Set(reflect.New(IndirectType(value.Type()))) - } - value = value.Elem() - } - value = value.FieldByName(v) - } - return value -} - -func getInnerStructMaps(m map[string]any) map[string]map[string]any { - key2map := make(map[string]map[string]any) - for k, v := range m { - if !strings.Contains(k, ".") { - continue - } - lastIndex := strings.LastIndex(k, ".") - prefix := k[0:lastIndex] - m2 := key2map[prefix] - if m2 == nil { - key2map[prefix] = map[string]any{k[lastIndex+1:]: v} - } else { - m2[k[lastIndex+1:]] = v - } - delete(m, k) - } - return key2map -} - -// decode等方法摘抄自mapstructure库 - -func decode(name string, input any, outVal reflect.Value) error { - var inputVal reflect.Value - if input != nil { - inputVal = reflect.ValueOf(input) - - // We need to check here if input is a typed nil. Typed nils won't - // match the "input == nil" below so we check that here. - if inputVal.Kind() == reflect.Ptr && inputVal.IsNil() { - input = nil - } - } - - if !inputVal.IsValid() { - // If the input value is invalid, then we just set the value - // to be the zero value. - outVal.Set(reflect.Zero(outVal.Type())) - return nil - } - - var err error - outputKind := getKind(outVal) - switch outputKind { - case reflect.Int: - err = decodeInt(name, input, outVal) - case reflect.Uint: - err = decodeUint(name, input, outVal) - case reflect.Float32: - err = decodeFloat(name, input, outVal) - case reflect.String: - err = decodeString(name, input, outVal) - case reflect.Ptr: - _, err = decodePtr(name, input, outVal) - default: - // If we reached this point then we weren't able to decode it - return fmt.Errorf("%s: unsupported type: %s", name, outputKind) - } - return err -} - -func decodeInt(name string, data any, val reflect.Value) error { - dataVal := reflect.Indirect(reflect.ValueOf(data)) - dataKind := getKind(dataVal) - dataType := dataVal.Type() - - switch { - case dataKind == reflect.Int: - val.SetInt(dataVal.Int()) - case dataKind == reflect.Uint: - val.SetInt(int64(dataVal.Uint())) - case dataKind == reflect.Float32: - val.SetInt(int64(dataVal.Float())) - case dataKind == reflect.Bool: - if dataVal.Bool() { - val.SetInt(1) - } else { - val.SetInt(0) - } - case dataKind == reflect.String: - i, err := strconv.ParseInt(dataVal.String(), 0, val.Type().Bits()) - if err == nil { - val.SetInt(i) - } else { - return fmt.Errorf("cannot parse '%s' as int: %s", name, err) - } - case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": - jn := data.(json.Number) - i, err := jn.Int64() - if err != nil { - return fmt.Errorf( - "error decoding json.Number into %s: %s", name, err) - } - val.SetInt(i) - default: - return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) - } - - return nil -} - -func decodeUint(name string, data any, val reflect.Value) error { - dataVal := reflect.Indirect(reflect.ValueOf(data)) - dataKind := getKind(dataVal) - dataType := dataVal.Type() - - switch { - case dataKind == reflect.Int: - i := dataVal.Int() - if i < 0 { - return fmt.Errorf("cannot parse '%s', %d overflows uint", - name, i) - } - val.SetUint(uint64(i)) - case dataKind == reflect.Uint: - val.SetUint(dataVal.Uint()) - case dataKind == reflect.Float32: - f := dataVal.Float() - if f < 0 { - return fmt.Errorf("cannot parse '%s', %f overflows uint", - name, f) - } - val.SetUint(uint64(f)) - case dataKind == reflect.Bool: - if dataVal.Bool() { - val.SetUint(1) - } else { - val.SetUint(0) - } - case dataKind == reflect.String: - i, err := strconv.ParseUint(dataVal.String(), 0, val.Type().Bits()) - if err == nil { - val.SetUint(i) - } else { - return fmt.Errorf("cannot parse '%s' as uint: %s", name, err) - } - case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": - jn := data.(json.Number) - i, err := jn.Int64() - if err != nil { - return fmt.Errorf( - "error decoding json.Number into %s: %s", name, err) - } - if i < 0 { - return fmt.Errorf("cannot parse '%s', %d overflows uint", - name, i) - } - val.SetUint(uint64(i)) - default: - return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) - } - - return nil -} - -func decodeFloat(name string, data any, val reflect.Value) error { - dataVal := reflect.Indirect(reflect.ValueOf(data)) - dataKind := getKind(dataVal) - dataType := dataVal.Type() - - switch { - case dataKind == reflect.Int: - val.SetFloat(float64(dataVal.Int())) - case dataKind == reflect.Uint: - val.SetFloat(float64(dataVal.Uint())) - case dataKind == reflect.Float32: - val.SetFloat(dataVal.Float()) - case dataKind == reflect.Bool: - if dataVal.Bool() { - val.SetFloat(1) - } else { - val.SetFloat(0) - } - case dataKind == reflect.String: - f, err := strconv.ParseFloat(dataVal.String(), val.Type().Bits()) - if err == nil { - val.SetFloat(f) - } else { - return fmt.Errorf("cannot parse '%s' as float: %s", name, err) - } - case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": - jn := data.(json.Number) - i, err := jn.Float64() - if err != nil { - return fmt.Errorf( - "error decoding json.Number into %s: %s", name, err) - } - val.SetFloat(i) - default: - return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) - } - - return nil -} - -func decodeString(name string, data any, val reflect.Value) error { - dataVal := reflect.Indirect(reflect.ValueOf(data)) - dataKind := getKind(dataVal) - - converted := true - switch { - case dataKind == reflect.String: - val.SetString(dataVal.String()) - case dataKind == reflect.Bool: - if dataVal.Bool() { - val.SetString("1") - } else { - val.SetString("0") - } - case dataKind == reflect.Int: - val.SetString(strconv.FormatInt(dataVal.Int(), 10)) - case dataKind == reflect.Uint: - val.SetString(strconv.FormatUint(dataVal.Uint(), 10)) - case dataKind == reflect.Float32: - val.SetString(strconv.FormatFloat(dataVal.Float(), 'f', -1, 64)) - case dataKind == reflect.Slice, - dataKind == reflect.Array: - dataType := dataVal.Type() - elemKind := dataType.Elem().Kind() - switch elemKind { - case reflect.Uint8: - var uints []uint8 - if dataKind == reflect.Array { - uints = make([]uint8, dataVal.Len(), dataVal.Len()) - for i := range uints { - uints[i] = dataVal.Index(i).Interface().(uint8) - } - } else { - uints = dataVal.Interface().([]uint8) - } - val.SetString(string(uints)) - default: - converted = false - } - default: - converted = false - } - - if !converted { - return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) - } - - return nil -} - -func decodePtr(name string, data any, val reflect.Value) (bool, error) { - // If the input data is nil, then we want to just set the output - // pointer to be nil as well. - isNil := data == nil - if !isNil { - switch v := reflect.Indirect(reflect.ValueOf(data)); v.Kind() { - case reflect.Chan, - reflect.Func, - reflect.Interface, - reflect.Map, - reflect.Ptr, - reflect.Slice: - isNil = v.IsNil() - } - } - if isNil { - if !val.IsNil() && val.CanSet() { - nilValue := reflect.New(val.Type()).Elem() - val.Set(nilValue) - } - - return true, nil - } - - // Create an element of the concrete (non pointer) type and decode - // into that. Then set the value of the pointer to this type. - valType := val.Type() - valElemType := valType.Elem() - if val.CanSet() { - realVal := val - if realVal.IsNil() { - realVal = reflect.New(valElemType) - } - - if err := decode(name, data, reflect.Indirect(realVal)); err != nil { - return false, err - } - - val.Set(realVal) - } else { - if err := decode(name, data, reflect.Indirect(val)); err != nil { - return false, err - } - } - return false, nil -} - -func getKind(val reflect.Value) reflect.Kind { - kind := val.Kind() - - switch { - case kind >= reflect.Int && kind <= reflect.Int64: - return reflect.Int - case kind >= reflect.Uint && kind <= reflect.Uint64: - return reflect.Uint - case kind >= reflect.Float32 && kind <= reflect.Float64: - return reflect.Float32 - default: - return kind - } -} - -// 下划线写法转为驼峰写法 -func Case2Camel(name string) string { - name = strings.Replace(name, "_", " ", -1) - name = strings.Title(name) - return strings.Replace(name, " ", "", -1) -} - -func IsBlank(value reflect.Value) bool { - switch value.Kind() { - case reflect.String: - return value.Len() == 0 - case reflect.Bool: - return !value.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return value.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return value.Uint() == 0 - case reflect.Float32, reflect.Float64: - return value.Float() == 0 - case reflect.Interface, reflect.Ptr: - return value.IsNil() - } - return reflect.DeepEqual(value.Interface(), reflect.Zero(value.Type()).Interface()) -} diff --git a/kit/utils/template.go b/kit/utils/template.go deleted file mode 100644 index 285527d..0000000 --- a/kit/utils/template.go +++ /dev/null @@ -1,28 +0,0 @@ -package utils - -import ( - "bytes" - "text/template" -) - -func parse(t *template.Template, vars any) string { - var tmplBytes bytes.Buffer - - err := t.Execute(&tmplBytes, vars) - if err != nil { - panic(err) - } - return tmplBytes.String() -} - -// 模板字符串解析 -// str 模板字符串 -// vars 参数变量 -func TemplateParse(str string, vars any) string { - tmpl, err := template.New("tmpl").Parse(str) - - if err != nil { - panic(err) - } - return parse(tmpl, vars) -} diff --git a/kit/utils/tree_utils.go b/kit/utils/tree_utils.go deleted file mode 100644 index f14ae36..0000000 --- a/kit/utils/tree_utils.go +++ /dev/null @@ -1,74 +0,0 @@ -package utils - -// ConvertToINodeArray 其他的结构体想要生成菜单树,直接实现这个接口 -type INode interface { - // GetId获取id - GetId() int - // GetPid 获取父id - GetPid() int - // IsRoot 判断当前节点是否是顶层根节点 - IsRoot() bool - - SetChildren(childern any) -} - -type INodes []INode - -func (nodes INodes) Len() int { - return len(nodes) -} -func (nodes INodes) Swap(i, j int) { - nodes[i], nodes[j] = nodes[j], nodes[i] -} -func (nodes INodes) Less(i, j int) bool { - return nodes[i].GetId() < nodes[j].GetId() -} - -// GenerateTree 自定义的结构体实现 INode 接口后调用此方法生成树结构 -// nodes 需要生成树的节点 -// selectedNode 生成树后选中的节点 -// menuTrees 生成成功后的树结构对象 -func GenerateTree(nodes []INode) (trees []INode) { - trees = []INode{} - // 定义顶层根和子节点 - var roots, childs []INode - for _, v := range nodes { - if v.IsRoot() { - // 判断顶层根节点 - roots = append(roots, v) - } - childs = append(childs, v) - } - - for _, v := range roots { - // 递归 - setChildren(v, childs) - trees = append(trees, v) - } - return -} - -// recursiveTree 递归生成树结构 -// tree 递归的树对象 -// nodes 递归的节点 -// selectedNodes 选中的节点 -func setChildren(parent INode, nodes []INode) { - children := []INode{} - for _, v := range nodes { - if v.IsRoot() { - // 如果当前节点是顶层根节点就跳过 - continue - } - if parent.GetId() == v.GetPid() { - children = append(children, v) - } - } - if len(children) == 0 { - return - } - - parent.SetChildren(children) - for _, c := range children { - setChildren(c, nodes) - } -} diff --git a/kit/utils/yml.go b/kit/utils/yml.go deleted file mode 100644 index 60e75ea..0000000 --- a/kit/utils/yml.go +++ /dev/null @@ -1,27 +0,0 @@ -package utils - -import ( - "errors" - "io/ioutil" - - "gopkg.in/yaml.v3" -) - -// 从指定路径加载yaml文件 -func LoadYml(path string, out any) error { - yamlFileBytes, readErr := ioutil.ReadFile(path) - if readErr != nil { - return readErr - } - // yaml解析 - err := yaml.Unmarshal(yamlFileBytes, out) - if err != nil { - return errors.New("无法解析 [" + path + "] -- " + err.Error()) - } - return nil -} - -func LoadYmlByString(yamlStr string, out any) error { - // yaml解析 - return yaml.Unmarshal([]byte(yamlStr), out) -} diff --git a/kit/ws/msg.go b/kit/ws/msg.go deleted file mode 100644 index 3e3a20a..0000000 --- a/kit/ws/msg.go +++ /dev/null @@ -1,27 +0,0 @@ -package ws - -const SuccessMsgType = 1 -const ErrorMsgType = 0 -const InfoMsgType = 2 - -// websocket消息 -type Msg struct { - Type int `json:"type"` // 消息类型 - Title string `json:"title"` // 消息标题 - Msg string `json:"msg"` // 消息内容 -} - -// 普通消息 -func NewMsg(title, msg string) *Msg { - return &Msg{Type: InfoMsgType, Title: title, Msg: msg} -} - -// 成功消息 -func SuccessMsg(title, msg string) *Msg { - return &Msg{Type: SuccessMsgType, Title: title, Msg: msg} -} - -// 错误消息 -func ErrMsg(title, msg string) *Msg { - return &Msg{Type: ErrorMsgType, Title: title, Msg: msg} -} diff --git a/kit/ws/ws.go b/kit/ws/ws.go deleted file mode 100644 index 25665b9..0000000 --- a/kit/ws/ws.go +++ /dev/null @@ -1,97 +0,0 @@ -package ws - -import ( - "encoding/json" - "net/http" - "sync" - "time" - - "pandax/kit/logger" - - "github.com/gorilla/websocket" -) - -var Upgrader = websocket.Upgrader{ - ReadBufferSize: 1024, - WriteBufferSize: 1024 * 1024 * 10, - CheckOrigin: func(r *http.Request) bool { - return true - }, -} - -type Connection struct { - conn *websocket.Conn - lock sync.Mutex -} - -var connections = make(map[uint64]*Connection) -var connLock sync.Mutex - -func init() { - go checkConn() -} - -// 放置ws连接 -func Put(userId uint64, conn *websocket.Conn) { - connLock.Lock() - defer connLock.Unlock() - - Delete(userId) - connections[userId] = &Connection{ - conn: conn, - } -} - -func checkConn() { - heartbeat := time.Duration(20) * time.Second - tick := time.NewTicker(heartbeat) - for range tick.C { - connLock.Lock() - for uid, conn := range connections { - conn.lock.Lock() - err := conn.conn.WriteControl(websocket.PingMessage, []byte("ping"), time.Now().Add(heartbeat/2)) - conn.lock.Unlock() - if err != nil { - logger.Log.Info("删除ping失败的websocket连接:uid = ", uid) - Delete(uid) - } - } - connLock.Unlock() - } -} - -// 删除ws连接 -func Delete(userid uint64) { - connLock.Lock() - defer connLock.Unlock() - - conn := connections[userid] - if conn != nil { - conn.lock.Lock() - conn.conn.Close() - conn.lock.Unlock() - delete(connections, userid) - } -} - -// 对指定用户发送消息 -func SendMsg(userId uint64, msg *Msg) { - connLock.Lock() - defer connLock.Unlock() - - conn := connections[userId] - if conn != nil { - conn.lock.Lock() - defer conn.lock.Unlock() - - bytes, err := json.Marshal(msg) - if err != nil { - logger.Log.Error("发送消息失败:", err) - return - } - err = conn.conn.WriteMessage(websocket.TextMessage, bytes) - if err != nil { - logger.Log.Error("发送消息失败:", err) - } - } -} diff --git a/main.go b/main.go index 546b2e0..6267c99 100644 --- a/main.go +++ b/main.go @@ -2,14 +2,14 @@ package main import ( "context" + "github.com/PandaXGO/PandaKit/logger" + "github.com/PandaXGO/PandaKit/rediscli" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/starter" "log" "os" "os/signal" "pandax/iothub" - "pandax/kit/logger" - "pandax/kit/rediscli" - "pandax/kit/restfulx" - "pandax/kit/starter" "pandax/pkg/cache" "pandax/pkg/config" "pandax/pkg/global" diff --git a/pkg/cache/device_etoken.go b/pkg/cache/device_etoken.go index 608789a..b47855f 100644 --- a/pkg/cache/device_etoken.go +++ b/pkg/cache/device_etoken.go @@ -2,7 +2,7 @@ package cache import ( "context" - "pandax/kit/rediscli" + "github.com/PandaXGO/PandaKit/rediscli" "time" ) diff --git a/pkg/cache/product_rule.go b/pkg/cache/product_rule.go index 37cc39c..665a59a 100644 --- a/pkg/cache/product_rule.go +++ b/pkg/cache/product_rule.go @@ -1,7 +1,7 @@ package cache import ( - "pandax/kit/cache" + "github.com/PandaXGO/PandaKit/cache" "time" ) diff --git a/pkg/cache/sub_device.go b/pkg/cache/sub_device.go index fd715e1..3f7b4d9 100644 --- a/pkg/cache/sub_device.go +++ b/pkg/cache/sub_device.go @@ -1,7 +1,7 @@ package cache import ( - "pandax/kit/cache" + "github.com/PandaXGO/PandaKit/cache" "strings" "time" ) diff --git a/pkg/config/config.go b/pkg/config/config.go index 6b039c5..9cc0bd2 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -3,8 +3,8 @@ package config import ( "flag" "fmt" - "pandax/kit/biz" - "pandax/kit/utils" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/utils" "path/filepath" ) diff --git a/pkg/config/jwt.go b/pkg/config/jwt.go index f47c5d6..bbccf96 100644 --- a/pkg/config/jwt.go +++ b/pkg/config/jwt.go @@ -1,7 +1,7 @@ package config import ( - "pandax/kit/biz" + "github.com/PandaXGO/PandaKit/biz" ) type Jwt struct { diff --git a/pkg/initialize/table.go b/pkg/initialize/table.go index e112bdb..901035e 100644 --- a/pkg/initialize/table.go +++ b/pkg/initialize/table.go @@ -1,11 +1,11 @@ package initialize import ( + "github.com/PandaXGO/PandaKit/biz" devEntity "pandax/apps/develop/entity" jobEntity "pandax/apps/job/entity" logEntity "pandax/apps/log/entity" systemEntity "pandax/apps/system/entity" - "pandax/kit/biz" "pandax/pkg/global" ) diff --git a/pkg/middleware/log.go b/pkg/middleware/log.go index 0743f6f..6271b96 100644 --- a/pkg/middleware/log.go +++ b/pkg/middleware/log.go @@ -3,10 +3,10 @@ package middleware import ( "encoding/json" "fmt" - "pandax/kit/biz" - "pandax/kit/logger" - "pandax/kit/restfulx" - "pandax/kit/utils" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" + "pandax/pkg/global" "reflect" "runtime/debug" @@ -29,10 +29,10 @@ func LogHandler(rc *restfulx.ReqCtx) error { lfs[req.Method] = req.URL.Path if err := rc.Err; err != nil { - logger.Log.WithFields(lfs).Error(getErrMsg(rc, err)) + global.Log.WithFields(lfs).Error(getErrMsg(rc, err)) return nil } - logger.Log.WithFields(lfs).Info(getLogMsg(rc)) + global.Log.WithFields(lfs).Info(getLogMsg(rc)) return nil } diff --git a/pkg/middleware/oper.go b/pkg/middleware/oper.go index e437ae9..d6f381b 100644 --- a/pkg/middleware/oper.go +++ b/pkg/middleware/oper.go @@ -1,11 +1,11 @@ package middleware import ( + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/utils" "net/http" "pandax/apps/log/entity" "pandax/apps/log/services" - "pandax/kit/restfulx" - "pandax/kit/utils" ) func OperationHandler(rc *restfulx.ReqCtx) error { diff --git a/pkg/middleware/permission.go b/pkg/middleware/permission.go index fd784d5..181e964 100644 --- a/pkg/middleware/permission.go +++ b/pkg/middleware/permission.go @@ -1,10 +1,10 @@ package middleware import ( - "pandax/kit/biz" - "pandax/kit/casbin" - "pandax/kit/restfulx" - "pandax/kit/token" + "github.com/PandaXGO/PandaKit/biz" + "github.com/PandaXGO/PandaKit/casbin" + "github.com/PandaXGO/PandaKit/restfulx" + "github.com/PandaXGO/PandaKit/token" "pandax/pkg/global" "github.com/dgrijalva/jwt-go" diff --git a/pkg/rule_engine/nodes/action_create_alarm_node.go b/pkg/rule_engine/nodes/action_create_alarm_node.go index 02a6622..8c6a828 100644 --- a/pkg/rule_engine/nodes/action_create_alarm_node.go +++ b/pkg/rule_engine/nodes/action_create_alarm_node.go @@ -2,9 +2,9 @@ package nodes import ( "encoding/json" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/device/entity" "pandax/apps/device/services" - "pandax/kit/utils" "pandax/pkg/global" "pandax/pkg/rule_engine/message" "time" @@ -48,7 +48,7 @@ func (n *createAlarmNode) Handle(msg *message.Message) error { } } else { alarm = &entity.DeviceAlarm{} - alarm.Id = utils.GenerateID() + alarm.Id = utils.GenerateID("") alarm.DeviceId = msg.Metadata.GetValue("deviceId").(string) alarm.ProductId = msg.Metadata.GetValue("productId").(string) alarm.Name = msg.Metadata.GetValue("deviceName").(string) diff --git a/pkg/rule_engine/nodes/action_rpc_request_from_device_node.go b/pkg/rule_engine/nodes/action_rpc_request_from_device_node.go index d3cf8a4..adc0854 100644 --- a/pkg/rule_engine/nodes/action_rpc_request_from_device_node.go +++ b/pkg/rule_engine/nodes/action_rpc_request_from_device_node.go @@ -2,11 +2,11 @@ package nodes import ( "errors" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/device/services" "pandax/iothub/client/mqttclient" "pandax/iothub/client/tcpclient" "pandax/iothub/client/udpclient" - "pandax/kit/utils" devicerpc "pandax/pkg/device_rpc" "pandax/pkg/global" "pandax/pkg/rule_engine/message" @@ -72,7 +72,7 @@ func (n *rpcRequestFromDeviceNode) Handle(msg *message.Message) error { RequestId := n.RequestId if RequestId == "" { if msg.Metadata.GetValue("requestId") == nil { - rpc.RequestId = utils.GenerateID() + rpc.RequestId = utils.GenerateID("") } else { rpc.RequestId = msg.Metadata.GetValue("requestId").(string) } diff --git a/pkg/rule_engine/nodes/action_rpc_request_to_device_node.go b/pkg/rule_engine/nodes/action_rpc_request_to_device_node.go index 3aec63b..38d633f 100644 --- a/pkg/rule_engine/nodes/action_rpc_request_to_device_node.go +++ b/pkg/rule_engine/nodes/action_rpc_request_to_device_node.go @@ -3,12 +3,12 @@ package nodes import ( "encoding/json" "errors" + "github.com/PandaXGO/PandaKit/utils" "pandax/apps/device/entity" "pandax/apps/device/services" "pandax/iothub/client/mqttclient" "pandax/iothub/client/tcpclient" "pandax/iothub/client/udpclient" - "pandax/kit/utils" "pandax/pkg/global" "pandax/pkg/global/model" "pandax/pkg/rule_engine/message" @@ -51,7 +51,7 @@ func (n *rpcRequestToDeviceNode) Handle(msg *message.Message) error { // 构建指令记录 var data entity.DeviceCmdLog - data.Id = utils.GenerateID() + data.Id = utils.GenerateID("") data.DeviceId = deviceId data.CmdName = datas.Method data.CmdContent = kgo.KConv.ToStr(datas.Params) diff --git a/pkg/rule_engine/nodes/external_ding_node.go b/pkg/rule_engine/nodes/external_ding_node.go index 137f227..1db7ce7 100644 --- a/pkg/rule_engine/nodes/external_ding_node.go +++ b/pkg/rule_engine/nodes/external_ding_node.go @@ -6,8 +6,8 @@ import ( "encoding/base64" "encoding/json" "fmt" + "github.com/PandaXGO/PandaKit/httpclient" "net/url" - "pandax/kit/httpclient" "pandax/pkg/rule_engine/message" "time" ) diff --git a/pkg/rule_engine/nodes/external_restapi_node.go b/pkg/rule_engine/nodes/external_restapi_node.go index 7f870e7..90a6f95 100644 --- a/pkg/rule_engine/nodes/external_restapi_node.go +++ b/pkg/rule_engine/nodes/external_restapi_node.go @@ -3,7 +3,7 @@ package nodes import ( "encoding/json" "errors" - "pandax/kit/httpclient" + "github.com/PandaXGO/PandaKit/httpclient" "pandax/pkg/rule_engine/message" ) diff --git a/pkg/rule_engine/nodes/external_wechat_node.go b/pkg/rule_engine/nodes/external_wechat_node.go index 09a9b8c..cdb8841 100644 --- a/pkg/rule_engine/nodes/external_wechat_node.go +++ b/pkg/rule_engine/nodes/external_wechat_node.go @@ -2,7 +2,7 @@ package nodes import ( "encoding/json" - "pandax/kit/httpclient" + "github.com/PandaXGO/PandaKit/httpclient" "pandax/pkg/rule_engine/message" ) diff --git a/pkg/tdengine/tdengine.go b/pkg/tdengine/tdengine.go index 9e7e3ae..d1b89dc 100644 --- a/pkg/tdengine/tdengine.go +++ b/pkg/tdengine/tdengine.go @@ -4,7 +4,7 @@ import ( "database/sql" "encoding/base64" "fmt" - "pandax/kit/httpclient" + "github.com/PandaXGO/PandaKit/httpclient" "strings" "time" diff --git a/pkg/tool/base_test.go b/pkg/tool/base_test.go index 0726b56..b9c4cf8 100644 --- a/pkg/tool/base_test.go +++ b/pkg/tool/base_test.go @@ -1,7 +1,7 @@ package tool import ( - "pandax/kit/utils" + "github.com/PandaXGO/PandaKit/utils" "testing" ) @@ -11,7 +11,7 @@ func TestToCamelCase(t *testing.T) { } func TestGenerateID(t *testing.T) { - id := utils.GenerateID() + id := utils.GenerateID("") t.Log(id) } diff --git a/pkg/transport/http_server.go b/pkg/transport/http_server.go index 5adb5bb..97d18ec 100644 --- a/pkg/transport/http_server.go +++ b/pkg/transport/http_server.go @@ -3,7 +3,6 @@ package transport import ( "context" "net/http" - "pandax/kit/logger" "pandax/pkg/global" "github.com/emicklei/go-restful/v3" @@ -60,9 +59,9 @@ func (s *HttpServer) Stop(ctx context.Context) error { type httpLog struct{} func (t *httpLog) Print(v ...any) { - logger.Log.Debug(v...) + global.Log.Debug(v...) } func (t *httpLog) Printf(format string, v ...any) { - logger.Log.Debugf(format, v...) + global.Log.Debugf(format, v...) } diff --git a/resource/template/go/api.template b/resource/template/go/api.template index 8180a0e..1f12b2b 100644 --- a/resource/template/go/api.template +++ b/resource/template/go/api.template @@ -5,13 +5,13 @@ package api // 生成人:{{.FunctionAuthor}} // ========================================================================== import ( - "pandax/kit/model" - "pandax/kit/restfulx" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "strings" "pandax/apps/{{.PackageName}}/entity" "pandax/apps/{{.PackageName}}/services" - "pandax/kit/biz" + "github.com/PandaXGO/PandaKit/biz" ) type {{.ClassName}}Api struct { diff --git a/resource/template/go/router.template b/resource/template/go/router.template index b4556ed..91d3766 100644 --- a/resource/template/go/router.template +++ b/resource/template/go/router.template @@ -6,8 +6,8 @@ package router import ( - "pandax/kit/model" - "pandax/kit/restfulx" + "github.com/PandaXGO/PandaKit/model" + "github.com/PandaXGO/PandaKit/restfulx" "pandax/apps/{{.PackageName}}/api" "pandax/apps/{{.PackageName}}/entity" "pandax/apps/{{.PackageName}}/services"