From 6d9a07f5ddefd883c260efe9cc1ff916e40797a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B0=E4=BA=AE?= Date: Sat, 22 May 2021 16:05:51 +0800 Subject: [PATCH] upgrade --- assets/templates/install/upgrade_view.html | 4 +- configs/constants.go | 6 +- .../controller/admin_handler/func_detail.go | 10 ++- .../controller/admin_handler/func_login.go | 14 ++- .../controller/admin_handler/func_logout.go | 2 +- internal/api/service/admin_service/service.go | 3 +- .../service/admin_service/service_myaction.go | 28 +++++- .../authorized_service/service_detailbykey.go | 90 ++++++++++--------- internal/pkg/core/core.go | 11 ++- internal/pkg/metrics/metrics.go | 20 ++--- internal/pkg/password/password.go | 11 +-- internal/router/middleware/middle_rbac.go | 14 ++- internal/router/middleware/middle_resubmit.go | 6 +- .../router/middleware/middle_signature.go | 16 ++-- internal/router/middleware/middle_token.go | 13 ++- .../config_handler/func_codeview.go | 77 ++++++++-------- .../generator_handler/func_gormexecute.go | 5 +- .../generator_handler/func_gormview.go | 13 +++ .../generator_handler/func_handlerexecute.go | 4 +- .../controller/tool_handler/func_logsview.go | 33 +++---- main.go | 11 +-- 21 files changed, 246 insertions(+), 145 deletions(-) diff --git a/assets/templates/install/upgrade_view.html b/assets/templates/install/upgrade_view.html index fa24f5b..1b12b52 100644 --- a/assets/templates/install/upgrade_view.html +++ b/assets/templates/install/upgrade_view.html @@ -79,9 +79,9 @@

- v1.26 + v1.2.6 -> - v1.27 + v1.2.7

......

