You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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 ""
}