Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

21
app/job/main/card/BUILD Normal file
View File

@@ -0,0 +1,21 @@
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/job/main/card/cmd:all-srcs",
"//app/job/main/card/conf:all-srcs",
"//app/job/main/card/dao:all-srcs",
"//app/job/main/card/model:all-srcs",
"//app/job/main/card/server/http:all-srcs",
"//app/job/main/card/service:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,8 @@
# v1.0.2
>1. fix sync.WaitGroup issue #417
# v1.0.1
1. 过滤vip信息更新Action
# v1.0.0
1. 卡片一期

View File

@@ -0,0 +1,7 @@
# Owner
zhaogangtao
# Author
yubaihai
# Reviewer
zhaogangtao

14
app/job/main/card/OWNERS Normal file
View File

@@ -0,0 +1,14 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- yubaihai
- zhaogangtao
labels:
- job
- job/main/card
- main
options:
no_parent_owners: true
reviewers:
- yubaihai
- zhaogangtao

View File

@@ -0,0 +1,12 @@
# card-job
# 项目简介
1.
# 编译环境
# 依赖包
# 编译执行

View File

@@ -0,0 +1 @@
# HTTP API文档

View File

@@ -0,0 +1,43 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "cmd",
embed = [":go_default_library"],
tags = ["automanaged"],
)
go_library(
name = "go_default_library",
srcs = ["main.go"],
data = ["test.toml"],
importpath = "go-common/app/job/main/card/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/card/conf:go_default_library",
"//app/job/main/card/server/http:go_default_library",
"//app/job/main/card/service:go_default_library",
"//library/log:go_default_library",
"//library/net/trace: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,44 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"go-common/app/job/main/card/conf"
"go-common/app/job/main/card/server/http"
"go-common/app/job/main/card/service"
"go-common/library/log"
"go-common/library/net/trace"
)
func main() {
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
log.Init(conf.Conf.Log)
defer log.Close()
log.Info("card-job start")
trace.Init(conf.Conf.Tracer)
defer trace.Close()
svc := service.New(conf.Conf)
http.Init(conf.Conf, svc)
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
log.Info("get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
svc.Close()
log.Info("card-job exit")
svc.Wait()
return
case syscall.SIGHUP:
default:
return
}
}
}

View File

