From 5f00d720ea52ababeb10954da4d33ab6c46e93b7 Mon Sep 17 00:00:00 2001
From: wangpengfei <274878379@qq.com>
Date: 星期五, 14 七月 2023 17:47:13 +0800
Subject: [PATCH] add

---
 service/menu.go            |   17 
 router/menu.go             |   16 
 api/v1/authority.go        |  178 +++++
 service/authority.go       |   91 ++
 go.mod                     |   39 +
 pkg/ecode/code.go          |    9 
 docs/swagger.yaml          |   89 ++
 model/menu.go              |   58 -
 model/authority.go         |   67 +
 service/index.go           |    3 
 api/v1/user.go             |   70 +
 api/v1/index.go            |    5 
 router/authority.go        |   21 
 model/request/authority.go |   10 
 docs/docs.go               |  146 ++++
 docs/swagger.json          |  146 ++++
 model/response/response.go |    4 
 constvar/const.go          |    6 
 /dev/null                  |  363 ----------
 go.sum                     |  404 +++++++++++
 middleware/casbin_rbac.go  |   39 +
 middleware/jwt.go          |   41 
 service/casbin.go          |  135 +++
 router/index.go            |    6 
 model/request/jwt.go       |    9 
 api/v1/menu.go             |   35 +
 source/menu.go             |   31 
 27 files changed, 1,541 insertions(+), 497 deletions(-)

diff --git a/api/v1/authority.go b/api/v1/authority.go
new file mode 100644
index 0000000..32a299d
--- /dev/null
+++ b/api/v1/authority.go
@@ -0,0 +1,178 @@
+package v1
+
+import (
+	"aps_crm/model"
+	"aps_crm/model/request"
+	"aps_crm/pkg/contextx"
+	"aps_crm/pkg/ecode"
+	"github.com/flipped-aurora/gin-vue-admin/server/global"
+	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
+	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
+	"github.com/flipped-aurora/gin-vue-admin/server/utils"
+	"github.com/gin-gonic/gin"
+	"go.uber.org/zap"
+)
+
+type AuthorityApi struct{}
+
+// CreateAuthority
+//
+//	@Tags		Authority
+//	@Summary	鍒涘缓瑙掕壊
+//	@Security	ApiKeyAuth
+//	@accept		application/json
+//	@Produce	application/json
+//	@Param		data	body		request.AddAuthority	true	"鏌ヨ鍙傛暟"
+//	@Success	200		{object}	contextx.Response{}
+//	@Router		/api/authority/add [post]
+func (a *AuthorityApi) CreateAuthority(c *gin.Context) {
+	var params request.AddAuthority
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode, auth := checkAuthorityParams(&params)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	errCode = authorityService.CreateAuthority(auth)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+	}
+
+	//_ = menuService.AddMenuAuthority(systemReq.DefaultMenu(), authority.AuthorityId)
+	//_ = casbinService.UpdateCasbin(authority.AuthorityId, systemReq.DefaultCasbin())
+
+	ctx.Ok()
+}
+
+//DeleteAuthority
+//@Tags      Authority
+//@Summary   鍒犻櫎瑙掕壊
+//@Security  ApiKeyAuth
+//@accept    application/json
+//@Produce   application/json
+//@Param     data  body      request.AddAuthority            true  "鍒犻櫎瑙掕壊"
+//@Router    /authority/deleteAuthority [post]
+//func (a *AuthorityApi) DeleteAuthority(c *gin.Context) {
+//	var authority system.SysAuthority
+//	err := c.ShouldBindJSON(&authority)
+//	if err != nil {
+//		response.FailWithMessage(err.Error(), c)
+//		return
+//	}
+//	err = utils.Verify(authority, utils.AuthorityIdVerify)
+//	if err != nil {
+//		response.FailWithMessage(err.Error(), c)
+//		return
+//	}
+//	err = authorityService.DeleteAuthority(&authority)
+//	if err != nil { // 鍒犻櫎瑙掕壊涔嬪墠闇�瑕佸垽鏂槸鍚︽湁鐢ㄦ埛姝e湪浣跨敤姝よ鑹�
+//		global.GVA_LOG.Error("鍒犻櫎澶辫触!", zap.Error(err))
+//		response.FailWithMessage("鍒犻櫎澶辫触"+err.Error(), c)
+//		return
+//	}
+//	response.OkWithMessage("鍒犻櫎鎴愬姛", c)
+//}
+
+// UpdateAuthority
+//	@Tags		Authority
+//	@Summary	鏇存柊瑙掕壊淇℃伅
+//	@Security	ApiKeyAuth
+//	@accept		application/json
+//	@Produce	application/json
+//	@Param		data	body	request.AddAuthority	true	"鏉冮檺id, 鏉冮檺鍚�, 鐖惰鑹瞚d"
+//	@Router		/authority/updateAuthority [post]
+//func (a *AuthorityApi) UpdateAuthority(c *gin.Context) {
+//	var auth system.SysAuthority
+//	err := c.ShouldBindJSON(&auth)
+//	if err != nil {
+//		response.FailWithMessage(err.Error(), c)
+//		return
+//	}
+//	err = utils.Verify(auth, utils.AuthorityVerify)
+//	if err != nil {
+//		response.FailWithMessage(err.Error(), c)
+//		return
+//	}
+//	authority, err := authorityService.UpdateAuthority(auth)
+//	if err != nil {
+//		global.GVA_LOG.Error("鏇存柊澶辫触!", zap.Error(err))
+//		response.FailWithMessage("鏇存柊澶辫触"+err.Error(), c)
+//		return
+//	}
+//	response.OkWithDetailed(systemRes.SysAuthorityResponse{Authority: authority}, "鏇存柊鎴愬姛", c)
+//}
+
+// GetAuthorityList
+//	@Tags		Authority
+//	@Summary	鍒嗛〉鑾峰彇瑙掕壊鍒楄〃
+//	@Security	ApiKeyAuth
+//	@accept		application/json
+//	@Produce	application/json
+//	@Param		data	body	request.AddAuthority	true	"椤电爜, 姣忛〉澶у皬"
+//	@Router		/authority/getAuthorityList [post]
+//func (a *AuthorityApi) GetAuthorityList(c *gin.Context) {
+//	var pageInfo request.PageInfo
+//	err := c.ShouldBindJSON(&pageInfo)
+//	if err != nil {
+//		response.FailWithMessage(err.Error(), c)
+//		return
+//	}
+//	err = utils.Verify(pageInfo, utils.PageInfoVerify)
+//	if err != nil {
+//		response.FailWithMessage(err.Error(), c)
+//		return
+//	}
+//	list, total, err := authorityService.GetAuthorityInfoList(pageInfo)
+//	if err != nil {
+//		global.GVA_LOG.Error("鑾峰彇澶辫触!", zap.Error(err))
+//		response.FailWithMessage("鑾峰彇澶辫触"+err.Error(), c)
+//		return
+//	}
+//	response.OkWithDetailed(response.PageResult{
+//		List:     list,
+//		Total:    total,
+//		Page:     pageInfo.Page,
+//		PageSize: pageInfo.PageSize,
+//	}, "鑾峰彇鎴愬姛", c)
+//}
+
+// SetDataAuthority
+//
+//	@Tags		Authority
+//	@Summary	璁剧疆瑙掕壊璧勬簮鏉冮檺
+//	@Security	ApiKeyAuth
+//	@accept		application/json
+//	@Produce	application/json
+//	@Param		data	body	request.AddAuthority	true	"璁剧疆瑙掕壊璧勬簮鏉冮檺"
+//	@Router		/authority/setDataAuthority [post]
+func (a *AuthorityApi) SetDataAuthority(c *gin.Context) {
+	var auth system.SysAuthority
+	err := c.ShouldBindJSON(&auth)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	err = utils.Verify(auth, utils.AuthorityIdVerify)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	err = authorityService.SetDataAuthority(auth)
+	if err != nil {
+		global.GVA_LOG.Error("璁剧疆澶辫触!", zap.Error(err))
+		response.FailWithMessage("璁剧疆澶辫触"+err.Error(), c)
+		return
+	}
+	response.OkWithMessage("璁剧疆鎴愬姛", c)
+}
+
+func checkAuthorityParams(params *request.AddAuthority) (int, model.Authority) {
+	return ecode.OK, model.Authority{
+		AuthorityName: params.AuthorityName,
+	}
+}
diff --git a/api/v1/index.go b/api/v1/index.go
index f8911cf..c1f205a 100644
--- a/api/v1/index.go
+++ b/api/v1/index.go
@@ -44,6 +44,8 @@
 	ServiceFollowupApi
 	CustomerServiceSheetApi
 	ServiceFeeManageApi
+	AuthorityApi
+	MenuApi
 }
 
 var ApiGroup = new(Group)
@@ -87,4 +89,7 @@
 	serviceFollowupService      = service.ServiceGroup.FollowupService
 	customerServiceSheetService = service.ServiceGroup.CustomerServiceSheetService
 	serviceFeeManageService     = service.ServiceGroup.FeeManageService
+	casbinService               = service.ServiceGroup.CasbinService
+	authorityService            = service.ServiceGroup.AuthorityService
+	menuService                 = service.ServiceGroup.MenuService
 )
diff --git a/api/v1/menu.go b/api/v1/menu.go
new file mode 100644
index 0000000..8604bfa
--- /dev/null
+++ b/api/v1/menu.go
@@ -0,0 +1,35 @@
+package v1
+
+import (
+	"aps_crm/model/response"
+	"aps_crm/pkg/contextx"
+	"aps_crm/pkg/ecode"
+	"github.com/gin-gonic/gin"
+)
+
+type MenuApi struct{}
+
+// List
+//
+//	@Tags		Menu
+//	@Summary	鑾峰彇鑿滃崟鏍�
+//	@Security	ApiKeyAuth
+//	@Produce	application/json
+//	@Success	200	{object}	contextx.Response{data=response.MenuTreeResponse}
+//	@Router		/api/menu/getMenu [get]
+func (m *MenuApi) List(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	list, errCode := menuService.GetMenuTree()
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.MenuTreeResponse{
+		List: list,
+	})
+}
diff --git a/api/v1/user.go b/api/v1/user.go
index 99534cf..baf9e7e 100644
--- a/api/v1/user.go
+++ b/api/v1/user.go
@@ -6,9 +6,7 @@
 	"aps_crm/model"
 	"aps_crm/model/request"
 	"aps_crm/model/response"
-	_ "aps_crm/model/response"
 	"aps_crm/pkg/contextx"
-	"aps_crm/pkg/convertx"
 	"aps_crm/pkg/ecode"
 	"aps_crm/pkg/encrypt"
 	"aps_crm/pkg/logx"
@@ -18,7 +16,6 @@
 	"github.com/gin-gonic/gin"
 	"github.com/go-redis/redis/v8"
 	"github.com/mojocn/base64Captcha"
-	"time"
 )
 
 // 褰撳紑鍚鏈嶅姟鍣ㄩ儴缃叉椂锛屾浛鎹笅闈㈢殑閰嶇疆锛屼娇鐢╮edis鍏变韩瀛樺偍楠岃瘉鐮�
@@ -26,6 +23,7 @@
 var store = base64Captcha.DefaultMemStore
 
 // Login
+//
 //	@Tags		Base
 //	@Summary	鐢ㄦ埛鐧诲綍
 //	@Produce	application/json
@@ -41,41 +39,41 @@
 
 	// 鍒ゆ柇楠岃瘉鐮佹槸鍚﹀紑鍚�
 	key := c.ClientIP()
-	openCaptcha := conf.Conf.Captcha.OpenCaptcha               // 鏄惁寮�鍚槻鐖嗘鏁�
-	openCaptchaTimeOut := conf.Conf.Captcha.OpenCaptchaTimeOut // 缂撳瓨瓒呮椂鏃堕棿
-	v, ok := constvar.BlackCache.Get(key)
-	if !ok {
-		constvar.BlackCache.Set(key, 1, time.Second*time.Duration(openCaptchaTimeOut))
-	}
+	//openCaptcha := conf.Conf.Captcha.OpenCaptcha               // 鏄惁寮�鍚槻鏆存鏁�
+	//openCaptchaTimeOut := conf.Conf.Captcha.OpenCaptchaTimeOut // 缂撳瓨瓒呮椂鏃堕棿
+	//v, ok := constvar.BlackCache.Get(key)
+	//if !ok {
+	//	constvar.BlackCache.Set(key, 1, time.Second*time.Duration(openCaptchaTimeOut))
+	//}
 
-	var oc bool = openCaptcha == 0 || convertx.InterfaceToInt(v) > openCaptcha // 0 琛ㄧず姣忔鐧诲綍閮介渶瑕侀獙璇佺爜 鎴栬�呭綋鍓嶆鏁板凡瓒呰繃闃茬垎娆℃暟
+	//var oc = openCaptcha == 0 || convertx.InterfaceToInt(v) > openCaptcha // 0 琛ㄧず姣忔鐧诲綍閮介渶瑕侀獙璇佺爜 鎴栬�呭綋鍓嶆鏁板凡瓒呰繃闃叉毚娆℃暟
 
-	if !oc || store.Verify(params.CaptchaId, params.Captcha, true) {
-		u := &model.User{Username: params.Username, Password: params.Password}
-		user, errCode := userService.Login(u)
-		if errCode != ecode.OK {
-			logx.Errorf("鐧婚檰澶辫触! 鐢ㄦ埛鍚嶄笉瀛樺湪鎴栬�呭瘑鐮侀敊璇�! errCode:%v", errCode)
-			// 楠岃瘉鐮佹鏁�+1
-			_ = constvar.BlackCache.Increment(key, 1)
-			ctx.Fail(errCode)
-			return
-		}
-		if !user.Enable {
-			logx.Errorf("鐧婚檰澶辫触! 鐢ㄦ埛琚姝㈢櫥褰�!")
-			// 楠岃瘉鐮佹鏁�+1
-			_ = constvar.BlackCache.Increment(key, 1)
-			ctx.Fail(ecode.UserForbidden)
-			return
-		}
-		// 璧嬪�艰彍鍗旾D鍒楄〃
-		//user.MenuIds, _ = menuService.GetUserMenuIds(user.ID, user.UserType)
-		slf.TokenNext(ctx, *user)
+	//if !oc || store.Verify(params.CaptchaId, params.Captcha, true) {
+	u := &model.User{Username: params.Username, Password: params.Password}
+	user, errCode := userService.Login(u)
+	if errCode != ecode.OK {
+		logx.Errorf("鐧婚檰澶辫触! 鐢ㄦ埛鍚嶄笉瀛樺湪鎴栬�呭瘑鐮侀敊璇�! errCode:%v", errCode)
+		// 楠岃瘉鐮佹鏁�+1
+		_ = constvar.BlackCache.Increment(key, 1)
+		ctx.Fail(errCode)
 		return
 	}
+	if !user.Enable {
+		logx.Errorf("鐧婚檰澶辫触! 鐢ㄦ埛琚姝㈢櫥褰�!")
+		// 楠岃瘉鐮佹鏁�+1
+		_ = constvar.BlackCache.Increment(key, 1)
+		ctx.Fail(ecode.UserForbidden)
+		return
+	}
+	// 璧嬪�艰彍鍗旾D鍒楄〃
+	//user.MenuIds, _ = menuService.GetUserMenuIds(user.ID, user.UserType)
+	slf.TokenNext(ctx, *user)
+	return
+	//}
 
 	// 楠岃瘉鐮佹鏁�+1
-	_ = constvar.BlackCache.Increment(key, 1)
-	ctx.Fail(ecode.CaptchaErr)
+	//_ = constvar.BlackCache.Increment(key, 1)
+	//ctx.Fail(ecode.CaptchaErr)
 }
 
 // TokenNext 鐧诲綍浠ュ悗绛惧彂jwt
@@ -137,6 +135,7 @@
 }
 
 // Register
+//
 //	@Tags		User
 //	@Summary	娉ㄥ唽璐﹀彿
 //	@Produce	application/json
@@ -204,6 +203,7 @@
 }
 
 // ChangePassword
+//
 //	@Tags		User
 //	@Summary	鐢ㄦ埛淇敼瀵嗙爜
 //	@Produce	application/json
@@ -227,6 +227,7 @@
 }
 
 // GetUserList
+//
 //	@Tags		User
 //	@Summary	鍒嗛〉鑾峰彇鐢ㄦ埛鍒楄〃(涓嶄紶鍒嗛〉鍙傛暟锛岃幏鍙栧叏閮�)
 //	@Produce	application/json
@@ -253,6 +254,7 @@
 }
 
 // DeleteUser
+//
 //	@Tags		User
 //	@Summary	鍒犻櫎鐢ㄦ埛
 //	@Produce	application/json
@@ -287,6 +289,7 @@
 }
 
 // SetUserInfo
+//
 //	@Tags		User
 //	@Summary	璁剧疆鐢ㄦ埛淇℃伅
 //	@Produce	application/json
@@ -317,6 +320,7 @@
 }
 
 // SetSelfInfo
+//
 //	@Tags		User
 //	@Summary	璁剧疆鐢ㄦ埛淇℃伅
 //	@Produce	application/json
@@ -348,6 +352,7 @@
 }
 
 // GetUserInfo
+//
 //	@Tags		User
 //	@Summary	鑾峰彇鑷韩淇℃伅
 //	@Produce	application/json
@@ -372,6 +377,7 @@
 }
 
 // ResetPassword
+//
 //	@Tags		User
 //	@Summary	閲嶇疆鐢ㄦ埛瀵嗙爜
 //	@Produce	application/json
diff --git a/constvar/const.go b/constvar/const.go
index 7cdfaa5..c5420da 100644
--- a/constvar/const.go
+++ b/constvar/const.go
@@ -52,3 +52,9 @@
 	CurrencyTypeEUR                         // 娆у厓
 	CurrencyTypeGBP                         // 鑻遍晳
 )
+
+type MenuType string
+
+const (
+	MenuTypeClient MenuType = "client"
+)
diff --git a/docs/docs.go b/docs/docs.go
index 9ead6a7..63dbcf3 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -16,6 +16,44 @@
     "host": "{{.Host}}",
     "basePath": "{{.BasePath}}",
     "paths": {
+        "/api/authority/add": {
+            "post": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Authority"
+                ],
+                "summary": "鍒涘缓瑙掕壊",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddAuthority"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/base/captcha": {
             "post": {
                 "produces": [
@@ -1920,6 +1958,37 @@
                         "description": "OK",
                         "schema": {
                             "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/menu/getMenu": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Menu"
+                ],
+                "summary": "鑾峰彇鑿滃崟鏍�",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/contextx.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/response.MenuTreeResponse"
+                                        }
+                                    }
+                                }
+                            ]
                         }
                     }
                 }
@@ -4688,6 +4757,37 @@
                     }
                 }
             }
+        },
+        "/authority/setDataAuthority": {
+            "post": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Authority"
+                ],
+                "summary": "璁剧疆瑙掕壊璧勬簮鏉冮檺",
+                "parameters": [
+                    {
+                        "description": "璁剧疆瑙掕壊璧勬簮鏉冮檺",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddAuthority"
+                        }
+                    }
+                ],
+                "responses": {}
+            }
         }
     },
     "definitions": {
@@ -5258,6 +5358,33 @@
                     "type": "string"
                 },
                 "start_time": {
+                    "type": "string"
+                }
+            }
+        },
+        "model.Menu": {
+            "type": "object",
+            "properties": {
+                "children": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Menu"
+                    }
+                },
+                "id": {
+                    "description": "涓婚敭ID",
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                },
+                "parentId": {
+                    "type": "integer"
+                },
+                "path": {
+                    "type": "string"
+                },
+                "title": {
                     "type": "string"
                 }
             }
@@ -5967,6 +6094,14 @@
                     "$ref": "#/definitions/constvar.UserType"
                 },
                 "username": {
+                    "type": "string"
+                }
+            }
+        },
+        "request.AddAuthority": {
+            "type": "object",
+            "properties": {
+                "authorityName": {
                     "type": "string"
                 }
             }
@@ -8675,6 +8810,17 @@
                 }
             }
         },
+        "response.MenuTreeResponse": {
+            "type": "object",
+            "properties": {
+                "list": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Menu"
+                    }
+                }
+            }
+        },
         "response.PageResult": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.json b/docs/swagger.json
index 7ced27c..aa5e2c0 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -4,6 +4,44 @@
         "contact": {}
     },
     "paths": {
+        "/api/authority/add": {
+            "post": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Authority"
+                ],
+                "summary": "鍒涘缓瑙掕壊",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddAuthority"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/base/captcha": {
             "post": {
                 "produces": [
@@ -1908,6 +1946,37 @@
                         "description": "OK",
                         "schema": {
                             "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/menu/getMenu": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Menu"
+                ],
+                "summary": "鑾峰彇鑿滃崟鏍�",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/contextx.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/response.MenuTreeResponse"
+                                        }
+                                    }
+                                }
+                            ]
                         }
                     }
                 }
@@ -4676,6 +4745,37 @@
                     }
                 }
             }
+        },
+        "/authority/setDataAuthority": {
+            "post": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Authority"
+                ],
+                "summary": "璁剧疆瑙掕壊璧勬簮鏉冮檺",
+                "parameters": [
+                    {
+                        "description": "璁剧疆瑙掕壊璧勬簮鏉冮檺",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddAuthority"
+                        }
+                    }
+                ],
+                "responses": {}
+            }
         }
     },
     "definitions": {
@@ -5246,6 +5346,33 @@
                     "type": "string"
                 },
                 "start_time": {
+                    "type": "string"
+                }
+            }
+        },
+        "model.Menu": {
+            "type": "object",
+            "properties": {
+                "children": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Menu"
+                    }
+                },
+                "id": {
+                    "description": "涓婚敭ID",
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                },
+                "parentId": {
+                    "type": "integer"
+                },
+                "path": {
+                    "type": "string"
+                },
+                "title": {
                     "type": "string"
                 }
             }
@@ -5955,6 +6082,14 @@
                     "$ref": "#/definitions/constvar.UserType"
                 },
                 "username": {
+                    "type": "string"
+                }
+            }
+        },
+        "request.AddAuthority": {
+            "type": "object",
+            "properties": {
+                "authorityName": {
                     "type": "string"
                 }
             }
@@ -8663,6 +8798,17 @@
                 }
             }
         },
+        "response.MenuTreeResponse": {
+            "type": "object",
+            "properties": {
+                "list": {
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.Menu"
+                    }
+                }
+            }
+        },
         "response.PageResult": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 1a9724c..5a70e9f 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -384,6 +384,24 @@
       start_time:
         type: string
     type: object
