diff --git a/golangci-lint.yaml b/.golangci.yaml similarity index 100% rename from golangci-lint.yaml rename to .golangci.yaml diff --git a/middleware/cors.go b/middleware/cors.go index 043f84f..146b962 100644 --- a/middleware/cors.go +++ b/middleware/cors.go @@ -50,11 +50,9 @@ func CorsByRules(config *config.Config) gin.HandlerFunc { // 严格白名单模式且未通过检查,直接拒绝处理请求 if whitelist == nil && config.Http.Cors.Mode == "strict-whitelist" && !(c.Request.Method == "GET" && c.Request.URL.Path == "/health") { c.AbortWithStatus(http.StatusForbidden) - } else { + } else if c.Request.Method == http.MethodOptions { // 非严格白名单模式,无论是否通过检查均放行所有 OPTIONS 方法 - if c.Request.Method == http.MethodOptions { - c.AbortWithStatus(http.StatusNoContent) - } + c.AbortWithStatus(http.StatusNoContent) } // 处理请求 diff --git a/middleware/jwt.go b/middleware/jwt.go index 6b7852d..dead33a 100644 --- a/middleware/jwt.go +++ b/middleware/jwt.go @@ -29,7 +29,7 @@ func JWTAuth(j *jwt.JWT) gin.HandlerFunc { // 已登录用户被管理员禁用 需要使该用户的jwt失效 此处比较消耗性能 如果需要 请自行打开 // 用户被删除的逻辑 需要优化 此处比较消耗性能 如果需要 请自行打开 - //if user, err := userService.FindUserByUuid(claims.UUID.String()); err != nil || user.Enable == 2 { + // if user, err := userService.FindUserByUuid(claims.UUID.String()); err != nil || user.Enable == 2 { // _ = jwtService.JsonInBlacklist(system.JwtBlacklist{Jwt: token}) // response.FailWithDetailed(gin.H{"reload": true}, err.Error(), c) // c.Abort() diff --git a/middleware/rbac.go b/middleware/rbac.go index 4ef3250..e3f480c 100644 --- a/middleware/rbac.go +++ b/middleware/rbac.go @@ -27,7 +27,7 @@ func CheckPermission(config *config.Config, rbac rbac.IRbac) gin.HandlerFunc { } claims := claimsCtx.(jwt.Claims) - //获取请求的PATH + // 获取请求的PATH path := c.Request.URL.Path // 获取请求方法 diff --git a/modules/auth/container/container.go b/modules/auth/container/container.go index 1d7be10..4568be7 100755 --- a/modules/auth/container/container.go +++ b/modules/auth/container/container.go @@ -12,7 +12,6 @@ import ( ) func init() { - // controller if err := container.Container.Provide(controller.NewRoleController); err != nil { log.Fatal(err) @@ -26,7 +25,7 @@ func init() { log.Fatal(err) } - //service + // service if err := container.Container.Provide(service.NewRoleService); err != nil { log.Fatal(err) } diff --git a/modules/auth/routes/routes.go b/modules/auth/routes/routes.go index 285b65c..b5cfef5 100755 --- a/modules/auth/routes/routes.go +++ b/modules/auth/routes/routes.go @@ -42,36 +42,31 @@ func (r *Route) Register() { )) roleGroup := group.Group("roles") - { - roleGroup.GET("", gen.DataFunc2( - r.role.GetByFilter, - gen.BindQuery(dto.RoleRequestFilter{}, err.BindQueryFailed), - gen.BindQuery(request.PageFilter{}, err.BindQueryFailed), - )) + roleGroup.GET("", gen.DataFunc2( + r.role.GetByFilter, + gen.BindQuery(dto.RoleRequestFilter{}, err.BindQueryFailed), + gen.BindQuery(request.PageFilter{}, err.BindQueryFailed), + )) - roleGroup.GET("/tree", gen.DataFunc(r.role.Tree)) + roleGroup.GET("/tree", gen.DataFunc(r.role.Tree)) - roleGroup.POST("", gen.Func1( - r.role.Create, - gen.BindBody(dto.RoleRequestForm{}, err.BindBodyFailed), - )) + roleGroup.POST("", gen.Func1( + r.role.Create, + gen.BindBody(dto.RoleRequestForm{}, err.BindBodyFailed), + )) - roleGroup.PUT("/:id", gen.Func2( - r.role.UpdateByID, - gen.Int("role_id", err.BindPathFailed.Format("id")), - gen.BindBody(dto.RoleRequestForm{}, err.BindBodyFailed), - )) + roleGroup.PUT("/:id", gen.Func2( + r.role.UpdateByID, + gen.Int("role_id", err.BindPathFailed.Format("id")), + gen.BindBody(dto.RoleRequestForm{}, err.BindBodyFailed), + )) - roleGroup.DELETE("/:id", gen.Func1( - r.role.Delete, - gen.Int("role_id", err.BindPathFailed.Format("id")), - )) - } + roleGroup.DELETE("/:id", gen.Func1( + r.role.Delete, + gen.Int("role_id", err.BindPathFailed.Format("id")), + )) permissionGroup := group.Group("permissions") - { - permissionGroup.GET("", gen.DataFunc(r.permission.Get)) - } - + permissionGroup.GET("", gen.DataFunc(r.permission.Get)) } } diff --git a/modules/system/dao/dao.go b/modules/system/dao/dao.go index 11a75c0..466bdb3 100644 --- a/modules/system/dao/dao.go +++ b/modules/system/dao/dao.go @@ -13,8 +13,8 @@ type Dao struct { DB *gorm.DB } -func NewDao(DB *gorm.DB) *Dao { - return &Dao{DB: DB} +func NewDao(db *gorm.DB) *Dao { + return &Dao{DB: db} } func (c *Dao) Release(ctx context.Context, a int, b string) error { diff --git a/providers/captcha/captcha.go b/providers/captcha/captcha.go index 0e129c5..00bb447 100644 --- a/providers/captcha/captcha.go +++ b/providers/captcha/captcha.go @@ -33,7 +33,6 @@ func NewCaptcha(conf *config.Config, driver base64Captcha.Driver) (*Captcha, err conf: conf, captcha: base64Captcha.NewCaptcha(driver, store), }, nil - } func (c *Captcha) Generate() (*CaptchaResponse, error) { diff --git a/providers/config/loader.go b/providers/config/loader.go index 5542911..e1b1838 100644 --- a/providers/config/loader.go +++ b/providers/config/loader.go @@ -53,5 +53,4 @@ func Load() (*Config, error) { } return config, nil - } diff --git a/providers/config/section_database.go b/providers/config/section_database.go index accbaf9..bccce71 100755 --- a/providers/config/section_database.go +++ b/providers/config/section_database.go @@ -21,10 +21,10 @@ type MySQL struct { Username string Password string Prefix string // 表前缀 - Singular bool //是否开启全局禁用复数,true表示开启 + Singular bool // 是否开启全局禁用复数,true表示开启 MaxIdleConns int // 空闲中的最大连接数 MaxOpenConns int // 打开到数据库的最大连接数 - Engine string //数据库引擎,默认InnoDB + Engine string // 数据库引擎,默认InnoDB } func (m *MySQL) CreateDatabaseSql() string { @@ -66,7 +66,7 @@ type PostgreSQL struct { SslMode string TimeZone string Prefix string // 表前缀 - Singular bool //是否开启全局禁用复数,true表示开启 + Singular bool // 是否开启全局禁用复数,true表示开启 MaxIdleConns int // 空闲中的最大连接数 MaxOpenConns int // 打开到数据库的最大连接数 } diff --git a/providers/config/section_http.go b/providers/config/section_http.go index 976cc8c..8a1fffa 100644 --- a/providers/config/section_http.go +++ b/providers/config/section_http.go @@ -42,10 +42,10 @@ type Whitelist struct { AllowCredentials bool } -func (h Http) Address() string { +func (h *Http) Address() string { return fmt.Sprintf("%s:%d", h.Host, h.Port) } -func (h Http) PortString() string { +func (h *Http) PortString() string { return fmt.Sprintf(":%d", h.Port) } diff --git a/providers/database/mysql.go b/providers/database/mysql.go index 2fed4a6..01e1087 100644 --- a/providers/database/mysql.go +++ b/providers/database/mysql.go @@ -2,8 +2,8 @@ package database import ( "atom/providers/config" + "atom/providers/log" "database/sql" - "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" @@ -53,7 +53,7 @@ func NewMySQL(conf *config.MySQL) (*gorm.DB, error) { } // createDatabase 创建数据库 -func createMySQLDatabase(dsn string, driver string, createSql string) error { +func createMySQLDatabase(dsn, driver, createSql string) error { db, err := sql.Open(driver, dsn) if err != nil { return err @@ -61,10 +61,11 @@ func createMySQLDatabase(dsn string, driver string, createSql string) error { defer func(db *sql.DB) { err = db.Close() if err != nil { - fmt.Println(err) + log.Error(err) } }(db) - if err = db.Ping(); err != nil { + err = db.Ping() + if err != nil { return err } _, err = db.Exec(createSql) diff --git a/providers/http/engine.go b/providers/http/engine.go index 48e1ef3..f223a8f 100644 --- a/providers/http/engine.go +++ b/providers/http/engine.go @@ -42,7 +42,7 @@ func NewService(cfg *config.Config, logger *log.Logger) *Service { engine := gin.New() engine.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string { - return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n", + return fmt.Sprintf(`%s - [%s] "%s %s %s %d %s '%q' %s"\n`, param.ClientIP, param.TimeStamp.Format(time.RFC1123), param.Method, diff --git a/providers/jwt/jwt.go b/providers/jwt/jwt.go index 164f373..2a4ad64 100644 --- a/providers/jwt/jwt.go +++ b/providers/jwt/jwt.go @@ -56,7 +56,7 @@ func NewJWT(config *config.Config) (*JWT, error) { }, nil } -func (j *JWT) CreateClaims(baseClaims BaseClaims) Claims { +func (j *JWT) CreateClaims(baseClaims BaseClaims) *Claims { ep, _ := time.ParseDuration(j.config.Http.JWT.ExpiresTime) claims := Claims{ BaseClaims: baseClaims, @@ -66,17 +66,17 @@ func (j *JWT) CreateClaims(baseClaims BaseClaims) Claims { Issuer: j.config.Http.JWT.Issuer, // 签名的发行者 }, } - return claims + return &claims } // 创建一个token -func (j *JWT) CreateToken(claims Claims) (string, error) { +func (j *JWT) CreateToken(claims *Claims) (string, error) { token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(j.SigningKey) } // CreateTokenByOldToken 旧token 换新token 使用归并回源避免并发问题 -func (j *JWT) CreateTokenByOldToken(oldToken string, claims Claims) (string, error) { +func (j *JWT) CreateTokenByOldToken(oldToken string, claims *Claims) (string, error) { v, err, _ := j.singleflight.Do("JWT:"+oldToken, func() (interface{}, error) { return j.CreateToken(claims) }) @@ -108,7 +108,6 @@ func (j *JWT) ParseToken(tokenString string) (*Claims, error) { return claims, nil } return nil, TokenInvalid - } else { return nil, TokenInvalid } diff --git a/utils/fs/dir.go b/utils/fs/dir.go index abd8385..18bd234 100644 --- a/utils/fs/dir.go +++ b/utils/fs/dir.go @@ -20,13 +20,15 @@ func PathExists(path string) (bool, error) { } func CreateDir(dirs ...string) (err error) { + var exist bool for _, v := range dirs { - exist, err := PathExists(v) + exist, err = PathExists(v) if err != nil { return err } if !exist { - if err := os.MkdirAll(v, os.ModePerm); err != nil { + err = os.MkdirAll(v, os.ModePerm) + if err != nil { return err } } diff --git a/utils/fs/file.go b/utils/fs/file.go index 4d44612..038902d 100644 --- a/utils/fs/file.go +++ b/utils/fs/file.go @@ -7,7 +7,7 @@ import ( "strings" ) -func Move(src string, dst string) (err error) { +func Move(src, dst string) (err error) { if dst == "" { return nil } @@ -48,8 +48,7 @@ func TrimSpace(target interface{}) { t = t.Elem() v := reflect.ValueOf(target).Elem() for i := 0; i < t.NumField(); i++ { - switch v.Field(i).Kind() { - case reflect.String: + if v.Field(i).Kind() == reflect.String { v.Field(i).SetString(strings.TrimSpace(v.Field(i).String())) } } diff --git a/utils/zip.go b/utils/zip.go index 69f8827..79b4bd8 100644 --- a/utils/zip.go +++ b/utils/zip.go @@ -4,15 +4,16 @@ import ( "archive/zip" "fmt" "io" + "io/fs" "os" "path/filepath" "strings" ) -// 解压 -func Unzip(zipFile string, destDir string) ([]string, error) { +// Unzip 解压 +func Unzip(zipFile, destDir string) ([]string, error) { zipReader, err := zip.OpenReader(zipFile) - var paths []string + paths := []string{} if err != nil { return []string{}, err } @@ -22,30 +23,45 @@ func Unzip(zipFile string, destDir string) ([]string, error) { if strings.Contains(f.Name, "..") { return []string{}, fmt.Errorf("%s 文件名不合法", f.Name) } + // nolint fpath := filepath.Join(destDir, f.Name) paths = append(paths, fpath) if f.FileInfo().IsDir() { - if err := os.MkdirAll(fpath, os.ModePerm); err != nil { + err = os.MkdirAll(fpath, os.ModePerm) + if err != nil { return nil, err } } else { - if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil { - return []string{}, err - } - - inFile, err := f.Open() + err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm) if err != nil { return []string{}, err } - defer inFile.Close() - outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) - if err != nil { - return []string{}, err + zipFunc := func(fpath string) error { + var inFile io.ReadCloser + var outFile *os.File + + inFile, err = f.Open() + if err != nil { + return err + } + defer inFile.Close() + + outFile, err = os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) + if err != nil { + return err + } + defer outFile.Close() + + // nolint + _, err = io.Copy(outFile, inFile) + if err != nil { + return err + } + return nil } - defer outFile.Close() - _, err = io.Copy(outFile, inFile) + err = zipFunc(fpath) if err != nil { return []string{}, err } @@ -70,32 +86,35 @@ func ZipFiles(filename string, files []string, oldForm, newForm string) error { // 把files添加到zip中 for _, file := range files { - err = func(file string) error { - zipFile, err := os.Open(file) + var zipFile *os.File + zipFile, err = os.Open(file) if err != nil { return err } defer zipFile.Close() // 获取file的基础信息 - info, err := zipFile.Stat() + var info fs.FileInfo + info, err = zipFile.Stat() if err != nil { return err } - header, err := zip.FileInfoHeader(info) + var header *zip.FileHeader + header, err = zip.FileInfoHeader(info) if err != nil { return err } - // 使用上面的FileInforHeader() 就可以把文件保存的路径替换成我们自己想要的了,如下面 + // 使用上面的FileInfoHeader() 就可以把文件保存的路径替换成我们自己想要的了,如下面 header.Name = strings.Replace(file, oldForm, newForm, -1) // 优化压缩 // 更多参考see http://golang.org/pkg/archive/zip/#pkg-constants header.Method = zip.Deflate - writer, err := zipWriter.CreateHeader(header) + var writer io.Writer + writer, err = zipWriter.CreateHeader(header) if err != nil { return err }