2024-06-07 11:11:04 +08:00
|
|
|
|
package common
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"crypto/md5"
|
|
|
|
|
"encoding/hex"
|
2025-02-14 10:01:07 +08:00
|
|
|
|
"fmt"
|
|
|
|
|
"net"
|
2024-06-07 11:11:04 +08:00
|
|
|
|
"reflect"
|
|
|
|
|
"strings"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func GetMD5Hash(input string) string {
|
|
|
|
|
hash := md5.Sum([]byte(input))
|
|
|
|
|
return hex.EncodeToString(hash[:])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// toMap 将结构体转换为map[string]interface{}
|
|
|
|
|
// StructToMap 将一个struct转换为map[string]interface{}
|
|
|
|
|
func StructToMap(obj interface{}) map[string]interface{} {
|
|
|
|
|
// 获取obj的类型
|
|
|
|
|
val := reflect.ValueOf(obj)
|
|
|
|
|
if val.Kind() == reflect.Ptr {
|
|
|
|
|
val = val.Elem()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 确保obj是一个struct
|
|
|
|
|
if val.Kind() != reflect.Struct {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 创建一个map来保存结果
|
|
|
|
|
data := make(map[string]interface{})
|
|
|
|
|
|
|
|
|
|
// 遍历struct的字段
|
|
|
|
|
for i := 0; i < val.NumField(); i++ {
|
|
|
|
|
// 获取字段的类型和值
|
|
|
|
|
valueField := val.Field(i)
|
|
|
|
|
typeField := val.Type().Field(i)
|
|
|
|
|
jsonTag := typeField.Tag.Get("json")
|
|
|
|
|
if idx := strings.Index(jsonTag, ","); idx != -1 {
|
|
|
|
|
// 如果有逗号,则取逗号之前的部分
|
|
|
|
|
jsonTag = jsonTag[:idx]
|
|
|
|
|
}
|
|
|
|
|
// 忽略未导出的字段(字段名首字母小写)
|
|
|
|
|
if !typeField.IsExported() {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 将字段名和值添加到map中
|
|
|
|
|
data[jsonTag] = valueField.Interface()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return data
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// mergeMaps 合并任意数量的map
|
|
|
|
|
func MergeMaps(maps ...map[string]interface{}) map[string]interface{} {
|
|
|
|
|
merged := make(map[string]interface{})
|
|
|
|
|
for _, m := range maps {
|
|
|
|
|
for k, v := range m {
|
|
|
|
|
merged[k] = v
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return merged
|
|
|
|
|
}
|
2025-02-14 10:01:07 +08:00
|
|
|
|
|
|
|
|
|
// 判断一个IP地址是否是私有(局域网)IP地址
|
|
|
|
|
func isPrivateIP(ip net.IP) bool {
|
|
|
|
|
privateIPBlocks := []*net.IPNet{
|
|
|
|
|
{IP: net.ParseIP("10.0.0.0"), Mask: net.CIDRMask(8, 32)},
|
|
|
|
|
{IP: net.ParseIP("172.16.0.0"), Mask: net.CIDRMask(12, 32)},
|
|
|
|
|
{IP: net.ParseIP("192.168.0.0"), Mask: net.CIDRMask(16, 32)},
|
|
|
|
|
// 如果需要IPv6私有地址,可以在这里添加
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, block := range privateIPBlocks {
|
|
|
|
|
if block.Contains(ip) {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GetLocalIP() (string, error) {
|
|
|
|
|
interfaces, err := net.Interfaces()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, iface := range interfaces {
|
|
|
|
|
addrs, err := iface.Addrs()
|
|
|
|
|
if err != nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, addr := range addrs {
|
|
|
|
|
var ip net.IP
|
|
|
|
|
|
|
|
|
|
switch v := addr.(type) {
|
|
|
|
|
case *net.IPNet:
|
|
|
|
|
ip = v.IP
|
|
|
|
|
case *net.IPAddr:
|
|
|
|
|
ip = v.IP
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 忽略IPv6地址和回环地址(127.0.0.1)
|
|
|
|
|
if ip.To4() != nil && !ip.IsLoopback() && isPrivateIP(ip) {
|
|
|
|
|
return ip.String(), nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return "", fmt.Errorf("no local IP address found")
|
|
|
|
|
}
|