You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
4.0 KiB
203 lines
4.0 KiB
package common |
|
|
|
import ( |
|
"database/sql/driver" |
|
"fmt" |
|
"regexp" |
|
"strconv" |
|
"time" |
|
) |
|
|
|
// TimeFormat time format |
|
var TimeFormat = "2006-01-02 15:04:05" |
|
|
|
//GrayField gray config for each business |
|
type GrayField struct { |
|
Name string |
|
Value string |
|
} |
|
|
|
// Pager . |
|
type Pager struct { |
|
Total int `json:"total" reflect:"ignore"` |
|
Pn int `form:"pn" default:"1" json:"pn" reflect:"ignore"` |
|
Ps int `form:"ps" default:"20" json:"ps" reflect:"ignore"` |
|
} |
|
|
|
// BaseOptions 公共参数 |
|
type BaseOptions struct { |
|
BusinessID int64 `form:"business_id" json:"business_id"` |
|
NetID int64 `form:"net_id" json:"net_id"` |
|
FlowID int64 `form:"flow_id" json:"flow_id"` |
|
UID int64 `form:"uid" json:"uid" submit:"int"` |
|
OID string `form:"oid" json:"oid" submit:"string"` |
|
RID int64 `form:"rid" json:"rid"` |
|
Role int8 `form:"role" json:"role"` |
|
Debug int8 `form:"debug" json:"debug"` |
|
Uname string `form:"uname" json:"uname" submit:"string"` |
|
} |
|
|
|
// FormatTime . |
|
type FormatTime string |
|
|
|
// Scan . |
|
func (f *FormatTime) Scan(src interface{}) (err error) { |
|
switch sc := src.(type) { |
|
case time.Time: |
|
*f = FormatTime(sc.Format("2006-01-02 15:04:05")) |
|
case string: |
|
*f = FormatTime(sc) |
|
} |
|
return |
|
} |
|
|
|
// WaitTime 计算等待时长 |
|
func WaitTime(ctime time.Time) string { |
|
wt := time.Since(ctime) |
|
h := int(wt.Hours()) |
|
m := int(wt.Minutes()) % 60 |
|
s := int(wt.Seconds()) % 60 |
|
return fmt.Sprintf("%.2d:%.2d:%.2d", h, m, s) |
|
} |
|
|
|
//ParseWaitTime 。 |
|
func ParseWaitTime(ut int64) string { |
|
h := ut / 3600 |
|
m := ut % 3600 / 60 |
|
s := ut % 60 |
|
return fmt.Sprintf("%.2d:%.2d:%.2d", h, m, s) |
|
} |
|
|
|
// Group . |
|
type Group struct { |
|
ID int64 `json:"group_id"` |
|
Name string `json:"group_name"` |
|
Note string `json:"group_note"` |
|
Tag string `json:"group_tag"` |
|
FontColor string `json:"font_color"` |
|
BgColor string `json:"bg_color"` |
|
} |
|
|
|
// IntTime . |
|
type IntTime int64 |
|
|
|
// Scan scan time. |
|
func (jt *IntTime) Scan(src interface{}) (err error) { |
|
switch sc := src.(type) { |
|
case time.Time: |
|
*jt = IntTime(sc.Unix()) |
|
case string: |
|
var i int64 |
|
i, err = strconv.ParseInt(sc, 10, 64) |
|
*jt = IntTime(i) |
|
} |
|
return |
|
} |
|
|
|
// Value get time value. |
|
func (jt IntTime) Value() (driver.Value, error) { |
|
return time.Unix(int64(jt), 0), nil |
|
} |
|
|
|
// Time get time. |
|
func (jt IntTime) Time() time.Time { |
|
return time.Unix(int64(jt), 0) |
|
} |
|
|
|
// UnmarshalJSON implement Unmarshaler |
|
func (jt *IntTime) UnmarshalJSON(data []byte) error { |
|
if data == nil || len(data) <= 1 { |
|
*jt = 0 |
|
return nil |
|
} |
|
if data[0] != '"' { |
|
// 1.直接判断数字 |
|
sti, err := strconv.Atoi(string(data)) |
|
if err == nil { |
|
*jt = IntTime(sti) |
|
} |
|
return nil |
|
} |
|
|
|
str := string(data[1 : len(data)-1]) |
|
|
|
// 2.标准格式判断 |
|
st, err := time.ParseInLocation("2006-01-02 15:04:05", str, time.Local) |
|
if err == nil { |
|
*jt = IntTime(st.Unix()) |
|
return nil |
|
} |
|
|
|
*jt = IntTime(0) |
|
|
|
return nil |
|
} |
|
|
|
// FilterName . |
|
func FilterName(s string) (res string) { |
|
exp := "[^a-zA-Z0-9_]+" |
|
reg, err := regexp.Compile(exp) |
|
if err != nil { |
|
res = s |
|
return |
|
} |
|
|
|
res = reg.ReplaceAllString(s, "") |
|
return |
|
} |
|
|
|
// FilterChname . |
|
func FilterChname(s string) (res string) { |
|
exp := "[^0-9_\u4e00-\u9fa5]+" |
|
reg, err := regexp.Compile(exp) |
|
if err != nil { |
|
res = s |
|
return |
|
} |
|
|
|
res = reg.ReplaceAllString(s, "") |
|
return |
|
} |
|
|
|
// FilterBusinessName . |
|
func FilterBusinessName(s string) (res string) { |
|
exp := "[^a-zA-Z\u4e00-\u9fa5]+" |
|
reg, err := regexp.Compile(exp) |
|
if err != nil { |
|
res = s |
|
return |
|
} |
|
|
|
res = reg.ReplaceAllString(s, "") |
|
return |
|
} |
|
|
|
//Unique remove duplicated value from slice |
|
func Unique(ids []int64, gthan0 bool) (res []int64) { |
|
res = []int64{} |
|
mm := map[int64]int64{} |
|
for _, id := range ids { |
|
if mm[id] == id || (gthan0 && id <= 0) { |
|
continue |
|
} |
|
|
|
res = append(res, id) |
|
mm[id] = id |
|
} |
|
return |
|
} |
|
|
|
//CopyMap copy src to dest |
|
func CopyMap(src, dest map[int64][]int64, gthan0 bool) (res map[int64][]int64) { |
|
if dest == nil { |
|
dest = map[int64][]int64{} |
|
} |
|
|
|
for k, v := range src { |
|
dest[k] = append(dest[k], v...) |
|
dest[k] = Unique(dest[k], gthan0) |
|
} |
|
|
|
res = dest |
|
return |
|
}
|
|
|