package models import ( "encoding/json" "errors" "fmt" "reflect" "strings" "github.com/beego/beego/v2/client/orm" ) type HomeData struct { Id int `orm:"column(home_data_id);auto" json:"-"` UserId string `orm:"column(user_id)" json:"user_id"` AiceExStatus int `orm:"column(aice_ex_status)" json:"aice_ex_status"` AiceMenuStatus int `orm:"column(aice_menu_status)" json:"aice_menu_status"` AnygptUserid string `orm:"column(anygpt_userid)" json:"anygpt_userid"` BindStatus int `orm:"column(bind_status)" json:"bind_status"` BtcAddr string `orm:"column(btc_addr)" json:"btc_addr"` CoalesceCreditBalance string `orm:"column(coalesce_credit_balance)" json:"coalesce_credit_balance"` CoalesceCreditUsdt string `orm:"column(coalesce_credit_usdt)" json:"coalesce_credit_usdt"` EthAddr string `orm:"column(eth_addr)" json:"eth_addr"` ImsaStatus int `orm:"column(imsa_status)" json:"imsa_status"` LegaTransferFee string `orm:"column(lega_transfer_fee)" json:"lega_transfer_fee"` LegacyCreditBalance string `orm:"column(legacy_credit_balance)" json:"legacy_credit_balance"` LegacyTokenBalance string `orm:"column(legacy_token_balance)" json:"legacy_token_balance"` LegacyTokenUsdt string `orm:"column(legacy_token_usdt)" json:"legacy_token_usdt"` LockAice string `orm:"column(lock_aice)" json:"lock_aice"` LockAiceValue string `orm:"column(lock_aice_value)" json:"lock_aice_value"` ProfitLevel int `orm:"column(profit_level)" json:"profit_level"` ReceiveAddressStatus int `orm:"column(receive_address_status)" json:"receive_address_status"` SolAddr string `orm:"column(sol_addr)" json:"sol_addr"` TransPassword int `orm:"column(trans_password)" json:"trans_password"` // 关键修改:类型必须为 string 以适配 ORM 注册 TransferStatus string `orm:"column(transfer_status);type(text);null" json:"transfer_status"` TrcAddrBase58 string `orm:"column(trc_addr_base58)" json:"trc_addr_base58"` UsdBalance string `orm:"column(usd_balance)" json:"usd_balance"` UsdtAddress string `orm:"column(usdt_address)" json:"usdt_address"` UsdtWithdrawLimit string `orm:"column(usdt_withdraw_limit)" json:"usdt_withdraw_limit"` UsdtWithdrawStatus int `orm:"column(usdt_withdraw_status)" json:"usdt_withdraw_status"` WithdrawLimit string `orm:"column(withdraw_limit)" json:"withdraw_limit"` XaicePrice string `orm:"column(xaice_price)" json:"xaice_price"` XaiceReleaseBalance string `orm:"column(xaice_release_balance)" json:"xaice_release_balance"` XaiceReleaseBalanceValue string `orm:"column(xaice_release_balance_value)" json:"xaice_release_balance_value"` XaiceReleaseStatus int `orm:"column(xaice_release_status)" json:"xaice_release_status"` XaiceStatus int `orm:"column(xaice_status)" json:"xaice_status"` XaiceUsdtAddress string `orm:"column(xaice_usdt_address)" json:"xaice_usdt_address"` XaiceUsdtWithdrawStatus int `orm:"column(xaice_usdt_withdraw_status)" json:"xaice_usdt_withdraw_status"` YuleMenuStatus int `orm:"column(yule_menu_status)" json:"yule_menu_status"` InvestStatus int `orm:"column(invest_status)" json:"invest_status"` ReleaseAice string `orm:"column(release_aice)" json:"release_aice"` ReleaseAiceValue string `orm:"column(release_aice_value)" json:"release_aice_value"` } func (t *HomeData) TableName() string { return "home_data" } func init() { orm.RegisterModel(new(HomeData)) } // UnmarshalJSON 核心修复:在这里处理 interface{} 转换 // 这样在外部使用 json.Unmarshal 时,即使 API 返回对象,也会被转成字符串存入结构体 func (t *HomeData) UnmarshalJSON(data []byte) error { type Alias HomeData aux := &struct { // 临时用接口接收这个动态字段 TransferStatus interface{} `json:"transfer_status"` *Alias }{ Alias: (*Alias)(t), } if err := json.Unmarshal(data, &aux); err != nil { return err } // 在这里进行 Type Switch,因为 aux.TransferStatus 是接口类型 switch v := aux.TransferStatus.(type) { case map[string]interface{}, []interface{}: b, _ := json.Marshal(v) t.TransferStatus = string(b) case string: t.TransferStatus = v case float64: t.TransferStatus = fmt.Sprintf("%.0f", v) default: t.TransferStatus = "" } return nil } // AddHomeData 插入新记录 func AddHomeData(m *HomeData) (id int64, err error) { o := orm.NewOrm() // 因为已经在 UnmarshalJSON 处理好了,这里直接插入即可 id, err = o.Insert(m) return } // GetAllHomeData 列表查询 func GetAllHomeData(query map[string]string, fields []string, sortby []string, order []string, offset int64, limit int64) (ml []interface{}, err error) { o := orm.NewOrm() qs := o.QueryTable(new(HomeData)) for k, v := range query { k = strings.Replace(k, ".", "__", -1) if strings.HasSuffix(k, "isnull") { qs = qs.Filter(k, (v == "true" || v == "1")) } else { qs = qs.Filter(k, v) } } var sortFields []string if len(sortby) != 0 { buildSort := func(field, ord string) (string, error) { switch strings.ToLower(ord) { case "desc": return "-" + field, nil case "asc": return field, nil default: return "", errors.New("Invalid order") } } if len(sortby) == len(order) { for i, v := range sortby { s, _ := buildSort(v, order[i]) sortFields = append(sortFields, s) } } else if len(order) == 1 { for _, v := range sortby { s, _ := buildSort(v, order[0]) sortFields = append(sortFields, s) } } } var l []HomeData if len(sortFields) > 0 { qs = qs.OrderBy(sortFields...) } if _, err = qs.Limit(limit, offset).All(&l, fields...); err == nil { if len(fields) == 0 { for _, v := range l { ml = append(ml, v) } } else { for _, v := range l { m := make(map[string]interface{}) val := reflect.ValueOf(v) for _, fname := range fields { f := val.FieldByName(fname) if f.IsValid() { m[fname] = f.Interface() } } ml = append(ml, m) } } return ml, nil } return nil, err } // UpdateHomeDataById 更新记录 func UpdateHomeDataById(m *HomeData) (err error) { o := orm.NewOrm() _, err = o.Update(m) return } // DeleteHomeData 删除记录 func DeleteHomeData(id int) (err error) { o := orm.NewOrm() _, err = o.Delete(&HomeData{Id: id}) return }