+  model.Menu:
+    properties:
+      children:
+        items:
+          $ref: '#/definitions/model.Menu'
+        type: array
+      id:
+        description: 涓婚敭ID
+        type: integer
+      name:
+        type: string
+      parentId:
+        type: integer
+      path:
+        type: string
+      title:
+        type: string
+    type: object
   model.Plan:
     properties:
       clientId:
@@ -849,6 +867,11 @@
       userType:
         $ref: '#/definitions/constvar.UserType'
       username:
+        type: string
+    type: object
+  request.AddAuthority:
+    properties:
+      authorityName:
         type: string
     type: object
   request.AddCity:
@@ -2673,6 +2696,13 @@
           $ref: '#/definitions/model.MasterOrder'
         type: array
     type: object
+  response.MenuTreeResponse:
+    properties:
+      list:
+        items:
+          $ref: '#/definitions/model.Menu'
+        type: array
+    type: object
   response.PageResult:
     properties:
       list: {}
@@ -2810,6 +2840,29 @@
 info:
   contact: {}
 paths:
+  /api/authority/add:
+    post:
+      consumes:
+      - application/json
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddAuthority'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      security:
+      - ApiKeyAuth: []
+      summary: 鍒涘缓瑙掕壊
+      tags:
+      - Authority
   /api/base/captcha:
     post:
       produces:
@@ -3978,6 +4031,23 @@
       summary: 鏇存柊涓昏鍗�
       tags:
       - MasterOrder
+  /api/menu/getMenu:
+    get:
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            allOf:
+            - $ref: '#/definitions/contextx.Response'
+            - properties:
+                data:
+                  $ref: '#/definitions/response.MenuTreeResponse'
+              type: object
+      summary: 鑾峰彇鑿滃崟鏍�
+      tags:
+      - Menu
   /api/orderManage/add:
     post:
       parameters:
@@ -5684,4 +5754,23 @@
       summary: 璁剧疆鐢ㄦ埛淇℃伅
       tags:
       - User
+  /authority/setDataAuthority:
+    post:
+      consumes:
+      - application/json
+      parameters:
+      - description: 璁剧疆瑙掕壊璧勬簮鏉冮檺
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddAuthority'
+      produces:
+      - application/json
+      responses: {}
+      security:
+      - ApiKeyAuth: []
+      summary: 璁剧疆瑙掕壊璧勬簮鏉冮檺
+      tags:
+      - Authority
 swagger: "2.0"
diff --git a/go.mod b/go.mod
index 97c17fa..0abb619 100644
--- a/go.mod
+++ b/go.mod
@@ -3,9 +3,13 @@
 go 1.20
 
 require (
+	github.com/casbin/casbin/v2 v2.68.0
+	github.com/casbin/gorm-adapter/v3 v3.7.3
+	github.com/flipped-aurora/gin-vue-admin/server v0.0.0-20230711142447-66d119bef3a6
 	github.com/gin-contrib/cors v1.4.0
 	github.com/gin-gonic/gin v1.9.1
 	github.com/go-redis/redis/v8 v8.11.5
+	github.com/go-sql-driver/mysql v1.7.1
 	github.com/gofrs/uuid v4.4.0+incompatible
 	github.com/golang-jwt/jwt/v4 v4.5.0
 	github.com/gorilla/websocket v1.5.0
@@ -30,6 +34,7 @@
 )
 
 require (
+	github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible // indirect
 	github.com/KyleBanks/depth v1.2.1 // indirect
 	github.com/bytedance/sonic v1.9.1 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
@@ -38,57 +43,81 @@
 	github.com/coreos/go-systemd/v22 v22.3.2 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+	github.com/dustin/go-humanize v1.0.1 // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/gabriel-vasile/mimetype v1.4.2 // indirect
 	github.com/gin-contrib/sse v0.1.0 // indirect
+	github.com/glebarez/go-sqlite v1.21.1 // indirect
+	github.com/glebarez/sqlite v1.8.0 // indirect
+	github.com/go-ole/go-ole v1.2.6 // indirect
 	github.com/go-openapi/jsonpointer v0.19.6 // indirect
-	github.com/go-openapi/jsonreference v0.20.1 // indirect
-	github.com/go-openapi/spec v0.20.4 // indirect
+	github.com/go-openapi/jsonreference v0.20.2 // indirect
+	github.com/go-openapi/spec v0.20.9 // indirect
 	github.com/go-openapi/swag v0.22.3 // indirect
 	github.com/go-playground/locales v0.14.1 // indirect
 	github.com/go-playground/universal-translator v0.18.1 // indirect
 	github.com/go-playground/validator/v10 v10.14.0 // indirect
-	github.com/go-sql-driver/mysql v1.7.0 // indirect
 	github.com/goccy/go-json v0.10.2 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
+	github.com/golang-sql/sqlexp v0.1.0 // indirect
 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
 	github.com/golang/protobuf v1.5.3 // indirect
+	github.com/google/uuid v1.3.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
+	github.com/jackc/pgpassfile v1.0.0 // indirect
+	github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
+	github.com/jackc/pgx/v5 v5.3.1 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/klauspost/cpuid/v2 v2.2.4 // indirect
 	github.com/leodido/go-urn v1.2.4 // indirect
+	github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
 	github.com/magiconair/properties v1.8.7 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/mattn/go-isatty v0.0.19 // indirect
+	github.com/microsoft/go-mssqldb v1.1.0 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/onsi/gomega v1.27.4 // indirect
 	github.com/pelletier/go-toml/v2 v2.0.8 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
+	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
+	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
 	github.com/rogpeppe/go-internal v1.10.0 // indirect
+	github.com/shirou/gopsutil/v3 v3.22.5 // indirect
 	github.com/spf13/afero v1.9.5 // indirect
 	github.com/spf13/cast v1.5.1 // indirect
 	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
 	github.com/subosito/gotenv v1.4.2 // indirect
+	github.com/tklauser/go-sysconf v0.3.10 // indirect
+	github.com/tklauser/numcpus v0.4.0 // indirect
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.11 // indirect
+	github.com/yusufpapurcu/wmi v1.2.2 // indirect
 	go.etcd.io/etcd/api/v3 v3.5.9 // indirect
 	go.uber.org/atomic v1.9.0 // indirect
 	go.uber.org/multierr v1.8.0 // indirect
 	golang.org/x/arch v0.3.0 // indirect
-	golang.org/x/image v0.0.0-20190802002840-cff245a6509b // indirect
+	golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb // indirect
 	golang.org/x/net v0.10.0 // indirect
 	golang.org/x/sys v0.9.0 // indirect
 	golang.org/x/text v0.10.0 // indirect
-	golang.org/x/tools v0.7.0 // indirect
+	golang.org/x/tools v0.9.1 // indirect
 	google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
 	google.golang.org/grpc v1.55.0 // indirect
 	google.golang.org/protobuf v1.30.0 // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
+	gorm.io/driver/postgres v1.5.2 // indirect
+	gorm.io/driver/sqlserver v1.5.1 // indirect
+	gorm.io/plugin/dbresolver v1.4.1 // indirect
+	modernc.org/libc v1.24.1 // indirect
+	modernc.org/mathutil v1.5.0 // indirect
+	modernc.org/memory v1.6.0 // indirect
+	modernc.org/sqlite v1.23.0 // indirect
 )
diff --git a/go.sum b/go.sum
index 20b260c..78b302a 100644
--- a/go.sum
+++ b/go.sum
@@ -36,17 +36,30 @@
 cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U=
+github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM=
+github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw=
+github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
 github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
-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/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
 github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
 github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
 github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
+github.com/casbin/casbin/v2 v2.37.4/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg=
+github.com/casbin/casbin/v2 v2.68.0 h1:7L4kwNJJw/pzdSEhl4SkeHz+1JzYn8guO+Q422sxzLM=
+github.com/casbin/casbin/v2 v2.68.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg=
+github.com/casbin/gorm-adapter/v3 v3.7.3 h1:tp3EL3vS31dF+GX0n3QwUytQlrFOPXtOKKZ7SZtLOA8=
+github.com/casbin/gorm-adapter/v3 v3.7.3/go.mod h1:7mwHmC2phiw6N4gDWlzi+c4DUX7zaVmQC/hINsRgBDg=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
 github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@@ -60,22 +73,34 @@
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
 github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko=
+github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
+github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/flipped-aurora/gin-vue-admin/server v0.0.0-20230711142447-66d119bef3a6 h1:XveeHLMjytjP3KnJLilyl3mAj1MA8rnhT7ZjHyvui9A=
+github.com/flipped-aurora/gin-vue-admin/server v0.0.0-20230711142447-66d119bef3a6/go.mod h1:gBmLLECfwvX2SlVwtzeFuDF/2IUb/tr99lCsXxyuyBs=
 github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
 github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
@@ -89,18 +114,28 @@
 github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
 github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
 github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
+github.com/glebarez/go-sqlite v1.16.0/go.mod h1:i8/JtqoqzBAFkrUTxbQFkQ05odCOds3j7NlDaXjqiPY=
+github.com/glebarez/go-sqlite v1.21.1 h1:7MZyUPh2XTrHS7xNEHQbrhfMZuPSzhkm2A1qgg0y5NY=
+github.com/glebarez/go-sqlite v1.21.1/go.mod h1:ISs8MF6yk5cL4n/43rSOmVMGJJjHYr7L2MbZZ5Q4E2E=
+github.com/glebarez/sqlite v1.4.3/go.mod h1:FcJlwP9scnxlQ5zxyl0+bn/qFjYcqG4eRvKYhs39QAQ=
+github.com/glebarez/sqlite v1.8.0 h1:02X12E2I/4C1n+v90yTqrjRa8yuo7c3KeHI3FRznCvc=
+github.com/glebarez/sqlite v1.8.0/go.mod h1:bpET16h1za2KOOMb8+jCp6UBP/iahDpfPQqSaYLTLx8=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+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=
+github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
 github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
-github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
-github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=
-github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
-github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
-github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
+github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=
+github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
+github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8=
+github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
 github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
@@ -118,18 +153,30 @@
 github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
 github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
-github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
+github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
+github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
+github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
 github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA=
 github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
 github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
+github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
+github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
+github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8=
+github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
+github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -142,6 +189,7 @@
 github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
 github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
 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=
@@ -170,8 +218,11 @@
 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 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/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
@@ -187,21 +238,78 @@
 github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
+github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
+github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
 github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
 github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
+github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
+github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
+github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
+github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
+github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
+github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
+github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
+github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
+github.com/jackc/pgconn v1.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
+github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
+github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
+github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
+github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
+github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
+github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
+github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
+github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
+github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
+github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
+github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
+github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
+github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
+github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
+github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
+github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
+github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
+github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
+github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
+github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
+github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
+github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
+github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
+github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw=
+github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU=
+github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8=
+github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
+github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
+github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo=
+github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
+github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs=
+github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
 github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
 github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
@@ -211,23 +319,35 @@
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
 github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
 github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
 github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
 github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
+github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
+github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
 github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
 github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
@@ -235,9 +355,17 @@
 github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
+github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
 github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
 github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
+github.com/microsoft/go-mssqldb v1.1.0 h1:jsV+tpvcPTbNNKW0o3kiCD69kOHICsfjZ2VcVu2lKYc=
+github.com/microsoft/go-mssqldb v1.1.0/go.mod h1:LzkFdl4z2Ck+Hi+ycGOTbL56VEfgoyA2DvYejrNGbRk=
 github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
 github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -245,8 +373,10 @@
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 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/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
 github.com/mojocn/base64Captcha v1.3.5 h1:Qeilr7Ta6eDtG4S+tQuZ5+hO+QHbiGAJdi4PfoagaA0=
 github.com/mojocn/base64Captcha v1.3.5/go.mod h1:/tTTXn4WTpX9CfrmipqRytCpJ27Uw3G6I7NcP2WwcmY=
+github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
@@ -255,6 +385,8 @@
 github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
 github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
 github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
+github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
+github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
 github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -262,7 +394,12 @@
 github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
+github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
 github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
 github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
@@ -270,6 +407,16 @@
 github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
 github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
 github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
+github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
+github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
+github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/shirou/gopsutil/v3 v3.22.5 h1:atX36I/IXgFiB81687vSiBI5zrMsxcIBkP9cQMJQoJA=
+github.com/shirou/gopsutil/v3 v3.22.5/go.mod h1:so9G9VzeHt/hsd0YwqprnjHnfARAUktauykSbr+y2gA=
+github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
+github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 github.com/songzhibin97/gkit v1.2.11 h1:O8+l6eLMrZ2yNbT6Vohc6ggWnH5zt4P8/3ZEkf8jUL4=
 github.com/songzhibin97/gkit v1.2.11/go.mod h1:axjYsiJWnn/kf/uGiUr9JPHRlt2CQrqfq/fPZ3xIY+M=
 github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM=
@@ -283,6 +430,8 @@
 github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc=
 github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
@@ -306,6 +455,10 @@
 github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
 github.com/swaggo/swag v1.16.1 h1:fTNRhKstPKxcnoKsytm4sahr8FaYzUcT7i1/3nd/fBg=
 github.com/swaggo/swag v1.16.1/go.mod h1:9/LMvHycG3NFHfR6LwvikHv5iFvmPADQ359cKikGxto=
+github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw=
+github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
+github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o=
+github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ=
 github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
 github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
 github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
@@ -318,6 +471,9 @@
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
+github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
 go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs=
 go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k=
 go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE=
@@ -330,15 +486,26 @@
 go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
 go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
 go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
 go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
 go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
+go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
 go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
 go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
 go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
@@ -346,14 +513,23 @@
 golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
 golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
+golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
+golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
 golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
 golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -368,8 +544,9 @@
 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb h1:fqpd0EBDzlHRCjiphRR5Zo/RSWWQlWv34418dnEixWk=
+golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -393,7 +570,8 @@
 golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -406,6 +584,7 @@
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/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-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -426,10 +605,12 @@
 golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
+golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
 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=
@@ -453,21 +634,30 @@
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
 golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -483,29 +673,40 @@
 golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
 golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -515,6 +716,8 @@
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
 golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -527,14 +730,18 @@
 golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -542,6 +749,7 @@
 golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
@@ -563,6 +771,7 @@
 golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
 golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
@@ -571,8 +780,11 @@
 golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
-golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
+golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
+golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -680,11 +892,15 @@
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 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.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
 gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU=
+gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
@@ -694,11 +910,29 @@
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.0.3/go.mod h1:twGxftLBlFgNVNakL7F+P/x9oYqoymG3YYT8cAfI9oI=
+gorm.io/driver/mysql v1.3.3/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U=
+gorm.io/driver/mysql v1.4.3/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c=
 gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw=
 gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o=
+gorm.io/driver/postgres v1.3.4/go.mod h1:y0vEuInFKJtijuSGu9e5bs5hzzSzPK+LancpKpvbRBw=
+gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0=
+gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8=
+gorm.io/driver/sqlserver v1.3.2/go.mod h1:w25Vrx2BG+CJNUu/xKbFhaKlGxT/nzRkhWCCoptX8tQ=
+gorm.io/driver/sqlserver v1.5.1 h1:wpyW/pR26U94uaujltiFGXY7fd2Jw5hC9PB1ZF/Y5s4=
+gorm.io/driver/sqlserver v1.5.1/go.mod h1:AYHzzte2msKTmYBYsSIq8ZUsznLJwBdkB2wpI+kt0nM=
+gorm.io/gorm v1.20.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
+gorm.io/gorm v1.20.11/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
+gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
+gorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
 gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
+gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
+gorm.io/gorm v1.24.3/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
 gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64=
 gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
+gorm.io/plugin/dbresolver v1.1.0/go.mod h1:tpImigFAEejCALOttyhWqsy4vfa2Uh/vAUVnL5IRF7Y=
+gorm.io/plugin/dbresolver v1.4.1 h1:Ug4LcoPhrvqq71UhxtF346f+skTYoCa/nEsdjvHwEzk=
+gorm.io/plugin/dbresolver v1.4.1/go.mod h1:CTbCtMWhsjXSiJqiW2R8POvJ2cq18RVOl4WGyT5nhNc=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -706,6 +940,148 @@
 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
