package utils import ( "crypto/hmac" "crypto/sha1" "encoding/hex" "git.qianqiusoft.com/qianqiusoft/go-uuid/uuid" "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys" "git.qianqiusoft.com/qianqiusoft/light-apiengine/logs" "github.com/gin-gonic/gin" "math/rand" "net/url" "os" "regexp" "strings" "time" ) const ( hmac_key = "hmac_key_" ) func NewUUID() string { //return uuid.NewV4().String() return uuid.New() } func GenerateToken(plain string) string { hash := hmac.New(sha1.New, []byte(hmac_key)) hash.Write([]byte(plain)) return hex.EncodeToString(hash.Sum(nil)) } func TotalPage(record, size int) int { tp := record / size if tp < 0 { return 1 } if record%size == 0 { return tp } return tp + 1 } func FormatForBrowse(agent, val string) string { if strings.Contains(strings.ToLower(agent), "safari/") && !strings.Contains(strings.ToLower(agent), "chrome/") { logs.Debug("Safari浏览器编码") } else if strings.Contains(strings.ToLower(agent), "firefox/") { logs.Debug("Firefox浏览器编码") } else if strings.Contains(strings.ToLower(agent), "chrome/") && strings.Contains(strings.ToLower(agent), "safari/") && !strings.Contains(strings.ToLower(agent), "edge/") { logs.Debug("Chrome浏览器编码") } else { logs.Debug("IE浏览器编码") val = url.QueryEscape(val) val = strings.Replace(val, "+", "%20", -1) } return val } func GetHostname(ctx *gin.Context)string{ host := ctx.Request.Host i := strings.Index(host, ":") if i > 0{ host = host[:i] } return host } /** * @brief: 把域名分成列表,最小包括部分顶级域名,例如:www.baidu.com 返回[www.baidu.com, baidu.com] × @param1 hostname: 请求名称 */ func GetHostnames(ctx *gin.Context)[]string{ hostname := GetHostname(ctx) patternstr := `(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}` reg := regexp.MustCompile(patternstr) if res := reg.FindAllString(hostname, -1); res == nil { arr := []string{} parts := strings.Split(hostname, ".") if len(parts) <= 2{ arr = append(arr, hostname) }else{ arr = append(arr, hostname) for i := 0; i < len(parts) - 2; i++ { arr = append(arr, strings.Join(parts[i+1:], ".")) } } return arr } else { // 直接返回ip return []string{hostname} } } // 获取ip func GetIP(c *entitys.CtrlContext)string{ ip := c.Ctx.Request.RemoteAddr end := strings.Index(ip, ":") rs := []rune(ip) ip = string(rs[0:end]) return ip } //RandomStr 随机生成字符串 func RandomStr(length int) string { str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" bytes := []byte(str) result := []byte{} r := rand.New(rand.NewSource(time.Now().UnixNano())) for i := 0; i < length; i++ { result = append(result, bytes[r.Intn(len(bytes))]) } return string(result) } /** * @brief: empty file * @param1 fileName: file name * @param3 bytess: content * @return1: error info */ func AppendFile(fileName string, bytess []byte)error{ if len(bytess) == 0{ return nil } file, err := os.OpenFile(fileName, os.O_CREATE | os.O_WRONLY | os.O_APPEND, os.ModePerm) if err != nil{ return err } defer file.Close() _, err = file.Write(bytess) if err != nil{ return err } return nil }