package models import ( "encoding/json" "time" ) // SocialAccount 社交账号绑定模型 type SocialAccount struct { ID uint64 `json:"id" db:"id"` UserID uint64 `json:"user_id" db:"user_id"` Provider string `json:"provider" db:"provider"` // wechat, qq, weibo, google, facebook, twitter ProviderUserID string `json:"provider_user_id" db:"provider_user_id"` ProviderUsername string `json:"provider_username" db:"provider_username"` AccessToken string `json:"-" db:"access_token"` // 不返回给前端 RefreshToken string `json:"-" db:"refresh_token"` ExpiresAt *time.Time `json:"expires_at" db:"expires_at"` RawData JSON `json:"-" db:"raw_data"` IsPrimary bool `json:"is_primary" db:"is_primary"` CreatedAt time.Time `json:"created_at" db:"created_at"` UpdatedAt time.Time `json:"updated_at" db:"updated_at"` } // SocialAccountInfo 返回给前端的社交账号信息(不含敏感信息) type SocialAccountInfo struct { ID uint64 `json:"id"` Provider string `json:"provider"` ProviderUserID string `json:"provider_user_id"` ProviderUsername string `json:"provider_username"` IsPrimary bool `json:"is_primary"` CreatedAt time.Time `json:"created_at"` } // ToInfo 转换为安全信息 func (sa *SocialAccount) ToInfo() *SocialAccountInfo { return &SocialAccountInfo{ ID: sa.ID, Provider: sa.Provider, ProviderUserID: sa.ProviderUserID, ProviderUsername: sa.ProviderUsername, IsPrimary: sa.IsPrimary, CreatedAt: sa.CreatedAt, } } // JSON 自定义JSON类型,用于存储RawData type JSON struct { Data interface{} } // Scan 实现 sql.Scanner 接口 func (j *JSON) Scan(value interface{}) error { if value == nil { j.Data = nil return nil } bytes, ok := value.([]byte) if !ok { return nil } return json.Unmarshal(bytes, &j.Data) } // Value 实现 driver.Valuer 接口 func (j JSON) Value() (interface{}, error) { if j.Data == nil { return nil, nil } return json.Marshal(j.Data) }