|
|
@@ -2,6 +2,7 @@ package model
|
|
|
|
|
|
import (
|
|
|
"encoding/json"
|
|
|
+ "database/sql/driver"
|
|
|
"one-api/common"
|
|
|
|
|
|
"gorm.io/gorm"
|
|
|
@@ -14,11 +15,68 @@ import (
|
|
|
// ["gpt-4o", "gpt-3.5-turbo"]
|
|
|
// 设计遵循 3NF,避免冗余,提供灵活扩展能力。
|
|
|
|
|
|
+// JSONValue 基于 json.RawMessage 实现,支持从数据库的 []byte 和 string 两种类型读取
|
|
|
+type JSONValue json.RawMessage
|
|
|
+
|
|
|
+// Value 实现 driver.Valuer 接口,用于数据库写入
|
|
|
+func (j JSONValue) Value() (driver.Value, error) {
|
|
|
+ if j == nil {
|
|
|
+ return nil, nil
|
|
|
+ }
|
|
|
+ return []byte(j), nil
|
|
|
+}
|
|
|
+
|
|
|
+// Scan 实现 sql.Scanner 接口,兼容不同驱动返回的类型
|
|
|
+func (j *JSONValue) Scan(value interface{}) error {
|
|
|
+ switch v := value.(type) {
|
|
|
+ case nil:
|
|
|
+ *j = nil
|
|
|
+ return nil
|
|
|
+ case []byte:
|
|
|
+ // 拷贝底层字节,避免保留底层缓冲区
|
|
|
+ b := make([]byte, len(v))
|
|
|
+ copy(b, v)
|
|
|
+ *j = JSONValue(b)
|
|
|
+ return nil
|
|
|
+ case string:
|
|
|
+ *j = JSONValue([]byte(v))
|
|
|
+ return nil
|
|
|
+ default:
|
|
|
+ // 其他类型尝试序列化为 JSON
|
|
|
+ b, err := json.Marshal(v)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ *j = JSONValue(b)
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// MarshalJSON 确保在对外编码时与 json.RawMessage 行为一致
|
|
|
+func (j JSONValue) MarshalJSON() ([]byte, error) {
|
|
|
+ if j == nil {
|
|
|
+ return []byte("null"), nil
|
|
|
+ }
|
|
|
+ return j, nil
|
|
|
+}
|
|
|
+
|
|
|
+// UnmarshalJSON 确保在对外解码时与 json.RawMessage 行为一致
|
|
|
+func (j *JSONValue) UnmarshalJSON(data []byte) error {
|
|
|
+ if data == nil {
|
|
|
+ *j = nil
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ b := make([]byte, len(data))
|
|
|
+ copy(b, data)
|
|
|
+ *j = JSONValue(b)
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
type PrefillGroup struct {
|
|
|
Id int `json:"id"`
|
|
|
Name string `json:"name" gorm:"size:64;not null;uniqueIndex:uk_prefill_name,where:deleted_at IS NULL"`
|
|
|
Type string `json:"type" gorm:"size:32;index;not null"`
|
|
|
- Items json.RawMessage `json:"items" gorm:"type:json"`
|
|
|
+ Items JSONValue `json:"items" gorm:"type:json"`
|
|
|
Description string `json:"description,omitempty" gorm:"type:varchar(255)"`
|
|
|
CreatedTime int64 `json:"created_time" gorm:"bigint"`
|
|
|
UpdatedTime int64 `json:"updated_time" gorm:"bigint"`
|