Initial commit

This commit is contained in:
Donny
2019-04-22 20:46:32 +08:00
commit 49ab8aadd1
25441 changed files with 4055000 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = [
"task_qa_video_test.go",
"video_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = ["//vendor/github.com/smartystreets/goconvey/convey:go_default_library"],
)
go_library(
name = "go_default_library",
srcs = [
"archive.go",
"log.go",
"oper.go",
"params.go",
"review.go",
"task.go",
"task_qa.go",
"task_qa_video.go",
"time.go",
"up_group.go",
"user.go",
"utils.go",
"video.go",
"weight.go",
],
importpath = "go-common/app/admin/main/videoup-task/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/log:go_default_library",
"//library/time:go_default_library",
"//library/xstr:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,123 @@
package model
import (
"go-common/library/time"
)
const (
// UpFromWeb 网页上传
UpFromWeb = int8(0)
// UpFromPGC PGC上传
UpFromPGC = int8(1)
// UpFromWindows Windows客户端上传
UpFromWindows = int8(2)
// UpFromAPP APP上传
UpFromAPP = int8(3)
// UpFromMAC Mac客户端上传
UpFromMAC = int8(4)
// UpFromSecretPGC 机密PGC上传
UpFromSecretPGC = int8(5)
// UpFromCoopera 合作方嵌套
UpFromCoopera = int8(6)
// UpFromCreator 创作姬上传
UpFromCreator = int8(7)
// UpFromAndroid 安卓上传
UpFromAndroid = int8(8)
// UpFromIOS IOS上传
UpFromIOS = int8(9)
// AttrYes attribute yes
AttrYes = int32(1)
// AttrNo attribute no
AttrNo = int32(0)
// StateForbidUpDelete 用户删除
StateForbidUpDelete = int8(-100)
)
var (
_bits = map[uint]string{
AttrBitNoRank: "排行禁止",
AttrBitNoDynamic: "动态禁止",
AttrBitNoWeb: "禁止web端输出",
AttrBitNoMobile: "禁止移动端输出",
AttrBitNoSearch: "禁止搜索",
AttrBitOverseaLock: "海外禁止",
AttrBitNoRecommend: "推荐禁止",
AttrBitNoReprint: "禁止转载",
AttrBitHasHD5: "高清1080P",
// AttrBitVisitorDm: AttrBitVisitorDm,
AttrBitIsPGC: "PGC",
AttrBitAllowBp: "允许承包",
AttrBitIsBangumi: "番剧",
AttrBitIsPorder: "是否私单",
AttrBitLimitArea: "是否地区限制",
AttrBitAllowTag: "允许操作TAG",
// AttrBitIsFromArcAPI: AttrBitIsFromArcAPI,
AttrBitJumpURL: "跳转",
AttrBitIsMovie: "电影",
AttrBitBadgepay: "付费",
AttrBitPushBlog: "禁止粉丝动态",
}
_upFromTypes = map[int8]string{
UpFromWeb: "网页上传",
UpFromPGC: "PGC上传",
UpFromWindows: "Windows客户端上传",
UpFromAPP: "APP上传",
UpFromMAC: "Mac客户端上传",
UpFromSecretPGC: "机密PGC上传",
UpFromCoopera: "合作方嵌套",
UpFromCreator: "创作姬上传",
UpFromAndroid: "安卓上传",
UpFromIOS: "IOS上传",
}
)
// BitDesc return bit desc.
func BitDesc(bit uint) (desc string) {
return _bits[bit]
}
// Archive is archive model.
type Archive struct {
Aid int64 `json:"aid"`
Mid int64 `json:"mid"`
TypeID int16 `json:"tid"`
HumanRank int `json:"-"`
Title string `json:"title"`
Author string `json:"-"`
Cover string `json:"cover"`
RejectReason string `json:"reject_reason"`
Tag string `json:"tag"`
Duration int64 `json:"duration"`
Copyright int8 `json:"copyright"`
Desc string `json:"desc"`
MissionID int64 `json:"mission_id"`
Round int8 `json:"-"`
Forward int64 `json:"-"`
Attribute int32 `json:"attribute"`
Access int16 `json:"-"`
State int8 `json:"state"`
Source string `json:"source"`
NoReprint int32 `json:"no_reprint"`
OrderID int64 `json:"order_id"`
Dynamic string `json:"dynamic"`
DTime time.Time `json:"dtime"`
PTime time.Time `json:"ptime"`
CTime time.Time `json:"ctime"`
MTime time.Time `json:"-"`
}
// Type is archive type info
type Type struct {
ID int16 `json:"id"`
PID int16 `json:"pid"`
Name string `json:"name"`
Desc string `json:"description"`
}
// UpFrom get upfrom desc
func UpFrom(ufID int8) string {
return _upFromTypes[ufID]
}

View File

@@ -0,0 +1,42 @@
package model
const (
//LogClientVideo 视频business id
LogClientVideo = int(2)
//LogClientTypeVideo 视频 type id
LogClientTypeVideo = int(1)
//LogClientConsumer 一审任务 business id
LogClientConsumer = int(131)
//LogClientTypeConsumer 一审任务type id
LogClientTypeConsumer = int(1)
)
// SearchLogResult is.
type SearchLogResult struct {
Code int `json:"code"`
Data struct {
Order string `json:"order"`
Sort string `json:"sort"`
Result []struct {
UID int64 `json:"uid"`
Uname string `json:"uname"`
OID int64 `json:"oid"`
Type int8 `json:"type"`
Action string `json:"action"`
Str0 string `json:"str_0"`
Str1 string `json:"str_1"`
Str2 string `json:"str_2"`
Int0 int `json:"int_0"`
Int1 int `json:"int_1"`
Int2 int `json:"int_2"`
Ctime string `json:"ctime"`
Extra string `json:"extra_data"`
} `json:"result"`
Page struct {
Num int `json:"num"`
Size int `json:"size"`
Total int `json:"total"`
} `json:"page"`
} `json:"data"`
}

View File

@@ -0,0 +1,151 @@
package model
import (
"fmt"
)
// .
const (
// OperTypeMission 活动id被修改
OperTypeMission = int8(1)
// OperTypeTag tag被修改
OperTypeTag = int8(2)
// OperTypeCopyright 版权类型被修改
OperTypeCopyright = int8(3)
// OperTypeTypeID 分区ID被修改
OperTypeTypeID = int8(4)
// OperTypeRejectReason 打回理由被修改
OperTypeRejectReason = int8(5)
// OperTypeForwardID 转车跳转被修改
OperTypeForwardID = int8(6)
// OperTypeFlowID 私单类型被修改
OperTypeFlowID = int8(7)
// OperTypeDelay 定时发布被修改
OperTypeDelay = int8(8)
// OperTypeReply 评论开关被修改
OperTypeReply = int8(9)
// OperTypePtime 发布时间被修改
OperTypePtime = int8(10)
// OperTypeAccess 可见属性被修改
OperTypeAccess = int8(11)
// OperTypeAduitReason 审核理由被修改
OperTypeAduitReason = int8(12)
// OperTypeRecicleTag 打回理由被修改
OperTypeRecicleTag = int8(13)
// OperTypeTaskID 任务ID被修改
OperTypeTaskID = int8(14)
// OperTypeOpenTag 通过Tag被修改
OperTypeOpenTag = int8(15)
// OperTypeDynamic 动态描述被修改
OperTypeDynamic = int8(16)
OperNotify = int8(17)
//私单
OperPorderIndustryID = int8(18)
OperPorderOfficial = int8(19)
OperPorderBrandID = int8(20)
OperPorderBrandName = int8(21)
OperPorderShowType = int8(22)
OperPorderAdvertiser = int8(23)
OperPorderAgent = int8(24)
OperPorderShowFront = int8(25)
//频道回查属性
OperFlowAttrNoChannel = int8(26)
OperFlowAttrNoHot = int8(27)
// OperStyleOne 操作展示类型1[%s]从[%v]设为[%v]
OperStyleOne = int8(1)
// OperStyleTwo 操作展示类型2[%s]%v:%v
OperStyleTwo = int8(2)
)
//VOper video oper
type VOper struct {
ID int64 `json:"id"`
AID int64 `json:"aid"`
UID int64 `json:"uid"`
VID int64 `json:"vid"`
Status int16 `json:"status"`
Content string `json:"content"`
Attribute int64 `json:"attribute"`
LastID int64 `json:"last_id"`
Remark string `json:"remark"`
CTime string `json:"ctime"`
}
//VideoOperInfo video oper with user info
type VideoOperInfo struct {
VOper
UserDepart
}
var (
_operType = map[int8]string{
OperTypeMission: "活动ID",
OperTypeTag: "TAG内容",
OperTypeCopyright: "投稿类型",
OperTypeTypeID: "分区类型",
OperTypeRejectReason: "回查理由",
OperTypeForwardID: "撞车跳转",
OperTypeFlowID: "流量TAG",
OperTypeDelay: "定时发布",
OperTypeReply: "评论开关",
OperTypePtime: "发布时间",
OperTypeAccess: "可见属性",
OperTypeAduitReason: "审核理由",
OperTypeRecicleTag: "打回Tag",
OperTypeTaskID: "任务ID",
OperTypeOpenTag: "通过Tag",
OperTypeDynamic: "动态描述",
OperNotify: "系统通知",
OperPorderIndustryID: "推广行业",
OperPorderOfficial: "是否官方",
OperPorderBrandID: "推广品牌ID",
OperPorderBrandName: "推广品牌",
OperPorderShowType: "推广形式",
OperPorderAdvertiser: "广告主",
OperPorderAgent: "代理商",
OperPorderShowFront: "是否前端展示",
OperFlowAttrNoChannel: "频道禁止",
OperFlowAttrNoHot: "热门禁止",
}
)
// ArcOper archive oper.
type ArcOper struct {
ID int64
Aid int64
UID int64
TypeID int16
State int16
Content string
Round int8
Attribute int32
LastID int64
Remark string
}
// VideoOper video oper.
type VideoOper struct {
ID int64
Aid int64
UID int64
Vid int64
Status int16
Content string
Attribute int32
LastID int64
Remark string
}
// Operformat oper format.
func Operformat(tagID int8, old, new interface{}, style int8) (cont string) {
var template string
switch style {
case OperStyleOne:
template = "[%s]从[%v]设为[%v]"
case OperStyleTwo:
template = "[%s]%v:%v"
}
cont = fmt.Sprintf(template, _operType[tagID], old, new)
return
}

View File

@@ -0,0 +1,182 @@
package model
import (
"go-common/library/time"
)
// ListParams query qa vide task list params
type ListParams struct {
AuditStatus []int `form:"auditStatus,split" validate:"omitempty,max=100"`
TaskID []int64 `form:"taskID,split" validate:"omitempty,max=100,dive,gt=0"`
Keyword []string `form:"keyword,split" validate:"omitempty,max=100"`
UPGroup []int64 `form:"upGroup,split" validate:"omitempty,max=100,dive,gt=0"`
UID []int64 `form:"uid,split" validate:"omitempty,max=100,dive,gt=0"`
Limit int `form:"limit" validate:"omitempty,max=1000"`
Seed string `form:"seed"`
ArcTypeID []int64 `form:"arcTypeid[]" validate:"omitempty,max=100,dive,gt=0"`
TagID []int64 `form:"tagID,split" validate:"omitempty,max=100,dive,gt=0"`
State int16 `form:"state"`
CTimeFrom string `form:"ctimeFrom"`
CTimeTo string `form:"ctimeTo"`
FTimeFrom string `form:"ftimeFrom"`
FTimeTo string `form:"ftimeTo"`
FansFrom int64 `form:"fansFrom"`
FansTo int64 `form:"fansTo"`
Order string `form:"order" default:"id"`
Sort string `form:"sort" default:"desc"`
Ps int `form:"ps" default:"50" validate:"omitempty,gt=0,max=100"`
Pn int `form:"pn" default:"1" validate:"omitempty,gt=0"`
}
//AddVideoParams add qa video task params
type AddVideoParams struct {
OUID int64 `json:"uid"`
Oname string `json:"username"`
VideoDetail
}
//QASubmitParams submit qa video task params
type QASubmitParams struct {
ID int64 `json:"id" form:"id" validate:"required,gt=0"`
AuditStatus int16 `json:"audit_status" form:"auditStatus"`
Encoding int32 `json:"encoding" form:"encoding"`
Norank int32 `json:"norank" form:"norank"`
Nodynamic int32 `json:"nodynamic" form:"nodynamic"`
PushBlog int32 `json:"push_blog" form:"push_blog"`
Norecommend int32 `json:"norecommend" form:"norecommend"`
Nosearch int32 `json:"nosearch" form:"nosearch"`
OverseaBlock int32 `json:"oversea_block" form:"oversea_block"`
TagID int64 `json:"tag_id" form:"tagID" validate:"omitempty,gt=0"`
ReasonID int64 `json:"reason_id" form:"reasonID" validate:"omitempty,gt=0"`
Reason string `json:"reason" form:"reason"`
Note string `json:"note" form:"note"`
QaTagID int64 `json:"qa_tag_id" form:"qaTagid" validate:"required,gt=0"`
QATag string `json:"qa_tag" form:"qaTag" validate:"required"`
QaNote string `json:"qa_note" form:"qaNote"`
}
//TaskVideoItem qa vide task list item
type TaskVideoItem struct {
ID int64 `json:"id"`
DetailID int64 `json:"detail_id"`
TaskID int64 `json:"task_id"`
TaskUTime int64 `json:"task_utime"`
CTime string `json:"ctime"`
FTime string `json:"ftime"`
AuditStatus int16 `json:"audit_status"`
TagID int64 `json:"audit_tagid"`
MID int64 `json:"mid"`
UPName string `json:"up_name"`
UPGroups []int64 `json:"up_groups"`
UPGroupList []*UPGroup `json:"up_group_list"`
Fans int64 `json:"fans"`
ArcTitle string `json:"arc_title"`
ArcTypeid int64 `json:"arc_typeid"`
UID int64 `json:"uid"`
User *UserRole `json:"user"`
State int16 `json:"state"`
StateName string `json:"state_name"`
}
//Page page
type Page struct {
Num int `json:"num"`
Size int `json:"size"`
Total int `json:"total"`
}
//QAVideoList qa video task list return struct
type QAVideoList struct {
Result []*TaskVideoItem `json:"result"`
Page Page `json:"page"`
}
// VideoParam video struct
type VideoParam struct { // TODO: batch param
ID int64 `json:"id"`
Filename string `json:"filename"`
Aid int64 `json:"aid"`
Mid int64 `json:"mid"`
RegionID int16 `json:"region_id"`
VideoDesign *VideoDesign `json:"video_design,omitempty"`
Status int16 `json:"status"`
CTime time.Time `json:"ctime"`
Cid int64 `json:"cid,omitempty"`
Title string `json:"title,omitempty"`
Desc string `json:"desc,omitempty"`
Index int `json:"index,omitempty"`
SrcType string `json:"src_type,omitempty"`
Playurl string `json:"playurl,omitempty"`
FailCode int8 `json:"failinfo,omitempty"`
Duration int64 `json:"duration,omitempty"`
XcodeState int8 `json:"xcode_state,omitempty"`
Attribute int32 `json:"attribute,omitempty"`
Filesize int64 `json:"filesize,omitempty"`
WebLink string `json:"weblink,omitempty"`
Resolutions string `json:"resolutions,omitempty"`
Encoding int8 `json:"encoding"`
EncodePurpose string `json:"encode_purpose,omitempty"`
UID int64 `json:"uid,omitempty"`
TaskID int64 `json:"task_id,omitempty"`
Oname string `json:"oname,omitempty"`
TagID int64 `json:"tag_id,omitempty"`
Reason string `json:"reason,omitempty"`
ReasonID int64 `json:"reject_reason_id,omitempty"`
Note string `json:"note,omitempty"`
Attrs *AttrParam `json:"attrs,omitempty"`
Fans int64 `json:"-"`
CateID int64 `json:"-"`
UpFrom int8 `json:"-"`
TaskState int8 `json:"-"`
TypeID int16 `json:"-"`
}
// AttrParam bit
type AttrParam struct {
NoRank int32 `json:"no_rank,omitempty"` // 0
NoDynamic int32 `json:"no_dynamic,omitempty"` // 1
NoWeb int32 `json:"no_web,omitempty"` // 2
NoMobile int32 `json:"no_mobile,omitempty"` // 3
NoSearch int32 `json:"no_search,omitempty"` // 4
OverseaLock int32 `json:"oversea_block,omitempty"` // 5
NoRecommend int32 `json:"no_recommend,omitempty"` // 6
NoReprint int32 `json:"no_reprint,omitempty"` // 7
HasHD5 int32 `json:"is_hd,omitempty"` // 8
IsPGC int32 `json:"is_pgc,omitempty"` // 9
AllowBp int32 `json:"allow_bp,omitempty"` // 10
IsBangumi int32 `json:"is_bangumi,omitempty"` // 11
IsPorder int32 `json:"is_porder,omitempty"` // 12
LimitArea int32 `json:"limit_area,omitempty"` // 13
AllowTag int32 `json:"allow_tag,omitempty"` // 14
JumpURL int32 `json:"is_jumpurl,omitempty"` // 16
IsMovie int32 `json:"is_movie,omitempty"` // 17
BadgePay int32 `json:"is_pay,omitempty"` // 18
PushBlog int32 `json:"push_blog,omitempty"` // 20
}
// VideoDesign mosaic and watermark
type VideoDesign struct {
Mosaic []*Mosaic `json:"mosaic,omitempty"`
WaterMark []*WaterMark `json:"watermark,omitempty"`
}
// Mosaic .
type Mosaic struct {
X int64 `json:"x" form:"mosaic[0][x]"`
Y int64 `json:"y" form:"mosaic[0][y]"`
W int64 `json:"w" form:"mosaic[0][w]"`
H int64 `json:"h" form:"mosaic[0][h]"`
Start int64 `json:"start" form:"mosaic[0][start]"`
End int64 `json:"end" form:"mosaic[0][end]"`
}
// WaterMark .
type WaterMark struct {
LOC int8 `json:"loc,omitempty"`
URL string `json:"url,omitempty"`
MD5 string `json:"md5,omitempty"`
Start int64 `json:"start,omitempty"`
End int64 `json:"end,omitempty"`
X int64 `json:"x,omitempty"`
Y int64 `json:"y,omitempty"`
}

View File

@@ -0,0 +1,163 @@
package model
import (
"context"
"sync"
"time"
"go-common/library/log"
)
// ReviewConf 复审配置
type ReviewConf struct {
ID int64 `json:"id" form:"id"`
Types []int64 `json:"types" form:"types,split"` // 分区
mtp map[int16]struct{}
UpFroms []int64 `json:"upfroms" form:"upfroms,split"` // 投稿来源
muf map[int8]struct{}
UpGroups []int64 `json:"upgroups" form:"upgroups,split"` // 用户组
mug map[int8]struct{}
Uids []int64 `json:"uids" form:"uids,split"` // 指定uid
Unames []string `json:"unames"` // 指定uid
muid map[int64]struct{}
FansLow int64 `json:"fanslow" form:"fanslow"` // 粉丝数最低值
FansHigh int64 `json:"fanshigh" form:"fanshigh"` // 粉丝数最高
Bt FormatTime `json:"bt" form:"bt"`
Et FormatTime `json:"et" form:"et"`
State int8 `json:"state" form:"state"`
UID int64 `json:"uid"`
Uname string `json:"uname"`
Desc string `json:"desc" form:"desc"`
Mt FormatTime `json:"mt"`
}
// Refresh refresh
func (r *ReviewConf) Refresh() {
mtp := make(map[int16]struct{})
muf := make(map[int8]struct{})
mug := make(map[int8]struct{})
muid := make(map[int64]struct{})
for _, tp := range r.Types {
mtp[int16(tp)] = struct{}{}
}
for _, uf := range r.UpFroms {
muf[int8(uf)] = struct{}{}
}
for _, ug := range r.UpGroups {
mug[int8(ug)] = struct{}{}
}
for _, uid := range r.Uids {
muid[uid] = struct{}{}
}
r.mtp = mtp
r.muf = muf
r.mug = mug
r.muid = muid
}
// SubmitForm form
type SubmitForm struct {
Status int16 `json:"status" form:"status"`
ID int64 `json:"id" form:"id"`
CID int64 `json:"cid" form:"cid"`
AID int64 `json:"aid" form:"aid"`
MID int64 `json:"mid" form:"mid"`
Eptitle string `json:"eptitle,omitempty" form:"eptitle"`
Description string `json:"description,omitempty" form:"description"`
Note string `json:"note,omitempty" form:"note"`
ReasonID int64 `json:"reason_id,omitempty" form:"reason_id"`
Reason string `json:"reason,omitempty" form:"reason"`
TID int64 `json:"tid,omitempty" form:"tid"`
Norank int32 `json:"norank" form:"norank"`
Noindex int32 `json:"noindex" form:"noindex"`
PushBlog int32 `json:"push_blog" form:"push_blog"`
NoRecommend int32 `json:"norecommend" form:"norecommend"`
Nosearch int32 `json:"nosearch" form:"nosearch"`
OverseaBlock int32 `json:"oversea_block" form:"oversea_block"`
Encoding int8 `json:"encoding" form:"encoding"`
TaskID int64 `json:"task_id" form:"task_id"`
UID int64 `json:"uid" form:"uid"`
Uname string `json:"uname" form:"uname"`
}
// ReviewCache 快速判断配置项是否命中
type ReviewCache struct {
MRC map[int64]*ReviewConf
Mux sync.RWMutex
}
// NewRC 复审配置
func NewRC() *ReviewCache {
rc := &ReviewCache{}
rc.MRC = make(map[int64]*ReviewConf)
return rc
}
// Check 检查配置是否命中
func (rc *ReviewCache) Check(c context.Context, opt *TaskPriority, uid int64) bool {
rc.Mux.RLock()
defer rc.Mux.RUnlock()
if len(rc.MRC) == 0 {
log.Info("ReviewCache empty")
return false
}
log.Info("ReviewCache opt(%+v) uid(%d),", opt, uid)
for id, item := range rc.MRC {
log.Info("ReviewCache config(%+v)", item)
if item.State != 0 {
continue
}
bt := item.Bt.TimeValue()
et := item.Et.TimeValue()
if bt.After(time.Now()) || (!et.IsZero() && et.Before(time.Now())) {
continue
}
if len(item.mtp) > 0 {
if _, ok := item.mtp[opt.TypeID]; !ok {
continue
}
}
if len(item.muf) > 0 {
if _, ok := item.muf[opt.UpFrom]; !ok {
continue
}
}
if len(item.mug) > 0 {
var hit bool
for _, ug := range opt.UpGroups {
if _, ok := item.mug[ug]; ok {
hit = true
break
}
}
if !hit {
continue
}
}
if len(item.muid) > 0 {
if _, ok := item.muid[uid]; !ok {
continue
}
}
if item.FansHigh > 0 {
if opt.Fans < item.FansLow || opt.Fans > item.FansHigh {
continue
}
}
log.Info("ReviewCache task(%d) hit config(%d)", opt.TaskID, id)
return true
}
return false
}

View File

@@ -0,0 +1,391 @@
package model
import (
"time"
"go-common/library/log"
"go-common/library/xstr"
)
var (
// TookTypeMinute video task took time in 1 minute
TookTypeMinute = int8(1)
// TookTypeHalfHour video task took time in 10 minutes
TookTypeHalfHour = int8(2)
// TaskStateUnclaimed video task belongs to nobody
TaskStateUnclaimed = int8(0)
// TaskStateUntreated video task not submit
TaskStateUntreated = int8(1)
// TaskStateCompleted video task completed
TaskStateCompleted = int8(2)
// TaskStateDelayed video task delayed
TaskStateDelayed = int8(3)
// TaskStateClosed video task closed
TaskStateClosed = int8(4)
// PoolForFirst 一审任务池
PoolForFirst = int8(0)
// PoolForSecond 二审任务池
PoolForSecond = int8(1)
// TypeRealTime 实时任务
TypeRealTime = int8(0)
// TypeDispatched 已分发任务
TypeDispatched = int8(1)
// TypeFinished 结束任务
TypeFinished = int8(2)
// TypeDelay 延时任务
TypeDelay = int8(3)
// TypeReview 复审任务
TypeReview = int8(5)
// TypeUpDelete 已删除任务
TypeUpDelete = int8(6)
// TypeSpecialWait 特殊停滞任务
TypeSpecialWait = int8(7)
// SubjectForNormal 普通任务
SubjectForNormal = int8(0) //normal task subject
// SubjectForTask 指派任务
SubjectForTask = int8(1) //specified task subject
_taskdispatchstate = map[int8]struct{}{
TypeRealTime: {},
TypeDispatched: {},
TypeFinished: {},
TypeDelay: {},
TypeReview: {},
TypeUpDelete: {},
TypeSpecialWait: {},
}
// WLVConf 默认值
WLVConf = &WeightVC{
MaxWeight: int64(200000), //最大权重值
SubRelease: int64(18), //指派再释放的任务
//特殊任务参数
Slv1: int64(8), // 普通用户>=1W粉
Slv2: int64(10), // 普通用户>=10W粉
Slv3: int64(12), // 优质用户<1W粉
Slv4: int64(15), // 优质用户>=1W粉
Slv5: int64(18), // 优质用户>=10W粉
Slv6: int64(6), // 高危用户>=10W粉
Slv7: int64(0), // 其他高危
//普通任务参数
Nlv1: int64(3), // 等待时长 9-15
Nlv2: int64(6), // 等待时长 15-27
Nlv3: int64(9), // 等待时长 27-45
Nlv4: int64(12), // 等待时长 >45
Nlv5: int64(0), // 等待时长 <=9
//定时任务参数
Tlv1: int64(3), // 距离发布2h-4h
Tlv2: int64(9), // 距离发布1-2h
Tlv3: int64(21), // 距离发布 <1h
Tlv4: int64(0), // 距离发布 > 4h
}
)
const (
// ActionHandsUP 0签入
ActionHandsUP = int8(0)
// ActionHandsOFF 1签出
ActionHandsOFF = int8(1)
// ActionSubmit 2提交
ActionSubmit = int8(2)
// ActionDelay 3延迟
ActionDelay = int8(3)
// ActionClose 4关闭
ActionClose = int8(4)
//ActionOldSubmit 5旧一审提交
ActionOldSubmit = int8(5)
//ActionTaskDelete 10任务删除
ActionTaskDelete = int8(10)
//ActionDispatch 分配
ActionDispatch = int8(6)
//ActionRelease 释放(拒审)
ActionRelease = int8(7)
// WConfMid 按照mid配置权重
WConfMid = int8(0)
// WConfTaskID 按照taskid配置权重
WConfTaskID = int8(1)
// WConfType 按照分区配置权重
WConfType = int8(2)
// WConfUpFrom 按照投稿来源配置权重
WConfUpFrom = int8(3)
// WConfRelease 指派任务释放
WConfRelease = int8(4)
// TimeFormatSec 时间格式化
TimeFormatSec = "2006-01-02 15:04:05"
// TaskLeader 组长
TaskLeader int8 = 1
// TaskMember 组员
TaskMember int8 = 2
)
// MemberStat .
type MemberStat struct {
UID int64 `json:"uid"`
DispatchCount int64 `json:"dispatch"`
ReleaseCount int64 `json:"release"`
SubmitCount int64 `json:"submit"` // 总提交数
OSubmitCount int64 `json:"oldsubmit"` // action=5
NSubmitCount int64 `json:"newsubmit"` // action=2
BelongCount int64 `json:"belong"` // 总推送数 分配到的-释法的
PassCount int64 `json:"pass"` // 提交并且通过的数量
NormalCount int64 `json:"normalCount"` // 普通任务数量
SubjectCount int64 `json:"specialCount"` // 指派任务数量
InTime string `json:"inTime"` // 最近开始时间
QuitTime string `json:"quitTime"` // 最近退出时间
CompleteRate string `json:"completeRate"` // 处理率
PassRate string `json:"passRate"` // 通过率
SumDu int64 `json:"-"`
SumDuration string `json:"videoDuration"` // 累积处理视频总时长
AvgUt float64 `json:"-"`
AvgUtime string `json:"avgTime"` // 单任务平均耗时
}
// CfWeightDesc 权重配置文字描述
func CfWeightDesc(radio int8) (desc string) {
switch radio {
case WConfMid:
desc = "mid配置"
case WConfTaskID:
desc = "taskid配置"
case WConfType:
desc = "分区配置"
case WConfUpFrom:
desc = "投稿来源"
case WConfRelease:
desc = "指派释放"
default:
desc = "其他配置"
}
return
}
// IsDispatch 判断任务状态
func IsDispatch(st int8) bool {
if _, ok := _taskdispatchstate[st]; ok {
return true
}
return false
}
// ParseWeightConf 解析权重配置
func ParseWeightConf(twc *WeightConf, uid int64, uname string) (mcases map[int64]*WCItem, IsTaskID bool, err error) {
var (
ids []int64
)
mcases = make(map[int64]*WCItem)
if ids, err = xstr.SplitInts(twc.Ids); err != nil {
log.Error("ParseWeightConfig Config(%v) parse error(%v) Idlist(%s)", twc, err)
return nil, false, err
}
for _, id := range ids {
wci := &WCItem{
CID: id,
Radio: twc.Radio,
Rule: twc.Rule,
Weight: twc.Weight,
Uname: uname,
Desc: twc.Desc,
Bt: twc.Bt,
Et: twc.Et,
Mtime: NewFormatTime(time.Now()),
}
if twc.Radio == WConfTaskID {
IsTaskID = true
}
mcases[id] = wci
}
return
}
// WeightVC Weight Value Config 权重分值配置
type WeightVC struct {
MaxWeight int64 `json:"maxweight" form:"maxweight" default:"20000"`
SubRelease int64 `json:"subrelease" form:"subrelease" default:"18"`
Slv1 int64 `json:"slv1" form:"slv1" default:"8"`
Slv2 int64 `json:"slv2" form:"slv2" default:"10"`
Slv3 int64 `json:"slv3" form:"slv3" default:"12"`
Slv4 int64 `json:"slv4" form:"slv4" default:"15"`
Slv5 int64 `json:"slv5" form:"slv5" default:"18"`
Slv6 int64 `json:"slv6" form:"slv6" default:"6"`
Slv7 int64 `json:"slv7" form:"slv7" default:"0"`
Nlv1 int64 `json:"nlv1" form:"nlv1" default:"3"`
Nlv2 int64 `json:"nlv2" form:"nlv2" default:"6"`
Nlv3 int64 `json:"nlv3" form:"nlv3" default:"9"`
Nlv4 int64 `json:"nlv4" form:"nlv4" default:"12"`
Nlv5 int64 `json:"nlv5" form:"nlv5" default:"0"`
Tlv1 int64 `json:"tlv1" form:"tlv1" default:"3"`
Tlv2 int64 `json:"tlv2" form:"tlv2" default:"9"`
Tlv3 int64 `json:"tlv3" form:"tlv3" default:"21"`
Tlv4 int64 `json:"tlv4" form:"tlv4" default:"0"`
}
// Task 审核任务
type Task struct {
ID int64 `json:"id"`
Pool int8 `json:"pool"`
Subject int8 `json:"subject"`
AdminID int64 `json:"adminid"`
Aid int64 `json:"aid"`
Cid int64 `json:"cid"`
UID int64 `json:"uid"`
State int8 `json:"state"`
UTime int64 `json:"utime"`
CTime FormatTime `json:"ctime"`
MTime FormatTime `json:"mtime"`
DTime FormatTime `json:"dtime"`
GTime FormatTime `json:"gtime"`
PTime FormatTime `json:"ptime"`
Weight int64 `json:"weight"`
Mid int64 `json:"mid"`
}
// TaskWeightLog 权重变更日志
type TaskWeightLog struct {
TaskID int64 `json:"taskid"`
Mid int64 `json:"mid"`
Weight int64 `json:"weight"`
CWeight int64 `json:"cweight"`
NWeight int64 `json:"nweight"`
SWeight int64 `json:"sweight"`
TWeight int64 `json:"tweight"`
Uptime FormatTime `json:"uptime"`
Creator string `json:"creator"` //创作者
UpSpecial []int8 `json:"upspecial"` //标记是否优质,劣质用户
Fans int64 `json:"fans"` //粉丝数
Wait float64 `json:"wait"` //等待时长
Ptime string `json:"ptime,omitempty"`
CfItems []*WCItem `json:"cfitems,omitempty"`
Desc string `json:"desc,omitempty"` // 配置描述
}
// TaskPriority 任务参数
type TaskPriority struct {
TaskID int64 `json:"taskid"`
Weight int64 `json:"weight"` //权重总值
State int8 `json:"state"` //任务状态
Mid int64 `json:"mid"`
Special int8 `json:"special"` //特殊任务
Ctime FormatTime `json:"ctime"` //任务生成时间
Ptime FormatTime `json:"ptime"` //定时发布时间
CfItems []*WCItem `json:"cfitems,omitempty"`
Fans int64 `json:"fans"` //粉丝数
AccFailed bool `json:"accfaild"` //账号查询是否失败
UpGroups []int8 `json:"ugs"` //分组
UpFrom int8 `json:"upfrom"` //来源
TypeID int16 `json:"typeid"` //分区
}
// WeightConf 任务权重配置
type WeightConf struct {
Radio int8 `form:"radio"` // 0,mid1taskid2分区, 3, 投稿来源
Ids string `form:"ids" validate:"required"` // id列表逗号分隔
Rule int8 `form:"rule"` // 0,动态权重1静态权重
Weight int64 `form:"weight" validate:"required"` // 配置的权重
Desc string `form:"desc" validate:"required"` // 描述信息
Bt FormatTime `form:"bt"` //配置生效开始时间
Et FormatTime `form:"et"` //配置生效结束时间
}
// WCItem task weight config item
type WCItem struct {
Radio int8 `json:"radio"`
ID int64 `json:"id,omitempty"`
CID int64 `json:"cid"` // config id 四种配置通用
UID int64 `json:"uid,omitempty"`
Uname string `json:"user,omitempty"`
TypeName string `json:"typename,omitempty"`
UpFrom string `json:"upfrom,omitempty"`
Rule int8 `json:"rule"`
State int8 `json:"state"`
Weight int64 `json:"weight,omitempty"`
Mtime FormatTime `json:"mtime,omitempty"`
Desc string `json:"desc,omitempty"`
FileName string `json:"filename,omitempty"`
Title string `json:"title,omitempty"`
Vid int64 `json:"vid,omitempty"`
Creator string `json:"creator,omitempty"`
Fans int64 `json:"fans,omitempty"`
Bt FormatTime `json:"bt,omitempty"`
Et FormatTime `json:"et,omitempty"`
}
// Confs 权重配置筛选参数
type Confs struct {
Radio int8 `form:"radio" default:"1"`
Cid int64 `form:"cid" default:"-1"`
Operator string `form:"operator"`
Bt FormatTime `form:"bt"`
Et FormatTime `form:"et"`
Rule int8 `form:"rule" default:"-1"`
State int `form:"state"`
Pn int `form:"page" default:"1"`
Ps int `form:"ps" default:"20"`
}
// TaskTook 一审耗时
type TaskTook struct {
ID int64 `json:"id"`
M90 int `json:"m90"`
M80 int `json:"m80"`
M60 int `json:"m60"`
M50 int `json:"m50"`
TypeID int8 `json:"type"`
Ctime time.Time `json:"ctime"`
Mtime time.Time `json:"-"`
}
// AuthRole 一审任务角色
type AuthRole struct {
ID int64 `json:"id"`
UID int64 `json:"uid"`
Role int8 `json:"role"`
UserName string `json:"username"`
NickName string `json:"nickname"`
Ctime time.Time `json:"ctime"`
Mtime time.Time `json:"mtime"`
}
// Consumers 组员信息
type Consumers struct {
ID int64 `json:"id"`
UID int64 `json:"uid"`
UserName string `json:"username"`
State int8 `json:"state"`
Ctime FormatTime `json:"ctime"`
Mtime FormatTime `json:"mtime"`
LastOut string `json:"lastout,omitempty"`
}
// ConsumerLog 组员日志
type ConsumerLog struct {
UID int64 `json:"uid"`
Uname string `json:"uname"`
Action int8 `json:"action"`
Ctime string `json:"ctime"`
Desc string `json:"desc"`
}
// InQuit 组员日志
type InQuit struct {
Date string `json:"date"`
UID int64 `json:"uid"`
Uname string `json:"uname"`
InTime string `json:"inTime"`
OutTime string `json:"quitTime"`
}
// TaskForLog 释放任务
type TaskForLog struct {
ID int64
Cid int64
Subject int8
Mtime time.Time
}

View File

@@ -0,0 +1,33 @@
package model
import "time"
//qa task state & type & log business/type.
const (
QAStateWait = int16(1)
QAStateFinish = int16(2)
QATypeVideo = int8(1)
LogQATask = 111
LogQATaskVideo = 1
)
//QAStates states.
var (
QAStates = map[int16]string{
QAStateWait: "待质检",
QAStateFinish: "已质检",
}
)
//QATask qatask
type QATask struct {
ID int64 `json:"id"`
State int16 `json:"state"`
Type int8 `json:"type"`
DetailID int64 `json:"detail_id"`
UID int64 `json:"uid"`
FTime time.Time `json:"ftime"`
CTime time.Time `json:"ctime"`
}

View File

@@ -0,0 +1,68 @@
package model
import (
"encoding/json"
)
//VideoDetail qa video task detail
type VideoDetail struct {
CID int64 `json:"cid" validate:"required,gt=0"`
AID int64 `json:"aid" validate:"required,gt=0"`
TaskID int64 `json:"task_id" validate:"omitempty,gt=0"`
TaskUTime int64 `json:"task_utime"`
Attribute int32 `json:"attribute"`
TagID int64 `json:"tag_id" validate:"omitempty,gt=0"`
ArcTitle string `json:"arc_title"`
ArcTypeID int64 `json:"arc_typeid" validate:"required,gt=0"`
AuditStatus int16 `json:"audit_status" `
AuditSubmit string `json:"audit_submit" validate:"required"`
AuditDetails string `json:"audit_details" validate:"required"`
MID int64 `json:"mid" validate:"required,gt=0"`
UPGroups []int64 `json:"up_groups"`
Fans int64 `json:"fans"`
}
//QATaskVideo qa video
type QATaskVideo struct {
QATask
VideoDetail
AttributeList map[string]int32 `json:"attribute_list"`
}
//VideoTaskInfo info
type VideoTaskInfo struct {
QATaskVideo
UPGroupList []*UPGroup `json:"up_group_list"`
Warnings []interface{} `json:"warnings"`
}
//TaskVideoDetail detail
type TaskVideoDetail struct {
Task *VideoTaskInfo `json:"task"`
Video *Video `json:"review"`
VideoHistory []*VideoOperInfo `json:"video_history"`
}
//GetNote get task submit note
func (qv *QATaskVideo) GetNote() (note string, err error) {
submit := map[string]string{}
if err = json.Unmarshal([]byte(qv.AuditSubmit), &submit); err != nil {
return
}
note = submit["note"]
return
}
//GetAttributeList get task submit attribute
func (qv *QATaskVideo) GetAttributeList() {
qv.AttributeList = AttributeList(qv.Attribute)
}
//GetWarnings get task warnings
func (qv *VideoTaskInfo) GetWarnings() {
qv.Warnings = []interface{}{}
for _, g := range qv.UPGroupList {
qv.Warnings = append(qv.Warnings, g)
}
}

View File

@@ -0,0 +1,26 @@
package model
import (
. "github.com/smartystreets/goconvey/convey"
"testing"
)
var qv = &QATaskVideo{
VideoDetail: VideoDetail{
Attribute: 1048691,
UPGroups: []int64{1, 2},
},
}
func TestQATaskVideo_GetAttributeList(t *testing.T) {
Convey("GetAttributeqv.AttributeList", t, func() {
qv.GetAttributeList()
t.Logf("attributeList(%+v)", qv.AttributeList)
So(qv.AttributeList["norank"], ShouldEqual, 1)
So(qv.AttributeList["nosearch"], ShouldEqual, 1)
So(qv.AttributeList["nodynamic"], ShouldEqual, 1)
So(qv.AttributeList["norecommend"], ShouldEqual, 1)
So(qv.AttributeList["oversea_block"], ShouldEqual, 1)
So(qv.AttributeList["push_blog"], ShouldEqual, 1)
})
}

View File

@@ -0,0 +1,58 @@
package model
import (
"database/sql/driver"
"time"
)
// FormatTime format time
type FormatTime string
// NewFormatTime net formatTime
func NewFormatTime(t time.Time) FormatTime {
ft := new(FormatTime)
ft.Scan(t)
return *ft
}
// Scan scan time.
func (jt *FormatTime) Scan(src interface{}) (err error) {
switch sc := src.(type) {
case time.Time:
*jt = FormatTime(sc.Format("2006-01-02 15:04:05"))
case string:
*jt = FormatTime(sc)
}
return
}
// Value get string value.
func (jt FormatTime) Value() (driver.Value, error) {
return string(jt), nil
}
// TimeValue get time value.
func (jt FormatTime) TimeValue() time.Time {
t, _ := time.ParseInLocation("2006-01-02 15:04:05", string(jt), time.Local)
if t.Unix() <= 0 {
t, _ = time.ParseInLocation("2006-01-02 15:04:05", "0000-00-00 00:00:00", time.Local)
}
return t
}
// UnmarshalJSON implement Unmarshaler
func (jt *FormatTime) UnmarshalJSON(data []byte) error {
if data == nil || len(data) <= 1 {
*jt = FormatTime("0000-00-00 00:00:00")
return nil
}
str := string(data[1 : len(data)-1])
st, err := time.Parse(time.RFC3339, str)
if err == nil {
*jt = FormatTime(st.Format("2006-01-02 15:04:05"))
} else {
*jt = FormatTime(str)
}
return nil
}

View File

@@ -0,0 +1,28 @@
package model
const (
//UpperTypeWhite 优质
UpperTypeWhite int8 = 1
//UpperTypeBlack 高危
UpperTypeBlack int8 = 2
//UpperTypePGC 生产组
UpperTypePGC int8 = 3
//UpperTypeUGCX don't know
UpperTypeUGCX int8 = 3
//UpperTypePolitices 时政
UpperTypePolitices int8 = 5
//UpperTypeEnterprise 企业
UpperTypeEnterprise int8 = 7
//UpperTypeSigned 签约
UpperTypeSigned int8 = 15
)
//UPGroup up主所属的所有特殊用户组
type UPGroup struct {
ID int64 `json:"id"`
Tag string `json:"tag"`
ShortTag string `json:"short_tag"`
FontColor string `json:"font_color"` //字体颜色
BgColor string `json:"bg_color"` //背景颜色
Note string `json:"note"`
}

View File

@@ -0,0 +1,15 @@
package model
//UserRole role
type UserRole struct {
UID int64 `json:"uid"`
Name string `json:"username"`
Role int8 `json:"role"`
}
//UserDepart department
type UserDepart struct {
UID int64 `json:"uid"`
Name string `json:"username"`
Department string `json:"department"`
}

View File

@@ -0,0 +1,18 @@
package model
// Pager pager
type Pager struct {
Pn int `json:"num"`
Ps int `json:"size"`
Sum int64 `json:"total"`
}
// ListParser list parser
type ListParser struct {
Unames string `form:"uname"`
Bt string `form:"bt"`
Et string `form:"et"`
Sort string `form:"sort" default:"desc"`
Ps int64 `form:"ps" default:"20"`
Pn int64 `form:"pn" default:"1"`
}

View File

@@ -0,0 +1,151 @@
package model
import (
"time"
)
//video status & attr.
const (
VideoStatusOpen = int16(0)
VideoStatusOrange = int16(10000)
VideoStatusRecycle = int16(-2)
VideoStatusLock = int16(-4)
VideoStatusDelete = -100
ArcStateDelete = -100
RLStateDelete = -100
CopyrightOriginal = int8(1)
VideoXcodeSDFinish = int8(2)
VideoXcodeHDFinish = int8(4)
AttrBitNoRank = uint(0) // NOTE: double write for archive_forbid
// AttrBitNoDynamic 动态禁止
AttrBitNoDynamic = uint(1) // NOTE: double write for archive_forbid
// AttrBitNoWeb 禁止网页输出
AttrBitNoWeb = uint(2)
// AttrBitNoMobile 禁止客户端列表
AttrBitNoMobile = uint(3)
// AttrBitNoSearch 搜索禁止
AttrBitNoSearch = uint(4)
// AttrBitOverseaLock 海外禁止
AttrBitOverseaLock = uint(5)
// AttrBitNoRecommend 禁止推荐
AttrBitNoRecommend = uint(6) // NOTE: double write for archive_forbid
// AttrBitNoReprint 禁止转载
AttrBitNoReprint = uint(7)
// AttrBitHasHD5 是否高清
AttrBitHasHD5 = uint(8)
// AttrBitIsPGC 是否PGC稿件
AttrBitIsPGC = uint(9)
// AttrBitAllowBp 允许承包
AttrBitAllowBp = uint(10)
// AttrBitIsBangumi 是否番剧
AttrBitIsBangumi = uint(11)
// AttrBitIsPorder 是否私单
AttrBitIsPorder = uint(12)
// AttrBitLimitArea 是否限制地区
AttrBitLimitArea = uint(13)
// AttrBitAllowTag 允许其他人添加tag
AttrBitAllowTag = uint(14)
// AttrBitJumpURL 跳转
AttrBitJumpURL = uint(16)
// AttrBitIsMovie 是否影视
AttrBitIsMovie = uint(17)
// AttrBitBadgepay 付费
AttrBitBadgepay = uint(18)
AttrBitPushBlog = uint(20)
)
//qa audit status & attr.
var (
QAAuditStatus = map[int16]string{
VideoStatusOpen: "开放浏览",
VideoStatusOrange: "会员可见",
VideoStatusRecycle: "打回",
VideoStatusLock: "锁定",
}
VideoAttribute = map[uint]string{
AttrBitNoRank: "norank",
AttrBitNoDynamic: "nodynamic",
AttrBitNoWeb: "noweb",
AttrBitNoMobile: "nomobile",
AttrBitNoSearch: "nosearch",
AttrBitOverseaLock: "oversea_block",
AttrBitNoRecommend: "norecommend",
AttrBitNoReprint: "no_reprint",
AttrBitHasHD5: "hd",
AttrBitIsPGC: "is_pgc",
AttrBitAllowBp: "allow_bp",
AttrBitIsBangumi: "bangumi",
AttrBitIsPorder: "is_porder",
AttrBitLimitArea: "limit_area",
AttrBitAllowTag: "allow_tag",
AttrBitJumpURL: "j",
AttrBitIsMovie: "is_movie",
AttrBitBadgepay: "badgepay",
AttrBitPushBlog: "push_blog",
}
)
//Video video info
type Video struct {
ID int64 `json:"id"`
AID int64 `json:"aid"`
CID int64 `json:"cid"`
MID int64 `json:"mid"`
Copyright int8 `json:"copyright"`
TypeID int64 `json:"type_id"`
Status int16 `json:"status"`
Attribute int32 `json:"attribute"`
XcodeState int8 `json:"xcode_state"`
Title string `json:"title"`
Description string `json:"description"`
Filename string `json:"filename"`
TagID int64 `json:"tag_id"`
Reason string `json:"reason"`
Note string `json:"note"`
AttributeList map[string]int32 `json:"attribute_list"`
Encoding int32 `json:"encoding"`
}
//AttributeList get attr as map
func AttributeList(attr int32) (list map[string]int32) {
list = map[string]int32{}
for bit, name := range VideoAttribute {
list[name] = int32(((attr >> bit) & 1))
}
return
}
// AttrSet video Attr set
func (v *Video) AttrSet(attr int32, bit uint) {
v.Attribute = v.Attribute&(^(1 << bit)) | (attr << bit)
}
// ArcVideo is archive_video model.
type ArcVideo struct {
ID int64 `json:"-"`
Aid int64 `json:"aid"`
Title string `json:"title"`
Desc string `json:"desc"`
Filename string `json:"filename"`
SrcType string `json:"-"`
Cid int64 `json:"cid"`
Duration int64 `json:"-"`
Filesize int64 `json:"-"`
Resolutions string `json:"-"`
Index int `json:"index"`
Playurl string `json:"-"`
Status int16 `json:"status"`
StatusDesc string `json:"status_desc"`
FailCode int8 `json:"fail_code"`
FailDesc string `json:"fail_desc"`
XcodeState int8 `json:"xcode"`
Attribute int32 `json:"-"`
RejectReason string `json:"reject_reason"`
WebLink string `json:"weblink"`
CTime time.Time `json:"ctime"`
MTime time.Time `json:"-"`
}

View File

@@ -0,0 +1,18 @@
package model
import (
"github.com/smartystreets/goconvey/convey"
"testing"
)
func Test_attribute(t *testing.T) {
list := AttributeList(1048691)
convey.Convey("属性列表", t, func() {
convey.So(list["norank"], convey.ShouldEqual, 1)
convey.So(list["nosearch"], convey.ShouldEqual, 1)
convey.So(list["nodynamic"], convey.ShouldEqual, 1)
convey.So(list["norecommend"], convey.ShouldEqual, 1)
convey.So(list["oversea_block"], convey.ShouldEqual, 1)
convey.So(list["push_blog"], convey.ShouldEqual, 1)
})
}

View File

@@ -0,0 +1,6 @@
package model
const (
// ConfForWeightVC 权重配置
ConfForWeightVC = "weight_conf_values"
)