|
|
|
package models
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"database/sql/driver"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"github.com/veypi/OneAuth/cfg"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
type JSON []byte
|
|
|
|
|
|
|
|
func (j JSON) Value() (driver.Value, error) {
|
|
|
|
if j.IsNull() {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
return string(j), nil
|
|
|
|
}
|
|
|
|
func (j *JSON) Scan(value interface{}) error {
|
|
|
|
if value == nil {
|
|
|
|
*j = nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
s, ok := value.([]byte)
|
|
|
|
if !ok {
|
|
|
|
return errors.New("invalid scan source")
|
|
|
|
}
|
|
|
|
*j = append((*j)[0:0], s...)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
func (j JSON) MarshalJSON() ([]byte, error) {
|
|
|
|
if j == nil {
|
|
|
|
return []byte("null"), nil
|
|
|
|
}
|
|
|
|
return j, nil
|
|
|
|
}
|
|
|
|
func (j *JSON) UnmarshalJSON(data []byte) error {
|
|
|
|
if j == nil {
|
|
|
|
return errors.New("null point exception")
|
|
|
|
}
|
|
|
|
*j = append((*j)[0:0], data...)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
func (j JSON) IsNull() bool {
|
|
|
|
return len(j) == 0 || string(j) == "null"
|
|
|
|
}
|
|
|
|
func (j JSON) Equals(j1 JSON) bool {
|
|
|
|
return bytes.Equal(j, j1)
|
|
|
|
}
|
|
|
|
|
|
|
|
// JSONTime custom json time
|
|
|
|
type JSONTime struct {
|
|
|
|
time.Time
|
|
|
|
}
|
|
|
|
|
|
|
|
func Now() *JSONTime {
|
|
|
|
return &JSONTime{time.Now()}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON 实现它的json序列化方法
|
|
|
|
func (jt JSONTime) MarshalJSON() ([]byte, error) {
|
|
|
|
var stamp = fmt.Sprintf("\"%s\"", jt.Format(cfg.CFG.TimeFormat))
|
|
|
|
return []byte(stamp), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON 反序列化方法
|
|
|
|
func (jt *JSONTime) UnmarshalJSON(data []byte) (err error) {
|
|
|
|
now, err := time.ParseInLocation(`"`+cfg.CFG.TimeFormat+`"`, string(data), time.Local)
|
|
|
|
*jt = JSONTime{now}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Value insert timestamp into mysql need this function.
|
|
|
|
func (jt JSONTime) Value() (driver.Value, error) {
|
|
|
|
var zeroTime time.Time
|
|
|
|
if jt.Time.UnixNano() == zeroTime.UnixNano() {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
return jt.Time, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Scan value of time.Time
|
|
|
|
func (jt *JSONTime) Scan(v interface{}) error {
|
|
|
|
value, ok := v.(time.Time)
|
|
|
|
if ok {
|
|
|
|
*jt = JSONTime{Time: value}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return fmt.Errorf("can not convert %v to timestamp", v)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (jt *JSONTime) SetTime(t time.Time) {
|
|
|
|
jt.Time = t
|
|
|
|
}
|
|
|
|
|
|
|
|
type BaseModel struct {
|
|
|
|
ID uint `gorm:"primaryKey"`
|
|
|
|
CreatedAt JSONTime ``
|
|
|
|
UpdatedAt JSONTime ``
|
|
|
|
DeletedAt gorm.DeletedAt `gorm:"index"`
|
|
|
|
}
|