Skip to content

Commit b8ff21b

Browse files
committed
ok
1 parent e3510c0 commit b8ff21b

File tree

2 files changed

+310
-0
lines changed

2 files changed

+310
-0
lines changed

model/qrcodeTool/qrcodeTool.go

+203
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
// Package qrcodeTool Description: 二维码工具类
2+
package qrcodeTool
3+
4+
import (
5+
"bytes"
6+
"image/color"
7+
"os"
8+
9+
qrgen "github.com/skip2/go-qrcode"
10+
"github.com/tuotoo/qrcode"
11+
)
12+
13+
// E二维码纠错级别 是二维码的纠错级别类型,使用来自 qrgen 库的原生纠错级别。
14+
type E二维码纠错级别 = qrgen.RecoveryLevel
15+
16+
const (
17+
// E低级 表示7%的错误恢复率
18+
E低级 E二维码纠错级别 = qrgen.Low
19+
// E中级 表示15%的错误恢复率
20+
E中级 E二维码纠错级别 = qrgen.Medium
21+
// E高级 表示25%的错误恢复率
22+
E高级 E二维码纠错级别 = qrgen.High
23+
// E最高级 表示30%的错误恢复率
24+
E最高级 E二维码纠错级别 = qrgen.Highest
25+
)
26+
27+
// E二维码工具类 提供二维码生成和识别的工具方法
28+
type E二维码工具类 struct{}
29+
30+
// E生成二维码 生成一个二维码并返回其字节数组
31+
//
32+
// 参数:
33+
// - 二维码内容: 需要生成的二维码内容
34+
// - 尺寸: 二维码的尺寸(像素)
35+
// - 纠错级别: 二维码的纠错级别
36+
//
37+
// 返回:
38+
// - 二维码字节数组
39+
// - 错误信息(如果有)
40+
func (E二维码工具类) E生成二维码(二维码内容 string, 尺寸 int, 纠错级别 E二维码纠错级别) ([]byte, error) {
41+
return qrgen.Encode(二维码内容, qrgen.RecoveryLevel(纠错级别), 尺寸)
42+
}
43+
44+
// E生成并保存 生成二维码并保存为文件
45+
//
46+
// 参数:
47+
// - 二维码内容: 需要生成的二维码内容
48+
// - 尺寸: 二维码的尺寸(像素)
49+
// - 保存文件名: 保存的文件路径
50+
// - 纠错级别: 二维码的纠错级别
51+
//
52+
// 返回:
53+
// - 错误信息(如果有)
54+
func (E二维码工具类) E生成并保存(二维码内容 string, 尺寸 int, 保存文件名 string, 纠错级别 E二维码纠错级别) error {
55+
return qrgen.WriteFile(二维码内容, qrgen.RecoveryLevel(纠错级别), 尺寸, 保存文件名)
56+
}
57+
58+
// E生成并保存2 生成自定义颜色的二维码并保存为文件
59+
//
60+
// 参数:
61+
// - 二维码内容: 需要生成的二维码内容
62+
// - 尺寸: 二维码的尺寸(像素)
63+
// - 保存文件名: 保存的文件路径
64+
// - 背景颜色: 二维码的背景颜色
65+
// - 前景颜色: 二维码的前景颜色
66+
// - 纠错级别: 二维码的纠错级别
67+
//
68+
// 返回:
69+
// - 错误信息(如果有)
70+
func (E二维码工具类) E生成并保存2(二维码内容 string, 尺寸 int, 保存文件名 string, 背景颜色, 前景颜色 color.Color, 纠错级别 E二维码纠错级别) error {
71+
return qrgen.WriteColorFile(二维码内容, qrgen.RecoveryLevel(纠错级别), 尺寸, 前景颜色, 背景颜色, 保存文件名)
72+
}
73+
74+
// E识别二维码 从文件中读取并识别二维码
75+
//
76+
// 参数:
77+
// - file: 文件指针,指向需要识别的二维码图片
78+
//
79+
// 返回:
80+
// - 识别的二维码内容
81+
// - 错误信息(如果有)
82+
func (E二维码工具类) E识别二维码(file *os.File) (string, error) {
83+
qrmatrix, err := qrcode.Decode(file)
84+
if err != nil {
85+
return "", err
86+
}
87+
return qrmatrix.Content, nil
88+
}
89+
90+
// E二维码类 表示二维码对象,包括其内容和属性
91+
type E二维码类 struct {
92+
E内容 string // 二维码的内容
93+
E纠错级别 E二维码纠错级别 // 二维码的纠错级别
94+
E前景颜色 color.Color // 二维码的前景颜色
95+
E背景颜色 color.Color // 二维码的背景颜色
96+
E禁用边框 bool // 是否禁用二维码的边框
97+
qrCode *qrgen.QRCode // 内部的二维码对象
98+
}
99+
100+
// E创建 创建一个二维码对象
101+
//
102+
// 参数:
103+
// - 二维码内容: 需要生成的二维码内容
104+
// - 级别: 二维码的纠错级别
105+
//
106+
// 返回:
107+
// - 生成的二维码对象
108+
// - 错误信息(如果有)
109+
func (E二维码类) E创建(二维码内容 string, 级别 E二维码纠错级别) (*E二维码类, error) {
110+
qrCode, err := qrgen.New(二维码内容, qrgen.RecoveryLevel(级别))
111+
if err != nil {
112+
return nil, err
113+
}
114+
return &E二维码类{E内容: 二维码内容, E纠错级别: 级别, qrCode: qrCode}, nil
115+
}
116+
117+
// E创建2 创建一个带有指定版本号的二维码对象
118+
//
119+
// 参数:
120+
// - 二维码内容: 需要生成的二维码内容
121+
// - 版本号: 二维码的版本号(1-40)
122+
// - 级别: 二维码的纠错级别
123+
//
124+
// 返回:
125+
// - 生成的二维码对象
126+
// - 错误信息(如果有)
127+
func (E二维码类) E创建2(二维码内容 string, 版本号 int, 级别 E二维码纠错级别) (*E二维码类, error) {
128+
qrCode, err := qrgen.NewWithForcedVersion(二维码内容, 版本号, qrgen.RecoveryLevel(级别))
129+
if err != nil {
130+
return nil, err
131+
}
132+
return &E二维码类{E内容: 二维码内容, E纠错级别: 级别, qrCode: qrCode}, nil
133+
}
134+
135+
// E取坐标数组 返回二维码的坐标数组
136+
//
137+
// 返回:
138+
// - 一个二维布尔数组,表示二维码的像素点,true为黑色,false为白色
139+
func (qr *E二维码类) E取坐标数组() [][]bool {
140+
return qr.qrCode.Bitmap()
141+
}
142+
143+
// E生成二维码 返回指定尺寸的二维码图像
144+
//
145+
// 参数:
146+
// - 尺寸: 二维码的尺寸(像素)
147+
//
148+
// 返回:
149+
// - 二维码图像的字节数组
150+
func (qr *E二维码类) E生成二维码(尺寸 int) []byte {
151+
var buf bytes.Buffer
152+
err := qr.qrCode.Write(尺寸, &buf)
153+
if err != nil {
154+
return nil
155+
}
156+
return buf.Bytes()
157+
}
158+
159+
// E写到接口 将二维码数据写出到一个接口中
160+
//
161+
// 参数:
162+
// - 尺寸: 二维码的尺寸(像素)
163+
// - w: 要写入的接口(例如文件指针)
164+
//
165+
// 返回:
166+
// - 错误信息(如果有)
167+
func (qr *E二维码类) E写到接口(尺寸 int, w *os.File) error {
168+
return qr.qrCode.Write(尺寸, w)
169+
}
170+
171+
// E写出文件 将二维码数据保存为文件
172+
//
173+
// 参数:
174+
// - 尺寸: 二维码的尺寸(像素)
175+
// - 文件名: 保存的文件路径
176+
//
177+
// 返回:
178+
// - 错误信息(如果有)
179+
func (qr *E二维码类) E写出文件(尺寸 int, 文件名 string) error {
180+
return qr.qrCode.WriteFile(尺寸, 文件名)
181+
}
182+
183+
// E取图像文本 将二维码以文本形式返回
184+
//
185+
// 参数:
186+
// - 反向颜色: 如果为true,返回黑白反转的二维码文本
187+
//
188+
// 返回:
189+
// - 二维码的文本表示形式
190+
func (qr *E二维码类) E取图像文本(反向颜色 bool) string {
191+
return qr.qrCode.ToString(反向颜色)
192+
}
193+
194+
// E取小图像文本 将小尺寸二维码以文本形式返回
195+
//
196+
// 参数:
197+
// - 反向颜色: 如果为true,返回黑白反转的二维码文本
198+
//
199+
// 返回:
200+
// - 小尺寸二维码的文本表示形式
201+
func (qr *E二维码类) E取小图像文本(反向颜色 bool) string {
202+
return qr.qrCode.ToSmallString(反向颜色)
203+
}

