123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- package utils
-
- import (
- "crypto/sha1"
- "encoding/base64"
- "errors"
- "fmt"
- "io"
- "math/rand"
- "regexp"
- "sort"
- "strconv"
- "strings"
- "time"
-
- "crypto/md5"
- "encoding/hex"
-
- "github.com/astaxie/beego"
- )
-
- func TimeSub(t1, t2 time.Time) int {
- t1 = time.Date(t1.Year(), t1.Month(), t1.Day(), 0, 0, 0, 0, time.Local)
- t2 = time.Date(t2.Year(), t2.Month(), t2.Day(), 0, 0, 0, 0, time.Local)
-
- return int(t1.Sub(t2).Hours() / 24)
- }
-
- func MarkBackUrl(backUrl, defaultUrl string) string {
- if len(backUrl) == 0 {
- backUrl = defaultUrl
- } else {
- backURLByte, err := base64.URLEncoding.DecodeString(backUrl)
- if err != nil {
- backUrl = backUrl
- } else {
- backUrl = string(backURLByte)
- }
- }
- return backUrl
- }
-
- func CheckMobile(mobile string) (match bool) {
- //过滤手机
- match, _ = regexp.MatchString("^1([2358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$", mobile)
- return
- }
-
- func CheckPhone(phone string) (match bool) {
- reg, _ := regexp.MatchString("^0[0-9]{2,3}-?[0-9]{7,8}$", phone)
- return reg
- }
-
- func CheckHexColor(color string) (match bool) {
- reg, _ := regexp.MatchString("^#([0-9a-fA-F]{6})$", color)
- return reg
- }
-
- func RandCode(min, max int64) string {
- if min >= max || min == 0 || max == 0 {
- return strconv.FormatInt(max, 10)
- }
- rand.Seed(time.Now().UnixNano())
- randNum := rand.Int63n(max-min) + min
- return strconv.FormatInt(randNum, 10)
- }
-
- func TimeAgo(timeUnix int64) string {
- timeUnixS := time.Unix(timeUnix, 0)
- timeNow := time.Now()
- timeSub := timeNow.Sub(timeUnixS)
-
- if timeSub < time.Minute*1 {
- return "刚刚"
- } else if timeSub < time.Hour*1 {
- return strconv.Itoa(int(timeSub.Minutes())) + "分钟前"
- } else if timeSub < time.Hour*24 {
- return strconv.Itoa(int(timeSub.Hours())) + "小时前"
- } else if timeSub < time.Hour*24*7 {
- return strconv.Itoa(int(timeSub.Hours()/24)) + "天前"
- } else {
- return timeUnixS.Format("2006-01-02 15:04")
- }
- return ""
- }
-
- //Signature sha1签名
- func Signature(params ...string) string {
- sort.Strings(params)
- h := sha1.New()
- for _, s := range params {
- io.WriteString(h, s)
- }
- return fmt.Sprintf("%x", h.Sum(nil))
- }
-
- //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)
- }
-
- //GetCurrTs return current timestamps
- func GetCurrTs() int64 {
- return time.Now().Unix()
- }
-
- func SetThisRequestURI(uri string) string {
- return fmt.Sprintf("%v%v", beego.AppConfig.String("httpdomain"), uri)
- }
-
- func SetThisBasr64RequestURI(uri string) string {
- backUrl := fmt.Sprintf("%v%v", beego.AppConfig.String("httpdomain"), uri)
- backUrl = base64.URLEncoding.EncodeToString([]byte(backUrl))
-
- return backUrl
- }
-
- func TransNum2Str(read int64) (transRead string) {
- if read < 0 {
- transRead = "0"
- } else if read < 10000 {
- transRead = fmt.Sprintf("%v", read)
- } else {
- var c float64 = 10000
- var rc float64 = float64(read)
- transRead = fmt.Sprintf("%.2f万", rc/c)
- }
-
- return
- }
-
- func GenMobileToken(mobile string) (token string) {
- st := strings.Split(mobile, "")
-
- s := fmt.Sprintf("%s%v%v%v%v%v%v", mobile, st[0], st[1], st[3], st[7], st[6], st[9])
-
- h := sha1.New()
- h.Write([]byte(s))
- bs := h.Sum(nil)
-
- token = fmt.Sprintf("%x", bs)
-
- return
- }
-
- func CheckMobileToken(mobile, token string) bool {
- o := GenMobileToken(mobile)
- if token == o {
- return true
- }
-
- return false
- }
-
- type jSapiConfig struct {
- AppID string `json:"app_id"`
- Timestamp int64 `json:"timestamp"`
- NonceStr string `json:"nonce_str"`
- Signature string `json:"signature"`
- }
-
- //GetAJTConfig jsapi_ticket config
- func GetAJTConfig(jsapiTicket, uri string) (jSapiConfig, error) {
- var config jSapiConfig
- nonceStr := RandomStr(16)
- timestamp := GetCurrTs()
- str := fmt.Sprintf("jsapi_ticket=%s&noncestr=%s×tamp=%d&url=%s", jsapiTicket, nonceStr, timestamp, uri)
- sigStr := Signature(str)
-
- config.AppID = beego.AppConfig.String("wxappId")
- config.NonceStr = nonceStr
- config.Timestamp = timestamp
- config.Signature = sigStr
- return config, nil
- }
-
- func TrimHtml(src string) string {
- //将HTML标签全转换成小写
- re, _ := regexp.Compile("\\<[\\S\\s]+?\\>")
- src = re.ReplaceAllStringFunc(src, strings.ToLower)
- //去除STYLE
- re, _ = regexp.Compile("\\<style[\\S\\s]+?\\</style\\>")
- src = re.ReplaceAllString(src, "")
- //去除SCRIPT
- re, _ = regexp.Compile("\\<script[\\S\\s]+?\\</script\\>")
- src = re.ReplaceAllString(src, "")
- //去除所有尖括号内的HTML代码,并换成换行符
- re, _ = regexp.Compile("\\<[\\S\\s]+?\\>")
- src = re.ReplaceAllString(src, "\n")
- //去除连续的换行符
- re, _ = regexp.Compile("\\s{2,}")
- src = re.ReplaceAllString(src, "\n")
- return strings.TrimSpace(src)
- }
-
- func SubString(str string, begin, length int) string {
- rs := []rune(str)
- lth := len(rs)
- if begin < 0 {
- begin = 0
- }
- if begin >= lth {
- begin = lth
- }
- end := begin + length
-
- if end > lth {
- end = lth
- }
- return string(rs[begin:end])
- }
-
- func ParseTimeStringToTime(layout string, timeStr string) (*time.Time, error) {
- if len(layout) == 0 || len(timeStr) == 0 {
- return nil, errors.New("layout 或 日期字符串 为空,无法解析")
- }
- loc, _ := time.LoadLocation("Local")
- date, parseDateErr := time.ParseInLocation(layout, timeStr, loc)
- return &date, parseDateErr
- }
-
- // 获取 date 所在周的周一和周日,以周一0点为一周的开始,周日24点为一周的结束
- func GetMondayAndSundayOfWeekDate(date *time.Time) (time.Time, time.Time) {
- if date == nil {
- now := time.Now()
- date = &now
- }
- weekday := int(date.Weekday())
- if weekday == 0 {
- weekday = 7
- }
- loc, _ := time.LoadLocation("Local")
- monday, _ := time.ParseInLocation("2006-01-02 15:04:05", date.AddDate(0, 0, 1-weekday).Format("2006-01-02")+" 00:00:00", loc)
- sunday, _ := time.ParseInLocation("2006-01-02 15:04:05", date.AddDate(0, 0, 7-weekday).Format("2006-01-02")+" 23:59:59", loc)
- return monday, sunday
- }
-
- func GetOrgIdCode(orgID int64, timestamps int64) (int64, string) {
- if timestamps == 0 {
- timestamps = time.Now().Unix()
- }
-
- key := "47&hsq5wjfHXy%m&"
- stringA := fmt.Sprintf("org_id=%d&time=%d&key=%s", orgID, timestamps, key)
-
- md5 := md5.New()
- md5.Write([]byte(stringA))
- md5Data := md5.Sum([]byte(nil))
- md5A := hex.EncodeToString(md5Data)
- return timestamps, md5A
- }
|