128 lines
4.0 KiB
Go
128 lines
4.0 KiB
Go
package domain
|
||
|
||
import "time"
|
||
|
||
// CustomFieldType 自定义字段类型
|
||
type CustomFieldType int
|
||
|
||
const (
|
||
CustomFieldTypeString CustomFieldType = iota // 字符串
|
||
CustomFieldTypeNumber // 数字
|
||
CustomFieldTypeBoolean // 布尔
|
||
CustomFieldTypeDate // 日期
|
||
)
|
||
|
||
// CustomField 自定义字段定义
|
||
type CustomField struct {
|
||
ID int64 `gorm:"primaryKey;autoIncrement" json:"id"`
|
||
Name string `gorm:"type:varchar(50);not null" json:"name"` // 字段名称
|
||
FieldKey string `gorm:"type:varchar(50);uniqueIndex;not null" json:"field_key"` // 字段标识符
|
||
Type CustomFieldType `gorm:"type:int;not null" json:"type"` // 字段类型
|
||
Required bool `gorm:"default:false" json:"required"` // 是否必填
|
||
DefaultVal string `gorm:"type:varchar(255)" json:"default_val"` // 默认值
|
||
MinLen int `gorm:"default:0" json:"min_len"` // 最小长度(字符串)
|
||
MaxLen int `gorm:"default:255" json:"max_len"` // 最大长度(字符串)
|
||
MinVal float64 `gorm:"default:0" json:"min_val"` // 最小值(数字)
|
||
MaxVal float64 `gorm:"default:0" json:"max_val"` // 最大值(数字)
|
||
Options string `gorm:"type:varchar(500)" json:"options"` // 选项列表(逗号分隔)
|
||
Sort int `gorm:"default:0" json:"sort"` // 排序
|
||
Status int `gorm:"type:int;default:1" json:"status"` // 状态:1启用 0禁用
|
||
CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`
|
||
UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"`
|
||
}
|
||
|
||
// TableName 指定表名
|
||
func (CustomField) TableName() string {
|
||
return "custom_fields"
|
||
}
|
||
|
||
// UserCustomFieldValue 用户自定义字段值
|
||
type UserCustomFieldValue struct {
|
||
ID int64 `gorm:"primaryKey;autoIncrement" json:"id"`
|
||
UserID int64 `gorm:"not null;index;uniqueIndex:idx_user_field" json:"user_id"`
|
||
FieldID int64 `gorm:"not null;index;uniqueIndex:idx_user_field" json:"field_id"`
|
||
FieldKey string `gorm:"type:varchar(50);not null" json:"field_key"` // 反规范化存储便于查询
|
||
Value string `gorm:"type:text" json:"value"` // 存储为字符串
|
||
CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`
|
||
UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"`
|
||
}
|
||
|
||
// TableName 指定表名
|
||
func (UserCustomFieldValue) TableName() string {
|
||
return "user_custom_field_values"
|
||
}
|
||
|
||
// CustomFieldValueResponse 自定义字段值响应
|
||
type CustomFieldValueResponse struct {
|
||
FieldKey string `json:"field_key"`
|
||
Value interface{} `json:"value"`
|
||
}
|
||
|
||
// GetValueAsInterface 根据字段类型返回解析后的值
|
||
func (v *UserCustomFieldValue) GetValueAsInterface(field *CustomField) interface{} {
|
||
switch field.Type {
|
||
case CustomFieldTypeString:
|
||
return v.Value
|
||
case CustomFieldTypeNumber:
|
||
var f float64
|
||
for _, c := range v.Value {
|
||
if c >= '0' && c <= '9' || c == '.' {
|
||
continue
|
||
}
|
||
return v.Value
|
||
}
|
||
if _, err := parseFloat(v.Value, &f); err == nil {
|
||
return f
|
||
}
|
||
return v.Value
|
||
case CustomFieldTypeBoolean:
|
||
return v.Value == "true" || v.Value == "1"
|
||
case CustomFieldTypeDate:
|
||
t, err := time.Parse("2006-01-02", v.Value)
|
||
if err == nil {
|
||
return t.Format("2006-01-02")
|
||
}
|
||
return v.Value
|
||
default:
|
||
return v.Value
|
||
}
|
||
}
|
||
|
||
func parseFloat(s string, f *float64) (int, error) {
|
||
var sign, decimals int
|
||
varMantissa := 0
|
||
*f = 0
|
||
|
||
i := 0
|
||
if i < len(s) && s[i] == '-' {
|
||
sign = 1
|
||
i++
|
||
}
|
||
|
||
for ; i < len(s); i++ {
|
||
c := s[i]
|
||
if c == '.' {
|
||
decimals = 1
|
||
continue
|
||
}
|
||
if c < '0' || c > '9' {
|
||
return i, nil
|
||
}
|
||
n := float64(c - '0')
|
||
*f = *f*10 + n
|
||
varMantissa++
|
||
}
|
||
|
||
if decimals > 0 {
|
||
for ; decimals > 0; decimals-- {
|
||
*f /= 10
|
||
}
|
||
}
|
||
|
||
if sign == 1 {
|
||
*f = -*f
|
||
}
|
||
|
||
return i, nil
|
||
}
|