+modernc.org/cc/v3 v3.33.6/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.33.9/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.33.11/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.34.0/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.0/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.4/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.5/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.7/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.8/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.10/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.15/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.16/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.17/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.18/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.20/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.22/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
+modernc.org/cc/v3 v3.35.24/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
+modernc.org/cc/v3 v3.35.25/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
+modernc.org/cc/v3 v3.35.26/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
+modernc.org/ccgo/v3 v3.9.5/go.mod h1:umuo2EP2oDSBnD3ckjaVUXMrmeAw8C8OSICVa0iFf60=
+modernc.org/ccgo/v3 v3.10.0/go.mod h1:c0yBmkRFi7uW4J7fwx/JiijwOjeAeR2NoSaRVFPmjMw=
+modernc.org/ccgo/v3 v3.11.0/go.mod h1:dGNposbDp9TOZ/1KBxghxtUp/bzErD0/0QW4hhSaBMI=
+modernc.org/ccgo/v3 v3.11.1/go.mod h1:lWHxfsn13L3f7hgGsGlU28D9eUOf6y3ZYHKoPaKU0ag=
+modernc.org/ccgo/v3 v3.11.3/go.mod h1:0oHunRBMBiXOKdaglfMlRPBALQqsfrCKXgw9okQ3GEw=
+modernc.org/ccgo/v3 v3.12.4/go.mod h1:Bk+m6m2tsooJchP/Yk5ji56cClmN6R1cqc9o/YtbgBQ=
+modernc.org/ccgo/v3 v3.12.6/go.mod h1:0Ji3ruvpFPpz+yu+1m0wk68pdr/LENABhTrDkMDWH6c=
+modernc.org/ccgo/v3 v3.12.8/go.mod h1:Hq9keM4ZfjCDuDXxaHptpv9N24JhgBZmUG5q60iLgUo=
+modernc.org/ccgo/v3 v3.12.11/go.mod h1:0jVcmyDwDKDGWbcrzQ+xwJjbhZruHtouiBEvDfoIsdg=
+modernc.org/ccgo/v3 v3.12.14/go.mod h1:GhTu1k0YCpJSuWwtRAEHAol5W7g1/RRfS4/9hc9vF5I=
+modernc.org/ccgo/v3 v3.12.18/go.mod h1:jvg/xVdWWmZACSgOiAhpWpwHWylbJaSzayCqNOJKIhs=
+modernc.org/ccgo/v3 v3.12.20/go.mod h1:aKEdssiu7gVgSy/jjMastnv/q6wWGRbszbheXgWRHc8=
+modernc.org/ccgo/v3 v3.12.21/go.mod h1:ydgg2tEprnyMn159ZO/N4pLBqpL7NOkJ88GT5zNU2dE=
+modernc.org/ccgo/v3 v3.12.22/go.mod h1:nyDVFMmMWhMsgQw+5JH6B6o4MnZ+UQNw1pp52XYFPRk=
+modernc.org/ccgo/v3 v3.12.25/go.mod h1:UaLyWI26TwyIT4+ZFNjkyTbsPsY3plAEB6E7L/vZV3w=
+modernc.org/ccgo/v3 v3.12.29/go.mod h1:FXVjG7YLf9FetsS2OOYcwNhcdOLGt8S9bQ48+OP75cE=
+modernc.org/ccgo/v3 v3.12.36/go.mod h1:uP3/Fiezp/Ga8onfvMLpREq+KUjUmYMxXPO8tETHtA8=
+modernc.org/ccgo/v3 v3.12.38/go.mod h1:93O0G7baRST1vNj4wnZ49b1kLxt0xCW5Hsa2qRaZPqc=
+modernc.org/ccgo/v3 v3.12.43/go.mod h1:k+DqGXd3o7W+inNujK15S5ZYuPoWYLpF5PYougCmthU=
+modernc.org/ccgo/v3 v3.12.46/go.mod h1:UZe6EvMSqOxaJ4sznY7b23/k13R8XNlyWsO5bAmSgOE=
+modernc.org/ccgo/v3 v3.12.47/go.mod h1:m8d6p0zNps187fhBwzY/ii6gxfjob1VxWb919Nk1HUk=
+modernc.org/ccgo/v3 v3.12.50/go.mod h1:bu9YIwtg+HXQxBhsRDE+cJjQRuINuT9PUK4orOco/JI=
+modernc.org/ccgo/v3 v3.12.51/go.mod h1:gaIIlx4YpmGO2bLye04/yeblmvWEmE4BBBls4aJXFiE=
+modernc.org/ccgo/v3 v3.12.53/go.mod h1:8xWGGTFkdFEWBEsUmi+DBjwu/WLy3SSOrqEmKUjMeEg=
+modernc.org/ccgo/v3 v3.12.54/go.mod h1:yANKFTm9llTFVX1FqNKHE0aMcQb1fuPJx6p8AcUx+74=
+modernc.org/ccgo/v3 v3.12.55/go.mod h1:rsXiIyJi9psOwiBkplOaHye5L4MOOaCjHg1Fxkj7IeU=
+modernc.org/ccgo/v3 v3.12.56/go.mod h1:ljeFks3faDseCkr60JMpeDb2GSO3TKAmrzm7q9YOcMU=
+modernc.org/ccgo/v3 v3.12.57/go.mod h1:hNSF4DNVgBl8wYHpMvPqQWDQx8luqxDnNGCMM4NFNMc=
+modernc.org/ccgo/v3 v3.12.60/go.mod h1:k/Nn0zdO1xHVWjPYVshDeWKqbRWIfif5dtsIOCUVMqM=
+modernc.org/ccgo/v3 v3.12.66/go.mod h1:jUuxlCFZTUZLMV08s7B1ekHX5+LIAurKTTaugUr/EhQ=
+modernc.org/ccgo/v3 v3.12.67/go.mod h1:Bll3KwKvGROizP2Xj17GEGOTrlvB1XcVaBrC90ORO84=
+modernc.org/ccgo/v3 v3.12.73/go.mod h1:hngkB+nUUqzOf3iqsM48Gf1FZhY599qzVg1iX+BT3cQ=
+modernc.org/ccgo/v3 v3.12.81/go.mod h1:p2A1duHoBBg1mFtYvnhAnQyI6vL0uw5PGYLSIgF6rYY=
+modernc.org/ccgo/v3 v3.12.84/go.mod h1:ApbflUfa5BKadjHynCficldU1ghjen84tuM5jRynB7w=
+modernc.org/ccgo/v3 v3.12.86/go.mod h1:dN7S26DLTgVSni1PVA3KxxHTcykyDurf3OgUzNqTSrU=
+modernc.org/ccgo/v3 v3.12.90/go.mod h1:obhSc3CdivCRpYZmrvO88TXlW0NvoSVvdh/ccRjJYko=
+modernc.org/ccgo/v3 v3.12.92/go.mod h1:5yDdN7ti9KWPi5bRVWPl8UNhpEAtCjuEE7ayQnzzqHA=
+modernc.org/ccgo/v3 v3.13.1/go.mod h1:aBYVOUfIlcSnrsRVU8VRS35y2DIfpgkmVkYZ0tpIXi4=
+modernc.org/ccgo/v3 v3.15.9/go.mod h1:md59wBwDT2LznX/OTCPoVS6KIsdRgY8xqQwBV+hkTH0=
+modernc.org/ccgo/v3 v3.15.10/go.mod h1:wQKxoFn0ynxMuCLfFD09c8XPUCc8obfchoVR9Cn0fI8=
+modernc.org/ccgo/v3 v3.15.12/go.mod h1:VFePOWoCd8uDGRJpq/zfJ29D0EVzMSyID8LCMWYbX6I=
+modernc.org/ccgo/v3 v3.15.14/go.mod h1:144Sz2iBCKogb9OKwsu7hQEub3EVgOlyI8wMUPGKUXQ=
+modernc.org/ccgo/v3 v3.15.15/go.mod h1:z5qltXjU4PJl0pE5nhYQCvA9DhPHiWsl5GWl89+NSYE=
+modernc.org/ccgo/v3 v3.15.16/go.mod h1:XbKRMeMWMdq712Tr5ECgATYMrzJ+g9zAZEj2ktzBe24=
+modernc.org/ccgo/v3 v3.15.17/go.mod h1:bofnFkpRFf5gLY+mBZIyTW6FEcp26xi2lgOFk2Rlvs0=
+modernc.org/ccgo/v3 v3.15.18/go.mod h1:/2lv3WjHyanEr2sAPdGKRC38n6f0werut9BRXUjjX+A=
+modernc.org/ccgo/v3 v3.15.19/go.mod h1:TDJj+DxR26pkDteH2E5WQDj/xlmtsX7JdzkJkaZhOVU=
+modernc.org/ccgo/v3 v3.16.2/go.mod h1:w55kPTAqvRMAYS3Lwij6qhqIuBEYS3Z8QtDkjD8cnik=
+modernc.org/ccorpus v1.11.1/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
+modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
+modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
+modernc.org/libc v1.9.8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w=
+modernc.org/libc v1.9.11/go.mod h1:NyF3tsA5ArIjJ83XB0JlqhjTabTCHm9aX4XMPHyQn0Q=
+modernc.org/libc v1.11.0/go.mod h1:2lOfPmj7cz+g1MrPNmX65QCzVxgNq2C5o0jdLY2gAYg=
+modernc.org/libc v1.11.2/go.mod h1:ioIyrl3ETkugDO3SGZ+6EOKvlP3zSOycUETe4XM4n8M=
+modernc.org/libc v1.11.5/go.mod h1:k3HDCP95A6U111Q5TmG3nAyUcp3kR5YFZTeDS9v8vSU=
+modernc.org/libc v1.11.6/go.mod h1:ddqmzR6p5i4jIGK1d/EiSw97LBcE3dK24QEwCFvgNgE=
+modernc.org/libc v1.11.11/go.mod h1:lXEp9QOOk4qAYOtL3BmMve99S5Owz7Qyowzvg6LiZso=
+modernc.org/libc v1.11.13/go.mod h1:ZYawJWlXIzXy2Pzghaf7YfM8OKacP3eZQI81PDLFdY8=
+modernc.org/libc v1.11.16/go.mod h1:+DJquzYi+DMRUtWI1YNxrlQO6TcA5+dRRiq8HWBWRC8=
+modernc.org/libc v1.11.19/go.mod h1:e0dgEame6mkydy19KKaVPBeEnyJB4LGNb0bBH1EtQ3I=
+modernc.org/libc v1.11.24/go.mod h1:FOSzE0UwookyT1TtCJrRkvsOrX2k38HoInhw+cSCUGk=
+modernc.org/libc v1.11.26/go.mod h1:SFjnYi9OSd2W7f4ct622o/PAYqk7KHv6GS8NZULIjKY=
+modernc.org/libc v1.11.27/go.mod h1:zmWm6kcFXt/jpzeCgfvUNswM0qke8qVwxqZrnddlDiE=
+modernc.org/libc v1.11.28/go.mod h1:Ii4V0fTFcbq3qrv3CNn+OGHAvzqMBvC7dBNyC4vHZlg=
+modernc.org/libc v1.11.31/go.mod h1:FpBncUkEAtopRNJj8aRo29qUiyx5AvAlAxzlx9GNaVM=
+modernc.org/libc v1.11.34/go.mod h1:+Tzc4hnb1iaX/SKAutJmfzES6awxfU1BPvrrJO0pYLg=
+modernc.org/libc v1.11.37/go.mod h1:dCQebOwoO1046yTrfUE5nX1f3YpGZQKNcITUYWlrAWo=
+modernc.org/libc v1.11.39/go.mod h1:mV8lJMo2S5A31uD0k1cMu7vrJbSA3J3waQJxpV4iqx8=
+modernc.org/libc v1.11.42/go.mod h1:yzrLDU+sSjLE+D4bIhS7q1L5UwXDOw99PLSX0BlZvSQ=
+modernc.org/libc v1.11.44/go.mod h1:KFq33jsma7F5WXiYelU8quMJasCCTnHK0mkri4yPHgA=
+modernc.org/libc v1.11.45/go.mod h1:Y192orvfVQQYFzCNsn+Xt0Hxt4DiO4USpLNXBlXg/tM=
+modernc.org/libc v1.11.47/go.mod h1:tPkE4PzCTW27E6AIKIR5IwHAQKCAtudEIeAV1/SiyBg=
+modernc.org/libc v1.11.49/go.mod h1:9JrJuK5WTtoTWIFQ7QjX2Mb/bagYdZdscI3xrvHbXjE=
+modernc.org/libc v1.11.51/go.mod h1:R9I8u9TS+meaWLdbfQhq2kFknTW0O3aw3kEMqDDxMaM=
+modernc.org/libc v1.11.53/go.mod h1:5ip5vWYPAoMulkQ5XlSJTy12Sz5U6blOQiYasilVPsU=
+modernc.org/libc v1.11.54/go.mod h1:S/FVnskbzVUrjfBqlGFIPA5m7UwB3n9fojHhCNfSsnw=
+modernc.org/libc v1.11.55/go.mod h1:j2A5YBRm6HjNkoSs/fzZrSxCuwWqcMYTDPLNx0URn3M=
+modernc.org/libc v1.11.56/go.mod h1:pakHkg5JdMLt2OgRadpPOTnyRXm/uzu+Yyg/LSLdi18=
+modernc.org/libc v1.11.58/go.mod h1:ns94Rxv0OWyoQrDqMFfWwka2BcaF6/61CqJRK9LP7S8=
+modernc.org/libc v1.11.71/go.mod h1:DUOmMYe+IvKi9n6Mycyx3DbjfzSKrdr/0Vgt3j7P5gw=
+modernc.org/libc v1.11.75/go.mod h1:dGRVugT6edz361wmD9gk6ax1AbDSe0x5vji0dGJiPT0=
+modernc.org/libc v1.11.82/go.mod h1:NF+Ek1BOl2jeC7lw3a7Jj5PWyHPwWD4aq3wVKxqV1fI=
+modernc.org/libc v1.11.86/go.mod h1:ePuYgoQLmvxdNT06RpGnaDKJmDNEkV7ZPKI2jnsvZoE=
+modernc.org/libc v1.11.87/go.mod h1:Qvd5iXTeLhI5PS0XSyqMY99282y+3euapQFxM7jYnpY=
+modernc.org/libc v1.11.88/go.mod h1:h3oIVe8dxmTcchcFuCcJ4nAWaoiwzKCdv82MM0oiIdQ=
+modernc.org/libc v1.11.98/go.mod h1:ynK5sbjsU77AP+nn61+k+wxUGRx9rOFcIqWYYMaDZ4c=
+modernc.org/libc v1.11.101/go.mod h1:wLLYgEiY2D17NbBOEp+mIJJJBGSiy7fLL4ZrGGZ+8jI=
+modernc.org/libc v1.12.0/go.mod h1:2MH3DaF/gCU8i/UBiVE1VFRos4o523M7zipmwH8SIgQ=
+modernc.org/libc v1.14.1/go.mod h1:npFeGWjmZTjFeWALQLrvklVmAxv4m80jnG3+xI8FdJk=
+modernc.org/libc v1.14.2/go.mod h1:MX1GBLnRLNdvmK9azU9LCxZ5lMyhrbEMK8rG3X/Fe34=
+modernc.org/libc v1.14.3/go.mod h1:GPIvQVOVPizzlqyRX3l756/3ppsAgg1QgPxjr5Q4agQ=
+modernc.org/libc v1.14.6/go.mod h1:2PJHINagVxO4QW/5OQdRrvMYo+bm5ClpUFfyXCYl9ak=
+modernc.org/libc v1.14.7/go.mod h1:f8xfWXW8LW41qb4X5+huVQo5dcfPlq7Cbny2TDheMv0=
+modernc.org/libc v1.14.8/go.mod h1:9+JCLb1MWSY23smyOpIPbd5ED+rSS/ieiDWUpdyO3mo=
+modernc.org/libc v1.14.10/go.mod h1:y1MtIWhwpJFpLYm6grAThtuXJKEsY6xkdZmXbRngIdo=
+modernc.org/libc v1.14.11/go.mod h1:l5/Mz/GrZwOqzwRHA3abgSCnSeJzzTl+Ify0bAwKbAw=
+modernc.org/libc v1.14.12/go.mod h1:fJdoe23MHu2ruPQkFPPqCpToDi5cckzsbmkI6Ez0LqQ=
+modernc.org/libc v1.15.0/go.mod h1:H1OKCu+NYa9+uQG8WsP7DndMBP61I4PWH8ivWhbdoWQ=
+modernc.org/libc v1.15.1/go.mod h1:CoZ2riUhSNTAP4bADwpxkLCyJK9SbbMvle0YRzkRT/I=
+modernc.org/libc v1.24.1 h1:uvJSeCKL/AgzBo2yYIPPTy82v21KgGnizcGYfBHaNuM=
+modernc.org/libc v1.24.1/go.mod h1:FmfO1RLrU3MHJfyi9eYYmZBfi/R+tqZ6+hQ3yQQUkak=
+modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/mathutil v1.4.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=
+modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc=
+modernc.org/memory v1.0.5/go.mod h1:B7OYswTRnfGg+4tDH1t1OeUNnsy2viGTdME4tzd+IjM=
+modernc.org/memory v1.0.6/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
+modernc.org/memory v1.0.7/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
+modernc.org/memory v1.6.0 h1:i6mzavxrE9a30whzMfwf7XWVODx2r5OYXvU46cirX7o=
+modernc.org/memory v1.6.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
+modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
+modernc.org/sqlite v1.16.0/go.mod h1:Jwe13ItpESZ+78K5WS6+AjXsUg+JvirsjN3iIDO4C8k=
+modernc.org/sqlite v1.23.0 h1:MWTFBI5H1WLnXpNBh/BTruBVqzzoh28DA0iOnlkkRaM=
+modernc.org/sqlite v1.23.0/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk=
+modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
+modernc.org/tcl v1.11.2/go.mod h1:BRzgpajcGdS2qTxniOx9c/dcxjlbA7p12eJNmiriQYo=
+modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
+modernc.org/z v1.3.2/go.mod h1:PEU2oK2OEA1CfzDTd+8E908qEXhC9s0MfyKp5LZsd+k=
 moul.io/zapgorm2 v1.3.0 h1:+CzUTMIcnafd0d/BvBce8T4uPn6DQnpIrz64cyixlkk=
 moul.io/zapgorm2 v1.3.0/go.mod h1:nPVy6U9goFKHR4s+zfSo1xVFaoU7Qgd5DoCdOfzoCqs=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
