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
|
|||
|
|
}
|