fonchain-fiee/pkg/service/base.go
2025-02-19 14:24:15 +08:00

240 lines
4.9 KiB
Go

package service
import (
"fmt"
"github.com/fonchain_enterprise/fonchain-main/pkg/logic"
"github.com/fonchain_enterprise/fonchain-main/pkg/service/approval/model"
"net/http"
"reflect"
"github.com/fonchain_enterprise/fonchain-main/pkg/e"
"github.com/fonchain_enterprise/fonchain-main/pkg/serializer"
"github.com/gin-gonic/gin"
)
// Success Success(c,someMap)
func Success(c *gin.Context, datas ...interface{}) {
var data any
if datas != nil {
data = datas[0]
}
dataFieldStr, _ := c.Get("dataField")
key := []string{"*"}
if dataFieldStr != "" && dataFieldStr != nil {
dataField := dataFieldStr.([]string)
key = dataField
if len(dataField) == 1 && dataField[0] == "*" { //不做处理
} else if len(dataField) >= 1 {
isList := isList(reflect.TypeOf(data).Elem())
// 是列表返回
if isList == false {
ChangeFromReflect(data, dataField)
} else {
ChangeRawFromReflect(data, dataField)
}
}
}
c.JSON(http.StatusOK, serializer.Response{
Status: e.Ok,
Code: e.SUCCESS,
Data: data,
// Keys: dataField,
Keys: key,
})
c.Abort()
}
// SuccessByDataAuth SuccessByDataAuth(c,someMap)
func SuccessByDataAuth(c *gin.Context, data interface{}) {
dataField, _ := c.Get("dataField")
c.JSON(http.StatusOK, serializer.Response{
Status: e.Ok,
Code: e.SUCCESS,
Data: data,
Keys: dataField.([]string),
})
c.Abort()
}
// Error 统一错误返回
func Error(c *gin.Context, code int, err error, msg ...string) {
fmt.Println("err:", err)
status := e.Failed
if code == e.NotLogin {
status = e.NotLogin
}
if code == e.NotLoginSqueeze {
status = e.NotLoginSqueeze
}
var msgStr string
if msg != nil {
msgStr = msg[0]
} else if err != nil {
msgStr = err.Error()
}
// 国际化
if e.VerifyMsgKey(msgStr) {
msgStr = logic.ConvertOaMsg(c, msgStr)
} else {
lang := c.Request.Header.Get("Accept-Language")
msgStr = model.GetLanguageType(lang, msgStr)
}
c.JSON(e.Success, serializer.Response{
Status: status,
Msg: msgStr,
Data: nil,
})
c.Abort()
}
// NotLoginRes 未登录的返回
func NotLoginRes(c *gin.Context, msg string) {
c.JSON(e.Success, serializer.Response{
Code: 401,
Status: 1,
Msg: msg,
Data: nil,
})
c.Abort()
}
func ResponseMsg(c *gin.Context, httpCode int, Resp serializer.Response) {
if httpCode == 0 {
httpCode = http.StatusOK
}
// 国际化
if e.VerifyMsgKey(Resp.Msg) {
Resp.Msg = logic.ConvertOaMsg(c, Resp.Msg)
}
c.JSON(httpCode, serializer.Response{
Status: Resp.Status,
Code: Resp.Code,
Msg: Resp.Msg,
Error: Resp.Error,
Data: Resp.Data,
})
}
func ResponseQuickMsg(c *gin.Context, Status uint8, Msg string, Data interface{}) {
//var c gin.Context
c.JSON(http.StatusOK, serializer.Response{
Status: int(Status),
Msg: Msg,
Data: Data,
})
}
func isList(m reflect.Type) bool {
dataExist := false
for i := 0; i < m.NumField(); i++ {
fieldType := m.Field(i)
if fieldType.Name == "Data" {
getValue := reflect.ValueOf(fieldType)
if getValue.Kind() != reflect.Slice {
dataExist = true
}
break
}
}
return dataExist
}
func IsContainString(items []string, item string) bool {
for _, eachItem := range items {
if eachItem == item {
return true
}
}
return false
}
func ChangeFromReflect(data interface{}, dataField []string) {
m := reflect.TypeOf(data).Elem()
for i := 0; i < m.NumField(); i++ {
fieldType := m.Field(i)
if IsContainString(dataField, fieldType.Name) == false {
field := reflect.ValueOf(data).Elem().FieldByName(fieldType.Name)
switch m.Field(i).Type.Name() {
case "int":
if field.CanSet() {
field.SetInt(0)
}
case "uint":
if field.CanSet() {
field.SetUint(0)
}
case "uint64":
if field.CanSet() {
field.SetUint(0)
}
case "string":
if field.CanSet() {
field.SetString("")
}
default:
if reflect.ValueOf(data).Elem().FieldByName(fieldType.Name).CanAddr() {
if reflect.ValueOf(data).Elem().FieldByName(fieldType.Name).Kind() == reflect.Slice {
field := reflect.ValueOf(data).Elem().FieldByName(fieldType.Name)
if field.CanSet() {
field.Set(reflect.MakeSlice(field.Type(), 0, 0))
}
}
if reflect.ValueOf(data).Elem().FieldByName(fieldType.Name).Kind() == reflect.Struct {
}
if reflect.ValueOf(data).Elem().FieldByName(fieldType.Name).Kind() == reflect.Ptr {
field := reflect.ValueOf(data).Elem().FieldByName(fieldType.Name)
if !reflect.ValueOf(data).Elem().FieldByName(fieldType.Name).IsNil() {
fieldType := reflect.ValueOf(data).Elem().FieldByName(fieldType.Name).Elem().Type()
if field.CanSet() {
field.Set(reflect.New(fieldType))
}
}
}
}
}
}
}
}
func ChangeRawFromReflect(data interface{}, dataField []string) {
sliceContent := reflect.ValueOf(data).Elem().FieldByName("Data")
for i := 0; i < sliceContent.Len(); i++ {
sliceContent.Index(i)
ChangeFromReflect(sliceContent.Index(i).Interface(), dataField)
}
}