211 lines
5.1 KiB
Go
211 lines
5.1 KiB
Go
package util
|
||
|
||
import (
|
||
"bytes"
|
||
"errors"
|
||
"fmt"
|
||
"github.com/fonchain/fonchain-container/pkg/config"
|
||
"io"
|
||
"mime/multipart"
|
||
"net/http"
|
||
"reflect"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
|
||
"github.com/fonchain/fonchain-container/pkg/m"
|
||
"github.com/fonchain/utils/objstorage"
|
||
uuid "github.com/satori/go.uuid"
|
||
)
|
||
|
||
// IdCardTurnAge 身份证号读取年龄
|
||
func IdCardTurnAge(idCard string) int {
|
||
var mapmou = map[string]int{"January": 1, "february": 2, "March": 3, "April": 4, "May": 5, "June": 6, "July": 7, "August": 8, "September": 9, "October": 10, "November": 11, "December": 12}
|
||
// idCard := "34052419800101001X" //身份证
|
||
now := time.Now()
|
||
now_year := now.Year() // 年
|
||
now_mo := mapmou[now.Month().String()] // 月
|
||
now_day := now.Day() // 日
|
||
fmt.Println(now_year, now_mo, now_day)
|
||
idcard_year, _ := strconv.Atoi(Substr(idCard, 6, 4)) // 年
|
||
idcard_mo, _ := strconv.Atoi(Substr(idCard, 10, 2)) // 月
|
||
idcard_day, _ := strconv.Atoi(Substr(idCard, 12, 2)) // 日
|
||
fmt.Println(idcard_year, idcard_mo, idcard_day)
|
||
fmt.Println("idCard:" + idCard)
|
||
age := now_year - idcard_year // 如果计算虚岁需这样:age := now_year - idcard_year+1
|
||
if now_year < idcard_year {
|
||
age = 0
|
||
} else {
|
||
if now_mo < idcard_mo {
|
||
age = age - 1
|
||
} else {
|
||
if now_day < idcard_day {
|
||
age = age - 1
|
||
}
|
||
}
|
||
}
|
||
fmt.Println("age:", age)
|
||
return age
|
||
}
|
||
|
||
func Substr(str string, start, length int) string {
|
||
|
||
rs := []rune(str)
|
||
rl := len(rs)
|
||
end := 0
|
||
if start < 0 {
|
||
start = rl - 1 + start
|
||
}
|
||
end = start + length
|
||
if start > end {
|
||
start, end = end, start
|
||
}
|
||
if start < 0 {
|
||
start = 0
|
||
}
|
||
if start > rl {
|
||
start = rl
|
||
}
|
||
if end < 0 {
|
||
end = 0
|
||
}
|
||
if end > rl {
|
||
end = rl
|
||
}
|
||
return string(rs[start:end])
|
||
}
|
||
|
||
// 封装上传图片到bos然后返回状态和图片的url,单张
|
||
func UploadToBos(file multipart.File, objName string) (string, error) {
|
||
BOSClient, err := objstorage.NewBOS(config.Bos.AK, config.Bos.SK, objstorage.BOS_BJ)
|
||
if err != nil {
|
||
fmt.Println(err)
|
||
}
|
||
b := new(strings.Builder)
|
||
io.Copy(b, file)
|
||
_, err = BOSClient.PutObjectFromBytes(config.Bos.BucketName, objName, []byte(b.String()))
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
url := config.Bos.Url + "/" + objName
|
||
|
||
return url, nil
|
||
}
|
||
func UploadToBosUseBytes(raw []byte, objPath string) (string, error) {
|
||
BOSClient, err := objstorage.NewBOS(config.Bos.AK, config.Bos.SK, objstorage.BOS_BJ)
|
||
if err != nil {
|
||
fmt.Println(err)
|
||
}
|
||
_, err = BOSClient.PutObjectFromBytes(config.Bos.BucketName, objPath, raw)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
url := config.Bos.Url + "/" + objPath
|
||
|
||
return url, nil
|
||
}
|
||
|
||
type CopyOption struct {
|
||
Src interface{}
|
||
Dst interface{}
|
||
WhiteFields string
|
||
BlackFields string
|
||
}
|
||
|
||
// 反射
|
||
func CopyStructSuper(copyOpt CopyOption) {
|
||
st := reflect.TypeOf(copyOpt.Src)
|
||
sv := reflect.ValueOf(copyOpt.Src)
|
||
dt := reflect.TypeOf(copyOpt.Dst)
|
||
dv := reflect.ValueOf(copyOpt.Dst)
|
||
if st.Kind() == reflect.Ptr { //处理指针
|
||
st = st.Elem()
|
||
sv = sv.Elem()
|
||
}
|
||
if dt.Kind() == reflect.Ptr { //处理指针
|
||
dt = dt.Elem()
|
||
}
|
||
if st.Kind() != reflect.Struct || dt.Kind() != reflect.Struct { //如果不是struct类型,直接返回dst
|
||
return
|
||
}
|
||
|
||
dv = reflect.ValueOf(dv.Interface())
|
||
|
||
// 遍历TypeOf 类型
|
||
for i := 0; i < dt.NumField(); i++ { //通过索引来取得它的所有字段,同时来决定循环的次数
|
||
f := dt.Field(i) //通过这个i作为它的索引,从0开始来取得它的字段
|
||
dVal := dv.Elem().Field(i)
|
||
sVal := sv.FieldByName(f.Name)
|
||
if copyOpt.WhiteFields != "" {
|
||
if !strings.Contains(copyOpt.WhiteFields, fmt.Sprintf(",%s,", f.Name)) {
|
||
continue
|
||
}
|
||
}
|
||
|
||
if copyOpt.BlackFields != "" {
|
||
if strings.Contains(copyOpt.BlackFields, fmt.Sprintf(",%s,", f.Name)) {
|
||
continue
|
||
}
|
||
}
|
||
//src数据有效,且dst字段能赋值,类型一致
|
||
if sVal.IsValid() && dVal.CanSet() && f.Type.Kind() == sVal.Type().Kind() {
|
||
dVal.Set(sVal)
|
||
}
|
||
}
|
||
}
|
||
|
||
func Post(url, data string) (string, error) {
|
||
reader := bytes.NewReader([]byte(data))
|
||
|
||
request, err := http.NewRequest("POST", url, reader)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
defer request.Body.Close() //程序在使用完回复后必须关闭回复的主体
|
||
request.Header.Set("Content-Type", "application/json;charset=UTF-8")
|
||
//必须设定该参数,POST参数才能正常提交,意思是以json串提交数据
|
||
|
||
client := http.Client{}
|
||
resp, err := client.Do(request) //Do 方法发送请求,返回 HTTP 回复
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
|
||
respBytes, err := io.ReadAll(resp.Body)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
|
||
//byte数组直接转成string,优化内存
|
||
// str := (*string)(unsafe.Pointer(&respBytes))
|
||
return string(respBytes), nil
|
||
}
|
||
|
||
// 生成uid
|
||
func GetUid() (uuids string, err error) {
|
||
var uid uuid.UUID
|
||
if uid, err = uuid.NewV4(); err != nil {
|
||
err = errors.New(m.ERROR_UID)
|
||
return "", err
|
||
}
|
||
return uid.String(), nil
|
||
}
|
||
|
||
func GetNativePlaceFromAddress(address string) string {
|
||
if address == "" {
|
||
return ""
|
||
}
|
||
runeStr := []rune(address)
|
||
var startIndex int
|
||
for i, v := range runeStr {
|
||
if startIndex == 0 && string(v) != "\"" {
|
||
startIndex = i + 2
|
||
}
|
||
if string(v) == "市" {
|
||
return string(runeStr[startIndex : i+1])
|
||
}
|
||
}
|
||
return ""
|
||
|
||
}
|