Files
huangguo_server/common/convUtil.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

188 lines
4.0 KiB
Go

package common
import (
"encoding/json"
"path/filepath"
"reflect"
"strings"
"time"
"91porn-server/common/constant"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type ID = primitive.ObjectID
// ToJsonM 将struct转换为 Json Map
func ToJsonM(obj interface{}) (map[string]interface{}, error) {
j, err := json.Marshal(obj)
if err != nil {
return nil, err
}
m := make(map[string]interface{})
return m, json.Unmarshal(j, &m)
}
// ToBsonM 将struct转换为 Bson Map
func ToBsonM(s interface{}) (bson.M, error) {
data, err := bson.Marshal(s)
if err != nil {
return nil, err
}
m := make(bson.M)
return m, bson.Unmarshal(data, &m)
}
func MapToJsonString(m map[string]string) (string, error) {
data, err := json.Marshal(m)
if err != nil {
return "", err
}
return string(data), nil
}
// BMapToStruct s is struct ptr
func BMapToStruct(s interface{}, m map[string]interface{}) error {
bsonBytes, err := bson.Marshal(m)
if err != nil {
return err
}
return bson.Unmarshal(bsonBytes, s)
}
// JMapToStruct s is struct ptr
func JMapToStruct(s interface{}, m map[string]interface{}) error {
bsonBytes, err := json.Marshal(m)
if err != nil {
return err
}
return json.Unmarshal(bsonBytes, s)
}
// JSONStruct2Map 将struct转换为Map
func JSONStruct2Map(obj interface{}) (map[string]interface{}, error) {
j, err := json.Marshal(obj)
if err != nil {
return nil, err
}
m := make(map[string]interface{})
return m, json.Unmarshal(j, &m)
}
// Map2JSONStruct 将map转换为Json struct
func Map2JSONStruct(v interface{}, m map[string]interface{}) error {
j, err := json.Marshal(m)
if err != nil {
return err
}
return json.Unmarshal(j, v)
}
func IDArray(ids []string) ([]ID, error) {
idArray := make([]ID, len(ids))
for i, id := range ids {
_id, err := primitive.ObjectIDFromHex(id)
if err != nil {
return nil, err
}
idArray[i] = _id
}
return idArray, nil
}
// 拼接https://
func BindHttpSch(path string) string {
if strings.HasPrefix(path, "http") {
return path
}
return "https://" + path
}
func BindUrl(hostname string, path ...string) string {
if hostname == "" {
return strings.TrimLeft(filepath.Join(path...), "/")
}
if len(path) == 0 {
return hostname
}
su := strings.TrimLeft(filepath.Join(path...), "/")
pr := strings.TrimRight(hostname, "/")
return pr + "/" + su
}
func ObjectIDs2String(obj []primitive.ObjectID) []string {
if len(obj) == 0 {
return []string{}
}
arr := make([]string, len(obj))
for i, o := range obj {
arr[i] = o.Hex()
}
return arr
}
func String2ObjectID(obj []string) []primitive.ObjectID {
arr := make([]primitive.ObjectID, 0, len(obj))
for _, o := range obj {
oid, err := primitive.ObjectIDFromHex(o)
if err != nil {
continue
}
arr = append(arr, oid)
}
return arr
}
// PercentOf - calculate what percent [number1] is of [number2].
// ex. 300 is 12.5% of 2400
func PercentOf(part int, total int) float64 {
return (float64(part) * float64(100)) / float64(total)
}
func MergeMap(src, dest map[string]interface{}) map[string]interface{} {
if len(src) == 0 {
return dest
}
if len(dest) == 0 {
return src
}
if len(src) == 0 && len(dest) == 0 {
return make(map[string]interface{})
}
for k, v := range dest {
src[k] = v
}
return src
}
func HandleSysType(sysType string) string {
if strings.Contains(strings.ToLower(sysType), constant.SysTypeIOS) {
return constant.SysTypeIOS
}
if strings.Contains(strings.ToLower(sysType), constant.SysTypeH5) {
return constant.SysTypeH5
}
return constant.SysTypeAndroid
}
func GetJsonTags(tags *[]string, t reflect.Type) {
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
if field.Type.Kind() == reflect.Struct {
GetJsonTags(tags, field.Type)
continue
}
tag := field.Tag.Get("json")
*tags = append(*tags, tag)
}
}
// NormalizeDate 将时间归一化为北京时间的当天 0 点
func NormalizeDate(t time.Time) time.Time {
local, _ := time.LoadLocation("Asia/Shanghai")
t = t.In(local)
return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, local)
}