1 Star 0 Fork 0

natas-public / beego-utils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
entity.go 6.28 KB
一键复制 编辑 原始数据 按行查看 历史
// Package mysql
/*******************************************************************************
* @DESC 数据库实体Entity操作
* @AUTH Neo
* @DATE 2022-03-14
* @CHANGE LOGS
* DATE CHANGER DETAIL
******************************************************************************/
package mysql
import (
"reflect"
"strings"
"github.com/beego/beego/v2/core/logs"
strUtils "gitee.com/natas-public/utils/str"
)
const (
structNeoTagDelim = ";"
)
/*******************************************************************************
* @DESC 支持的Tag标记列表
******************************************************************************/
var (
neoSupportTag = map[string]int{
"-": 1,
"except": 1,
}
ormSupportTag = map[string]int{
"-": 1,
"null": 1,
"index": 1,
"unique": 1,
"pk": 1,
"auto": 1,
"auto_now": 1,
"auto_now_add": 1,
"size": 2,
"column": 2,
"default": 2,
"rel": 2,
"reverse": 2,
"rel_table": 2,
"rel_through": 2,
"digits": 2,
"decimals": 2,
"on_delete": 2,
"type": 2,
"description": 2,
"precision": 2,
}
)
// FixOrmNames
/*******************************************************************************
* @DESC 获取结构体对象的字段,对应的表字段名
* @PARAMS v interface{} 结构体对象
* exceptKeys []string 不列举的字段名列表
* @RETURN []string 表字段名列表
* @AUTH Neo
* @DATE 2022-03-14
* @CHANGE LOGS
* DATE CHANGER DETAIL
******************************************************************************/
func FixOrmNames(v interface{}, exceptKeys []string) (res []string) {
typ := reflect.TypeOf(v)
if "StructField" == typ.Name() {
// 递归情况下,已经反射到的类型信息,直接替换即可
typ = v.(reflect.StructField).Type
} else {
// 如参数为指针类型,则需要指针指向的元素类型(等效于对指针类型变量做了一个 "*" 操作)
if reflect.Ptr == typ.Kind() {
typ = typ.Elem()
}
// 判断如对象类型不是结构体,则返回空字符串数组
if reflect.Struct != typ.Kind() {
return []string{}
}
}
for i := 0; i < typ.NumField(); i++ {
// 循环遍历成员
field := typ.Field(i)
if strUtils.Contain(exceptKeys, field.Name) {
// 排除在外的设置项不读取
continue
}
if reflect.Func == field.Type.Kind() {
// 排除方法成员
continue
}
if reflect.Struct == field.Type.Kind() && "NTime" != field.Type.Name() {
// 如成员为嵌套结构体,递归获取字段名
fieldStruct, _ := typ.FieldByName(field.Name)
res = append(res, FixOrmNames(fieldStruct, exceptKeys)...)
// 嵌套结构体本身的成员名不列举
continue
}
// 解析Tag信息
attrs, _ := parseStructTag(field.Tag.Get("neo"), neoSupportTag)
if _, ok := attrs["-"]; ok || attrs["except"] {
// Tag neo指定为 "-"
// 如Tag信息中包含 "except" 项,则不列举字段名
continue
}
// 解析数据库表名
_, tags := parseStructTag(field.Tag.Get("orm"), ormSupportTag)
if "" != tags["column"] {
tags["column"] = strUtils.Camel2Case(field.Name)
}
res = append(res, tags["column"])
}
return res
}
// FixFieldNames
/*******************************************************************************
* @DESC 获取结构体对象的所有字段名
* @PARAMS v interface{} 结构体对象
* exceptKeys []string 不列举的字段名列表
* @RETURN []string 字段名列表
* @AUTH Neo
* @DATE 2022-03-14
* @CHANGE LOGS
* DATE CHANGER DETAIL
******************************************************************************/
func FixFieldNames(v interface{}, exceptKeys []string) (res []string) {
typ := reflect.TypeOf(v)
if "StructField" == typ.Name() {
// 递归情况下,已经反射到的类型信息,直接替换即可
typ = v.(reflect.StructField).Type
} else {
// 如参数为指针类型,则需要指针指向的元素类型(等效于对指针类型变量做了一个 "*" 操作)
if reflect.Ptr == typ.Kind() {
typ = typ.Elem()
}
// 判断如对象类型不是结构体,则返回空字符串数组
if reflect.Struct != typ.Kind() {
return []string{}
}
}
for i := 0; i < typ.NumField(); i++ {
// 循环遍历成员
field := typ.Field(i)
if strUtils.Contain(exceptKeys, field.Name) {
// 排除在外的设置项不读取
continue
}
if reflect.Func == field.Type.Kind() {
// 排除方法成员
continue
}
if reflect.Struct == field.Type.Kind() && "NTime" != field.Type.Name() {
// 如成员为嵌套结构体,递归获取字段名
fieldStruct, _ := typ.FieldByName(field.Name)
res = append(res, FixFieldNames(fieldStruct, exceptKeys)...)
// 嵌套结构体本身的成员名不列举
continue
}
// 解析Tag信息
attrs, _ := parseStructTag(field.Tag.Get("neo"), neoSupportTag)
if _, ok := attrs["-"]; ok || attrs["except"] {
// Tag neo指定为 "-"
// 如Tag信息中包含 "except" 项,则不列举字段名
continue
}
res = append(res, field.Name)
}
return res
}
/*******************************************************************************
* @DESC 解析字段的Tag信息
* @PARAMS tag string Tag字符串
* @RETURN map[string]bool 布尔类型Tag标记
* map[string]string 字符串类型Tag标记
* @AUTH Neo
* @DATE 2022-03-14
* @CHANGE LOGS
* DATE CHANGER DETAIL
******************************************************************************/
func parseStructTag(tag string, supportTag map[string]int) (attrs map[string]bool, tags map[string]string) {
// 创建分为布尔类型和字符串类型的两类Tag标记
attrs = make(map[string]bool)
tags = make(map[string]string)
for _, v := range strings.Split(tag, structNeoTagDelim) {
if v == "" {
continue
}
v = strings.TrimSpace(v)
if t := strings.ToLower(v); supportTag[t] == 1 {
attrs[t] = true
} else if i := strings.Index(v, "("); i > 0 && strings.Index(v, ")") == len(v)-1 {
name := t[:i]
if supportTag[name] == 2 {
v = v[i+1 : len(v)-1]
tags[name] = v
}
} else {
logs.Debug("unsupport tag", v)
}
}
return
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/natas-public/beego-utils.git
git@gitee.com:natas-public/beego-utils.git
natas-public
beego-utils
beego-utils
v0.0.12

搜索帮助

344bd9b3 5694891 D2dac590 5694891