Files
gfast/library/utils/tools.go
T
2020-09-07 16:49:47 +08:00

180 lines
3.8 KiB
Go

package utils
import (
"fmt"
"github.com/gogf/gf/crypto/gaes"
"github.com/gogf/gf/encoding/gbase64"
"github.com/gogf/gf/encoding/gcharset"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/encoding/gurl"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/text/gstr"
"net"
"time"
)
const AdminCbcPublicKey = "HqmP1KLMuz09Q0Bu"
//字符串加密
func EncryptCBC(plainText, publicKey string) string {
key := []byte(publicKey)
b, e := gaes.EncryptCBC([]byte(plainText), key, key)
if e != nil {
g.Log().Error(e.Error())
return ""
}
return gbase64.EncodeToString(b)
}
//字符串解密
func DecryptCBC(plainText, publicKey string) string {
key := []byte(publicKey)
plainTextByte, e := gbase64.DecodeString(plainText)
if e != nil {
g.Log().Error(e.Error())
return ""
}
b, e := gaes.DecryptCBC(plainTextByte, key, key)
if e != nil {
g.Log().Error(e.Error())
return ""
}
return gbase64.EncodeToString(b)
}
//服务端ip
func GetLocalIP() (ip string, err error) {
addrs, err := net.InterfaceAddrs()
if err != nil {
return
}
for _, addr := range addrs {
ipAddr, ok := addr.(*net.IPNet)
if !ok {
continue
}
if ipAddr.IP.IsLoopback() {
continue
}
if !ipAddr.IP.IsGlobalUnicast() {
continue
}
return ipAddr.IP.String(), nil
}
return
}
//获取客户端IP
func GetClientIp(r *ghttp.Request) string {
ip := r.Header.Get("X-Forwarded-For")
if ip == "" {
ip = r.GetClientIp()
}
return ip
}
//获取相差时间
func GetHourDiffer(startTime, endTime string) int64 {
var hour int64
t1, err := time.ParseInLocation("2006-01-02 15:04:05", startTime, time.Local)
t2, err := time.ParseInLocation("2006-01-02 15:04:05", endTime, time.Local)
if err == nil && t1.Before(t2) {
diff := t2.Unix() - t1.Unix() //
hour = diff / 3600
return hour
} else {
return hour
}
}
//日期字符串转时间戳(秒)
func StrToTimestamp(dateStr string) int64 {
tm, err := gtime.StrToTime(dateStr)
if err != nil {
g.Log().Error(err)
return 0
}
return tm.Timestamp()
}
//时间戳转 yyyy-MM-dd HH:mm:ss
func TimeStampToDateTime(timeStamp int64) string {
tm := gtime.NewFromTimeStamp(timeStamp)
return tm.Format("Y-m-d H:i:s")
}
//时间戳转 yyyy-MM-dd
func TimeStampToDate(timeStamp int64) string {
tm := gtime.NewFromTimeStamp(timeStamp)
return tm.Format("Y-m-d")
}
//获取ip所属城市
func GetCityByIp(ip string) string {
if ip == "" {
return ""
}
if ip == "[::1]" || ip == "127.0.0.1" {
return "内网IP"
}
url := "http://whois.pconline.com.cn/ipJson.jsp?json=true&ip=" + ip
bytes := ghttp.GetBytes(url)
src := string(bytes)
srcCharset := "GBK"
tmp, _ := gcharset.ToUTF8(srcCharset, src)
json, err := gjson.DecodeToJson(tmp)
if err != nil {
return ""
}
if json.GetInt("code") == 0 {
city := json.GetString("city")
return city
} else {
return ""
}
}
//获取附件真实路径
func GetRealFilesUrl(r *ghttp.Request, path string) (realPath string, err error) {
if gstr.ContainsI(path, "http") {
realPath = path
return
}
realPath, err = GetDomain(r)
if err != nil {
return
}
realPath = realPath + path
return
}
//获取当前请求接口域名
func GetDomain(r *ghttp.Request) (string, error) {
pathInfo, err := gurl.ParseURL(r.GetUrl(), -1)
if err != nil {
g.Log().Error(err)
err = gerror.New("解析附件路径失败")
return "", err
}
return fmt.Sprintf("%s://%s:%s/", pathInfo["scheme"], pathInfo["host"], pathInfo["port"]), nil
}
//获取附件相对路径
func GetFilesPath(fileUrl string) (path string, err error) {
if !gstr.ContainsI(fileUrl, "http") {
path = fileUrl
return
}
pathInfo, err := gurl.ParseURL(fileUrl, 32)
if err != nil {
g.Log().Error(err)
err = gerror.New("解析附件路径失败")
return
}
path = gstr.TrimLeft(pathInfo["path"], "/")
return
}