fix lint issues

This commit is contained in:
yanghao05
2023-01-31 16:07:29 +08:00
parent 81e33fa544
commit 05622922e9
10 changed files with 273 additions and 134 deletions

View File

@@ -17,3 +17,11 @@ dist:
.PHONY: test
test:
@go test -v ./... -cover
.PHONY: lint
lint:
@golangci-lint run
.PHONY: proto
proto:
@buf generate

View File

@@ -2,6 +2,7 @@ package container
import (
"context"
"log"
"go.uber.org/dig"
)
@@ -9,5 +10,7 @@ import (
var Container *dig.Container = dig.New()
func init() {
Container.Provide(context.Background)
if err := Container.Provide(context.Background); err != nil {
log.Fatal(err)
}
}

164
golangci-lint.yaml Normal file
View File

@@ -0,0 +1,164 @@
linters-settings:
forbidigo:
# Forbid the following identifiers (list of regexp).
# Default: ["^(fmt\\.Print(|f|ln)|print|println)$"]
forbid:
- ^print.*$
- 'fmt\.Print.*'
# Optionally put comments at the end of the regex, surrounded by `(# )?`
# Escape any special characters.
- 'fmt\.Print.*(# Do not commit print statements\.)?'
# Exclude godoc examples from forbidigo checks.
# Default: true
# exclude_godoc_examples: false
gofumpt:
# Select the Go version to target.
# Default: "1.15"
# Deprecated: use the global `run.go` instead.
lang-version: "1.18"
# Module path which contains the source code being formatted.
# Default: ""
# Choose whether to use the extra rules.
# Default: false
govet:
check-shadowing: true
# enable:
# - fieldalignment
settings:
printf:
funcs:
- (github.com/golangci/golangci-lint/pkg/logutils.Log).Infof
- (github.com/golangci/golangci-lint/pkg/logutils.Log).Warnf
- (github.com/golangci/golangci-lint/pkg/logutils.Log).Errorf
- (github.com/golangci/golangci-lint/pkg/logutils.Log).Fatalf
golint:
min-confidence: 0
gocyclo:
min-complexity: 32
maligned:
suggest-new: true
dupl:
threshold: 100
goconst:
min-len: 2
min-occurrences: 2
depguard:
list-type: blacklist
packages:
# logging is allowed only by logutils.Log, logrus
# is allowed to use only in logutils package
- github.com/sirupsen/logrus
misspell:
locale: US
lll:
line-length: 200
goimports:
local-prefixes: git.gobies.org
gocritic:
enabled-tags:
- performance
- style
- experimental
disabled-checks:
- wrapperFunc
- yodaStyleExpr
- unnamedResult
# - dupImport # https://github.com/go-critic/go-critic/issues/845
- commentedOutCode
- importShadow
- appendCombine
- ifElseChain
- typeAssertChain
- builtinShadow
gosec:
excludes:
- G404
- G501
- G401
revive:
ignore-generated-header: true
severity: warning
rules:
- name: atomic
- name: line-length-limit
severity: error
arguments: [200]
linters:
# enable:
# - errcheck
# - goimports
# - golint
# - govet
# - staticcheck
# - gocyclo
# - maligned
# - goconst
# - depguard
# - misspell
# - lll
# - gocritic
# disable-all: true
enable:
- gocritic
- gocyclo
- lll
- goconst
- misspell
- govet
- errcheck
- forbidigo
# - staticcheck
- unused
# - maligned
- gosimple
# - structcheck
# - varcheck
- ineffassign
# - deadcode
- typecheck
# - golint
- revive
- gosec
- unconvert
# - goimports
- depguard
- prealloc
# - scopelint
- whitespace
- revive
- nilnil
run:
go: '1.18'
# default concurrency is a available CPU number
concurrency: 20
# timeout for analysis, e.g. 30s, 5m, default is 1m
deadline: 10m
# exit code when at least one issue was found, default is 1
issues-exit-code: 1
# include test files or not, default is true
tests: false
skip-dirs:
- vendor/(passes)
# - third_party/(checker|passes)
golint:
# minimal confidence for issues, default is 0.8
min-confidence: 0.5
issues:
exclude-use-default: true
max-issues-per-linter: 10
max-same-issues: 0
# exclude:
# - EXC0002
# golangci.com configuration
# https://github.com/golangci/golangci/wiki/Configuration
# service:
# golangci-lint-version: 1.17.x # use the fixed version to not introduce new linters unexpectedly
# prepare:
# - echo "here I can run custom commands, but no preparation needed for this repo"

View File

@@ -1,7 +1,9 @@
package middleware
import (
"atom/utils"
"atom/database/models"
"atom/providers/jwt"
"atom/providers/log"
"bytes"
"encoding/json"
"io"
@@ -12,15 +14,10 @@ import (
"sync"
"time"
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
"github.com/flipped-aurora/gva-plugins/email/service"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
var operationRecordService = service.ServiceGroupApp.SystemServiceGroup.OperationRecordService
var respPool sync.Pool
func init() {
@@ -29,15 +26,15 @@ func init() {
}
}
func OperationRecord() gin.HandlerFunc {
func OperationRecord(jwt *jwt.JWT) gin.HandlerFunc {
return func(c *gin.Context) {
var body []byte
var userId int
var userId int64
if c.Request.Method != http.MethodGet {
var err error
body, err = io.ReadAll(c.Request.Body)
if err != nil {
global.GVA_LOG.Error("read body from request error:", zap.Error(err))
log.Error("read body from request error:", zap.Error(err))
} else {
c.Request.Body = io.NopCloser(bytes.NewBuffer(body))
}
@@ -54,18 +51,18 @@ func OperationRecord() gin.HandlerFunc {
}
body, _ = json.Marshal(&m)
}
claims, _ := utils.GetClaims(c)
if claims.ID != 0 {
userId = int(claims.ID)
claims, _ := jwt.GetClaims(c)
if claims.UserID != 0 {
userId = int64(claims.UserID)
} else {
id, err := strconv.Atoi(c.Request.Header.Get("x-user-id"))
if err != nil {
userId = 0
log.Error(err)
}
userId = id
userId = int64(id)
}
record := system.SysOperationRecord{
Ip: c.ClientIP(),
record := models.SysOperationRecord{
IP: c.ClientIP(),
Method: c.Request.Method,
Path: c.Request.URL.Path,
Agent: c.Request.UserAgent(),
@@ -80,7 +77,7 @@ func OperationRecord() gin.HandlerFunc {
newBody := respPool.Get().([]byte)
copy(newBody, record.Body)
record.Body = string(newBody)
defer respPool.Put(newBody[:0])
defer respPool.Put(&newBody)
}
}
@@ -95,8 +92,8 @@ func OperationRecord() gin.HandlerFunc {
latency := time.Since(now)
record.ErrorMessage = c.Errors.ByType(gin.ErrorTypePrivate).String()
record.Status = c.Writer.Status()
record.Latency = latency
record.Status = int64(c.Writer.Status())
record.Latency = int64(latency)
record.Resp = writer.body.String()
if strings.Contains(c.Writer.Header().Get("Pragma"), "public") ||
@@ -113,13 +110,13 @@ func OperationRecord() gin.HandlerFunc {
newBody := respPool.Get().([]byte)
copy(newBody, record.Resp)
record.Body = string(newBody)
defer respPool.Put(newBody[:0])
defer respPool.Put(&newBody)
}
}
if err := operationRecordService.CreateSysOperationRecord(record); err != nil {
global.GVA_LOG.Error("create operation record error:", zap.Error(err))
}
// if err := operationRecordService.CreateSysOperationRecord(record); err != nil {
// log.Error("create operation record error:", zap.Error(err))
// }
}
}

View File

@@ -67,7 +67,7 @@ type PostgreSQL struct {
}
func (m *PostgreSQL) EmptyDsn() string {
dsnTpl := "host=%s user=%s password=%s port=%s dbname=postgres sslmode=disable TimeZone=Asia/Shanghai"
dsnTpl := "host=%s user=%s password=%s port=%d dbname=postgres sslmode=disable TimeZone=Asia/Shanghai"
return fmt.Sprintf(dsnTpl, m.Host, m.User, m.Password, m.Port)
}

View File

@@ -3,10 +3,11 @@ package jwt
import (
"atom/container"
"atom/providers/config"
"atom/providers/log"
"errors"
"log"
"time"
"github.com/gin-gonic/gin"
jwt "github.com/golang-jwt/jwt/v4"
uuid "github.com/satori/go.uuid"
"golang.org/x/sync/singleflight"
@@ -22,12 +23,12 @@ func init() {
type CustomClaims struct {
BaseClaims
BufferTime int64
jwt.StandardClaims
jwt.RegisteredClaims
}
type BaseClaims struct {
UUID uuid.UUID
ID uint
UserID uint
Username string
NickName string
AuthorityId uint
@@ -59,10 +60,10 @@ func (j *JWT) CreateClaims(baseClaims BaseClaims) CustomClaims {
claims := CustomClaims{
BaseClaims: baseClaims,
BufferTime: int64(bf / time.Second), // 缓冲时间1天 缓冲时间内会获得新的token刷新令牌 此时一个用户会存在两个有效令牌 但是前端只留一个 另一个会丢失
StandardClaims: jwt.StandardClaims{
NotBefore: time.Now().Unix() - 1000, // 签名生效时间
ExpiresAt: time.Now().Add(ep).Unix(), // 过期时间 7天 配置文件
Issuer: j.config.Http.JWT.Issuer, // 签名的发行者
RegisteredClaims: jwt.RegisteredClaims{
NotBefore: jwt.NewNumericDate(time.Now().Add(-time.Second * 10)), // 签名生效时间
ExpiresAt: jwt.NewNumericDate(time.Now().Add(ep)), // 过期时间 7天 配置文件
Issuer: j.config.Http.JWT.Issuer, // 签名的发行者
},
}
return claims
@@ -112,7 +113,67 @@ func (j *JWT) ParseToken(tokenString string) (*CustomClaims, error) {
}
}
// 解析 token
func (j *JWT) ParseCliam(claim string) (*CustomClaims, error) {
func (j *JWT) GetClaims(c *gin.Context) (*CustomClaims, error) {
token := c.Request.Header.Get("x-token")
claims, err := j.ParseToken(token)
if err != nil {
log.Error("从Gin的Context中获取从jwt解析信息失败, 请检查请求头是否存在x-token且claims是否为规定结构")
}
return claims, err
}
// GetUserID 从Gin的Context中获取从jwt解析出来的用户ID
func (j *JWT) GetUserID(c *gin.Context) uint {
if claims, exists := c.Get("claims"); !exists {
if cl, err := j.GetClaims(c); err != nil {
return 0
} else {
return cl.UserID
}
} else {
waitUse := claims.(*CustomClaims)
return waitUse.UserID
}
}
// GetUserUuid 从Gin的Context中获取从jwt解析出来的用户UUID
func (j *JWT) GetUserUuid(c *gin.Context) uuid.UUID {
if claims, exists := c.Get("claims"); !exists {
if cl, err := j.GetClaims(c); err != nil {
return uuid.UUID{}
} else {
return cl.UUID
}
} else {
waitUse := claims.(*CustomClaims)
return waitUse.UUID
}
}
// GetUserAuthorityId 从Gin的Context中获取从jwt解析出来的用户角色id
func (j *JWT) GetUserAuthorityId(c *gin.Context) uint {
if claims, exists := c.Get("claims"); !exists {
if cl, err := j.GetClaims(c); err != nil {
return 0
} else {
return cl.AuthorityId
}
} else {
waitUse := claims.(*CustomClaims)
return waitUse.AuthorityId
}
}
// GetUserInfo 从Gin的Context中获取从jwt解析出来的用户角色id
func (j *JWT) GetUserInfo(c *gin.Context) *CustomClaims {
if claims, exists := c.Get("claims"); !exists {
if cl, err := j.GetClaims(c); err != nil {
return nil
} else {
return cl
}
} else {
waitUse := claims.(*CustomClaims)
return waitUse
}
}

View File

@@ -7,6 +7,5 @@ import (
_ "atom/providers/http"
_ "atom/providers/jwt"
_ "atom/providers/log"
_ "atom/providers/micro"
_ "atom/providers/single_flight"
)

View File

@@ -1,20 +0,0 @@
package rpc
import (
"log"
"atom/container"
"atom/proto"
"go-micro.dev/v4"
)
func init() {
err := container.Container.Provide(func(svc micro.Service) proto.WebApiService {
return proto.NewWebApiService("web.api", svc.Client())
})
if err != nil {
log.Fatal(err)
}
}

View File

@@ -1,75 +0,0 @@
package utils
import (
"atom/providers/jwt"
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/gin-gonic/gin"
uuid "github.com/satori/go.uuid"
)
func GetClaims(c *gin.Context, jwt *jwt.JWT) (*jwt.CustomClaims, error) {
token := c.Request.Header.Get("x-token")
j := NewJWT()
claims, err := j.ParseToken(token)
if err != nil {
global.GVA_LOG.Error("从Gin的Context中获取从jwt解析信息失败, 请检查请求头是否存在x-token且claims是否为规定结构")
}
return claims, err
}
// GetUserID 从Gin的Context中获取从jwt解析出来的用户ID
func GetUserID(c *gin.Context) uint {
if claims, exists := c.Get("claims"); !exists {
if cl, err := GetClaims(c); err != nil {
return 0
} else {
return cl.ID
}
} else {
waitUse := claims.(*systemReq.CustomClaims)
return waitUse.ID
}
}
// GetUserUuid 从Gin的Context中获取从jwt解析出来的用户UUID
func GetUserUuid(c *gin.Context) uuid.UUID {
if claims, exists := c.Get("claims"); !exists {
if cl, err := GetClaims(c); err != nil {
return uuid.UUID{}
} else {
return cl.UUID
}
} else {
waitUse := claims.(*systemReq.CustomClaims)
return waitUse.UUID
}
}
// GetUserAuthorityId 从Gin的Context中获取从jwt解析出来的用户角色id
func GetUserAuthorityId(c *gin.Context) uint {
if claims, exists := c.Get("claims"); !exists {
if cl, err := GetClaims(c); err != nil {
return 0
} else {
return cl.AuthorityId
}
} else {
waitUse := claims.(*systemReq.CustomClaims)
return waitUse.AuthorityId
}
}
// GetUserInfo 从Gin的Context中获取从jwt解析出来的用户角色id
func GetUserInfo(c *gin.Context) *systemReq.CustomClaims {
if claims, exists := c.Get("claims"); !exists {
if cl, err := GetClaims(c); err != nil {
return nil
} else {
return cl
}
} else {
waitUse := claims.(*systemReq.CustomClaims)
return waitUse
}
}

View File

@@ -19,13 +19,15 @@ func Unzip(zipFile string, destDir string) ([]string, error) {
defer zipReader.Close()
for _, f := range zipReader.File {
if strings.Index(f.Name, "..") > -1 {
if strings.Contains(f.Name, "..") {
return []string{}, fmt.Errorf("%s 文件名不合法", f.Name)
}
fpath := filepath.Join(destDir, f.Name)
paths = append(paths, fpath)
if f.FileInfo().IsDir() {
os.MkdirAll(fpath, os.ModePerm)
if err := os.MkdirAll(fpath, os.ModePerm); err != nil {
return nil, err
}
} else {
if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
return []string{}, err