hltool

package module
v0.0.0-...-18ad403 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 28, 2018 License: MIT Imports: 44 Imported by: 13

README

hltool

Go 开发常用工具库

安装

使用golang官方 dep 管理依赖

go get github.com/chanyipiaomiao/hltool

功能列表

2步验证客户端

模拟Google Authenticator验证器命令行客户端

import (
    "github.com/chanyipiaomiao/hltool"
    "fmt"
)

func main() {
    totp := &hltool.TOTP{
        SecretKey: "xxxxxxxxxxx",
        Algorithm: "SHA1",
        Name: "HeHe",
    }
    n, t, err := hltool.TwoStepAuthGenNumber(totp)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%s %s %d\n", totp.Name, n, t)
}

返回到目录

AES加密解密
package main

import (
	"encoding/base64"
	"fmt"
	"log"

	"github.com/chanyipiaomiao/hltool"
)

func main() {

	// AES 加解密 指定加密的密码
	goaes := hltool.NewGoAES([]byte("O8Hp8WQbFPT7b5AUsEMVLtIU3MVYOrt8"))

	// 加密数据
	encrypt, err := goaes.Encrypt([]byte("123456"))
	if err != nil {
		log.Fatalln(err)
	}

	fmt.Println(base64.StdEncoding.EncodeToString(encrypt))

	// 解密数据
	decrypt, err := goaes.Decrypt(encrypt)
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Println(string(decrypt))

}

返回到目录

RSA加密解密
package main

import (
	"fmt"
	"log"
	"github.com/chanyipiaomiao/hltool"
)
func main() {

	// 生成 2048 位密钥对文件 指定名称
	err := hltool.NewRSAFile("id_rsa.pub", "id_rsa", 2048)
	if err != nil {
		log.Fatalln(err)
	}

	// 生成密钥对字符串
	// pub, pri, err := hltool.NewRSAString(2048)
	// if err != nil {
	// 	log.Fatalln(err)
	// }
	// fmt.Println(pub)
	// fmt.Println(pri)

	// 指定 公钥文件名 和 私钥文件名
	gorsa, err := hltool.NewGoRSA("id_rsa.pub", "id_rsa")
	if err != nil {
		log.Fatalln(err)
	}

	// 明文字符
	rawStr := "O8Hp8WQbFPT7b5AUsEMVLtIU3MVYOrt8"

	// 使用公钥加密
	encrypt, err := gorsa.PublicEncrypt([]byte(rawStr))
	if err != nil {
		log.Fatalln(err)
	}

	// 使用私钥解密
	decrypt, err := gorsa.PrivateDecrypt(encrypt)
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Println(string(decrypt))
}

返回到目录

钉钉机器人通知
import (
	"log"
	"github.com/chanyipiaomiao/hltool"
)

dingtalk := hltool.NewDingTalkClient("钉钉机器URL", "消息内容", "text|markdown")
ok, err := hltool.SendMessage(dingtalk)
if err != nil {
	log.Fatalf("发送钉钉通知失败了: %s", err)
}

返回到目录

发送邮件
import (
	"log"
	"github.com/chanyipiaomiao/hltool"
)

username := "xxxx@xxx.com"
host := "smtp.exmail.qq.com"
password := "password"
port := 465

subject := "主题"
content := "内容"
contentType := "text/plain|text/html"
attach := "附件路径" 或者 ""
to := []string{"xxx@xxx.com", "xxx@xx.com"}
cc := []string{"xxx@xxx.com", "xxx@xx.com"}

message := hltool.NewEmailMessage(username, subject, contentType, content, attach, to, cc)
email := hltool.NewEmailClient(host, username, password, port, message)
ok, err := hltool.SendMessage(email)
if err != nil {
	log.Fatalf("发送邮件失败了: %s", err)
}

返回到目录

JWT Token生成解析
import (
	"fmt"
	"log"

	"github.com/chanyipiaomiao/hltool"
)

