1 Star 1 Fork 0

ytsunlei/utils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
tools.go 8.64 KB
一键复制 编辑 原始数据 按行查看 历史
lei05.sun 提交于 2018-11-01 10:03 . 修改包结构
package utils
import (
"crypto/hmac"
"crypto/md5"
"crypto/sha1"
"encoding/base64"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"io"
"net"
"reflect"
"regexp"
"strconv"
"strings"
"net/url"
"time"
"utils/code.google.com/p/mahonia"
"utils/httplib"
)
/**
* 校验手机号
*/
func CheckMobilePhoneValid(phone string) bool {
reg := `^1([38][0-9]|14[57]|5[^4])\d{8}$`
rgx := regexp.MustCompile(reg)
return rgx.MatchString(phone)
}
/**
* 校验邮箱
*/
func IsEmail(str ...string) bool {
var b bool
for _, s := range str {
b, _ = regexp.MatchString("^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$", s)
if false == b {
return b
}
}
return b
}
/**
utf8转换为 gbk
**/
func ConvertUTF2GBK(utf string) (gbk string) {
gbk_enc := mahonia.NewEncoder("GBK")
return gbk_enc.ConvertString(utf)
}
/**
gbk转换为 utf8
**/
func ConvertGBK2UTF(gbk string) (utf string) {
enc := mahonia.NewDecoder("GBK")
return enc.ConvertString(gbk)
}
func MD5(data string) string {
m := md5.New()
io.WriteString(m, data)
return hex.EncodeToString(m.Sum(nil))
}
func SHA1(data string) string {
//产生一个散列值得方式是 sha1.New(),sha1.Write(bytes),然后 sha1.Sum([]byte{})。这里我们从一个新的散列开始。
h := sha1.New()
//写入要处理的字节。如果是一个字符串,需要使用[]byte(s) 来强制转换成字节数组。
h.Write([]byte(data))
//这个用来得到最终的散列值的字符切片。Sum 的参数可以用来都现有的字符切片追加额外的字节切片:一般不需要要。
return hex.EncodeToString(h.Sum(nil))
}
func HMAC_SHA1(data, KEY string) string {
//产生一个散列值得方式是 sha1.New(),sha1.Write(bytes),然后 sha1.Sum([]byte{})。这里我们从一个新的散列开始。
//h := sha1.New()
////写入要处理的字节。如果是一个字符串,需要使用[]byte(s) 来强制转换成字节数组。
//h.Write([]byte(data))
//这个用来得到最终的散列值的字符切片。Sum 的参数可以用来都现有的字符切片追加额外的字节切片:一般不需要要。
//hmac ,use sha1
key := []byte(KEY)
mac := hmac.New(sha1.New, key)
mac.Write([]byte(data))
return base64.StdEncoding.EncodeToString(mac.Sum(nil))
}
/**
把json 的struct 转换为 map
*/
func JsonToMap(a interface{}) map[string]interface{} {
t := reflect.TypeOf(a)
v := reflect.ValueOf(a)
var data = make(map[string]interface{})
for i := 0; i < t.NumField(); i++ {
key := t.Field(i).Name
value := v.Field(i).Interface()
tag := t.Field(i).Tag.Get("json")
if tag != "" {
if strings.Contains(tag, ",") {
ps := strings.Split(tag, ",")
key = ps[0]
} else {
key = tag
}
}
data[key] = value
}
return data
}
func GetLocalIp() string {
if addrs, err := net.InterfaceAddrs(); err != nil {
return "127.0.0.1"
} else {
for _, a := range addrs {
if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
return ipnet.IP.String()
}
}
}
}
return "127.0.0.1"
}
func ConvertYTOF(yuan string) (fen string, err error) {
if err = CheckPriceFormat(yuan); err != nil {
return "", err
}
if f_yuan, err := strconv.ParseFloat(yuan, 32); err != nil {
return "", err
} else {
return fmt.Sprintf("%.f", f_yuan*100), nil
}
}
func ConvertFTOY(fen string) (yuan string, err error) {
if f_fen, err := strconv.ParseFloat(fen, 32); err != nil {
return "", err
} else {
return fmt.Sprintf("%.02f", f_fen/100), nil
}
}
func CheckPriceFormat(fee string) error {
if len(fee) == 0 {
return errors.New("金额不能为空")
}
if strings.Contains(fee, ".") {
arr := strings.Split(fee, ".")
if len(arr[1]) <= 2 {
return nil
} else {
return errors.New("金额只支持两位小数")
}
} else {
return nil
}
}
/**
判断是否为指针
*/
func IsStructPtr(t reflect.Type) bool {
return t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Struct
}
/**
*/
func ParseFormToJsonBean(form url.Values, obj interface{}) error {
objT := reflect.TypeOf(obj)
objV := reflect.ValueOf(obj)
if !IsStructPtr(objT) {
return fmt.Errorf("%v 必须是一个指针类型", obj)
}
objT = objT.Elem()
objV = objV.Elem()
return parseFormToStruct(form, objT, objV)
}
func parseFormToStruct(form url.Values, objT reflect.Type, objV reflect.Value) error {
for i := 0; i < objT.NumField(); i++ {
fieldV := objV.Field(i)
if !fieldV.CanSet() {
continue
}
fieldT := objT.Field(i)
if fieldT.Anonymous && fieldT.Type.Kind() == reflect.Struct {
err := parseFormToStruct(form, fieldT.Type, fieldV)
if err != nil {
return err
}
continue
}
tags := strings.Split(fieldT.Tag.Get("json"), ",")
var tag string
if len(tags) == 0 || len(tags[0]) == 0 {
tag = fieldT.Name
} else if tags[0] == "-" {
continue
} else {
tag = tags[0]
}
value := form.Get(tag)
if len(value) == 0 {
continue
}
switch fieldT.Type.Kind() {
case reflect.Bool:
if strings.ToLower(value) == "on" || strings.ToLower(value) == "1" || strings.ToLower(value) == "yes" {
fieldV.SetBool(true)
continue
}
if strings.ToLower(value) == "off" || strings.ToLower(value) == "0" || strings.ToLower(value) == "no" {
fieldV.SetBool(false)
continue
}
b, err := strconv.ParseBool(value)
if err != nil {
return err
}
fieldV.SetBool(b)
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
x, err := strconv.ParseInt(value, 10, 64)
if err != nil {
return err
}
fieldV.SetInt(x)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
x, err := strconv.ParseUint(value, 10, 64)
if err != nil {
return err
}
fieldV.SetUint(x)
case reflect.Float32, reflect.Float64:
x, err := strconv.ParseFloat(value, 64)
if err != nil {
return err
}
fieldV.SetFloat(x)
case reflect.Interface:
fieldV.Set(reflect.ValueOf(value))
case reflect.String:
fieldV.SetString(value)
case reflect.Struct:
switch fieldT.Type.String() {
case "time.Time":
var (
t time.Time
err error
)
if len(value) >= 25 {
value = value[:25]
t, err = time.ParseInLocation(time.RFC3339, value, time.Local)
} else if len(value) >= 19 {
if strings.Contains(value, "T") {
value = value[:19]
t, err = time.ParseInLocation(formatDateTimeT, value, time.Local)
} else {
value = value[:19]
t, err = time.ParseInLocation(formatDateTime, value, time.Local)
}
} else if len(value) >= 10 {
if len(value) > 10 {
value = value[:10]
}
t, err = time.ParseInLocation(formatDate, value, time.Local)
} else if len(value) >= 8 {
if len(value) > 8 {
value = value[:8]
}
t, err = time.ParseInLocation(formatTime, value, time.Local)
}
if err != nil {
return err
}
fieldV.Set(reflect.ValueOf(t))
}
case reflect.Slice:
if fieldT.Type == sliceOfInts {
formVals := form[tag]
fieldV.Set(reflect.MakeSlice(reflect.SliceOf(reflect.TypeOf(int(1))), len(formVals), len(formVals)))
for i := 0; i < len(formVals); i++ {
val, err := strconv.Atoi(formVals[i])
if err != nil {
return err
}
fieldV.Index(i).SetInt(int64(val))
}
} else if fieldT.Type == sliceOfStrings {
formVals := form[tag]
fieldV.Set(reflect.MakeSlice(reflect.SliceOf(reflect.TypeOf("")), len(formVals), len(formVals)))
for i := 0; i < len(formVals); i++ {
fieldV.Index(i).SetString(formVals[i])
}
}
}
}
return nil
}
var sliceOfInts = reflect.TypeOf([]int(nil))
var sliceOfStrings = reflect.TypeOf([]string(nil))
const (
formatTime = "15:04:05"
formatDate = "2006-01-02"
formatDateTime = "2006-01-02 15:04:05"
formatDateTimeT = "2006-01-02T15:04:05"
)
//根据具体的地理位置信息和城市.得到经纬度
//使用高德地图 API
func GeoCodes(address string) (string, error) {
url := "http://restapi.amap.com/v3/geocode/geo"
http_request := httplib.Get(url)
http_request.Param("key", "985ad3a23839ab1aa53301d8b0126d68")
http_request.Param("address", address)
data, err := http_request.Bytes()
if err != nil {
return "", err
}
type Geo struct {
Location string `json:"location"`
}
type Result struct {
Status string `json:"status"`
Count string `json:"count"`
Info string `json:"info"`
Geocodes []Geo `json:"geocodes"`
}
result := Result{}
if err := json.Unmarshal(data, &result); err != nil {
return "", err
}
if result.Status != "1" {
return "", errors.New(result.Info)
}
if count, err := strconv.Atoi(result.Count); err != nil {
return "", err
} else {
if count < 1 {
return "", errors.New("经纬度:count为0")
}
}
return result.Geocodes[0].Location, nil
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/ytsunlei/utils.git
git@gitee.com:ytsunlei/utils.git
ytsunlei
utils
utils
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385