tianyuan-api-server/apps/api/internal/common/logic.go

63 lines
1.4 KiB
Go
Raw Normal View History

2024-10-12 20:41:55 +08:00
package common
2025-06-14 13:49:46 +08:00
import (
2025-06-14 15:20:36 +08:00
"reflect"
2025-06-14 13:49:46 +08:00
)
// StructToMap 将结构体转换为 map[string]interface{}
func StructToMap(data interface{}) (map[string]interface{}, error) {
2025-06-14 15:20:36 +08:00
result := make(map[string]interface{})
// 使用反射获取结构体的值
v := reflect.ValueOf(data)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
if v.Kind() != reflect.Struct {
return nil, nil
2025-06-14 13:49:46 +08:00
}
2025-06-14 15:20:36 +08:00
// 遍历结构体字段
t := v.Type()
for i := 0; i < v.NumField(); i++ {
field := t.Field(i)
value := v.Field(i)
// 获取字段名(优先使用 json tag
key := field.Name
if jsonTag := field.Tag.Get("json"); jsonTag != "" && jsonTag != "-" {
key = jsonTag
}
// 处理字段值
if value.IsValid() && !value.IsZero() {
if value.Kind() == reflect.Ptr {
value = value.Elem()
}
result[key] = value.Interface()
}
2025-06-14 13:49:46 +08:00
}
return result, nil
}
2024-10-12 20:41:55 +08:00
func MapStructToAPIRequest(encryptedFields map[string]interface{}, fieldMapping map[string]string, wrapField string) map[string]interface{} {
apiRequest := make(map[string]interface{})
// 遍历字段映射表
for structField, apiField := range fieldMapping {
// 如果加密后的字段存在,才添加到请求
if value, exists := encryptedFields[structField]; exists {
apiRequest[apiField] = value
}
}
// 如果 wrapField 不为空,将 apiRequest 包裹到该字段下
if wrapField != "" {
return map[string]interface{}{
wrapField: apiRequest,
}
}
return apiRequest
}