create project
This commit is contained in:
124
domain/models/ai_config.go
Normal file
124
domain/models/ai_config.go
Normal file
@@ -0,0 +1,124 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"database/sql/driver"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AIServiceConfig struct {
|
||||
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
|
||||
ServiceType string `gorm:"type:varchar(50);not null" json:"service_type"` // text, image, video
|
||||
Provider string `gorm:"type:varchar(50)" json:"provider"` // openai, gemini, volcengine, etc.
|
||||
Name string `gorm:"type:varchar(100);not null" json:"name"`
|
||||
BaseURL string `gorm:"type:varchar(255);not null" json:"base_url"`
|
||||
APIKey string `gorm:"type:varchar(255);not null" json:"api_key"`
|
||||
Model ModelField `gorm:"type:text" json:"model"`
|
||||
Endpoint string `gorm:"type:varchar(255)" json:"endpoint"`
|
||||
QueryEndpoint string `gorm:"type:varchar(255)" json:"query_endpoint"`
|
||||
Priority int `gorm:"default:0" json:"priority"` // 优先级,数值越大优先级越高
|
||||
IsDefault bool `gorm:"default:false" json:"is_default"`
|
||||
IsActive bool `gorm:"default:true" json:"is_active"`
|
||||
Settings string `gorm:"type:text" json:"settings"`
|
||||
CreatedAt time.Time `gorm:"not null;autoCreateTime" json:"created_at"`
|
||||
UpdatedAt time.Time `gorm:"not null;autoUpdateTime" json:"updated_at"`
|
||||
}
|
||||
|
||||
func (c *AIServiceConfig) TableName() string {
|
||||
return "ai_service_configs"
|
||||
}
|
||||
|
||||
type AIServiceProvider struct {
|
||||
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
|
||||
Name string `gorm:"type:varchar(100);not null;uniqueIndex" json:"name"`
|
||||
DisplayName string `gorm:"type:varchar(100);not null" json:"display_name"`
|
||||
ServiceType string `gorm:"type:varchar(50);not null" json:"service_type"`
|
||||
DefaultURL string `gorm:"type:varchar(255)" json:"default_url"`
|
||||
Description string `gorm:"type:text" json:"description"`
|
||||
IsActive bool `gorm:"default:true" json:"is_active"`
|
||||
CreatedAt time.Time `gorm:"not null;autoCreateTime" json:"created_at"`
|
||||
UpdatedAt time.Time `gorm:"not null;autoUpdateTime" json:"updated_at"`
|
||||
}
|
||||
|
||||
func (p *AIServiceProvider) TableName() string {
|
||||
return "ai_service_providers"
|
||||
}
|
||||
|
||||
// ModelField 自定义类型,支持字符串或字符串数组
|
||||
type ModelField []string
|
||||
|
||||
// Value 实现 driver.Valuer 接口,用于存储到数据库
|
||||
func (m ModelField) Value() (driver.Value, error) {
|
||||
if len(m) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
data, err := json.Marshal(m)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return string(data), nil
|
||||
}
|
||||
|
||||
// Scan 实现 sql.Scanner 接口,用于从数据库读取
|
||||
func (m *ModelField) Scan(value interface{}) error {
|
||||
if value == nil {
|
||||
*m = []string{}
|
||||
return nil
|
||||
}
|
||||
|
||||
var data []byte
|
||||
switch v := value.(type) {
|
||||
case []byte:
|
||||
data = v
|
||||
case string:
|
||||
data = []byte(v)
|
||||
default:
|
||||
return errors.New("unsupported type for ModelField")
|
||||
}
|
||||
|
||||
// 尝试解析为数组
|
||||
var arr []string
|
||||
if err := json.Unmarshal(data, &arr); err == nil {
|
||||
*m = arr
|
||||
return nil
|
||||
}
|
||||
|
||||
// 如果解析失败,尝试作为单个字符串处理
|
||||
var str string
|
||||
if err := json.Unmarshal(data, &str); err == nil {
|
||||
*m = []string{str}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 兼容旧数据:直接作为字符串
|
||||
*m = []string{string(data)}
|
||||
return nil
|
||||
}
|
||||
|
||||
// MarshalJSON 实现 json.Marshaler 接口
|
||||
func (m ModelField) MarshalJSON() ([]byte, error) {
|
||||
if len(m) == 0 {
|
||||
return json.Marshal([]string{})
|
||||
}
|
||||
return json.Marshal([]string(m))
|
||||
}
|
||||
|
||||
// UnmarshalJSON 实现 json.Unmarshaler 接口,支持字符串或数组
|
||||
func (m *ModelField) UnmarshalJSON(data []byte) error {
|
||||
// 尝试解析为数组
|
||||
var arr []string
|
||||
if err := json.Unmarshal(data, &arr); err == nil {
|
||||
*m = arr
|
||||
return nil
|
||||
}
|
||||
|
||||
// 尝试解析为单个字符串
|
||||
var str string
|
||||
if err := json.Unmarshal(data, &str); err == nil {
|
||||
*m = []string{str}
|
||||
return nil
|
||||
}
|
||||
|
||||
return errors.New("model field must be string or array of strings")
|
||||
}
|
||||
Reference in New Issue
Block a user