新增二维码功能模块:qrcode.go;

为http请求添加超时
This commit is contained in:
zhaoxiaorong
2025-11-03 15:27:12 +08:00
parent 3271453878
commit 2c5aab84da
5 changed files with 1311 additions and 158 deletions

335
README.md
View File

@@ -2,14 +2,6 @@
BSM-SDK Core 是一个企业级后端开发工具包的核心模块,提供了微服务架构、配置管理、加密解密、缓存、数据库访问、中间件等基础功能。
## 🚀 最新优化
- ✅ 添加了完整的中文注释,提高代码可读性
- ✅ 优化了数据类型转换函数的性能
- ✅ 改进了错误处理机制
- ✅ 增强了代码文档和注释
- ✅ 统一了代码风格和命名规范
## 私有仓库设置
```bash
@@ -114,11 +106,139 @@ go env -w GONOSUMDB=git.apinb.com/*
### 8. 工具类 (utils)
#### 网络工具
- **GetLocationIP()**: 获取本机IP
- **IsPublicIP()**: 判断是否为公网IP
- **HttpGet/HttpPost()**: HTTP 请求工具
- **DownloadFile()**: 文件下载
#### 网络工具 (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 <img>标签
- 包含完整图片数据
- 示例:`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**: 字符串转整数
@@ -218,52 +338,167 @@ export BSM_Prefix=/usr/local/bsm
- 使用 HTTPS 进行通信
- 定期检查许可证有效性
## 📝 代码优化说明
## 🚀 快速开始
### 已完成的优化
### 网络工具示例
1. **中文注释优化**
- 为所有核心模块添加了详细的中文注释
- 统一了注释风格和格式
- 提高了代码的可读性和维护性
```go
package main
2. **性能优化**
- 优化了 `String2Int64` 函数,直接使用 `strconv.ParseInt` 而不是先转 int 再转 int64
- 改进了网络工具函数的错误处理
- 优化了缓存操作的性能
import (
"fmt"
"time"
"git.apinb.com/bsm-sdk/core/utils"
)
3. **代码质量提升**
- 统一了函数命名规范
- 改进了错误处理机制
- 增强了类型安全性
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,
)
}
```
### 使用建议
### 二维码生成示例
1. **配置管理**
```go
// 推荐使用环境变量进行配置
conf.New("your-service", &config)
```
```go
package main
2. **错误处理**
```go
// 使用统一的错误码
if err != nil {
return errcode.ErrInternal
}
```
import (
"fmt"
"image/color"
"git.apinb.com/bsm-sdk/core/utils"
)
3. **缓存使用**
```go
// 使用统一的缓存键前缀
key := redisClient.BuildKey("user", userID)
```
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)
}
```
4. **数据库连接**
```go
// 使用连接池优化
db, err := database.NewDatabase("mysql", dsn, options)
```
## 📝 使用建议
### 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,
}
```
## 许可证