GoCommon - Go通用工具类库

这是一个Go语言开发的通用工具类库为其他Go项目提供常用的工具方法集合。

功能模块

1. 数据库迁移工具 (migration)

提供数据库迁移功能支持MySQL、PostgreSQL、SQLite等数据库。

2. 日期转换工具 (datetime)

提供日期时间转换功能,支持时区设定和多种格式转换。

3. HTTP Restful工具 (http)

提供HTTP请求/响应处理工具包含标准化的响应结构、分页支持和HTTP状态码与业务状态码的分离。

4. 中间件工具 (middleware)

提供常用的HTTP中间件包括CORS处理和时区管理。

5. 配置工具 (config)

提供从外部文件加载配置的功能支持数据库、OSS、Redis、CORS、MinIO等配置。

6. 存储工具 (storage)

提供文件上传和查看功能支持OSS和MinIO两种存储方式并提供HTTP处理器。

7. 邮件工具 (email)

提供SMTP邮件发送功能支持纯文本和HTML邮件使用Go标准库实现。

8. 短信工具 (sms)

提供阿里云短信发送功能支持模板短信和批量发送使用Go标准库实现。

9. 工厂工具 (factory)

提供从配置文件直接创建已初始化客户端对象的功能包括数据库、Redis、邮件、短信、日志等避免调用方重复实现创建逻辑。

10. 日志工具 (logger)

提供统一的日志记录功能支持多种日志级别和输出方式使用Go标准库实现。

安装

1. 配置私有仓库(重要)

由于本项目使用私有 Git 仓库,需要先配置 GOPRIVATE 环境变量:

# 使用 go env 命令配置(推荐,永久生效)
go env -w GOPRIVATE=git.toowon.com

# 验证配置
go env GOPRIVATE

详细配置说明请参考 SETUP.md

遇到问题?请查看 故障排除指南

2. 安装模块

# 安装最新版本(推荐用于开发)
go get git.toowon.com/jimmy/go-common@latest

# 安装特定版本(推荐用于生产)
go get git.toowon.com/jimmy/go-common@v1.0.0

版本管理说明请参考 VERSION.md

使用示例

详细的使用说明请参考各模块的文档:

快速示例

数据库迁移

import "git.toowon.com/jimmy/go-common/migration"

migrator := migration.NewMigrator(db)
migrator.AddMigration(migration.Migration{
    Version: "20240101000001",
    Description: "create_users_table",
    Up: func(db *gorm.DB) error {
        return db.Exec("CREATE TABLE users ...").Error
    },
})
migrator.Up()

日期转换

import "git.toowon.com/jimmy/go-common/datetime"

datetime.SetDefaultTimeZone(datetime.AsiaShanghai)
now := datetime.Now()
str := datetime.FormatDateTime(now)

HTTP响应Handler黑盒模式

import (
    "net/http"
    commonhttp "git.toowon.com/jimmy/go-common/http"
)

// 使用Handler黑盒模式
func GetUser(h *commonhttp.Handler) {
    id := h.GetQueryInt64("id", 0)  // 无需传递r
    h.Success(data)                  // 无需传递w
}

http.HandleFunc("/user", commonhttp.HandleFunc(GetUser))

中间件

import (
    "git.toowon.com/jimmy/go-common/middleware"
    commonhttp "git.toowon.com/jimmy/go-common/http"
)

// CORS + 时区中间件
chain := middleware.NewChain(
    middleware.CORS(),
    middleware.Timezone,
)
handler := chain.ThenFunc(yourHandler)

// 在Handler中获取时区
func handler(h *commonhttp.Handler) {
    timezone := h.GetTimezone()
}

配置管理

import "git.toowon.com/jimmy/go-common/config"

// 从文件加载配置
cfg, err := config.LoadFromFile("./config.json")

// 获取各种配置
dsn, _ := cfg.GetDatabaseDSN()
redisAddr := cfg.GetRedisAddr()
corsConfig := cfg.GetCORS()

文件上传和查看(推荐使用工厂黑盒模式)

import (
    "context"
    "git.toowon.com/jimmy/go-common/factory"
)

fac, _ := factory.NewFactoryFromFile("./config.json")
ctx := context.Background()

// 黑盒模式推荐自动选择OSS或MinIO
file, _ := os.Open("test.jpg")
url, _ := fac.UploadFile(ctx, "images/test.jpg", file, "image/jpeg")

// 获取文件URL
url, _ := fac.GetFileURL("images/test.jpg", 0) // 永久有效
url, _ := fac.GetFileURL("images/test.jpg", 3600) // 1小时后过期

// 或使用存储处理器需要HTTP处理器时
storage, _ := storage.NewStorage(storage.StorageTypeOSS, cfg)
uploadHandler := storage.NewUploadHandler(...)

邮件发送(推荐使用工厂黑盒模式)

import "git.toowon.com/jimmy/go-common/factory"

fac, _ := factory.NewFactoryFromFile("./config.json")

// 黑盒模式(推荐)
fac.SendEmail([]string{"user@example.com"}, "主题", "正文")
fac.SendEmail([]string{"user@example.com"}, "主题", "纯文本", "<h1>HTML内容</h1>")

// 或获取客户端对象(需要高级功能时)
emailClient, _ := fac.GetEmailClient()
emailClient.SendSimple(...)

短信发送(推荐使用工厂黑盒模式)

import "git.toowon.com/jimmy/go-common/factory"

fac, _ := factory.NewFactoryFromFile("./config.json")

// 黑盒模式(推荐)
fac.SendSMS([]string{"13800138000"}, map[string]string{"code": "123456"})

// 或获取客户端对象(需要高级功能时)
smsClient, _ := fac.GetSMSClient()
smsClient.SendSimple(...)

使用工厂(黑盒模式,推荐)

import (
    "context"
    "git.toowon.com/jimmy/go-common/factory"
)

// 从配置文件创建工厂(最推荐)
fac, _ := factory.NewFactoryFromFile("./config.json")
ctx := context.Background()

// 日志(黑盒模式,直接调用)
fac.LogInfo("用户登录成功")
fac.LogError("登录失败: %v", err)

// 邮件发送(黑盒模式,直接调用)
fac.SendEmail([]string{"user@example.com"}, "验证码", "您的验证码是123456")

// 短信发送(黑盒模式,直接调用)
fac.SendSMS([]string{"13800138000"}, map[string]string{"code": "123456"})

// 文件上传黑盒模式自动选择OSS或MinIO
file, _ := os.Open("test.jpg")
url, _ := fac.UploadFile(ctx, "images/test.jpg", file, "image/jpeg")

// 获取文件URL
url, _ := fac.GetFileURL("images/test.jpg", 0) // 永久有效
url, _ := fac.GetFileURL("images/test.jpg", 3600) // 1小时后过期

// Redis操作黑盒模式直接调用
fac.RedisSet(ctx, "key", "value", time.Hour)
value, _ := fac.RedisGet(ctx, "key")
fac.RedisDelete(ctx, "key")

// 数据库GORM已经很灵活直接返回对象
db, _ := fac.GetDatabase()
db.Find(&users)

更多示例请查看 examples 目录。

版本管理

当前版本:v1.0.0

如何指定版本

go.mod 文件中指定版本:

require (
    git.toowon.com/jimmy/go-common v1.0.0
)

或者使用命令行:

# 使用最新版本
go get git.toowon.com/jimmy/go-common@latest

# 使用特定版本
go get git.toowon.com/jimmy/go-common@v1.0.0

详细版本管理说明请参考 VERSION.md

Description
GO框架的通用工具库
Readme 821 KiB
Languages
Go 99.3%
Shell 0.7%