# BSM-SDK Core BSM-SDK Core 是一个企业级后端开发工具包的核心模块,提供了微服务架构、配置管理、加密解密、缓存、数据库访问、中间件等基础功能。 ## 私有仓库设置 ```bash go env -w GOPRIVATE=git.apinb.com/* go env -w GONOPROXY=git.apinb.com/* go env -w GOINSECURE=git.apinb.com/* go env -w GONOSUMDB=git.apinb.com/* ``` ## 核心功能模块 ### 1. 服务管理 (service) #### 服务启动与注册 - **Service**: 核心服务结构,支持 gRPC 服务启动和 etcd 注册 - **New()**: 创建服务实例 - **Start()**: 启动服务,支持 etcd 注册和 HTTP 网关 - **Stop()**: 优雅停止服务 - **Use()**: 执行初始化函数 #### 服务发现 - **FoundGrpcMethods()**: 自动发现 gRPC 方法 - **RegisterService()**: 注册服务到 etcd - **ServiceRegister**: 服务注册器,支持租约管理 #### 元数据解析 - **ParseMetaCtx()**: 解析 gRPC 上下文中的元数据 - **ParseOptions**: 解析选项,支持角色验证和私有IP检查 ### 2. 配置管理 (conf) #### 配置加载 - **New()**: 加载配置文件,支持环境变量替换 - **NotNil()**: 验证必需配置项 - **PrintInfo()**: 打印配置信息 - **CheckPort()**: 检查端口配置 #### 配置类型 - **MicroServiceConf**: 微服务配置 - **GatewayConf**: 网关配置 - **DBConf**: 数据库配置 ### 3. 加密与解密 (crypto) #### AES 加密 - **AESGCMEncrypt/AESGCMDecrypt**: GCM 模式加密解密 - **Encrypt/Decrypt**: CBC 模式加密解密 - **AesEncryptECB/AesDecryptECB**: ECB 模式加密解密 - **AesKeyCheck()**: 密钥环境变量检测 #### RSA 加密 - **EncryptWithPublicKey()**: 公钥加密 - **Decrypt()**: 私钥解密 #### 通用加密 - **AesEncryptCBC/AesDecryptCBC**: 通用 CBC 加密解密 - **PKCS7Padding/PKCS7UnPadding**: PKCS7 填充 ### 4. 数据库支持 (database) #### 数据库连接 - **NewDatabase()**: 创建数据库连接,支持 MySQL 和 PostgreSQL - **NewMysql()**: MySQL 连接 - **NewPostgres()**: PostgreSQL 连接 #### 数据库类型 - **SqlOptions**: 数据库连接选项 - **Std_IICUDS**: 标准数据库模型(ID、Identity、Created、Updated、Deleted、Status) - **Std_ICUD**: 标准数据库模型(ID、Created、Updated、Deleted) - **Std_Passport**: 护照模型 - **Std_Owner**: 所有者模型 ### 5. 缓存支持 (cache) #### Redis 缓存 - **RedisClient**: Redis 客户端封装 - **New()**: 创建 Redis 连接 - **Hash()**: 哈希分片计算 #### 内存缓存 - 支持内存缓存操作 ### 6. 消息队列 (queue) #### NATS 消息队列 - **Nats**: NATS 客户端封装 - **NewNats()**: 创建 NATS 连接 - **Subscribe()**: 订阅消息 - **Producer()**: 发布消息 ### 7. 中间件 (middleware) #### JWT 认证 - **JwtAuth()**: JWT 认证中间件 - **ParseAuth()**: 解析认证信息 #### CORS 支持 - **Cors()**: CORS 中间件 #### 运行模式 - **Mode()**: 设置 Gin 运行模式 ### 8. 工具类 (utils) #### 网络工具 (net.go) ✨ 新增超时功能 完整的网络工具集,所有HTTP请求都支持超时控制。 **IP地址工具:** - **IsPublicIP(ipString)**: 判断是否为公网IP - 识别私有网段(10.x.x.x、172.16-31.x.x、192.168.x.x) - 识别回环地址和链路本地地址 - 性能:62.55 ns/op,零内存分配 - **GetLocationIP()**: 获取本机第一个有效IPv4地址 - 自动跳过回环和链路本地地址 - 返回 "127.0.0.1" 如果找不到 - **LocalIPv4s()**: 获取本机所有IPv4地址列表 - 返回所有非回环IPv4地址 - 自动过滤链路本地地址 - **GetOutBoundIP()**: 获取外网IP地址 **HTTP请求工具(带超时保护):** - **HttpGet(url, timeout...)**: HTTP GET请求 - 默认超时:30秒 - 支持自定义超时 - Context超时控制 - 示例:`body, _ := HttpGet("https://api.com", 5*time.Second)` - **HttpPost(url, headers, data, timeout...)**: HTTP POST请求 - 默认超时:30秒 - 自动设置Content-Type和Request-Id - 检查HTTP状态码 - 示例:`body, _ := HttpPost(url, headers, data, 10*time.Second)` - **HttpPostJSON(url, headers, data)**: HTTP POST JSON请求 - 自动JSON序列化 - 继承HttpPost所有特性 - 示例:`body, _ := HttpPostJSON(url, map[string]any{"key": "value"})` - **HttpRequest(request, timeout...)**: 执行自定义HTTP请求 - 支持任何HTTP方法 - 完全自定义请求 - **DownloadFile(url, savePath, progressCallback, timeout...)**: 文件下载 - 默认超时:5分钟 - 实时进度回调 - 文件权限:0644 - 缓冲区大小:32KB - 示例: ```go progress := func(total, downloaded int64) { percent := float64(downloaded) / float64(total) * 100 fmt.Printf("下载: %.2f%%\n", percent) } err := DownloadFile(url, "file.zip", progress, 10*time.Minute) ``` **配置常量:** - `DefaultHTTPTimeout`: 30秒(HTTP请求默认超时) - `DefaultDownloadTimeout`: 5分钟(下载默认超时) - `DefaultBufferSize`: 32KB(默认缓冲区) #### 二维码生成 (qrcode.go) 🎨 全新功能 完整的二维码生成工具,支持多种输出格式和自定义配置。 **基础生成:** - **GenerateQRCode(content, filename, size...)**: 生成二维码文件 - 默认尺寸:256x256 - 支持自定义尺寸(21-8192像素) - 中级纠错(15%容错) - 示例:`GenerateQRCode("https://example.com", "qr.png", 512)` - **GenerateQRCodeBytes(content, size...)**: 生成字节数组 - PNG格式 - 适合HTTP响应、数据库存储 - 性能:~1.5ms/次 - 示例:`bytes, _ := GenerateQRCodeBytes("内容", 300)` - **GenerateQRCodeBase64(content, size...)**: 生成Base64编码 - 便于JSON传输 - 适合数据库文本字段 - 示例:`base64Str, _ := GenerateQRCodeBase64("内容")` - **GenerateQRCodeDataURL(content, size...)**: 生成Data URL - 可直接用于HTML 标签 - 包含完整图片数据 - 示例:`dataURL, _ := GenerateQRCodeDataURL("内容")` **高级功能:** - **GenerateQRCodeWithConfig(content, config)**: 自定义配置生成 - 自定义尺寸、颜色、纠错级别 - 示例: ```go config := &QRCodeConfig{ Size: 512, ErrorLevel: QRCodeErrorLevelHigh, ForegroundColor: color.RGBA{255, 0, 0, 255}, // 红色 BackgroundColor: color.White, } bytes, _ := GenerateQRCodeWithConfig("内容", config) ``` - **GenerateQRCodeWithLogo(content, logoPath, size...)**: 带Logo二维码 - Logo占据中心1/5区域 - 高级纠错(30%容错) - 建议尺寸>=512 - 示例:`bytes, _ := GenerateQRCodeWithLogo("内容", "logo.png", 512)` - **BatchGenerateQRCode(items, size...)**: 批量生成 - 一次生成多个二维码 - 返回失败列表 - 示例: ```go items := map[string]string{ "产品A": "qr_a.png", "产品B": "qr_b.png", } failed, _ := BatchGenerateQRCode(items, 300) ``` **纠错级别:** - `QRCodeErrorLevelLow`: 低级纠错(~7%容错) - `QRCodeErrorLevelMedium`: 中级纠错(~15%容错,默认) - `QRCodeErrorLevelQuartile`: 较高级纠错(~25%容错) - `QRCodeErrorLevelHigh`: 高级纠错(~30%容错,适合Logo) **实用场景:** - URL分享、名片(vCard)、WiFi连接 - 支付码、位置信息、文本分享 - 产品标签、会员卡、门票优惠券 **性能指标:** - 生成速度:1.5-2.2 ms/次 - 内存占用:~984 KB/次 - 并发安全:所有函数都是并发安全的 #### 数据类型转换 - **String2Int/String2Int64**: 字符串转整数 - **String2Float64/String2Float32**: 字符串转浮点数 - **Int2String/Int642String**: 整数转字符串 - **Float64ToString/Float32ToString**: 浮点数转字符串 - **AnyToString()**: 任意类型转字符串 #### 时间处理 - **Time2String()**: 时间转字符串 - **String2Time()**: 字符串转时间 #### 身份标识 - **UUID()**: 生成 UUID - **ULID()**: 生成 ULID #### 文件操作 - **PathExists()**: 检查路径是否存在 - **CreateDir()**: 创建目录 - **GetRunPath()**: 获取运行路径 - **GetCurrentPath()**: 获取当前路径 #### JSON 处理 - **JsonEscape()**: JSON 转义 ### 9. 错误处理 (errcode) #### 标准错误码 - **Header 错误**: 101-104 - **标准错误**: 110-121 - **JWT 错误**: 131-139 - **模型错误**: 151-157 - **gRPC 错误**: 171-186 #### 错误创建 - **NewError()**: 创建标准错误 - **ErrFatal()**: 创建致命错误 - **ErrNotFound()**: 创建未找到错误 ### 10. 响应处理 (infra) #### 统一响应 - **Reply**: 统一响应结构 - **Success()**: 成功响应 - **Error()**: 错误响应,支持 gRPC 状态码转换 ### 11. 日志打印 (printer) #### 彩色日志 - **Info()**: 信息日志(白色) - **Warn()**: 警告日志(橙色) - **Success()**: 成功日志(绿色) - **Error()**: 错误日志(红色) - **Json()**: JSON 格式化输出 ### 12. 环境管理 (env) #### 运行时环境 - **RuntimeEnv**: 运行时环境配置 - **NewEnv()**: 初始化环境 - **GetEnvDefault()**: 获取环境变量默认值 ### 13. 变量管理 (vars) #### 全局变量 - **ServiceKey**: 服务键 - **HostName**: 主机名 - **VERSION**: 版本号 - **BUILD_TIME**: 构建时间 - **GO_VERSION**: Go 版本 ### 14. 第三方集成 (third) #### 微信集成 - 支持微信相关功能 ### 15. 许可证管理 (licence) #### 许可证验证 - 支持许可证文件验证 ### 配置环境变量 ```bash export BSM_Workspace=def export BSM_JwtSecretKey=your_secret_key export BSM_RuntimeMode=dev export BSM_Prefix=/usr/local/bsm ``` ### 安全建议 - 使用强密钥进行加密 - 定期更新 JWT 密钥 - 配置适当的数据库连接池 - 使用 HTTPS 进行通信 - 定期检查许可证有效性 ## 🚀 快速开始 ### 网络工具示例 ```go package main import ( "fmt" "time" "git.apinb.com/bsm-sdk/core/utils" ) func main() { // 1. 获取本机IP localIP := utils.GetLocationIP() fmt.Printf("本机IP: %s\n", localIP) // 2. HTTP GET请求(带超时) body, err := utils.HttpGet("https://api.example.com/data", 5*time.Second) if err != nil { fmt.Printf("请求失败: %v\n", err) return } fmt.Printf("响应: %s\n", string(body)) // 3. POST JSON数据 headers := map[string]string{"Authorization": "Bearer token"} data := map[string]any{"name": "张三", "age": 25} body, err = utils.HttpPostJSON("https://api.example.com/users", headers, data) // 4. 下载文件(带进度) progress := func(total, downloaded int64) { if total > 0 { percent := float64(downloaded) / float64(total) * 100 fmt.Printf("\r下载进度: %.2f%%", percent) } } err = utils.DownloadFile( "https://example.com/file.zip", "./download/file.zip", progress, 10*time.Minute, ) } ``` ### 二维码生成示例 ```go package main import ( "fmt" "image/color" "git.apinb.com/bsm-sdk/core/utils" ) func main() { // 1. 基础二维码 err := utils.GenerateQRCode("https://example.com", "qrcode.png") // 2. 自定义尺寸 err = utils.GenerateQRCode("内容", "qrcode_large.png", 512) // 3. 生成Base64(用于API响应) base64Str, _ := utils.GenerateQRCodeBase64("订单号:20231103001") fmt.Printf("Base64: %s\n", base64Str) // 4. 自定义颜色 config := &utils.QRCodeConfig{ Size: 512, ErrorLevel: utils.QRCodeErrorLevelHigh, ForegroundColor: color.RGBA{255, 0, 0, 255}, // 红色 BackgroundColor: color.White, } bytes, _ := utils.GenerateQRCodeWithConfig("内容", config) utils.SaveQRCodeBytes(bytes, "red_qrcode.png") // 5. 批量生成 items := map[string]string{ "产品A": "qr_a.png", "产品B": "qr_b.png", "产品C": "qr_c.png", } failed, err := utils.BatchGenerateQRCode(items, 300) if err != nil { fmt.Printf("部分失败: %v\n", failed) } // 6. 名片二维码(vCard) vcard := `BEGIN:VCARD VERSION:3.0 FN:张三 TEL:+86-138-0000-0000 EMAIL:zhangsan@example.com ORG:某某公司 END:VCARD` utils.GenerateQRCode(vcard, "namecard.png", 400) // 7. WiFi连接二维码 wifiInfo := "WIFI:T:WPA;S:MyWiFi;P:password123;;" utils.GenerateQRCode(wifiInfo, "wifi_qr.png", 300) } ``` ## 📝 使用建议 ### 1. 配置管理 ```go // 推荐使用环境变量进行配置 conf.New("your-service", &config) ``` ### 2. 错误处理 ```go // 使用统一的错误码 if err != nil { return errcode.ErrInternal } // 网络请求错误处理 body, err := utils.HttpGet(url, 5*time.Second) if err != nil { // 判断是否为超时错误 if errors.Is(err, context.DeadlineExceeded) { fmt.Println("请求超时") } return err } ``` ### 3. 缓存使用 ```go // 使用统一的缓存键前缀 key := redisClient.BuildKey("user", userID) ``` ### 4. 数据库连接 ```go // 使用连接池优化 db, err := database.NewDatabase("mysql", dsn, options) ``` ### 5. 二维码生成最佳实践 ```go // 内容较长时增大尺寸 if len(content) > 100 { size = 512 } else { size = 256 } // 添加Logo时使用高级纠错 config := &utils.QRCodeConfig{ Size: 512, ErrorLevel: utils.QRCodeErrorLevelHigh, // 重要! ForegroundColor: color.Black, BackgroundColor: color.White, } ``` ## 许可证 本项目采用私有许可证,请确保已获得相应的使用授权。 ## 贡献 欢迎提交 Issue 和 Pull Request 来改进本项目。 ## 联系方式 如有问题,请联系开发团队。