@@ -0,0 +1,61 @@
version = "1.0.0"
user = "nobody"
pid = "/tmp/card-job.pid"
dir = "./"
perf = "0.0.0.0:6330"
family = "card-job"
address = "0.0.0.0"
[bm]
addr = "0.0.0.0:7901"
maxListen = 1000
timeout = "1s"
[RPCClient2]
[mysql]
addr = "127.0.0.1:3306"
dsn = "root:123456@tcp(127.0.0.1:3306)/bilibili_card?timeout=3s&readTimeout=3s&writeTimeout=3s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 20
idle = 10
idleTimeout ="4h"
queryTimeout = "1s"
execTimeout = "1s"
tranTimeout = "2s"
[mysql.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[memcache]
name = "card-service"
proto = "tcp"
addr = "172.18.33.60:11234"
idle = 5
active = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "10s"
expire = "24h"
[dataBus]
[dataBus.vip]
key = "4ba46ba31f9a44ef"
secret = "e4c5a7fce28695209e6b4f0af8cf91c5"
group = "BiliVIPBinlog-MainAccount-Card-S"
topic = "BiliVIPBinlog-T"
action = "sub"
offset = "new"
buffer = 1024
name = "card-job"
proto = "tcp"
addr = "172.16.33.158:6205"
idle = 1
active = 1
dialTimeout = "1s"
readTimeout = "60s"
writeTimeout = "1s"
idleTimeout = "10s"

View File

@@ -0,0 +1,39 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["conf.go"],
importpath = "go-common/app/job/main/card/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/cache/memcache:go_default_library",
"//library/conf:go_default_library",
"//library/database/sql:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/rpc/warden:go_default_library",
"//library/net/trace:go_default_library",
"//library/queue/databus:go_default_library",
"//vendor/github.com/BurntSushi/toml: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,99 @@
package conf
import (
"errors"
"flag"
"time"
"go-common/library/cache/memcache"
"go-common/library/conf"
"go-common/library/database/sql"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/rpc/warden"
"go-common/library/net/trace"
"go-common/library/queue/databus"
"github.com/BurntSushi/toml"
)
var (
confPath string
client *conf.Client
// Conf config
Conf = &Config{}
)
// Config .
type Config struct {
Log *log.Config
BM *bm.ServerConfig
Tracer *trace.Config
Memcache *Memcache
MySQL *sql.Config
Databus *Databus
// client
CardRPC *warden.ClientConfig
}
// Databus databus.
type Databus struct {
Vip *databus.Config
}
// Memcache config
type Memcache struct {
*memcache.Config
CardExpire time.Duration
}
func init() {
flag.StringVar(&confPath, "conf", "", "default config path")
}
// Init init conf
func Init() error {
if confPath != "" {
return local()
}
return remote()
}
func local() (err error) {
_, err = toml.DecodeFile(confPath, &Conf)
return
}
func remote() (err error) {
if client, err = conf.New(); err != nil {
return
}
if err = load(); err != nil {
return
}
go func() {
for range client.Event() {
log.Info("config reload")
if load() != nil {
log.Error("config reload error (%v)", err)
}
}
}()
return
}
func load() (err error) {
var (
s string
ok bool
tmpConf *Config
)
if s, ok = client.Toml2(); !ok {
return errors.New("load config center error")
}
if _, err = toml.Decode(s, &tmpConf); err != nil {
return errors.New("could not decode config")
}
*Conf = *tmpConf
return
}

View File

@@ -0,0 +1,57 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"mc.cache.go",
"mysql.go",
],
importpath = "go-common/app/job/main/card/dao",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/card/conf:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/database/sql:go_default_library",
"//library/log:go_default_library",
"//library/stat/prom:go_default_library",
"//vendor/github.com/pkg/errors: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"],
)
go_test(
name = "go_default_test",
srcs = [
"dao_test.go",
"mc.cache_test.go",
"mysql_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/job/main/card/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,40 @@
package dao
import (
"context"
"go-common/app/job/main/card/conf"
"go-common/library/cache/memcache"
xsql "go-common/library/database/sql"
)
// Dao dao
type Dao struct {
c *conf.Config
mc *memcache.Pool
db *xsql.DB
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
mc: memcache.NewPool(c.Memcache.Config),
db: xsql.NewMySQL(c.MySQL),
}
return
}
// Close close the resource.
func (d *Dao) Close() {
d.mc.Close()
d.db.Close()
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) (err error) {
if err = d.pingMC(c); err != nil {
return
}
return d.db.Ping(c)
}

View File

@@ -0,0 +1,35 @@
package dao
import (
"flag"
"os"
"testing"
"go-common/app/job/main/card/conf"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "")
flag.Set("conf_token", "")
flag.Set("tree_id", "")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
} else {
flag.Set("conf", "../cmd/test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
os.Exit(m.Run())
}

View File

@@ -0,0 +1,47 @@
package dao
import (
"context"
"fmt"
"strconv"
mc "go-common/library/cache/memcache"
"go-common/library/log"
"go-common/library/stat/prom"
)
const (
_prequip = "e_"
)
func equipKey(mid int64) string {
return _prequip + strconv.FormatInt(mid, 10)
}
// pingMC ping memcache.
func (d *Dao) pingMC(c context.Context) (err error) {
conn := d.mc.Get(c)
defer conn.Close()
err = conn.Set(&mc.Item{
Key: "ping",
Value: []byte("pong"),
})
return
}
// DelCacheEquip delete data from mc
func (d *Dao) DelCacheEquip(c context.Context, id int64) (err error) {
conn := d.mc.Get(c)
defer conn.Close()
key := equipKey(id)
if err = conn.Delete(key); err != nil {
if err == mc.ErrNotFound {
err = nil
return
}
prom.BusinessErrCount.Incr("mc:DelCacheEquip")
log.Errorv(c, log.KV("DelCacheEquip", fmt.Sprintf("%+v", err)), log.KV("key", key))
return
}
return
}

View File

@@ -0,0 +1,51 @@
package dao
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestDaoequipKey(t *testing.T) {
convey.Convey("equipKey", t, func(ctx convey.C) {
var (
mid = int64(0)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
p1 := equipKey(mid)
ctx.Convey("Then p1 should not be nil.", func(ctx convey.C) {
ctx.So(p1, convey.ShouldNotBeNil)
})
})
})
}
func TestDaopingMC(t *testing.T) {
convey.Convey("pingMC", t, func(ctx convey.C) {
var (
c = context.Background()
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := d.pingMC(c)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestDaoDelCacheEquip(t *testing.T) {
convey.Convey("DelCacheEquip", t, func(ctx convey.C) {
var (
c = context.Background()
id = int64(0)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := d.DelCacheEquip(c, id)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}

View File

@@ -0,0 +1,20 @@
package dao
import (
"context"
"github.com/pkg/errors"
)
const (
_updateExpireTime = "UPDATE `user_card_equip` SET `expire_time` = ? WHERE `mid` = ?;"
)
// UpdateExpireTime update expire time.
func (d *Dao) UpdateExpireTime(c context.Context, t int64, mid int64) (err error) {
if _, err = d.db.Exec(c, _updateExpireTime, t, mid); err != nil {
err = errors.WithStack(err)
return
}
return
}

View File

@@ -0,0 +1,24 @@
package dao
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestDaoUpdateExpireTime(t *testing.T) {
convey.Convey("UpdateExpireTime", t, func(ctx convey.C) {
var (
c = context.Background()
no = int64(0)
mid = int64(0)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := d.UpdateExpireTime(c, no, mid)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}

View File

@@ -0,0 +1,31 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"model.go",
"vip.go",
],
importpath = "go-common/app/job/main/card/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
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,11 @@
package model
import "encoding/json"
// MsgCanal canal message struct.
type MsgCanal struct {
Action string `json:"action"`
Table string `json:"table"`
New json.RawMessage `json:"new"`
Old json.RawMessage `json:"old"`
}

View File

@@ -0,0 +1,25 @@
package model
// VipUserInfoMsg vip binlog msg.
type VipUserInfoMsg struct {
ID int64 `json:"id"`
Mid int64 `json:"mid"`
Ver int64 `json:"ver"`
VipType int8 `json:"vip_type"`
VipPayType int8 `json:"vip_pay_type"`
PayChannelID int64 `json:"pay_channel_id"`
VipStatus int32 `json:"vip_status"`
VipStartTime string `json:"vip_start_time"`
VipRecentTime string `json:"vip_recent_time"`
VipOverdueTime string `json:"vip_overdue_time"`
AnnualVipOverdueTime string `json:"annual_vip_overdue_time"`
IosOverdueTime string `json:"ios_overdue_time"`
}
// VipReq vip params.
type VipReq struct {
Mid int64
VipType int8
VipStatus int32
VipOverdueTime int64
}

View File

@@ -0,0 +1,34 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["http.go"],
importpath = "go-common/app/job/main/card/server/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/card/conf:go_default_library",
"//app/job/main/card/service:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster: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,39 @@
package http
import (
"net/http"
"go-common/app/job/main/card/conf"
"go-common/app/job/main/card/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
var srv *service.Service
// Init init
func Init(c *conf.Config, svc *service.Service) {
srv = svc
engine := bm.DefaultServer(c.BM)
route(engine)
if err := engine.Start(); err != nil {
log.Error("bm Start error(%v)", err)
panic(err)
}
}
func route(e *bm.Engine) {
e.Ping(ping)
e.Register(register)
}
func ping(c *bm.Context) {
if err := srv.Ping(c); err != nil {
log.Error("ping error(%v)", err)
c.AbortWithStatus(http.StatusServiceUnavailable)
}
}
func register(c *bm.Context) {
c.JSON(map[string]interface{}{}, nil)
}

View File

@@ -0,0 +1,55 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"service.go",
"vip.go",
],
importpath = "go-common/app/job/main/card/service",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/card/conf:go_default_library",
"//app/job/main/card/dao:go_default_library",
"//app/job/main/card/model:go_default_library",
"//app/service/main/card/api/grpc/v1:go_default_library",
"//app/service/main/card/model:go_default_library",
"//app/service/main/vip/model:go_default_library",
"//library/log:go_default_library",
"//library/queue/databus: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"],
)
go_test(
name = "go_default_test",
srcs = ["vip_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/job/main/card/conf:go_default_library",
"//app/job/main/card/model:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,64 @@
package service
import (
"context"
"sync"
"go-common/app/job/main/card/conf"
"go-common/app/job/main/card/dao"
cardCli "go-common/app/service/main/card/api/grpc/v1"
"go-common/library/queue/databus"
)
const (
_updateAction = "update"
_tableUserInfo = "vip_user_info"
)
// Service struct
type Service struct {
c *conf.Config
waiter *sync.WaitGroup
dao *dao.Dao
vipConsumer *databus.Databus
// card service
cardRPC cardCli.CardClient
}
// New init
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
dao: dao.New(c),
waiter: new(sync.WaitGroup),
}
cardRPC, err := cardCli.NewClient(c.CardRPC)
if err != nil {
panic(err)
}
s.cardRPC = cardRPC
if c.Databus.Vip != nil {
s.vipConsumer = databus.New(c.Databus.Vip)
s.waiter.Add(1)
go s.vipchangeproc()
}
return s
}
// Ping Service
func (s *Service) Ping(c context.Context) (err error) {
return s.dao.Ping(c)
}
// Close Service
func (s *Service) Close() {
if s.c.Databus.Vip != nil {
s.vipConsumer.Close()
}
s.dao.Close()
}
// Wait wait all chan close
func (s *Service) Wait() {
s.waiter.Wait()
}

View File

@@ -0,0 +1,96 @@
package service
import (
"context"
"encoding/json"
"time"
"go-common/app/job/main/card/model"
cardapi "go-common/app/service/main/card/api/grpc/v1"
cardmol "go-common/app/service/main/card/model"
vipmol "go-common/app/service/main/vip/model"
"go-common/library/log"
)
// ChangeEquipTime change vip equip time.
func (s *Service) ChangeEquipTime(c context.Context, v *model.VipReq) (err error) {
var res *cardapi.UserCardReply
if res, err = s.cardRPC.UserCard(c, &cardapi.UserCardReq{Mid: v.Mid}); err != nil {
return
}
if res.Res == nil ||
res.Res.Id == 0 ||
res.Res.CardType != cardmol.CardTypeVip {
return
}
var expire int64
switch {
case v.VipType == vipmol.NotVip || v.VipStatus == vipmol.Expire:
expire = time.Now().Unix()
case v.VipOverdueTime != res.Res.ExpireTime:
expire = v.VipOverdueTime
default:
}
if expire == 0 {
return
}
if err = s.dao.UpdateExpireTime(c, expire, v.Mid); err != nil {
return
}
err = s.dao.DelCacheEquip(c, v.Mid)
return
}
func (s *Service) vipchangeproc() {
defer s.waiter.Done()
msgs := s.vipConsumer.Messages()
var err error
for {
msg, ok := <-msgs
if !ok {
log.Warn("[service.dataConsume|vip] dataConsumer has been closed.")
return
}
if err = msg.Commit(); err != nil {
log.Error("msg.Commit err(%+v)", err)
}
log.Info("cur consumer vipchangeproc(%v)", string(msg.Value))
v := &model.MsgCanal{}
if err = json.Unmarshal([]byte(msg.Value), v); err != nil {
log.Error("json.Unmarshal(%v) err(%v)", v, err)
continue
}
if v.Table != _tableUserInfo || v.Action != _updateAction {
continue
}
n := new(model.VipUserInfoMsg)
if err = json.Unmarshal(v.New, n); err != nil {
log.Error("vipchangeproc json.Unmarshal val(%v) error(%v)", string(v.New), err)
continue
}
o := new(model.VipUserInfoMsg)
if err = json.Unmarshal(v.Old, o); err != nil {
log.Error("vipchangeproc json.Unmarshal val(%v) error(%v)", string(v.Old), err)
continue
}
if n.VipStatus == o.VipStatus &&
n.VipType == o.VipType &&
n.VipOverdueTime == o.VipOverdueTime {
continue
}
var duetime time.Time
if duetime, err = time.ParseInLocation("2006-01-02 15:04:05", n.VipOverdueTime, time.Local); err != nil {
log.Error("vipchangeproc ParseInLocation val(%s) error(%v)", n.VipOverdueTime, err)
continue
}
if err = s.ChangeEquipTime(context.Background(), &model.VipReq{
Mid: n.Mid,
VipType: n.VipType,
VipStatus: n.VipStatus,
VipOverdueTime: duetime.Unix(),
}); err != nil {
log.Error("ChangeEquipTime val(%+v) error(%v)", n, err)
continue
}
}
}

View File

@@ -0,0 +1,45 @@
package service
import (
"context"
"flag"
"testing"
"time"
"go-common/app/job/main/card/conf"
"go-common/app/job/main/card/model"
. "github.com/smartystreets/goconvey/convey"
)
var (
c = context.TODO()
s *Service
)
func init() {
var (
err error
)
flag.Set("conf", "../cmd/test.toml")
if err = conf.Init(); err != nil {
panic(err)
}
c = context.Background()
if s == nil {
s = New(conf.Conf)
}
time.Sleep(time.Second)
}
// go test -test.v -test.run TestChangeEquipTime
func TestChangeEquipTime(t *testing.T) {
Convey("TestChangeEquipTime ", t, func() {
So(s.ChangeEquipTime(c, &model.VipReq{
Mid: 1,
VipType: 2,
VipStatus: 1,
VipOverdueTime: time.Now().Unix(),
}), ShouldBeNil)
})
}