func main() {

	// 签名字符串
	sign := "fDEtrkpbQbocVxYRLZrnkrXDWJzRZMfO"

	token := hltool.NewJWToken(sign)

	// -----------  生成jwt token -----------
	tokenString, err := token.GenJWToken(map[string]interface{}{
		"name": "root",
	})
	if err != nil {
		log.Fatalf("%s", err)
	}
	fmt.Println(tokenString)

	// -----------  解析 jwt token -----------
	r, err := token.ParseJWToken(tokenString)
	if err != nil {
		log.Fatalf("%s", err)
	}
	fmt.Println(r)

}

输出

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoicm9vdCJ9.NJMXxkzdBBWrNUO5u2oXFLU9FD18TWiXHqxM2msT1x0

map[name:root]

返回到目录

Log库
  • 支持按天分割日志
  • 不同级别输出到不同文件
  • 支持 文本/json日志类型,默认是json类型
  • 设置日志最大保留时间
import (
	"github.com/chanyipiaomiao/hltool"
)

func main() {
	
	commonFields := map[string]interface{}{
		"name": "zhangsan",
		"age":  "20",
	}

	hlog, _ := hltool.NewHLog("./test.log")
	// hlog.SetLevel("debug") debug|info|warn|error|fatal|panic
	logger, _ := hlog.GetLogger()

	// Info Warn 会输出到不同的文件
	logger.Info(commonFields, "测试Info消息")
	logger.Warn(commonFields, "测试Warn消息")
	
	// Error Fatal Panic 会输出到一个文件
	logger.Error(commonFields, "测试Error消息")
	logger.Fatal(commonFields, "测试Fatal消息")
	logger.Panic(commonFields, "测试Panic消息")
}

日志文件内容:

{"age":"20","level":"debug","msg":"测试Debug消息","name":"zhangsan","time":"2018-02-08 21:28:29"}
{"age":"20","level":"info","msg":"测试Info消息","name":"zhangsan","time":"2018-02-08 21:28:29"}
{"age":"20","level":"warning","msg":"测试Warn消息","name":"zhangsan","time":"2018-02-08 21:28:29"}
{"age":"20","level":"error","msg":"测试Error消息","name":"zhangsan","time":"2018-02-08 21:28:29"}

返回到目录

BoltDB嵌入式KV数据库
import (
	"log"

	"github.com/chanyipiaomiao/hltool"
)

func main() {

	// 数据库文件路径 表名
	db, err := hltool.NewBoltDB("./data/app.db", "token")
	if err != nil {
		log.Fatalf("%s", err)
	}
	db.Set(map[string][]byte{
		"hello": []byte("world"),
		"go":    []byte("golang"),
	})
	r, err := db.Get([]string{"hello", "go"})
	if err != nil {
		log.Fatalf("%s", err)
	}
	log.Println(r)
}

返回到目录

检测图片类型
package main

import (
	"fmt"

	"github.com/chanyipiaomiao/hltool"
)

func main() {

	bytes, _ := hltool.ImageToBytes("1.png")
	fmt.Println(hltool.ImageType(bytes))

}

输出结果:

image/png

返回到目录

图片转byte数组
package main

import (
	"fmt"

	"github.com/chanyipiaomiao/hltool"
)

func main() {

	bytes, err := hltool.ImageToBytes("1.png")
	if err != nil {
		fmt.Println(err)
	}

}

返回到目录

byte数组转换为png jpg
package main

import (
	"fmt"

	"github.com/chanyipiaomiao/hltool"
)

func main() {

	bytes, err := hltool.ImageToBytes("1.png")
	if err != nil {
		log.Fatalln(err)
	}

	err = hltool.BytesToImage(bytes, "111.png")
	if err != nil {
		log.Fatalln(err)
	}

}

返回到目录

json文件转换为byte数组

json文件内容