model/qrcodeTool/qrcodeTool_test.go

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package qrcodeTool
2+
3+
import (
4+
"image/color"
5+
"os"
6+
"testing"
7+
)
8+
9+
// 测试生成二维码
10+
func TestE生成二维码(t *testing.T) {
11+
工具类 := E二维码工具类{}
12+
data, err := 工具类.E生成二维码("测试内容", 256, E中级)
13+
if err != nil {
14+
t.Fatalf("生成二维码失败: %v", err)
15+
}
16+
if len(data) == 0 {
17+
t.Fatalf("生成二维码的数据为空")
18+
}
19+
}
20+
21+
// 测试生成并保存二维码
22+
func TestE生成并保存(t *testing.T) {
23+
工具类 := E二维码工具类{}
24+
err := 工具类.E生成并保存("测试内容", 256, "test_qr.png", E中级)
25+
if err != nil {
26+
t.Fatalf("生成并保存二维码失败: %v", err)
27+
}
28+
29+
// 确保文件生成成功
30+
if _, err := os.Stat("test_qr.png"); os.IsNotExist(err) {
31+
t.Fatalf("二维码文件未生成")
32+
}
33+
// 清理测试文件
34+
os.Remove("test_qr.png")
35+
}
36+
37+
// 测试生成自定义颜色二维码并保存
38+
func TestE生成并保存2(t *testing.T) {
39+
工具类 := E二维码工具类{}
40+
err := 工具类.E生成并保存2("测试内容", 256, "test_color_qr.png", color.White, color.Black, E高级)
41+
if err != nil {
42+
t.Fatalf("生成自定义颜色二维码失败: %v", err)
43+
}
44+
45+
// 确保文件生成成功
46+
if _, err := os.Stat("test_color_qr.png"); os.IsNotExist(err) {
47+
t.Fatalf("二维码文件未生成")
48+
}
49+
// 清理测试文件
50+
os.Remove("test_color_qr.png")
51+
}
52+
53+
// 测试二维码识别
54+
func TestE识别二维码(t *testing.T) {
55+
工具类 := E二维码工具类{}
56+
57+
// 先生成二维码
58+
err := 工具类.E生成并保存("测试识别", 256, "test_recognize_qr.png", E中级)
59+
if err != nil {
60+
t.Fatalf("生成二维码失败: %v", err)
61+
}
62+
63+
// 打开文件进行识别
64+
file, err := os.Open("test_recognize_qr.png")
65+
if err != nil {
66+
t.Fatalf("打开二维码文件失败: %v", err)
67+
}
68+
defer file.Close()
69+
70+
// 识别二维码
71+
content, err := 工具类.E识别二维码(file)
72+
if err != nil {
73+
t.Fatalf("识别二维码失败: %v", err)
74+
}
75+
if content != "测试识别" {
76+
t.Fatalf("二维码内容识别错误: 期望 '测试识别',但得到 '%s'", content)
77+
}
78+
79+
// 清理测试文件
80+
os.Remove("test_recognize_qr.png")
81+
}
82+
83+
// 测试二维码类的创建和操作
84+
func TestE二维码类(t *testing.T) {
85+
二维码类, err := E二维码类{}.E创建("测试二维码类", E中级)
86+
if err != nil {
87+
t.Fatalf("创建二维码类失败: %v", err)
88+
}
89+
90+
data := 二维码类.E生成二维码(256)
91+
if len(data) == 0 {
92+
t.Fatalf("二维码类生成的二维码数据为空")
93+
}
94+
95+
// 测试保存文件
96+
err = 二维码类.E写出文件(256, "test_class_qr.png")
97+
if err != nil {
98+
t.Fatalf("二维码类保存文件失败: %v", err)
99+
}
100+
101+
// 确保文件生成成功
102+
if _, err := os.Stat("test_class_qr.png"); os.IsNotExist(err) {
103+
t.Fatalf("二维码类文件未生成")
104+
}
105+
// 清理测试文件
106+
os.Remove("test_class_qr.png")
107+
}

0 commit comments

Comments
 (0)