diff --git a/logs/aps-admin.err.log b/logs/aps-admin.err.log
deleted file mode 100644
index 8baf3e6..0000000
--- a/logs/aps-admin.err.log
+++ /dev/null
@@ -1,363 +0,0 @@
-[2023-05-30 18:00:10]	[error]	[main.main:46]	listen tcp :8001: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
-[2023-05-30 18:03:20]	[error]	[main.main:46]	1111listen tcp :8001: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
-[2023-05-30 18:15:02]	[error]	[aps_admin/model.(*UserSearch).First:196]	trace	{"error": "record not found", "elapsed": 0.0005063, "rows": 0, "sql": "SELECT * FROM `user` WHERE username = '鐢ㄦ埛鍚�' ORDER BY `user`.`id` LIMIT 1"}
-[2023-05-30 18:31:12]	[error]	[aps_admin/model.(*DeviceSearch).First:50]	trace	{"error": "record not found", "elapsed": 0.0005965, "rows": 0, "sql": "SELECT * FROM `device` ORDER BY `device`.`id` LIMIT 1"}
-[2023-05-30 18:31:12]	[error]	[aps_admin/model.(*DeviceSearch).Create:84]	trace	{"error": "Error 1364 (HY000): Field 'id' doesn't have a default value", "elapsed": 0.0010052, "rows": 0, "sql": "INSERT INTO `device` (`name`,`ip`,`account`,`password`) VALUES ('璁惧鍚嶇О','璁惧IP','root璐﹀彿','$2a$10$MszYytZoKVX6tP1.Rbq6TeY2zTXsIhOEu/U/Cf6CC4XMegsGbmqlS')"}
-[2023-05-30 18:33:16]	[error]	[aps_admin/model.(*DeviceSearch).First:50]	trace	{"error": "record not found", "elapsed": 0.0020821, "rows": 0, "sql": "SELECT * FROM `device` ORDER BY `device`.`id` LIMIT 1"}
-[2023-05-31 14:22:53]	[error]	[aps_admin/api/v1.(*DeviceApi).Add:36]	device! err:&{0 189test 192.168.20.189 basic 123}
-[2023-05-31 14:22:53]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 189test 192.168.20.189 basic 123}
-[2023-05-31 14:27:39]	[error]	[aps_admin/api/v1.(*DeviceApi).Add:36]	device! err:&{0 璁惧鍚嶇О 璁惧IP root璐﹀彿 root瀵嗙爜}
-[2023-05-31 14:27:39]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 璁惧鍚嶇О 璁惧IP root璐﹀彿 root瀵嗙爜}
-[2023-05-31 14:33:34]	[error]	[aps_admin/api/v1.(*DeviceApi).Add:36]	device! err:&{0 189test 192.168.20.189 basic 123}
-[2023-05-31 14:33:34]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.0005033, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '189test' ORDER BY `device`.`id` LIMIT 1"}
-[2023-05-31 14:33:34]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 189test 192.168.20.189 basic 123}
-[2023-05-31 17:22:08]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.0052562, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '璁惧鍚嶇О' ORDER BY `device`.`id` LIMIT 1"}
-[2023-05-31 17:22:08]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 璁惧鍚嶇О 璁惧IP root璐﹀彿 root瀵嗙爜}
-[2023-05-31 17:22:14]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.0010507, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '璁惧鍚嶇О' ORDER BY `device`.`id` LIMIT 1"}
-[2023-05-31 17:22:14]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 璁惧鍚嶇О 璁惧IP root璐﹀彿 root瀵嗙爜}
-[2023-05-31 17:23:29]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.0005704, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '璁惧鍚嶇О' ORDER BY `device`.`id` LIMIT 1"}
-[2023-05-31 17:23:29]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 璁惧鍚嶇О 璁惧IP root璐﹀彿 root瀵嗙爜}
-[2023-05-31 17:23:39]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.000556, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '璁惧鍚嶇О' ORDER BY `device`.`id` LIMIT 1"}
-[2023-05-31 17:23:39]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 璁惧鍚嶇О 璁惧IP root璐﹀彿 root瀵嗙爜}
-[2023-05-31 17:23:50]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.0005385, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '璁惧鍚嶇О' ORDER BY `device`.`id` LIMIT 1"}
-[2023-05-31 17:23:50]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 璁惧鍚嶇О 璁惧IP root璐﹀彿 root11}
-[2023-05-31 17:24:00]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.0010769, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '111' ORDER BY `device`.`id` LIMIT 1"}
-[2023-05-31 17:24:00]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 111 璁惧IP root璐﹀彿 root11}
-[2023-05-31 17:26:19]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.0041733, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '111' ORDER BY `device`.`id` LIMIT 1"}
-[2023-05-31 17:26:19]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 111 璁惧IP root璐﹀彿 root11}
-[2023-05-31 20:01:57]	[error]	[aps_admin/api/v1.(*ClusterApi).GetClusters:59]	鑾峰彇澶辫触! err:failed to get cluster list request: parse "192.168.20.189:8443/v3/clusters": first path segment in URL cannot contain colon
-[2023-05-31 20:03:45]	[error]	[aps_admin/service.(*ClusterService).GetClusterList:37]	11111111 [   c-lbrzv local]
-[2023-06-01 15:01:28]	[error]	[aps_admin/api/v1.(*ClusterApi).GetClusters:59]	鑾峰彇澶辫触! err:failed to get cluster list: unexpected status code 405
-[2023-06-01 15:03:40]	[error]	[aps_admin/api/v1.(*ClusterApi).GetClusters:59]	鑾峰彇澶辫触! err:failed to get cluster list: unexpected status code 404
-[2023-06-01 15:58:29]	[error]	[aps_admin/api/v1.(*ClusterApi).GetClusters:59]	鑾峰彇澶辫触! err:failed to get cluster list: unexpected status code 405
-[2023-06-01 17:11:34]	[error]	[aps_admin/api/v1.(*ClusterApi).Examine:81]	port: 31835
-[2023-06-01 18:11:53]	[error]	[aps_admin/api/v1.(*ClusterApi).Examine:81]	port: 30397
-[2023-06-01 18:12:25]	[error]	[aps_admin/api/v1.(*ClusterApi).GetClusters:59]	鑾峰彇澶辫触! err:failed to get cluster list: unexpected status code 404
-[2023-06-01 18:14:02]	[error]	[aps_admin/api/v1.(*ClusterApi).Examine:81]	port: 31681
-[2023-06-01 18:26:21]	[error]	[aps_admin/api/v1.(*ClusterApi).Examine:81]	port: 0
-[2023-06-01 18:30:40]	[error]	[aps_admin/api/v1.(*ClusterApi).Examine:81]	port: 30246
-[2023-06-01 18:47:03]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:359]	port: 0
-[2023-06-01 19:51:41]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:359]	port: 30272
-[2023-06-01 19:53:22]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:359]	port: 0
-[2023-06-02 10:07:46]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.0050154, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '璁惧鍚嶇О' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-02 10:07:46]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 璁惧鍚嶇О 璁惧IP root璐﹀彿 root瀵嗙爜}
-[2023-06-02 11:02:58]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.0054478, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '璁惧鍚嶇О' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-02 11:02:58]	[error]	[aps_admin/service.(*DeviceService).AddDevice:17]	device! err:&{0 璁惧鍚嶇О 璁惧IP root璐﹀彿 root瀵嗙爜}
-[2023-06-04 19:00:47]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:359]	port: 0
-[2023-06-04 19:00:47]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:362]	瀹℃牳澶辫触! err:no ETCD pods found
-[2023-06-04 19:44:29]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:359]	port: 32287
-[2023-06-05 10:21:35]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.0071569, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '璁惧鍚嶇О' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-05 10:21:35]	[error]	[aps_admin/service.(*DeviceService).AddDevice:17]	device! err:&{0 璁惧鍚嶇О 璁惧IP root璐﹀彿 root瀵嗙爜}
-[2023-06-05 11:53:23]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 32622
-[2023-06-05 12:04:02]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 31192
-[2023-06-05 13:39:12]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 0
-[2023-06-05 13:39:12]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:364]	瀹℃牳澶辫触! err:failed to create Deployment: deployments.apps "wpf" is forbidden: unable to create new content in namespace wpf because it is being terminated
-[2023-06-05 13:39:47]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 30745
-[2023-06-05 14:27:03]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 31372
-[2023-06-05 14:30:53]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.0010616, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '2' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-05 14:30:53]	[error]	[aps_admin/service.(*DeviceService).AddDevice:17]	device! err:&{0 2 2 2 2}
-[2023-06-05 14:49:56]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 31867
-[2023-06-05 15:22:27]	[error]	[aps_admin/model.(*DeviceSearch).First:54]	trace	{"error": "record not found", "elapsed": 0.0005096, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '璁惧鍚嶇О' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-05 15:22:27]	[error]	[aps_admin/service.(*DeviceService).AddDevice:17]	device! err:&{0 璁惧鍚嶇О 192.168.20.119 root璐﹀彿 $2a$10$SeKKQpa6BfBL49Q3GmFGIe1MWBPZGCFayUTiT2GAibKxCs4/Lxbr.}
-[2023-06-05 16:32:07]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 31587
-[2023-06-05 16:46:24]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 32571
-[2023-06-05 17:25:46]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 0
-[2023-06-05 17:25:46]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:364]	瀹℃牳澶辫触! err:no ports defined for Service wangpengfei
-[2023-06-05 17:26:37]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 0
-[2023-06-05 17:26:37]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:364]	瀹℃牳澶辫触! err:no ports defined for Service wangpengfei
-[2023-06-05 17:32:36]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 0
-[2023-06-05 17:32:36]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:364]	瀹℃牳澶辫触! err:no ports defined for Service wangpengfei
-[2023-06-05 17:36:49]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 0
-[2023-06-05 17:36:49]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:364]	瀹℃牳澶辫触! err:no ports defined for Service wangpengfei
-[2023-06-05 17:41:42]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 0
-[2023-06-05 17:41:42]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:364]	瀹℃牳澶辫触! err:no ports defined for Service wangpengfei
-[2023-06-05 17:50:41]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 0
-[2023-06-05 17:50:41]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:364]	瀹℃牳澶辫触! err:no ports defined for Service wangpengfei
-[2023-06-05 18:05:57]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 32187
-[2023-06-05 18:14:13]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 31374
-[2023-06-05 18:27:36]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 0
-[2023-06-05 18:29:05]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 30343
-[2023-06-05 18:46:10]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 31900
-[2023-06-05 19:23:39]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 30128
-[2023-06-05 20:30:49]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 30404
-[2023-06-05 20:38:00]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 32274
-[2023-06-05 20:49:32]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 31106
-[2023-06-05 20:59:19]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 31546
-[2023-06-05 21:10:01]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:361]	port: 32594
-[2023-06-07 11:22:53]	[error]	[aps_admin/service.pass:119]	etcd.NewServiceRegister err:context deadline exceeded
-[2023-06-07 11:22:53]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:382]	port: 0
-[2023-06-07 11:22:53]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:385]	瀹℃牳澶辫触! err:context deadline exceeded
-[2023-06-07 15:51:42]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:382]	port: 0
-[2023-06-07 15:51:42]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:385]	瀹℃牳澶辫触! err:failed to create Deployment: Deployment.apps "wpf1" is invalid: spec.template.spec.containers[0].image: Required value
-[2023-06-07 15:57:18]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:382]	port: 30577
-[2023-06-07 18:25:41]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:383]	123123123123123123123123: 192.168.20.118
-[2023-06-08 11:33:25]	[error]	[aps_admin/api/v1.(*ClusterApi).GetClusters:67]	鑾峰彇澶辫触! err:failed to get cluster list request: parse "192.168.20.119:8443/v3/clusters": first path segment in URL cannot contain colon
-[2023-06-08 11:33:27]	[error]	[aps_admin/api/v1.(*ClusterApi).GetClusters:67]	鑾峰彇澶辫触! err:failed to get cluster list request: parse "192.168.20.119:8443/v3/clusters": first path segment in URL cannot contain colon
-[2023-06-08 11:35:12]	[error]	[aps_admin/api/v1.(*ClusterApi).GetClusters:67]	鑾峰彇澶辫触! err:failed to get cluster list request: parse "192.168.20.119:8443/v3/clusters": first path segment in URL cannot contain colon
-[2023-06-08 11:41:27]	[error]	[aps_admin/api/v1.(*ClusterApi).GetClusters:67]	鑾峰彇澶辫触! err:failed to get cluster list request: parse "192.168.20.119:8443/v3/clusters": first path segment in URL cannot contain colon
-[2023-06-08 14:38:44]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 30587
-[2023-06-08 14:53:32]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-08 14:54:08]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-08 16:03:57]	[warn]	[gorm.io/driver/mysql.Migrator.AlterColumn.func1:58]	trace	{"elapsed": 0.2194591, "rows": 14, "sql": "ALTER TABLE `device` MODIFY COLUMN `port` varchar(255) COMMENT '绔彛鍙�'"}
-[2023-06-08 16:04:59]	[error]	[aps_admin/model.(*DeviceSearch).First:55]	trace	{"error": "record not found", "elapsed": 0.0015733, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = 'aly91' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-08 16:04:59]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 aly91 116.62.20.91 root Feiai123~ }
-[2023-06-08 16:07:26]	[error]	[aps_admin/model.(*DeviceSearch).First:55]	trace	{"error": "record not found", "elapsed": 0.0006222, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = 'aly21' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-08 16:07:26]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 aly21 121.196.212.21 root Feiai123~ }
-[2023-06-08 16:09:43]	[error]	[aps_admin/model.(*DeviceSearch).First:55]	trace	{"error": "record not found", "elapsed": 0.0005294, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = 'aly94' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-08 16:09:43]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 aly94 116.62.232.94 root Feiai123~ 22}
-[2023-06-08 16:48:11]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 16:49:29]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 16:52:37]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 16:53:31]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 16:55:51]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 16:56:23]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 16:57:42]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 16:58:38]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 17:07:54]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 17:22:00]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 17:24:59]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 17:26:31]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 17:27:36]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 18:05:59]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 18:30:55]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 18:32:11]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 18:33:42]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 18:37:37]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 19:39:43]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-08 19:41:11]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:79]	get node command err:failed to get node command: unexpected status code 404
-[2023-06-08 20:31:38]	[warn]	[gorm.io/driver/mysql.Migrator.ColumnTypes.func1:204]	trace	{"elapsed": 0.1552878, "rows": -1, "sql": "SELECT * FROM `user` LIMIT 1"}
-[2023-06-08 20:38:35]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:108]	deploy kubernetes roles err:failed to deploy Kubernetes roles on the remote server: command execution failed: sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run  registry.cn-hangzhou.aliyuncs.com/rancher/rancher-agent:v2.5.17 --server https://192.168.20.119:8443 --token f44d79ctncdl6h6c7mbdckl85rvnq9cmxlrxkmkdx62bt2rv64x8pf --ca-checksum 3044e5cd6846cbc8bc2c8221122d84b0e82770766875f288dc81ce2c72f2378e --worker err锛歅rocess exited with status 125
-[2023-06-08 20:39:54]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:108]	deploy kubernetes roles err:failed to deploy Kubernetes roles on the remote server: command execution failed: sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run  registry.cn-hangzhou.aliyuncs.com/rancher/rancher-agent:v2.5.17 --server https://192.168.20.119:8443 --token ljzdrm8vhvnbd564qxzpsdhkm494kbljz4kx49x2h4zwz8qs8m2nkd --ca-checksum 3044e5cd6846cbc8bc2c8221122d84b0e82770766875f288dc81ce2c72f2378e --worker err锛歅rocess exited with status 125
-[2023-06-08 20:59:54]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:92]	install docker err:failed to install Docker on the remote server:116.62.232.94 failed to connect to node 116.62.232.94: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
-[2023-06-09 09:48:47]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:108]	deploy kubernetes roles err:failed to deploy Kubernetes roles on the remote server: command execution failed: sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run  registry.cn-hangzhou.aliyuncs.com/rancher/rancher-agent:v2.5.17 --server https://192.168.20.119:8443 --token lrr5ffjz84bn6vpcww2l6q8xprv5p5pktvbchfnz52x6gc5hvsksrv --ca-checksum 3044e5cd6846cbc8bc2c8221122d84b0e82770766875f288dc81ce2c72f2378e --worker err锛歅rocess exited with status 125
-[2023-06-09 09:49:14]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-09 09:50:35]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create cluster, status code: 422
-[2023-06-09 09:51:34]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:108]	deploy kubernetes roles err:failed to deploy Kubernetes roles on the remote server: command execution failed: sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run  registry.cn-hangzhou.aliyuncs.com/rancher/rancher-agent:v2.5.17 --server https://192.168.20.119:8443 --token rwbbfgjgm2vbdmpjl66g7kwjn25hzkxskndv5nwk4n4dkm9jc4v82b --ca-checksum 3044e5cd6846cbc8bc2c8221122d84b0e82770766875f288dc81ce2c72f2378e --worker err锛歅rocess exited with status 125
-[2023-06-09 10:42:07]	[error]	[aps_admin/model.(*DeviceSearch).First:55]	trace	{"error": "record not found", "elapsed": 0.0041885, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '鍐呯綉116' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-09 10:42:07]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 鍐呯綉116 192.168.20.116 basic 123 100}
-[2023-06-09 10:42:35]	[error]	[aps_admin/model.(*DeviceSearch).First:55]	trace	{"error": "record not found", "elapsed": 0, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '鍐呯綉117' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-09 10:42:35]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 鍐呯綉117 192.168.20.117 basic 123 22}
-[2023-06-09 10:43:10]	[error]	[aps_admin/model.(*DeviceSearch).First:55]	trace	{"error": "record not found", "elapsed": 0.0005351, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '鍐呯綉119' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-09 10:43:10]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 鍐呯綉119 192.168.20.119 basic 123 22}
-[2023-06-13 10:02:25]	[error]	[aps_admin/model.Init:10]	failed to initialize database, got error dial tcp 172.20.11.128:3306: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
-[2023-06-13 10:02:25]	[error]	[main.main:29]	model Init err:dial tcp 172.20.11.128:3306: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
-[2023-06-13 10:20:07]	[error]	[aps_admin/model.(*MenuSearch).First:200]	trace	{"error": "record not found", "elapsed": 0.000506, "rows": 0, "sql": "SELECT * FROM `menu` WHERE id = 22 ORDER BY `menu`.`id` LIMIT 1"}
-[2023-06-13 10:20:07]	[error]	[aps_admin/model.(*MenuSearch).CreateBatch:143]	trace	{"error": "Error 1062 (23000): Duplicate entry '1' for key 'menu.PRIMARY'", "elapsed": 0.0099959, "rows": 0, "sql": "INSERT INTO `menu` (`parent_id`,`path`,`name`,`title`,`sort`,`icon`,`hidden`,`type`,`create_time`,`update_time`,`id`) VALUES (0,'','','杞﹂棿绠$悊',1,'home',false,0,1686622807,1686622807,1),(1,'/facilty','','璁惧绠$悊',2,'object-ungroup',false,1,1686622807,1686622807,2),(1,'/faciltyResource','','璁惧璧勬簮',3,'object-group',false,1,1686622807,1686622807,3),(1,'/oricedureDiagram','','璁惧宸ュ簭鍥�',4,'object-group',false,1,1686622807,1686622807,4),(0,'','','鐢熶骇璁″垝',5,'paper-plane',false,0,1686622807,1686622807,5),(5,'/orderManagement','','璁㈠崟绠$悊',6,'files-o',false,1,1686622807,1686622807,6),(5,'/plannedProduction','','璁″垝鐢熶骇',7,'',false,1,1686622807,1686622807,7),(5,'/Scheduling','','鐢熶骇鎺掔▼',8,'delicious',false,1,1686622807,1686622807,8),(5,'/productionProcess','','鐢熶骇宸ュ簭琛�',9,'',false,1,1686622807,1686622807,9),(0,'','','鍩虹鏁版嵁',10,'database',false,0,1686622807,1686622807,10),(10,'/inventory','','BOM绠$悊',11,'film',false,1,1686622807,1686622807,11),(10,'/bomCraft','','浜у搧/宸ュ簭',12,'sliders',false,1,1686622807,1686622807,12),(10,'/humanResource','','鏁版嵁閰嶇疆',13,'',false,1,1686622807,1686622807,13),(10,'/calendar','','鐢熶骇鏃ュ巻',14,'user',false,1,1686622807,1686622807,14),(10,'/abilityModel','','妯℃澘绠$悊',15,'connectdevelop',false,1,1686622807,1686622807,15),(10,'/mouldManagement','','妯″叿绠$悊',16,'',false,1,1686622807,1686622807,16),(10,'/gauge','','妫�鍏风鐞�',17,'',false,1,1686622807,1686622807,17),(10,'/transportation','','瑙勮寖绠$悊',18,'',false,1,1686622807,1686622807,18),(10,'/proccessModel','','宸ヨ壓妯″瀷',19,'',false,1,1686622807,1686622807,19),(10,'/dictionary','','鏁版嵁閰嶇疆',20,'',false,1,1686622807,1686622807,20),(0,'','','绯荤粺璁剧疆',21,'database',false,0,1686622807,1686622807,21),(21,'/system/userManage','','绠$悊鍛樼鐞�',22,'film',false,1,1686622807,1686622807,22)"}
-[2023-06-13 10:20:07]	[error]	[aps_admin/service.(*InitDBService).InitDB:72]	InitDB InitData err:menu琛ㄦ暟鎹垵濮嬪寲澶辫触!: create batch err: Error 1062 (23000): Duplicate entry '1' for key 'menu.PRIMARY', records: [0xc0009bc630 0xc0009bc6e0 0xc0009bc790 0xc0009bc840 0xc0009bc8f0 0xc0009bc9a0 0xc0009bca50 0xc0009bcb00 0xc0009bcbb0 0xc0009bcc60 0xc0009bcd10 0xc0009bcdc0 0xc0009bce70 0xc0009bcf20 0xc0009bcfd0 0xc0009bd080 0xc0009bd130 0xc0009bd1e0 0xc0009bd290 0xc0009bd340 0xc0009bd3f0 0xc0009bd4a0]
-[2023-06-13 10:20:07]	[error]	[aps_admin/initialize.Init:38]	initDB err:menu琛ㄦ暟鎹垵濮嬪寲澶辫触!: create batch err: Error 1062 (23000): Duplicate entry '1' for key 'menu.PRIMARY', records: [0xc0009bc630 0xc0009bc6e0 0xc0009bc790 0xc0009bc840 0xc0009bc8f0 0xc0009bc9a0 0xc0009bca50 0xc0009bcb00 0xc0009bcbb0 0xc0009bcc60 0xc0009bcd10 0xc0009bcdc0 0xc0009bce70 0xc0009bcf20 0xc0009bcfd0 0xc0009bd080 0xc0009bd130 0xc0009bd1e0 0xc0009bd290 0xc0009bd340 0xc0009bd3f0 0xc0009bd4a0]
-[2023-06-13 10:20:07]	[error]	[main.main:34]	initialize Init err:menu琛ㄦ暟鎹垵濮嬪寲澶辫触!: create batch err: Error 1062 (23000): Duplicate entry '1' for key 'menu.PRIMARY', records: [0xc0009bc630 0xc0009bc6e0 0xc0009bc790 0xc0009bc840 0xc0009bc8f0 0xc0009bc9a0 0xc0009bca50 0xc0009bcb00 0xc0009bcbb0 0xc0009bcc60 0xc0009bcd10 0xc0009bcdc0 0xc0009bce70 0xc0009bcf20 0xc0009bcfd0 0xc0009bd080 0xc0009bd130 0xc0009bd1e0 0xc0009bd290 0xc0009bd340 0xc0009bd3f0 0xc0009bd4a0]
-[2023-06-13 10:35:43]	[error]	[aps_admin/service.getClusters:150]	get cluster err:failed to get cluster list request: parse "192.168.20.119:8443/v3/clusters": first path segment in URL cannot contain colon
-[2023-06-13 10:40:59]	[error]	[aps_admin/model.(*DeviceSearch).First:55]	trace	{"error": "record not found", "elapsed": 0.0045216, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '119' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-13 10:40:59]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 119 192.168.20.119 basic 123 22}
-[2023-06-13 10:43:28]	[error]	[aps_admin/model.(*DeviceSearch).First:55]	trace	{"error": "record not found", "elapsed": 0.0030381, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '116' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-13 10:43:28]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 116 192.168.20.116 basic 123 22}
-[2023-06-13 10:43:38]	[error]	[aps_admin/model.(*DeviceSearch).First:55]	trace	{"error": "record not found", "elapsed": 0.0005551, "rows": 0, "sql": "SELECT * FROM `device` WHERE ip = '117' ORDER BY `device`.`id` LIMIT 1"}
-[2023-06-13 10:43:38]	[error]	[aps_admin/service.(*DeviceService).AddDevice:16]	device! err:&{0 117 192.168.20.117 basic 123 22}
-[2023-06-13 10:44:56]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create HTTP request: parse "192.168.20.119:8443/v3/clusters": first path segment in URL cannot contain colon
-[2023-06-13 10:56:34]	[error]	[aps_admin/service.(*ClusterService).CreateCluster:72]	create cluster err:Failed to create HTTP request: parse "192.168.20.119:8443/v3/clusters": first path segment in URL cannot contain colon
-[2023-06-13 11:03:39]	[error]	[aps_admin/utils.GetClaims:14]	浠嶨in鐨凜ontext涓幏鍙栦粠jwt瑙f瀽淇℃伅澶辫触, 璇锋鏌ヨ姹傚ご鏄惁瀛樺湪x-token涓攃laims鏄惁涓鸿瀹氱粨鏋�
-[2023-06-13 11:03:39]	[error]	[aps_admin/model.(*UserSearch).First:210]	trace	{"error": "record not found", "elapsed": 0.004199, "rows": 0, "sql": "SELECT * FROM `user` WHERE username = 'fly-test' ORDER BY `user`.`id` LIMIT 1"}
-[2023-06-13 11:03:39]	[error]	[aps_admin/model.(*Mysql).CreateUser.func1:24]	trace	{"error": "Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-test@'%' identified by 'fly-test@Basic2023'' at line 1", "elapsed": 0, "rows": 0, "sql": "create user if not exists fly-test@'%' identified by 'fly-test@Basic2023'"}
-[2023-06-13 11:03:39]	[error]	[aps_admin/model.(*Mysql).CreateUser.func1:26]	create mysql-user err:Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-test@'%' identified by 'fly-test@Basic2023'' at line 1
-[2023-06-13 11:25:56]	[error]	[aps_admin/service.pass:226]	etcd.NewServiceRegister err:context deadline exceeded
-[2023-06-13 11:25:56]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-13 11:25:56]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:context deadline exceeded
-[2023-06-13 11:28:41]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 32032
-[2023-06-13 11:31:02]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 30220
-[2023-06-13 11:36:10]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 31263
-[2023-06-13 11:37:41]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 31789
-[2023-06-13 11:54:00]	[error]	[aps_admin/utils.GetClaims:14]	浠嶨in鐨凜ontext涓幏鍙栦粠jwt瑙f瀽淇℃伅澶辫触, 璇锋鏌ヨ姹傚ご鏄惁瀛樺湪x-token涓攃laims鏄惁涓鸿瀹氱粨鏋�
-[2023-06-13 11:54:00]	[error]	[aps_admin/model.(*UserSearch).First:212]	trace	{"error": "record not found", "elapsed": 0.0007172, "rows": 0, "sql": "SELECT * FROM `user` WHERE id = 'wenze3' ORDER BY `user`.`id` LIMIT 1"}
-[2023-06-13 11:54:46]	[error]	[aps_admin/utils.GetClaims:14]	浠嶨in鐨凜ontext涓幏鍙栦粠jwt瑙f瀽淇℃伅澶辫触, 璇锋鏌ヨ姹傚ご鏄惁瀛樺湪x-token涓攃laims鏄惁涓鸿瀹氱粨鏋�
-[2023-06-13 11:54:46]	[error]	[aps_admin/api/v1.(*BaseApi).DeleteUser:254]	鍒犻櫎澶辫触! err:璇ョ敤鎴峰凡缁忕櫥褰曪紝鏃犳硶鍒犻櫎
-[2023-06-13 13:33:50]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-14 15:24:39]	[error]	[aps_admin/service.pass:226]	etcd.NewServiceRegister err:context deadline exceeded
-[2023-06-14 15:24:39]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-14 15:24:39]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:context deadline exceeded
-[2023-06-14 15:33:00]	[error]	[aps_admin/service.pass:226]	etcd.NewServiceRegister err:context deadline exceeded
-[2023-06-14 15:33:00]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-14 15:33:00]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:context deadline exceeded
-[2023-06-14 15:33:55]	[error]	[aps_admin/service.pass:226]	etcd.NewServiceRegister err:context deadline exceeded
-[2023-06-14 15:33:55]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-14 15:33:55]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:context deadline exceeded
-[2023-06-14 15:41:16]	[error]	[aps_admin/service.pass:226]	etcd.NewServiceRegister err:context deadline exceeded
-[2023-06-14 15:41:16]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-14 15:41:16]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:context deadline exceeded
-[2023-06-14 15:47:35]	[error]	[aps_admin/service.pass:226]	etcd.NewServiceRegister err:context deadline exceeded
-[2023-06-14 15:47:35]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-14 15:47:35]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:context deadline exceeded
-[2023-06-14 15:53:03]	[error]	[aps_admin/service.pass:226]	etcd.NewServiceRegister err:context deadline exceeded
-[2023-06-14 15:53:03]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-14 15:53:03]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:context deadline exceeded
-[2023-06-14 16:03:17]	[error]	[aps_admin/service.pass:226]	etcd.NewServiceRegister err:context deadline exceeded
-[2023-06-14 16:03:17]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-14 16:03:17]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:context deadline exceeded
-[2023-06-15 16:01:18]	[error]	[aps_admin/service.pass:226]	etcd.NewServiceRegister err:context deadline exceeded
-[2023-06-15 16:01:18]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-15 16:01:18]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:context deadline exceeded
-[2023-06-15 16:04:44]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 31298
-[2023-06-15 16:29:32]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-15 16:29:32]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:failed to create Service: Service "wenze3" is invalid: [spec.ports[2].name: Invalid value: "nsqTcp": a lowercase RFC 1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name',  or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?'), spec.ports[2].nodePort: Duplicate value: 31300]
-[2023-06-15 16:31:28]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-15 16:31:28]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:failed to create Service: Service "wenze3" is invalid: [spec.ports[2].name: Invalid value: "nsqTcp": a lowercase RFC 1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name',  or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?'), spec.ports[2].nodePort: Duplicate value: 30306]
-[2023-06-15 16:34:17]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-15 16:34:17]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:failed to create Service: Service "wenze3" is invalid: spec.ports[2].nodePort: Duplicate value: 31989
-[2023-06-15 16:35:30]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 0
-[2023-06-15 16:35:30]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:387]	瀹℃牳澶辫触! err:failed to create Service: Service "wenze3" is invalid: spec.ports[2].nodePort: Duplicate value: 31920
-[2023-06-15 16:37:48]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 31273
-[2023-06-15 16:53:39]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:384]	port: 31822
-[2023-06-19 19:34:53]	[error]	[aps_admin/service.getClusters:150]	get cluster err:failed to get cluster list: Get "https://121.31.232.83:8443:8443/v3/clusters": dial tcp: lookup 121.31.232.83:8443: no such host
-[2023-06-19 20:31:06]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:405]	port: 0
-[2023-06-19 20:31:06]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:408]	瀹℃牳澶辫触! err:Operation cannot be fulfilled on pods "wenze3-5589fd8fb6-nwvts": the object has been modified; please apply your changes to the latest version and try again
-[2023-06-19 20:39:16]	[error]	[aps_admin/service.pass:226]	etcd.NewServiceRegister err:context deadline exceeded
-[2023-06-19 20:39:16]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:405]	port: 0
-[2023-06-19 20:39:16]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:408]	瀹℃牳澶辫触! err:context deadline exceeded
-[2023-06-19 20:42:14]	[error]	[aps_admin/api/v1.(*BaseApi).Examine:405]	port: 32710
-[2023-06-21 15:06:16]	[error]	[aps_crm/model.(*MenuSearch).First:200]	trace	{"error": "record not found", "elapsed": 0.0007204, "rows": 0, "sql": "SELECT * FROM `menu` WHERE id = 22 ORDER BY `menu`.`id` LIMIT 1"}
-[2023-06-21 15:06:16]	[error]	[aps_crm/model.(*UserSearch).First:220]	trace	{"error": "record not found", "elapsed": 0.0008966, "rows": 0, "sql": "SELECT * FROM `user` WHERE username = 'admin' ORDER BY `user`.`id` LIMIT 1"}
-[2023-06-21 15:36:44]	[error]	[aps_crm/model.(*CountrySearch).Create:51]	trace	{"error": "Error 1062 (23000): Duplicate entry '涓浗' for key 'name'", "elapsed": 0.0017341, "rows": 0, "sql": "INSERT INTO `country` (`name`) VALUES ('涓浗')"}
-[2023-06-21 15:38:49]	[error]	[aps_crm/model.(*CountrySearch).Create:51]	trace	{"error": "Error 1062 (23000): Duplicate entry '涓浗' for key 'name'", "elapsed": 0.0020244, "rows": 0, "sql": "INSERT INTO `country` (`name`) VALUES ('涓浗')"}
-[2023-06-21 15:38:56]	[error]	[aps_crm/model.(*CountrySearch).Create:51]	trace	{"error": "Error 1062 (23000): Duplicate entry '涓浗' for key 'name'", "elapsed": 0.002863, "rows": 0, "sql": "INSERT INTO `country` (`name`) VALUES ('涓浗')"}
-[2023-06-21 15:38:56]	[error]	[aps_crm/model.(*CountrySearch).Create:51]	trace	{"error": "Error 1062 (23000): Duplicate entry '涓浗' for key 'name'", "elapsed": 0.0024232, "rows": 0, "sql": "INSERT INTO `country` (`name`) VALUES ('涓浗')"}
-[2023-06-21 15:38:57]	[error]	[aps_crm/model.(*CountrySearch).Create:51]	trace	{"error": "Error 1062 (23000): Duplicate entry '涓浗' for key 'name'", "elapsed": 0.0029844, "rows": 0, "sql": "INSERT INTO `country` (`name`) VALUES ('涓浗')"}
-[2023-06-21 15:38:57]	[error]	[aps_crm/model.(*CountrySearch).Create:51]	trace	{"error": "Error 1062 (23000): Duplicate entry '涓浗' for key 'name'", "elapsed": 0.0022299, "rows": 0, "sql": "INSERT INTO `country` (`name`) VALUES ('涓浗')"}
-[2023-06-21 15:38:57]	[error]	[aps_crm/model.(*CountrySearch).Create:51]	trace	{"error": "Error 1062 (23000): Duplicate entry '涓浗' for key 'name'", "elapsed": 0.0030413, "rows": 0, "sql": "INSERT INTO `country` (`name`) VALUES ('涓浗')"}
-[2023-06-21 15:38:57]	[error]	[aps_crm/model.(*CountrySearch).Create:51]	trace	{"error": "Error 1062 (23000): Duplicate entry '涓浗' for key 'name'", "elapsed": 0.0024366, "rows": 0, "sql": "INSERT INTO `country` (`name`) VALUES ('涓浗')"}
-[2023-06-21 15:53:35]	[error]	[aps_crm/model.(*CountrySearch).First:122]	trace	{"error": "record not found", "elapsed": 0.0012382, "rows": 0, "sql": "SELECT * FROM `country` WHERE id = 1 ORDER BY `country`.`id` LIMIT 1"}
-[2023-06-21 15:53:46]	[error]	[aps_crm/model.(*CountrySearch).First:122]	trace	{"error": "record not found", "elapsed": 0.0010364, "rows": 0, "sql": "SELECT * FROM `country` WHERE id = 1 ORDER BY `country`.`id` LIMIT 1"}
-[2023-06-21 15:54:58]	[error]	[aps_crm/model.(*CountrySearch).First:122]	trace	{"error": "record not found", "elapsed": 0.0009974, "rows": 0, "sql": "SELECT * FROM `country` WHERE id = 1 ORDER BY `country`.`id` LIMIT 1"}
-[2023-06-21 15:56:58]	[error]	[aps_crm/model.(*CountrySearch).First:122]	trace	{"error": "record not found", "elapsed": 0.0026063, "rows": 0, "sql": "SELECT * FROM `country` WHERE id = 1 ORDER BY `country`.`id` LIMIT 1"}
-[2023-06-21 15:57:13]	[error]	[aps_crm/model.(*CountrySearch).First:122]	trace	{"error": "record not found", "elapsed": 0.0005088, "rows": 0, "sql": "SELECT * FROM `country` WHERE id = 1 ORDER BY `country`.`id` LIMIT 1"}
-[2023-06-25 10:31:02]	[error]	[aps_crm/model.(*ProvinceSearch).UpdateList:89]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005567, "rows": 0, "sql": "UPDATE `province` SET `country_id`=3"}
-[2023-06-25 10:52:26]	[error]	[aps_crm/model.(*CountrySearch).FindAll:74]	trace	{"error": "province: unsupported relations for schema Country", "elapsed": 0.0008028, "rows": 2, "sql": "SELECT * FROM `country`"}
-[2023-06-25 11:29:09]	[error]	[aps_crm/model.(*CitySearch).Create:46]	trace	{"error": "Error 1054 (42S22): Unknown column 'province_id' in 'field list'", "elapsed": 0.0015733, "rows": 0, "sql": "INSERT INTO `city` (`name`,`province_id`) VALUES ('鍖椾含',0)"}
-[2023-06-25 11:30:56]	[error]	[aps_crm/model.(*CitySearch).Create:46]	trace	{"error": "Error 1054 (42S22): Unknown column 'province_id' in 'field list'", "elapsed": 0.0015465, "rows": 0, "sql": "INSERT INTO `city` (`name`,`province_id`) VALUES ('鍖椾含',0)"}
-[2023-06-25 11:43:30]	[error]	[aps_crm/model.(*ProvinceSearch).First:95]	trace	{"error": "record not found", "elapsed": 0.0010742, "rows": 0, "sql": "SELECT * FROM `province` WHERE id = 100 ORDER BY `province`.`id` LIMIT 1"}
-[2023-06-25 11:45:04]	[error]	[aps_crm/model.(*CountrySearch).FindAll:75]	trace	{"error": "City: unsupported relations for schema Country", "elapsed": 0.0025641, "rows": 2, "sql": "SELECT * FROM `country`"}
-[2023-06-25 17:33:14]	[error]	[aps_crm/model.(*ContactSearch).Create:58]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.contact' doesn't exist", "elapsed": 0.0012363, "rows": 0, "sql": "INSERT INTO `contact` (`name`,`number`,`company_id`,`position`,`phone`,`member_id`,`is_first`,`wechat`,`birthday`,`email`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`) VALUES ('string','',0,'string','string',0,true,'string','string','string','string',3,1,1,20)"}
-[2023-06-25 17:34:24]	[error]	[aps_crm/model.(*ContactSearch).Create:58]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.contact' doesn't exist", "elapsed": 0.00114, "rows": 0, "sql": "INSERT INTO `contact` (`name`,`number`,`company_id`,`position`,`phone`,`member_id`,`is_first`,`wechat`,`birthday`,`email`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`) VALUES ('test','',0,'string','string',1,true,'string','string','string','string',3,1,1,20)"}
-[2023-06-25 17:36:30]	[error]	[aps_crm/model.(*ContactSearch).Create:58]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.contact' doesn't exist", "elapsed": 0.0016653, "rows": 0, "sql": "INSERT INTO `contact` (`name`,`number`,`company_id`,`position`,`phone`,`member_id`,`is_first`,`wechat`,`birthday`,`email`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`) VALUES ('test','',0,'string','string',1,true,'string','string','string','string',3,1,1,20)"}
-[2023-06-25 17:37:41]	[error]	[aps_crm/model.(*ContactSearch).Create:58]	trace	{"error": "Error 1054 (42S22): Unknown column 'is_first' in 'field list'", "elapsed": 0.0017984, "rows": 0, "sql": "INSERT INTO `contact` (`name`,`number`,`company_id`,`position`,`phone`,`member_id`,`is_first`,`wechat`,`birthday`,`email`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`) VALUES ('test','',0,'string','string',1,true,'string','string','string','string',3,1,1,20)"}
-[2023-06-25 17:38:08]	[error]	[aps_crm/model.(*ContactSearch).Create:58]	trace	{"error": "Error 1054 (42S22): Unknown column 'is_first' in 'field list'", "elapsed": 0.0016086, "rows": 0, "sql": "INSERT INTO `contact` (`name`,`number`,`company_id`,`position`,`phone`,`member_id`,`is_first`,`wechat`,`birthday`,`email`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`) VALUES ('test','',0,'string','string',1,true,'string','string','string','string',3,1,1,20)"}
-[2023-06-25 17:39:00]	[error]	[aps_crm/model.(*ContactSearch).Create:58]	trace	{"error": "Error 1054 (42S22): Unknown column 'is_first' in 'field list'", "elapsed": 0.0016683, "rows": 0, "sql": "INSERT INTO `contact` (`name`,`number`,`company_id`,`position`,`phone`,`member_id`,`is_first`,`wechat`,`birthday`,`email`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`) VALUES ('test','',0,'string','string',1,true,'string','string','string','string',3,1,1,20)"}
-[2023-06-25 17:41:33]	[error]	[aps_crm/model.(*ContactSearch).Create:58]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: 'string' for column 'birthday' at row 1", "elapsed": 0.0026264, "rows": 0, "sql": "INSERT INTO `contact` (`name`,`number`,`company_id`,`position`,`phone`,`member_id`,`is_first`,`wechat`,`birthday`,`email`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`) VALUES ('test','',0,'string','string',1,true,'string','string','string','string',3,1,1,20)"}
-[2023-06-25 17:42:36]	[error]	[aps_crm/model.(*ContactSearch).Create:58]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '' for column 'birthday' at row 1", "elapsed": 0.0026709, "rows": 0, "sql": "INSERT INTO `contact` (`name`,`number`,`company_id`,`position`,`phone`,`member_id`,`is_first`,`wechat`,`birthday`,`email`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`) VALUES ('test','',0,'string','string',1,true,'string','','string','string',3,1,1,20)"}
-[2023-06-26 15:31:23]	[error]	[aps_crm/model.(*CitySearch).Updates:81]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005428, "rows": 0, "sql": "UPDATE `city` SET `color`='123',`turn`=11"}
-[2023-06-26 15:33:18]	[error]	[aps_crm/model.(*CitySearch).Updates:81]	trace	{"error": "WHERE conditions required", "elapsed": 0.0010696, "rows": 0, "sql": "UPDATE `city` SET `color`='123',`turn`=11"}
-[2023-06-26 15:35:23]	[error]	[aps_crm/model.(*CitySearch).Updates:82]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005346, "rows": 0, "sql": "UPDATE `city` SET `color`='123',`turn`=11"}
-[2023-06-26 15:36:00]	[error]	[aps_crm/model.(*CitySearch).Updates:82]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005087, "rows": 0, "sql": "UPDATE `city` SET `color`='123',`turn`=11"}
-[2023-06-27 11:06:58]	[error]	[aps_crm/model.(*CitySearch).Delete:54]	trace	{"error": "WHERE conditions required", "elapsed": 0.000531, "rows": 0, "sql": "DELETE FROM `city`"}
-[2023-06-27 11:10:26]	[error]	[aps_crm/model.(*CitySearch).Delete:54]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005344, "rows": 0, "sql": "DELETE FROM `city`"}
-[2023-06-27 11:22:43]	[error]	[aps_crm/model.(*CitySearch).Delete:54]	trace	{"error": "WHERE conditions required", "elapsed": 0, "rows": 0, "sql": "DELETE FROM `city`"}
-[2023-06-27 11:24:39]	[error]	[aps_crm/model.(*CitySearch).Delete:54]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005072, "rows": 0, "sql": "DELETE FROM `city`"}
-[2023-06-27 11:27:27]	[error]	[aps_crm/model.(*CitySearch).Delete:54]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005447, "rows": 0, "sql": "DELETE FROM `city`"}
-[2023-06-27 11:28:04]	[error]	[aps_crm/model.(*CitySearch).Delete:54]	trace	{"error": "WHERE conditions required", "elapsed": 0.000532, "rows": 0, "sql": "DELETE FROM `city`"}
-[2023-06-27 11:29:47]	[error]	[aps_crm/model.(*CitySearch).Delete:54]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005419, "rows": 0, "sql": "DELETE FROM `city`"}
-[2023-06-27 11:30:26]	[error]	[aps_crm/model.(*CitySearch).Delete:54]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005273, "rows": 0, "sql": "DELETE FROM `city`"}
-[2023-06-27 11:34:08]	[error]	[aps_crm/model.(*CitySearch).Delete:54]	trace	{"error": "WHERE conditions required", "elapsed": 0.0021733, "rows": 0, "sql": "DELETE FROM `city`"}
-[2023-06-27 15:00:52]	[error]	[aps_crm/model.(*ContactSearch).First:100]	trace	{"error": "record not found", "elapsed": 0.0015938, "rows": 0, "sql": "SELECT * FROM `contact` WHERE id = 12 AND `contact`.`deleted_at` IS NULL ORDER BY `contact`.`id` LIMIT 1"}
-[2023-06-27 15:01:01]	[error]	[aps_crm/model.(*ContactSearch).Delete:70]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005284, "rows": 0, "sql": "UPDATE `contact` SET `deleted_at`='2023-06-27 15:01:01.78' WHERE `contact`.`deleted_at` IS NULL"}
-[2023-06-27 15:10:12]	[error]	[aps_crm/model.(*ContactSearch).First:100]	trace	{"error": "record not found", "elapsed": 0.001272, "rows": 0, "sql": "SELECT * FROM `contact` WHERE id = 1 AND `contact`.`deleted_at` IS NULL ORDER BY `contact`.`id` LIMIT 1"}
-[2023-06-27 16:35:34]	[error]	[aps_crm/model.(*ContactSearch).First:100]	trace	{"error": "record not found", "elapsed": 0.0009159, "rows": 0, "sql": "SELECT * FROM `contact` WHERE id = 1 AND `contact`.`deleted_at` IS NULL ORDER BY `contact`.`id` LIMIT 1"}
-[2023-06-28 10:42:18]	[error]	[aps_crm/model.(*ClientSearch).Create:60]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.client' doesn't exist", "elapsed": 0.0025819, "rows": 0, "sql": "INSERT INTO `client` (`name`,`number`,`client_status_id`,`client_type_id`,`client_origin_id`,`client_level_id`,`member_id`,`service_member_id`,`detail_address`,`remark`,`next_visit_time`,`latest_service_time`,`country_id`,`province_id`,`city_id`,`region_id`,`representative`,`registration_time`,`registered_capital_id`,`industry_id`,`enterprise_nature_id`,`enterprise_scale_id`,`business_scope`,`created_at`,`updated_at`,`deleted_at`) VALUES ('string','string',1,0,0,1,12,0,'string','string','1970-01-01 08:00:00','1970-01-01 08:00:00',0,0,0,0,'','0000-00-00 00:00:00',0,0,0,0,'','2023-06-28 10:42:18.885','2023-06-28 10:42:18.885',NULL)"}
-[2023-06-28 10:43:37]	[error]	[aps_crm/model.(*ClientSearch).Create:60]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.client' doesn't exist", "elapsed": 0.0027251, "rows": 0, "sql": "INSERT INTO `client` (`name`,`number`,`client_status_id`,`client_type_id`,`client_origin_id`,`client_level_id`,`member_id`,`service_member_id`,`detail_address`,`remark`,`next_visit_time`,`latest_service_time`,`country_id`,`province_id`,`city_id`,`region_id`,`representative`,`registration_time`,`registered_capital_id`,`industry_id`,`enterprise_nature_id`,`enterprise_scale_id`,`business_scope`,`created_at`,`updated_at`,`deleted_at`) VALUES ('string','string',1,0,0,1,12,0,'string','string','1970-01-01 08:00:00','1970-01-01 08:00:00',0,0,0,0,'','0000-00-00 00:00:00',0,0,0,0,'','2023-06-28 10:43:37.11','2023-06-28 10:43:37.11',NULL)"}
-[2023-06-28 10:44:12]	[error]	[aps_crm/model.(*ClientSearch).Create:60]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'registration_time' at row 1", "elapsed": 0.003669, "rows": 0, "sql": "INSERT INTO `clients` (`name`,`number`,`client_status_id`,`client_type_id`,`client_origin_id`,`client_level_id`,`member_id`,`service_member_id`,`detail_address`,`remark`,`next_visit_time`,`latest_service_time`,`country_id`,`province_id`,`city_id`,`region_id`,`representative`,`registration_time`,`registered_capital_id`,`industry_id`,`enterprise_nature_id`,`enterprise_scale_id`,`business_scope`,`created_at`,`updated_at`,`deleted_at`) VALUES ('string','string',1,0,0,1,12,0,'string','string','1970-01-01 08:00:00','1970-01-01 08:00:00',0,0,0,0,'','0000-00-00 00:00:00',0,0,0,0,'','2023-06-28 10:44:12.577','2023-06-28 10:44:12.577',NULL)"}
-[2023-06-28 14:16:00]	[error]	[aps_crm/model.(*ClientSearch).Create:60]	trace	{"error": "Error 1062 (23000): Duplicate entry '杩欎粎浠呮槸涓�涓祴璇�' for key 'name'", "elapsed": 0.0040316, "rows": 0, "sql": "INSERT INTO `clients` (`name`,`number`,`client_status_id`,`client_type_id`,`client_origin_id`,`client_level_id`,`member_id`,`service_member_id`,`detail_address`,`remark`,`next_visit_time`,`latest_service_time`,`country_id`,`province_id`,`city_id`,`region_id`,`representative`,`registration_time`,`registered_capital_id`,`industry_id`,`enterprise_nature_id`,`enterprise_scale_id`,`business_scope`,`created_at`,`updated_at`,`deleted_at`) VALUES ('杩欎粎浠呮槸涓�涓祴璇�','string',1,0,0,0,12,0,'string','string','1970-01-01 08:00:00','1970-01-01 08:00:00',0,0,0,0,'','1970-01-01 08:00:00',0,0,0,0,'','2023-06-28 14:16:00.318','2023-06-28 14:16:00.318',NULL)"}
-[2023-06-28 14:25:31]	[error]	[aps_crm/model.(*ClientSearch).First:91]	trace	{"error": "record not found", "elapsed": 0.0016111, "rows": 0, "sql": "SELECT * FROM `clients` WHERE id = 12 AND `clients`.`deleted_at` IS NULL ORDER BY `clients`.`id` LIMIT 1"}
-[2023-06-28 14:36:34]	[error]	[aps_crm/model.(*ClientSearch).Create:60]	trace	{"error": "Error 1062 (23000): Duplicate entry '杩欎粎浠呮槸涓�涓祴璇�' for key 'name'", "elapsed": 0.0049793, "rows": 0, "sql": "INSERT INTO `clients` (`name`,`number`,`client_status_id`,`client_type_id`,`client_origin_id`,`client_level_id`,`member_id`,`service_member_id`,`detail_address`,`remark`,`next_visit_time`,`latest_service_time`,`country_id`,`province_id`,`city_id`,`region_id`,`representative`,`registration_time`,`registered_capital_id`,`industry_id`,`enterprise_nature_id`,`enterprise_scale_id`,`business_scope`,`created_at`,`updated_at`,`deleted_at`) VALUES ('杩欎粎浠呮槸涓�涓祴璇�','string',1,0,0,0,12,0,'string','string','1970-01-01 08:00:00','1970-01-01 08:00:00',0,0,0,0,'','1970-01-01 08:00:00',0,0,0,0,'','2023-06-28 14:36:34.816','2023-06-28 14:36:34.816',NULL)"}
-[2023-06-28 14:37:21]	[error]	[aps_crm/model.(*ClientSearch).Find:98]	trace	{"error": "contact: unsupported relations for schema Client", "elapsed": 0.0018183, "rows": 3, "sql": "SELECT * FROM `clients` WHERE `clients`.`deleted_at` IS NULL"}
-[2023-06-28 14:38:31]	[error]	[aps_crm/model.(*ClientSearch).Find:98]	trace	{"error": "contacts: unsupported relations for schema Client", "elapsed": 0.0028328, "rows": 3, "sql": "SELECT * FROM `clients` WHERE `clients`.`deleted_at` IS NULL"}
-[2023-06-28 14:39:23]	[error]	[aps_crm/model.(*ClientSearch).Find:98]	trace	{"error": "contacts: unsupported relations for schema Client", "elapsed": 0.0036906, "rows": 3, "sql": "SELECT * FROM `clients` WHERE `clients`.`deleted_at` IS NULL"}
-[2023-06-28 14:44:06]	[error]	[aps_crm/model.(*ClientSearch).Find:98]	trace	{"error": "contacts: unsupported relations for schema Client", "elapsed": 0.00205, "rows": 3, "sql": "SELECT * FROM `clients` WHERE `clients`.`deleted_at` IS NULL"}
-[2023-06-28 14:44:41]	[error]	[aps_crm/model.(*ClientSearch).Find:98]	trace	{"error": "contact: unsupported relations for schema Client", "elapsed": 0.0025056, "rows": 3, "sql": "SELECT * FROM `clients` WHERE `clients`.`deleted_at` IS NULL"}
-[2023-06-28 14:46:21]	[error]	[aps_crm/model.(*ClientSearch).Find:98]	trace	{"error": "contact: unsupported relations for schema Client", "elapsed": 0.0026419, "rows": 3, "sql": "SELECT * FROM `clients` WHERE `clients`.`deleted_at` IS NULL"}
-[2023-06-28 14:46:42]	[error]	[aps_crm/model.(*ClientSearch).Find:98]	trace	{"error": "contacts: unsupported relations for schema Client", "elapsed": 0.0026226, "rows": 3, "sql": "SELECT * FROM `clients` WHERE `clients`.`deleted_at` IS NULL"}
-[2023-06-28 15:43:57]	[error]	[aps_crm/model.(*ContactSearch).FindAll:80]	trace	{"error": "Country: unsupported relations for schema Contact", "elapsed": 0.0027306, "rows": 14, "sql": "SELECT * FROM `contacts` WHERE `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 15:44:15]	[error]	[aps_crm/model.(*ContactSearch).FindAll:80]	trace	{"error": "Country: unsupported relations for schema Contact", "elapsed": 0.0018499, "rows": 14, "sql": "SELECT * FROM `contacts` WHERE `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 15:48:57]	[error]	[aps_crm/model.(*ContactSearch).FindAll:80]	trace	{"error": "CountryId: unsupported relations for schema Contact", "elapsed": 0.0018594, "rows": 14, "sql": "SELECT * FROM `contacts` WHERE `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 17:09:18]	[error]	[aps_crm/model.(*ContactSearch).Create:58]	trace	{"error": "Error 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`aps_crm`.`contacts`, CONSTRAINT `fk_clients_contacts` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`))", "elapsed": 0.0024561, "rows": 0, "sql": "INSERT INTO `contacts` (`name`,`number`,`client_id`,`position`,`phone`,`member_id`,`is_first`,`wechat`,`birthday`,`email`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`,`created_at`,`updated_at`,`deleted_at`) VALUES ('杩欒繕鏄竴涓祴璇�','string',0,'string','string',12,true,'string','1970-01-01 16:00:00','string','string',0,0,0,0,'2023-06-28 17:09:18.959','2023-06-28 17:09:18.959',NULL)"}
-[2023-06-28 17:10:04]	[error]	[aps_crm/model.(*ContactSearch).Create:58]	trace	{"error": "Error 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`aps_crm`.`contacts`, CONSTRAINT `fk_clients_contacts` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`))", "elapsed": 0.0032324, "rows": 0, "sql": "INSERT INTO `contacts` (`name`,`number`,`client_id`,`position`,`phone`,`member_id`,`is_first`,`wechat`,`birthday`,`email`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`,`created_at`,`updated_at`,`deleted_at`) VALUES ('杩欒繕鏄竴涓祴璇�','string',0,'string','string',12,true,'string','1970-01-01 16:00:00','string','string',0,0,0,0,'2023-06-28 17:10:04.461','2023-06-28 17:10:04.461',NULL)"}
-[2023-06-28 17:11:43]	[error]	[aps_crm/model.(*ContactSearch).UpdateByMap:109]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005544, "rows": 0, "sql": "UPDATE `contacts` SET `isFirst`=false,`updated_at`='2023-06-28 17:11:43.889' WHERE `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 17:11:59]	[error]	[aps_crm/model.(*ContactSearch).UpdateByMap:109]	trace	{"error": "WHERE conditions required", "elapsed": 0.0010541, "rows": 0, "sql": "UPDATE `contacts` SET `isFirst`=false,`updated_at`='2023-06-28 17:11:59.912' WHERE `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 17:13:00]	[error]	[aps_crm/model.(*ContactSearch).UpdateByMap:109]	trace	{"error": "WHERE conditions required", "elapsed": 0.001093, "rows": 0, "sql": "UPDATE `contacts` SET `isFirst`=false,`updated_at`='2023-06-28 17:13:00.291' WHERE `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 17:14:09]	[error]	[aps_crm/model.(*ContactSearch).UpdateByMap:109]	trace	{"error": "WHERE conditions required", "elapsed": 0, "rows": 0, "sql": "UPDATE `contacts` SET `isFirst`=false,`updated_at`='2023-06-28 17:14:09.657' WHERE `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 17:14:56]	[error]	[aps_crm/model.(*ContactSearch).UpdateByMap:113]	trace	{"error": "Error 1054 (42S22): Unknown column 'isFirst' in 'field list'", "elapsed": 0.0012111, "rows": 0, "sql": "UPDATE `contacts` SET `isFirst`=false,`updated_at`='2023-06-28 17:14:56.118' WHERE client_id = 5 AND `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 17:23:27]	[error]	[aps_crm/model.(*ContactSearch).Create:62]	trace	{"error": "Error 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`aps_crm`.`contacts`, CONSTRAINT `fk_clients_contacts` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`))", "elapsed": 0.0027926, "rows": 0, "sql": "INSERT INTO `contacts` (`name`,`number`,`client_id`,`position`,`phone`,`member_id`,`is_first`,`wechat`,`birthday`,`email`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`,`created_at`,`updated_at`,`deleted_at`) VALUES ('杩欒繕鏄竴涓祴璇�','string',0,'string','string',12,true,'string','1970-01-01 16:00:00','string','string',0,0,0,0,'2023-06-28 17:23:27.45','2023-06-28 17:23:27.45',NULL)"}
-[2023-06-28 17:24:00]	[error]	[aps_crm/model.(*ContactSearch).Create:62]	trace	{"error": "Error 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`aps_crm`.`contacts`, CONSTRAINT `fk_clients_contacts` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`))", "elapsed": 0.0061602, "rows": 0, "sql": "INSERT INTO `contacts` (`name`,`number`,`client_id`,`position`,`phone`,`member_id`,`is_first`,`wechat`,`birthday`,`email`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`,`created_at`,`updated_at`,`deleted_at`) VALUES ('杩欒繕鏄竴涓祴璇�','string',0,'string','string',12,true,'string','1970-01-01 16:00:00','string','string',0,0,0,0,'2023-06-28 17:24:00.185','2023-06-28 17:24:00.185',NULL)"}
-[2023-06-28 17:37:42]	[error]	[aps_crm/model.(*ContactSearch).Update:67]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005442, "rows": 0, "sql": "UPDATE `contacts` SET `name`='杩欒繕鏄竴涓祴璇�',`number`='string',`client_id`=5,`position`='string',`phone`='string',`member_id`=12,`is_first`=true,`wechat`='string',`birthday`='1970-01-01 16:00:00',`email`='string',`desc`='string',`updated_at`='2023-06-28 17:37:42.529' WHERE `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 17:38:43]	[error]	[aps_crm/model.(*ContactSearch).Update:67]	trace	{"error": "WHERE conditions required", "elapsed": 0.0010533, "rows": 0, "sql": "UPDATE `contacts` SET `name`='杩欒繕鏄竴涓祴璇�',`number`='string',`client_id`=5,`position`='string',`phone`='string',`member_id`=12,`is_first`=true,`wechat`='string',`birthday`='1970-01-01 16:00:00',`email`='string',`desc`='string',`updated_at`='2023-06-28 17:38:43.585' WHERE `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 17:39:57]	[error]	[aps_crm/model.(*ContactSearch).Update:67]	trace	{"error": "WHERE conditions required", "elapsed": 0.0009104, "rows": 0, "sql": "UPDATE `contacts` SET `name`='杩欒繕鏄竴涓祴璇�',`number`='string',`client_id`=5,`position`='string',`phone`='string',`member_id`=12,`is_first`=true,`wechat`='string',`birthday`='1970-01-01 16:00:00',`email`='string',`desc`='string',`updated_at`='2023-06-28 17:39:57.729' WHERE `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 17:40:37]	[error]	[aps_crm/model.(*ContactSearch).Update:67]	trace	{"error": "WHERE conditions required", "elapsed": 0.0009064, "rows": 0, "sql": "UPDATE `contacts` SET `name`='杩欒繕鏄竴涓祴璇�',`number`='string',`client_id`=5,`position`='string',`phone`='string',`member_id`=12,`is_first`=true,`wechat`='string',`birthday`='1970-01-01 16:00:00',`email`='string',`desc`='string',`updated_at`='2023-06-28 17:40:37.561' WHERE `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 17:44:13]	[error]	[aps_crm/model.(*ContactSearch).Update:67]	trace	{"error": "WHERE conditions required", "elapsed": 0.000541, "rows": 0, "sql": "UPDATE `contacts` SET `name`='杩欒繕鏄竴涓祴璇�',`number`='string',`client_id`=5,`position`='string',`phone`='string',`member_id`=12,`is_first`=true,`wechat`='string',`birthday`='1970-01-01 16:00:00',`email`='string',`desc`='string',`updated_at`='2023-06-28 17:44:13.628' WHERE `contacts`.`deleted_at` IS NULL"}
-[2023-06-28 17:47:39]	[error]	[aps_crm/model.(*ClientSearch).Create:60]	trace	{"error": "Error 1062 (23000): Duplicate entry 'string' for key 'name'", "elapsed": 0.0048814, "rows": 0, "sql": "INSERT INTO `clients` (`name`,`number`,`client_status_id`,`client_type_id`,`client_origin_id`,`client_level_id`,`member_id`,`service_member_id`,`detail_address`,`remark`,`next_visit_time`,`latest_service_time`,`country_id`,`province_id`,`city_id`,`region_id`,`representative`,`registration_time`,`registered_capital_id`,`industry_id`,`enterprise_nature_id`,`enterprise_scale_id`,`business_scope`,`created_at`,`updated_at`,`deleted_at`) VALUES ('string','string',12,0,0,0,12,0,'string','string','1970-01-01 08:00:00','1970-01-01 08:00:00',0,0,0,0,'','1970-01-01 08:00:00',0,0,0,0,'','2023-06-28 17:47:39.901','2023-06-28 17:47:39.901',NULL)"}
-[2023-06-29 11:40:31]	[error]	[aps_crm/model.(*ClientStatusSearch).Create:46]	trace	{"error": "Error 1062 (23000): Duplicate entry '浠�涔堝鎴�' for key 'name'", "elapsed": 0.0034817, "rows": 0, "sql": "INSERT INTO `client_status` (`name`) VALUES ('浠�涔堝鎴�')"}
-[2023-06-29 11:40:32]	[error]	[aps_crm/model.(*ClientStatusSearch).Create:46]	trace	{"error": "Error 1062 (23000): Duplicate entry '浠�涔堝鎴�' for key 'name'", "elapsed": 0.0031771, "rows": 0, "sql": "INSERT INTO `client_status` (`name`) VALUES ('浠�涔堝鎴�')"}
-[2023-06-29 11:40:32]	[error]	[aps_crm/model.(*ClientStatusSearch).Create:46]	trace	{"error": "Error 1062 (23000): Duplicate entry '浠�涔堝鎴�' for key 'name'", "elapsed": 0.0030861, "rows": 0, "sql": "INSERT INTO `client_status` (`name`) VALUES ('浠�涔堝鎴�')"}
-[2023-06-29 11:40:33]	[error]	[aps_crm/model.(*ClientStatusSearch).Create:46]	trace	{"error": "Error 1062 (23000): Duplicate entry '浠�涔堝鎴�' for key 'name'", "elapsed": 0.0034967, "rows": 0, "sql": "INSERT INTO `client_status` (`name`) VALUES ('浠�涔堝鎴�')"}
-[2023-06-29 11:40:33]	[error]	[aps_crm/model.(*ClientStatusSearch).Create:46]	trace	{"error": "Error 1062 (23000): Duplicate entry '浠�涔堝鎴�' for key 'name'", "elapsed": 0.0025038, "rows": 0, "sql": "INSERT INTO `client_status` (`name`) VALUES ('浠�涔堝鎴�')"}
-[2023-06-29 11:40:33]	[error]	[aps_crm/model.(*ClientStatusSearch).Create:46]	trace	{"error": "Error 1062 (23000): Duplicate entry '浠�涔堝鎴�' for key 'name'", "elapsed": 0.0024172, "rows": 0, "sql": "INSERT INTO `client_status` (`name`) VALUES ('浠�涔堝鎴�')"}
-[2023-06-29 15:19:13]	[error]	[aps_crm/model.(*ClientStatusSearch).First:86]	trace	{"error": "record not found", "elapsed": 0.0005073, "rows": 0, "sql": "SELECT * FROM `client_status` WHERE id = 14 ORDER BY `client_status`.`id` LIMIT 1"}
-[2023-06-29 15:24:23]	[error]	[aps_crm/model.(*ClientTypeSearch).First:86]	trace	{"error": "record not found", "elapsed": 0.0005318, "rows": 0, "sql": "SELECT * FROM `client_type` WHERE id = 110 ORDER BY `client_type`.`id` LIMIT 1"}
-[2023-06-29 16:17:34]	[error]	[aps_crm/model.(*ClientOriginSearch).Create:44]	trace	{"error": "Error 1062 (23000): Duplicate entry '锜硅�佹澘' for key 'name'", "elapsed": 0.0029311, "rows": 0, "sql": "INSERT INTO `client_origin` (`name`) VALUES ('锜硅�佹澘')"}
-[2023-06-29 16:17:34]	[error]	[aps_crm/model.(*ClientOriginSearch).Create:44]	trace	{"error": "Error 1062 (23000): Duplicate entry '锜硅�佹澘' for key 'name'", "elapsed": 0.0032711, "rows": 0, "sql": "INSERT INTO `client_origin` (`name`) VALUES ('锜硅�佹澘')"}
-[2023-06-29 20:09:48]	[error]	[aps_crm/model.(*ClientTypeSearch).First:86]	trace	{"error": "record not found", "elapsed": 0.0011122, "rows": 0, "sql": "SELECT * FROM `client_type` WHERE id = 5 ORDER BY `client_type`.`id` LIMIT 1"}
-[2023-06-30 11:44:26]	[error]	[aps_crm/model.(*IndustrySearch).Create:46]	trace	{"error": "Error 1062 (23000): Duplicate entry '娴嬭瘯' for key 'name'", "elapsed": 0.002451, "rows": 0, "sql": "INSERT INTO `industry` (`name`) VALUES ('娴嬭瘯')"}
-[2023-06-30 14:55:56]	[error]	[aps_crm/model.(*EnterpriseNatureSearch).Create:46]	trace	{"error": "Error 1062 (23000): Duplicate entry '娴嬭瘯浼佷笟' for key 'name'", "elapsed": 0.0028795, "rows": 0, "sql": "INSERT INTO `enterprise_nature` (`name`) VALUES ('娴嬭瘯浼佷笟')"}
-[2023-06-30 16:50:42]	[error]	[aps_crm/model.(*RegisteredCapitalSearch).Updates:73]	trace	{"error": "Error 1062 (23000): Duplicate entry 'string2' for key 'name'", "elapsed": 0.0017808, "rows": 0, "sql": "UPDATE `registered_capital` SET `name`='string2' WHERE id = 7"}
-[2023-07-03 11:09:17]	[error]	[aps_crm/model.(*EnterpriseScaleSearch).Find:63]	trace	{"error": "record not found", "elapsed": 0.0011696, "rows": 0, "sql": "SELECT * FROM `enterprise_scale` WHERE id = 10 ORDER BY `enterprise_scale`.`id` LIMIT 1"}
-[2023-07-03 11:09:19]	[error]	[aps_crm/model.(*EnterpriseScaleSearch).Find:63]	trace	{"error": "record not found", "elapsed": 0.0005372, "rows": 0, "sql": "SELECT * FROM `enterprise_scale` WHERE id = 11 ORDER BY `enterprise_scale`.`id` LIMIT 1"}
-[2023-07-03 11:09:22]	[error]	[aps_crm/model.(*EnterpriseScaleSearch).Find:63]	trace	{"error": "record not found", "elapsed": 0.0005098, "rows": 0, "sql": "SELECT * FROM `enterprise_scale` WHERE id = 12 ORDER BY `enterprise_scale`.`id` LIMIT 1"}
-[2023-07-03 11:19:14]	[error]	[aps_crm/model.(*EnterpriseScaleSearch).Create:46]	trace	{"error": "Error 1062 (23000): Duplicate entry '鍌婚��' for key 'name'", "elapsed": 0.0020095, "rows": 0, "sql": "INSERT INTO `enterprise_scale` (`name`) VALUES ('鍌婚��')"}
-[2023-07-03 11:20:04]	[error]	[aps_crm/model.(*EnterpriseScaleSearch).Find:63]	trace	{"error": "record not found", "elapsed": 0.0005126, "rows": 0, "sql": "SELECT * FROM `enterprise_scale` WHERE id = 4 ORDER BY `enterprise_scale`.`id` LIMIT 1"}
-[2023-07-04 10:59:56]	[error]	[aps_crm/model.(*SalesLeadsSearch).Create:79]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.sales_leads' doesn't exist", "elapsed": 0.0034692, "rows": 0, "sql": "INSERT INTO `sales_leads` (`name`,`number`,`contact_name`,`contact_phone`,`contact_position`,`sales_sources_id`,`member_id`,`sales_status`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`,`created_at`,`updated_at`,`deleted_at`) VALUES ('杩欐槸涓�涓鎴�','LEA50','string','string','string',110,112,'1','string',0,0,0,0,'2023-07-04 10:59:56.539','2023-07-04 10:59:56.539',NULL)"}
-[2023-07-04 11:04:41]	[error]	[aps_crm/model.(*SalesLeadsSearch).Update:84]	trace	{"error": "WHERE conditions required", "elapsed": 0.0022112, "rows": 0, "sql": "UPDATE `sales_leads` SET `name`='杩欐槸涓�涓鎴�',`number`='LEA50',`contact_name`='string',`contact_phone`='string',`contact_position`='string',`sales_sources_id`=110,`member_id`=120,`sales_status`='1',`desc`='123123123',`updated_at`='2023-07-04 11:04:41.981' WHERE `sales_leads`.`deleted_at` IS NULL"}
-[2023-07-04 11:05:21]	[error]	[aps_crm/model.(*SalesLeadsSearch).Update:84]	trace	{"error": "WHERE conditions required", "elapsed": 0.0007035, "rows": 0, "sql": "UPDATE `sales_leads` SET `name`='杩欐槸涓�涓鎴�',`number`='LEA50',`contact_name`='string',`contact_phone`='string',`contact_position`='string',`sales_sources_id`=110,`member_id`=120,`sales_status`='1',`desc`='123123123',`updated_at`='2023-07-04 11:05:21.227' WHERE `sales_leads`.`deleted_at` IS NULL"}
-[2023-07-04 11:06:05]	[error]	[aps_crm/model.(*SalesLeadsSearch).Update:84]	trace	{"error": "WHERE conditions required", "elapsed": 0.0009636, "rows": 0, "sql": "UPDATE `sales_leads` SET `name`='杩欐槸涓�涓鎴�',`number`='LEA50',`contact_name`='string',`contact_phone`='string',`contact_position`='string',`sales_sources_id`=110,`member_id`=120,`sales_status`='1',`desc`='123123123',`updated_at`='2023-07-04 11:06:05.259' WHERE `sales_leads`.`deleted_at` IS NULL"}
-[2023-07-04 11:12:32]	[error]	[gorm.io/driver/mysql.Migrator.AlterColumn.func1:59]	trace	{"error": "Error 1062 (23000): Duplicate entry '杩欐槸涓�涓鎴�' for key 'name'", "elapsed": 0.0045154, "rows": 0, "sql": "ALTER TABLE `sales_leads` MODIFY COLUMN `name` varchar(255) UNIQUE COMMENT '鍏徃鍚嶇О'"}
-[2023-07-04 11:12:32]	[error]	[main.main:29]	model Init err:Error 1062 (23000): Duplicate entry '杩欐槸涓�涓鎴�' for key 'name'
-[2023-07-04 11:13:13]	[error]	[aps_crm/model.(*SalesLeadsSearch).Create:79]	trace	{"error": "Error 1062 (23000): Duplicate entry '杩欐槸涓�涓鎴�' for key 'name'", "elapsed": 0.003706, "rows": 0, "sql": "INSERT INTO `sales_leads` (`name`,`number`,`contact_name`,`contact_phone`,`contact_position`,`sales_sources_id`,`member_id`,`sales_status`,`desc`,`country_id`,`province_id`,`city_id`,`region_id`,`created_at`,`updated_at`,`deleted_at`) VALUES ('杩欐槸涓�涓鎴�','LEA50','string','string','string',110,112,'1','string',0,0,0,0,'2023-07-04 11:13:13.402','2023-07-04 11:13:13.402',NULL)"}
-[2023-07-04 13:46:36]	[error]	[aps_crm/model.(*SalesSourcesSearch).Create:46]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.sales_sources' doesn't exist", "elapsed": 0.0014411, "rows": 0, "sql": "INSERT INTO `sales_sources` (`name`) VALUES ('鐢佃瘽鏉ヨ')"}
-[2023-07-04 16:19:59]	[error]	[aps_crm/model.(*ClientSearch).First:91]	trace	{"error": "record not found", "elapsed": 0.0036884, "rows": 0, "sql": "SELECT * FROM `clients` WHERE id = 110 AND `clients`.`deleted_at` IS NULL ORDER BY `clients`.`id` LIMIT 1"}
-[2023-07-04 16:20:29]	[error]	[aps_crm/model.(*ClientSearch).First:91]	trace	{"error": "record not found", "elapsed": 0.0012979, "rows": 0, "sql": "SELECT * FROM `clients` WHERE id = 110 AND `clients`.`deleted_at` IS NULL ORDER BY `clients`.`id` LIMIT 1"}
-[2023-07-04 16:50:20]	[error]	[aps_crm/model.(*ClientSearch).First:91]	trace	{"error": "record not found", "elapsed": 0.0011865, "rows": 0, "sql": "SELECT * FROM `clients` WHERE id = 8 AND `clients`.`deleted_at` IS NULL ORDER BY `clients`.`id` LIMIT 1"}
-[2023-07-04 16:57:58]	[error]	[aps_crm/model.(*ClientSearch).First:91]	trace	{"error": "record not found", "elapsed": 0.0031332, "rows": 0, "sql": "SELECT * FROM `clients` WHERE id = 8 AND `clients`.`deleted_at` IS NULL ORDER BY `clients`.`id` LIMIT 1"}
-[2023-07-04 16:58:50]	[error]	[aps_crm/model.(*FollowRecordSearch).Update:132]	trace	{"error": "WHERE conditions required", "elapsed": 0.0009061, "rows": 0, "sql": "UPDATE `follow_records` SET `client_id`=3,`member_id`=110,`number`='LXJL371',`contact_id`=32,`topic`='string',`sales_leads_id`=3,`follow_time`='1970-01-01 08:00:00',`next_follow_time`='1970-01-01 08:00:00',`purpose`='string',`content`='string',`updated_at`='2023-07-04 16:58:50.977' WHERE `follow_records`.`deleted_at` IS NULL"}
-[2023-07-04 17:00:53]	[error]	[aps_crm/model.(*FollowRecordSearch).Update:132]	trace	{"error": "WHERE conditions required", "elapsed": 0.0009347, "rows": 0, "sql": "UPDATE `follow_records` SET `client_id`=3,`member_id`=110,`number`='LXJL371',`contact_id`=32,`topic`='string',`sales_leads_id`=3,`follow_time`='1970-01-01 08:00:00',`next_follow_time`='1970-01-01 08:00:00',`purpose`='string',`content`='string',`updated_at`='2023-07-04 17:00:53.907' WHERE `follow_records`.`deleted_at` IS NULL"}
-[2023-07-04 17:01:37]	[error]	[aps_crm/model.(*FollowRecordSearch).Update:132]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005444, "rows": 0, "sql": "UPDATE `follow_records` SET `client_id`=3,`member_id`=110,`number`='LXJL371',`contact_id`=32,`topic`='string',`sales_leads_id`=3,`follow_time`='1970-01-01 08:00:00',`next_follow_time`='1970-01-01 08:00:00',`purpose`='string',`content`='string',`updated_at`='2023-07-04 17:01:37.026' WHERE `follow_records`.`deleted_at` IS NULL"}
-[2023-07-04 17:04:51]	[error]	[aps_crm/model.(*FollowRecordSearch).Update:132]	trace	{"error": "WHERE conditions required", "elapsed": 0.0005238, "rows": 0, "sql": "UPDATE `follow_records` SET `client_id`=3,`member_id`=110,`number`='LXJL371',`contact_id`=32,`topic`='string',`sales_leads_id`=3,`follow_time`='1970-01-01 08:00:00',`next_follow_time`='1970-01-01 08:00:00',`purpose`='string',`content`='string',`updated_at`='2023-07-04 17:04:51.636' WHERE `follow_records`.`deleted_at` IS NULL"}
-[2023-07-06 13:52:06]	[error]	[gorm.io/driver/mysql.Migrator.AlterColumn.func1:59]	trace	{"error": "Error 1170 (42000): BLOB/TEXT column 'name' used in key specification without a key length", "elapsed": 0.0005897, "rows": 0, "sql": "ALTER TABLE `client_origin` MODIFY COLUMN `name` longtext"}
-[2023-07-06 13:52:06]	[error]	[main.main:29]	model Init err:Error 1170 (42000): BLOB/TEXT column 'name' used in key specification without a key length
-[2023-07-06 13:52:52]	[error]	[gorm.io/driver/mysql.Migrator.AlterColumn.func1:59]	trace	{"error": "Error 1170 (42000): BLOB/TEXT column 'name' used in key specification without a key length", "elapsed": 0.0007521, "rows": 0, "sql": "ALTER TABLE `client_origin` MODIFY COLUMN `name` longtext"}
-[2023-07-06 13:52:52]	[error]	[main.main:29]	model Init err:Error 1170 (42000): BLOB/TEXT column 'name' used in key specification without a key length
-[2023-07-06 13:55:26]	[error]	[gorm.io/driver/mysql.Migrator.AlterColumn.func1:59]	trace	{"error": "Error 1170 (42000): BLOB/TEXT column 'name' used in key specification without a key length", "elapsed": 0.0007354, "rows": 0, "sql": "ALTER TABLE `client_level` MODIFY COLUMN `name` longtext"}
-[2023-07-06 13:55:26]	[error]	[main.main:29]	model Init err:Error 1170 (42000): BLOB/TEXT column 'name' used in key specification without a key length
-[2023-07-10 11:06:33]	[error]	[aps_crm/model.(*PossibilitySearch).Create:46]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.possibility' doesn't exist", "elapsed": 0.0032687, "rows": 0, "sql": "INSERT INTO `possibility` (`name`) VALUES ('10')"}
-[2023-07-10 20:54:43]	[error]	[aps_crm/model.(*SubOrderSearch).Create:45]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.sub_order' doesn't exist", "elapsed": 0.001705, "rows": 0, "sql": "INSERT INTO `sub_order` (`client_id`,`member_id`,`master_order_id`,`number`,`created_at`,`updated_at`,`deleted_at`) VALUES (11,110,1,'AC6521','2023-07-10 20:54:43.768','2023-07-10 20:54:43.768',NULL)"}
-[2023-07-11 10:43:59]	[error]	[gorm.io/gorm/migrator.Migrator.AutoMigrate:104]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", Products:[]model.Product(nil), Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field Products: define a valid foreign key for relations or implement the Valuer/Scanner interface
-[2023-07-11 10:43:59]	[error]	[gorm.io/gorm/migrator.Migrator.CreateTable:198]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", Products:[]model.Product(nil), Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field Products: define a valid foreign key for relations or implement the Valuer/Scanner interface
-[2023-07-11 10:43:59]	[error]	[main.main:29]	model Init err:invalid field found for struct aps_crm/model.SubOrder's field Products: define a valid foreign key for relations or implement the Valuer/Scanner interface
-[2023-07-11 11:31:58]	[error]	[gorm.io/gorm/migrator.Migrator.AutoMigrate:104]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", ProductOrder:model.ProductOrder{Id:0, Products:[]model.Product(nil)}, Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
-[2023-07-11 11:31:58]	[error]	[gorm.io/gorm/migrator.Migrator.CreateTable:198]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", ProductOrder:model.ProductOrder{Id:0, Products:[]model.Product(nil)}, Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
-[2023-07-11 11:31:58]	[error]	[main.main:29]	model Init err:invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
-[2023-07-11 11:32:32]	[error]	[gorm.io/gorm/migrator.Migrator.AutoMigrate:104]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", ProductOrder:model.ProductOrder{Id:0, Products:[]model.Product(nil)}, Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
-[2023-07-11 11:32:32]	[error]	[gorm.io/gorm/migrator.Migrator.CreateTable:198]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", ProductOrder:model.ProductOrder{Id:0, Products:[]model.Product(nil)}, Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
-[2023-07-11 11:32:32]	[error]	[main.main:29]	model Init err:invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
-[2023-07-11 11:33:55]	[error]	[gorm.io/gorm/migrator.Migrator.AutoMigrate:104]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", ProductOrder:model.ProductOrder{Id:0, Products:[]model.Product(nil)}, Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
-[2023-07-11 11:33:55]	[error]	[gorm.io/gorm/migrator.Migrator.CreateTable:198]	failed to parse value model.SubOrder{Id:0, ClientId:0, MemberId:0, MasterOrderId:0, Number:"", ProductOrder:model.ProductOrder{Id:0, Products:[]model.Product(nil)}, Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}}, got error invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
-[2023-07-11 11:33:55]	[error]	[main.main:29]	model Init err:invalid field found for struct aps_crm/model.SubOrder's field ProductOrder: define a valid foreign key for relations or implement the Valuer/Scanner interface
-[2023-07-12 15:23:10]	[error]	[aps_crm/model.(*ContractSearch).Create:46]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.contract' doesn't exist", "elapsed": 0.003547, "rows": 0, "sql": "INSERT INTO `contract` (`client_id`,`member_id`,`number`,`quotation_id`,`status_id`,`file`) VALUES (11,11,'ZDYB02-2',0,0,'string')"}
-[2023-07-13 10:55:49]	[error]	[aps_crm/model.(*ServiceContractSearch).FindAll:80]	trace	{"error": ": unsupported relations for schema ServiceContract", "elapsed": 0.001442, "rows": 2, "sql": "SELECT * FROM `service_contract`"}
-[2023-07-13 10:57:45]	[error]	[aps_crm/model.(*ServiceContractSearch).FindAll:80]	trace	{"error": ": unsupported relations for schema ServiceContract", "elapsed": 0.0011591, "rows": 2, "sql": "SELECT * FROM `service_contract`"}
-[2023-07-13 14:11:03]	[error]	[aps_crm/model.(*ServiceFollowupSearch).Create:53]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.service_followup' doesn't exist", "elapsed": 0.0024191, "rows": 0, "sql": "INSERT INTO `service_followup` (`client_id`,`number`,`contact_id`,`service_id`,`member_id`,`plan_id`,`satisfaction`,`timely_rate`,`solve_rate`,`is_visit`,`old_member_id`,`remark`,`file`) VALUES (0,'HF21',0,0,110,0,0,0,0,0,0,'string','string')"}
-[2023-07-13 15:00:16]	[error]	[aps_crm/model.(*CustomerServiceSheetSearch).Create:46]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.customer_service_sheet' doesn't exist", "elapsed": 0.0020622, "rows": 0, "sql": "INSERT INTO `customer_service_sheet` (`member_id`,`number`,`service_mode`,`priority`,`handle_status`,`created_at`,`updated_at`,`deleted_at`) VALUES (110,'HF30',0,0,0,'2023-07-13 15:00:16.507','2023-07-13 15:00:16.507',NULL)"}
-[2023-07-13 16:51:08]	[error]	[aps_crm/model.(*ServiceFeeManageSearch).Create:51]	trace	{"error": "Error 1146 (42S02): Table 'aps_crm.service_fee_manage' doesn't exist", "elapsed": 0.0153005, "rows": 0, "sql": "INSERT INTO `service_fee_manage` (`client_id`,`member_id`,`latest_date`,`remark`,`file`,`created_at`,`updated_at`,`deleted_at`) VALUES (11,11,'1970-01-01 08:00:00','string','string','2023-07-13 16:51:08.533','2023-07-13 16:51:08.533',NULL)"}
-[2023-07-13 17:00:44]	[error]	[aps_crm/model.(*ServiceFeeManageSearch).Update:56]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1", "elapsed": 0.0027936, "rows": 0, "sql": "UPDATE `service_fee_manage` SET `id`=1,`client_id`=11,`member_id`=11,`latest_date`='1970-01-01 08:00:00',`remark`='string',`file`='string',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:00:44.246',`deleted_at`=NULL WHERE id = 1 AND `service_fee_manage`.`deleted_at` IS NULL"}
-[2023-07-13 17:01:15]	[error]	[aps_crm/model.(*ServiceFeeManageSearch).Update:56]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1", "elapsed": 0.0022256, "rows": 0, "sql": "UPDATE `service_fee_manage` SET `id`=1,`client_id`=11,`member_id`=11,`latest_date`='1970-01-01 08:00:00',`remark`='string',`file`='string',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:01:15.183',`deleted_at`=NULL WHERE id = 1 AND `service_fee_manage`.`deleted_at` IS NULL"}
-[2023-07-13 17:08:23]	[error]	[aps_crm/model.(*ServiceFeeManageSearch).Update:56]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1", "elapsed": 0.0017581, "rows": 0, "sql": "UPDATE `service_fee_manage` SET `id`=1,`client_id`=11,`member_id`=11,`latest_date`='1970-01-01 08:00:00',`remark`='string',`file`='string',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:08:23.099',`deleted_at`=NULL WHERE id = 1 AND `service_fee_manage`.`deleted_at` IS NULL"}
-[2023-07-13 17:48:17]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'registration_time' at row 1", "elapsed": 0.0058166, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`client_type_id`=0,`client_origin_id`=0,`client_level_id`=0,`member_id`=11,`service_member_id`=0,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`country_id`=0,`province_id`=0,`city_id`=0,`region_id`=0,`representative`='',`registration_time`='0000-00-00 00:00:00',`registered_capital_id`=0,`industry_id`=0,`enterprise_nature_id`=0,`enterprise_scale_id`=0,`business_scope`='',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:48:17.558',`deleted_at`=NULL WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
-[2023-07-13 17:51:09]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'registration_time' at row 1", "elapsed": 0.0012249, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`client_type_id`=0,`client_origin_id`=0,`client_level_id`=0,`member_id`=11,`service_member_id`=0,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`country_id`=0,`province_id`=0,`city_id`=0,`region_id`=0,`representative`='',`registration_time`='0000-00-00 00:00:00',`registered_capital_id`=0,`industry_id`=0,`enterprise_nature_id`=0,`enterprise_scale_id`=0,`business_scope`='',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:51:09.321',`deleted_at`=NULL WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
-[2023-07-13 17:53:30]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'registration_time' at row 1", "elapsed": 0.0027763, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`client_type_id`=0,`client_origin_id`=0,`client_level_id`=0,`member_id`=11,`service_member_id`=0,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`country_id`=0,`province_id`=0,`city_id`=0,`region_id`=0,`representative`='',`registration_time`='0000-00-00 00:00:00',`registered_capital_id`=0,`industry_id`=0,`enterprise_nature_id`=0,`enterprise_scale_id`=0,`business_scope`='',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:53:30.214',`deleted_at`=NULL WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
-[2023-07-13 17:58:57]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1", "elapsed": 0.0033448, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`client_type_id`=0,`client_origin_id`=0,`client_level_id`=0,`member_id`=11,`service_member_id`=0,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`country_id`=0,`province_id`=0,`city_id`=1,`region_id`=0,`representative`='string',`registration_time`='1970-01-01 08:00:00',`registered_capital_id`=0,`industry_id`=0,`enterprise_nature_id`=0,`enterprise_scale_id`=0,`business_scope`='string',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:58:57.549',`deleted_at`=NULL WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
-[2023-07-13 17:59:36]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1", "elapsed": 0.0011543, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`client_type_id`=0,`client_origin_id`=0,`client_level_id`=0,`member_id`=11,`service_member_id`=0,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`country_id`=0,`province_id`=0,`city_id`=1,`region_id`=0,`representative`='string',`registration_time`='1970-01-01 08:00:00',`registered_capital_id`=0,`industry_id`=0,`enterprise_nature_id`=0,`enterprise_scale_id`=0,`business_scope`='string',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 17:59:36.66',`deleted_at`=NULL WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
-[2023-07-13 18:01:19]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1", "elapsed": 0.0013602, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`client_type_id`=0,`client_origin_id`=0,`client_level_id`=0,`member_id`=11,`service_member_id`=0,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`country_id`=0,`province_id`=0,`city_id`=1,`region_id`=0,`representative`='string',`registration_time`='1970-01-01 08:00:00',`registered_capital_id`=0,`industry_id`=0,`enterprise_nature_id`=0,`enterprise_scale_id`=0,`business_scope`='string',`created_at`='0000-00-00 00:00:00',`updated_at`='2023-07-13 18:01:19.088',`deleted_at`=NULL WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
-[2023-07-13 18:01:58]	[error]	[aps_crm/model.(*ClientSearch).Update:70]	trace	{"error": "Error 1062 (23000): Duplicate entry 'string' for key 'name'", "elapsed": 0.0014261, "rows": 0, "sql": "UPDATE `clients` SET `id`=11,`name`='string',`number`='string',`client_status_id`=1,`member_id`=11,`detail_address`='string',`remark`='string',`next_visit_time`='1970-01-01 08:00:00',`latest_service_time`='1970-01-01 08:00:00',`city_id`=1,`representative`='string',`registration_time`='1970-01-01 08:00:00',`business_scope`='string',`updated_at`='2023-07-13 18:01:58.989' WHERE id = 11 AND `clients`.`deleted_at` IS NULL"}
diff --git a/middleware/casbin_rbac.go b/middleware/casbin_rbac.go
new file mode 100644
index 0000000..db77b33
--- /dev/null
+++ b/middleware/casbin_rbac.go
@@ -0,0 +1,39 @@
+package middleware
+
+import (
+	"aps_crm/pkg/contextx"
+	"aps_crm/pkg/ecode"
+	"aps_crm/service"
+	"aps_crm/utils"
+	"strconv"
+	"strings"
+
+	"github.com/gin-gonic/gin"
+)
+
+var casbinService = service.ServiceGroup.CasbinService
+
+// CasbinHandler 鎷︽埅鍣�
+func CasbinHandler() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		waitUse, _ := utils.GetClaims(c)
+		ctx := new(contextx.Context).SetCtx(c)
+		//鑾峰彇璇锋眰鐨凱ATH
+		path := c.Request.URL.Path
+		//obj := strings.TrimPrefix(path, global.GVA_CONFIG.System.RouterPrefix)
+		obj := strings.TrimPrefix(path, "")
+		// 鑾峰彇璇锋眰鏂规硶
+		act := c.Request.Method
+		// 鑾峰彇鐢ㄦ埛鐨勮鑹�
+		sub := strconv.Itoa(int(waitUse.AuthorityId))
+		e := casbinService.Casbin() // 鍒ゆ柇绛栫暐涓槸鍚﹀瓨鍦�
+		success, _ := e.Enforce(sub, obj, act)
+		if !success {
+			// response.FailWithDetailed(gin.H{}, "鏉冮檺涓嶈冻", c)
+			c.Abort()
+			ctx.Fail(ecode.NoPowerErr)
+			return
+		}
+		c.Next()
+	}
+}
diff --git a/middleware/jwt.go b/middleware/jwt.go
index d1f97b7..9ca981c 100644
--- a/middleware/jwt.go
+++ b/middleware/jwt.go
@@ -1,12 +1,17 @@
 package middleware
 
 import (
+	"aps_crm/conf"
+	"aps_crm/model"
 	"aps_crm/pkg/contextx"
 	"aps_crm/pkg/ecode"
+	"aps_crm/pkg/logx"
 	"aps_crm/service"
 	"aps_crm/utils"
 	"github.com/gin-gonic/gin"
+	"strconv"
 	"strings"
+	"time"
 )
 
 var jwtService = service.ServiceGroup.JwtService
@@ -52,24 +57,24 @@
 		//	response.FailWithDetailed(gin.H{"reload": true}, err.Error(), c)
 		//	c.Abort()
 		//}
-		//if claims.ExpiresAt-time.Now().Unix() < claims.BufferTime {
-		//	dr, _ := utils.ParseDuration(conf.Conf.JWT.ExpiresTime)
-		//	claims.ExpiresAt = time.Now().Add(dr).Unix()
-		//	newToken, _ := j.CreateTokenByOldToken(token, *claims)
-		//	newClaims, _ := j.ParseToken(newToken)
-		//	c.Header("new-token", newToken)
-		//	c.Header("new-expires-at", strconv.FormatInt(newClaims.ExpiresAt, 10))
-		//	if conf.Conf.System.UseMultipoint {
-		//		RedisJwtToken, err := jwtService.GetRedisJWT(newClaims.Username)
-		//		if err != nil {
-		//			logx.Errorf("get redis jwt failed err:%v", err)
-		//		} else { // 褰撲箣鍓嶇殑鍙栨垚鍔熸椂鎵嶈繘琛屾媺榛戞搷浣�
-		//			_ = jwtService.JsonInBlacklist(model.JwtBlacklist{Jwt: RedisJwtToken})
-		//		}
-		//		// 鏃犺濡備綍閮借璁板綍褰撳墠鐨勬椿璺冪姸鎬�
-		//		_ = jwtService.SetRedisJWT(newToken, newClaims.Username)
-		//	}
-		//}
+		if claims.ExpiresAt-time.Now().Unix() < claims.BufferTime {
+			dr, _ := utils.ParseDuration(conf.Conf.JWT.ExpiresTime)
+			claims.ExpiresAt = time.Now().Add(dr).Unix()
+			newToken, _ := j.CreateTokenByOldToken(token, *claims)
+			newClaims, _ := j.ParseToken(newToken)
+			c.Header("new-token", newToken)
+			c.Header("new-expires-at", strconv.FormatInt(newClaims.ExpiresAt, 10))
+			if conf.Conf.System.UseMultipoint {
+				RedisJwtToken, err := jwtService.GetRedisJWT(newClaims.Username)
+				if err != nil {
+					logx.Errorf("get redis jwt failed err:%v", err)
+				} else { // 褰撲箣鍓嶇殑鍙栨垚鍔熸椂鎵嶈繘琛屾媺榛戞搷浣�
+					_ = jwtService.JsonInBlacklist(model.JwtBlacklist{Jwt: RedisJwtToken})
+				}
+				// 鏃犺濡備綍閮借璁板綍褰撳墠鐨勬椿璺冪姸鎬�
+				_ = jwtService.SetRedisJWT(newToken, newClaims.Username)
+			}
+		}
 		c.Set("claims", claims)
 		c.Next()
 	}
diff --git a/model/authority.go b/model/authority.go
new file mode 100644
index 0000000..b05889b
--- /dev/null
+++ b/model/authority.go
@@ -0,0 +1,67 @@
+package model
+
+import (
+	"aps_crm/pkg/mysqlx"
+	"gorm.io/gorm"
+)
+
+type (
+	Authority struct {
+		AuthorityId   uint   `json:"authorityId" gorm:"not null;unique;primary_key;comment:瑙掕壊ID;size:90"` // 瑙掕壊ID
+		AuthorityName string `json:"authorityName" gorm:"comment:瑙掕壊鍚�"`                                    // 瑙掕壊鍚�
+		Users         []User `json:"-" gorm:"many2many:user_authority;"`
+		Menus         []Menu `json:"menus" gorm:"many2many:authority_menus;"`
+		DefaultRouter string `json:"defaultRouter" gorm:"comment:榛樿鑿滃崟;default:dashboard"` // 榛樿鑿滃崟(榛樿dashboard)
+		gorm.Model    `json:"-"`
+	}
+
+	SysAuthoritySearch struct {
+		Authority
+		Orm *gorm.DB
+	}
+)
+
+func (Authority) TableName() string {
+	return "sys_authorities"
+}
+
+func NewSysAuthoritySearch() *SysAuthoritySearch {
+	return &SysAuthoritySearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *SysAuthoritySearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&Authority{})
+	if slf.AuthorityId != 0 {
+		db = db.Where("authority_id = ?", slf.AuthorityId)
+	}
+
+	return db
+}
+
+func (slf *SysAuthoritySearch) Create(record *Authority) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *SysAuthoritySearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&Authority{}).Error
+}
+
+func (slf *SysAuthoritySearch) Update(record *Authority) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *SysAuthoritySearch) Find() (result Authority, err error) {
+	var db = slf.build()
+	err = db.First(&result).Error
+	return
+}
+
+func (slf *SysAuthoritySearch) SetAuthorityId(id uint) *SysAuthoritySearch {
+	slf.AuthorityId = id
+	return slf
+}
diff --git a/model/menu.go b/model/menu.go
index b74a46f..715f476 100644
--- a/model/menu.go
+++ b/model/menu.go
@@ -4,25 +4,16 @@
 	"aps_crm/pkg/mysqlx"
 	"fmt"
 	"gorm.io/gorm"
-	"time"
 )
 
 type (
 	Menu struct {
-		ID         uint    `json:"id" gorm:"type:bigint(20);primaryKey"` // 涓婚敭ID
-		ParentId   uint    `json:"parentId" gorm:"index;type:bigint(20);comment:鐖惰彍鍗旾D"`
-		Path       string  `json:"path" gorm:"type:varchar(255);comment:璺敱path"`
-		Name       string  `json:"name" gorm:"type:varchar(255);comment:name"`
-		Title      string  `json:"title" gorm:"type:varchar(255);comment:鏍囬"`
-		Sort       int     `json:"sort" gorm:"type:int(11);comment:鎺掑簭鏍囪"`
-		Icon       string  `json:"icon" gorm:"type:varchar(512);comment:鑿滃崟鍥炬爣"`
-		Hidden     bool    `json:"hidden" gorm:"type:tinyint(1);comment:鏄惁闅愯棌"`
-		Type       int     `json:"type" gorm:"type:int(11);comment:绫诲瀷 0-鐩綍 1-鑿滃崟 2-鎸夐挳"`
-		CreateTime int64   `json:"-"  gorm:"type:bigint(20);comment:鍒涘缓鏃堕棿"`
-		UpdateTime int64   `json:"-"  gorm:"type:bigint(20);comment:鏇存柊鏃堕棿"`
-		Children   []*Menu `json:"children" gorm:"-"`
-		CreateAt   string  `json:"createAt" gorm:"-"` // 鍒涘缓鏃堕棿
-		UpdateAt   string  `json:"updateAt" gorm:"-"` // 鏇存柊鏃堕棿
+		ID       uint    `json:"id" gorm:"type:bigint(20);primaryKey"` // 涓婚敭ID
+		ParentId uint    `json:"parentId" gorm:"index;type:bigint(20);comment:鐖惰彍鍗旾D"`
+		Path     string  `json:"path" gorm:"type:varchar(255);comment:璺敱path"`
+		Name     string  `json:"name" gorm:"type:varchar(255);comment:name"`
+		Title    string  `json:"title" gorm:"type:varchar(255);comment:鏍囬"`
+		Children []*Menu `json:"children" gorm:"-"`
 	}
 
 	MenuSearch struct {
@@ -37,28 +28,6 @@
 
 func (slf Menu) TableName() string {
 	return "menu"
-}
-
-func (slf *Menu) BeforeCreate(tx *gorm.DB) error {
-	slf.CreateTime = time.Now().Unix()
-	slf.UpdateTime = slf.CreateTime
-	return nil
-}
-
-func (slf *Menu) BeforeSave(tx *gorm.DB) error {
-	slf.UpdateTime = time.Now().Unix()
-	return nil
-}
-
-func (slf *Menu) BeforeUpdate(tx *gorm.DB) error {
-	slf.UpdateTime = time.Now().Unix()
-	return nil
-}
-
-func (slf *Menu) AfterFind(tx *gorm.DB) error {
-	slf.CreateAt = time.Unix(slf.CreateTime, 0).Format("2006-01-02 15:04:05")
-	slf.UpdateAt = time.Unix(slf.UpdateTime, 0).Format("2006-01-02 15:04:05")
-	return nil
 }
 
 func NewMenuSearch(db *gorm.DB) *MenuSearch {
@@ -140,7 +109,7 @@
 func (slf *MenuSearch) CreateBatch(records []*Menu) error {
 	var db = slf.build()
 
-	if err := db.Create(&records).Error; err != nil {
+	if err := db.Save(&records).Error; err != nil {
 		return fmt.Errorf("create batch err: %v, records: %+v", err, records)
 	}
 
@@ -277,3 +246,16 @@
 
 	return records, nil
 }
+
+func (slf *MenuSearch) FindAll() ([]*Menu, error) {
+	var (
+		records = make([]*Menu, 0)
+		db      = slf.build()
+	)
+
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find all err: %v", err)
+	}
+
+	return records, nil
+}
diff --git a/model/request/authority.go b/model/request/authority.go
new file mode 100644
index 0000000..287f7b6
--- /dev/null
+++ b/model/request/authority.go
@@ -0,0 +1,10 @@
+package request
+
+type AddAuthority struct {
+	AuthorityName string `json:"authorityName"`
+}
+
+type SetAuthorityMenu struct {
+	AuthorityId uint   `json:"authorityId"`
+	Menus       []uint `json:"menus"`
+}
diff --git a/model/request/jwt.go b/model/request/jwt.go
index 7f1efa1..1b2f444 100644
--- a/model/request/jwt.go
+++ b/model/request/jwt.go
@@ -13,8 +13,9 @@
 }
 
 type BaseClaims struct {
-	UserId   string
-	Username string
-	ParentId string
-	UserType constvar.UserType
+	UserId      string
+	Username    string
+	ParentId    string
+	UserType    constvar.UserType
+	AuthorityId uint
 }
diff --git a/model/response/response.go b/model/response/response.go
index b22ccdf..08d86e3 100644
--- a/model/response/response.go
+++ b/model/response/response.go
@@ -173,4 +173,8 @@
 	ServiceFeeManageResponse struct {
 		List []*model.ServiceFeeManage `json:"list"`
 	}
+
+	MenuTreeResponse struct {
+		List []*model.Menu `json:"list"`
+	}
 )
diff --git a/pkg/ecode/code.go b/pkg/ecode/code.go
index f6ebb8a..cc8acc3 100644
--- a/pkg/ecode/code.go
+++ b/pkg/ecode/code.go
@@ -268,4 +268,13 @@
 	ServiceFeeManageUpdateErr = 3700005 // 鏇存柊鏈嶅姟璐圭鐞嗗け璐�
 	ServiceFeeManageDeleteErr = 3700006 // 鍒犻櫎鏈嶅姟璐圭鐞嗗け璐�
 
+	RoleExist      = 3800001 // 瑙掕壊宸插瓨鍦�
+	RoleNotExist   = 3800002 // 瑙掕壊涓嶅瓨鍦�
+	RoleListErr    = 3800003 // 鑾峰彇瑙掕壊鍒楄〃澶辫触
+	RoleSetErr     = 3800004 // 璁剧疆瑙掕壊澶辫触
+	RoleUpdateErr  = 3800005 // 鏇存柊瑙掕壊澶辫触
+	RoleDeleteErr  = 3800006 // 鍒犻櫎瑙掕壊澶辫触
+	RoleDeleteErr1 = 3800007 // 璇ヨ鑹蹭笅瀛樺湪鐢ㄦ埛锛屾棤娉曞垹闄�
+
+	MenuListErr = 3900001 // 鑾峰彇鑿滃崟鍒楄〃澶辫触
 )
diff --git a/router/authority.go b/router/authority.go
new file mode 100644
index 0000000..64f8160
--- /dev/null
+++ b/router/authority.go
@@ -0,0 +1,21 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+type AuthorityRouter struct{}
+
+func (s *AuthorityRouter) InitAuthorityRouter(router *gin.RouterGroup) {
+	authorityRouter := router.Group("authority")
+	authorityApi := v1.ApiGroup.AuthorityApi
+	{
+		authorityRouter.POST("add", authorityApi.CreateAuthority) // 鏂板瑙掕壊
+		//authorityRouter.DELETE("delete", authorityApi.Delete)              // 鍒犻櫎瑙掕壊
+		//authorityRouter.PUT("update", authorityApi.Update)                 // 鏇存柊瑙掕壊
+		//authorityRouter.POST("getAuthorityList", authorityApi.GetAuthorityList) // 鑾峰彇瑙掕壊鍒楄〃
+		authorityRouter.POST("setDataAuthority", authorityApi.SetDataAuthority) // 璁剧疆瑙掕壊璧勬簮鏉冮檺
+		//authorityRouter.POST("getAuthorityId", authorityApi.GetAuthorityId) // 鑾峰彇鎸囧畾瑙掕壊鏉冮檺
+	}
+}
diff --git a/router/index.go b/router/index.go
index f4bf5a5..86e30e3 100644
--- a/router/index.go
+++ b/router/index.go
@@ -50,6 +50,8 @@
 	ServiceFollowupRouter
 	CustomerServiceSheetRouter
 	ServiceFeeManageRouter
+	AuthorityRouter
+	MenuRouter
 }
 
 func InitRouter() *gin.Engine {
@@ -77,7 +79,7 @@
 	}
 
 	PrivateGroup := Router.Group("api")
-	//PrivateGroup.Use(middleware.JWTAuth())
+	//PrivateGroup.Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
 	{
 		routerGroup.InitJwtRouter(PrivateGroup)                  // jwt鐩稿叧璺敱
 		routerGroup.InitUserRouter(PrivateGroup)                 // 娉ㄥ唽鐢ㄦ埛璺敱
@@ -117,6 +119,8 @@
 		routerGroup.InitServiceFollowupRouter(PrivateGroup)      // 娉ㄥ唽serviceFollowup璺敱
 		routerGroup.InitCustomerServiceSheetRouter(PrivateGroup) // 娉ㄥ唽customerServiceSheet璺敱
 		routerGroup.InitServiceFeeManageRouter(PrivateGroup)     // 娉ㄥ唽serviceFeeManage璺敱
+		routerGroup.InitAuthorityRouter(PrivateGroup)            // 娉ㄥ唽authority璺敱
+		routerGroup.InitMenuRouter(PrivateGroup)                 // 娉ㄥ唽menu璺敱
 	}
 	return Router
 }
diff --git a/router/menu.go b/router/menu.go
new file mode 100644
index 0000000..5f8a141
--- /dev/null
+++ b/router/menu.go
@@ -0,0 +1,16 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+type MenuRouter struct{}
+
+func (m *MenuRouter) InitMenuRouter(router *gin.RouterGroup) {
+	menuRouter := router.Group("menu")
+	menuApi := v1.ApiGroup.MenuApi
+	{
+		menuRouter.GET("getMenu", menuApi.List) // 鑾峰彇鑿滃崟鏍�
+	}
+}
diff --git a/service/authority.go b/service/authority.go
new file mode 100644
index 0000000..b2aefb2
--- /dev/null
+++ b/service/authority.go
@@ -0,0 +1,91 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/pkg/ecode"
+	"github.com/flipped-aurora/gin-vue-admin/server/global"
+	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
+	"gorm.io/gorm"
+	"strconv"
+)
+
+type AuthorityService struct{}
+
+var AuthorityServiceApp = new(AuthorityService)
+
+func (authorityService *AuthorityService) CreateAuthority(auth model.Authority) int {
+	_, err := model.NewSysAuthoritySearch().SetAuthorityId(auth.AuthorityId).Find()
+	if err != gorm.ErrRecordNotFound {
+		return ecode.RoleExist
+	}
+
+	err = model.NewSysAuthoritySearch().Create(&auth)
+	if err != nil {
+		return ecode.SubOrderExist
+	}
+
+	return ecode.OK
+}
+
+func (authorityService *AuthorityService) UpdateAuthority(auth model.Authority) int {
+	_, err := model.NewSysAuthoritySearch().SetAuthorityId(auth.AuthorityId).Find()
+	if err != nil {
+		return ecode.RoleNotExist
+	}
+
+	err = model.NewSysAuthoritySearch().SetAuthorityId(auth.AuthorityId).Update(&auth)
+
+	return ecode.OK
+}
+
+func (authorityService *AuthorityService) DeleteAuthority(auth *model.Authority) int {
+	_, err := model.NewSysAuthoritySearch().SetAuthorityId(auth.AuthorityId).Find()
+	if err != nil {
+		return ecode.RoleNotExist
+	}
+
+	if len(auth.Users) != 0 {
+		return ecode.RoleDeleteErr1
+	}
+
+	authorityId := strconv.Itoa(int(auth.AuthorityId))
+	CasbinServiceApp.ClearCasbin(0, authorityId)
+	return ecode.OK
+}
+
+//@author: [piexlmax](https://github.com/piexlmax)
+//@function: GetAuthorityInfo
+//@description: 鑾峰彇鎵�鏈夎鑹蹭俊鎭�
+//@param: auth model.Authority
+//@return: sa system.Authority, err error
+
+func (authorityService *AuthorityService) GetAuthorityInfo(auth system.SysAuthority) (sa system.SysAuthority, err error) {
+	err = global.GVA_DB.Preload("DataAuthorityId").Where("authority_id = ?", auth.AuthorityId).First(&sa).Error
+	return sa, err
+}
+
+//@author: [piexlmax](https://github.com/piexlmax)
+//@function: SetDataAuthority
+//@description: 璁剧疆瑙掕壊璧勬簮鏉冮檺
+//@param: auth model.Authority
+//@return: error
+
+func (authorityService *AuthorityService) SetDataAuthority(auth system.SysAuthority) error {
+	var s system.SysAuthority
+	global.GVA_DB.Preload("DataAuthorityId").First(&s, "authority_id = ?", auth.AuthorityId)
+	err := global.GVA_DB.Model(&s).Association("DataAuthorityId").Replace(&auth.DataAuthorityId)
+	return err
+}
+
+//@author: [piexlmax](https://github.com/piexlmax)
+//@function: SetMenuAuthority
+//@description: 鑿滃崟涓庤鑹茬粦瀹�
+//@param: auth *model.Authority
+//@return: error
+
+func (authorityService *AuthorityService) SetMenuAuthority(auth *system.SysAuthority) error {
+	var s system.SysAuthority
+	global.GVA_DB.Preload("SysBaseMenus").First(&s, "authority_id = ?", auth.AuthorityId)
+	err := global.GVA_DB.Model(&s).Association("SysBaseMenus").Replace(&auth.SysBaseMenus)
+	return err
+}
diff --git a/service/casbin.go b/service/casbin.go
new file mode 100644
index 0000000..38ec1d0
--- /dev/null
+++ b/service/casbin.go
@@ -0,0 +1,135 @@
+package service
+
+import (
+	"errors"
+	"github.com/flipped-aurora/gin-vue-admin/server/global"
+	"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
+	"strconv"
+	"sync"
+
+	"github.com/casbin/casbin/v2"
+	"github.com/casbin/casbin/v2/model"
+	gormadapter "github.com/casbin/gorm-adapter/v3"
+	_ "github.com/go-sql-driver/mysql"
+	"go.uber.org/zap"
+)
+
+//@author: [piexlmax](https://github.com/piexlmax)
+//@function: UpdateCasbin
+//@description: 鏇存柊casbin鏉冮檺
+//@param: authorityId string, casbinInfos []request.CasbinInfo
+//@return: error
+
+type CasbinService struct{}
+
+var CasbinServiceApp = new(CasbinService)
+
+func (casbinService *CasbinService) UpdateCasbin(AuthorityID uint, casbinInfos []request.CasbinInfo) error {
+	authorityId := strconv.Itoa(int(AuthorityID))
+	casbinService.ClearCasbin(0, authorityId)
+	rules := [][]string{}
+	for _, v := range casbinInfos {
+		rules = append(rules, []string{authorityId, v.Path, v.Method})
+	}
+	e := casbinService.Casbin()
+	success, _ := e.AddPolicies(rules)
+	if !success {
+		return errors.New("瀛樺湪鐩稿悓api,娣诲姞澶辫触,璇疯仈绯荤鐞嗗憳")
+	}
+	return nil
+}
+
+//@author: [piexlmax](https://github.com/piexlmax)
+//@function: UpdateCasbinApi
+//@description: API鏇存柊闅忓姩
+//@param: oldPath string, newPath string, oldMethod string, newMethod string
+//@return: error
+
+func (casbinService *CasbinService) UpdateCasbinApi(oldPath string, newPath string, oldMethod string, newMethod string) error {
+	err := global.GVA_DB.Model(&gormadapter.CasbinRule{}).Where("v1 = ? AND v2 = ?", oldPath, oldMethod).Updates(map[string]interface{}{
+		"v1": newPath,
+		"v2": newMethod,
+	}).Error
+	e := casbinService.Casbin()
+	err = e.LoadPolicy()
+	if err != nil {
+		return err
+	}
+	return err
+}
+
+//@author: [piexlmax](https://github.com/piexlmax)
+//@function: GetPolicyPathByAuthorityId
+//@description: 鑾峰彇鏉冮檺鍒楄〃
+//@param: authorityId string
+//@return: pathMaps []request.CasbinInfo
+
+func (casbinService *CasbinService) GetPolicyPathByAuthorityId(AuthorityID uint) (pathMaps []request.CasbinInfo) {
+	e := casbinService.Casbin()
+	authorityId := strconv.Itoa(int(AuthorityID))
+	list := e.GetFilteredPolicy(0, authorityId)
+	for _, v := range list {
+		pathMaps = append(pathMaps, request.CasbinInfo{
+			Path:   v[1],
+			Method: v[2],
+		})
+	}
+	return pathMaps
+}
+
+//@author: [piexlmax](https://github.com/piexlmax)
+//@function: ClearCasbin
+//@description: 娓呴櫎鍖归厤鐨勬潈闄�
+//@param: v int, p ...string
+//@return: bool
+
+func (casbinService *CasbinService) ClearCasbin(v int, p ...string) bool {
+	e := casbinService.Casbin()
+	success, _ := e.RemoveFilteredPolicy(v, p...)
+	return success
+}
+
+//@author: [piexlmax](https://github.com/piexlmax)
+//@function: Casbin
+//@description: 鎸佷箙鍖栧埌鏁版嵁搴�  寮曞叆鑷畾涔夎鍒�
+//@return: *casbin.Enforcer
+
+var (
+	syncedCachedEnforcer *casbin.SyncedCachedEnforcer
+	once                 sync.Once
+)
+
+func (casbinService *CasbinService) Casbin() *casbin.SyncedCachedEnforcer {
+	once.Do(func() {
+		a, err := gormadapter.NewAdapterByDB(global.GVA_DB)
+		if err != nil {
+			zap.L().Error("閫傞厤鏁版嵁搴撳け璐ヨ妫�鏌asbin琛ㄦ槸鍚︿负InnoDB寮曟搸!", zap.Error(err))
+			return
+		}
+		text := `
+		[request_definition]
+		r = sub, obj, act
+		
+		[policy_definition]
+		p = sub, obj, act
+		
+		[role_definition]
+		g = _, _
+		
+		[policy_effect]
+		e = some(where (p.eft == allow))
+		
+		[matchers]
+		m = r.sub == p.sub && keyMatch2(r.obj,p.obj) && r.act == p.act
+		`
+		m, err := model.NewModelFromString(text)
+		if err != nil {
+			zap.L().Error("瀛楃涓插姞杞芥ā鍨嬪け璐�!", zap.Error(err))
+			return
+		}
+		syncedCachedEnforcer, _ = casbin.NewSyncedCachedEnforcer(m, a)
+		syncedCachedEnforcer.SetExpireTime(60 * 60)
+		_ = syncedCachedEnforcer.LoadPolicy()
+	})
+	return syncedCachedEnforcer
+}
diff --git a/service/index.go b/service/index.go
index bd133db..9ee20bc 100644
--- a/service/index.go
+++ b/service/index.go
@@ -39,6 +39,9 @@
 	FollowupService
 	CustomerServiceSheetService
 	FeeManageService
+	CasbinService
+	AuthorityService
+	MenuService
 }
 
 var ServiceGroup = new(Group)
diff --git a/service/menu.go b/service/menu.go
new file mode 100644
index 0000000..3f11055
--- /dev/null
+++ b/service/menu.go
@@ -0,0 +1,17 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/pkg/ecode"
+)
+
+type MenuService struct{}
+
+func (MenuService) GetMenuTree() ([]*model.Menu, int) {
+	list, err := model.NewMenuSearch(nil).FindAll()
+	if err != nil {
+		return nil, ecode.MenuListErr
+	}
+
+	return list, ecode.OK
+}
diff --git a/source/menu.go b/source/menu.go
index fa71fd3..18ed3aa 100644
--- a/source/menu.go
+++ b/source/menu.go
@@ -22,31 +22,18 @@
 
 func (i *initMenu) InitializeData(ctx context.Context) (next context.Context, err error) {
 	entities := []*model.Menu{
-		{ID: 1, Hidden: false, ParentId: 0, Path: "", Name: "", Title: "杞﹂棿绠$悊", Sort: 1, Icon: "home", Type: 0},
-		{ID: 2, Hidden: false, ParentId: 1, Path: "/facilty", Name: "", Title: "璁惧绠$悊", Sort: 2, Icon: "object-ungroup", Type: 1},
-		{ID: 3, Hidden: false, ParentId: 1, Path: "/faciltyResource", Name: "", Title: "璁惧璧勬簮", Sort: 3, Icon: "object-group", Type: 1},
-		{ID: 4, Hidden: false, ParentId: 1, Path: "/oricedureDiagram", Name: "", Title: "璁惧宸ュ簭鍥�", Sort: 4, Icon: "object-group", Type: 1},
+		{ID: 1, ParentId: 0, Path: "", Name: "", Title: "瀹㈡埛绠$悊"},
+		{ID: 2, ParentId: 1, Path: "/client", Name: "", Title: "瀹㈡埛绠$悊"},
 
-		{ID: 5, Hidden: false, ParentId: 0, Path: "", Name: "", Title: "鐢熶骇璁″垝", Sort: 5, Icon: "paper-plane", Type: 0},
-		{ID: 6, Hidden: false, ParentId: 5, Path: "/orderManagement", Name: "", Title: "璁㈠崟绠$悊", Sort: 6, Icon: "files-o", Type: 1},
-		{ID: 7, Hidden: false, ParentId: 5, Path: "/plannedProduction", Name: "", Title: "璁″垝鐢熶骇", Sort: 7, Icon: "", Type: 1},
-		{ID: 8, Hidden: false, ParentId: 5, Path: "/Scheduling", Name: "", Title: "鐢熶骇鎺掔▼", Sort: 8, Icon: "delicious", Type: 1},
-		{ID: 9, Hidden: false, ParentId: 5, Path: "/productionProcess", Name: "", Title: "鐢熶骇宸ュ簭琛�", Sort: 9, Icon: "", Type: 1},
+		{ID: 3, ParentId: 0, Path: "", Name: "", Title: "閿�鍞鐞�"},
+		{ID: 4, ParentId: 3, Path: "/saleChance", Name: "", Title: "閿�鍞満浼�"},
 
-		{ID: 10, Hidden: false, ParentId: 0, Path: "", Name: "", Title: "鍩虹鏁版嵁", Sort: 10, Icon: "database", Type: 0},
-		{ID: 11, Hidden: false, ParentId: 10, Path: "/inventory", Name: "", Title: "BOM绠$悊", Sort: 11, Icon: "film", Type: 1},
-		{ID: 12, Hidden: false, ParentId: 10, Path: "/bomCraft", Name: "", Title: "浜у搧/宸ュ簭", Sort: 12, Icon: "sliders", Type: 1},
-		{ID: 13, Hidden: false, ParentId: 10, Path: "/humanResource", Name: "", Title: "浜哄姏璧勬簮", Sort: 13, Icon: "", Type: 1},
-		{ID: 14, Hidden: false, ParentId: 10, Path: "/calendar", Name: "", Title: "鐢熶骇鏃ュ巻", Sort: 14, Icon: "user", Type: 1},
-		{ID: 15, Hidden: false, ParentId: 10, Path: "/abilityModel", Name: "", Title: "妯℃澘绠$悊", Sort: 15, Icon: "connectdevelop", Type: 1},
-		{ID: 16, Hidden: false, ParentId: 10, Path: "/mouldManagement", Name: "", Title: "妯″叿绠$悊", Sort: 16, Icon: "", Type: 1},
-		{ID: 17, Hidden: false, ParentId: 10, Path: "/gauge", Name: "", Title: "妫�鍏风鐞�", Sort: 17, Icon: "", Type: 1},
-		{ID: 18, Hidden: false, ParentId: 10, Path: "/transportation", Name: "", Title: "瑙勮寖绠$悊", Sort: 18, Icon: "", Type: 1},
-		{ID: 19, Hidden: false, ParentId: 10, Path: "/proccessModel", Name: "", Title: "宸ヨ壓妯″瀷", Sort: 19, Icon: "", Type: 1},
-		{ID: 20, Hidden: false, ParentId: 10, Path: "/dictionary", Name: "", Title: "鏁版嵁閰嶇疆", Sort: 20, Icon: "", Type: 1},
+		{ID: 5, ParentId: 0, Path: "", Name: "", Title: "鏈嶅姟绠$悊"},
+		{ID: 6, ParentId: 5, Path: "/serviceContract", Name: "", Title: "鏈嶅姟鍚堝悓"},
 
-		{ID: 21, Hidden: false, ParentId: 0, Path: "", Name: "", Title: "绯荤粺璁剧疆", Sort: 21, Icon: "database", Type: 0},
-		{ID: 22, Hidden: false, ParentId: 21, Path: "/system/userManage", Name: "", Title: "绠$悊鍛樼鐞�", Sort: 22, Icon: "film", Type: 1},
+		{ID: 7, ParentId: 0, Path: "", Name: "", Title: "鍚庡彴璁剧疆"},
+		{ID: 8, ParentId: 7, Path: "/member", Name: "", Title: "鎴愬憳绠$悊"},
+		{ID: 9, ParentId: 7, Path: "/role", Name: "", Title: "瑙掕壊绠$悊"},
 	}
 	if err = model.NewMenuSearch(nil).CreateBatch(entities); err != nil {
 		return ctx, errors.Wrap(err, i.InitializerName()+"琛ㄦ暟鎹垵濮嬪寲澶辫触!")

--
Gitblit v1.8.0