diff --git a/configs/constants.go b/configs/constants.go index 184850a..7a4b69a 100644 --- a/configs/constants.go +++ b/configs/constants.go @@ -17,13 +17,13 @@ const ( ProjectInstallMark = "INSTALL.lock" // 登录验证 Token,Header 中传递的参数 - LoginToken = "Token" + HeaderLoginToken = "Token" // 签名验证 Token,Header 中传递的参数 - SignToken = "Authorization" + HeaderSignToken = "Authorization" // 签名验证 Date,Header 中传递的参数 - SignTokenDate = "Authorization-Date" + HeaderSignTokenDate = "Authorization-Date" // Redis Key 前缀 - 防止重复提交 RedisKeyPrefixRequestID = ProjectName + ":request-id:" diff --git a/internal/api/controller/admin_handler/func_detail.go b/internal/api/controller/admin_handler/func_detail.go index c7ed001..c4fa056 100644 --- a/internal/api/controller/admin_handler/func_detail.go +++ b/internal/api/controller/admin_handler/func_detail.go @@ -60,7 +60,15 @@ func (h *handler) Detail() core.HandlerFunc { } var menuData []admin_service.ListMyMenuData - _ = json.Unmarshal([]byte(menuCacheData), &menuData) + err = json.Unmarshal([]byte(menuCacheData), &menuData) + if err != nil { + c.AbortWithError(errno.NewError( + http.StatusBadRequest, + code.AdminDetailError, + code.Text(code.AdminDetailError)).WithErr(err), + ) + return + } res.Username = info.Username res.Nickname = info.Nickname diff --git a/internal/api/controller/admin_handler/func_login.go b/internal/api/controller/admin_handler/func_login.go index 2766406..17ddbf9 100644 --- a/internal/api/controller/admin_handler/func_login.go +++ b/internal/api/controller/admin_handler/func_login.go @@ -74,8 +74,20 @@ func (h *handler) Login() core.HandlerFunc { token := password.GenerateLoginToken(info.Id) + adminCacheData := &struct { + Id int32 `json:"id"` // 主键ID + Username string `json:"username"` // 用户名 + Nickname string `json:"nickname"` // 昵称 + Mobile string `json:"mobile"` // 手机号 + }{ + Id: info.Id, + Username: info.Username, + Nickname: info.Nickname, + Mobile: info.Mobile, + } + // 用户信息 - adminJsonInfo, _ := json.Marshal(info) + adminJsonInfo, _ := json.Marshal(adminCacheData) // 将用户信息记录到 Redis 中 err = h.cache.Set(configs.RedisKeyPrefixLoginUser+token, string(adminJsonInfo), time.Hour*24, cache.WithTrace(c.Trace())) diff --git a/internal/api/controller/admin_handler/func_logout.go b/internal/api/controller/admin_handler/func_logout.go index 93dae29..e117127 100644 --- a/internal/api/controller/admin_handler/func_logout.go +++ b/internal/api/controller/admin_handler/func_logout.go @@ -29,7 +29,7 @@ func (h *handler) Logout() core.HandlerFunc { res := new(logoutResponse) res.Username = c.UserName() - if !h.cache.Del(configs.RedisKeyPrefixLoginUser+c.GetHeader(configs.LoginToken), cache.WithTrace(c.Trace())) { + if !h.cache.Del(configs.RedisKeyPrefixLoginUser+c.GetHeader(configs.HeaderLoginToken), cache.WithTrace(c.Trace())) { c.AbortWithError(errno.NewError( http.StatusBadRequest, code.AdminLogOutError, diff --git a/internal/api/service/admin_service/service.go b/internal/api/service/admin_service/service.go index 55cd8b5..d746d49 100644 --- a/internal/api/service/admin_service/service.go +++ b/internal/api/service/admin_service/service.go @@ -2,7 +2,6 @@ package admin_service import ( "github.com/xinliangnote/go-gin-api/internal/api/repository/db_repo/admin_repo" - "github.com/xinliangnote/go-gin-api/internal/api/repository/db_repo/menu_action_repo" "github.com/xinliangnote/go-gin-api/internal/pkg/cache" "github.com/xinliangnote/go-gin-api/internal/pkg/core" "github.com/xinliangnote/go-gin-api/internal/pkg/db" @@ -26,7 +25,7 @@ type Service interface { CreateMenu(ctx core.Context, menuData *CreateMenuData) (err error) ListMenu(ctx core.Context, searchData *SearchListMenuData) (menuData []ListMenuData, err error) MyMenu(ctx core.Context, searchData *SearchMyMenuData) (menuData []ListMyMenuData, err error) - MyAction(ctx core.Context, searchData *SearchMyActionData) (actionData []*menu_action_repo.MenuAction, err error) + MyAction(ctx core.Context, searchData *SearchMyActionData) (actionData []MyActionData, err error) } type service struct { diff --git a/internal/api/service/admin_service/service_myaction.go b/internal/api/service/admin_service/service_myaction.go index 234935c..65c9ff3 100644 --- a/internal/api/service/admin_service/service_myaction.go +++ b/internal/api/service/admin_service/service_myaction.go @@ -11,7 +11,14 @@ type SearchMyActionData struct { AdminId int32 `json:"admin_id"` // 管理员ID } -func (s *service) MyAction(ctx core.Context, searchData *SearchMyActionData) (actionData []*menu_action_repo.MenuAction, err error) { +type MyActionData struct { + Id int32 // 主键 + MenuId int32 // 菜单栏ID + Method string // 请求方式 + Api string // 请求地址 +} + +func (s *service) MyAction(ctx core.Context, searchData *SearchMyActionData) (actionData []MyActionData, err error) { adminMenuQb := admin_menu_repo.NewQueryBuilder() if searchData.AdminId != 0 { adminMenuQb.WhereAdminId(db_repo.EqualPredicate, searchData.AdminId) @@ -36,10 +43,27 @@ func (s *service) MyAction(ctx core.Context, searchData *SearchMyActionData) (ac actionQb := menu_action_repo.NewQueryBuilder() actionQb.WhereIsDeleted(db_repo.EqualPredicate, -1) actionQb.WhereMenuIdIn(menuIds) - actionData, err = actionQb.QueryAll(s.db.GetDbR().WithContext(ctx.RequestContext())) + actionListData, err := actionQb.QueryAll(s.db.GetDbR().WithContext(ctx.RequestContext())) if err != nil { return nil, err } + if len(actionListData) <= 0 { + return + } + + actionData = make([]MyActionData, len(actionListData)) + + for k, v := range actionListData { + data := MyActionData{ + Id: v.Id, + MenuId: v.MenuId, + Method: v.Method, + Api: v.Api, + } + + actionData[k] = data + } + return } diff --git a/internal/api/service/authorized_service/service_detailbykey.go b/internal/api/service/authorized_service/service_detailbykey.go index 9b2acb4..4f595ce 100644 --- a/internal/api/service/authorized_service/service_detailbykey.go +++ b/internal/api/service/authorized_service/service_detailbykey.go @@ -28,55 +28,65 @@ type cacheApiData struct { func (s *service) DetailByKey(ctx core.Context, key string) (cacheData *CacheAuthorizedData, err error) { // 查询缓存 cacheKey := configs.RedisKeyPrefixSignature + key - value, err := s.cache.Get(cacheKey, cache.WithTrace(ctx.RequestContext().Trace)) - cacheData = new(CacheAuthorizedData) - if err == nil && json.Unmarshal([]byte(value), cacheData) == nil { - return - } + if !s.cache.Exists(cacheKey) { + // 查询调用方信息 + authorizedInfo, err := authorized_repo.NewQueryBuilder(). + WhereIsDeleted(db_repo.EqualPredicate, -1). + WhereBusinessKey(db_repo.EqualPredicate, key). + First(s.db.GetDbR().WithContext(ctx.RequestContext())) - // 查询调用方信息 - authorizedInfo, err := authorized_repo.NewQueryBuilder(). - WhereIsDeleted(db_repo.EqualPredicate, -1). - WhereBusinessKey(db_repo.EqualPredicate, key). - First(s.db.GetDbR().WithContext(ctx.RequestContext())) - - if err != nil { - return nil, err - } - - // 查询调用方授权 API 信息 - authorizedApiInfo, err := authorized_api_repo.NewQueryBuilder(). - WhereIsDeleted(db_repo.EqualPredicate, -1). - WhereBusinessKey(db_repo.EqualPredicate, key). - OrderById(false). - QueryAll(s.db.GetDbR().WithContext(ctx.RequestContext())) - - if err != nil { - return nil, err - } - - // 设置缓存 data - cacheData = new(CacheAuthorizedData) - cacheData.Key = key - cacheData.Secret = authorizedInfo.BusinessSecret - cacheData.IsUsed = authorizedInfo.IsUsed - cacheData.Apis = make([]cacheApiData, len(authorizedApiInfo)) - - for k, v := range authorizedApiInfo { - data := cacheApiData{ - Method: v.Method, - Api: v.Api, + if err != nil { + return nil, err } - cacheData.Apis[k] = data + + // 查询调用方授权 API 信息 + authorizedApiInfo, err := authorized_api_repo.NewQueryBuilder(). + WhereIsDeleted(db_repo.EqualPredicate, -1). + WhereBusinessKey(db_repo.EqualPredicate, key). + OrderById(false). + QueryAll(s.db.GetDbR().WithContext(ctx.RequestContext())) + + if err != nil { + return nil, err + } + + // 设置缓存 data + cacheData = new(CacheAuthorizedData) + cacheData.Key = key + cacheData.Secret = authorizedInfo.BusinessSecret + cacheData.IsUsed = authorizedInfo.IsUsed + cacheData.Apis = make([]cacheApiData, len(authorizedApiInfo)) + + for k, v := range authorizedApiInfo { + data := cacheApiData{ + Method: v.Method, + Api: v.Api, + } + cacheData.Apis[k] = data + } + + cacheDataByte, _ := json.Marshal(cacheData) + + err = s.cache.Set(cacheKey, string(cacheDataByte), time.Hour*24, cache.WithTrace(ctx.Trace())) + if err != nil { + return nil, err + } + + return cacheData, nil } - cacheDataByte, _ := json.Marshal(cacheData) + value, err := s.cache.Get(cacheKey, cache.WithTrace(ctx.RequestContext().Trace)) + if err != nil { + return nil, err + } - err = s.cache.Set(cacheKey, string(cacheDataByte), time.Hour*24, cache.WithTrace(ctx.Trace())) + cacheData = new(CacheAuthorizedData) + err = json.Unmarshal([]byte(value), cacheData) if err != nil { return nil, err } return + } diff --git a/internal/pkg/core/core.go b/internal/pkg/core/core.go index e1342d3..45d036e 100644 --- a/internal/pkg/core/core.go +++ b/internal/pkg/core/core.go @@ -440,11 +440,20 @@ func New(logger *zap.Logger, options ...Option) (Mux, error) { } decodedURL, _ := url.QueryUnescape(ctx.Request.URL.RequestURI()) + + // ctx.Request.Header,精简 Header 参数 + traceHeader := map[string]string{ + "Content-Type": ctx.GetHeader("Content-Type"), + configs.HeaderLoginToken: ctx.GetHeader(configs.HeaderLoginToken), + configs.HeaderSignToken: ctx.GetHeader(configs.HeaderSignToken), + configs.HeaderSignTokenDate: ctx.GetHeader(configs.HeaderSignTokenDate), + } + t.WithRequest(&trace.Request{ TTL: "un-limit", Method: ctx.Request.Method, DecodedURL: decodedURL, - Header: ctx.Request.Header, + Header: traceHeader, Body: string(context.RawData()), }) diff --git a/internal/pkg/metrics/metrics.go b/internal/pkg/metrics/metrics.go index 88bbf05..34e586d 100644 --- a/internal/pkg/metrics/metrics.go +++ b/internal/pkg/metrics/metrics.go @@ -16,7 +16,7 @@ var metricsRequestsTotal = prometheus.NewCounterVec( Namespace: namespace, Subsystem: subsystem, Name: "requests_total", - Help: "request(s) total", + Help: "request(ms) total", }, []string{"method", "path"}, ) @@ -27,9 +27,9 @@ var metricsRequestsCost = prometheus.NewHistogramVec( Namespace: namespace, Subsystem: subsystem, Name: "requests_cost", - Help: "request(s) cost seconds", + Help: "request(ms) cost milliseconds", }, - []string{"method", "path", "success", "http_code", "business_code", "cost_seconds", "trace_id"}, + []string{"method", "path", "success", "http_code", "business_code", "cost_milliseconds", "trace_id"}, ) func init() { @@ -44,12 +44,12 @@ func RecordMetrics(method, uri string, success bool, httpCode, businessCode int, }).Inc() metricsRequestsCost.With(prometheus.Labels{ - "method": method, - "path": uri, - "success": cast.ToString(success), - "http_code": cast.ToString(httpCode), - "business_code": cast.ToString(businessCode), - "cost_seconds": cast.ToString(costSeconds), - "trace_id": traceId, + "method": method, + "path": uri, + "success": cast.ToString(success), + "http_code": cast.ToString(httpCode), + "business_code": cast.ToString(businessCode), + "cost_milliseconds": cast.ToString(costSeconds * 1000), + "trace_id": traceId, }).Observe(costSeconds) } diff --git a/internal/pkg/password/password.go b/internal/pkg/password/password.go index 312a3c5..f52c23e 100644 --- a/internal/pkg/password/password.go +++ b/internal/pkg/password/password.go @@ -8,9 +8,10 @@ import ( "fmt" ) -const salt = "qkhPAGA13HocW3GAEWwb" - -const defaultPassword = "123456" +const ( + saltPassword = "qkhPAGA13HocW3GAEWwb" + defaultPassword = "123456" +) func GeneratePassword(str string) (password string) { // md5 @@ -19,7 +20,7 @@ func GeneratePassword(str string) (password string) { mByte := m.Sum(nil) // hmac - h := hmac.New(sha256.New, []byte(salt)) + h := hmac.New(sha256.New, []byte(saltPassword)) h.Write(mByte) password = hex.EncodeToString(h.Sum(nil)) @@ -38,7 +39,7 @@ func ResetPassword() (password string) { func GenerateLoginToken(id int32) (token string) { m := md5.New() - m.Write([]byte(fmt.Sprintf("%d%s", id, salt))) + m.Write([]byte(fmt.Sprintf("%d%s", id, saltPassword))) token = hex.EncodeToString(m.Sum(nil)) return diff --git a/internal/router/middleware/middle_rbac.go b/internal/router/middleware/middle_rbac.go index 5e66801..2d05d9f 100644 --- a/internal/router/middleware/middle_rbac.go +++ b/internal/router/middleware/middle_rbac.go @@ -6,7 +6,7 @@ import ( "github.com/xinliangnote/go-gin-api/configs" "github.com/xinliangnote/go-gin-api/internal/api/code" - "github.com/xinliangnote/go-gin-api/internal/api/repository/db_repo/menu_action_repo" + "github.com/xinliangnote/go-gin-api/internal/api/service/admin_service" "github.com/xinliangnote/go-gin-api/internal/pkg/cache" "github.com/xinliangnote/go-gin-api/internal/pkg/core" "github.com/xinliangnote/go-gin-api/pkg/errno" @@ -54,8 +54,16 @@ func (m *middleware) RBAC() core.HandlerFunc { return } - var actions []menu_action_repo.MenuAction - _ = json.Unmarshal([]byte(actionData), &actions) + var actions []admin_service.MyActionData + err = json.Unmarshal([]byte(actionData), &actions) + if err != nil { + c.AbortWithError(errno.NewError( + http.StatusUnauthorized, + code.AuthorizationError, + code.Text(code.AuthorizationError)).WithErr(err), + ) + return + } if len(actions) > 0 { table := urltable.NewTable() diff --git a/internal/router/middleware/middle_resubmit.go b/internal/router/middleware/middle_resubmit.go index 7b985ff..decee46 100644 --- a/internal/router/middleware/middle_resubmit.go +++ b/internal/router/middleware/middle_resubmit.go @@ -14,6 +14,8 @@ import ( "github.com/pkg/errors" ) +const reSubmitMark = "1" + func (m *middleware) Resubmit() core.HandlerFunc { return func(c core.Context) { cfg := configs.Get().URLToken @@ -30,7 +32,7 @@ func (m *middleware) Resubmit() core.HandlerFunc { redisKey := configs.RedisKeyPrefixRequestID + tokenString if !m.cache.Exists(redisKey) { - err = m.cache.Set(redisKey, "1", time.Minute*cfg.ExpireDuration) + err = m.cache.Set(redisKey, reSubmitMark, time.Minute*cfg.ExpireDuration) if err != nil { c.AbortWithError(errno.NewError( http.StatusBadRequest, @@ -53,7 +55,7 @@ func (m *middleware) Resubmit() core.HandlerFunc { return } - if redisValue == "1" { + if redisValue == reSubmitMark { c.AbortWithError(errno.NewError( http.StatusBadRequest, code.ResubmitMsg, diff --git a/internal/router/middleware/middle_signature.go b/internal/router/middleware/middle_signature.go index 88318da..9a2072a 100644 --- a/internal/router/middleware/middle_signature.go +++ b/internal/router/middleware/middle_signature.go @@ -14,7 +14,12 @@ import ( "github.com/xinliangnote/go-gin-api/pkg/urltable" ) -const ttl = time.Minute * 2 // 签名超时时间 2 分钟 +const ( + ttl = time.Minute * 2 // 签名超时时间 2 分钟 + minLength = 2 // split space 最小长度 + notUsed = -1 // -1 表示被禁用 + +) var whiteListPath = map[string]bool{ "/login/web": true, @@ -23,7 +28,7 @@ var whiteListPath = map[string]bool{ func (m *middleware) Signature() core.HandlerFunc { return func(c core.Context) { // 签名信息 - authorization := c.GetHeader(configs.SignToken) + authorization := c.GetHeader(configs.HeaderSignToken) if authorization == "" { c.AbortWithError(errno.NewError( http.StatusBadRequest, @@ -34,7 +39,7 @@ func (m *middleware) Signature() core.HandlerFunc { } // 时间信息 - date := c.GetHeader(configs.SignTokenDate) + date := c.GetHeader(configs.HeaderSignTokenDate) if date == "" { c.AbortWithError(errno.NewError( http.StatusBadRequest, @@ -46,7 +51,7 @@ func (m *middleware) Signature() core.HandlerFunc { // 通过签名信息获取 key authorizationSplit := strings.Split(authorization, " ") - if len(authorizationSplit) < 2 { + if len(authorizationSplit) < minLength { c.AbortWithError(errno.NewError( http.StatusBadRequest, code.SignatureError, @@ -67,8 +72,7 @@ func (m *middleware) Signature() core.HandlerFunc { return } - // 验证 cache 是否被调用 - if data.IsUsed == -1 { + if data.IsUsed == notUsed { c.AbortWithError(errno.NewError( http.StatusBadRequest, code.SignatureError, diff --git a/internal/router/middleware/middle_token.go b/internal/router/middleware/middle_token.go index d98cd12..ca9664d 100644 --- a/internal/router/middleware/middle_token.go +++ b/internal/router/middleware/middle_token.go @@ -13,7 +13,7 @@ import ( ) func (m *middleware) Token(ctx core.Context) (userId int64, userName string, err errno.Error) { - token := ctx.GetHeader(configs.LoginToken) + token := ctx.GetHeader(configs.HeaderLoginToken) if token == "" { err = errno.NewError( http.StatusUnauthorized, @@ -48,7 +48,16 @@ func (m *middleware) Token(ctx core.Context) (userId int64, userName string, err } var userData userInfo - _ = json.Unmarshal([]byte(cacheData), &userData) + + jsonErr := json.Unmarshal([]byte(cacheData), &userData) + if jsonErr != nil { + errno.NewError( + http.StatusUnauthorized, + code.AuthorizationError, + code.Text(code.AuthorizationError)).WithErr(jsonErr) + + return + } userId = userData.Id userName = userData.Username diff --git a/internal/web/controller/config_handler/func_codeview.go b/internal/web/controller/config_handler/func_codeview.go index cd50a41..6dd30ae 100644 --- a/internal/web/controller/config_handler/func_codeview.go +++ b/internal/web/controller/config_handler/func_codeview.go @@ -22,51 +22,56 @@ type codeViewResponse struct { BusinessCodes []codes } +const ( + codeFile = "./internal/api/code/code.go" + minBusinessCode = 20000 +) + func (h *handler) CodeView() core.HandlerFunc { - return func(c core.Context) { - fs := token.NewFileSet() - filePath := "./internal/api/code/code.go" - parsedFile, err := decorator.ParseFile(fs, filePath, nil, 0) - if err != nil { - log.Fatalf("parsing package: %s: %s\n", filePath, err) + fs := token.NewFileSet() + parsedFile, err := decorator.ParseFile(fs, codeFile, nil, 0) + if err != nil { + log.Fatalf("parsing package: %s: %s\n", codeFile, err) + } + + var ( + systemCodes []codes + businessCodes []codes + ) + + dst.Inspect(parsedFile, func(n dst.Node) bool { + // GenDecl 代表除函数以外的所有声明,即 import、const、var 和 type + decl, ok := n.(*dst.GenDecl) + if !ok || decl.Tok != token.CONST { + return true } - var ( - systemCodes []codes - businessCodes []codes - ) - - dst.Inspect(parsedFile, func(n dst.Node) bool { - decl, ok := n.(*dst.GenDecl) - if !ok || decl.Tok != token.CONST { - return true + for _, spec := range decl.Specs { + valueSpec, _ok := spec.(*dst.ValueSpec) + if !_ok { + continue } - for _, spec := range decl.Specs { - valueSpec, _ok := spec.(*dst.ValueSpec) - if !_ok { - continue - } - - codeInt := cast.ToInt(valueSpec.Values[0].(*dst.BasicLit).Value) - - if codeInt < 20000 { - systemCodes = append(systemCodes, codes{ - Code: codeInt, - Message: code.Text(codeInt), - }) - } else { - businessCodes = append(businessCodes, codes{ - Code: codeInt, - Message: code.Text(codeInt), - }) - } + codeInt := cast.ToInt(valueSpec.Values[0].(*dst.BasicLit).Value) + if codeInt < minBusinessCode { + systemCodes = append(systemCodes, codes{ + Code: codeInt, + Message: code.Text(codeInt), + }) + } else { + businessCodes = append(businessCodes, codes{ + Code: codeInt, + Message: code.Text(codeInt), + }) } - return true - }) + } + return true + }) + + return func(c core.Context) { obj := new(codeViewResponse) obj.BusinessCodes = businessCodes obj.SystemCodes = systemCodes diff --git a/internal/web/controller/generator_handler/func_gormexecute.go b/internal/web/controller/generator_handler/func_gormexecute.go index f304906..be8dba5 100644 --- a/internal/web/controller/generator_handler/func_gormexecute.go +++ b/internal/web/controller/generator_handler/func_gormexecute.go @@ -14,9 +14,10 @@ type gormExecuteRequest struct { Tables string `form:"tables"` } +const gormgenSh = "./scripts/gormgen.sh" + func (h *handler) GormExecute() core.HandlerFunc { return func(c core.Context) { - req := new(gormExecuteRequest) if err := c.ShouldBindPostForm(req); err != nil { c.Payload("参数传递有误") @@ -24,7 +25,7 @@ func (h *handler) GormExecute() core.HandlerFunc { } mysqlConf := configs.Get().MySQL.Read - shellPath := fmt.Sprintf("./scripts/gormgen.sh %s %s %s %s %s", mysqlConf.Addr, mysqlConf.User, mysqlConf.Pass, mysqlConf.Name, req.Tables) + shellPath := fmt.Sprintf("%s %s %s %s %s %s", gormgenSh, mysqlConf.Addr, mysqlConf.User, mysqlConf.Pass, mysqlConf.Name, req.Tables) // runtime.GOOS = linux or darwin command := exec.Command("/bin/bash", "-c", shellPath) diff --git a/internal/web/controller/generator_handler/func_gormview.go b/internal/web/controller/generator_handler/func_gormview.go index e30079f..1cb344b 100644 --- a/internal/web/controller/generator_handler/func_gormview.go +++ b/internal/web/controller/generator_handler/func_gormview.go @@ -5,6 +5,8 @@ import ( "github.com/xinliangnote/go-gin-api/configs" "github.com/xinliangnote/go-gin-api/internal/pkg/core" + + "go.uber.org/zap" ) func (h *handler) GormView() core.HandlerFunc { @@ -21,9 +23,20 @@ func (h *handler) GormView() core.HandlerFunc { sqlTables := fmt.Sprintf("SELECT `table_name`,`table_comment` FROM `information_schema`.`tables` WHERE `table_schema`= '%s'", mysqlConf.Name) rows, err := h.db.GetDbR().Raw(sqlTables).Rows() if err != nil { + h.logger.Error("rows err", zap.Error(err)) + c.HTML("generator_gorm", tableCollect) return } + + err = rows.Err() + if err != nil { + h.logger.Error("rows err", zap.Error(err)) + + c.HTML("generator_gorm", tableCollect) + return + } + defer rows.Close() for rows.Next() { diff --git a/internal/web/controller/generator_handler/func_handlerexecute.go b/internal/web/controller/generator_handler/func_handlerexecute.go index f63f481..a4a3ea3 100644 --- a/internal/web/controller/generator_handler/func_handlerexecute.go +++ b/internal/web/controller/generator_handler/func_handlerexecute.go @@ -13,6 +13,8 @@ type handlerExecuteRequest struct { Name string `form:"name"` } +const handlergenSh = "./scripts/handlergen.sh" + func (h *handler) HandlerExecute() core.HandlerFunc { return func(c core.Context) { req := new(handlerExecuteRequest) @@ -21,7 +23,7 @@ func (h *handler) HandlerExecute() core.HandlerFunc { return } - shellPath := fmt.Sprintf("./scripts/handlergen.sh %s", req.Name) + shellPath := fmt.Sprintf("%s %s", handlergenSh, req.Name) // runtime.GOOS = linux or darwin command := exec.Command("/bin/bash", "-c", shellPath) diff --git a/internal/web/controller/tool_handler/func_logsview.go b/internal/web/controller/tool_handler/func_logsview.go index ae57d0e..fda8ca3 100644 --- a/internal/web/controller/tool_handler/func_logsview.go +++ b/internal/web/controller/tool_handler/func_logsview.go @@ -56,22 +56,25 @@ func (h *handler) LogsView() core.HandlerFunc { for i := 0; i < logSize; i++ { content, _ := readLineFromEnd.ReadLine() - - var logParse logParseData - _ = json.Unmarshal(content, &logParse) - data := logData{ - Content: string(content), - Level: logParse.Level, - Time: logParse.Time, - Path: logParse.Path, - Method: logParse.Method, - Msg: logParse.Msg, - HTTPCode: logParse.HTTPCode, - TraceID: logParse.TraceID, - CostSeconds: logParse.CostSeconds, - } - if string(content) != "" { + var logParse logParseData + err = json.Unmarshal(content, &logParse) + if err != nil { + h.logger.Error("NewReadLineFromEnd json Unmarshal err", zap.Error(err)) + } + + data := logData{ + Content: string(content), + Level: logParse.Level, + Time: logParse.Time, + Path: logParse.Path, + Method: logParse.Method, + Msg: logParse.Msg, + HTTPCode: logParse.HTTPCode, + TraceID: logParse.TraceID, + CostSeconds: logParse.CostSeconds, + } + obj.Logs[i] = data } } diff --git a/main.go b/main.go index aa461c0..f3f84a7 100644 --- a/main.go +++ b/main.go @@ -31,6 +31,7 @@ import ( func main() { // 初始化 logger loggers, err := logger.NewJSONLogger( + logger.WithDisableConsole(), logger.WithField("domain", fmt.Sprintf("%s[%s]", configs.ProjectName, env.Active().Value())), logger.WithTimeLayout("2006-01-02 15:04:05"), logger.WithFileP(configs.ProjectLogFile), @@ -66,8 +67,6 @@ func main() { if err := server.Shutdown(ctx); err != nil { loggers.Error("server shutdown err", zap.Error(err)) - } else { - loggers.Info("server shutdown success") } }, @@ -76,14 +75,10 @@ func main() { if s.Db != nil { if err := s.Db.DbWClose(); err != nil { loggers.Error("dbw close err", zap.Error(err)) - } else { - loggers.Info("dbw close success") } if err := s.Db.DbRClose(); err != nil { loggers.Error("dbr close err", zap.Error(err)) - } else { - loggers.Info("dbr close success") } } }, @@ -93,8 +88,6 @@ func main() { if s.Cache != nil { if err := s.Cache.Close(); err != nil { loggers.Error("cache close err", zap.Error(err)) - } else { - loggers.Info("cache close success") } } }, @@ -104,8 +97,6 @@ func main() { if s.GrpClient != nil { if err := s.GrpClient.Conn().Close(); err != nil { loggers.Error("gRPC client close err", zap.Error(err)) - } else { - loggers.Info("gRPC client close success") } } },