{"id":13820228,"url":"https://github.com/chanyipiaomiao/hltool","last_synced_at":"2025-05-16T07:33:40.924Z","repository":{"id":57482533,"uuid":"118541514","full_name":"chanyipiaomiao/hltool","owner":"chanyipiaomiao","description":"Go 开发常用工具库, Google2步验证客户端,AES加密解密,RSA加密解密,钉钉机器人,邮件发送,JWT生成解析,Log,BoltDB操作,图片操作,json操作,struct序列化","archived":false,"fork":false,"pushed_at":"2023-09-18T06:31:52.000Z","size":981,"stargazers_count":181,"open_issues_count":1,"forks_count":58,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-11-19T19:44:08.124Z","etag":null,"topics":["aes","boltdb-kv","byte-png","bytes","dingding","go","golang","image","image-processing","jpg","jwt-token","kit","libraries","log","rsa","sendmail"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chanyipiaomiao.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2018-01-23T01:48:44.000Z","updated_at":"2024-10-14T02:48:26.000Z","dependencies_parsed_at":"2022-09-02T04:30:12.921Z","dependency_job_id":"c08b69f1-7ca0-4695-b95e-3566b2b1369c","html_url":"https://github.com/chanyipiaomiao/hltool","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chanyipiaomiao%2Fhltool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chanyipiaomiao%2Fhltool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chanyipiaomiao%2Fhltool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chanyipiaomiao%2Fhltool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chanyipiaomiao","download_url":"https://codeload.github.com/chanyipiaomiao/hltool/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254488662,"owners_count":22079468,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aes","boltdb-kv","byte-png","bytes","dingding","go","golang","image","image-processing","jpg","jwt-token","kit","libraries","log","rsa","sendmail"],"created_at":"2024-08-04T08:00:59.792Z","updated_at":"2025-05-16T07:33:39.804Z","avatar_url":"https://github.com/chanyipiaomiao.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# hltool\r\n\r\nGo 开发常用工具库\r\n\r\n\r\n# 安装\r\n\r\n使用golang官方 dep 管理依赖\r\n```go\r\ngo get github.com/chanyipiaomiao/hltool\r\n```\r\n\r\n# 功能列表\r\n- [2步验证客户端](#2步验证客户端)\r\n- [AES加密解密](#aes加密解密)\r\n- [RSA加密解密](#rsa加密解密)\r\n- [钉钉机器人通知](#钉钉机器人通知)\r\n- [发送邮件](#发送邮件)\r\n- [JWT Token生成解析](#jwt-token生成解析)\r\n- [Log库](#log库)\r\n- [BoltDB嵌入式KV数据库](#boltdb嵌入式kv数据库)\r\n- [检测图片类型](#检测图片类型)\r\n- [图片转[]byte](#图片转byte数组)\r\n- [[]byte转换为png/jpg](#byte数组转换为png-jpg)\r\n- [json文件转换为byte数组](#json文件转换为byte数组)\r\n- [json []byte转换为struct](#json-byte数组转换为-struct)\r\n- [struct序列化成二进制文件和反序列化](#struct序列化成二进制文件和反序列化)\r\n- [struct序列化成byte数组和反序列化](#struct序列化成byte数组和反序列化)\r\n\r\n\r\n### 2步验证客户端\r\n\r\n模拟Google Authenticator验证器命令行客户端\r\n\r\n```go\r\nimport (\r\n    \"github.com/chanyipiaomiao/hltool\"\r\n    \"fmt\"\r\n)\r\n\r\nfunc main() {\r\n    totp := \u0026hltool.TOTP{\r\n        SecretKey: \"xxxxxxxxxxx\",\r\n        Algorithm: \"SHA1\",\r\n        Name: \"HeHe\",\r\n    }\r\n    n, t, err := hltool.TwoStepAuthGenNumber(totp)\r\n    if err != nil {\r\n        panic(err)\r\n    }\r\n    fmt.Printf(\"%s %s %d\\n\", totp.Name, n, t)\r\n}\r\n```\r\n\r\n[返回到目录](#功能列表)\r\n\r\n### AES加密解密\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n\t\"encoding/base64\"\r\n\t\"fmt\"\r\n\t\"log\"\r\n\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\nfunc main() {\r\n\r\n\t// AES 加解密 指定加密的密码\r\n\tgoaes := hltool.NewGoAES([]byte(\"O8Hp8WQbFPT7b5AUsEMVLtIU3MVYOrt8\"))\r\n\r\n\t// 加密数据\r\n\tencrypt, err := goaes.Encrypt([]byte(\"123456\"))\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\r\n\tfmt.Println(base64.StdEncoding.EncodeToString(encrypt))\r\n\r\n\t// 解密数据\r\n\tdecrypt, err := goaes.Decrypt(encrypt)\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\tfmt.Println(string(decrypt))\r\n\r\n}\r\n\r\n```\r\n\r\n[返回到目录](#功能列表)\r\n\r\n### RSA加密解密\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n\t\"fmt\"\r\n\t\"log\"\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\nfunc main() {\r\n\r\n\t// 生成 2048 位密钥对文件 指定名称\r\n\terr := hltool.NewRSAFile(\"id_rsa.pub\", \"id_rsa\", 2048)\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\r\n\t// 生成密钥对字符串\r\n\t// pub, pri, err := hltool.NewRSAString(2048)\r\n\t// if err != nil {\r\n\t// \tlog.Fatalln(err)\r\n\t// }\r\n\t// fmt.Println(pub)\r\n\t// fmt.Println(pri)\r\n\r\n\t// 指定 公钥文件名 和 私钥文件名\r\n\tgorsa, err := hltool.NewGoRSA(\"id_rsa.pub\", \"id_rsa\")\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\r\n\t// 明文字符\r\n\trawStr := \"O8Hp8WQbFPT7b5AUsEMVLtIU3MVYOrt8\"\r\n\r\n\t// 使用公钥加密\r\n\tencrypt, err := gorsa.PublicEncrypt([]byte(rawStr))\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\r\n\t// 使用私钥解密\r\n\tdecrypt, err := gorsa.PrivateDecrypt(encrypt)\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\tfmt.Println(string(decrypt))\r\n}\r\n```\r\n[返回到目录](#功能列表)\r\n\r\n### 钉钉机器人通知\r\n```go\r\nimport (\r\n\t\"log\"\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\ndingtalk := hltool.NewDingTalkClient(\"钉钉机器URL\", \"消息内容\", \"text|markdown\")\r\nok, err := hltool.SendMessage(dingtalk)\r\nif err != nil {\r\n\tlog.Fatalf(\"发送钉钉通知失败了: %s\", err)\r\n}\r\n\r\n```\r\n[返回到目录](#功能列表)\r\n\r\n### 发送邮件\r\n```go\r\nimport (\r\n\t\"log\"\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\nusername := \"xxxx@xxx.com\"\r\nhost := \"smtp.exmail.qq.com\"\r\npassword := \"password\"\r\nport := 465\r\n\r\nsubject := \"主题\"\r\ncontent := \"内容\"\r\ncontentType := \"text/plain|text/html\"\r\nattach := \"附件路径\" 或者 \"\"\r\nto := []string{\"xxx@xxx.com\", \"xxx@xx.com\"}\r\ncc := []string{\"xxx@xxx.com\", \"xxx@xx.com\"}\r\n\r\nmessage := hltool.NewEmailMessage(username, subject, contentType, content, attach, to, cc)\r\nemail := hltool.NewEmailClient(host, username, password, port, message)\r\nok, err := hltool.SendMessage(email)\r\nif err != nil {\r\n\tlog.Fatalf(\"发送邮件失败了: %s\", err)\r\n}\r\n```\r\n[返回到目录](#功能列表)\r\n\r\n### JWT Token生成解析\r\n```go\r\nimport (\r\n\t\"fmt\"\r\n\t\"log\"\r\n\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\nfunc main() {\r\n\r\n\t// 签名字符串\r\n\tsign := \"fDEtrkpbQbocVxYRLZrnkrXDWJzRZMfO\"\r\n\r\n\ttoken := hltool.NewJWToken(sign)\r\n\r\n\t// -----------  生成jwt token -----------\r\n\ttokenString, err := token.GenJWToken(map[string]interface{}{\r\n\t\t\"name\": \"root\",\r\n\t})\r\n\tif err != nil {\r\n\t\tlog.Fatalf(\"%s\", err)\r\n\t}\r\n\tfmt.Println(tokenString)\r\n\r\n\t// -----------  解析 jwt token -----------\r\n\tr, err := token.ParseJWToken(tokenString)\r\n\tif err != nil {\r\n\t\tlog.Fatalf(\"%s\", err)\r\n\t}\r\n\tfmt.Println(r)\r\n\r\n}\r\n\r\n```\r\n输出\r\n```shell\r\neyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoicm9vdCJ9.NJMXxkzdBBWrNUO5u2oXFLU9FD18TWiXHqxM2msT1x0\r\n\r\nmap[name:root]\r\n```\r\n[返回到目录](#功能列表)\r\n\r\n### Log库\r\n\r\n- 支持按天分割日志\r\n- 不同级别输出到不同文件\r\n- 支持 文本/json日志类型,默认是json类型\r\n- 设置日志最大保留时间\r\n\r\n```go\r\nimport (\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\nfunc main() {\r\n\t\r\n\tcommonFields := map[string]interface{}{\r\n\t\t\"name\": \"zhangsan\",\r\n\t\t\"age\":  \"20\",\r\n\t}\r\n\r\n\thlog, _ := hltool.NewHLog(\"./test.log\")\r\n\t// hlog.SetLevel(\"debug\") debug|info|warn|error|fatal|panic\r\n\tlogger, _ := hlog.GetLogger()\r\n\r\n\t// Info Warn 会输出到不同的文件\r\n\tlogger.Info(commonFields, \"测试Info消息\")\r\n\tlogger.Warn(commonFields, \"测试Warn消息\")\r\n\t\r\n\t// Error Fatal Panic 会输出到一个文件\r\n\tlogger.Error(commonFields, \"测试Error消息\")\r\n\tlogger.Fatal(commonFields, \"测试Fatal消息\")\r\n\tlogger.Panic(commonFields, \"测试Panic消息\")\r\n}\r\n```\r\n日志文件内容:\r\n```shell\r\n{\"age\":\"20\",\"level\":\"debug\",\"msg\":\"测试Debug消息\",\"name\":\"zhangsan\",\"time\":\"2018-02-08 21:28:29\"}\r\n{\"age\":\"20\",\"level\":\"info\",\"msg\":\"测试Info消息\",\"name\":\"zhangsan\",\"time\":\"2018-02-08 21:28:29\"}\r\n{\"age\":\"20\",\"level\":\"warning\",\"msg\":\"测试Warn消息\",\"name\":\"zhangsan\",\"time\":\"2018-02-08 21:28:29\"}\r\n{\"age\":\"20\",\"level\":\"error\",\"msg\":\"测试Error消息\",\"name\":\"zhangsan\",\"time\":\"2018-02-08 21:28:29\"}\r\n```\r\n[返回到目录](#功能列表)\r\n\r\n### BoltDB嵌入式KV数据库\r\n```go\r\nimport (\r\n\t\"log\"\r\n\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\nfunc main() {\r\n\r\n\t// 数据库文件路径 表名\r\n\tdb, err := hltool.NewBoltDB(\"./data/app.db\", \"token\")\r\n\tif err != nil {\r\n\t\tlog.Fatalf(\"%s\", err)\r\n\t}\r\n\tdb.Set(map[string][]byte{\r\n\t\t\"hello\": []byte(\"world\"),\r\n\t\t\"go\":    []byte(\"golang\"),\r\n\t})\r\n\tr, err := db.Get([]string{\"hello\", \"go\"})\r\n\tif err != nil {\r\n\t\tlog.Fatalf(\"%s\", err)\r\n\t}\r\n\tlog.Println(r)\r\n}\r\n```\r\n[返回到目录](#功能列表)\r\n\r\n\r\n### 检测图片类型\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n\t\"fmt\"\r\n\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\nfunc main() {\r\n\r\n\tbytes, _ := hltool.ImageToBytes(\"1.png\")\r\n\tfmt.Println(hltool.ImageType(bytes))\r\n\r\n}\r\n```\r\n输出结果:\r\n\r\n```go\r\nimage/png\r\n```\r\n\r\n[返回到目录](#功能列表)\r\n\r\n### 图片转byte数组\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n\t\"fmt\"\r\n\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\nfunc main() {\r\n\r\n\tbytes, err := hltool.ImageToBytes(\"1.png\")\r\n\tif err != nil {\r\n\t\tfmt.Println(err)\r\n\t}\r\n\r\n}\r\n```\r\n\r\n[返回到目录](#功能列表)\r\n\r\n### byte数组转换为png jpg\r\n```go\r\npackage main\r\n\r\nimport (\r\n\t\"fmt\"\r\n\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\nfunc main() {\r\n\r\n\tbytes, err := hltool.ImageToBytes(\"1.png\")\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\r\n\terr = hltool.BytesToImage(bytes, \"111.png\")\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\r\n}\r\n```\r\n\r\n[返回到目录](#功能列表)\r\n\r\n### json文件转换为byte数组\r\n\r\njson文件内容\r\n```sh\r\n{\r\n    \"Name\": \"张三\",\r\n    \"Age\": 20,\r\n    \"Address\": {\r\n        \"Country\": \"China\",\r\n        \"Province\": \"Shanghai\",\r\n        \"City\": \"Shanghai\"\r\n}\r\n```\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n\t\"fmt\"\r\n\t\"log\"\r\n\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\nfunc main() {\r\n\r\n\t// 读取json文件转换为 []byte\r\n\tb, err := hltool.JSONFileToBytes(\"/Users/helei/Desktop/test.json\")\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n}\r\n\r\n```\r\n\r\n[返回到目录](#功能列表)\r\n\r\n### json byte数组转换为 struct\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n\t\"fmt\"\r\n\t\"log\"\r\n\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\ntype Person struct {\r\n\tName    string `json:\"Name\"`\r\n\tAge     int    `json:\"Age\"`\r\n\tAddress struct {\r\n\t\tCountry  string `json:\"Country\"`\r\n\t\tProvince string `json:\"Province\"`\r\n\t\tCity     string `json:\"City\"`\r\n\t} `json:\"Address\"`\r\n}\r\n\r\nfunc main() {\r\n\r\n\t// 读取json文件转换为 []byte\r\n\tb, err := hltool.JSONFileToBytes(\"/Users/helei/Desktop/test.json\")\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\r\n\t// json []byte转换为 struct\r\n\tp := new(Person)\r\n\terr = hltool.JSONBytesToStruct(b, p)\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\tfmt.Println(p)\r\n}\r\n```\r\n\r\n### struct序列化成二进制文件和反序列化\r\n\r\n二进制文件可以存储到磁盘上，再次利用\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n\t\"fmt\"\r\n\t\"log\"\r\n\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\n// Person 人\r\ntype Person struct {\r\n\tName    string \r\n\tAge     int    \r\n\tAddress struct {\r\n\t\tCountry  string \r\n\t\tProvince string \r\n\t\tCity     string \r\n\t} \r\n}\r\n\r\nfunc main() {\r\n\r\n\tp := \u0026Person{\r\n\t\tName: \"张三\",\r\n\t\tAge:  20,\r\n\t}\r\n\r\n\tp.Address.Country = \"China\"\r\n\tp.Address.Province = \"Shanghai\"\r\n\tp.Address.City = \"Shanghai\"\r\n\r\n\tfmt.Println(\"序列化成二进制文件之前\")\r\n\tfmt.Println(p)\r\n\r\n\t// 序列化成二级制文件，可以存储到磁盘上\r\n\terr := hltool.StructToBinFile(p, \"/tmp/p.bin\")\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\r\n\t// 反序列化\r\n\tp2 := new(Person)\r\n\terr = hltool.BinFileToStruct(\"/tmp/p.bin\", p2)\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\r\n\tfmt.Println(\"从二进制文件中转换之后\")\r\n\tfmt.Println(p2)\r\n\r\n}\r\n\r\n```\r\n\r\n[返回到目录](#功能列表)\r\n\r\n### struct序列化成byte数组和反序列化\r\n\r\nstruct序列化成byte数组，可以存储到数据库中,再次利用\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n\t\"fmt\"\r\n\t\"log\"\r\n\r\n\t\"github.com/chanyipiaomiao/hltool\"\r\n)\r\n\r\n// Person 人\r\ntype Person struct {\r\n\tName    string `json:\"Name\"`\r\n\tAge     int    `json:\"Age\"`\r\n\tAddress struct {\r\n\t\tCountry  string `json:\"Country\"`\r\n\t\tProvince string `json:\"Province\"`\r\n\t\tCity     string `json:\"City\"`\r\n\t} `json:\"Address\"`\r\n}\r\n\r\nfunc main() {\r\n\r\n\tp := \u0026Person{\r\n\t\tName: \"张三\",\r\n\t\tAge:  20,\r\n\t}\r\n\r\n\tp.Address.Country = \"China\"\r\n\tp.Address.Province = \"Shanghai\"\r\n\tp.Address.City = \"Shanghai\"\r\n\r\n\tfmt.Println(\"struct序列化成[]byte\")\r\n\r\n\t// struct序列化成[]byte，可以存储到数据库\r\n\tb, err := hltool.StructToBytes(p)\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\tfmt.Println(p)\r\n\tfmt.Println(b)\r\n\r\n\t// []byte反序列化成struct 和序列化之前的结构体结构必须要一样\r\n\tfmt.Println(\"[]byte反序列化成struct\")\r\n\tp2 := new(Person)\r\n\terr = hltool.BytesToStruct(b, p2)\r\n\tif err != nil {\r\n\t\tlog.Fatalln(err)\r\n\t}\r\n\tfmt.Println(p2)\r\n\r\n}\r\n\r\n```\r\n\r\n[返回到目录](#功能列表)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchanyipiaomiao%2Fhltool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchanyipiaomiao%2Fhltool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchanyipiaomiao%2Fhltool/lists"}