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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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