You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
750 lines
19 KiB
750 lines
19 KiB
package model |
|
|
|
import ( |
|
"fmt" |
|
"regexp" |
|
"strconv" |
|
"strings" |
|
|
|
account "go-common/app/service/main/account/model" |
|
xtime "go-common/library/time" |
|
) |
|
|
|
// Const . |
|
const ( |
|
// State |
|
StateAutoLock = -11 |
|
StateLock = -10 |
|
StateReject = -3 |
|
StatePending = -2 |
|
StateOpen = 0 |
|
StateOpenPending = 2 |
|
StateOpenReject = 3 |
|
StateAutoPass = 4 |
|
StateRePending = 5 // 重复编辑待审 |
|
StateReReject = 6 // 重复编辑未通过 |
|
StateRePass = 7 // 重复编辑通过 |
|
|
|
// groups for creation center. |
|
GroupAll = 0 // except draft and deleted. 0 2 -2 3 -3 -10 |
|
GroupPending = 1 // -2 2 |
|
GroupPassed = 2 // 0 |
|
GroupUnpassed = 3 // -10 -3 3 |
|
|
|
NoLikeState = 0 |
|
LikeState = 1 |
|
DislikeState = 2 |
|
|
|
// Templates |
|
TemplateText = 1 |
|
TemplateSingleImg = 2 |
|
TemplateMultiImg = 3 |
|
TemplateSingleBigImg = 4 |
|
|
|
// Attributes |
|
//AttrBitNoDistribute 禁止分发(空间/分区/动态) |
|
AttrBitNoDistribute = uint(1) |
|
//AttrBitNoRegion 禁止在分区页显示 |
|
AttrBitNoRegion = uint(2) |
|
//AttrBitNoRank 禁止排行 |
|
AttrBitNoRank = uint(3) |
|
|
|
// Author |
|
|
|
// AuthorStatePass 过审 |
|
AuthorStateReject = -1 |
|
AuthorStatePending = 0 |
|
AuthorStatePass = 1 |
|
AuthorStateClose = 2 |
|
// AuthorStateIgnore = 3 |
|
) |
|
|
|
var cleanURLRegexp = regexp.MustCompile(`^.+hdslb.com`) |
|
var bfsRegexp = regexp.MustCompile(`^https?://.{1,6}\.hdslb+\.com/.+(?:jpg|gif|png|webp|jpeg)$`) |
|
|
|
// Categories for sorting category. |
|
type Categories []*Category |
|
|
|
func (as Categories) Len() int { return len(as) } |
|
func (as Categories) Less(i, j int) bool { |
|
return as[i].Position < as[j].Position |
|
} |
|
func (as Categories) Swap(i, j int) { as[i], as[j] = as[j], as[i] } |
|
|
|
// StatMsg means article's stat message in databus. |
|
type StatMsg struct { |
|
View *int64 `json:"view"` |
|
Like *int64 `json:"like"` |
|
Dislike *int64 `json:"dislike"` |
|
Favorite *int64 `json:"fav"` |
|
Reply *int64 `json:"reply"` |
|
Share *int64 `json:"share"` |
|
Coin *int64 `json:"coin"` |
|
Aid int64 `json:"aid"` |
|
Mid int64 `json:"mid"` |
|
IP string `json:"ip"` |
|
CheatInfo *CheatInfo `json:"cheat_info"` |
|
} |
|
|
|
func (sm *StatMsg) String() (res string) { |
|
if sm == nil { |
|
res = "<nil>" |
|
return |
|
} |
|
res = fmt.Sprintf("aid: %v, mid: %v, ip: %v, view(%s) likes(%s) dislike(%s) favorite(%s) reply(%s) share(%s) coin(%s)", sm.Aid, sm.Mid, sm.IP, formatPInt(sm.View), formatPInt(sm.Like), formatPInt(sm.Dislike), formatPInt(sm.Favorite), formatPInt(sm.Reply), formatPInt(sm.Share), formatPInt(sm.Coin)) |
|
return |
|
} |
|
|
|
// CheatInfo . |
|
type CheatInfo struct { |
|
Valid string `json:"valid"` |
|
Client string `json:"client"` |
|
Cvid string `json:"cvid"` |
|
Mid string `json:"mid"` |
|
Lv string `json:"lv"` |
|
Ts string `json:"ts"` |
|
IP string `json:"ip"` |
|
UA string `json:"ua"` |
|
Refer string `json:"refer"` |
|
Sid string `json:"sid"` |
|
Buvid string `json:"buvid"` |
|
DeviceID string `json:"device_id"` |
|
Build string `json:"build"` |
|
Reason string `json:"reason"` |
|
} |
|
|
|
func formatPInt(s *int64) (res string) { |
|
if s == nil { |
|
return "<nil>" |
|
} |
|
return fmt.Sprintf("%d", *s) |
|
} |
|
|
|
// DraftMsg means article's draft message in databus. |
|
type DraftMsg struct { |
|
Aid int64 `json:"aid"` |
|
Mid int64 `json:"mid"` |
|
} |
|
|
|
// Draft draft struct. |
|
type Draft struct { |
|
*Article |
|
Tags []string `json:"tags"` |
|
ListID int64 `json:"list_id"` |
|
List *List `json:"list"` |
|
} |
|
|
|
// Metas Metas |
|
type Metas []*Meta |
|
|
|
func (as Metas) Len() int { return len(as) } |
|
func (as Metas) Less(i, j int) bool { |
|
var it, jt xtime.Time |
|
if as[i] != nil { |
|
it = as[i].PublishTime |
|
} |
|
if as[j] != nil { |
|
jt = as[j].PublishTime |
|
} |
|
return it > jt |
|
} |
|
func (as Metas) Swap(i, j int) { as[i], as[j] = as[j], as[i] } |
|
|
|
// CreationArtsType creation article-list type's count. |
|
type CreationArtsType struct { |
|
All int `json:"all"` |
|
Audit int `json:"audit"` |
|
Passed int `json:"passed"` |
|
NotPassed int `json:"not_passed"` |
|
} |
|
|
|
// ArtPage article page. |
|
type ArtPage struct { |
|
Pn int `json:"pn"` |
|
Ps int `json:"ps"` |
|
Total int `json:"total"` |
|
} |
|
|
|
// CreationArts creation article list. |
|
type CreationArts struct { |
|
Articles []*Meta `json:"articles"` |
|
Type *CreationArtsType `json:"type"` |
|
Page *ArtPage `json:"page"` |
|
} |
|
|
|
// Drafts draft list. |
|
type Drafts struct { |
|
Drafts []*Draft `json:"drafts"` |
|
Page *ArtPage `json:"page"` |
|
} |
|
|
|
// UpArtMetas article list. |
|
type UpArtMetas struct { |
|
Articles []*Meta `json:"articles"` |
|
Pn int `json:"pn"` |
|
Ps int `json:"ps"` |
|
Count int `json:"count"` |
|
} |
|
|
|
// UpArtMetasLists . |
|
type UpArtMetasLists struct { |
|
*UpArtMetas |
|
UpLists UpLists `json:"up_lists"` |
|
} |
|
|
|
// IsNormal judge whether article's state is normal. |
|
func (a *Meta) IsNormal() bool { |
|
return (a != nil) && (a.State >= StateOpen) |
|
} |
|
|
|
// IsNormal judge article state. |
|
func (a *Article) IsNormal() bool { |
|
if (a == nil) || (a.Meta == nil) { |
|
return false |
|
} |
|
return a.Meta.IsNormal() |
|
} |
|
|
|
// AttrVal gets attr val by bit. |
|
func (a *Meta) AttrVal(bit uint) bool { |
|
return ((a.Attributes>>bit)&int32(1) == 1) |
|
} |
|
|
|
// AttrSet sets attr value by bit. |
|
func (a *Meta) AttrSet(v int32, bit uint) { |
|
a.Attributes = a.Attributes&(^(1 << bit)) | (v << bit) |
|
} |
|
|
|
// Strong fill blank images and tags |
|
func (a *Meta) Strong() *Meta { |
|
if a.ImageURLs == nil { |
|
a.ImageURLs = []string{} |
|
} |
|
if a.OriginImageURLs == nil { |
|
a.OriginImageURLs = []string{} |
|
} |
|
if a.Tags == nil { |
|
a.Tags = []*Tag{} |
|
} |
|
return a |
|
} |
|
|
|
// AuthorPermission recode of article_authors table. |
|
type AuthorPermission struct { |
|
State int `json:"state"` |
|
Rtime xtime.Time `json:"rtime"` |
|
} |
|
|
|
// Favorite user favorite list. |
|
type Favorite struct { |
|
*Meta |
|
FavoriteTime int64 `json:"favorite_time"` |
|
Valid bool `json:"valid"` |
|
} |
|
|
|
// Page model |
|
type Page struct { |
|
Pn int `json:"pn"` |
|
Ps int `json:"ps"` |
|
Total int `json:"total"` |
|
} |
|
|
|
// RecommendArt model |
|
type RecommendArt struct { |
|
Meta |
|
Recommend |
|
} |
|
|
|
// RecommendArtWithLike model |
|
type RecommendArtWithLike struct { |
|
RecommendArt |
|
LikeState int `json:"like_state"` |
|
} |
|
|
|
// MetaWithLike meta with like |
|
type MetaWithLike struct { |
|
Meta |
|
LikeState int `json:"like_state"` |
|
} |
|
|
|
// Recommend model |
|
type Recommend struct { |
|
ArticleID int64 `json:"article_id,omitempty"` |
|
Position int `json:"-"` |
|
EndTime int64 `json:"-"` |
|
Rec bool `json:"rec"` |
|
RecFlag bool `json:"rec_flag"` |
|
RecText string `json:"rec_text"` |
|
RecImageURL string `json:"rec_image_url"` |
|
RecImageStartTime int64 `json:"-"` |
|
RecImageEndTime int64 `json:"-"` |
|
} |
|
|
|
// ViewInfo model |
|
type ViewInfo struct { |
|
Like int8 `json:"like"` |
|
Attention bool `json:"attention"` |
|
Favorite bool `json:"favorite"` |
|
Coin int64 `json:"coin"` |
|
Stats Stats `json:"stats"` |
|
Title string `json:"title"` |
|
BannerURL string `json:"banner_url"` |
|
Mid int64 `json:"mid"` |
|
AuthorName string `json:"author_name"` |
|
IsAuthor bool `json:"is_author"` |
|
ImageURLs []string `json:"image_urls"` |
|
OriginImageURLs []string `json:"origin_image_urls"` |
|
Shareable bool `json:"shareable"` |
|
ShowLaterWatch bool `json:"show_later_watch"` |
|
ShowSmallWindow bool `json:"show_small_window"` |
|
InList bool `json:"in_list"` |
|
Pre int64 `json:"pre"` |
|
Next int64 `json:"next"` |
|
} |
|
|
|
// Group2State mapping creation group to |
|
func Group2State(group int) (states []int64) { |
|
switch group { |
|
case GroupPassed: |
|
states = []int64{StateOpen, StateAutoPass, StateRePass, StateReReject} |
|
case GroupPending: |
|
states = []int64{StatePending, StateOpenPending, StateRePending} |
|
case GroupUnpassed: |
|
states = []int64{StateReject, StateOpenReject, StateLock, StateAutoLock} |
|
case GroupAll: |
|
fallthrough |
|
default: |
|
states = []int64{StateOpen, StatePending, StateOpenPending, StateReject, StateOpenReject, StateLock, StateAutoPass, StateAutoLock, StateRePending, StateRePass, StateReReject} |
|
} |
|
return |
|
} |
|
|
|
// CompleteURL adds host on path. |
|
func CompleteURL(path string) (url string) { |
|
if path == "" { |
|
// url = "http://static.hdslb.com/images/transparent.gif" |
|
return |
|
} |
|
url = path |
|
if strings.Index(path, "//") == 0 || strings.Index(path, "http://") == 0 || strings.Index(path, "https://") == 0 { |
|
return |
|
} |
|
url = "https://i0.hdslb.com" + url |
|
return |
|
} |
|
|
|
// CleanURL cuts host. |
|
func CleanURL(url string) (path string) { |
|
path = string(cleanURLRegexp.ReplaceAll([]byte(url), nil)) |
|
return |
|
} |
|
|
|
// CompleteURLs . |
|
func CompleteURLs(paths []string) (urls []string) { |
|
for _, v := range paths { |
|
urls = append(urls, CompleteURL(v)) |
|
} |
|
return |
|
} |
|
|
|
// CleanURLs . |
|
func CleanURLs(urls []string) (paths []string) { |
|
for _, v := range urls { |
|
paths = append(paths, CleanURL(v)) |
|
} |
|
return |
|
} |
|
|
|
// Recommends model |
|
type Recommends [][]*Recommend |
|
|
|
func (as Recommends) Len() int { return len(as) } |
|
func (as Recommends) Less(i, j int) bool { |
|
return as[i][0].Position > as[j][0].Position |
|
} |
|
func (as Recommends) Swap(i, j int) { as[i], as[j] = as[j], as[i] } |
|
|
|
// RecommendHome . |
|
type RecommendHome struct { |
|
RecommendPlus |
|
Categories []*Category `json:"categories"` |
|
IP string `json:"ip"` |
|
} |
|
|
|
// RecommendPlus . |
|
type RecommendPlus struct { |
|
Banners []*Banner `json:"banners"` |
|
Articles []*RecommendArtWithLike `json:"articles"` |
|
Ranks []*RankMeta `json:"ranks"` |
|
Hotspots []*Hotspot `json:"hotspots"` |
|
} |
|
|
|
// Banner struct |
|
type Banner struct { |
|
ID int `json:"id"` |
|
Plat int8 `json:"-"` |
|
Position int `json:"index"` |
|
Title string `json:"title"` |
|
Image string `json:"image"` |
|
URL string `json:"url"` |
|
Build int `json:"-"` |
|
Condition string `json:"-"` |
|
Rule string `json:"-"` |
|
ResID int `json:"resource_id"` |
|
ServerType int `json:"server_type"` |
|
CmMark int `json:"cm_mark"` |
|
IsAd bool `json:"is_ad"` |
|
RequestID string `json:"request_id"` |
|
} |
|
|
|
// ConvertPlat convert plat from resource |
|
func ConvertPlat(p int8) (plat int8) { |
|
switch p { |
|
case 0: // resource iphone |
|
plat = PlatPC |
|
case 1: // resource iphone |
|
plat = PlatIPhone |
|
case 2: // resource android |
|
plat = PlatAndroid |
|
case 3: // resource pad |
|
plat = PlatIPad |
|
case 4: // resource iphoneg |
|
plat = PlatIPhoneI |
|
case 5: // resource androidg |
|
plat = PlatAndroidG |
|
case 6: // resource padg |
|
plat = PlatIPadI |
|
case 7: // resource h5 |
|
plat = PlatH5 |
|
case 8: // resource androidi |
|
plat = PlatAndroidI |
|
} |
|
return |
|
} |
|
|
|
// BannerRule . |
|
type BannerRule struct { |
|
Area string `json:"area"` |
|
Hash string `json:"hash"` |
|
Build int `json:"build"` |
|
Condition string `json:"conditions"` |
|
Channel string `json:"channel"` |
|
} |
|
|
|
// NoDistributeAttr check if no distribute |
|
func NoDistributeAttr(attr int32) bool { |
|
meta := Meta{Attributes: attr} |
|
return meta.AttrVal(AttrBitNoDistribute) |
|
} |
|
|
|
// NoRegionAttr check if no region |
|
func NoRegionAttr(attr int32) bool { |
|
meta := Meta{Attributes: attr} |
|
return meta.AttrVal(AttrBitNoRegion) |
|
} |
|
|
|
// AuthorLimit . |
|
type AuthorLimit struct { |
|
Limit int `json:"limit"` |
|
State int `json:"state"` |
|
Rtime xtime.Time `json:"rtime"` |
|
} |
|
|
|
// Forbid . |
|
func (a *AuthorLimit) Forbid() bool { |
|
// state -1 未通过 0待审 1通过 2关闭 3忽略 |
|
if a == nil { |
|
return false |
|
} |
|
if a.State == AuthorStatePass { |
|
return false |
|
} |
|
return true |
|
} |
|
|
|
// Pass . |
|
func (a *AuthorLimit) Pass() bool { |
|
return (a != nil) && (a.State == AuthorStatePass) |
|
} |
|
|
|
// Notice notice |
|
type Notice struct { |
|
ID int64 `json:"id"` |
|
Title string `json:"title"` |
|
Content string `json:"content"` |
|
URL string `json:"url"` |
|
Plat int `json:"-"` |
|
Condition int `json:"-"` |
|
Build int `json:"-"` |
|
} |
|
|
|
// MoreArts . |
|
type MoreArts struct { |
|
Articles []*Meta `json:"articles"` |
|
Total int `json:"total"` |
|
ReadCount int64 `json:"read_count"` |
|
Author *AccountCard `json:"author"` |
|
Attention bool `json:"attention"` |
|
} |
|
|
|
// AccountCard . |
|
type AccountCard struct { |
|
Mid string `json:"mid"` |
|
Name string `json:"name"` |
|
Approve bool `json:"approve"` |
|
Sex string `json:"sex"` |
|
Rank string `json:"rank"` |
|
Face string `json:"face"` |
|
DisplayRank string `json:"DisplayRank"` |
|
Regtime int64 `json:"regtime"` |
|
Spacesta int `json:"spacesta"` |
|
Birthday string `json:"birthday"` |
|
Place string `json:"place"` |
|
Description string `json:"description"` |
|
Article int `json:"article"` |
|
Attentions []int64 `json:"attentions"` |
|
Fans int `json:"fans"` |
|
Friend int `json:"friend"` |
|
Attention int `json:"attention"` |
|
Sign string `json:"sign"` |
|
LevelInfo struct { |
|
Cur int `json:"current_level"` |
|
Min int `json:"current_min"` |
|
NowExp int `json:"current_exp"` |
|
NextExp interface{} `json:"next_exp"` |
|
} `json:"level_info"` |
|
Pendant struct { |
|
Pid int `json:"pid"` |
|
Name string `json:"name"` |
|
Image string `json:"image"` |
|
Expire int `json:"expire"` |
|
} `json:"pendant"` |
|
Nameplate struct { |
|
Nid int `json:"nid"` |
|
Name string `json:"name"` |
|
Image string `json:"image"` |
|
ImageSmall string `json:"image_small"` |
|
Level string `json:"level"` |
|
Condition string `json:"condition"` |
|
} `json:"nameplate"` |
|
OfficialVerify struct { |
|
Type int `json:"type"` |
|
Desc string `json:"desc"` |
|
} `json:"official_verify"` |
|
Vip struct { |
|
Type int `json:"vipType"` |
|
DueDate int64 `json:"vipDueDate"` |
|
DueRemark string `json:"dueRemark"` |
|
AccessStatus int `json:"accessStatus"` |
|
VipStatus int `json:"vipStatus"` |
|
VipStatusWarn string `json:"vipStatusWarn"` |
|
} `json:"vip"` |
|
} |
|
|
|
// FromCard from account card. |
|
func (ac *AccountCard) FromCard(card *account.Card) { |
|
ac.Mid = strconv.FormatInt(card.Mid, 10) |
|
ac.Name = card.Name |
|
// ac.Approve = |
|
ac.Sex = card.Sex |
|
ac.Rank = strconv.FormatInt(int64(card.Rank), 10) |
|
ac.Face = card.Face |
|
ac.DisplayRank = strconv.FormatInt(int64(card.Rank), 10) |
|
// ac.Regtime = |
|
// ac.Spacesta = |
|
// ac.Birthday = |
|
// ac.Place = |
|
// ac.Description = |
|
// ac.Article = |
|
ac.Attentions = []int64{} |
|
// ac.Fans = |
|
// ac.Friend = |
|
// ac.Attention = |
|
ac.Sign = card.Sign |
|
ac.LevelInfo.Cur = int(card.Level) |
|
ac.Pendant.Pid = card.Pendant.Pid |
|
ac.Pendant.Name = card.Pendant.Name |
|
ac.Pendant.Image = card.Pendant.Image |
|
ac.Pendant.Expire = card.Pendant.Expire |
|
ac.Nameplate.Nid = card.Nameplate.Nid |
|
ac.Nameplate.Name = card.Nameplate.Name |
|
ac.Nameplate.Image = card.Nameplate.Image |
|
ac.Nameplate.ImageSmall = card.Nameplate.ImageSmall |
|
ac.Nameplate.Level = card.Nameplate.Level |
|
ac.Nameplate.Condition = card.Nameplate.Condition |
|
if card.Official.Role == 0 { |
|
ac.OfficialVerify.Type = -1 |
|
} else { |
|
if card.Official.Role <= 2 { |
|
ac.OfficialVerify.Type = 0 |
|
} else { |
|
ac.OfficialVerify.Type = 1 |
|
} |
|
ac.OfficialVerify.Desc = card.Official.Title |
|
} |
|
ac.Vip.Type = int(card.Vip.Type) |
|
ac.Vip.VipStatus = int(card.Vip.Status) |
|
ac.Vip.DueDate = card.Vip.DueDate |
|
} |
|
|
|
// FromProfileStat . |
|
func (ac *AccountCard) FromProfileStat(card *account.ProfileStat) { |
|
ac.Mid = strconv.FormatInt(card.Mid, 10) |
|
ac.Name = card.Name |
|
// ac.Approve = |
|
ac.Sex = card.Sex |
|
ac.Rank = strconv.FormatInt(int64(card.Rank), 10) |
|
ac.Face = card.Face |
|
ac.DisplayRank = strconv.FormatInt(int64(card.Rank), 10) |
|
// ac.Regtime = |
|
// ac.Spacesta = |
|
// ac.Birthday = |
|
// ac.Place = |
|
// ac.Description = |
|
// ac.Article = |
|
ac.Attentions = []int64{} |
|
ac.Fans = int(card.Follower) |
|
// ac.Friend = |
|
// ac.Attention = |
|
ac.Sign = card.Sign |
|
ac.LevelInfo.Cur = int(card.Level) |
|
ac.Pendant.Pid = card.Pendant.Pid |
|
ac.Pendant.Name = card.Pendant.Name |
|
ac.Pendant.Image = card.Pendant.Image |
|
ac.Pendant.Expire = card.Pendant.Expire |
|
ac.Nameplate.Nid = card.Nameplate.Nid |
|
ac.Nameplate.Name = card.Nameplate.Name |
|
ac.Nameplate.Image = card.Nameplate.Image |
|
ac.Nameplate.ImageSmall = card.Nameplate.ImageSmall |
|
ac.Nameplate.Level = card.Nameplate.Level |
|
ac.Nameplate.Condition = card.Nameplate.Condition |
|
if card.Official.Role == 0 { |
|
ac.OfficialVerify.Type = -1 |
|
} else { |
|
if card.Official.Role <= 2 { |
|
ac.OfficialVerify.Type = 0 |
|
} else { |
|
ac.OfficialVerify.Type = 1 |
|
} |
|
ac.OfficialVerify.Desc = card.Official.Title |
|
} |
|
ac.Vip.Type = int(card.Vip.Type) |
|
ac.Vip.VipStatus = int(card.Vip.Status) |
|
ac.Vip.DueDate = card.Vip.DueDate |
|
} |
|
|
|
// NoticeState . |
|
type NoticeState map[string]bool |
|
|
|
// 数据库为tinyint 长度必须小于7 字段只能追加 |
|
var _noticeStates = []string{"lead", "new"} |
|
|
|
// NewNoticeState . |
|
func NewNoticeState(value int64) (res NoticeState) { |
|
res = make(map[string]bool) |
|
for i, name := range _noticeStates { |
|
res[name] = ((value>>uint(i))&int64(1) == 1) |
|
} |
|
return |
|
} |
|
|
|
// ToInt64 . |
|
func (n NoticeState) ToInt64() (res int64) { |
|
for i, name := range _noticeStates { |
|
if n[name] { |
|
res = res | (1 << uint(i)) |
|
} |
|
} |
|
return |
|
} |
|
|
|
// Activity . |
|
type Activity struct { |
|
ActURL string `json:"act_url"` |
|
Author string `json:"author"` |
|
Cover string `json:"cover"` |
|
Ctime string `json:"ctime"` |
|
Dic string `json:"dic"` |
|
Etime string `json:"etime"` |
|
Flag string `json:"flag"` |
|
H5Cover string `json:"h5_cover"` |
|
ID int64 `json:"id"` |
|
Letime string `json:"letime"` |
|
Level string `json:"level"` |
|
Lstime string `json:"lstime"` |
|
Mtime string `json:"mtime"` |
|
Name string `json:"name"` |
|
Oid int64 `json:"oid"` |
|
State int64 `json:"state"` |
|
Stime string `json:"stime"` |
|
Tags string `json:"tags"` |
|
Type int64 `json:"type"` |
|
Uetime string `json:"uetime"` |
|
Ustime string `json:"ustime"` |
|
} |
|
|
|
// SkyHorseResp response |
|
type SkyHorseResp struct { |
|
Code int `json:"code"` |
|
Data []struct { |
|
ID int64 `json:"id"` |
|
AvFeature string `json:"av_feature"` |
|
} `json:"data"` |
|
UserFeature string `json:"user_feature"` |
|
} |
|
|
|
// CheckBFSImage check bfs file |
|
func CheckBFSImage(src string) bool { |
|
return bfsRegexp.MatchString(src) |
|
} |
|
|
|
// FillDefaultImage . |
|
func (l *List) FillDefaultImage(image string) { |
|
if l != nil && l.ImageURL == "" { |
|
l.ImageURL = image |
|
} |
|
} |
|
|
|
// Articles . |
|
type Articles struct { |
|
*Article |
|
Pre int64 `json:"pre"` |
|
Next int64 `json:"next"` |
|
} |
|
|
|
// ArticleViewList . |
|
type ArticleViewList struct { |
|
Position int `json:"position"` |
|
Aids []int64 `json:"articles_id"` |
|
From string `json:"from"` |
|
Mid int64 `json:"mid"` |
|
Build int `json:"build"` |
|
Buvid string `json:"buvid"` |
|
Plat int8 `json:"plat"` |
|
} |
|
|
|
// TagArts . |
|
type TagArts struct { |
|
Tid int64 `json:"tid"` |
|
Aids []int64 `json:"aids"` |
|
} |
|
|
|
// MediaResp . |
|
type MediaResp struct { |
|
Code int `json:"code"` |
|
Message string `json:"message"` |
|
Result *MediaResult `json:"result"` |
|
} |
|
|
|
// MediaResult . |
|
type MediaResult struct { |
|
Score int32 `json:"score"` |
|
Media struct { |
|
MediaID int64 `json:"media_id"` |
|
Title string `json:"title"` |
|
Cover string `json:"cover"` |
|
Area string `json:"area"` |
|
TypeID int32 `json:"type_id"` |
|
TypeName string `json:"type_name"` |
|
} `json:"media"` |
|
}
|
|
|