{
    "Name": "张三",
    "Age": 20,
    "Address": {
        "Country": "China",
        "Province": "Shanghai",
        "City": "Shanghai"
}
package main

import (
	"fmt"
	"log"

	"github.com/chanyipiaomiao/hltool"
)

func main() {

	// 读取json文件转换为 []byte
	b, err := hltool.JSONFileToBytes("/Users/helei/Desktop/test.json")
	if err != nil {
		log.Fatalln(err)
	}
}

返回到目录

json byte数组转换为 struct
package main

import (
	"fmt"
	"log"

	"github.com/chanyipiaomiao/hltool"
)

type Person struct {
	Name    string `json:"Name"`
	Age     int    `json:"Age"`
	Address struct {
		Country  string `json:"Country"`
		Province string `json:"Province"`
		City     string `json:"City"`
	} `json:"Address"`
}

func main() {

	// 读取json文件转换为 []byte
	b, err := hltool.JSONFileToBytes("/Users/helei/Desktop/test.json")
	if err != nil {
		log.Fatalln(err)
	}

	// json []byte转换为 struct
	p := new(Person)
	err = hltool.JSONBytesToStruct(b, p)
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Println(p)
}
struct序列化成二进制文件和反序列化

二进制文件可以存储到磁盘上,再次利用

package main

import (
	"fmt"
	"log"

	"github.com/chanyipiaomiao/hltool"
)

// Person 人
type Person struct {
	Name    string 
	Age     int    
	Address struct {
		Country  string 
		Province string 
		City     string 
	} 
}

func main() {

	p := &Person{
		Name: "张三",
		Age:  20,
	}

	p.Address.Country = "China"
	p.Address.Province = "Shanghai"
	p.Address.City = "Shanghai"

	fmt.Println("序列化成二进制文件之前")
	fmt.Println(p)

	// 序列化成二级制文件,可以存储到磁盘上
	err := hltool.StructToBinFile(p, "/tmp/p.bin")
	if err != nil {
		log.Fatalln(err)
	}

	// 反序列化
	p2 := new(Person)
	err = hltool.BinFileToStruct("/tmp/p.bin", p2)
	if err != nil {
		log.Fatalln(err)
	}

	fmt.Println("从二进制文件中转换之后")
	fmt.Println(p2)

}

返回到目录

struct序列化成byte数组和反序列化

struct序列化成byte数组,可以存储到数据库中,再次利用

package main

import (
	"fmt"
	"log"

	"github.com/chanyipiaomiao/hltool"
)

// Person 人
type Person struct {
	Name    string `json:"Name"`
	Age     int    `json:"Age"`
	Address struct {
		Country  string `json:"Country"`
		Province string `json:"Province"`
		City     string `json:"City"`
	} `json:"Address"`
}

func main() {

	p := &Person{
		Name: "张三",
		Age:  20,
	}

	p.Address.Country = "China"
	p.Address.Province = "Shanghai"
	p.Address.City = "Shanghai"

	fmt.Println("struct序列化成[]byte")

	// struct序列化成[]byte,可以存储到数据库
	b, err := hltool.StructToBytes(p)
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Println(p)
	fmt.Println(b)

	// []byte反序列化成struct 和序列化之前的结构体结构必须要一样
	fmt.Println("[]byte反序列化成struct")
	p2 := new(Person)
	err = hltool.BytesToStruct(b, p2)
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Println(p2)

}

返回到目录

Documentation

Index

Constants

View Source
const (
	// Oneday 一天
	Oneday = 24 * time.Hour
)
View Source
const (

	// RSAAlgorithmSign RSA签名算法
	RSAAlgorithmSign = crypto.SHA256
)

Variables

This section is empty.

Functions

func BinFileToStruct

func BinFileToStruct(filepath string, to interface{}) error

BinFileToStruct 二级制文件反序列化为结构体,结构体必须要和转换前的结构一致 filepath 二进制文件路径 to 结构体对象 结构必须和序列化前的一样

func BytesToFile

func BytesToFile(data []byte, filepath string) error

BytesToFile 字节数组写入到文件

func BytesToImage

func BytesToImage(imgbytes []byte, filepath string) error

BytesToImage []byte生成图片 imgbytes 图片[]byte数组 filepath 文件路径名称

func BytesToStruct

func BytesToStruct(data []byte, to interface{}) error

BytesToStruct []byte转换为结构体,必须事先知道结构体的结构,而且必须一样 data 转换后的字节数组 to 结构体对象 结构必须和序列化前的一样

func CryptPassword

func CryptPassword(password, salt string) string

CryptPassword 加密密码

func CurrentDir

func CurrentDir() string

CurrentDir 获取当前路径

func CurrentUser

func CurrentUser() string

CurrentUser 获取当前SSH连接的用户

func GenRandomString

func GenRandomString(length int, specialChar string) string

GenRandomString 生成随机字符串 length 生成长度 specialChar 是否生成特殊字符

func GetMD5

func GetMD5(text string) string

GetMD5 生成32位MD5

func GetNowTime

func GetNowTime() string

GetNowTime 获取当前时间

func GetNowTime2

func GetNowTime2() string

GetNowTime2 获取当前时间

func GetNowTimeStamp

func GetNowTimeStamp() int64

GetNowTimeStamp 获取当前的时间戳

func ImageToBytes

func ImageToBytes(filepath string) ([]byte, error)

ImageToBytes 图片转换为字节数组 filepath 图片的路径

func ImageType

func ImageType(imgbytes []byte) string

ImageType 探测图片的类型 imgbytes 图片字节数组

func InStringSlice

func InStringSlice(s []string, x string) (bool, int)

InStringSlice 元素是否在一个string类型的slice里面

func IsExist

func IsExist(name string) bool

IsExist 文件或目录是否存在 return false 表示文件不存在

func IsNumber

func IsNumber(input string) bool

IsNumber 检查输入的字符串是否匹配数字

func JSONBytesToFile

func JSONBytesToFile(data []byte, filepath string) error

JSONBytesToFile json []byte 写入文件

func JSONBytesToStruct

func JSONBytesToStruct(data []byte, structObj interface{}) error

JSONBytesToStruct json []byte 转换为 struct

func JSONFileToBytes

func JSONFileToBytes(filepath string) ([]byte, error)

JSONFileToBytes 从json文件中转换为[]byte

func MarshalPKCS8PrivateKey

func MarshalPKCS8PrivateKey(key *rsa.PrivateKey) []byte

MarshalPKCS8PrivateKey 私钥解析

func NewRSAFile

func NewRSAFile(pubKeyFilename, priKeyFilename string, keyLength int) error

NewRSAFile 生成密钥对文件 pubKeyFilename: 公钥文件名 priKeyFilename: 私钥文件名 kekeyLength: 密钥长度

func NewRSAString

func NewRSAString(keyLength int) (string, string, error)

NewRSAString 生成密钥对字符串 keyLength 密钥的长度

func QRCodeParse

func QRCodeParse(fi io.Reader) (string, error)

QRCodeParse 二维码图片解析

func ReadRSAKeyPair

func ReadRSAKeyPair(pubKeyFilename, priKeyFilename string) ([]byte, []byte, error)

ReadRSAKeyPair 读取RSA密钥对 pubKeyFilename: 公钥文件名称 priKeyFilename: 私钥文件名

func SendMessage

func SendMessage(notice Notice) (bool, error)

SendMessage 发送消息

func StructToBinFile

func StructToBinFile(structObj interface{}, filepath string) error

StructToBinFile 结构体序列化成二级制文件 structObj 结构体对象 filepath 文件路径

func StructToBytes

func StructToBytes(structObj interface{}) ([]byte, error)

StructToBytes 结构体转换为[]byte structObj 结构体对象

func TwoStepAuthGenNumber

func TwoStepAuthGenNumber(t *TOTP) (string, int64, error)

TwoStepAuthGenNumber 根据提供的 secret 来生成6位数字 返回 6位数字、剩余时间

func UserHome

func UserHome() (string, error)

UserHome 获取用户的家目录

func WriteRSAKeyPair

func WriteRSAKeyPair(publicKeyWriter, privateKeyWriter io.Writer, keyLength int) error

WriteRSAKeyPair 生成RSA密钥对

Types

type BoltDB

type BoltDB struct {
	DBPath    string // 数据库路径名称
	TableName string // 表名
}

BoltDB DB操作

func NewBoltDB

func NewBoltDB(dbPath, tableName string) (*BoltDB, error)

NewBoltDB 初始化数据库对象

func (*BoltDB) Backup

func (btb *BoltDB) Backup(filepath string) error

Backup 备份数据库文件

func (*BoltDB) Delete

func (btb *BoltDB) Delete(keys []string) error

Delete 删除键值

func (*BoltDB) Get

func (btb *BoltDB) Get(keys []string) (map[string][]byte, error)

Get 根据键名数组获取各自的值 keys 键名数组

func (*BoltDB) GetAll

func (btb *BoltDB) GetAll() (map[string][]byte, error)

GetAll 获取全部

func (*BoltDB) Set

func (btb *BoltDB) Set(kv map[string][]byte) error

Set 设置值 kv 键值对

type DingTalkClient

type DingTalkClient struct {
	RobotURL string
	Message  *DingTalkMessage
}

DingTalkClient 通过钉钉机器人发送消息

func (*DingTalkClient) SendMessage

func (d *DingTalkClient) SendMessage() (bool, error)

SendMessage 通过钉钉机器人发送消息

type DingTalkMessage

type DingTalkMessage struct {
	Message string //消息
	Title   string // markdown标题
	Type    string // 消息类型
}

DingTalkMessage 消息

type EmailClient

type EmailClient struct {
	Host     string
	Port     int
	Username string
	Password string
	Message  *EmailMessage
}

EmailClient 发送客户端

func NewEmailClient

func NewEmailClient(host, username, password string, port int, message *EmailMessage) *EmailClient

NewEmailClient 返回一个邮件客户端 host smtp地址 username 用户名 password 密码 port 端口

func (*EmailClient) SendMessage

func (c *EmailClient) SendMessage() (bool, error)

SendMessage 发送邮件

type EmailMessage

type EmailMessage struct {
	From        string
	To          []string
	Cc          []string
	Subject     string
	ContentType string
	Content     string
	Attach      string
}

EmailMessage 内容

func NewEmailMessage

func NewEmailMessage(from, subject, contentType, content, attach string, to, cc []string) *EmailMessage

NewEmailMessage 返回消息对象 from: 发件人 subject: 标题 contentType: 内容的类型 text/plain text/html attach: 附件 to: 收件人 cc: 抄送人

type GoAES

type GoAES struct {
	Key []byte
}

GoAES 加密

func NewGoAES

func NewGoAES(key []byte) *GoAES

NewGoAES 返回GoAES

func (*GoAES) Decrypt

func (a *GoAES) Decrypt(crypted []byte) ([]byte, error)

Decrypt 解密数据

func (*GoAES) Encrypt

func (a *GoAES) Encrypt(origData []byte) ([]byte, error)

Encrypt 加密数据

type GoRSA

type GoRSA struct {
	PublicKey  *rsa.PublicKey
	PrivateKey *rsa.PrivateKey
}

GoRSA RSA加密解密

func NewGoRSA

func NewGoRSA(pubKeyFilename, priKeyFilename string) (*GoRSA, error)

NewGoRSA 初始化 GoRSA对象

func (*GoRSA) PrivateDecrypt

func (r *GoRSA) PrivateDecrypt(encrypted []byte) ([]byte, error)

PrivateDecrypt 私钥解密

func (*GoRSA) PublicEncrypt

func (r *GoRSA) PublicEncrypt(data []byte) ([]byte, error)

PublicEncrypt 公钥加密

func (*GoRSA) Sign

func (r *GoRSA) Sign(data string) (string, error)

Sign 数据进行签名

func (*GoRSA) Verify

func (r *GoRSA) Verify(data string, sign string) error

Verify 数据验证签名

type HLog

type HLog struct {

	// log 路径
	LogPath string

	// 日志类型  json|text 默认: json
	LogType string

	// 文件名的日期格式 默认: %Y-%m-%d|%Y%m%d
	FileNameDateFormat string

	// 日志中日期时间格式 默认: 2006-01-02 15:04:05
	TimestampFormat string

	// 是否分离不同级别的日志 默认: true
	IsSeparateLevelLog bool

	// 日志级别 默认: log.InfoLevel
	LogLevel log.Level

	// 日志最长保存多久 默认: 15天
	MaxAge time.Duration

	// 日志默认多长时间轮转一次 默认: 24小时
	RotationTime time.Duration
}

HLog 定义

func NewHLog

func NewHLog(logpath string) (*HLog, error)

NewHLog 返回HLog对象 和 error 目录创建失败

func (*HLog) GetLogger

func (hl *HLog) GetLogger() (*HLogger, error)

GetLogger getlogger

func (*HLog) SetDateFormat

func (hl *HLog) SetDateFormat(format string)

SetDateFormat 设置日期格式 format "%Y-%m-%d" | "%Y%m%d"

func (*HLog) SetLevel

func (hl *HLog) SetLevel(level string)

SetLevel 设置log level debug|info|warn|error|fatal|panic

func (*HLog) SetLogType

func (hl *HLog) SetLogType(logType string)

SetLogType 设置日志格式 json|text

func (*HLog) SetMaxAge

func (hl *HLog) SetMaxAge(day time.Duration)

SetMaxAge 设置最大保留时间 单位: 天

func (*HLog) SetRotationTime

func (hl *HLog) SetRotationTime(day time.Duration)

SetRotationTime 设置日志多久轮转一次 单位: 天

func (*HLog) SetSeparateLevelLog

func (hl *HLog) SetSeparateLevelLog(yes bool)

SetSeparateLevelLog 设置是否分离不同级别的日志到不同的文件

type HLogger

type HLogger struct{}

HLogger hlogger

func (*HLogger) Debug

func (logger *HLogger) Debug(commonFields map[string]interface{}, message string)

Debug Debug日志

func (*HLogger) Error

func (logger *HLogger) Error(commonFields map[string]interface{}, message string)

Error Error日志

func (*HLogger) Fatal

func (logger *HLogger) Fatal(commonFields map[string]interface{}, message string)

Fatal Fatal日志

func (*HLogger) Info

func (logger *HLogger) Info(commonFields map[string]interface{}, message string)

Info Info日志

func (*HLogger) Panic

func (logger *HLogger) Panic(commonFields map[string]interface{}, message string)

Panic Panic日志

func (*HLogger) Warn

func (logger *HLogger) Warn(commonFields map[string]interface{}, message string)

Warn Warn日志

type JWToken

type JWToken struct {
	SignString string
}

JWToken jwt token

func NewJWToken

func NewJWToken(signString string) *JWToken

NewJWToken 创建JWToken对象

func (*JWToken) GenJWToken

func (t *JWToken) GenJWToken(rawContent map[string]interface{}) (string, error)

GenJWToken 生成一个jwt token

func (*JWToken) ParseJWToken

func (t *JWToken) ParseJWToken(tokenString string) (map[string]interface{}, error)

ParseJWToken 解析 JWToken

type Notice

type Notice interface {
	SendMessage() (bool, error)
}

Notice 通知接口

type TOTP

type TOTP struct {
	SecretKey string // secret
	Algorithm string // 加密算法
	Issuer    string // 发行者
	Name      string // 名称
	Digits    int    // 位数
}

func TwoStepAuthParseQRCode

func TwoStepAuthParseQRCode(qrcodePath string) (*TOTP, error)

TwoStepAuthGenByQRCode 解析二维码图片

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL