package utils import ( "encoding/base64" "math/rand" "net/http" "os" "path/filepath" "runtime" "strconv" "strings" "time" ) // 客户端类型 const ( ClientAdmin = "client-admin" ClientWechat = "client-wechat" ClientMini = "client-mini" ) // 一些 UA 列表 const ( UAWechat = "micromessenger" UAMiniProgram = "miniprogram" ) // GetClientType 获取客户端类型 // 默认返回是 管理端 func GetClientType(r *http.Request) string { ua := strings.ToLower(r.Header.Get("User-Agent")) if strings.Index(ua, UAWechat) > -1 { // if strings.Index(ua, UAMiniProgram) > -1 { // return ClientMini // } return ClientWechat } return ClientAdmin } // StrSliceIndexOf slice indexof func StrSliceIndexOf(s []string, t string) int64 { if s == nil || len(s) == 0 { return -1 } for k, v := range s { if v == t { return int64(k) } } return -1 } // GUIID2IntString guid 转 int 字符串 func GUIID2IntString(id string) []string { if id == "" { return nil } res := make([]string, 0) for _, part := range strings.Split(id, "-") { sum := 0 for _, r := range []rune(part) { sum += int(r) } res = append(res, strconv.Itoa(sum)) } return res } // EncodeBase64TrimTail base64 加密, 去除末尾 = func EncodeBase64TrimTail(src string) string { if src == "" { return "" } enStr := base64.StdEncoding.EncodeToString([]byte(src)) return strings.TrimRight(enStr, "=") } // DecodeBase64NoTail base64解密, 位数不够的, 自动补全 func DecodeBase64NoTail(src string) string { if src == "" { return "" } pd := 4 - len(src)%4 if pd > 0 && pd != 4 { src += strings.Repeat("=", pd) } res, err := base64.StdEncoding.DecodeString(src) if err != nil { LogError("解密 Base64 字串失败: " + err.Error()) return "" } return string(res) } // GetPageNaviLimit 获取 mysql limit 限定 func GetPageNaviLimit(params ...int) []int { page := 1 pagesize := 10 if params != nil { pl := len(params) if pl > 0 { page = params[0] if page < 1 { page = 1 } } if pl > 1 { pagesize = params[1] } } return []int{ pagesize, (page - 1) * pagesize, } } // GenerateQRCode 生成二维码数字 func GenerateQRCode() string { var temp1 int = rand.Intn(9)*87 + 11 var temp2 int = rand.Intn(9)*89 + 13 nano := time.Now().UnixNano() var nanostr string = strconv.FormatInt(nano, 10) var temp3 string = nanostr[11:] var temp4 string = "6" var temp5 int = rand.Intn(9)*7 + 17 var code string = "66" + strconv.Itoa(temp1) + temp4 + strconv.Itoa(temp2) + temp3 + strconv.Itoa(temp5) return code } // GetFiveSeconds 获取 5 秒钟的时间 func GetFiveSeconds(t time.Time) string { str := t.Format("20060102150405") strLen := len(str) lastNum, _ := strconv.Atoi(str[strLen-1:]) if lastNum < 5 { lastNum = 0 } else { lastNum = 5 } return str[:strLen-1] + strconv.Itoa(lastNum) } // 当前运行环境 var processEnv string var appRoot string // GetAppRoot 获取系统根目录 func GetAppRoot() string { if appRoot != "" { return appRoot } if processEnv == "" { for _, arg := range os.Args { if strings.Index(arg, "-test.run") > -1 { processEnv = "test" break } } if processEnv == "" { processEnv = "production" } } if processEnv == "test" { _, file, _, _ := runtime.Caller(1) appRoot, _ = filepath.Abs(filepath.Dir(filepath.Join(file, ".."+string(filepath.Separator)))) } else { appRoot, _ = filepath.Abs(filepath.Dir(os.Args[0])) } return appRoot }