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

24
app/admin/main/mcn/BUILD Normal file
View File

@@ -0,0 +1,24 @@
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/admin/main/mcn/cmd:all-srcs",
"//app/admin/main/mcn/conf:all-srcs",
"//app/admin/main/mcn/dao/bfs:all-srcs",
"//app/admin/main/mcn/dao/msg:all-srcs",
"//app/admin/main/mcn/dao/up:all-srcs",
"//app/admin/main/mcn/dao/videoup:all-srcs",
"//app/admin/main/mcn/model:all-srcs",
"//app/admin/main/mcn/server/http:all-srcs",
"//app/admin/main/mcn/service:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,41 @@
# v1.3.0
1. mcn四期功能
# v1.2.0
1. mcn三期功能
# v1.1.4
1. 修复mcn累积json的struct
# v1.1.3
1. 修复mcn列表使用累积字段
# v1.1.2
1. 修复作弊详细页面mcn name为空的情况
# v1.1.1
1. fix increase data
# v1.1.0
1. mcn二期功能
# v1.0.6
1. fix up list
# v1.0.5
1. fix right join mcn list
# v1.0.4
1. fix mcn list
# v1.0.3
1. fix mcn list
# v1.0.2
1. fix mcn info
# v1.0.1
1. mcn一期功能上线
# v1.0.0
1. mcn-admin init

View File

@@ -0,0 +1,11 @@
# Owner
wangzhe01
shencen
# Author
hejianbing
wangyuzhe
yanjinbin
# Reviewer
wangzhe01

20
app/admin/main/mcn/OWNERS Normal file
View File

@@ -0,0 +1,20 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- hejianbing
- shencen
- wangzhe01
labels:
- admin
- admin/main/mcn
- main
options:
no_parent_owners: true
reviewers:
- hejianbing
- limengqing
- liyixin
- shencen
- wangyuzhe
- wangzhe01
- yanjinbin

View File

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

View File

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

View File

@@ -0,0 +1,44 @@
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 = ["mcn-admin-test.toml"],
importpath = "go-common/app/admin/main/mcn/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/mcn/conf:go_default_library",
"//app/admin/main/mcn/server/http:go_default_library",
"//library/ecode/tip:go_default_library",
"//library/log:go_default_library",
"//library/net/trace:go_default_library",
"//library/queue/databus/report: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,46 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"go-common/app/admin/main/mcn/conf"
"go-common/app/admin/main/mcn/server/http"
ecode "go-common/library/ecode/tip"
"go-common/library/log"
"go-common/library/net/trace"
manager "go-common/library/queue/databus/report"
)
func main() {
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
log.Init(conf.Conf.Log)
defer log.Close()
log.SetFormat("[%D %T] [%L] [%S] %M")
log.Info("start")
trace.Init(conf.Conf.Tracer)
defer trace.Close()
// manager log init
manager.InitManager(conf.Conf.ManagerLog)
ecode.Init(conf.Conf.Ecode)
http.Init(conf.Conf)
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:
log.Info("exit")
return
case syscall.SIGHUP:
default:
return
}
}
}

View File

@@ -0,0 +1,274 @@
version = "1.0.0"
[log]
stdout = true
[app]
key = "b8f239ca38a53308"
secret = "5460ef72fe13c10dfb53442b9111427e"
[bfs]
bucket = "mcn"
key = "0i4zga2vht5cnrw6"
secret = "i3sryb7gdfwvtqmkne49x2ojp8l065"
[bm]
addr = "0.0.0.0:8000"
timeout = "5s"
[host]
bfs = "http://bfs.bilibili.co"
msg = "http://message.bilibili.co"
videoup = "http://archive.api.bilibili.co"
api = "http://api.bilibili.co"
[mysql]
addr = "172.16.33.205:3306"
dsn = "upcrm:DdL6c5JaWCYKMAQ10PURbfeImow9HXlx@tcp(172.16.33.205:3306)/bilibili_upcrm?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 5
idle = 1
idleTimeout ="4h"
queryTimeout = "1000ms"
execTimeout = "1000ms"
tranTimeout = "1000ms"
[mysql.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[memcache]
name = "mcn-admin"
proto = "tcp"
addr = "172.18.33.60:11216"
active = 10
idle = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "10s"
[httpClient]
key = "b8f239ca38a53308"
secret = "5460ef72fe13c10dfb53442b9111427e"
dial = "1s"
timeout = "5s"
keepAlive = "60s"
[httpClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[grpcclient]
[grpcclient.account]
timeout = "1s"
[grpcclient.member]
timeout = "1s"
[grpcclient.archive]
timeout = "1s"
[auth]
managerHost = "http://uat-manager.bilibili.co"
dashboardHost = "http://dashboard-mng.bilibili.co"
dashboardCaller = "manager-go"
[auth.DsHTTPClient]
key = "manager-go"
secret = "949bbb2dd3178252638c2407578bc7ad"
dial = "1s"
timeout = "1s"
keepAlive = "60s"
[auth.DsHTTPClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[auth.MaHTTPClient]
key = "f6433799dbd88751"
secret = "36f8ddb1806207fe07013ab6a77a3935"
dial = "1s"
timeout = "1s"
keepAlive = "60s"
[auth.MaHTTPClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[auth.session]
sessionIDLength = 32
cookieLifeTime = 1800
cookieName = "mng-go"
domain = ".bilibili.co"
[auth.session.Memcache]
name = "go-business/auth"
proto = "tcp"
addr = "172.18.33.61:11232"
active = 5
idle = 5
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "80s"
[managerLog]
Key = "2511663d546f1413"
Secret = "cde3b480836cc76df3d635470f991caa"
Group = "LogAudit-MainSearch-P"
Topic = "LogAudit-T"
Action = "pub"
Buffer = 10240
Name = "log-audit/log-sub"
Proto = "tcp"
Addr = "172.18.33.50:6205"
Active = 10
Idle = 5
DialTimeout = "200ms"
ReadTimeout = "200ms"
WriteTimeout = "200ms"
IdleTimeout = "80s"
[property]
# MCN申请MCN管理入口申请成功
[[property.msg]]
msgType = 1
code = "116_1_1"
title = "MCN管理后台申请已通过"
content = '您申请的mcn管理后台已通过个人页点击mcn管理中心即可查看快快去关联旗下up主吧记得关联上自己的账号哦点击去#{关联up主}{"https://member.bilibili.com/studio/mcn/m/home"}——”'
# MCN申请MCN管理入口申请未通过
[[property.msg]]
msgType = 2
code = "116_1_2"
title = "MCN管理后台申请未通过"
content = '非常抱歉您的申请由于%s的原因暂未通过点击#{再次申请}{"https://member.bilibili.com/studio/mcn/m/welcome"}'
# MCN申请和up主绑定申请授权
[[property.msg]]
msgType = 3
code = "116_2_1"
title = "MCN账号绑定申请"
content = '现有用户昵称%suid%d属于公司%s申请与您的账号绑定授权。授权后您的账号数据将与对方共享点击#{查看授权详情}{"https://member.bilibili.com/studio/mcn/authorization/%d?type=bind"}'
# MCN申请和up主绑定up主同意等待运营审核中
[[property.msg]]
msgType = 4
code = "116_2_2"
title = "MCN账号绑定申请"
content = "您已成功确认与“%s公司”用户名“%s”UID%d的合作关系我们会在3个工作日内审核并以站内信告知是否绑定。"
# MCN申请和up主绑定up主同意且运营通过
[[property.msg]]
msgType = 5
code = "116_2_3"
title = "您已成功与up主账号绑定"
content = "您已经成功绑定用户昵称%suid%d您将可以在MCN后台系统中查看该UP主的相关数据"
# MCN申请和up主绑定up主同意且运营通过
[[property.msg]]
msgType = 6
code = "116_2_4"
title = "您已成功与MCN账号绑定"
content = "您已经成功绑定公司:%s公司用户名“%s”UID%d您的账号数据将与MCN共享"
# MCN申请和up主绑定up主同意但运营未通过
[[property.msg]]
msgType = 7
code = "116_2_5"
title = "您与UP账号绑定审核未通过"
content = "您与用户昵称%suid%d的绑定申请因%s的原因被驳回绑定失败"
# MCN申请和up主绑定up主同意但运营未通过
[[property.msg]]
msgType = 8
code = "116_2_6"
title = "您与MCN账号绑定审核未通过"
content = "您与%s公司用户名“%s”UID%d的绑定申请因%s的原因被驳回绑定失败"
# MCN申请和up主绑定被up主拒绝
[[property.msg]]
msgType = 9
code = "116_2_7"
title = "您与UP账号绑定申请未通过"
content = "用户昵称%suid%d拒绝与您的主账号进行绑定请确认邀请UP主的昵称与UID无误后再次申请"
# MCN和up主纠纷处理 - Up主和MCN关系冻结
[[property.msg]]
msgType = 10
code = "116_3_1"
title = "您与MCN的绑定关系已暂时冻结"
content = "已暂时冻结您与%s公司用户名“%s”UID%d的合约关系冻结期内您的所有数据将不再对该账号进行展示"
# MCN和up主纠纷处理 - Up主和MCN关系冻结
[[property.msg]]
msgType = 11
code = "116_3_2"
title = "您与up主的绑定关系已暂时冻结"
content = "已暂时冻结用户昵称%suid%d与您的合约关系冻结期内该UP主的所有数据将不再对您进行展示此期间该UP的增长数据将不计入您的数据表现中"
# MCN和up主纠纷处理 - Up主和MCN提前解约
[[property.msg]]
msgType = 12
code = "116_3_3"
title = "您与MCN的绑定关系已解除"
content = "已解除您与%s公司用户名“%s”UID%d的合约关系您的所有数据将不再对该账号进行展示"
# MCN和up主纠纷处理 - Up主和MCN提前解约
[[property.msg]]
msgType = 13
code = "116_3_4"
title = "您与up主的绑定关系已解除"
content = "已解除用户昵称%suid%d与您的合约关系该UP主的所有数据将不再对您进行展示该UP的数据增长将停止在冻结日/解约日"
# MCN违规账号封禁
[[property.msg]]
msgType = 14
code = "116_4_1"
title = "MCN后台被暂时封禁"
content = "非常抱歉您的MCN后台被暂时封禁冻结期间将无法使用"
# MCN违规账号清退
[[property.msg]]
msgType = 15
code = "116_4_2"
title = "MCN后台被关闭"
content = "非常抱歉您的MCN后台被关闭关闭后您的MCN后台将无法登录"
# MCN和B站续约
[[property.msg]]
msgType = 16
code = "116_1_3"
title = "MCN管理后台成功续约"
content = '恭喜您成功续约创作合伙人计划,成为我们新一期的合作伙伴,与我们共同打造良好的站内生态'
# MCN违规账号冻结期结束账号恢复
[[property.msg]]
msgType = 17
code = "116_4_3"
title = "MCN后台已恢复"
content = '您的MCN管理后台功能已恢复点击进入MCN管理后台'
# MCN新开权限
[[property.msg]]
msgType = 18
code = "116_5_1"
title = "你的%s开通"
content = '你的%s已开通快去看看吧——'
# MCN权限关闭
[[property.msg]]
msgType = 19
code = "116_5_2"
title = "你的%s关闭"
content = '你的%s被关闭了哦'
# UP主不同意授权变更
[[property.msg]]
msgType = 20
code = "116_6_1"
title = "与%sUP主的权限变更失败"
content = '与%sUP主的合作权限变更因up主不同意授权未通过'
# 运营不同意授权变更
[[property.msg]]
msgType = 21
code = "116_6_2"
title = "与%sUP主的权限变更失败"
content = '与%sUP主的合作权限变更因%s原因审核未通过'
# 运营同意授权变更
[[property.msg]]
msgType = 22
code = "116_6_3"
title = "与%sUP主的权限变更成功"
content = '与%sUP主的合作权限已成功变更当前权限为%s'
# MCN申请与UP主绑定的权限变更
[[property.msg]]
msgType = 23
code = "116_6_4"
title = "您与%sMCN的授权发生变更请确认是否同意"
content = '%sMCN申请与您的权限变更为%s#{点击链接}{"https://member.bilibili.com/studio/mcn/authorization/%d?type=reauth"}确认是否同意变更权限'

View File

@@ -0,0 +1,42 @@
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/admin/main/mcn/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/mcn/model:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/conf:go_default_library",
"//library/database/sql:go_default_library",
"//library/ecode/tip:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/permit: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,124 @@
package conf
import (
"errors"
"flag"
"go-common/app/admin/main/mcn/model"
"go-common/library/cache/memcache"
"go-common/library/conf"
"go-common/library/database/sql"
ecode "go-common/library/ecode/tip"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/permit"
"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.Config
MySQL *sql.Config
Ecode *ecode.Config
Auth *permit.Config
BFS *BFS
Host *Host
GRPCClient *GRPCClient
// http client
HTTPClient *bm.ClientConfig
// manager log config
ManagerLog *databus.Config
Property *Property
}
// Property .
type Property struct {
MSG []*model.MSG
}
// GRPCClient .
type GRPCClient struct {
Account *warden.ClientConfig
Member *warden.ClientConfig
Archive *warden.ClientConfig
}
// Host host config .
type Host struct {
Bfs string
Msg string
Videoup string
API string
}
// BFS bfs config
type BFS struct {
Bucket string
Key string
Secret string
}
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,52 @@
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",
"upload.go",
],
importpath = "go-common/app/admin/main/mcn/dao/bfs",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/mcn/conf: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",
"upload_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/mcn/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
"//vendor/gopkg.in/h2non/gock.v1:go_default_library",
],
)

View File

@@ -0,0 +1,26 @@
package bfs
import (
"go-common/app/admin/main/mcn/conf"
)
// Dao dao
type Dao struct {
c *conf.Config
bucket string
key string
secret string
bfs string
}
// New init mysql db
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
bucket: c.BFS.Bucket,
key: c.BFS.Key,
secret: c.BFS.Secret,
bfs: c.Host.Bfs,
}
return
}

View File

@@ -0,0 +1,46 @@
package bfs
import (
"flag"
"os"
"strings"
"testing"
"go-common/app/admin/main/mcn/conf"
"gopkg.in/h2non/gock.v1"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.archive.mcn-admin")
flag.Set("conf_token", "220af473858ad67f75586b66bece0e6b")
flag.Set("tree_id", "58930")
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")
}
if os.Getenv("UT_LOCAL_TEST") != "" {
flag.Set("conf", "../../cmd/mcn-admin-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
m.Run()
os.Exit(0)
}
func httpMock(method, url string) *gock.Request {
r := gock.New(url)
r.Method = strings.ToUpper(method)
return r
}

View File

@@ -0,0 +1,74 @@
package bfs
import (
"context"
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"fmt"
"hash"
"io"
"net/http"
"strconv"
"github.com/pkg/errors"
)
const (
_uploadURL = "/bfs/%s/%s"
_template = "%s\n%s\n%s\n%d\n"
_method = "PUT"
)
// Upload upload picture or log file to bfs
func (d *Dao) Upload(c context.Context, fileName, fileType string, expire int64, body io.Reader) (location string, err error) {
var (
url string
req *http.Request
resp *http.Response
code int
)
client := &http.Client{}
url = fmt.Sprintf(d.bfs+_uploadURL, d.bucket, fileName)
if req, err = http.NewRequest(_method, url, body); err != nil {
err = errors.Errorf("http.NewRequest(url(%s), body(%+v)) error(%+v)", url, body, err)
return
}
authorization := authorize(d.key, d.secret, _method, d.bucket, fileName, expire)
req.Header.Set("Host", d.bfs)
req.Header.Add("Date", fmt.Sprint(expire))
req.Header.Add("Authorization", authorization)
req.Header.Add("Content-Type", fileType)
resp, err = client.Do(req)
if err != nil {
err = errors.Errorf("resp.Do(%s) error(%+v)", url, err)
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
err = errors.Errorf("status code(%d) error(%+v)", resp.StatusCode, err)
return
}
code, err = strconv.Atoi(resp.Header.Get("code"))
if err != nil || code != http.StatusOK {
err = errors.Errorf("response code(%d) error(%+v)", resp.StatusCode, err)
return
}
location = resp.Header.Get("Location")
return
}
// Authorize returns authorization for upload file to bfs
func authorize(key, secret, method, bucket, file string, expire int64) (authorization string) {
var (
content string
mac hash.Hash
signature string
)
content = fmt.Sprintf(_template, method, bucket, file, expire)
mac = hmac.New(sha1.New, []byte(secret))
mac.Write([]byte(content))
signature = base64.StdEncoding.EncodeToString(mac.Sum(nil))
authorization = fmt.Sprintf("%s:%s:%d", key, signature, expire)
return
}

View File

@@ -0,0 +1,51 @@
package bfs
import (
"context"
"io"
"testing"
"github.com/smartystreets/goconvey/convey"
"gopkg.in/h2non/gock.v1"
)
func TestBfsUpload(t *testing.T) {
convey.Convey("Upload", t, func(ctx convey.C) {
var (
c = context.Background()
fileName = ""
fileType = ""
expire = int64(0)
body io.Reader
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
defer gock.OffAll()
httpMock("PUT", d.bfs).Reply(200).SetHeader("code", "200").SetHeader("Location", "baidu")
location, err := d.Upload(c, fileName, fileType, expire, body)
ctx.Convey("Then err should be nil.location should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(location, convey.ShouldNotBeNil)
})
})
})
}
func TestBfsauthorize(t *testing.T) {
convey.Convey("authorize", t, func(ctx convey.C) {
var (
key = ""
secret = ""
method = ""
bucket = ""
file = ""
expire = int64(0)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
authorization := authorize(key, secret, method, bucket, file, expire)
ctx.Convey("Then authorization should not be nil.", func(ctx convey.C) {
ctx.So(authorization, convey.ShouldNotBeNil)
})
})
})
}

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 = [
"dao.go",
"msg.go",
],
importpath = "go-common/app/admin/main/mcn/dao/msg",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/mcn/conf:go_default_library",
"//library/ecode:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/xstr: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",
"msg_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/mcn/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
"//vendor/gopkg.in/h2non/gock.v1:go_default_library",
],
)

View File

@@ -0,0 +1,28 @@
package msg
import (
"go-common/app/admin/main/mcn/conf"
bm "go-common/library/net/http/blademaster"
)
const (
_msgURL = "/api/notify/send.user.notify.do"
)
// Dao .
type Dao struct {
c *conf.Config
client *bm.Client
msgURL string
}
// New new a Dao and return.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
// http client
client: bm.NewClient(c.HTTPClient),
msgURL: c.Host.Msg + _msgURL,
}
return
}

View File

@@ -0,0 +1,47 @@
package msg
import (
"flag"
"os"
"strings"
"testing"
"go-common/app/admin/main/mcn/conf"
"gopkg.in/h2non/gock.v1"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.archive.mcn-admin")
flag.Set("conf_token", "220af473858ad67f75586b66bece0e6b")
flag.Set("tree_id", "58930")
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")
}
if os.Getenv("UT_LOCAL_TEST") != "" {
flag.Set("conf", "../../cmd/mcn-admin-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
d.client.SetTransport(gock.DefaultTransport)
m.Run()
os.Exit(0)
}
func httpMock(method, url string) *gock.Request {
r := gock.New(url)
r.Method = strings.ToUpper(method)
return r
}

View File

@@ -0,0 +1,58 @@
package msg
import (
"context"
"net/url"
"go-common/library/ecode"
"go-common/library/xstr"
"github.com/pkg/errors"
)
// MutliSendSysMsg Mutli send sys msg.
func (d *Dao) MutliSendSysMsg(c context.Context, allUids []int64, mc, title string, context string, ip string) (err error) {
var times int
ulen := len(allUids)
if ulen%100 == 0 {
times = ulen / 100
} else {
times = ulen/100 + 1
}
var uids []int64
for i := 0; i < times; i++ {
if i == times-1 {
uids = allUids[i*100:]
} else {
uids = allUids[i*100 : (i+1)*100]
}
if err = d.SendSysMsg(c, uids, mc, title, context, ip); err != nil {
continue
}
}
return
}
// SendSysMsg send sys msg.
func (d *Dao) SendSysMsg(c context.Context, uids []int64, mc, title string, context string, ip string) (err error) {
params := url.Values{}
params.Set("mc", mc)
params.Set("title", title)
params.Set("data_type", "4")
params.Set("context", context)
params.Set("mid_list", xstr.JoinInts(uids))
var res struct {
Code int `json:"code"`
Data *struct {
Status int8 `json:"status"`
Remark string `json:"remark"`
} `json:"data"`
}
if err = d.client.Post(c, d.msgURL, ip, params, &res); err != nil {
return
}
if res.Code != 0 {
err = errors.Wrapf(ecode.Int(res.Code), "SendSysMsg d.client.Post(%s,%d)", d.msgURL+"?"+params.Encode(), res.Code)
}
return
}

View File

@@ -0,0 +1,52 @@
package msg
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
"gopkg.in/h2non/gock.v1"
)
func TestMsgMutliSendSysMsg(t *testing.T) {
convey.Convey("MutliSendSysMsg", t, func(ctx convey.C) {
var (
c = context.Background()
allUids = []int64{}
mc = ""
title = ""
context = ""
ip = ""
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
defer gock.OffAll()
httpMock("POST", d.msgURL).Reply(200).JSON(`{"code":0}`)
err := d.MutliSendSysMsg(c, allUids, mc, title, context, ip)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestMsgSendSysMsg(t *testing.T) {
convey.Convey("SendSysMsg", t, func(ctx convey.C) {
var (
c = context.Background()
uids = []int64{2}
mc = "116_3_3"
title = "11"
content = "111"
ip = "111.111.111.111"
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
defer gock.OffAll()
httpMock("POST", d.msgURL).Reply(200).JSON(`{"code":0}`)
err := d.SendSysMsg(c, uids, mc, title, content, ip)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}

View File

@@ -0,0 +1,75 @@
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",
"mcn_account.go",
"mcn_manage.go",
"mcn_recommend.go",
"memcache.go",
"statistics.go",
"up_base_Info.go",
],
importpath = "go-common/app/admin/main/mcn/dao/up",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/mcn/conf:go_default_library",
"//app/admin/main/mcn/model:go_default_library",
"//app/interface/main/mcn/model/datamodel:go_default_library",
"//app/interface/main/mcn/model/mcnmodel:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/database/sql:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata:go_default_library",
"//library/time:go_default_library",
"//library/xstr: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",
"mcn_account_test.go",
"mcn_manage_test.go",
"mcn_recommend_test.go",
"memcache_test.go",
"statistics_test.go",
"up_base_Info_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/mcn/conf:go_default_library",
"//app/admin/main/mcn/model:go_default_library",
"//library/time:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
"//vendor/gopkg.in/h2non/gock.v1:go_default_library",
],
)

View File

@@ -0,0 +1,60 @@
package up
import (
"context"
"go-common/app/admin/main/mcn/conf"
"go-common/library/cache/memcache"
xsql "go-common/library/database/sql"
bm "go-common/library/net/http/blademaster"
)
// Dao dao
type Dao struct {
c *conf.Config
mc *memcache.Pool
db *xsql.DB
client *bm.Client
arcTopURL string
dataFansURL string
dataFansBaseAttrURL string
dataFansAreaURL string
dataFansTypeURL string
dataFansTagURL string
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
mc: memcache.NewPool(c.Memcache),
db: xsql.NewMySQL(c.MySQL),
// http client
client: bm.NewClient(c.HTTPClient),
// url
arcTopURL: c.Host.API + _arcTopURL,
dataFansURL: c.Host.API + _dataFansURL,
dataFansBaseAttrURL: c.Host.API + _dataFansBaseAttrURL,
dataFansAreaURL: c.Host.API + _dataFansAreaURL,
dataFansTypeURL: c.Host.API + _dataFansTypeURL,
dataFansTagURL: c.Host.API + _dataFansTagURL,
}
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) error {
// TODO: if you need use mc,redis, please add
return d.db.Ping(c)
}
// BeginTran start tx .
func (d *Dao) BeginTran(c context.Context) (tx *xsql.Tx, err error) {
return d.db.Begin(c)
}

View File

@@ -0,0 +1,47 @@
package up
import (
"flag"
"os"
"strings"
"testing"
"go-common/app/admin/main/mcn/conf"
"gopkg.in/h2non/gock.v1"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.archive.mcn-admin")
flag.Set("conf_token", "220af473858ad67f75586b66bece0e6b")
flag.Set("tree_id", "58930")
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/mcn-admin-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
d.client.SetTransport(gock.DefaultTransport)
m.Run()
os.Exit(0)
}
func httpMock(method, url string) *gock.Request {
r := gock.New(url)
r.Method = strings.ToUpper(method)
return r
}

View File

@@ -0,0 +1,280 @@
package up
import (
"context"
"database/sql"
"fmt"
"time"
"go-common/app/admin/main/mcn/model"
xsql "go-common/library/database/sql"
xtime "go-common/library/time"
"go-common/library/xstr"
"github.com/pkg/errors"
)
const (
_inMcnSignEntrySQL = "INSERT mcn_sign(mcn_mid,begin_date,end_date,permission) VALUES (?,?,?,?)"
_inMcnSignPaySQL = "INSERT mcn_sign_pay(mcn_mid,sign_id,due_date,pay_value,note) VALUES (?,?,?,?,?)"
_upMcnSignOPSQL = "UPDATE mcn_sign SET state = ?, reject_time = ?, reject_reason = ? WHERE id = ?"
_upMcnUpOPSQL = "UPDATE mcn_up SET state = ?, reject_time = ?, reject_reason = ?, state_change_time = ? WHERE id = ?"
_mcnUpPermitOPSQL = "UPDATE mcn_up SET permission = ?, up_auth_link = ? WHERE sign_id = ? AND mcn_mid = ? AND up_mid = ?"
_upPermitApplyOPSQL = "UPDATE mcn_up_permission_apply SET state = ?, reject_reason = ?, reject_time = ?, admin_id = ?, admin_name = ? WHERE id = ?"
_selMcnSignsSQL = `SELECT id,mcn_mid,company_name,company_license_id,company_license_link,contract_link,contact_name,
contact_title,contact_idcard,contact_phone,begin_date,end_date,reject_reason,reject_time,state,ctime,mtime,permission FROM mcn_sign WHERE state = ? ORDER BY mtime DESC limit ?,?`
_selMcnSignSQL = `SELECT id,mcn_mid,company_name,company_license_id,company_license_link,contract_link,contact_name,
contact_title,contact_idcard,contact_phone,begin_date,end_date,reject_reason,reject_time,state,ctime,mtime,permission FROM mcn_sign WHERE id = ?`
_selMcnSignPayMapSQL = "SELECT id,sign_id,due_date,pay_value,state FROM mcn_sign_pay WHERE sign_id IN (%s) AND state IN (0,1)"
_selMcnUpsSQL = "SELECT id,sign_id,mcn_mid,up_mid,begin_date,end_date,contract_link,up_auth_link,reject_reason,reject_time,state,ctime,mtime,up_type,site_link,confirm_time,publication_price,permission FROM mcn_up WHERE state = ? ORDER BY mtime DESC limit ?,?"
_selMcnUpSQL = "SELECT id,sign_id,mcn_mid,up_mid,begin_date,end_date,contract_link,up_auth_link,reject_reason,reject_time,state,ctime,mtime,up_type,site_link,confirm_time,publication_price,permission FROM mcn_up WHERE id = ?"
_selMcnSignCountUQTimeSQL = "SELECT COUNT(1) FROM mcn_sign WHERE mcn_mid = ? AND state IN (0,1,2,10,13,15) AND (end_date >= ? OR end_date >= ?) AND begin_date <= ?"
_mcnSignTotalSQL = "SELECT COUNT(1) FROM mcn_sign WHERE state = ?"
_mcnUpTotalSQL = "SELECT COUNT(1) FROM mcn_up WHERE state = ?"
_mcnSignNoStateCountSQL = "SELECT COUNT(1) FROM mcn_sign WHERE mcn_mid = ? AND state IN (0,1,2,10,13,15)"
_mcnUpPermitReviewsSQL = "SELECT id,mcn_mid,up_mid,sign_id,new_permission,old_permission,reject_reason,reject_time,state,ctime,mtime,admin_id,admin_name,up_auth_link FROM mcn_up_permission_apply WHERE state = ? ORDER BY mtime DESC limit ?,?"
_mcnUpPermitReviewSQL = "SELECT id,mcn_mid,up_mid,sign_id,new_permission,old_permission,reject_reason,reject_time,state,ctime,mtime,admin_id,admin_name,up_auth_link FROM mcn_up_permission_apply WHERE id = ?"
_mcnUpPermitTotalSQL = "SELECT COUNT(1) FROM mcn_up_permission_apply WHERE state = ?"
)
// TxAddMcnSignEntry .
func (d *Dao) TxAddMcnSignEntry(tx *xsql.Tx, mcnMid int64, beginDate, endDate string, permission uint32) (lastID int64, err error) {
var res sql.Result
if res, err = tx.Exec(_inMcnSignEntrySQL, mcnMid, beginDate, endDate, permission); err != nil {
return lastID, err
}
if lastID, err = res.LastInsertId(); err != nil {
return lastID, errors.Errorf("res.LastInsertId(%d,%s,%s,%d) error(%+v)", mcnMid, beginDate, endDate, permission, err)
}
return lastID, nil
}
// TxAddMcnSignPay .
func (d *Dao) TxAddMcnSignPay(tx *xsql.Tx, mcnMid, signID, payValue int64, dueDate, note string) (rows int64, err error) {
var res sql.Result
if res, err = tx.Exec(_inMcnSignPaySQL, mcnMid, signID, dueDate, payValue, note); err != nil {
return rows, err
}
return res.RowsAffected()
}
// UpMcnSignOP .
func (d *Dao) UpMcnSignOP(c context.Context, signID int64, state int8, rejectTime xtime.Time, rejectReason string) (rows int64, err error) {
var res sql.Result
if res, err = d.db.Exec(c, _upMcnSignOPSQL, state, rejectTime, rejectReason, signID); err != nil {
return rows, err
}
return res.RowsAffected()
}
// UpMcnUpOP .
func (d *Dao) UpMcnUpOP(c context.Context, signUpID int64, state int8, rejectTime xtime.Time, rejectReason string) (rows int64, err error) {
var res sql.Result
if res, err = d.db.Exec(c, _upMcnUpOPSQL, state, rejectTime, rejectReason, time.Now(), signUpID); err != nil {
return rows, err
}
return res.RowsAffected()
}
// TxMcnUpPermitOP .
func (d *Dao) TxMcnUpPermitOP(tx *xsql.Tx, signID, mcnMid, upMid int64, permission uint32, upAuthLink string) (rows int64, err error) {
var res sql.Result
if res, err = tx.Exec(_mcnUpPermitOPSQL, permission, upAuthLink, signID, mcnMid, upMid); err != nil {
return rows, err
}
return res.RowsAffected()
}
// TxUpPermitApplyOP .
func (d *Dao) TxUpPermitApplyOP(tx *xsql.Tx, arg *model.McnUpPermissionApply) (rows int64, err error) {
var res sql.Result
if res, err = tx.Exec(_upPermitApplyOPSQL, arg.State, arg.RejectReason, arg.RejectTime, arg.AdminID, arg.AdminName, arg.ID); err != nil {
return rows, err
}
return res.RowsAffected()
}
// McnSigns .
func (d *Dao) McnSigns(c context.Context, arg *model.MCNSignStateReq) (ms []*model.MCNSignInfoReply, err error) {
var rows *xsql.Rows
limit, offset := arg.PageArg.CheckPageValidation()
if rows, err = d.db.Query(c, _selMcnSignsSQL, arg.State, offset, limit); err != nil {
return
}
defer rows.Close()
for rows.Next() {
m := new(model.MCNSignInfoReply)
if err = rows.Scan(&m.SignID, &m.McnMid, &m.CompanyName, &m.CompanyLicenseID, &m.CompanyLicenseLink, &m.ContractLink, &m.ContactName,
&m.ContactTitle, &m.ContactIdcard, &m.ContactPhone, &m.BeginDate, &m.EndDate, &m.RejectReason, &m.RejectTime, &m.State, &m.Ctime, &m.Mtime, &m.Permission); err != nil {
return
}
ms = append(ms, m)
}
err = rows.Err()
return
}
// McnSign .
func (d *Dao) McnSign(c context.Context, signID int64) (m *model.MCNSignInfoReply, err error) {
row := d.db.QueryRow(c, _selMcnSignSQL, signID)
m = new(model.MCNSignInfoReply)
if err = row.Scan(&m.SignID, &m.McnMid, &m.CompanyName, &m.CompanyLicenseID, &m.CompanyLicenseLink, &m.ContractLink, &m.ContactName,
&m.ContactTitle, &m.ContactIdcard, &m.ContactPhone, &m.BeginDate, &m.EndDate, &m.RejectReason, &m.RejectTime, &m.State, &m.Ctime, &m.Mtime, &m.Permission); err != nil {
if err == xsql.ErrNoRows {
err = nil
m = nil
return
}
}
return
}
// McnSignPayMap .
func (d *Dao) McnSignPayMap(c context.Context, signIDs []int64) (sm map[int64][]*model.SignPayInfoReply, err error) {
var rows *xsql.Rows
if rows, err = d.db.Query(c, fmt.Sprintf(_selMcnSignPayMapSQL, xstr.JoinInts(signIDs))); err != nil {
return
}
defer rows.Close()
sm = make(map[int64][]*model.SignPayInfoReply)
for rows.Next() {
s := new(model.SignPayInfoReply)
if err = rows.Scan(&s.SignPayID, &s.SignID, &s.DueDate, &s.PayValue, &s.State); err != nil {
return
}
sm[s.SignID] = append(sm[s.SignID], s)
}
err = rows.Err()
return
}
// McnUps .
func (d *Dao) McnUps(c context.Context, arg *model.MCNUPStateReq) (ups []*model.MCNUPInfoReply, err error) {
var rows *xsql.Rows
limit, offset := arg.PageArg.CheckPageValidation()
if rows, err = d.db.Query(c, _selMcnUpsSQL, arg.State, offset, limit); err != nil {
return
}
defer rows.Close()
for rows.Next() {
up := new(model.MCNUPInfoReply)
if err = rows.Scan(&up.SignUpID, &up.SignID, &up.McnMid, &up.UpMid, &up.BeginDate, &up.EndDate, &up.ContractLink,
&up.UpAuthLink, &up.RejectReason, &up.RejectTime, &up.State, &up.Ctime, &up.Mtime, &up.UPType, &up.SiteLink,
&up.ConfirmTime, &up.PubPrice, &up.Permission); err != nil {
return
}
ups = append(ups, up)
}
err = rows.Err()
return
}
// McnUp .
func (d *Dao) McnUp(c context.Context, signUpID int64) (up *model.MCNUPInfoReply, err error) {
row := d.db.QueryRow(c, _selMcnUpSQL, signUpID)
up = new(model.MCNUPInfoReply)
if err = row.Scan(&up.SignUpID, &up.SignID, &up.McnMid, &up.UpMid, &up.BeginDate, &up.EndDate, &up.ContractLink,
&up.UpAuthLink, &up.RejectReason, &up.RejectTime, &up.State, &up.Ctime, &up.Mtime, &up.UPType, &up.SiteLink,
&up.ConfirmTime, &up.PubPrice, &up.Permission); err != nil {
if err == xsql.ErrNoRows {
err = nil
up = nil
return
}
}
return
}
// McnSignCountUQTime .
func (d *Dao) McnSignCountUQTime(c context.Context, mcnMid int64, stime, etime xtime.Time) (count int64, err error) {
row := d.db.QueryRow(c, _selMcnSignCountUQTimeSQL, mcnMid, stime, etime, etime)
if err = row.Scan(&count); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}
// McnSignTotal .
func (d *Dao) McnSignTotal(c context.Context, arg *model.MCNSignStateReq) (count int64, err error) {
row := d.db.QueryRow(c, _mcnSignTotalSQL, arg.State)
if err = row.Scan(&count); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}
// McnUpTotal .
func (d *Dao) McnUpTotal(c context.Context, arg *model.MCNUPStateReq) (count int64, err error) {
row := d.db.QueryRow(c, _mcnUpTotalSQL, arg.State)
if err = row.Scan(&count); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}
// McnSignNoOKState .
func (d *Dao) McnSignNoOKState(c context.Context, mcnMid int64) (count int64, err error) {
row := d.db.QueryRow(c, _mcnSignNoStateCountSQL, mcnMid)
if err = row.Scan(&count); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}
// McnUpPermits .
func (d *Dao) McnUpPermits(c context.Context, arg *model.MCNUPPermitStateReq) (ms []*model.McnUpPermissionApply, err error) {
var rows *xsql.Rows
limit, offset := arg.PageArg.CheckPageValidation()
if rows, err = d.db.Query(c, _mcnUpPermitReviewsSQL, arg.State, offset, limit); err != nil {
return
}
defer rows.Close()
for rows.Next() {
m := new(model.McnUpPermissionApply)
if err = rows.Scan(&m.ID, &m.McnMid, &m.UpMid, &m.SignID, &m.NewPermission, &m.OldPermission, &m.RejectReason,
&m.RejectTime, &m.State, &m.Ctime, &m.Mtime, &m.AdminID, &m.AdminName, &m.UpAuthLink); err != nil {
return
}
ms = append(ms, m)
}
err = rows.Err()
return
}
// McnUpPermit .
func (d *Dao) McnUpPermit(c context.Context, id int64) (m *model.McnUpPermissionApply, err error) {
row := d.db.QueryRow(c, _mcnUpPermitReviewSQL, id)
m = new(model.McnUpPermissionApply)
if err = row.Scan(&m.ID, &m.McnMid, &m.UpMid, &m.SignID, &m.NewPermission, &m.OldPermission, &m.RejectReason,
&m.RejectTime, &m.State, &m.Ctime, &m.Mtime, &m.AdminID, &m.AdminName, &m.UpAuthLink); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}
// McnUpPermitTotal .
func (d *Dao) McnUpPermitTotal(c context.Context, arg *model.MCNUPPermitStateReq) (count int64, err error) {
row := d.db.QueryRow(c, _mcnUpPermitTotalSQL, arg.State)
if err = row.Scan(&count); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}

View File

@@ -0,0 +1,225 @@
package up
import (
"context"
"testing"
"go-common/app/admin/main/mcn/model"
xtime "go-common/library/time"
"github.com/smartystreets/goconvey/convey"
)
func TestUpTxAddMcnSignEntry(t *testing.T) {
convey.Convey("TxAddMcnSignEntry", t, func(ctx convey.C) {
var (
tx, _ = d.BeginTran(context.Background())
mcnMid = int64(0)
beginDate = ""
endDate = ""
permission = uint32(0)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
lastID, err := d.TxAddMcnSignEntry(tx, mcnMid, beginDate, endDate, permission)
t.Logf("last id=%d", lastID)
defer tx.Rollback()
ctx.Convey("Then err should be nil.lastID should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(lastID, convey.ShouldNotBeNil)
})
})
})
}
func TestUpTxAddMcnSignPay(t *testing.T) {
convey.Convey("TxAddMcnSignPay", t, func(ctx convey.C) {
var (
tx, _ = d.BeginTran(context.Background())
mcnMid = int64(0)
signID = int64(0)
payValue = int64(0)
dueDate = ""
note = ""
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
rows, err := d.TxAddMcnSignPay(tx, mcnMid, signID, payValue, dueDate, note)
defer tx.Rollback()
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpUpMcnSignOP(t *testing.T) {
convey.Convey("UpMcnSignOP", t, func(ctx convey.C) {
var (
c = context.Background()
signID = int64(0)
state = int8(0)
rejectTime xtime.Time
rejectReason = ""
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
rows, err := d.UpMcnSignOP(c, signID, state, rejectTime, rejectReason)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpUpMcnUpOP(t *testing.T) {
convey.Convey("UpMcnUpOP", t, func(ctx convey.C) {
var (
c = context.Background()
signUpID = int64(0)
state = int8(0)
rejectTime xtime.Time
rejectReason = ""
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
rows, err := d.UpMcnUpOP(c, signUpID, state, rejectTime, rejectReason)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpTxMcnUpPermitOP(t *testing.T) {
convey.Convey("TxMcnUpPermitOP", t, func(ctx convey.C) {
var (
tx, _ = d.BeginTran(context.Background())
signID = int64(0)
mcnMid = int64(0)
upMid = int64(0)
permission = uint32(0)
upAuthLink = ""
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
rows, err := d.TxMcnUpPermitOP(tx, signID, mcnMid, upMid, permission, upAuthLink)
defer tx.Rollback()
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpTxUpPermitApplyOP(t *testing.T) {
convey.Convey("TxUpPermitApplyOP", t, func(ctx convey.C) {
var (
tx, _ = d.BeginTran(context.Background())
arg = &model.McnUpPermissionApply{}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
rows, err := d.TxUpPermitApplyOP(tx, arg)
defer tx.Rollback()
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMcnSigns(t *testing.T) {
convey.Convey("McnSigns", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNSignStateReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
ms, err := d.McnSigns(c, arg)
ctx.Convey("Then err should be nil.ms should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(ms, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMcnSignTotal(t *testing.T) {
convey.Convey("McnSignTotal", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNSignStateReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
count, err := d.McnSignTotal(c, arg)
ctx.Convey("Then err should be nil.count should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(count, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMcnUpTotal(t *testing.T) {
convey.Convey("McnUpTotal", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPStateReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
count, err := d.McnUpTotal(c, arg)
ctx.Convey("Then err should be nil.count should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(count, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMcnUpPermits(t *testing.T) {
convey.Convey("McnUpPermits", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPPermitStateReq{}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
ms, err := d.McnUpPermits(c, arg)
ctx.Convey("Then err should be nil.ms should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(ms, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMcnUpPermit(t *testing.T) {
convey.Convey("McnUpPermit", t, func(ctx convey.C) {
var (
c = context.Background()
id = int64(0)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
m, err := d.McnUpPermit(c, id)
ctx.Convey("Then err should be nil.m should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(m, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMcnUpPermitTotal(t *testing.T) {
convey.Convey("McnUpPermitTotal", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPPermitStateReq{}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
count, err := d.McnUpPermitTotal(c, arg)
ctx.Convey("Then err should be nil.count should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(count, convey.ShouldNotBeNil)
})
})
})
}

View File

@@ -0,0 +1,689 @@
package up
import (
"context"
"database/sql"
"fmt"
"strconv"
"strings"
"time"
"github.com/pkg/errors"
"go-common/app/admin/main/mcn/model"
xsql "go-common/library/database/sql"
"go-common/library/xstr"
)
const (
_inMCNRenewalSQL = `INSERT INTO mcn_sign(mcn_mid,company_name,company_license_id,company_license_link,
contract_link,contact_name,contact_title,contact_idcard,contact_phone,begin_date,end_date,state,permission) VALUES (?,?,?,?,?,?,?,?,?,?,?,15,?)`
_inMCNPaySQL = "INSERT INTO mcn_sign_pay(mcn_mid,sign_id,due_date,pay_value) VALUES %s"
_inMCNUPsSQL = "INSERT INTO mcn_up(sign_id,mcn_mid,up_mid,begin_date,end_date,contract_link,up_auth_link,state,state_change_time,up_type,site_link,confirm_time,permission,publication_price) VALUES %s"
_upMCNStateSQL = "UPDATE mcn_sign SET state=? WHERE id=? AND mcn_mid=?"
_upMCNPaySQL = "UPDATE mcn_sign_pay SET due_date=?,pay_value=? WHERE id=? AND mcn_mid=? AND sign_id=?"
_upMCNPayStateSQL = "UPDATE mcn_sign_pay SET state=? WHERE id=? AND mcn_mid=? AND sign_id=?"
// _upMCNSignRenewaIDSQL = "UPDATE mcn_sign SET renewal_id=? WHERE id=?"
_upMCNUPStateSQL = "UPDATE mcn_up SET state=?,state_change_time=? WHERE id =? AND sign_id=? AND mcn_mid=? AND up_mid=?"
_upMCNImportUPSQL = "UPDATE mcn_data_import_up SET is_reward=1 WHERE sign_id=? AND up_mid=?"
_upMCNPermissionSQL = "UPDATE mcn_sign SET permission = ? WHERE id=?"
_selMCNListSQL = `SELECT s.id, s.mcn_mid,s.state,s.begin_date,s.end_date,s.permission,ifnull(ds.up_count,0),ifnull(ds.fans_count_accumulate,0),
ifnull(ds.fans_count_online_accumulate,0),ifnull(ds.fans_count_real_accumulate,0),ifnull(ds.fans_count_cheat_accumulate,0),ifnull(ds.generate_date,0)
FROM (SELECT * FROM mcn_data_summary WHERE generate_date=(SELECT MAX(generate_date) FROM mcn_data_summary a WHERE a.sign_id=mcn_data_summary.sign_id) AND active_tid=? AND data_type=1) AS ds
RIGHT JOIN mcn_sign s ON s.id=ds.sign_id WHERE `
_countMCNListSQL = `SELECT COUNT(*) FROM (SELECT * FROM mcn_data_summary WHERE generate_date=(SELECT MAX(generate_date) FROM mcn_data_summary a
WHERE a.sign_id=mcn_data_summary.sign_id) AND active_tid=? AND data_type=1) AS ds RIGHT JOIN mcn_sign s ON s.id=ds.sign_id WHERE %s`
_selMCNPayInfosByID = "SELECT id,mcn_mid,sign_id,due_date,pay_value,state FROM mcn_sign_pay WHERE id=?"
_selMCNPayInfosBySignIDsSQL = "SELECT id,mcn_mid,sign_id,due_date,pay_value,state FROM mcn_sign_pay WHERE sign_id in(%s) ORDER BY due_date ASC"
_selMCNRenewalUPsSQL = "SELECT sign_id,mcn_mid,up_mid,begin_date,end_date,contract_link,up_auth_link,reject_reason,reject_time,state,state_change_time,up_type,site_link,confirm_time,permission,publication_price FROM mcn_up WHERE sign_id=? AND mcn_mid=? AND state IN(10,11,15)"
_selMCNInfoSQL = `SELECT s.id,s.mcn_mid,s.company_name,s.company_license_id,s.company_license_link,s.contract_link,s.contact_name,s.contact_title,s.contact_idcard,s.contact_phone,
s.begin_date,s.end_date,ifnull(s.state,0),ifnull(ds.up_count,0),ifnull(ds.fans_count_accumulate,0),ifnull(ds.archive_count_accumulate,0),ifnull(ds.play_count_accumulate,0),
ifnull(ds.fans_count_cheat_accumulate,0),ifnull(ds.fans_count_real_accumulate,0),ifnull(ds.fans_count_online_accumulate,0)
FROM mcn_sign s LEFT JOIN mcn_data_summary ds ON s.id=ds.sign_id AND ds.active_tid=? AND ds.data_type=1 WHERE s.id = ? ORDER BY ds.generate_date DESC LIMIT 1`
_selMCNUPListSQL = `SELECT u.id,u.sign_id,u.mcn_mid,u.up_mid,u.publication_price,u.permission,ifnull(du.active_tid,0),ifnull(du.fans_count,0),ifnull(du.fans_count_active,0),u.begin_date,u.end_date,u.state,
ifnull(du.fans_increase_accumulate,0),ifnull(du.archive_count,0),ifnull(du.play_count,0),u.contract_link,u.up_auth_link,u.up_type, ifnull(u.site_link, "")
FROM (SELECT * FROM mcn_data_up WHERE generate_date=(SELECT MAX(generate_date) FROM mcn_data_up a WHERE a.up_mid=mcn_data_up.up_mid)) du
RIGHT JOIN mcn_up u ON u.sign_id=du.sign_id AND u.up_mid=du.up_mid AND du.data_type=? WHERE u.state IN(10,11,12,14,15) AND `
_countMCNUPListSQL = `SELECT COUNT(*) FROM (SELECT * FROM mcn_data_up WHERE generate_date=(SELECT MAX(generate_date) FROM mcn_data_up a WHERE a.up_mid=mcn_data_up.up_mid)) du
RIGHT JOIN mcn_up u ON u.sign_id=du.sign_id AND u.up_mid=du.up_mid AND du.data_type=? WHERE u.state IN(10,11,12,14,15) AND %s`
_selMCNByMCNMIDSQL = `SELECT id,mcn_mid,company_name,company_license_id,company_license_link,contract_link,contact_name,
contact_title,contact_idcard,contact_phone,begin_date,end_date,reject_reason,reject_time,state,ctime,mtime FROM mcn_sign WHERE state IN(10,11,15) AND mcn_mid = ? ORDER BY begin_date DESC LIMIT 1`
_selMCNCheatListSQL = `SELECT fans_count_accumulate,fans_count_cheat_accumulate,mcn_mid,sign_id,up_mid,fans_count_cheat_increase_day,fans_count_cheat_cleaned_accumulate FROM mcn_data_up_cheat WHERE `
_countMCNCheatListSQL = "SELECT COUNT(*) FROM mcn_data_up_cheat WHERE %s"
_selMCNCheatUPListSQL = `SELECT sign_id,generate_date,fans_count_accumulate,fans_count_cheat_accumulate,mcn_mid,fans_count_cheat_increase_day,fans_count_cheat_cleaned_accumulate FROM mcn_data_up_cheat WHERE up_mid=? ORDER BY generate_date DESC LIMIT ?,?`
_countMCNCheatUPListSQL = "SELECT COUNT(*) FROM mcn_data_up_cheat WHERE up_mid=?"
_selMCNImportUPInfoSQL = "SELECT id,mcn_mid,sign_id,up_mid,standard_fans_date,standard_archive_count,standard_fans_count,is_reward FROM mcn_data_import_up WHERE sign_id=? AND up_mid=? AND standard_fans_type=1"
_selMCNDataSummaryListSQL = `SELECT id,sign_id,data_type,active_tid,generate_date,up_count,fans_count_online_accumulate,fans_count_real_accumulate,fans_count_cheat_accumulate,fans_count_increase_day,archive_count_accumulate,archive_count_day,
play_count_accumulate,play_count_increase_day,fans_count_accumulate FROM mcn_data_summary WHERE `
_countMCNDataSummaryListSQL = "SELECT COUNT(*) FROM mcn_data_summary WHERE %s"
)
// TxAddMCNRenewal .
func (d *Dao) TxAddMCNRenewal(tx *xsql.Tx, arg *model.MCNSign) (lastID int64, err error) {
var res sql.Result
if res, err = tx.Exec(_inMCNRenewalSQL, arg.MCNMID, arg.CompanyName, arg.CompanyLicenseID, arg.CompanyLicenseLink, arg.ContractLink, arg.ContactName, arg.ContactTitle, arg.ContactIdcard, arg.ContactPhone, arg.BeginDate, arg.EndDate, arg.Permission); err != nil {
return lastID, err
}
if lastID, err = res.LastInsertId(); err != nil {
return lastID, errors.Errorf("TxAddMCNRenewal res.LastInsertId(%+v) error(%+v)", arg, err)
}
return lastID, nil
}
// TxAddMCNPays .
func (d *Dao) TxAddMCNPays(tx *xsql.Tx, lastID, mcnMID int64, arg []*model.SignPayReq) (err error) {
l := len(arg)
valueStrings := make([]string, 0, l)
valueArgs := make([]interface{}, 0, l*5)
for _, v := range arg {
valueStrings = append(valueStrings, "(?,?,?,?)")
valueArgs = append(valueArgs, strconv.FormatInt(mcnMID, 10))
valueArgs = append(valueArgs, strconv.FormatInt(lastID, 10))
valueArgs = append(valueArgs, v.DueDate)
valueArgs = append(valueArgs, strconv.FormatInt(v.PayValue, 10))
}
stmt := fmt.Sprintf(_inMCNPaySQL, strings.Join(valueStrings, ","))
_, err = tx.Exec(stmt, valueArgs...)
return
}
// TxAddMCNUPs .
func (d *Dao) TxAddMCNUPs(tx *xsql.Tx, signID, mcnMID int64, arg []*model.MCNUP) (err error) {
l := len(arg)
valueStrings := make([]string, 0, l)
valueArgs := make([]interface{}, 0, l*15)
for _, v := range arg {
valueStrings = append(valueStrings, "(?,?,?,?,?,?,?,?,?,?,?,?,?,?)")
valueArgs = append(valueArgs, strconv.FormatInt(signID, 10))
valueArgs = append(valueArgs, strconv.FormatInt(mcnMID, 10))
valueArgs = append(valueArgs, strconv.FormatInt(v.UPMID, 10))
valueArgs = append(valueArgs, v.BeginDate.Time().Format(model.TimeFormatDay))
valueArgs = append(valueArgs, v.EndDate.Time().Format(model.TimeFormatDay))
valueArgs = append(valueArgs, v.ContractLink)
valueArgs = append(valueArgs, v.UPAuthLink)
valueArgs = append(valueArgs, strconv.FormatInt(int64(v.State), 10))
valueArgs = append(valueArgs, v.StateChangeTime.Time().Format(model.TimeFormatSec))
valueArgs = append(valueArgs, strconv.FormatInt(int64(v.UpType), 10))
valueArgs = append(valueArgs, v.SiteLink)
valueArgs = append(valueArgs, v.ConfirmTime.Time().Format(model.TimeFormatSec))
valueArgs = append(valueArgs, strconv.FormatInt(int64(v.Permission), 10))
valueArgs = append(valueArgs, strconv.FormatInt(int64(v.PublicationPrice), 10))
}
stmt := fmt.Sprintf(_inMCNUPsSQL, strings.Join(valueStrings, ","))
_, err = tx.Exec(stmt, valueArgs...)
return
}
// // TxUpMCNSignRenewaID .
// func (d *Dao) TxUpMCNSignRenewaID(tx *xsql.Tx, signID, renewalID int64) (rows int64, err error) {
// var res sql.Result
// if res, err = tx.Exec(_upMCNSignRenewaIDSQL, renewalID, signID); err != nil {
// return rows, err
// }
// return res.RowsAffected()
// }
// UpMCNState .
func (d *Dao) UpMCNState(c context.Context, arg *model.MCNStateEditReq) (rows int64, err error) {
var res sql.Result
if res, err = d.db.Exec(c, _upMCNStateSQL, arg.State, arg.ID, arg.MCNMID); err != nil {
return rows, err
}
return res.RowsAffected()
}
// UpMCNPay update mcn_sign_pay.
func (d *Dao) UpMCNPay(c context.Context, arg *model.MCNPayEditReq) (rows int64, err error) {
var res sql.Result
if res, err = d.db.Exec(c, _upMCNPaySQL, arg.DueDate, arg.PayValue, arg.ID, arg.MCNMID, arg.SignID); err != nil {
return rows, err
}
return res.RowsAffected()
}
// UpMCNPayState update mcn_sign_pay state.
func (d *Dao) UpMCNPayState(c context.Context, arg *model.MCNPayStateEditReq) (rows int64, err error) {
var res sql.Result
if res, err = d.db.Exec(c, _upMCNPayStateSQL, arg.State, arg.ID, arg.MCNMID, arg.SignID); err != nil {
return rows, err
}
return res.RowsAffected()
}
// UpMCNImportUPRewardSign .
func (d *Dao) UpMCNImportUPRewardSign(c context.Context, arg *model.MCNImportUPRewardSignReq) (rows int64, err error) {
var res sql.Result
if res, err = d.db.Exec(c, _upMCNImportUPSQL, arg.SignID, arg.UPMID); err != nil {
return rows, err
}
return res.RowsAffected()
}
// UpMCNPermission .
func (d *Dao) UpMCNPermission(c context.Context, signID int64, permission uint32) (rows int64, err error) {
var res sql.Result
if res, err = d.db.Exec(c, _upMCNPermissionSQL, permission, signID); err != nil {
return rows, err
}
return res.RowsAffected()
}
// MCNList .
func (d *Dao) MCNList(c context.Context, arg *model.MCNListReq) (res []*model.MCNListOne, ids, mids []int64, err error) {
sql, values := d.buildMCNListSQL("list", arg)
rows, err := d.db.Query(c, sql, values...)
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
m := &model.MCNListOne{}
err = rows.Scan(&m.ID, &m.MCNMID, &m.State, &m.BeginDate, &m.EndDate, &m.Permission, &m.UPCount, &m.FansCountAccumulate, &m.FansCountOnlineAccumulate, &m.FansCountRealAccumulate, &m.FansCountCheatAccumulate, &m.GenerateDate)
if err != nil {
return
}
res = append(res, m)
ids = append(ids, m.ID)
mids = append(mids, m.MCNMID)
}
return
}
// buildMCNListSQL build a MCNList sql string.
func (d *Dao) buildMCNListSQL(SQLType string, arg *model.MCNListReq) (sql string, values []interface{}) {
values = make([]interface{}, 0, 11)
var (
cond []string
condStr string
curTime = time.Now()
date = time.Date(curTime.Year(), curTime.Month(), curTime.Day(), 0, 0, 0, 0, time.Local)
orderSign = false
)
// defualt where
cond = append(cond, "s.state IN(10,11,12,13,14,15)")
values = append(values, model.AllActiveTid)
if arg.ExpirePay {
cond = append(cond, "s.pay_expire_state = ?")
values = append(values, model.MCNStatePayed)
}
if arg.ExpireSign {
cond = append(cond, "s.end_date <= ? AND s.state = 10")
values = append(values, date.AddDate(0, 0, 30))
}
if arg.FansNumMin != 0 {
cond = append(cond, "ds.fans_count_accumulate >= ?")
values = append(values, arg.FansNumMin)
}
if arg.FansNumMax != 0 && arg.FansNumMax >= arg.FansNumMin {
cond = append(cond, "ds.fans_count_accumulate <= ?")
values = append(values, arg.FansNumMax)
}
if arg.MCNMID != 0 {
cond = append(cond, "s.mcn_mid=?")
values = append(values, arg.MCNMID)
}
if arg.State != -1 {
cond = append(cond, "s.state=?")
values = append(values, arg.State)
}
var permission = arg.GetAttrPermitVal()
if permission != 0 {
cond = append(cond, "((permission & ?) = ?)")
values = append(values, permission, permission)
}
if checkSort(arg.SortUP, orderSign) {
arg.Order = "ds.up_count"
arg.Sort = arg.SortUP
orderSign = true
}
if checkSort(arg.SortAllFans, orderSign) {
arg.Order = "ds.fans_count_accumulate"
arg.Sort = arg.SortAllFans
orderSign = true
}
if checkSort(arg.SortRiseFans, orderSign) {
arg.Order = "ds.fans_count_online_accumulate"
arg.Sort = arg.SortRiseFans
orderSign = true
}
if checkSort(arg.SortTrueRiseFans, orderSign) {
arg.Order = "ds.fans_count_real_accumulate"
arg.Sort = arg.SortTrueRiseFans
orderSign = true
}
if checkSort(arg.SortCheatFans, orderSign) {
arg.Order = "ds.fans_count_cheat_accumulate"
arg.Sort = arg.SortCheatFans
}
condStr = d.joinStringSQL(cond)
switch SQLType {
case "list":
if arg.Export == model.ResponeModelCSV {
sql = fmt.Sprintf(_selMCNListSQL+_orderByConditionNotLimitSQL, condStr, arg.Order, arg.Sort)
return
}
sql = fmt.Sprintf(_selMCNListSQL+_orderByConditionSQL, condStr, arg.Order, arg.Sort)
limit, offset := arg.PageArg.CheckPageValidation()
values = append(values, offset, limit)
case "count":
sql = fmt.Sprintf(_countMCNListSQL, condStr)
}
return
}
func checkSort(arg string, orderSign bool) bool {
return arg != "" && (arg == "asc" || arg == "desc") && !orderSign
}
// MCNListTotal .
func (d *Dao) MCNListTotal(c context.Context, arg *model.MCNListReq) (count int64, err error) {
sql, values := d.buildMCNListSQL("count", arg)
row := d.db.QueryRow(c, sql, values...)
if err = row.Scan(&count); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}
// MCNPayInfo .
func (d *Dao) MCNPayInfo(c context.Context, arg *model.MCNPayStateEditReq) (m *model.SignPayInfoReply, err error) {
row := d.db.QueryRow(c, _selMCNPayInfosByID, arg.ID)
m = new(model.SignPayInfoReply)
// id,mcn_mid,sign_id,due_date,pay_value,state
if err = row.Scan(&m.SignPayID, &m.McnMid, &m.SignID, &m.DueDate, &m.PayValue, &m.State); err != nil {
if err == xsql.ErrNoRows {
err = nil
m = nil
return
}
}
return
}
// MCNPayInfos .
func (d *Dao) MCNPayInfos(c context.Context, ids []int64) (res map[int64][]*model.SignPayInfoReply, err error) {
rows, err := d.db.Query(c, fmt.Sprintf(_selMCNPayInfosBySignIDsSQL, xstr.JoinInts(ids)))
if err != nil {
return
}
defer rows.Close()
res = make(map[int64][]*model.SignPayInfoReply, len(ids))
for rows.Next() {
m := &model.SignPayInfoReply{}
err = rows.Scan(&m.SignPayID, &m.McnMid, &m.SignID, &m.DueDate, &m.PayValue, &m.State)
if err != nil {
return
}
res[m.SignID] = append(res[m.SignID], m)
}
return
}
// TxMCNRenewalUPs .
func (d *Dao) TxMCNRenewalUPs(tx *xsql.Tx, signID, mcnID int64) (ups []*model.MCNUP, err error) {
var rows *xsql.Rows
if rows, err = tx.Query(_selMCNRenewalUPsSQL, signID, mcnID); err != nil {
return
}
defer rows.Close()
for rows.Next() {
up := new(model.MCNUP)
if err = rows.Scan(&up.SignID, &up.MCNMID, &up.UPMID, &up.BeginDate, &up.EndDate, &up.ContractLink,
&up.UPAuthLink, &up.RejectReason, &up.RejectTime, &up.State, &up.StateChangeTime, &up.UpType,
&up.SiteLink, &up.ConfirmTime, &up.Permission, &up.PublicationPrice); err != nil {
return
}
ups = append(ups, up)
}
err = rows.Err()
return
}
// MCNInfo .
func (d *Dao) MCNInfo(c context.Context, arg *model.MCNInfoReq) (m *model.MCNInfoReply, err error) {
row := d.db.QueryRow(c, _selMCNInfoSQL, model.AllActiveTid, arg.ID)
m = new(model.MCNInfoReply)
if err = row.Scan(&m.ID, &m.MCNMID, &m.CompanyName, &m.CompanyLicenseID, &m.CompanyLicenseLink, &m.ContractLink, &m.ContactName,
&m.ContactTitle, &m.ContactIdcard, &m.ContactPhone, &m.BeginDate, &m.EndDate, &m.State, &m.UPCount, &m.FansCountAccumulate,
&m.ArchiveCountAccumulate, &m.PlayCountAccumulate, &m.FansCountOnline, &m.FansCountRealAccumulate, &m.FansCountOnlineAccumulate); err != nil {
if err == xsql.ErrNoRows {
err = nil
m = nil
return
}
}
return
}
// MCNUPList .
func (d *Dao) MCNUPList(c context.Context, arg *model.MCNUPListReq) (res []*model.MCNUPInfoReply, err error) {
sql, values := d.buildMCNUPListSQL("list", arg)
rows, err := d.db.Query(c, sql, values...)
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
m := &model.MCNUPInfoReply{}
err = rows.Scan(&m.SignUpID, &m.SignID, &m.McnMid, &m.UpMid, &m.PubPrice, &m.Permission, &m.ActiveTid, &m.FansCount, &m.FansCountActive,
&m.BeginDate, &m.EndDate, &m.State, &m.FansIncreaseAccumulate, &m.ArchiveCount, &m.PlayCount, &m.ContractLink, &m.UpAuthLink, &m.UPType, &m.SiteLink)
if err != nil {
return
}
res = append(res, m)
}
return
}
// MCNUPListTotal .
func (d *Dao) MCNUPListTotal(c context.Context, arg *model.MCNUPListReq) (count int64, err error) {
sql, values := d.buildMCNUPListSQL("count", arg)
row := d.db.QueryRow(c, sql, values...)
if err = row.Scan(&count); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}
// buildMCNUPListSQL build a MCNUPList sql string.
func (d *Dao) buildMCNUPListSQL(SQLType string, arg *model.MCNUPListReq) (sql string, values []interface{}) {
values = make([]interface{}, 0, 8)
var (
cond []string
condStr string
orderSign = false
)
values = append(values, arg.DataType)
cond = append(cond, "u.sign_id=?")
values = append(values, arg.SignID)
if arg.FansNumMin != 0 {
cond = append(cond, "du.fans_count>=?")
values = append(values, arg.FansNumMin)
}
if arg.FansNumMax != 0 && arg.FansNumMax >= arg.FansNumMin {
cond = append(cond, "du.fans_count<=?")
values = append(values, arg.FansNumMax)
}
if arg.ActiveTID != 0 {
cond = append(cond, "du.active_tid=?")
values = append(values, arg.ActiveTID)
}
if arg.State != -1 {
cond = append(cond, "u.state=?")
values = append(values, arg.State)
}
if arg.UPMID != 0 {
cond = append(cond, "u.up_mid=?")
values = append(values, arg.UPMID)
}
if arg.UpType != -1 {
cond = append(cond, "u.up_type=?")
values = append(values, arg.UpType)
}
var permission = arg.GetAttrPermitVal()
if permission != 0 {
cond = append(cond, "((permission & ?) = ?)")
values = append(values, permission, permission)
}
if checkSort(arg.SortFansCount, orderSign) {
arg.Order = "du.fans_count"
arg.Sort = arg.SortFansCount
orderSign = true
}
if checkSort(arg.SortFansCountActive, orderSign) {
arg.Order = "du.fans_count_active"
arg.Sort = arg.SortFansCountActive
orderSign = true
}
if checkSort(arg.SortFansIncreaseAccumulate, orderSign) {
arg.Order = "du.fans_increase_accumulate"
arg.Sort = arg.SortFansIncreaseAccumulate
orderSign = true
}
if checkSort(arg.SortArchiveCount, orderSign) {
arg.Order = "du.archive_count"
arg.Sort = arg.SortArchiveCount
orderSign = true
}
if checkSort(arg.SortPlayCount, orderSign) {
arg.Order = "du.play_count"
arg.Sort = arg.SortPlayCount
orderSign = true
}
if checkSort(arg.SortPubPrice, orderSign) {
arg.Order = "u.publication_price"
arg.Sort = arg.SortPubPrice
}
condStr = d.joinStringSQL(cond)
switch SQLType {
case "list":
if arg.Export == model.ResponeModelCSV {
sql = fmt.Sprintf(_selMCNUPListSQL+_orderByConditionNotLimitSQL, condStr, arg.Order, arg.Sort)
return
}
sql = fmt.Sprintf(_selMCNUPListSQL+_orderByConditionSQL, condStr, arg.Order, arg.Sort)
limit, offset := arg.PageArg.CheckPageValidation()
values = append(values, offset, limit)
case "count":
sql = fmt.Sprintf(_countMCNUPListSQL, condStr)
fmt.Println(sql)
}
return
}
// UpMCNUPState .
func (d *Dao) UpMCNUPState(c context.Context, arg *model.MCNUPStateEditReq) (rows int64, err error) {
var res sql.Result
if res, err = d.db.Exec(c, _upMCNUPStateSQL, arg.State, time.Now(), arg.ID, arg.SignID, arg.MCNMID, arg.UPMID); err != nil {
return rows, err
}
return res.RowsAffected()
}
// McnSignByMCNMID .
func (d *Dao) McnSignByMCNMID(c context.Context, MCNID int64) (m *model.MCNSignInfoReply, err error) {
row := d.db.QueryRow(c, _selMCNByMCNMIDSQL, MCNID)
m = new(model.MCNSignInfoReply)
if err = row.Scan(&m.SignID, &m.McnMid, &m.CompanyName, &m.CompanyLicenseID, &m.CompanyLicenseLink, &m.ContractLink, &m.ContactName,
&m.ContactTitle, &m.ContactIdcard, &m.ContactPhone, &m.BeginDate, &m.EndDate, &m.RejectReason, &m.RejectTime, &m.State, &m.Ctime, &m.Mtime); err != nil {
if err == xsql.ErrNoRows {
err = nil
m = nil
return
}
}
return
}
// MCNCheatList .
func (d *Dao) MCNCheatList(c context.Context, arg *model.MCNCheatListReq) (res []*model.MCNCheatReply, mids []int64, err error) {
sql, values := d.buildMCNCheatListSQL("list", arg)
rows, err := d.db.Query(c, sql, values...)
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
m := &model.MCNCheatReply{}
err = rows.Scan(&m.FansCountReal, &m.FansCountCheatAccumulate, &m.MCNMID, &m.SignID, &m.UpMID, &m.FansCountCheatIncreaseDay, &m.FansCountCheatCleanedAccumulate)
if err != nil {
return
}
res = append(res, m)
mids = append(mids, m.UpMID, m.MCNMID)
}
mids = SliceUnique(mids)
return
}
// MCNCheatListTotal .
func (d *Dao) MCNCheatListTotal(c context.Context, arg *model.MCNCheatListReq) (count int64, err error) {
sql, values := d.buildMCNCheatListSQL("count", arg)
row := d.db.QueryRow(c, sql, values...)
if err = row.Scan(&count); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}
//SliceUnique unique
func SliceUnique(s []int64) []int64 {
result := make([]int64, 0, len(s))
temp := map[int64]struct{}{}
for _, item := range s {
if _, ok := temp[item]; !ok {
temp[item] = struct{}{}
result = append(result, item)
}
}
return result
}
// buildMCNCheatListSQL build a MCNCheatList sql string.
func (d *Dao) buildMCNCheatListSQL(SQLType string, arg *model.MCNCheatListReq) (sql string, values []interface{}) {
values = make([]interface{}, 0, 3)
var (
cond []string
condStr string
)
cond = append(cond, "generate_date=(SELECT generate_date FROM mcn_data_up_cheat ORDER BY generate_date DESC LIMIT 1)")
if arg.MCNMID > 0 {
cond = append(cond, "mcn_mid=?")
values = append(values, arg.MCNMID)
}
if arg.UPMID > 0 {
cond = append(cond, "up_mid=?")
values = append(values, arg.UPMID)
}
condStr = d.joinStringSQL(cond)
switch SQLType {
case "list":
sql = fmt.Sprintf(_selMCNCheatListSQL+_orderByConditionSQL, condStr, "generate_date DESC,fans_count_cheat_accumulate", "DESC")
limit, offset := arg.PageArg.CheckPageValidation()
values = append(values, offset, limit)
case "count":
sql = fmt.Sprintf(_countMCNCheatListSQL, condStr)
}
return
}
// MCNCheatUPList .
func (d *Dao) MCNCheatUPList(c context.Context, arg *model.MCNCheatUPListReq) (res []*model.MCNCheatUPReply, err error) {
limit, offset := arg.PageArg.CheckPageValidation()
rows, err := d.db.Query(c, _selMCNCheatUPListSQL, arg.UPMID, offset, limit)
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
m := &model.MCNCheatUPReply{}
err = rows.Scan(&m.SignID, &m.GenerateDate, &m.FansCountReal, &m.FansCountCheatAccumulate, &m.MCNMID, &m.FansCountCheatIncreaseDay, &m.FansCountCheatCleanedAccumulate)
if err != nil {
return
}
res = append(res, m)
}
return
}
// MCNCheatUPListTotal .
func (d *Dao) MCNCheatUPListTotal(c context.Context, arg *model.MCNCheatUPListReq) (count int64, err error) {
row := d.db.QueryRow(c, _countMCNCheatUPListSQL, arg.UPMID)
if err = row.Scan(&count); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}
// MCNImportUPInfo .
func (d *Dao) MCNImportUPInfo(c context.Context, arg *model.MCNImportUPInfoReq) (m *model.MCNImportUPInfoReply, err error) {
row := d.db.QueryRow(c, _selMCNImportUPInfoSQL, arg.SignID, arg.UPMID)
m = new(model.MCNImportUPInfoReply)
if err = row.Scan(&m.ID, &m.MCNMID, &m.SignID, &m.UpMID, &m.StandardFansDate, &m.StandardArchiveCount, &m.StandardFansCount, &m.IsReward); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}
// MCNIncreaseList .
func (d *Dao) MCNIncreaseList(c context.Context, arg *model.MCNIncreaseListReq) (res []*model.MCNIncreaseReply, err error) {
sql, values := d.buildMCNIncreaseListSQL("list", arg)
rows, err := d.db.Query(c, sql, values...)
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
m := &model.MCNIncreaseReply{}
err = rows.Scan(&m.ID, &m.SignID, &m.DataType, &m.ActiveTID, &m.GenerateDate, &m.UPCount, &m.FansCountOnlineAccumulate, &m.FansCountRealAccumulate, &m.FansCountCheatAccumulate, &m.FansCountIncreaseDay,
&m.ArchiveCountAccumulate, &m.ArchiveCountDay, &m.PlayCountAccumulate, &m.PlayCountIncreaseDay, &m.FansCountAccumulate)
if err != nil {
return
}
res = append(res, m)
}
return
}
// MCNIncreaseListTotal .
func (d *Dao) MCNIncreaseListTotal(c context.Context, arg *model.MCNIncreaseListReq) (count int64, err error) {
sql, values := d.buildMCNIncreaseListSQL("count", arg)
row := d.db.QueryRow(c, sql, values...)
if err = row.Scan(&count); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}
// buildMCNIncreaseListSQL build a MCNIncreaseList sql string.
func (d *Dao) buildMCNIncreaseListSQL(SQLType string, arg *model.MCNIncreaseListReq) (sql string, values []interface{}) {
values = make([]interface{}, 0, 3)
var (
cond []string
condStr string
)
cond = append(cond, "sign_id=?")
values = append(values, arg.SignID)
if arg.DataType > 0 {
cond = append(cond, "data_type=?")
values = append(values, arg.DataType)
}
if arg.ActiveTID == 0 {
arg.ActiveTID = model.AllActiveTid
}
if arg.ActiveTID > 0 {
cond = append(cond, "active_tid=?")
values = append(values, arg.ActiveTID)
}
condStr = d.joinStringSQL(cond)
switch SQLType {
case "list":
sql = fmt.Sprintf(_selMCNDataSummaryListSQL+_orderByConditionSQL, condStr, "generate_date", "DESC")
limit, offset := arg.PageArg.CheckPageValidation()
values = append(values, offset, limit)
case "count":
sql = fmt.Sprintf(_countMCNDataSummaryListSQL, condStr)
}
return
}

View File

@@ -0,0 +1,535 @@
package up
import (
"context"
"fmt"
"testing"
"go-common/app/admin/main/mcn/model"
"github.com/smartystreets/goconvey/convey"
)
func TestUpTxAddMCNRenewal(t *testing.T) {
convey.Convey("TxAddMCNRenewal", t, func(ctx convey.C) {
var (
tx, err = d.BeginTran(context.Background())
arg = &model.MCNSign{MCNMID: 1}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
lastID, err := d.TxAddMCNRenewal(tx, arg)
defer tx.Rollback()
ctx.Convey("Then err should be nil. lastID should greater than zero.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(lastID, convey.ShouldBeGreaterThan, 0)
})
})
})
}
func TestUpTxAddMCNPays(t *testing.T) {
convey.Convey("TxAddMCNPays", t, func(ctx convey.C) {
var (
tx, err = d.BeginTran(context.Background())
lastID = int64(1)
mcnMID = int64(1)
payInfo1, payInfo2 = &model.SignPayReq{}, &model.SignPayReq{}
arg = []*model.SignPayReq{}
)
payInfo1.DueDate = "2018-10-25"
payInfo1.PayValue = 10000
arg = append(arg, payInfo1)
payInfo2.DueDate = "2018-11-25"
payInfo2.PayValue = 20000
arg = append(arg, payInfo2)
ctx.So(err, convey.ShouldBeNil)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := d.TxAddMCNPays(tx, lastID, mcnMID, arg)
defer tx.Rollback()
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestUpTxAddMCNUPs(t *testing.T) {
convey.Convey("TxAddMCNUPs", t, func(ctx convey.C) {
var (
tx, _ = d.BeginTran(context.Background())
lastID = int64(1)
mcnMID = int64(1)
arg []*model.MCNUP
up = &model.MCNUP{
SignID: 1,
MCNMID: 1,
UPMID: 1,
BeginDate: 0,
EndDate: 0,
ContractLink: "http://www.baidu.com",
UPAuthLink: "http://www.baidu.com",
State: 1,
StateChangeTime: 0,
Permission: 1,
}
)
arg = append(arg, up)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := d.TxAddMCNUPs(tx, lastID, mcnMID, arg)
defer func() {
tx.Rollback()
}()
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestUpUpMCNState(t *testing.T) {
convey.Convey("UpMCNState", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNStateEditReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
rows, err := d.UpMCNState(c, arg)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpUpMCNPay(t *testing.T) {
convey.Convey("UpMCNPay", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNPayEditReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
rows, err := d.UpMCNPay(c, arg)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpUpMCNPayState(t *testing.T) {
convey.Convey("UpMCNPayState", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNPayStateEditReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
rows, err := d.UpMCNPayState(c, arg)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMCNList(t *testing.T) {
convey.Convey("MCNList", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNListReq{}
)
arg.State = -1
arg.Order = "s.mtime"
arg.Sort = "DESC"
arg.Page = 1
arg.Size = 10
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, ids, mids, err := d.MCNList(c, arg)
ctx.Convey("Then err should be nil.res,ids should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(ids, convey.ShouldNotBeNil)
ctx.So(mids, convey.ShouldNotBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestUpbuildMCNListSQL(t *testing.T) {
convey.Convey("buildMCNListSQL", t, func(ctx convey.C) {
var (
SQLType = ""
arg = &model.MCNListReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
sql, values := d.buildMCNListSQL(SQLType, arg)
ctx.Convey("Then sql,values should not be nil.", func(ctx convey.C) {
ctx.So(values, convey.ShouldNotBeNil)
ctx.So(sql, convey.ShouldNotBeNil)
})
})
})
}
func TestUpcheckSort(t *testing.T) {
convey.Convey("checkSort", t, func(ctx convey.C) {
var (
arg = ""
orderSign bool
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
p1 := checkSort(arg, orderSign)
ctx.Convey("Then p1 should not be nil.", func(ctx convey.C) {
ctx.So(p1, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMcnListTotal(t *testing.T) {
convey.Convey("McnListTotal", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNListReq{
State: -1,
}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
count, err := d.MCNListTotal(c, arg)
ctx.Convey("Then err should be nil.count should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(count, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMCNPayInfos(t *testing.T) {
convey.Convey("MCNPayInfos", t, func(ctx convey.C) {
var (
c = context.Background()
ids = []int64{1, 2}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err := d.MCNPayInfos(c, ids)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestUpTxMCNRenewalUPs(t *testing.T) {
convey.Convey("TxMCNRenewalUPs", t, func(ctx convey.C) {
var (
tx, _ = d.BeginTran(context.Background())
signID = int64(1)
mcnID = int64(1)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
ups, err := d.TxMCNRenewalUPs(tx, signID, mcnID)
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
ctx.Convey("Then err should be nil.ups should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
if len(ups) == 0 {
ctx.So(ups, convey.ShouldBeEmpty)
} else {
ctx.So(ups, convey.ShouldNotBeNil)
}
})
})
})
}
func TestUpMCNInfo(t *testing.T) {
convey.Convey("MCNInfo", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNInfoReq{ID: 1}
)
arg.MCNMID = 1
ctx.Convey("When everything gose positive", func(ctx convey.C) {
m, err := d.MCNInfo(c, arg)
ctx.Convey("Then err should be nil.m should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
if m == nil {
ctx.So(m, convey.ShouldBeNil)
} else {
ctx.So(m, convey.ShouldNotBeNil)
}
})
})
})
}
func TestUpMCNUPList(t *testing.T) {
convey.Convey("MCNUPList", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPListReq{}
)
arg.DataType = 1
arg.State = -1
arg.UpType = -1
arg.Order = "u.mtime"
arg.Sort = "DESC"
arg.Page = 1
arg.Size = 10
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err := d.MCNUPList(c, arg)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldBeEmpty)
})
})
})
}
func TestUpMCNUPListTotal(t *testing.T) {
convey.Convey("MCNUPListTotal", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPListReq{}
)
arg.DataType = 1
arg.State = -1
arg.UpType = -1
arg.Order = "u.mtime"
arg.Sort = "DESC"
arg.Page = 1
arg.Size = 10
ctx.Convey("When everything goes positive", func(ctx convey.C) {
count, err := d.MCNUPListTotal(c, arg)
ctx.Convey("Then err should be nil.count should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(count, convey.ShouldNotBeNil)
})
})
})
}
func TestUpbuildMCNUPListSQL(t *testing.T) {
convey.Convey("buildMCNUPListSQL", t, func(ctx convey.C) {
var (
SQLType = ""
arg = &model.MCNUPListReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
sql, values := d.buildMCNUPListSQL(SQLType, arg)
ctx.Convey("Then sql,values should not be nil.", func(ctx convey.C) {
ctx.So(values, convey.ShouldNotBeNil)
ctx.So(sql, convey.ShouldNotBeNil)
})
})
})
}
func TestUpUpMCNUPState(t *testing.T) {
convey.Convey("UpMCNUPState", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPStateEditReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
rows, err := d.UpMCNUPState(c, arg)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMcnSignByMCNMID(t *testing.T) {
convey.Convey("McnSignByMCNMID", t, func(ctx convey.C) {
var (
c = context.Background()
mcnID = int64(1)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
row, err := d.McnSignByMCNMID(c, mcnID)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(row, convey.ShouldNotBeEmpty)
})
})
})
}
func TestUpMCNCheatList(t *testing.T) {
convey.Convey("TestUpMCNCheatList", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNCheatListReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
rows, mids, err := d.MCNCheatList(c, arg)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
for k, r := range rows {
fmt.Printf("%d:%+v \n", k, r)
}
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
ctx.So(mids, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMCNCheatListTotal(t *testing.T) {
convey.Convey("TestUpMCNCheatListTotal", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNCheatListReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
count, err := d.MCNCheatListTotal(c, arg)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
fmt.Printf("count:%d \n", count)
ctx.So(err, convey.ShouldBeNil)
ctx.So(count, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMCNCheatUPList(t *testing.T) {
convey.Convey("TestUpMCNCheatUPList", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNCheatUPListReq{UPMID: 1}
)
arg.Page = 1
arg.Size = 10
ctx.Convey("When everything goes positive", func(ctx convey.C) {
rows, err := d.MCNCheatUPList(c, arg)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
for k, r := range rows {
fmt.Printf("%d:%+v \n", k, r)
}
ctx.So(err, convey.ShouldBeNil)
if len(rows) == 0 {
ctx.So(rows, convey.ShouldBeEmpty)
} else {
ctx.So(rows, convey.ShouldNotBeNil)
}
})
})
})
}
func TestUpMCNCheatUPListTotal(t *testing.T) {
convey.Convey("TestUpMCNCheatUPListTotal", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNCheatUPListReq{UPMID: 1}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
count, err := d.MCNCheatUPListTotal(c, arg)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
fmt.Printf("count:%d \n", count)
ctx.So(err, convey.ShouldBeNil)
ctx.So(count, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMCNImportUPInfo(t *testing.T) {
convey.Convey("TestUpMCNImportUPInfo", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNImportUPInfoReq{UPMID: 1}
)
arg.SignID = 1
ctx.Convey("When everything gose positive", func(ctx convey.C) {
res, err := d.MCNImportUPInfo(c, arg)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
fmt.Printf("res:%+v \n", res)
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestUpUpMCNImportUPRewardSign(t *testing.T) {
convey.Convey("TestUpUpMCNImportUPRewardSign", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNImportUPRewardSignReq{UPMID: 1}
)
arg.SignID = 1
ctx.Convey("When everything gose positive", func(ctx convey.C) {
res, err := d.UpMCNImportUPRewardSign(c, arg)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
fmt.Printf("res:%+v \n", res)
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestUpUpMCNPermission(t *testing.T) {
convey.Convey("UpMCNPermission", t, func(ctx convey.C) {
var (
c = context.Background()
signID = int64(0)
permission = uint32(0)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
rows, err := d.UpMCNPermission(c, signID, permission)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMCNIncreaseList(t *testing.T) {
convey.Convey("TestUpMCNIncreaseList", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNIncreaseListReq{}
)
arg.SignID = 99
ctx.Convey("When everything gose positive", func(ctx convey.C) {
rows, err := d.MCNIncreaseList(c, arg)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
for k, r := range rows {
fmt.Printf("%d:%+v \n", k, r)
}
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMCNIncreaseListTotal(t *testing.T) {
convey.Convey("TestUpMCNIncreaseListTotal", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNIncreaseListReq{}
)
arg.SignID = 99
ctx.Convey("When everything gose positive", func(ctx convey.C) {
count, err := d.MCNIncreaseListTotal(c, arg)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
fmt.Printf("count:%d \n", count)
ctx.So(err, convey.ShouldBeNil)
ctx.So(count, convey.ShouldNotBeNil)
})
})
})
}

View File

@@ -0,0 +1,257 @@
package up
import (
"bytes"
"context"
"database/sql"
"fmt"
"sync"
"go-common/app/admin/main/mcn/model"
xsql "go-common/library/database/sql"
"go-common/library/xstr"
)
const (
// private condition
_inMcnUpRecommendSQL = `INSERT mcn_up_recommend_pool(up_mid,fans_count,archive_count,play_count_accumulate,play_count_average,active_tid,source) VALUES (?,?,?,?,?,?,2)
ON DUPLICATE KEY UPDATE fans_count=?, archive_count=?, play_count_accumulate=?, play_count_average=?, active_tid=?, state=1, source=2, fans_count_increase_month=0,
last_archive_time='1970-01-01 08:00:00', generate_time='1970-01-01 08:00:00'`
_upMcnUpRecommendOPSQL = "UPDATE mcn_up_recommend_pool SET state = ? WHERE up_mid IN (%s)"
_mcnUpRecommendsSQL = `SELECT id,up_mid,fans_count,fans_count_increase_month,archive_count,
play_count_accumulate,play_count_average,active_tid,last_archive_time,state,source,generate_time,ctime,mtime FROM mcn_up_recommend_pool %s`
_mcnUpRecommendTotalSQL = "SELECT COUNT(1) FROM mcn_up_recommend_pool %s"
_mcnUpBindMidsSQL = "SELECT up_mid FROM mcn_up WHERE up_mid IN (%s) AND state IN (2,10,11,15)"
_mcnUpRecommendMidSQL = `SELECT id,up_mid,fans_count,fans_count_increase_month,archive_count,
play_count_accumulate,play_count_average,active_tid,last_archive_time,state,source,generate_time,ctime,mtime FROM mcn_up_recommend_pool WHERE up_mid = ?`
_mcnUpRecommendMidsSQL = `SELECT id,up_mid,fans_count,fans_count_increase_month,archive_count,
play_count_accumulate,play_count_average,active_tid,last_archive_time,state,source,generate_time,ctime,mtime FROM mcn_up_recommend_pool WHERE up_mid IN (%s)`
// common condition
_orderByConditionSQL = " %s ORDER BY %s %s LIMIT ?,?"
_orderByConditionNotLimitSQL = " %s ORDER BY %s %s"
_orderByNoConditionSQL = " ORDER BY %s %s LIMIT ?,?"
_orderByNoConditionNotLimitSQL = " ORDER BY %s %s"
)
// AddMcnUpRecommend .
func (d *Dao) AddMcnUpRecommend(c context.Context, arg *model.McnUpRecommendPool) (rows int64, err error) {
var res sql.Result
if res, err = d.db.Exec(c, _inMcnUpRecommendSQL, arg.UpMid, arg.FansCount, arg.ArchiveCount, arg.PlayCountAccumulate, arg.PlayCountAverage, arg.ActiveTid,
arg.FansCount, arg.ArchiveCount, arg.PlayCountAccumulate, arg.PlayCountAverage, arg.ActiveTid); err != nil {
return rows, err
}
return res.RowsAffected()
}
// UpMcnUpsRecommendOP .
func (d *Dao) UpMcnUpsRecommendOP(c context.Context, upMids []int64, state model.MCNUPRecommendState) (rows int64, err error) {
var res sql.Result
if res, err = d.db.Exec(c, fmt.Sprintf(_upMcnUpRecommendOPSQL, xstr.JoinInts(upMids)), state); err != nil {
return rows, err
}
return res.RowsAffected()
}
// McnUpRecommends .
func (d *Dao) McnUpRecommends(c context.Context, arg *model.MCNUPRecommendReq) (res []*model.McnUpRecommendPool, err error) {
sql, values := d.buildUpRecommendSQL("list", arg)
rows, err := d.db.Query(c, sql, values...)
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
m := &model.McnUpRecommendPool{}
err = rows.Scan(&m.ID, &m.UpMid, &m.FansCount, &m.FansCountIncreaseMonth, &m.ArchiveCount, &m.PlayCountAccumulate, &m.PlayCountAverage,
&m.ActiveTid, &m.LastArchiveTime, &m.State, &m.Source, &m.GenerateTime, &m.Ctime, &m.Mtime)
if err != nil {
if err == xsql.ErrNoRows {
err = nil
}
res = nil
return
}
res = append(res, m)
}
return
}
// McnUpRecommendTotal .
func (d *Dao) McnUpRecommendTotal(c context.Context, arg *model.MCNUPRecommendReq) (count int, err error) {
sql, values := d.buildUpRecommendSQL("count", arg)
row := d.db.QueryRow(c, sql, values...)
if err = row.Scan(&count); err != nil {
if err == xsql.ErrNoRows {
err = nil
return
}
}
return
}
// McnUpBindMids .
func (d *Dao) McnUpBindMids(c context.Context, mids []int64) (bmids []int64, err error) {
rows, err := d.db.Query(c, fmt.Sprintf(_mcnUpBindMidsSQL, xstr.JoinInts(mids)))
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
var upMids int64
err = rows.Scan(&upMids)
if err != nil {
if err == xsql.ErrNoRows {
err = nil
}
return
}
bmids = append(bmids, upMids)
}
return
}
// McnUpRecommendMid .
func (d *Dao) McnUpRecommendMid(c context.Context, mid int64) (m *model.McnUpRecommendPool, err error) {
row := d.db.QueryRow(c, _mcnUpRecommendMidSQL, mid)
m = &model.McnUpRecommendPool{}
err = row.Scan(&m.ID, &m.UpMid, &m.FansCount, &m.FansCountIncreaseMonth, &m.ArchiveCount, &m.PlayCountAccumulate, &m.PlayCountAverage,
&m.ActiveTid, &m.LastArchiveTime, &m.State, &m.Source, &m.GenerateTime, &m.Ctime, &m.Mtime)
if err != nil {
if err == xsql.ErrNoRows {
err = nil
}
m = nil
return
}
return
}
// McnUpRecommendMids .
func (d *Dao) McnUpRecommendMids(c context.Context, mids []int64) (mrp map[int64]*model.McnUpRecommendPool, err error) {
rows, err := d.db.Query(c, fmt.Sprintf(_mcnUpRecommendMidsSQL, xstr.JoinInts(mids)))
if err != nil {
return
}
defer rows.Close()
mrp = make(map[int64]*model.McnUpRecommendPool, len(mids))
for rows.Next() {
m := &model.McnUpRecommendPool{}
err = rows.Scan(&m.ID, &m.UpMid, &m.FansCount, &m.FansCountIncreaseMonth, &m.ArchiveCount, &m.PlayCountAccumulate, &m.PlayCountAverage,
&m.ActiveTid, &m.LastArchiveTime, &m.State, &m.Source, &m.GenerateTime, &m.Ctime, &m.Mtime)
if err != nil {
if err == xsql.ErrNoRows {
err = nil
}
mrp = nil
return
}
mrp[m.UpMid] = m
}
return
}
// buildUpRecommendSQL build a up recommend sql string.
func (d *Dao) buildUpRecommendSQL(tp string, arg *model.MCNUPRecommendReq) (sql string, values []interface{}) {
values = make([]interface{}, 0, 11)
var (
cond []string
condStr string
)
if arg.TID != 0 {
cond = append(cond, "active_tid = ?")
values = append(values, arg.TID)
}
if arg.UpMid != 0 {
cond = append(cond, "up_mid = ?")
values = append(values, arg.UpMid)
}
if arg.FansMin != 0 {
cond = append(cond, "fans_count >= ?")
values = append(values, arg.FansMin)
}
if arg.FansMax != 0 {
cond = append(cond, "fans_count <= ?")
values = append(values, arg.FansMax)
}
if arg.PlayMin != 0 {
cond = append(cond, "play_count_accumulate >= ?")
values = append(values, arg.PlayMin)
}
if arg.PlayMax != 0 {
cond = append(cond, "play_count_accumulate <= ?")
values = append(values, arg.PlayMax)
}
if arg.PlayAverageMin != 0 {
cond = append(cond, "play_count_average >= ?")
values = append(values, arg.PlayAverageMin)
}
if arg.PlayAverageMax != 0 {
cond = append(cond, "play_count_average <= ?")
values = append(values, arg.PlayAverageMax)
}
if arg.State != model.MCNUPRecommendStateUnKnown {
cond = append(cond, "state = ?")
values = append(values, arg.State)
} else {
cond = append(cond, "state IN (1,2,3)")
}
if arg.Source != model.MCNUPRecommendSourceUnKnown {
cond = append(cond, "source = ?")
values = append(values, arg.Source)
}
condStr = d.joinStringSQL(cond)
switch tp {
case "count":
if condStr != "" {
sql = fmt.Sprintf(_mcnUpRecommendTotalSQL+" %s", "WHERE", condStr)
return
}
sql = fmt.Sprintf(_mcnUpRecommendTotalSQL, condStr)
case "list":
// 导出
if arg.Export == model.ResponeModelCSV {
if condStr != "" {
sql = fmt.Sprintf(_mcnUpRecommendsSQL+_orderByConditionNotLimitSQL, "WHERE", condStr, arg.Order, arg.Sort)
return
}
sql = fmt.Sprintf(_mcnUpRecommendsSQL+_orderByNoConditionNotLimitSQL, condStr, arg.Order, arg.Sort)
return
}
// 非导出
if condStr != "" {
sql = fmt.Sprintf(_mcnUpRecommendsSQL+_orderByConditionSQL, "WHERE", condStr, arg.Order, arg.Sort)
} else {
sql = fmt.Sprintf(_mcnUpRecommendsSQL+_orderByNoConditionSQL, condStr, arg.Order, arg.Sort)
}
limit, offset := arg.PageArg.CheckPageValidation()
values = append(values, offset, limit)
}
return
}
func (d *Dao) joinStringSQL(is []string) string {
if len(is) == 0 {
return ""
}
if len(is) == 1 {
return is[0]
}
var bfPool = sync.Pool{
New: func() interface{} {
return bytes.NewBuffer([]byte{})
},
}
buf := bfPool.Get().(*bytes.Buffer)
for _, i := range is {
buf.WriteString(i)
buf.WriteString(" AND ")
}
if buf.Len() > 0 {
buf.Truncate(buf.Len() - 4)
}
s := buf.String()
buf.Reset()
bfPool.Put(buf)
return s
}

View File

@@ -0,0 +1,146 @@
package up
import (
"context"
"testing"
"go-common/app/admin/main/mcn/model"
"github.com/smartystreets/goconvey/convey"
)
func TestUpAddMcnUpRecommend(t *testing.T) {
convey.Convey("AddMcnUpRecommend", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.McnUpRecommendPool{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
rows, err := d.AddMcnUpRecommend(c, arg)
d.db.Exec(c, "delete from mcn_up_recommend_pool where up_mid=0")
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpUpMcnUpsRecommendOP(t *testing.T) {
convey.Convey("UpMcnUpsRecommendOP", t, func(ctx convey.C) {
var (
c = context.Background()
upMids = []int64{1, 2}
state = model.MCNUPRecommendState(2)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
rows, err := d.UpMcnUpsRecommendOP(c, upMids, state)
ctx.Convey("Then err should be nil.rows should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(rows, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMcnUpRecommends(t *testing.T) {
convey.Convey("McnUpRecommends", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPRecommendReq{}
)
arg.Order = "mtime"
arg.Sort = "DESC"
arg.Page = 1
arg.Size = 10
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err := d.McnUpRecommends(c, arg)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMcnUpRecommendTotal(t *testing.T) {
convey.Convey("McnUpRecommendTotal", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPRecommendReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
count, err := d.McnUpRecommendTotal(c, arg)
ctx.Convey("Then err should be nil.count should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(count, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMcnUpBindMids(t *testing.T) {
convey.Convey("McnUpBindMids", t, func(ctx convey.C) {
var (
c = context.Background()
mids = []int64{1, 2}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
bmids, err := d.McnUpBindMids(c, mids)
ctx.Convey("Then err should be nil.bmids should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
if len(bmids) == 0 {
ctx.So(bmids, convey.ShouldBeEmpty)
} else {
ctx.So(bmids, convey.ShouldNotBeNil)
}
})
})
})
}
func TestUpMcnUpRecommendMid(t *testing.T) {
convey.Convey("McnUpRecommendMid", t, func(ctx convey.C) {
var (
c = context.Background()
mid = int64(0)
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
m, err := d.McnUpRecommendMid(c, mid)
ctx.Convey("Then err should be nil.m should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(m, convey.ShouldBeNil)
})
})
})
}
func TestUpbuildUpRecommendSQL(t *testing.T) {
convey.Convey("buildUpRecommendSQL", t, func(ctx convey.C) {
var (
tp = ""
arg = &model.MCNUPRecommendReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
sql, values := d.buildUpRecommendSQL(tp, arg)
ctx.Convey("Then sql,values should not be nil.", func(ctx convey.C) {
ctx.So(values, convey.ShouldNotBeNil)
ctx.So(sql, convey.ShouldNotBeNil)
})
})
})
}
func TestUpjoinStringSQL(t *testing.T) {
convey.Convey("joinStringSQL", t, func(ctx convey.C) {
var (
is = []string{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
p1 := d.joinStringSQL(is)
ctx.Convey("Then p1 should not be nil.", func(ctx convey.C) {
ctx.So(p1, convey.ShouldNotBeNil)
})
})
})
}

View File

@@ -0,0 +1,53 @@
package up
import (
"context"
"fmt"
"strconv"
gmc "go-common/library/cache/memcache"
"go-common/library/log"
)
const (
_mcnSign = "mcn_s_"
_mcnUpper = "mcn_upperm_%d_%d"
)
// user mcn sign key.
func mcnSignKey(mcnMid int64) string {
return _mcnSign + strconv.FormatInt(mcnMid, 10)
}
// user upper key.
func mcnUpperKey(signID, upMid int64) string {
return fmt.Sprintf(_mcnUpper, signID, upMid)
}
// DelMcnSignCache del mcn sign cache info.
func (d *Dao) DelMcnSignCache(c context.Context, mcnMid int64) (err error) {
conn := d.mc.Get(c)
defer conn.Close()
if err = conn.Delete(mcnSignKey(mcnMid)); err != nil {
if err == gmc.ErrNotFound {
err = nil
return
}
log.Error("conn.Delete(%d) error(%v)", mcnMid, err)
}
return
}
// DelMcnUpperCache del mcn upper cache.
func (d *Dao) DelMcnUpperCache(c context.Context, signID, upMid int64) (err error) {
conn := d.mc.Get(c)
defer conn.Close()
if err = conn.Delete(mcnUpperKey(signID, upMid)); err != nil {
if err == gmc.ErrNotFound {
err = nil
return
}
log.Error("conn.Delete(%d, %d) error(%v)", signID, upMid, err)
}
return
}

View File

@@ -0,0 +1,68 @@
package up
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestUpmcnSignKey(t *testing.T) {
convey.Convey("mcnSignKey", t, func(ctx convey.C) {
var (
mcnMid = int64(0)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
p1 := mcnSignKey(mcnMid)
ctx.Convey("Then p1 should not be nil.", func(ctx convey.C) {
ctx.So(p1, convey.ShouldNotBeNil)
})
})
})
}
func TestUpmcnUpperKey(t *testing.T) {
convey.Convey("mcnUpperKey", t, func(ctx convey.C) {
var (
signID = int64(0)
upMid = int64(0)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
p1 := mcnUpperKey(signID, upMid)
ctx.Convey("Then p1 should not be nil.", func(ctx convey.C) {
ctx.So(p1, convey.ShouldNotBeNil)
})
})
})
}
func TestUpDelMcnSignCache(t *testing.T) {
convey.Convey("DelMcnSignCache", t, func(ctx convey.C) {
var (
c = context.Background()
mcnMid = int64(0)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.DelMcnSignCache(c, mcnMid)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestUpDelMcnUpperCache(t *testing.T) {
convey.Convey("DelMcnUpperCache", t, func(ctx convey.C) {
var (
c = context.Background()
signID = int64(0)
upMid = int64(0)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.DelMcnUpperCache(c, signID, upMid)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}

View File

@@ -0,0 +1,261 @@
package up
import (
"context"
"fmt"
"net/url"
"go-common/app/admin/main/mcn/model"
dtmdl "go-common/app/interface/main/mcn/model/datamodel"
ifmdl "go-common/app/interface/main/mcn/model/mcnmodel"
xsql "go-common/library/database/sql"
"go-common/library/ecode"
"go-common/library/net/metadata"
xtime "go-common/library/time"
"github.com/pkg/errors"
)
const (
_mcnDataOverviewSQL = `SELECT mcns, sign_ups, sign_ups_incr, fans_50, fans_10, fans_1, fans_incr_50, fans_incr_10, fans_incr_1 FROM mcn_data_overview WHERE generate_date = ?`
_mcnRankFansOverviewSQL = `SELECT id, sign_id, mid, data_view, data_type, rank, fans_incr, fans FROM mcn_rank_fans_overview WHERE data_view IN (1,2,3,4) AND data_type = ? AND generate_date = ? ORDER BY rank ASC limit ?`
_mcnRankArchiveLikesOverviewSQL = `SELECT id, mcn_mid, up_mid, sign_id, avid, tid, rank, data_type, likes, plays FROM mcn_rank_archive_likes_overview WHERE data_type = ? AND generate_date = ? ORDER BY rank ASC limit ?`
_mcnDataTypeSummarySQL = `SELECT id, tid, data_view, data_type, amount FROM mcn_data_type_summary WHERE data_view IN (1,2,3,4) AND data_type IN (1,2) AND generate_date = ?`
_arcTopURL = "/x/internal/mcn/rank/archive_likes"
_dataFansURL = "/x/internal/mcn/data/fans"
_dataFansBaseAttrURL = "/x/internal/mcn/data/fans/base/attr"
_dataFansAreaURL = "/x/internal/mcn/data/fans/area"
_dataFansTypeURL = "/x/internal/mcn/data/fans/type"
_dataFansTagURL = "/x/internal/mcn/data/fans/tag"
)
// McnDataOverview .
func (d *Dao) McnDataOverview(c context.Context, date xtime.Time) (m *model.McnDataOverview, err error) {
row := d.db.QueryRow(c, _mcnDataOverviewSQL, date)
m = new(model.McnDataOverview)
if err = row.Scan(&m.Mcns, &m.SignUps, &m.SignUpsIncr, &m.Fans50, &m.Fans10, &m.Fans1, &m.FansIncr50, &m.FansIncr10, &m.FansIncr1); err != nil {
if err == xsql.ErrNoRows {
err = nil
m = nil
return
}
}
return
}
// McnRankFansOverview .
func (d *Dao) McnRankFansOverview(c context.Context, dataType model.DataType, date xtime.Time, topLen int) (mrf map[int8][]*model.McnRankFansOverview, mids []int64, err error) {
rows, err := d.db.Query(c, _mcnRankFansOverviewSQL, dataType, date, topLen*4)
if err != nil {
return
}
defer rows.Close()
mrf = make(map[int8][]*model.McnRankFansOverview, topLen*4)
for rows.Next() {
rf := new(model.McnRankFansOverview)
err = rows.Scan(&rf.ID, &rf.SignID, &rf.Mid, &rf.DataView, &rf.DataType, &rf.Rank, &rf.FansIncr, &rf.Fans)
if err != nil {
if err == xsql.ErrNoRows {
err = nil
}
return
}
mids = append(mids, rf.Mid)
mrf[rf.DataView] = append(mrf[rf.DataView], rf)
}
err = rows.Err()
return
}
// McnRankArchiveLikesOverview .
func (d *Dao) McnRankArchiveLikesOverview(c context.Context, dataType model.DataType, date xtime.Time, topLen int) (ras []*model.McnRankArchiveLikesOverview, mids, avids, tids []int64, err error) {
rows, err := d.db.Query(c, _mcnRankArchiveLikesOverviewSQL, dataType, date, topLen)
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
ra := new(model.McnRankArchiveLikesOverview)
err = rows.Scan(&ra.ID, &ra.McnMid, &ra.UpMid, &ra.SignID, &ra.Avid, &ra.Tid, &ra.Rank, &ra.DataType, &ra.Likes, &ra.Plays)
if err != nil {
if err == xsql.ErrNoRows {
err = nil
}
return
}
ras = append(ras, ra)
mids = append(mids, ra.McnMid)
mids = append(mids, ra.UpMid)
avids = append(avids, ra.Avid)
tids = append(tids, int64(ra.Tid))
}
err = rows.Err()
return
}
// McnDataTypeSummary .
func (d *Dao) McnDataTypeSummary(c context.Context, date xtime.Time) (mmd map[string][]*model.McnDataTypeSummary, tids []int64, err error) {
rows, err := d.db.Query(c, _mcnDataTypeSummarySQL, date)
if err != nil {
return
}
defer rows.Close()
mmd = make(map[string][]*model.McnDataTypeSummary)
for rows.Next() {
md := new(model.McnDataTypeSummary)
err = rows.Scan(&md.ID, &md.Tid, &md.DataView, &md.DataType, &md.Amount)
if err != nil {
if err == xsql.ErrNoRows {
err = nil
}
return
}
tids = append(tids, int64(md.Tid))
mmd[fmt.Sprintf("%d-%d", md.DataView, md.DataType)] = append(mmd[fmt.Sprintf("%d-%d", md.DataView, md.DataType)], md)
}
err = rows.Err()
return
}
// ArcTopDataStatistics .
func (d *Dao) ArcTopDataStatistics(c context.Context, arg *model.McnGetRankReq) (reply *model.McnGetRankUpFansReply, err error) {
params := url.Values{}
params.Set("sign_id", fmt.Sprintf("%d", arg.SignID))
params.Set("tid", fmt.Sprintf("%d", arg.Tid))
params.Set("data_type", fmt.Sprintf("%d", arg.DataType))
var res struct {
Code int `json:"code"`
Data *model.McnGetRankUpFansReply `json:"data"`
}
if err = d.client.Get(c, d.arcTopURL, metadata.String(c, metadata.RemoteIP), params, &res); err != nil {
return
}
if res.Code != 0 {
err = errors.Wrapf(ecode.Int(res.Code), "arcRankFansTop d.client.Get(%s,%d)", d.arcTopURL+"?"+params.Encode(), res.Code)
}
reply = res.Data
if reply != nil {
for _, v := range reply.Result {
v.PlayAccumulate = int64(v.Stat.View)
}
}
return
}
// DataFans .
func (d *Dao) DataFans(c context.Context, arg *model.McnCommonReq) (reply *dtmdl.DmConMcnFansD, err error) {
params := url.Values{}
params.Set("sign_id", fmt.Sprintf("%d", arg.SignID))
var res struct {
Code int `json:"code"`
Data *ifmdl.McnGetMcnFansReply `json:"data"`
}
if err = d.client.Get(c, d.dataFansURL, metadata.String(c, metadata.RemoteIP), params, &res); err != nil {
return
}
if res.Code != 0 {
err = errors.Wrapf(ecode.Int(res.Code), "dataFans d.client.Get(%s,%d)", d.dataFansURL+"?"+params.Encode(), res.Code)
}
if res.Data == nil {
return
}
reply = &dtmdl.DmConMcnFansD{
LogDate: res.Data.LogDate,
FansAll: res.Data.FansAll,
FansInc: res.Data.FansInc,
ActFans: res.Data.ActFans,
FansDecAll: res.Data.FansDecAll,
FansDec: res.Data.FansDec,
}
return
}
// DataFansBaseAttr .
func (d *Dao) DataFansBaseAttr(c context.Context, arg *model.McnCommonReq) (sex *dtmdl.DmConMcnFansSexW, age *dtmdl.DmConMcnFansAgeW, playWay *dtmdl.DmConMcnFansPlayWayW, err error) {
params := url.Values{}
params.Set("sign_id", fmt.Sprintf("%d", arg.SignID))
params.Set("user_type", ifmdl.UserTypeFans)
var res struct {
Code int `json:"code"`
Data *ifmdl.McnGetBaseFansAttrReply `json:"data"`
}
if err = d.client.Get(c, d.dataFansBaseAttrURL, metadata.String(c, metadata.RemoteIP), params, &res); err != nil {
return
}
if res.Code != 0 {
err = errors.Wrapf(ecode.Int(res.Code), "aataFansBaseAttr d.client.Get(%s,%d)", d.dataFansBaseAttrURL+"?"+params.Encode(), res.Code)
}
if res.Data == nil {
return
}
sex = res.Data.FansSex
age = res.Data.FansAge
playWay = res.Data.FansPlayWay
return
}
// DataFansArea .
func (d *Dao) DataFansArea(c context.Context, arg *model.McnCommonReq) (reply []*dtmdl.DmConMcnFansAreaW, err error) {
params := url.Values{}
params.Set("sign_id", fmt.Sprintf("%d", arg.SignID))
params.Set("user_type", ifmdl.UserTypeFans)
var res struct {
Code int `json:"code"`
Data *ifmdl.McnGetFansAreaReply `json:"data"`
}
if err = d.client.Get(c, d.dataFansAreaURL, metadata.String(c, metadata.RemoteIP), params, &res); err != nil {
return
}
if res.Code != 0 {
err = errors.Wrapf(ecode.Int(res.Code), "dataFansArea d.client.Get(%s,%d)", d.dataFansAreaURL+"?"+params.Encode(), res.Code)
}
if res.Data == nil {
return
}
reply = res.Data.Result
return
}
// DataFansType .
func (d *Dao) DataFansType(c context.Context, arg *model.McnCommonReq) (reply []*dtmdl.DmConMcnFansTypeW, err error) {
params := url.Values{}
params.Set("sign_id", fmt.Sprintf("%d", arg.SignID))
params.Set("user_type", ifmdl.UserTypeFans)
var res struct {
Code int `json:"code"`
Data *ifmdl.McnGetFansTypeReply `json:"data"`
}
if err = d.client.Get(c, d.dataFansTypeURL, metadata.String(c, metadata.RemoteIP), params, &res); err != nil {
return
}
if res.Code != 0 {
err = errors.Wrapf(ecode.Int(res.Code), "dataFansType d.client.Get(%s,%d)", d.dataFansTypeURL+"?"+params.Encode(), res.Code)
}
if res.Data == nil {
return
}
reply = res.Data.Result
return
}
// DataFansTag .
func (d *Dao) DataFansTag(c context.Context, arg *model.McnCommonReq) (reply []*dtmdl.DmConMcnFansTagW, err error) {
params := url.Values{}
params.Set("sign_id", fmt.Sprintf("%d", arg.SignID))
params.Set("user_type", ifmdl.UserTypeFans)
var res struct {
Code int `json:"code"`
Data *ifmdl.McnGetFansTagReply `json:"data"`
}
if err = d.client.Get(c, d.dataFansTagURL, metadata.String(c, metadata.RemoteIP), params, &res); err != nil {
return
}
if res.Code != 0 {
err = errors.Wrapf(ecode.Int(res.Code), "dataFansTag d.client.Get(%s,%d)", d.dataFansTagURL+"?"+params.Encode(), res.Code)
}
if res.Data == nil {
return
}
reply = res.Data.Result
return
}

View File

@@ -0,0 +1,313 @@
package up
import (
"context"
"testing"
"go-common/app/admin/main/mcn/model"
xtime "go-common/library/time"
"github.com/smartystreets/goconvey/convey"
"gopkg.in/h2non/gock.v1"
)
func TestUpMcnDataOverview(t *testing.T) {
convey.Convey("McnDataOverview", t, func(ctx convey.C) {
var (
c = context.Background()
date = xtime.Time(1542124800)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
m, err := d.McnDataOverview(c, date)
ctx.Convey("Then err should be nil.m should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(m, convey.ShouldBeNil)
})
})
})
}
func TestUpMcnRankFansOverview(t *testing.T) {
convey.Convey("McnRankFansOverview", t, func(ctx convey.C) {
var (
c = context.Background()
dataType = model.DataType(2)
date = xtime.Time(1542124800)
topLen = int(5)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
mrf, mids, err := d.McnRankFansOverview(c, dataType, date, topLen)
ctx.Convey("Then err should be nil.mrf,mids should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(mids, convey.ShouldBeNil)
ctx.So(mrf, convey.ShouldNotBeNil)
})
})
})
}
func TestUpMcnRankArchiveLikesOverview(t *testing.T) {
convey.Convey("McnRankArchiveLikesOverview", t, func(ctx convey.C) {
var (
c = context.Background()
dataType = model.DataType(2)
date = xtime.Time(1542124800)
topLen = int(5)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
ras, mids, avids, tids, err := d.McnRankArchiveLikesOverview(c, dataType, date, topLen)
ctx.Convey("Then err should be nil.ras,mids,avids,tids should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(tids, convey.ShouldBeNil)
ctx.So(avids, convey.ShouldBeNil)
ctx.So(mids, convey.ShouldBeNil)
ctx.So(ras, convey.ShouldBeNil)
})
})
})
}
func TestUpMcnDataTypeSummary(t *testing.T) {
convey.Convey("McnDataTypeSummary", t, func(ctx convey.C) {
var (
c = context.Background()
date = xtime.Time(1542124800)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
mmd, tids, err := d.McnDataTypeSummary(c, date)
ctx.Convey("Then err should be nil.mmd,tids should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(tids, convey.ShouldBeNil)
ctx.So(mmd, convey.ShouldNotBeNil)
})
})
})
}
func TestUpArcTopDataStatistics(t *testing.T) {
convey.Convey("ArcTopDataStatistics", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.McnGetRankReq{}
)
arg.SignID = 214
ctx.Convey("When everything gose positive", func(ctx convey.C) {
defer gock.OffAll()
result := `
{
"message":"0",
"code":0,
"data":{
"type_list":[
{
"tid":1,
"name":"视频"
}
],
"result":[
{
"data_type":1,
"likes_increase":13,
"likes_accumulate":13,
"play_increase":7,
"archive_id":10110514,
"archive_title":"不同清晰度",
"pic":"http://i1.hdslb.com/bfs/archive/3348cb2cb34423f936916444a0a77e59f9daf1d",
"tid_name":"日常",
"tid":21,
"ctime":1535362150,
"author":{
"face":"http://static.hdslb.com/images/member/noface.gif",
"mid":27515266,
"name":"Testeew还觉得是发货"
},
"stat":{
"view":0
}
}
]
},
"ttl":1
}`
httpMock("GET", d.arcTopURL).Reply(200).JSON(result)
reply, err := d.ArcTopDataStatistics(c, arg)
ctx.Convey("Then err should be nil.reply should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(reply, convey.ShouldNotBeNil)
})
})
})
}
func TestUpDataFans(t *testing.T) {
convey.Convey("DataFans", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.McnCommonReq{SignID: 1}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
defer gock.OffAll()
result := `{
"message":"",
"code":0,
"data":{
"fans_all":0,
"fans_inc":0,
"act_fans":0,
"fans_dec_all":0,
"fans_dec":0,
"view_fans_rate":0,
"act_fans_rate":0,
"reply_fans_rate":0,
"danmu_fans_rate":0,
"coin_fans_rate":0,
"like_fans_rate":0,
"fav_fans_rate":0,
"share_fans_rate":0,
"live_gift_fans_rate":0,
"live_danmu_fans_rate":0
}
}`
httpMock("GET", d.dataFansURL).Reply(200).JSON(result)
reply, err := d.DataFans(c, arg)
ctx.Convey("Then err should be nil.reply should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(reply, convey.ShouldNotBeNil)
})
})
})
}
func TestUpDataFansBaseAttr(t *testing.T) {
convey.Convey("DataFansBaseAttr", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.McnCommonReq{SignID: 1}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
defer gock.OffAll()
result := `{
"message":"",
"code":0,
"data":{
"fans_sex":{
"male":0,
"female":0
},
"fans_age":{
"a":0,
"b":0,
"c":0,
"d":0
},
"fans_play_way":{
"app":0,
"pc":0,
"outside":0,
"other":0
}
}
}`
httpMock("GET", d.dataFansBaseAttrURL).Reply(200).JSON(result)
sex, age, playWay, err := d.DataFansBaseAttr(c, arg)
ctx.Convey("Then err should be nil.sex,age,playWay should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(playWay, convey.ShouldNotBeNil)
ctx.So(age, convey.ShouldNotBeNil)
ctx.So(sex, convey.ShouldNotBeNil)
})
})
})
}
func TestUpDataFansArea(t *testing.T) {
convey.Convey("DataFansArea", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.McnCommonReq{SignID: 1}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
defer gock.OffAll()
result := `{
"message":"",
"code":0,
"data":{
"result":[
{
"province":"",
"user":0
}
]
}
}`
httpMock("GET", d.dataFansAreaURL).Reply(200).JSON(result)
reply, err := d.DataFansArea(c, arg)
ctx.Convey("Then err should be nil.reply should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(reply, convey.ShouldNotBeNil)
})
})
})
}
func TestUpDataFansType(t *testing.T) {
convey.Convey("DataFansType", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.McnCommonReq{SignID: 1}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
defer gock.OffAll()
result := `{
"message":"",
"code":0,
"data":{
"result":[
{
"type_id":0,
"user":0,
"type_name":""
}
]
}
}`
httpMock("GET", d.dataFansTypeURL).Reply(200).JSON(result)
reply, err := d.DataFansType(c, arg)
ctx.Convey("Then err should be nil.reply should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(reply, convey.ShouldNotBeNil)
})
})
})
}
func TestUpDataFansTag(t *testing.T) {
convey.Convey("DataFansTag", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.McnCommonReq{SignID: 1}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
defer gock.OffAll()
result := `{
"message":"",
"code":0,
"data":{
"result":[
{
"tag_id":0,
"user":0,
"tag_name":""
}
]
}
}`
httpMock("GET", d.dataFansTagURL).Reply(200).JSON(result)
reply, err := d.DataFansTag(c, arg)
ctx.Convey("Then err should be nil.reply should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(reply, convey.ShouldNotBeNil)
})
})
})
}

View File

@@ -0,0 +1,56 @@
package up
import (
"context"
"fmt"
"go-common/app/admin/main/mcn/model"
xsql "go-common/library/database/sql"
"go-common/library/xstr"
)
const (
_selUpBaseInfoMapSQL = "SELECT mid,fans_count,active_tid,article_count_accumulate FROM up_base_info WHERE mid IN (%s) AND business_type = 1"
_selUpPlayInfoMapSQL = "SELECT mid,play_count_accumulate,article_count FROM up_play_info WHERE mid IN (%s) AND business_type = 1"
)
// UpBaseInfoMap .
func (d *Dao) UpBaseInfoMap(c context.Context, mids []int64) (mbi map[int64]*model.UpBaseInfo, err error) {
var rows *xsql.Rows
if rows, err = d.db.Query(c, fmt.Sprintf(_selUpBaseInfoMapSQL, xstr.JoinInts(mids))); err != nil {
return
}
defer rows.Close()
mbi = make(map[int64]*model.UpBaseInfo, len(mids))
for rows.Next() {
bi := new(model.UpBaseInfo)
if err = rows.Scan(&bi.Mid, &bi.FansCount, &bi.ActiveTid, &bi.ArticleCountAccumulate); err != nil {
return
}
mbi[bi.Mid] = bi
}
err = rows.Err()
return
}
// UpPlayInfoMap .
func (d *Dao) UpPlayInfoMap(c context.Context, mids []int64) (mpi map[int64]*model.UpPlayInfo, err error) {
var rows *xsql.Rows
if rows, err = d.db.Query(c, fmt.Sprintf(_selUpPlayInfoMapSQL, xstr.JoinInts(mids))); err != nil {
return
}
defer rows.Close()
mpi = make(map[int64]*model.UpPlayInfo, len(mids))
for rows.Next() {
pi := new(model.UpPlayInfo)
if err = rows.Scan(&pi.Mid, &pi.PlayCountAccumulate, &pi.ArticleCount); err != nil {
return
}
if pi.ArticleCount != 0 {
pi.PlayCountAverage = pi.PlayCountAccumulate / pi.ArticleCount
}
mpi[pi.Mid] = pi
}
err = rows.Err()
return
}

View File

@@ -0,0 +1,24 @@
package up
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestUpUpBaseInfoMap(t *testing.T) {
convey.Convey("UpBaseInfoMap", t, func(ctx convey.C) {
var (
c = context.Background()
mids = []int64{1, 2}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
mbi, err := d.UpBaseInfoMap(c, mids)
ctx.Convey("Then err should be nil.mbi should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(mbi, convey.ShouldNotBeNil)
})
})
})
}

View File

@@ -0,0 +1,53 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = [
"dao_test.go",
"video_types_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/mcn/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"video_types.go",
],
importpath = "go-common/app/admin/main/mcn/dao/videoup",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/mcn/conf:go_default_library",
"//app/service/main/videoup/model/archive: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,33 @@
package videoup
import (
"go-common/app/admin/main/mcn/conf"
"go-common/app/service/main/videoup/model/archive"
bm "go-common/library/net/http/blademaster"
)
const (
_typeURL = "/videoup/types"
)
// Dao .
type Dao struct {
c *conf.Config
client *bm.Client
videTypeURL string
videoUpTypeCache map[int]archive.Type
}
// New new a Dao and return.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
// http client
client: bm.NewClient(c.HTTPClient),
videTypeURL: c.Host.Videoup + _typeURL,
videoUpTypeCache: make(map[int]archive.Type),
}
d.refreshUpType()
go d.refreshUpTypeAsync()
return
}

View File

@@ -0,0 +1,36 @@
package videoup
import (
"flag"
"os"
"testing"
"go-common/app/admin/main/mcn/conf"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.archive.mcn-admin")
flag.Set("conf_token", "220af473858ad67f75586b66bece0e6b")
flag.Set("tree_id", "58930")
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")
}
if os.Getenv("UT_LOCAL_TEST") != "" {
flag.Set("conf", "../../cmd/mcn-admin-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,49 @@
package videoup
import (
"context"
"time"
"go-common/app/service/main/videoup/model/archive"
"go-common/library/log"
)
// refreshUpTypeAsync refresh in a goroutine
func (d *Dao) refreshUpTypeAsync() {
for {
time.Sleep(1 * time.Hour)
d.refreshUpType()
}
}
// videoTypes .
func (d *Dao) refreshUpType() {
var (
err error
res struct {
Code int `json:"code"`
Data map[int]archive.Type `json:"data"`
}
)
if err = d.client.Get(context.Background(), d.videTypeURL, "", nil, &res); err != nil {
log.Error("refresh videoup types fail, err=%v", err)
return
}
if res.Code != 0 {
log.Error("videoTypes d.client.Get(%d)", res.Code)
}
d.videoUpTypeCache = res.Data
}
// GetTidName get tid name
func (d *Dao) GetTidName(tids []int64) (tpNames map[int64]string) {
tpNames = make(map[int64]string, len(tids))
for _, tid := range tids {
info, ok := d.videoUpTypeCache[int(tid)]
if !ok {
continue
}
tpNames[tid] = info.Name
}
return
}

View File

@@ -0,0 +1,31 @@
package videoup
import (
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestVideouprefreshUpType(t *testing.T) {
convey.Convey("refreshUpType", t, func(ctx convey.C) {
ctx.Convey("When everything goes positive", func(ctx convey.C) {
d.refreshUpType()
ctx.Convey("No return values", func(ctx convey.C) {
})
})
})
}
func TestVideoupGetTidName(t *testing.T) {
convey.Convey("GetTidName", t, func(ctx convey.C) {
var (
tids = []int64{22}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
tpNames := d.GetTidName(tids)
ctx.Convey("Then tpNames should not be nil.", func(ctx convey.C) {
ctx.So(tpNames, convey.ShouldNotBeNil)
})
})
})
}

View File

@@ -0,0 +1,54 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"audit_log.go",
"base_model.go",
"formatter.go",
"mcn.go",
"mcn_pay.go",
"msg.go",
"reply.go",
"req.go",
"request_base.go",
"request_example.go",
"statistics.go",
],
importpath = "go-common/app/admin/main/mcn/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/mcn/model/datamodel:go_default_library",
"//app/service/main/archive/model/archive:go_default_library",
"//library/time: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 = ["reply_test.go"],
embed = [":go_default_library"],
tags = ["automanaged"],
)

View File

@@ -0,0 +1,12 @@
package model
const (
// MCNLogBizID mcn审核日志
MCNLogBizID int = 221
// MCNUPLogBizID mcn up主审核日志
MCNUPLogBizID int = 222
// MCNPayDateLogBizID mcn 付款周期审核日志
MCNPayDateLogBizID int = 223
// MCNRecommendLogBizID mcn 推荐池审核日志
MCNRecommendLogBizID int = 224
)

View File

@@ -0,0 +1,62 @@
package model
import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"fmt"
"hash"
"math/rand"
"net/url"
"path/filepath"
"strings"
"time"
)
// const .
const (
_template = "%s\n%s\n%s\n%d\n"
BfsEasyPath = "/bfs/mcn"
TimeFormatSec = "2006-01-02 15:04:05"
TimeFormatDay = "2006-01-02"
AllActiveTid = 65535 //mcn_data_summary表active_tid所有分区
DefaultTyName = "默认"
)
// BuildBfsURL is.
func BuildBfsURL(raw string, appkey, secret, bucket, ePath string) string {
if raw == "" {
return ""
}
ori, err := url.Parse(raw)
if err != nil {
return raw
}
if strings.HasPrefix(ori.Path, ePath) {
token := authorize(appkey, secret, "GET", bucket, filepath.Base(ori.Path), time.Now().Unix())
p := url.Values{}
p.Set("token", token)
ori.RawQuery = p.Encode()
}
if ori.Hostname() == "" {
ori.Host = fmt.Sprintf("i%d.hdslb.com", rand.Int63n(3))
ori.Scheme = "http"
}
return ori.String()
}
// Authorize returns authorization for upload file to bfs
func authorize(key, secret, method, bucket, file string, expire int64) (authorization string) {
var (
content string
mac hash.Hash
signature string
)
content = fmt.Sprintf(_template, method, bucket, file, expire)
mac = hmac.New(sha1.New, []byte(secret))
mac.Write([]byte(content))
signature = base64.StdEncoding.EncodeToString(mac.Sum(nil))
authorization = fmt.Sprintf("%s:%s:%d", key, signature, expire)
return
}

View File

@@ -0,0 +1,16 @@
package model
import "encoding/csv"
//CsvFormatter CsvFormatter
type CsvFormatter interface {
GetFileName() string
// ToCsv do not call flush
ToCsv(writer *csv.Writer)
}
//ExportArgInterface export interface
type ExportArgInterface interface {
// ExportFormat options: json, csv
ExportFormat() string
}

View File

@@ -0,0 +1,689 @@
package model
// MCNSignState .
type MCNSignState int8
// const .
const (
// MCNSignStateUnKnown 未知状态
MCNSignStateUnKnown MCNSignState = -1
// MCNSignStateNoApply 未申请
MCNSignStateNoApply MCNSignState = 0
// MCNSignStateOnReview 待审核
MCNSignStateOnReview MCNSignState = 1
// MCNSignStateOnReject 已驳回
MCNSignStateOnReject MCNSignState = 2
// MCNSignStateOnSign 已签约
MCNSignStateOnSign MCNSignState = 10
// MCNSignStateOnCooling 冷却中
MCNSignStateOnCooling MCNSignState = 11
// MCNSignStateOnExpire 已到期
MCNSignStateOnExpire MCNSignState = 12
// MCNSignStateOnBlock 已封禁
MCNSignStateOnBlock MCNSignState = 13
// MCNSignStateOnClear 已清退
MCNSignStateOnClear MCNSignState = 14
// MCNSignStateOnPreOpen 待开启
MCNSignStateOnPreOpen MCNSignState = 15
// MCNSignStateOnDelete 已移除
MCNSignStateOnDelete MCNSignState = 100
)
func (state MCNSignState) String() string {
switch state {
case MCNSignStateNoApply:
return "未申请"
case MCNSignStateOnReview:
return "待审核"
case MCNSignStateOnReject:
return "已驳回"
case MCNSignStateOnSign:
return "已签约"
case MCNSignStateOnCooling:
return "冷却中"
case MCNSignStateOnExpire:
return "已到期"
case MCNSignStateOnBlock:
return "已封禁"
case MCNSignStateOnClear:
return "已清退"
case MCNSignStateOnPreOpen:
return "待开启"
case MCNSignStateOnDelete:
return "已移除"
default:
return ""
}
}
// MCNSignAction .
type MCNSignAction int8
const (
// MCNSignActionEntry 录入
MCNSignActionEntry MCNSignAction = 0
// MCNSignActionApply 申请
MCNSignActionApply MCNSignAction = 1
// MCNSignActionReject 驳回
MCNSignActionReject MCNSignAction = 2
// MCNSignActionPass 通过
MCNSignActionPass MCNSignAction = 10
// MCNSignActionBlock 封禁
MCNSignActionBlock MCNSignAction = 13
// MCNSignActionClear 清退
MCNSignActionClear MCNSignAction = 14
// MCNSignActionRenew 续约
MCNSignActionRenew MCNSignAction = 16
// MCNSignActionRestore 恢复
MCNSignActionRestore MCNSignAction = 17
// MCNSignActionPermit 签约用户权限变更(只用于记日志)
MCNSignActionPermit MCNSignAction = 99
// MCNSignActionDelete 移除
MCNSignActionDelete MCNSignAction = 100
)
// GetState .
func (action MCNSignAction) GetState(oldState MCNSignState) MCNSignState {
switch action {
// MCNSignActionEntry 录入
case MCNSignActionEntry:
return MCNSignStateNoApply
// MCNSignActionApply 申请
case MCNSignActionApply:
return MCNSignStateOnReview
// MCNSignActionReject 驳回
case MCNSignActionReject:
return MCNSignStateOnReject
// MCNSignActionPass 通过
case MCNSignActionPass:
return MCNSignStateOnSign
// MCNSignActionBlock 封禁
case MCNSignActionBlock:
return MCNSignStateOnBlock
// MCNSignActionClear 清退
case MCNSignActionClear:
return MCNSignStateOnClear
// MCNSignActionRenew 续约
case MCNSignActionRenew:
return MCNSignStateOnSign
// MCNSignActionRestore 恢复
case MCNSignActionRestore:
switch oldState {
case MCNSignStateOnBlock:
return MCNSignStateOnSign
case MCNSignStateOnClear:
return MCNSignStateNoApply
}
// MCNSignActionDelete 移除
case MCNSignActionDelete:
return MCNSignStateOnDelete
}
return MCNSignState(MCNSignStateUnKnown)
}
// NotRejectState .
func (state MCNSignState) NotRejectState() bool {
return state != MCNSignStateOnReject
}
// NotRightAction .
func (action MCNSignAction) NotRightAction() bool {
return action == MCNSignActionReject || action == MCNSignActionPass || action == MCNSignActionDelete
}
// IsOnReviewState .
func (state MCNSignState) IsOnReviewState(action MCNSignAction) bool {
return state != MCNSignStateOnReview && action != MCNSignActionDelete
}
// IsRenewalState .
func (state MCNSignState) IsRenewalState() bool {
return state != MCNSignStateOnSign
}
// GetmsgType .
func (action MCNSignAction) GetmsgType(oldState MCNSignState) MSGType {
switch action {
// MCNSignActionEntry 录入
case MCNSignActionEntry:
return MSGType(0)
// MCNSignActionApply 申请
case MCNSignActionApply:
return MSGType(0)
// MCNSignActionReject 驳回
case MCNSignActionReject:
return McnSignNoApplyPass
// MCNSignActionPass 通过
case MCNSignActionPass:
return McnSignApplyPass
// MCNSignActionBlock 封禁
case MCNSignActionBlock:
return McnBackstageBlock
// MCNSignActionClear 清退
case MCNSignActionClear:
return McnBackstageClose
// MCNSignActionRenew 续约
case MCNSignActionRenew:
return McnRenewcontract
// MCNSignActionRestore 恢复
case MCNSignActionRestore:
switch oldState {
case MCNSignStateOnBlock:
return McnAccountRestore
case MCNSignStateOnClear:
return MSGType(0)
}
// MCNSignActionDelete 移除
case MCNSignActionDelete:
return MSGType(0)
}
return MSGType(0)
}
func (action MCNSignAction) String() string {
switch action {
case MCNSignActionEntry:
return "mcn录入"
case MCNSignActionApply:
return "前台mcn申请"
case MCNSignActionReject:
return "驳回申请"
case MCNSignActionPass:
return "申请通过"
case MCNSignActionBlock:
return "封禁mcn"
case MCNSignActionClear:
return "清退mcn"
case MCNSignActionRenew:
return "续约mcn"
case MCNSignActionRestore:
return "恢复mcn"
case MCNSignActionPermit:
return "mcn权限变更"
case MCNSignActionDelete:
return "移除mcn"
default:
return ""
}
}
// MCNUPState .
type MCNUPState int8
// const .
const (
// MCNUPStateUnKnown 未知状态
MCNUPStateUnKnown MCNUPState = -1
// MCNUPStateNoAuthorize 未授权
MCNUPStateNoAuthorize MCNUPState = 0
// MCNUPStateOnRefuse 已拒绝
MCNUPStateOnRefuse MCNUPState = 1
// MCNUPStateOnReview 待审核
MCNUPStateOnReview MCNUPState = 2
// MCNSignStateOnReject 已驳回
MCNUPStateOnReject MCNUPState = 3
// MCNUPStateOnSign 已签约
MCNUPStateOnSign MCNUPState = 10
// MCNUPStateOnFreeze 已冻结
MCNUPStateOnFreeze MCNUPState = 11
// MCNUPStateOnExpire 已到期
MCNUPStateOnExpire MCNUPState = 12
// MCNUPStateOnBlock 已封禁
MCNUPStateOnBlock MCNUPState = 13
// MCNUPStateOnClear 已解约
MCNUPStateOnClear MCNUPState = 14
// MCNUPStateOnPreOpen 待开启
MCNUPStateOnPreOpen MCNUPState = 15
// MCNUPStateOnDelete 已删除
MCNUPStateOnDelete MCNUPState = 100
)
func (state MCNUPState) String() string {
switch state {
case MCNUPStateNoAuthorize:
return "未授权"
case MCNUPStateOnRefuse:
return "已拒绝"
case MCNUPStateOnReview:
return "待审核"
case MCNUPStateOnReject:
return "已驳回"
case MCNUPStateOnSign:
return "已签约"
case MCNUPStateOnFreeze:
return "已冻结"
case MCNUPStateOnExpire:
return "已到期"
case MCNUPStateOnBlock:
return "已封禁"
case MCNUPStateOnClear:
return "已解约"
case MCNUPStateOnDelete:
return "已删除"
default:
return ""
}
}
// MCNUPAction .
type MCNUPAction int8
const (
// MCNUPActionBind 发起绑定
MCNUPActionBind MCNUPAction = 0
// MCNUPActionReject 运营驳回
MCNUPActionReject MCNUPAction = 3
// MCNUPActionAgree up主同意
MCNUPActionAgree MCNUPAction = 4
// MCNUPActionRefuse up主拒绝
MCNUPActionRefuse MCNUPAction = 5
// MCNUPActionPass 通过
MCNUPActionPass MCNUPAction = 10
// MCNUPActionFreeze 冻结
MCNUPActionFreeze MCNUPAction = 11
// MCNUPActionRelease 解约
MCNUPActionRelease MCNUPAction = 14
// MCNUPActionRestore 恢复
MCNUPActionRestore MCNUPAction = 16
)
// GetState .
func (action MCNUPAction) GetState() MCNUPState {
switch action {
// MCNUPActionBind 发起绑定
case MCNUPActionBind:
return MCNUPStateNoAuthorize
// MCNUPActionReject 运营驳回
case MCNUPActionReject:
return MCNUPStateOnReject
// MCNUPActionAgree up主同意
case MCNUPActionAgree:
return MCNUPStateOnReview
// MCNUPActionRefuse up主拒绝
case MCNUPActionRefuse:
return MCNUPStateOnRefuse
// MCNUPActionPass 通过
case MCNUPActionPass:
return MCNUPStateOnSign
// MCNUPActionFreeze 冻结
case MCNUPActionFreeze:
return MCNUPStateOnFreeze
// MCNUPActionRelease 解约
case MCNUPActionRelease:
return MCNUPStateOnClear
// MCNUPActionRestore 恢复
case MCNUPActionRestore:
return MCNUPStateOnSign
}
return MCNUPState(MCNUPStateUnKnown)
}
// GetmsgType .
func (action MCNUPAction) GetmsgType(isMcn bool) MSGType {
switch {
// MCNUPActionBind 发起绑定
case action == MCNUPActionBind:
return McnUpBindAuthApply
// MCNUPActionRefuse up主拒绝
case action == MCNUPActionRefuse:
return McnUpBindAuthApplyRefuse
// MCNUPActionAgree up主同意
case action == MCNUPActionAgree:
return McnUpBindAuthReview
// MCNUPActionReject 运营驳回
case action == MCNUPActionReject && isMcn:
return McnUpBindAuthApplyNoPass
case action == MCNUPActionReject && !isMcn:
return UpMcnBindAuthApplyNoPass
// MCNUPActionPass 通过
case action == MCNUPActionPass && isMcn:
return McnUpBindAuthApplyPass
case action == MCNUPActionPass && !isMcn:
return UpMcnBindAuthApplyPass
// MCNUPActionFreeze 冻结
case action == MCNUPActionFreeze && isMcn:
return McnUpRelationFreeze
case action == MCNUPActionFreeze && !isMcn:
return UpMcnRelationFreeze
// MCNUPActionRelease 解约
case action == MCNUPActionRelease && isMcn:
return McnUpRelationRelease
case action == MCNUPActionRelease && !isMcn:
return UpMcnRelationRelease
// MCNUPActionRestore 恢复
case action == MCNUPActionRestore && isMcn:
return MSGType(0)
case action == MCNUPActionRestore && !isMcn:
return MSGType(0)
}
return MSGType(0)
}
func (action MCNUPAction) String() string {
switch action {
case MCNUPActionBind:
return "mcn发起绑定"
case MCNUPActionReject:
return "运营驳回"
case MCNUPActionAgree:
return "up主同意"
case MCNUPActionRefuse:
return "up主拒绝"
case MCNUPActionPass:
return "审核通过"
case MCNUPActionFreeze:
return "up主申请冻结"
case MCNUPActionRelease:
return "up主和mcn相互解约"
case MCNUPActionRestore:
return "恢复up主和mcn的合同"
default:
return ""
}
}
// NotRightAction .
func (action MCNUPAction) NotRightAction() bool {
return action == MCNUPActionReject || action == MCNUPActionPass
}
// NoRejectState .
func (action MCNUPAction) NoRejectState() bool {
return action != MCNUPActionReject
}
// NotRightState .
func (state MCNUPState) NotRightState() bool {
return state == MCNUPStateOnReject || state == MCNUPStateOnSign
}
// IsOnReviewState .
func (state MCNUPState) IsOnReviewState() bool {
return state != MCNUPStateOnReview
}
// MCNSignCycleAction .
type MCNSignCycleAction int8
// const .
const (
// MCNSignCycleActionUp 变更
MCNSignCycleActionUp MCNSignCycleAction = iota
// MCNSignCycleActionAdd 新增
MCNSignCycleActionAdd
// MCNSignCycleActionDel 删除
MCNSignCycleActionDel
)
func (act MCNSignCycleAction) String() string {
switch act {
case MCNSignCycleActionUp:
return "变更"
case MCNSignCycleActionAdd:
return "新增"
case MCNSignCycleActionDel:
return "删除"
default:
return ""
}
}
// MCNPayState .
type MCNPayState int8
// const .
const (
// MCNPayNo 未支付
MCNPayNo MCNPayState = 0
// MCNPayed 已支付
MCNPayed MCNPayState = 1
// MCNPayDel 已删除
MCNPayDel MCNPayState = 100
)
func (mps MCNPayState) String() string {
switch mps {
case MCNPayNo:
return "未支付"
case MCNPayed:
return "已支付"
case MCNPayDel:
return "已删除"
default:
return ""
}
}
// MCNUPRecommendState .
type MCNUPRecommendState int8
// const .
const (
// MCNUPRecommendStateUnKnown 未知状态
MCNUPRecommendStateUnKnown MCNUPRecommendState = 0
// MCNUPRecommendStateOff 未推荐
MCNUPRecommendStateOff MCNUPRecommendState = 1
// MCNUPRecommendStateOn 推荐中
MCNUPRecommendStateOn MCNUPRecommendState = 2
// MCNUPRecommendStateBan 禁止推荐
MCNUPRecommendStateBan MCNUPRecommendState = 3
// MCNUPRecommendStateDel 移除中
MCNUPRecommendStateDel MCNUPRecommendState = 100
)
func (state MCNUPRecommendState) String() string {
switch state {
case MCNUPRecommendStateOff:
return "未推荐"
case MCNUPRecommendStateOn:
return "推荐中"
case MCNUPRecommendStateBan:
return "禁止推荐"
case MCNUPRecommendStateDel:
return "移除中"
default:
return "未知状态"
}
}
// MCNUPRecommendSource .
type MCNUPRecommendSource int8
// const .
const (
// MCNUPRecommendSourceUnKnown 未知来源
MCNUPRecommendSourceUnKnown MCNUPRecommendSource = iota
// MCNUPRecommendSourceAuto 自动添加(大数据)
MCNUPRecommendSourceAuto
// MCNUPRecommendStateManual 手动添加
MCNUPRecommendStateManual
)
func (source MCNUPRecommendSource) String() string {
switch source {
case MCNUPRecommendSourceAuto:
return "自动添加(大数据)"
case MCNUPRecommendStateManual:
return "手动添加"
default:
return "未知来源"
}
}
// MCNUPRecommendAction .
type MCNUPRecommendAction int8
// const .
const (
// MCNUPRecommendActionOn 推荐
MCNUPRecommendActionOn MCNUPRecommendAction = iota + 1
// MCNUPRecommendActionBan 禁止推荐
MCNUPRecommendActionBan
// MCNUPRecommendActionRestore 恢复
MCNUPRecommendActionRestore
// MCNUPRecommendActionAdd 手动添加
MCNUPRecommendActionAdd
// MCNUPRecommendActionDel 移除
MCNUPRecommendActionDel
)
// GetState .
func (action MCNUPRecommendAction) GetState() MCNUPRecommendState {
switch action {
// MCNUPRecommendActionOn 推荐
case MCNUPRecommendActionOn:
return MCNUPRecommendStateOn
// MCNUPRecommendActionBan 禁止推荐
case MCNUPRecommendActionBan:
return MCNUPRecommendStateBan
// MCNUPRecommendActionRestore 恢复
case MCNUPRecommendActionRestore:
return MCNUPRecommendStateOff
// MCNUPRecommendActionAdd 手动添加
case MCNUPRecommendActionAdd:
return MCNUPRecommendStateOff
// MCNUPRecommendActionDel 移除
case MCNUPRecommendActionDel:
return MCNUPRecommendStateDel
}
return MCNUPRecommendStateUnKnown
}
func (action MCNUPRecommendAction) String() string {
switch action {
case MCNUPRecommendActionOn:
return "推荐"
case MCNUPRecommendActionBan:
return "禁止推荐"
case MCNUPRecommendActionRestore:
return "恢复"
case MCNUPRecommendActionAdd:
return "手动添加"
case MCNUPRecommendActionDel:
return "移除"
default:
return ""
}
}
// MCNUPPermissionState .
type MCNUPPermissionState int8
// const .
const (
// MCNUPPermissionStateUnKnown 未知状态
MCNUPPermissionStateUnKnown MCNUPPermissionState = -1
// MCNUPPermissionStateNoAuthorize 待Up主同意
MCNUPPermissionStateNoAuthorize MCNUPPermissionState = 0
// MCNUPStateOnRefuse Up主拒绝
MCNUPPermissionStateOnRefuse MCNUPPermissionState = 1
// MCNUPPermissionStateReview 待审中
MCNUPPermissionStateReview MCNUPPermissionState = 2
// MCNUPPermissionStatePass 已通过
MCNUPPermissionStatePass MCNUPPermissionState = 3
// MCNUPPermissionStateFail 已驳回
MCNUPPermissionStateFail MCNUPPermissionState = 4
// MCNUPPermissionStateDel 已删除
MCNUPPermissionStateDel MCNUPPermissionState = 100
)
func (state MCNUPPermissionState) String() string {
switch state {
case MCNUPPermissionStateNoAuthorize:
return "待Up主同意"
case MCNUPPermissionStateOnRefuse:
return "Up主拒绝"
case MCNUPPermissionStateReview:
return "待审中"
case MCNUPPermissionStatePass:
return "已通过"
case MCNUPPermissionStateFail:
return "已驳回"
case MCNUPPermissionStateDel:
return "已删除"
default:
return "未知状态"
}
}
// MCNUPPermissionAction .
type MCNUPPermissionAction int8
// const .
const (
// MCNUPPermissionActionOn 通过
MCNUPPermissionActionOn MCNUPPermissionAction = iota + 1
// MCNUPPermissionActionFail 驳回
MCNUPPermissionActionFail
// MCNUPPermissionActionDel 移除
MCNUPPermissionActionDel
)
// NotRightAction .
func (action MCNUPPermissionAction) NotRightAction() bool {
return action == MCNUPPermissionActionOn || action == MCNUPPermissionActionFail
}
// GetState .
func (action MCNUPPermissionAction) GetState() MCNUPPermissionState {
switch action {
// MCNUPPermissionActionOn 通过
case MCNUPPermissionActionOn:
return MCNUPPermissionStatePass
// MCNUPPermissionActionFail 驳回
case MCNUPPermissionActionFail:
return MCNUPPermissionStateFail
// MCNUPPermissionActionDel 移除
case MCNUPPermissionActionDel:
return MCNUPPermissionStateDel
}
return MCNUPPermissionStateUnKnown
}
func (action MCNUPPermissionAction) String() string {
switch action {
case MCNUPPermissionActionOn:
return "通过"
case MCNUPPermissionActionFail:
return "驳回"
case MCNUPPermissionActionDel:
return "移除"
default:
return ""
}
}
// AttrBasePermit .
type AttrBasePermit uint
// const .
const (
AttrBasePermitBit AttrBasePermit = 0 // 基础权限
AttrDataPermitBit AttrBasePermit = 1 // 数据权限
AttrRecPermitBit AttrBasePermit = 2 // 推荐权限
AttrDepartPermitBit AttrBasePermit = 3 // 起飞权限
)
// PermitMap .
var PermitMap = map[AttrBasePermit]struct{}{
AttrBasePermitBit: {},
AttrDataPermitBit: {},
AttrRecPermitBit: {},
AttrDepartPermitBit: {},
}
func (p AttrBasePermit) String() string {
switch p {
case AttrBasePermitBit:
return "基础权限"
case AttrDataPermitBit:
return "数据权限"
case AttrRecPermitBit:
return "推荐权限"
case AttrDepartPermitBit:
return "起飞权限"
default:
return ""
}
}

View File

@@ -0,0 +1,82 @@
package model
import xtime "go-common/library/time"
// MCNSignPay State .
const (
MCNStateNoPay = int8(1)
MCNStatePayed = int8(2)
MCNStateDeled = int8(100)
)
// MCNSign struct .
type MCNSign struct {
ID int64 `json:"id"`
MCNMID int64 `json:"mcn_mid"`
MCNName string `json:"mcn_name"`
CompanyName string `json:"company_name"`
CompanyLicenseID string `json:"company_license_id"`
CompanyLicenseLink string `json:"company_license_link"`
ContractLink string `json:"contract_link"`
ContactName string `json:"contact_name"`
ContactTitle string `json:"contact_title"`
ContactIdcard string `json:"contact_idcard"`
ContactPhone string `json:"contact_phone"`
BeginDate xtime.Time `json:"begin_date"`
EndDate xtime.Time `json:"end_date"`
State MCNSignState `json:"state"`
RejectTime xtime.Time `json:"reject_time"`
RejectReason string `json:"reject_reason"`
Ctime xtime.Time `json:"ctime"`
Mtime xtime.Time `json:"mtime"`
Permission uint32 `json:"permission"`
Permits *Permits `json:"permits"` // 权限集合
}
// AttrPermitVal get Permission all.
func (n *MCNSign) AttrPermitVal() {
n.Permits = &Permits{}
n.Permits.SetAttrPermitVal(n.Permission)
}
// MCNSignPay struct .
type MCNSignPay struct {
ID int64 `json:"id"`
MID int64 `json:"mid"`
SignID int64 `json:"sign_id"`
DueDate string `json:"due_date"`
PayValue int64 `json:"pay_value"`
State int8 `json:"state"`
Note string `json:"note"`
Ctime string `json:"ctime"`
Mtime string `json:"mtime"`
}
// MCNUP struct .
type MCNUP struct {
SignID int64 `json:"sign_id"`
MCNMID int64 `json:"mcn_mid"`
UPMID int64 `json:"up_mid"`
BeginDate xtime.Time `json:"begin_date"`
EndDate xtime.Time `json:"end_date"`
ContractLink string `json:"contract_link"`
UPAuthLink string `json:"up_auth_link"`
RejectReason string `json:"reject_reason"`
RejectTime xtime.Time `json:"reject_time"`
State MCNUPState `json:"state"`
StateChangeTime xtime.Time `json:"state_change_time"`
Ctime xtime.Time `json:"ctime"`
Mtime xtime.Time `json:"mtime"`
UpType int8 `json:"up_type"`
SiteLink string `json:"site_link"`
ConfirmTime xtime.Time `json:"confirm_time"`
Permission uint32 `json:"permission"`
PublicationPrice int64 `json:"publication_price"`
Permits *Permits `json:"permits"` // 权限集合
}
// AttrPermitVal get Permission all.
func (n *MCNUP) AttrPermitVal() {
n.Permits = &Permits{}
n.Permits.SetAttrPermitVal(n.Permission)
}

View File

@@ -0,0 +1,133 @@
package model
import (
"fmt"
)
// MSGType .
type MSGType uint8
// const .
const (
// McnSignApplyPass MCN申请MCN管理入口申请成功
McnSignApplyPass = iota + 1
// McnSignNoApplyPass MCN申请MCN管理入口申请未通过
McnSignNoApplyPass
// McnUpBindAuthApply MCN申请和up主绑定申请授权
McnUpBindAuthApply
// McnUpBindAuthReview MCN申请和up主绑定up主同意等待运营审核中
McnUpBindAuthReview
// McnUpBindAuthApplyPass MCN申请和up主绑定up主同意且运营通过
McnUpBindAuthApplyPass
// UpMcnBindAuthApplyPass up主申请和MCN绑定up主同意且运营通过
UpMcnBindAuthApplyPass
// McnUpBindAuthApplyNoPass MCN申请和up主绑定up主同意但运营未通过
McnUpBindAuthApplyNoPass
// UpMcnBindAuthApplyNoPass up主申请和MCN绑定up主同意但运营未通过
UpMcnBindAuthApplyNoPass
// McnUpBindAuthApplyRefuse MCN申请和up主绑定被up主拒绝
McnUpBindAuthApplyRefuse
// UpMcnRelationFreeze MCN和up主纠纷处理 - Up主和MCN关系冻结
UpMcnRelationFreeze
// McnUpRelationFreeze MCN和up主纠纷处理 - MCN和Up主关系冻结
McnUpRelationFreeze
// UpMcnRelationRelease MCN和up主纠纷处理 - Up主和MCN提前解约
UpMcnRelationRelease
// McnUpRelationRelease MCN和up主纠纷处理 - MCN和Up主提前解约
McnUpRelationRelease
// McnBackstageBlock MCN违规账号封禁
McnBackstageBlock
// McnBackstageClose MCN违规账号清退
McnBackstageClose
// McnRenewcontract 续约合同
McnRenewcontract
// McnAccountRestore MCN账号恢复
McnAccountRestore
// McnPermissionOpen MCN新开权限
McnPermissionOpen
// McnPermissionClosed MCN权限关闭
McnPermissionClosed
// McnUpNotAgreeChangePermit UP主不同意授权变更
McnUpNotAgreeChangePermit
// McnOperNotAgreeChangePermit 运营不同意授权变更
McnOperNotAgreeChangePermit
// McnOperAgreeChangePermit 运营同意授权变更
McnOperAgreeChangePermit
// McnApplyUpChangePermit MCN申请和up主的权限修改
McnApplyUpChangePermit
)
// MSG .
type MSG struct {
MSGType MSGType
Code string
Title string
Content string
}
// ArgMsg .
type ArgMsg struct {
MSGType MSGType
MIDs []int64
McnName string
UpName string
McnMid int64
UpMid int64
CompanyName string
Reason string
SignUpID int64
Permission string
}
// MsgInfo .
func (arg *ArgMsg) MsgInfo(msg *MSG) (mids []int64, title, content, code string) {
switch arg.MSGType {
case McnSignApplyPass:
return arg.MIDs, msg.Title, msg.Content, msg.Code
case McnSignNoApplyPass:
return arg.MIDs, msg.Title, fmt.Sprintf(msg.Content, arg.Reason), msg.Code
case McnUpBindAuthApply:
return arg.MIDs, msg.Title, fmt.Sprintf(msg.Content, arg.McnName, arg.McnMid, arg.CompanyName, arg.SignUpID), msg.Code
case McnUpBindAuthReview:
return arg.MIDs, msg.Title, fmt.Sprintf(msg.Content, arg.CompanyName, arg.McnName, arg.McnMid), msg.Code
case McnUpBindAuthApplyPass:
return arg.MIDs, msg.Title, fmt.Sprintf(msg.Content, arg.UpName, arg.UpMid), msg.Code
case UpMcnBindAuthApplyPass:
return arg.MIDs, msg.Title, fmt.Sprintf(msg.Content, arg.CompanyName, arg.McnName, arg.McnMid), msg.Code
case McnUpBindAuthApplyNoPass:
return arg.MIDs, msg.Title, fmt.Sprintf(msg.Content, arg.UpName, arg.UpMid, arg.Reason), msg.Code
case UpMcnBindAuthApplyNoPass:
return arg.MIDs, msg.Title, fmt.Sprintf(msg.Content, arg.CompanyName, arg.McnName, arg.McnMid, arg.Reason), msg.Code
case McnUpBindAuthApplyRefuse:
return arg.MIDs, msg.Title, fmt.Sprintf(msg.Content, arg.UpName, arg.UpMid), msg.Code
case UpMcnRelationFreeze:
return arg.MIDs, msg.Title, fmt.Sprintf(msg.Content, arg.CompanyName, arg.McnName, arg.McnMid), msg.Code
case McnUpRelationFreeze:
return arg.MIDs, msg.Title, fmt.Sprintf(msg.Content, arg.UpName, arg.UpMid), msg.Code
case UpMcnRelationRelease:
return arg.MIDs, msg.Title, fmt.Sprintf(msg.Content, arg.CompanyName, arg.McnName, arg.McnMid), msg.Code
case McnUpRelationRelease:
return arg.MIDs, msg.Title, fmt.Sprintf(msg.Content, arg.UpName, arg.UpMid), msg.Code
case McnBackstageBlock:
return arg.MIDs, msg.Title, msg.Content, msg.Code
case McnBackstageClose:
return arg.MIDs, msg.Title, msg.Content, msg.Code
case McnRenewcontract:
return arg.MIDs, msg.Title, msg.Content, msg.Code
case McnAccountRestore:
return arg.MIDs, msg.Title, msg.Content, msg.Code
case McnPermissionOpen:
return arg.MIDs, fmt.Sprintf(msg.Title, arg.Permission), fmt.Sprintf(msg.Content, arg.Permission), msg.Code
case McnPermissionClosed:
return arg.MIDs, fmt.Sprintf(msg.Title, arg.Permission), fmt.Sprintf(msg.Content, arg.Permission), msg.Code
case McnUpNotAgreeChangePermit:
return arg.MIDs, fmt.Sprintf(msg.Title, arg.UpName), fmt.Sprintf(msg.Content, arg.UpName), msg.Code
case McnOperNotAgreeChangePermit:
return arg.MIDs, fmt.Sprintf(msg.Title, arg.UpName), fmt.Sprintf(msg.Content, arg.UpName, arg.Reason), msg.Code
case McnOperAgreeChangePermit:
return arg.MIDs, fmt.Sprintf(msg.Title, arg.UpName), fmt.Sprintf(msg.Content, arg.UpName, arg.Permission), msg.Code
case McnApplyUpChangePermit:
return arg.MIDs, fmt.Sprintf(msg.Title, arg.McnName), fmt.Sprintf(msg.Content, arg.McnName, arg.Permission, arg.SignUpID), msg.Code
}
return nil, "", "", ""
}

View File

@@ -0,0 +1,539 @@
package model
import (
"encoding/csv"
"fmt"
"time"
dtmdl "go-common/app/interface/main/mcn/model/datamodel"
xtime "go-common/library/time"
)
// Permits .
type Permits struct {
BasePermission uint8 `form:"base_permission" json:"base_permission" validate:"min=0,max=1"` // 基础权限
DataPermission uint8 `form:"data_permission" json:"data_permission" validate:"min=0,max=1"` // 数据权限
RecPermission uint8 `form:"rec_permission" json:"rec_permission" validate:"min=0,max=1"` // 推荐权限
DepartPermission uint8 `form:"depart_permission" json:"depart_permission" validate:"min=0,max=1"` // 起飞权限
}
// SetAttrPermitVal set struct from permission
func (p *Permits) SetAttrPermitVal(val uint32) {
p.BasePermission = AttrVal(val, uint(AttrBasePermitBit))
p.DataPermission = AttrVal(val, uint(AttrDataPermitBit))
p.RecPermission = AttrVal(val, uint(AttrRecPermitBit))
p.DepartPermission = AttrVal(val, uint(AttrDepartPermitBit))
}
// GetAttrPermitVal .
func (p *Permits) GetAttrPermitVal() (permission uint32) {
permission = AttrSet(permission, p.BasePermission, uint(AttrBasePermitBit))
permission = AttrSet(permission, p.DataPermission, uint(AttrDataPermitBit))
permission = AttrSet(permission, p.RecPermission, uint(AttrRecPermitBit))
permission = AttrSet(permission, p.DepartPermission, uint(AttrDepartPermitBit))
return
}
// AttrSet set Permission.
func AttrSet(dest uint32, bitValue uint8, bit uint) (res uint32) {
res = dest&(^(1 << bit)) | (uint32(bitValue) << bit)
return
}
// AttrVal get Permission.
func AttrVal(v uint32, bit uint) uint8 {
return uint8((v >> bit) & 1)
}
// MCNSignInfoReply .
type MCNSignInfoReply struct {
SignID int64 `json:"sign_id"`
McnMid int64 `json:"mcn_mid"`
McnName string `json:"mcn_name"`
CompanyName string `json:"company_name"`
CompanyLicenseID string `json:"company_license_id"`
CompanyLicenseLink string `json:"company_license_link"`
ContractLink string `json:"contract_link"`
ContactName string `json:"contact_name"`
ContactTitle string `json:"contact_title"`
ContactPhone string `json:"contact_phone"`
ContactIdcard string `json:"contact_idcard"`
BeginDate xtime.Time `json:"begin_date"`
EndDate xtime.Time `json:"end_date"`
State MCNSignState `json:"state"`
RejectTime xtime.Time `json:"reject_time"`
RejectReason string `json:"reject_reason"`
Ctime xtime.Time `json:"ctime"`
Mtime xtime.Time `json:"mtime"`
SignPayInfo []*SignPayInfoReply `json:"sign_pay_info"`
Permission uint32 `json:"permission"`
Permits *Permits `json:"permits"` // 权限集合
}
// AttrPermitVal get Permission all.
func (n *MCNSignInfoReply) AttrPermitVal() {
n.Permits = &Permits{}
n.Permits.SetAttrPermitVal(n.Permission)
}
// MCNSignListReply .
type MCNSignListReply struct {
List []*MCNSignInfoReply `json:"result"`
PageResult
}
// SignPayInfoReply .
type SignPayInfoReply struct {
SignPayID int64 `json:"sign_pay_id,omitempty"`
McnMid int64 `json:"mcn_mid"`
SignID int64 `json:"sign_id,omitempty"`
State MCNPayState `json:"state"`
DueDate xtime.Time `json:"due_date"`
PayValue int64 `json:"pay_value"` // thousand bit
}
// MCNUPInfoReply .
type MCNUPInfoReply struct {
SignUpID int64 `json:"sign_up_id"`
SignID int64 `json:"sign_id"`
McnMid int64 `json:"mcn_mid"`
UpMid int64 `json:"up_mid"`
BeginDate xtime.Time `json:"begin_date"`
EndDate xtime.Time `json:"end_date"`
ContractLink string `json:"contract_link"`
UpAuthLink string `json:"up_auth_link"`
RejectTime xtime.Time `json:"reject_time"`
RejectReason string `json:"reject_reason"`
State MCNUPState `json:"state"`
StateChangeTime xtime.Time `json:"state_change_time"`
Ctime xtime.Time `json:"ctime"`
Mtime xtime.Time `json:"mtime"`
UpName string `json:"up_name"`
McnName string `json:"mcn_name"`
ActiveTid int16 `json:"active_tid"`
TpName string `json:"type_name"`
FansCount int64 `json:"fans_count"`
FansCountActive int64 `json:"fans_count_active"`
FansIncreaseAccumulate int64 `json:"fans_increase_accumulate"`
ArchiveCount int64 `json:"archive_count"`
PlayCount int64 `json:"play_count"`
UPType int8 `json:"up_type"`
SiteLink string `json:"site_link"`
ConfirmTime xtime.Time `json:"confirm_time"`
PubPrice int64 `json:"publication_price"`
Permission uint32 `json:"permission"`
Permits *Permits `json:"permits"` // 权限集合
}
// AttrPermitVal get Permission all.
func (n *MCNUPInfoReply) AttrPermitVal() {
n.Permits = &Permits{}
n.Permits.SetAttrPermitVal(n.Permission)
}
// MCNUPReviewListReply .
type MCNUPReviewListReply struct {
List []*MCNUPInfoReply `json:"result"`
PageResult
}
// UpBaseInfo .
type UpBaseInfo struct {
Mid int64 `json:"mid"`
FansCount int64 `json:"fans_count"`
ActiveTid int16 `json:"active_tid"`
ArticleCountAccumulate int64 `json:"article_count_accumulate"`
}
// UpPlayInfo .
type UpPlayInfo struct {
Mid int64 `json:"mid"`
ArticleCount int64 `json:"article_count"`
PlayCountAccumulate int64 `json:"play_count_accumulate"`
PlayCountAverage int64 `json:"play_count_average"`
}
// MCNListReply struct .
type MCNListReply struct {
List []*MCNListOne `json:"result"`
PageResult
}
// MCNListOne struct .
type MCNListOne struct {
ID int64 `json:"id"`
MCNMID int64 `json:"mcn_mid"`
MCNName string `json:"mcn_name"`
UPCount int64 `json:"up_count"`
FansCountAccumulate int64 `json:"fans_count_accumulate"`
FansCountOnlineAccumulate int64 `json:"fans_count_online_accumulate"`
FansCountRealAccumulate int64 `json:"fans_count_real_accumulate"`
FansCountCheatAccumulate int64 `json:"fans_count_cheat_accumulate"`
GenerateDate xtime.Time `json:"generate_date"`
BeginDate xtime.Time `json:"begin_date"`
EndDate xtime.Time `json:"end_date"`
State MCNSignState `json:"state"`
PayInfos []*SignPayInfoReply `json:"pay_infos"`
Permission uint32 `json:"permission"`
Permits *Permits `json:"permits"` // 权限集合
}
// AttrPermitVal get Permission all.
func (n *MCNListOne) AttrPermitVal() {
n.Permits = &Permits{}
n.Permits.SetAttrPermitVal(n.Permission)
}
// MCNInfoReply struct .
type MCNInfoReply struct {
MCNSign
UPCount int64 `json:"up_count"`
ArchiveCountAccumulate int64 `json:"archive_count_accumulate"`
PlayCountAccumulate int64 `json:"play_count_accumulate"`
FansCountAccumulate int64 `json:"fans_count_accumulate"`
FansCountOnline int64 `json:"fans_count_online"`
FansCountReal int64 `json:"fans_count_real"`
FansCountCheat int64 `json:"fans_count_cheat"`
FansCountRealAccumulate int64 `json:"fans_count_real_accumulate"`
FansCountOnlineAccumulate int64 `json:"fans_count_online_accumulate"`
}
// MCNUPListReply struct .
type MCNUPListReply struct {
List []*MCNUPInfoReply `json:"result"`
PageResult
}
// MCNCheatReply struct .
type MCNCheatReply struct {
SignID int64 `json:"sign_id"`
MCNMID int64 `json:"mcn_mid"`
MCNName string `json:"mcn_name"`
UpMID int64 `json:"up_mid"`
UpName string `json:"up_name"`
FansCountCheatAccumulate int64 `json:"fans_count_cheat_accumulate"`
FansCountCheatIncreaseDay int64 `json:"fans_count_cheat_increase_day"`
FansCountReal int64 `json:"fans_count_real"`
FansCountCheatCleanedAccumulate int64 `json:"fans_count_cheat_cleaned_accumulate"`
}
// MCNCheatListReply struct.
type MCNCheatListReply struct {
List []*MCNCheatReply `json:"result"`
PageResult
}
// MCNCheatUPReply struct .
type MCNCheatUPReply struct {
GenerateDate xtime.Time `json:"generate_date"`
FansCountCheatIncreaseDay int64 `json:"fans_count_cheat_increase_day"`
MCNMID int64 `json:"mcn_mid"`
MCNName string `json:"mcn_name"`
SignID int64 `json:"sign_id"`
FansCountCheatAccumulate int64 `json:"fans_count_cheat_accumulate"`
FansCountCheatCleanedAccumulate int64 `json:"fans_count_cheat_cleaned_accumulate"`
FansCountReal int64 `json:"fans_count_real"`
}
// MCNCheatUPListReply struct .
type MCNCheatUPListReply struct {
List []*MCNCheatUPReply `json:"result"`
PageResult
}
// MCNImportUPInfoReply struct .
type MCNImportUPInfoReply struct {
ID int64 `json:"id"`
MCNMID int64 `json:"mcn_mid"`
SignID int64 `json:"sign_id"`
UpMID int64 `json:"up_mid"`
UpName string `json:"up_name"`
StandardFansDate int64 `json:"standard_fans_date"`
StandardArchiveCount int64 `json:"standard_archive_count"`
StandardFansCount int64 `json:"standard_fans_count"`
IsReward int8 `json:"is_reward"`
JoinTime int32 `json:"join_time"`
}
// MCNIncreaseReply struct .
type MCNIncreaseReply struct {
ID int64 `json:"id"`
SignID int64 `json:"sign_id"`
DataType int8 `json:"data_type"`
ActiveTID int64 `json:"active_tid"`
GenerateDate xtime.Time `json:"generate_date"`
UPCount int64 `json:"up_count"`
FansCountOnlineAccumulate int64 `json:"fans_count_online_accumulate"`
FansCountRealAccumulate int64 `json:"fans_count_real_accumulate"`
FansCountCheatAccumulate int64 `json:"fans_count_cheat_accumulate"`
FansCountIncreaseDay int64 `json:"fans_count_increase_day"`
ArchiveCountAccumulate int64 `json:"archive_count_accumulate"`
ArchiveCountDay int64 `json:"archive_count_day"`
PlayCountAccumulate int64 `json:"play_count_accumulate"`
PlayCountIncreaseDay int64 `json:"play_count_increase_day"`
FansCountAccumulate int64 `json:"fans_count_accumulate"`
}
// MCNIncreaseListReply struct .
type MCNIncreaseListReply struct {
List []*MCNIncreaseReply `json:"result"`
PageResult
}
//GetFileName get file name
func (q *MCNListReply) GetFileName() string {
return fmt.Sprintf("%s_%s.csv", "MCN列表", time.Now().Format(dateTimeFmt))
}
//ToCsv to buffer
func (q *MCNListReply) ToCsv(writer *csv.Writer) {
var title = []string{
"ID",
"MCN_ID",
"MCN_昵称",
"签约UP主数",
"累计粉丝数",
"累计线上涨粉数",
"累计实际粉丝数",
"累计作弊粉丝数",
"签约周期",
"付款周期",
"账号状态",
}
writer.Write(title)
if q == nil {
return
}
for _, v := range q.List {
var record []string
var payString string
if len(v.PayInfos) > 0 {
for _, pv := range v.PayInfos {
payString += fmt.Sprintf("%s-%d-%s ", pv.DueDate.Time().Format(TimeFormatDay), pv.PayValue/1000, pv.State.String())
}
}
record = append(record,
intFormat(v.ID),
intFormat(v.MCNMID),
v.MCNName,
intFormat(v.UPCount),
intFormat(v.FansCountAccumulate),
intFormat(v.FansCountOnlineAccumulate),
intFormat(v.FansCountRealAccumulate),
intFormat(v.FansCountCheatAccumulate),
fmt.Sprintf("%s-%s", v.BeginDate.Time().Format(TimeFormatDay), v.EndDate.Time().Format(TimeFormatDay)),
payString,
v.State.String(),
)
writer.Write(record)
}
}
//GetFileName get file name
func (q *MCNUPListReply) GetFileName() string {
return fmt.Sprintf("%s_%s.csv", "MCN UP主列表", time.Now().Format(dateTimeFmt))
}
//ToCsv to buffer
func (q *MCNUPListReply) ToCsv(writer *csv.Writer) {
var title = []string{
"ID",
"UP主UID",
"UP主昵称",
"粉丝总量",
"活跃粉丝量",
"粉数增长量",
"稿件量",
"播放量",
"分区",
"账号状态",
"签约周期",
}
writer.Write(title)
if q == nil {
return
}
for _, v := range q.List {
var record []string
record = append(record,
intFormat(v.SignUpID),
intFormat(v.UpMid),
v.UpName,
intFormat(v.FansCount),
intFormat(v.FansCountActive),
intFormat(v.FansIncreaseAccumulate),
intFormat(v.ArchiveCount),
intFormat(v.PlayCount),
v.TpName,
v.State.String(),
fmt.Sprintf("%s-%s", v.BeginDate.Time().Format(TimeFormatDay), v.EndDate.Time().Format(TimeFormatDay)),
)
writer.Write(record)
}
}
// McnUpRecommendPool .
type McnUpRecommendPool struct {
ID int64 `json:"id"`
UpMid int64 `json:"up_mid"`
UpName string `json:"up_name"`
FansCount int64 `json:"fans_count"`
FansCountIncreaseMonth int64 `json:"fans_count_increase_month"`
ArchiveCount int64 `json:"archive_count"`
PlayCountAccumulate int64 `json:"play_count_accumulate"`
PlayCountAverage int64 `json:"play_count_average"`
ActiveTid int16 `json:"active_tid"`
TpName string `json:"type_name"`
LastArchiveTime xtime.Time `json:"last_archive_time"`
State MCNUPRecommendState `json:"state"`
Source MCNUPRecommendSource `json:"source"`
GenerateTime xtime.Time `json:"generate_time"`
Ctime xtime.Time `json:"ctime"`
Mtime xtime.Time `json:"mtime"`
}
// McnUpRecommendListReply struct .
type McnUpRecommendListReply struct {
List []*McnUpRecommendPool `json:"result"`
PageResult
}
//GetFileName get file name
func (list *McnUpRecommendListReply) GetFileName() string {
return fmt.Sprintf("%s_%s.csv", "MCN推荐池列表", time.Now().Format(dateTimeFmt))
}
//ToCsv to buffer
func (list *McnUpRecommendListReply) ToCsv(writer *csv.Writer) {
var title = []string{
"UP主UID",
"up主昵称",
"粉丝量",
"本月粉丝增长量",
"累积播放量",
"稿均播放量",
"分区",
"最近投稿时间",
"来源",
"推荐池状态",
"数据更新时间",
}
writer.Write(title)
if list == nil {
return
}
for _, v := range list.List {
var record []string
record = append(record,
intFormat(v.UpMid),
v.UpName,
intFormat(v.FansCount),
intFormat(v.FansCountIncreaseMonth),
intFormat(v.PlayCountAccumulate),
intFormat(v.PlayCountAverage),
v.TpName,
v.LastArchiveTime.Time().Format(TimeFormatSec),
v.Source.String(),
v.State.String(),
v.GenerateTime.Time().Format(TimeFormatSec),
)
writer.Write(record)
}
}
// McnGetRankUpFansReply reply
type McnGetRankUpFansReply struct {
Result []*RankArchiveLikeInfo `json:"result"` // 按顺序进行排名
TypeList []*TidnameInfo `json:"type_list"`
}
// GetFileName get file name
func (list *McnGetRankUpFansReply) GetFileName() string {
return fmt.Sprintf("%s_%s.csv", "top稿件列表", time.Now().Format(dateTimeFmt))
}
// ToCsv to buffer
func (list *McnGetRankUpFansReply) ToCsv(writer *csv.Writer) {
var title = []string{
"稿件ID",
"稿件标题",
"UP主UID",
"UP主昵称",
"新增点赞数",
"累积点赞数",
"新增播放数",
"累积播放数",
"分区",
"上传日期",
}
writer.Write(title)
if list == nil {
return
}
for _, v := range list.Result {
var record []string
record = append(record,
intFormat(v.ArchiveID),
v.ArchiveTitle,
intFormat(v.Author.Mid),
v.Author.Name,
intFormat(v.LikesIncrease),
intFormat(v.LikesAccumulate),
intFormat(v.PlayIncrease),
intFormat(v.PlayAccumulate),
v.TidName,
v.Ctime.Time().Format(TimeFormatSec),
)
writer.Write(record)
}
}
// McnGetMcnFansReply reply 粉丝分析.
type McnGetMcnFansReply struct {
FansOverview *dtmdl.DmConMcnFansD `json:"fans_overview"` // 粉丝概况
FansSex *dtmdl.DmConMcnFansSexW `json:"fans_sex"` // 粉丝性别
FansAge *dtmdl.DmConMcnFansAgeW `json:"fans_age"` // 粉丝年龄
FansPlayWay *dtmdl.DmConMcnFansPlayWayW `json:"fans_play_way"` // 粉丝观看途径
FansArea []*dtmdl.DmConMcnFansAreaW `json:"fans_area"` // 粉丝地区分布
FansType []*dtmdl.DmConMcnFansTypeW `json:"fans_type"` // 粉丝倾向分布
FansTag []*dtmdl.DmConMcnFansTagW `json:"fans_tag"` // 粉丝标签地图分布
}
// McnUpPermissionApply .
type McnUpPermissionApply struct {
ID int64 `json:"id"`
McnMid int64 `json:"mcn_mid"`
UpMid int64 `json:"up_mid"`
McnName string `json:"mcn_name"`
UpName string `json:"up_name"`
SignID int64 `json:"sign_id"`
FansCount int64 `json:"fans_count"`
UpAuthLink string `json:"up_auth_link"`
ActiveTID int16 `json:"active_tid"`
TypeName string `json:"type_name"`
RejectReason string `json:"reject_reason"`
RejectTime xtime.Time `json:"reject_time"`
State MCNUPPermissionState `json:"state"`
Ctime xtime.Time `json:"ctime"`
Mtime xtime.Time `json:"mtime"`
AdminID int64 `json:"admin_id"`
AdminName string `json:"admin_name"`
OldPermits *Permits `json:"old_permits"`
NewPermits *Permits `json:"new_permits"`
NewPermission uint32 `json:"-"`
OldPermission uint32 `json:"-"`
}
// AttrPermitVal get Permission all.
func (n *McnUpPermissionApply) AttrPermitVal() {
n.OldPermits, n.NewPermits = &Permits{}, &Permits{}
n.OldPermits.SetAttrPermitVal(n.OldPermission)
n.NewPermits.SetAttrPermitVal(n.NewPermission)
}
// McnUpPermitApplyListReply struct .
type McnUpPermitApplyListReply struct {
List []*McnUpPermissionApply `json:"result"`
PageResult
}

View File

@@ -0,0 +1,38 @@
package model
// type replyCommon struct {
// Message string `json:"message"`
// Code int `json:"code"`
// Data interface{} `json:"data"`
// }
// func createReply(data interface{}) *replyCommon {
// return &replyCommon{
// Message: "",
// Code: 0,
// Data: data,
// }
// }
// func printReply(data interface{}) {
// var r = createReply(data)
// var result, _ = json.MarshalIndent(r, "", " ")
// fmt.Printf(string(result) + "\n")
// }
// var now = xtime.Time(time.Now().Unix())
// func TestMcnGetMcnFansReply(t *testing.T) {
// var reply = McnGetMcnFansReply{Result: []*McnGetMcnFansInfo{
// {
// FansOverview: &dtmdl.DmConMcnFansD{LogDate: now},
// FansSex: &dtmdl.DmConMcnFansSexW{LogDate: now},
// FansAge: &dtmdl.DmConMcnFansAgeW{LogDate: now},
// FansPlayWay: &dtmdl.DmConMcnFansPlayWayW{LogDate: now},
// FansArea: []*dtmdl.DmConMcnFansAreaW{{LogDate: now}},
// FansType: []*dtmdl.DmConMcnFansTypeW{{LogDate: now}},
// FansTag: []*dtmdl.DmConMcnFansTagW{{LogDate: now}},
// },
// }}
// printReply(&reply)
// }

View File

@@ -0,0 +1,311 @@
package model
import (
"time"
xtime "go-common/library/time"
"github.com/pkg/errors"
)
// MCNSignEntryReq req .
type MCNSignEntryReq struct {
MCNMID int64 `json:"mcn_mid" validate:"min=1"`
BeginDate string `json:"begin_date" validate:"required"` // 0000-00-00
EndDate string `json:"end_date" validate:"required"` // 0000-00-00
SignPayInfo []*SignPayReq `json:"sign_pay_info"`
Permits *Permits `json:"permits"`
UserName string
UID int64
Permission uint32
}
// AttrPermitSet set Permission.
func (req *MCNSignEntryReq) AttrPermitSet() {
req.Permission = req.Permits.GetAttrPermitVal()
}
// MCNSignPermissionReq .
type MCNSignPermissionReq struct {
SignID int64 `json:"sign_id" validate:"required"`
Permits *Permits `json:"permits"`
Permission uint32
UserName string
UID int64
}
// AttrPermitSet set Permission.
func (req *MCNSignPermissionReq) AttrPermitSet() {
req.Permission = req.Permits.GetAttrPermitVal()
}
// MCNUPPermitStateReq .
type MCNUPPermitStateReq struct {
State MCNUPPermissionState `form:"state" validate:"required"`
PageArg
}
// MCNUPPermitOPReq .
type MCNUPPermitOPReq struct {
ID int64 `json:"id" validate:"min=1"`
Action MCNUPPermissionAction `json:"action" validate:"min=1"`
RejectReason string `json:"reject_reason"`
UserName string
UID int64
}
// ParseTime .
func (req *MCNSignEntryReq) ParseTime() (stime, etime xtime.Time, err error) {
var st, et time.Time
if st, err = time.ParseInLocation(TimeFormatDay, req.BeginDate, time.Local); err != nil {
err = errors.Errorf("time.ParseInLocation(%s) error(%+v)", req.BeginDate, err)
return
}
if et, err = time.ParseInLocation(TimeFormatDay, req.EndDate, time.Local); err != nil {
err = errors.Errorf("time.ParseInLocation(%s) error(%+v)", req.EndDate, err)
return
}
stime = xtime.Time(st.Unix())
etime = xtime.Time(et.Unix())
return
}
// SignPayReq .
type SignPayReq struct {
DueDate string `json:"due_date" validate:"required"` // 0000-00-00
PayValue int64 `json:"pay_value" validate:"min=1"` // thousand bit
}
// MCNSignInfoReq req
type MCNSignInfoReq struct {
SignID int64 `form:"sign_id" validate:"min=1"`
}
// MCNSignStateReq req .
type MCNSignStateReq struct {
State MCNSignState `form:"state" validate:"min=0"`
PageArg
}
// MCNSignStateOpReq .
type MCNSignStateOpReq struct {
SignID int64 `json:"sign_id" validate:"min=1"`
Action MCNSignAction `json:"action" validate:"min=0"`
RejectReason string `json:"reject_reason"`
UserName string
UID int64
}
// MCNUPStateReq req .
type MCNUPStateReq struct {
State MCNUPState `form:"state" validate:"min=0"`
PageArg
}
// MCNUPStateOpReq req .
type MCNUPStateOpReq struct {
SignUpID int64 `json:"sign_up_id" validate:"min=1"`
Action MCNUPAction `json:"action" validate:"min=0"`
RejectReason string `json:"reject_reason"`
UserName string
UID int64
}
// MCNListReq req .
type MCNListReq struct {
McnCommonReq
Permits
ExpireSign bool `form:"expire_sign"`
ExpirePay bool `form:"expire_pay"`
FansNumMin int64 `form:"fans_num_min"`
FansNumMax int64 `form:"fans_num_max"`
State MCNSignState `form:"state" default:"-1"`
SortUP string `form:"sort_up"`
SortAllFans string `form:"sort_all_fans"`
SortRiseFans string `form:"sort_rise_fans"`
SortTrueRiseFans string `form:"sort_true_rise_fans"`
SortCheatFans string `form:"sort_cheat_fans"`
Order string `form:"order" default:"s.mtime"`
Sort string `form:"sort" default:"DESC"`
PageArg
ExportArg
}
// MCNPayEditReq req .
type MCNPayEditReq struct {
ID int64 `json:"id" validate:"min=1"`
MCNMID int64 `json:"mcn_mid" validate:"min=1"`
SignID int64 `json:"sign_id" validate:"min=1"`
DueDate string `json:"due_date" validate:"required"`
PayValue int64 `json:"pay_value" validate:"min=1"`
UserName string
UID int64
}
// MCNPayStateEditReq req .
type MCNPayStateEditReq struct {
ID int64 `json:"id" validate:"min=1"`
MCNMID int64 `json:"mcn_mid" validate:"min=1"`
SignID int64 `json:"sign_id" validate:"min=1"`
State int8 `json:"state"`
UserName string
UID int64
}
// MCNStateEditReq req .
type MCNStateEditReq struct {
ID int64 `json:"id" validate:"min=1"`
MCNMID int64 `json:"mcn_mid" validate:"min=1"`
Action MCNSignAction `json:"action"`
State MCNSignState
UserName string
UID int64
}
// MCNRenewalReq req .
type MCNRenewalReq struct {
ID int64 `json:"id" validate:"min=1"`
MCNMID int64 `json:"mcn_mid" validate:"min=1"`
BeginDate string `json:"begin_date" validate:"required"` // 0000-00-00
EndDate string `json:"end_date" validate:"required"` // 0000-00-00
ContractLink string `json:"contract_link" validate:"required"`
SignPayInfo []*SignPayReq `json:"sign_pay_info"`
Permits Permits `json:"permits"`
Permission uint32
UserName string
UID int64
}
// AttrPermitSet set Permission.
func (req *MCNRenewalReq) AttrPermitSet() {
req.Permission = req.Permits.GetAttrPermitVal()
}
// MCNInfoReq req .
type MCNInfoReq struct {
McnCommonReq
ID int64 `form:"id"`
}
// MCNUPListReq req .
type MCNUPListReq struct {
SignID int64 `form:"sign_id" validate:"required"`
DataType int8 `form:"data_type" validate:"min=1"`
State MCNUPState `form:"state" default:"-1"`
ActiveTID int64 `form:"active_tid"`
FansNumMin int64 `form:"fans_num_min"`
FansNumMax int64 `form:"fans_num_max"`
UPMID int64 `form:"up_mid"`
SortFansCount string `form:"sort_fans_count"`
SortFansCountActive string `form:"sort_fans_count_active"`
SortFansIncreaseAccumulate string `form:"sort_fans_increase_accumulate"`
SortArchiveCount string `form:"sort_archive_count"`
SortPlayCount string `form:"sort_play_count"`
SortPubPrice string `form:"sort_pub_price"`
UpType int8 `form:"up_type" default:"-1"`
Order string `form:"order" default:"u.mtime"`
Sort string `form:"sort" default:"DESC"`
Permits
PageArg
ExportArg
}
// MCNUPStateEditReq req .
type MCNUPStateEditReq struct {
ID int64 `json:"id" validate:"required"`
SignID int64 `json:"sign_id" validate:"required"`
MCNMID int64 `json:"mcn_mid" validate:"required"`
UPMID int64 `json:"up_mid" validate:"required"`
Action MCNUPAction `json:"action"`
State MCNUPState
UserName string
UID int64
}
// MCNUPRecommendReq req .
type MCNUPRecommendReq struct {
TID int64 `form:"tid"`
UpMid int64 `form:"up_mid"`
FansMin int64 `form:"fans_min"`
FansMax int64 `form:"fans_max"`
PlayMin int64 `form:"play_min"`
PlayMax int64 `form:"play_max"`
PlayAverageMin int64 `form:"play_average_min"`
PlayAverageMax int64 `form:"play_average_max"`
State MCNUPRecommendState `form:"state"`
Source MCNUPRecommendSource `form:"source"`
Order string `form:"order" default:"mtime"`
Sort string `form:"sort" default:"DESC"`
PageArg
ExportArg
}
// MCNCheatListReq req .
type MCNCheatListReq struct {
McnCommonReq
UPMID int64 `form:"up_mid"`
PageArg
}
// MCNCheatUPListReq struct .
type MCNCheatUPListReq struct {
UPMID int64 `form:"up_mid" validate:"required"`
PageArg
}
// MCNImportUPInfoReq struct .
type MCNImportUPInfoReq struct {
McnCommonReq
UPMID int64 `form:"up_mid" validate:"required"`
}
// MCNImportUPRewardSignReq struct .
type MCNImportUPRewardSignReq struct {
SignID int64 `json:"sign_id" validate:"required"`
UPMID int64 `json:"up_mid" validate:"required"`
UserName string
UID int64
}
// RecommendUpReq req .
type RecommendUpReq struct {
UpMid int64 `json:"up_mid" validate:"min=1"`
UserName string
UID int64
}
// MCNIncreaseListReq struct .
type MCNIncreaseListReq struct {
McnCommonReq
DataType int8 `form:"data_type"`
ActiveTID int64 `form:"active_tid" default:"65535"`
PageArg
}
// RecommendStateOpReq .
type RecommendStateOpReq struct {
UpMids []int64 `json:"up_mids"`
Action MCNUPRecommendAction `json:"action" validate:"min=1"`
UserName string
UID int64
}
// McnGetRankReq req to 获取排行
type McnGetRankReq struct {
McnCommonReq
Tid int16 `form:"tid"` // 分区 1累计2昨日3上周4上月 0全部
DataType DataType `form:"data_type"`
PageArg
ExportArg
}
// McnCommonReq common mcn
type McnCommonReq struct {
SignID int64 `form:"sign_id"`
MCNMID int64 `form:"mcn_mid"`
}
// TotalMcnDataReq .
type TotalMcnDataReq struct {
Date xtime.Time `form:"date" validate:"required"`
}

View File

@@ -0,0 +1,76 @@
package model
import (
"math"
"strconv"
)
// const .
const (
// dateFmt = "20060102"
dateTimeFmt = "20060102_150405"
ResponeModelJSON = "json"
ResponeModelCSV = "csv"
)
func round(num float64) int {
return int(num + math.Copysign(0.5, num))
}
//ToFixed fix float precision
func ToFixed(num float64, precision int) float64 {
output := math.Pow(10, float64(precision))
return float64(round(num*output)) / output // since go 1.9 doesn't have a math.Round function...
}
// floatFormat format float to string
func floatFormat(f float64) string {
return strconv.FormatFloat(f, 'f', 2, 64)
}
// intFormat format int to string
func intFormat(i int64) string {
return strconv.Itoa(int(i))
}
//PageArg page arg
type PageArg struct {
Page int `form:"page" default:"1"`
Size int `form:"size" default:"20"`
}
//PageResult page result
type PageResult struct {
Page int `json:"page"`
TotalCount int `json:"total_count"`
}
//CheckPageValidation check the page validte, return limit offset
func (arg *PageArg) CheckPageValidation() (limit, offset int) {
if arg.Page < 1 {
arg.Page = 1
}
if arg.Size > 100 || arg.Size <= 0 {
arg.Size = 10
}
limit = arg.Size
offset = (arg.Page - 1) * limit
return
}
//ToPageResult cast to page result
func (arg *PageArg) ToPageResult(total int) (res PageResult) {
res.TotalCount = total
res.Page = arg.Page
return
}
//ExportArg export arg
type ExportArg struct {
Export string `form:"export"`
}
//ExportFormat export format
func (e *ExportArg) ExportFormat() string {
return e.Export
}

View File

@@ -0,0 +1,62 @@
package model
import (
"encoding/csv"
"fmt"
"time"
xtime "go-common/library/time"
)
// QueryActivityByIDReq arg
type QueryActivityByIDReq struct {
FromDate string `form:"from_date"` // 20180101
ToDate string `form:"to_date"` // 20180102 closed interval [20180101, 20180102]
ID int64 `form:"id"` // activity id, if not 0, FromDate and toDate not used
PageArg
ExportArg
}
//UpSummaryBonusInfo bonus for one up info
type UpSummaryBonusInfo struct {
Mid int64 `json:"mid"`
BilledMoney float64 `json:"billed_money"`
UnbilledMoney float64 `json:"unbilled_money"`
LastBillTime string `json:"last_bill_time"` // 20180101 最近结算时间
TmpBillTime xtime.Time `json:"-"` // 用来计算LastBillTime
TotalBonusMoney float64 `json:"total_bonus_money"` // 所有的中奖金额
}
//QueryUpBonusByMidResult query result
type QueryUpBonusByMidResult struct {
Result []*UpSummaryBonusInfo `json:"result"`
PageResult
}
//GetFileName get file name
func (q *QueryUpBonusByMidResult) GetFileName() string {
return fmt.Sprintf("%s_%s.csv", "结算记录", time.Now().Format(dateTimeFmt))
}
//ToCsv to buffer
func (q *QueryUpBonusByMidResult) ToCsv(writer *csv.Writer) {
var title = []string{
"UID",
"已结算",
"未结算",
"最近结算时间"}
writer.Write(title)
if q == nil {
return
}
for _, v := range q.Result {
var record []string
record = append(record,
intFormat(v.Mid),
floatFormat(v.BilledMoney),
floatFormat(v.UnbilledMoney),
v.LastBillTime,
)
writer.Write(record)
}
}

View File

@@ -0,0 +1,265 @@
package model
import (
arcmodel "go-common/app/service/main/archive/model/archive"
xtime "go-common/library/time"
)
const (
// TopDataLenth .
TopDataLenth int = 5
)
// DataType .
type DataType int8
// DataType 数据类型1累计2昨日3上周4上月
/* ENUM(
Accumulate = 1
Day = 2
Week = 3
Month = 4
ActiveFans = 5
)*/
const (
// DataTypeAccumulate is a DataType of type Accumulate
DataTypeAccumulate DataType = 1
// DataTypeDay is a DataType of type Day
DataTypeDay DataType = 2
// DataTypeWeek is a DataType of type Week
DataTypeWeek DataType = 3
// DataTypeMonth is a DataType of type Month
DataTypeMonth DataType = 4
// DataTypeActiveFans active fans
DataTypeActiveFans DataType = 5
)
// DataViewTypeSummary .
type DataViewTypeSummary int8
const (
// SignUpsAccumulate signed up accumulate amount.
SignUpsAccumulate DataViewTypeSummary = 1
// FansIncr signed up fans incr amount.
FansIncr DataViewTypeSummary = 2
// VideoUpsIncr signed up videoup incr amount.
VideoUpsIncr DataViewTypeSummary = 3
// PlaysIncr signed up paly incr amount.
PlaysIncr DataViewTypeSummary = 4
)
// DataViewFansTop .
type DataViewFansTop int8
const (
// McnFansIncr .
McnFansIncr DataViewFansTop = 1
// McnFansIncrRate .
McnFansIncrRate DataViewFansTop = 2
// UpFansIncr .
UpFansIncr DataViewFansTop = 3
// UpFansIncrRate .
UpFansIncrRate DataViewFansTop = 4
)
// MCNDataSummary .
type MCNDataSummary struct {
ID int64 `json:"id"`
MCNID int64 `json:"mcn_mid"`
SignID int64 `json:"sign_id"`
UPCount int64 `json:"up_count"`
FansCountAccumulate int64 `json:"fans_count_accumulate"`
FansCountOnline int64 `json:"fans_count_online"`
FansCountReal int64 `json:"fans_count_real"`
FansCountCheat int64 `json:"fans_count_cheat"`
FansCountCheatAccumulate int64 `json:"fans_count_cheat_accumulate"`
FansCountIncreaseDay int64 `json:"fans_count_increase_day"`
PlayCountAccumulate int64 `json:"play_count_accumulate"`
PlayCountIncreaseDay int64 `json:"play_count_increase_day"`
ArchiveCountAccumulate int64 `json:"archive_count_accumulate"`
ArchiveCountIncreaseDay int64 `json:"archive_count_increase_day"`
ActiveTID int64 `json:"active_tid"`
GenerateDate xtime.Time `json:"generate_date"`
Ctime xtime.Time `json:"ctime"`
Mtime xtime.Time `json:"mtime"`
}
// MCNDataUP .
type MCNDataUP struct {
ID int64 `json:"id"`
MCNID int64 `json:"mcn_mid"`
SignID int64 `json:"sign_id"`
UPMID int64 `json:"up_mid"`
DataType int8 `json:"data_type"`
FansCountAll int64 `json:"fans_count_all"`
FansCountActive int64 `json:"fans_count_active"`
FansIncreaseAccumulate int64 `json:"fans_increase_accumulate"`
ArchiveCount int64 `json:"archive_count"`
PlayCount int64 `json:"play_count"`
FansIncreaseMonth int64 `json:"fans_increase_month"`
GenerateDate xtime.Time `json:"generate_date"`
Ctime xtime.Time `json:"ctime"`
Mtime xtime.Time `json:"mtime"`
}
// MCNDataArchiveRank .
type MCNDataArchiveRank struct {
ID int64 `json:"id"`
MCNID int64 `json:"mcn_mid"`
SignID int64 `json:"sign_id"`
ArchiveID int64 `json:"archive_id"`
ArchiveTitle string `json:"archive_title"`
UPMID int64 `json:"up_mid"`
LikeCountAccumulate int64 `json:"like_count_accumulate"`
LikeCountIncrease int64 `json:"like_count_increase"`
PlayCountIncrease int64 `json:"play_count_increase"`
DataType int8 `json:"data_type"`
TID int64 `json:"tid"`
CtimeArchive xtime.Time `json:"ctime_archive"`
Ctime xtime.Time `json:"ctime"`
Mtime xtime.Time `json:"mtime"`
}
// RankDataBase 基本排行信息
type RankDataBase struct {
Tid int16 `json:"tid"`
DataType DataType `json:"data_type"`
}
// TidnameInfo tid name
type TidnameInfo struct {
Tid int16 `json:"tid"`
Name string `json:"name"`
}
// RankArchiveLikeInfo archive like rank info
type RankArchiveLikeInfo struct {
RankDataBase
ArchiveID int64 `json:"archive_id"` // 稿件ID
ArchiveTitle string `json:"archive_title"`
Pic string `json:"pic"` // 封面
TidName string `json:"tid_name"`
LikesIncrease int64 `json:"likes_increase"`
LikesAccumulate int64 `json:"likes_accumulate"`
PlayIncrease int64 `json:"play_increase"`
PlayAccumulate int64 `json:"play_accumulate"`
Ctime xtime.Time `json:"ctime"`
Stat arcmodel.Stat3 `json:"stat"` // 统计信息
Author arcmodel.Author3 `json:"author"` // up主信息
}
// TotalMcnDataInfo .
type TotalMcnDataInfo struct {
BaseInfo *McnDataOverview `json:"base_info"`
TopInfo *McnDataTopInfo `json:"top_info"`
TypesInfo *McnDataTypesInfo `json:"types_info"`
}
// McnDataTopInfo .
type McnDataTopInfo struct {
McnFansIncr []*FansRankIncr `json:"mcn_fans_incr"`
McnFansRateIncr []*FansRankIncr `json:"mcn_fans_rate_incr"`
UpFansIncr []*FansRankIncr `json:"up_fans_incr"`
UpFansRateIncr []*FansRankIncr `json:"up_fans_rate_incr"`
ArcLikesIncr []*LikesRankIncr `json:"arc_likes_incr"`
}
// FansRankIncr .
type FansRankIncr struct {
SignID int64 `json:"sign_id"`
Mid int64 `json:"mid"`
Name string `json:"name"`
Rank int16 `json:"rank"`
FansIncr int64 `json:"fans_incr"`
Fans int64 `json:"fans"`
RateIncr int64 `json:"rate_incr"`
}
// LikesRankIncr .
type LikesRankIncr struct {
McnMid int64 `json:"mcn_mid"`
McnName string `json:"mcn_name"`
UpMid int64 `json:"up_mid"`
UpName string `json:"up_name"`
AVID int64 `json:"avid"`
AVTitle string `json:"av_title"`
TID int16 `json:"tid"`
TypeName string `json:"type_name"`
LikesIncr int64 `json:"likes_incr"`
PlayIncr int64 `json:"play_incr"`
SignID int64 `json:"sign_id"`
}
// McnDataTypesInfo .
type McnDataTypesInfo struct {
SignUps []*DataTypes `json:"sign_ups"`
FansIncr []*DataTypes `json:"fans_incr"`
VideoupIncr []*DataTypes `json:"videoup_incr"`
PlayIncr []*DataTypes `json:"play_incr"`
}
// DataTypes .
type DataTypes struct {
TID int16 `json:"tid"`
TypeName string `json:"type_name"`
Total int64 `json:"total"`
Amount int64 `json:"amount"`
Rate int64 `json:"rate"`
}
// McnDataOverview base data.
type McnDataOverview struct {
Mcns int64 `json:"mcns"`
SignUps int64 `json:"sign_ups"`
SignUpsIncr int64 `json:"sign_ups_incr"`
Fans50 int64 `json:"fans_50"`
Fans10 int64 `json:"fans_10"`
Fans1 int64 `json:"fans_1"`
FansIncr50 int64 `json:"fans_incr_50"`
FansIncr10 int64 `json:"fans_incr_10"`
FansIncr1 int64 `json:"fans_incr_1"`
}
// McnRankFansOverview top5 data.
type McnRankFansOverview struct {
ID int64 `json:"id"`
SignID int64 `json:"sign_id"`
Mid int64 `json:"mid"`
DataView int8 `json:"data_view"`
DataType int8 `json:"data_type"`
Rank int16 `json:"rank"`
FansIncr int64 `json:"fans_incr"`
Fans int64 `json:"fans"`
GenerateDate xtime.Time `json:"generate_date"`
Ctime xtime.Time `json:"ctime"`
Mtime xtime.Time `json:"mtime"`
}
// McnDataTypeSummary tids data.
type McnDataTypeSummary struct {
ID int64 `json:"id"`
Tid int16 `json:"tid"`
DataView int8 `json:"data_view"`
DataType int8 `json:"data_type"`
Amount int64 `json:"amount"`
GenerateDate xtime.Time `json:"generate_date"`
Ctime xtime.Time `json:"ctime"`
Mtime xtime.Time `json:"mtime"`
}
// McnRankArchiveLikesOverview total mcn arc rank likes top
type McnRankArchiveLikesOverview struct {
ID int64 `json:"id"`
McnMid int64 `json:"mcn_mid"`
UpMid int64 `json:"up_mid"`
SignID int64 `json:"sign_id"`
Avid int64 `json:"avid"`
Tid int16 `json:"tid"`
Rank int16 `json:"rank"`
DataType int8 `json:"data_type"`
Likes int64 `json:"likes"`
Plays int64 `json:"plays"`
GenerateDate xtime.Time `json:"generate_date"`
Ctime xtime.Time `json:"ctime"`
Mtime xtime.Time `json:"mtime"`
}

View File

@@ -0,0 +1,48 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"authority.go",
"http.go",
"http_base.go",
"mcn.go",
"recommend.go",
"statistics.go",
"upload.go",
],
importpath = "go-common/app/admin/main/mcn/server/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/mcn/conf:go_default_library",
"//app/admin/main/mcn/model:go_default_library",
"//app/admin/main/mcn/service:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/binding:go_default_library",
"//library/net/http/blademaster/middleware/permit:go_default_library",
"//library/net/http/blademaster/render: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"],
)

View File

@@ -0,0 +1,25 @@
package http
import (
"net/http"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
// check username and dashboard sessionid
func checkCookie(c *bm.Context) (username, sid string, err error) {
var r = c.Request
var name *http.Cookie
if name, err = r.Cookie("username"); err == nil {
username = name.Value
}
var session *http.Cookie
if session, err = r.Cookie("_AJSESSIONID"); err == nil {
sid = session.Value
}
if username == "" || sid == "" {
err = ecode.Unauthorized
}
return
}

View File

@@ -0,0 +1,95 @@
package http
import (
"net/http"
"go-common/app/admin/main/mcn/conf"
"go-common/app/admin/main/mcn/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/permit"
)
var (
srv *service.Service
authSvc *permit.Permit
)
// Init init
func Init(c *conf.Config) {
initService(c)
engine := bm.DefaultServer(c.BM)
route(engine)
if err := engine.Start(); err != nil {
log.Error("bm Start error(%v)", err)
panic(err)
}
}
// initService init service
func initService(c *conf.Config) {
srv = service.New(c)
authSvc = permit.New(c.Auth)
}
func route(e *bm.Engine) {
e.Ping(ping)
e.Register(register)
g := e.Group("/allowance/api/x/admin/mcn") // authSvc.Verify() manager use
{
// mcn account .
g.POST("/sign/upload", upload)
g.POST("/sign/entry", mcnSignEntry)
g.GET("/sign/list", mcnSignList)
g.POST("/sign/op", mcnSignOP)
g.GET("/sign/up/list", mcnUPReviewList)
g.POST("/sign/up/op", mcnUPOP)
g.POST("/sign/permit/op", mcnPermitOP)
g.GET("/sign/up/permit/list", mcnUPPermitList)
g.POST("/sign/up/permit/op", mcnUPPermitOP)
// mcn list.
g.GET("/list", mcnList)
// g.POST("/pay/add", mcnPayAdd)
g.POST("/pay/edit", mcnPayEdit)
g.POST("/pay/state/edit", mcnPayStateEdit)
g.POST("/state/edit", mcnStateEdit)
g.POST("/renewal", mcnRenewal)
// up list
g.GET("/info", mcnInfo)
g.GET("/up/list", mcnUPList)
g.POST("/up/state/edit", mcnUPStatEdit)
// 二期
g.GET("/cheat/list", mcnCheatList)
g.GET("/cheat/up/list", mcnCheatUPList)
g.GET("/import/up/info", mcnImportUPInfo)
g.POST("/import/up/reward/sign", mcnImportUPRewardSign)
g.GET("/increase/list", mcnIncreaseList)
// up fans rank
g.GET("/rank/archive/likes", arcTopDataStatistics)
// up fans analyze
g.GET("/up/fans/analyze", mcnFansAnalyze)
// mcn total statistics
g.GET("/total/statistics", mcnsTotalDatas)
// up recommend
g.GET("/recommend/list", recommendList)
g.POST("/recommend/op", recommendOP)
g.POST("/recommend/add", recommendAdd)
}
}
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,187 @@
package http
import (
"bytes"
"context"
"encoding/csv"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"reflect"
"go-common/app/admin/main/mcn/model"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
"go-common/library/net/http/blademaster/render"
"github.com/pkg/errors"
)
func bmHTTPErrorWithMsg(c *blademaster.Context, err error) {
if c.IsAborted() {
return
}
c.Error = err
bcode, ok := errors.Cause(err).(ecode.Codes)
var msg string
if !ok {
msg = err.Error()
bcode = ecode.String(err.Error())
} else {
msg = bcode.Message()
}
c.Render(http.StatusOK, render.JSON{
Code: bcode.Code(),
Message: msg,
Data: nil,
})
}
func checkCookieFun(c *blademaster.Context) (err error) {
_, _, err = checkCookie(c)
return
}
// service的函数原型
type serviceFunc func(context context.Context, arg interface{}) (res interface{}, err error)
// response writer
type responseWriter func(c *blademaster.Context, arg interface{}, res interface{}, err error)
type argParser func(c *blademaster.Context, arg interface{}) (err error)
func argGetParser(c *blademaster.Context, arg interface{}) (err error) {
err = c.Bind(arg)
return
}
// argPostJSONParser .
func argPostJSONParser(c *blademaster.Context, arg interface{}) (err error) {
respBody, _ := ioutil.ReadAll(c.Request.Body)
if err = json.Unmarshal(respBody, arg); err != nil {
log.Error("json unmarshal fail, err=%v", err)
return
}
if err = binding.Validator.ValidateStruct(arg); err != nil {
log.Error("binding.Validator.ValidateStruct(%+v) error(%+v)", arg, err)
}
return
}
func jsonWriter(c *blademaster.Context, arg interface{}, res interface{}, err error) {
c.JSON(res, err)
}
func csvWriter(c *blademaster.Context, arg interface{}, res interface{}, err error) {
formater, ok := res.(model.CsvFormatter)
if !ok {
log.Error("res cannot convert CsvFommater, res type=%s", reflect.TypeOf(res).Name())
c.String(ecode.ServerErr.Code(), "res cannot convert CsvFommater")
return
}
c.Writer.Header().Set("Content-Type", "application/csv")
c.Writer.Header().Set("Content-Disposition", fmt.Sprintf("attachment;filename=\"%s\"", formater.GetFileName()))
var buf = &bytes.Buffer{}
var csvWriter = csv.NewWriter(buf)
formater.ToCsv(csvWriter)
csvWriter.Flush()
c.Writer.Write(buf.Bytes())
}
func decideWriter(c *blademaster.Context, arg interface{}, res interface{}, err error) {
var writer responseWriter
var decider, ok = arg.(model.ExportArgInterface)
if ok {
switch decider.ExportFormat() {
case model.ResponeModelJSON:
writer = jsonWriter
case model.ResponeModelCSV:
writer = csvWriter
}
}
if writer != nil {
writer(c, arg, res, err)
} else {
jsonWriter(c, arg, res, err)
}
}
func httpGenerateFunc(arg interface{}, sfunc serviceFunc, description string, parser argParser, writer responseWriter, preFuncs ...func(*blademaster.Context) error) func(*blademaster.Context) {
return func(c *blademaster.Context) {
var res interface{}
var err error
exitswitch:
switch {
default:
for _, f := range preFuncs {
err = f(c)
if err != nil {
break exitswitch
}
}
if err = parser(c, arg); err != nil {
log.Error("%s, request argument bind fail, err=%v", description, err)
err = ecode.RequestErr
break
}
var scoreRes, e = sfunc(c, arg)
err = e
if e != nil {
log.Error("%s query fail, req=%+v, err=%+v", description, arg, err)
break
}
log.Info("%s query ok, req=%+v, result=%+v", description, arg, scoreRes)
res = scoreRes
}
if err != nil {
bmHTTPErrorWithMsg(c, err)
} else {
writer(c, arg, res, err)
}
}
}
func httpPostJSONCookie(arg interface{}, sfunc serviceFunc, description string, preFuncs ...func(*blademaster.Context) error) func(*blademaster.Context) {
preFuncs = append(preFuncs, checkCookieFun)
return httpGenerateFunc(arg, sfunc, description, argPostJSONParser, jsonWriter, preFuncs...)
}
// func httpPostFormCookie(arg interface{}, sfunc serviceFunc, description string, preFuncs ...func(*blademaster.Context) error) func(*blademaster.Context) {
// preFuncs = append(preFuncs, checkCookieFun)
// return httpGenerateFunc(arg, sfunc, description, argGetParser, jsonWriter, preFuncs...)
// }
func httpGetFunCheckCookie(arg interface{}, sfunc serviceFunc, description string, preFuncs ...func(*blademaster.Context) error) func(*blademaster.Context) {
preFuncs = append(preFuncs, checkCookieFun)
return httpGenerateFunc(arg, sfunc, description, argGetParser, jsonWriter, preFuncs...)
}
// func httpGetFunc(arg interface{}, sfunc serviceFunc, description string) func(*blademaster.Context) {
// return httpGetFuncWithWriter(arg, sfunc, description, jsonWriter)
// }
func httpGetFuncWithWriter(arg interface{}, sfunc serviceFunc, description string, writer responseWriter) func(*blademaster.Context) {
return httpGenerateFunc(arg, sfunc, description, argGetParser, writer)
}
func httpGetWriterByExport(arg interface{}, sfunc serviceFunc, description string) func(*blademaster.Context) {
return httpGetFuncWithWriter(arg, sfunc, description, decideWriter)
}
//func offlineactivityAdd(c *blademaster.Context) {
// httpPostFunCheckCookie(
// new(offlineactivity.AddActivityArg),
// func(context context.Context, arg interface{}) (res interface{}, err error) {
// return svr.AddOfflineActivity(context, arg.(*offlineactivity.AddActivityArg))
// },
// "offlineactivityAdd")(c)
//}

View File

@@ -0,0 +1,328 @@
package http
import (
"context"
"net/http"
"strconv"
"go-common/app/admin/main/mcn/model"
"go-common/library/net/http/blademaster"
)
func mcnSignEntry(c *blademaster.Context) {
httpPostJSONCookie(
new(model.MCNSignEntryReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.MCNSignEntryReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.McnSignEntry(cont, arg.(*model.MCNSignEntryReq))
},
"mcnSignEntry")(c)
}
func mcnSignList(c *blademaster.Context) {
httpGetFunCheckCookie(
new(model.MCNSignStateReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.McnSignList(cont, arg.(*model.MCNSignStateReq))
},
"mcnSignList")(c)
}
func mcnSignOP(c *blademaster.Context) {
httpPostJSONCookie(
new(model.MCNSignStateOpReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.MCNSignStateOpReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.McnSignOP(cont, arg.(*model.MCNSignStateOpReq))
},
"mcnSignOP")(c)
}
func mcnUPReviewList(c *blademaster.Context) {
httpGetFunCheckCookie(
new(model.MCNUPStateReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.McnUPReviewList(cont, arg.(*model.MCNUPStateReq))
},
"mcnUPReviewList")(c)
}
func mcnUPOP(c *blademaster.Context) {
httpPostJSONCookie(
new(model.MCNUPStateOpReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.MCNUPStateOpReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.McnUPOP(cont, arg.(*model.MCNUPStateOpReq))
},
"mcnUPOP")(c)
}
func mcnPermitOP(c *blademaster.Context) {
httpPostJSONCookie(
new(model.MCNSignPermissionReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.MCNSignPermissionReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.McnPermitOP(cont, arg.(*model.MCNSignPermissionReq))
},
"McnPermitOP")(c)
}
func mcnUPPermitList(c *blademaster.Context) {
httpGetFunCheckCookie(
new(model.MCNUPPermitStateReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.McnUPPermitList(cont, arg.(*model.MCNUPPermitStateReq))
},
"McnUPPermitList")(c)
}
func mcnUPPermitOP(c *blademaster.Context) {
httpPostJSONCookie(
new(model.MCNUPPermitOPReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.MCNUPPermitOPReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.McnUPPermitOP(cont, arg.(*model.MCNUPPermitOPReq))
},
"McnUPPermitOP")(c)
}
func mcnList(c *blademaster.Context) {
httpGetWriterByExport(
new(model.MCNListReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.MCNList(cont, arg.(*model.MCNListReq))
},
"mcnList")(c)
}
func mcnPayEdit(c *blademaster.Context) {
httpPostJSONCookie(
new(model.MCNPayEditReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.MCNPayEditReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.MCNPayEdit(cont, arg.(*model.MCNPayEditReq))
},
"mcnPayEdit")(c)
}
// func mcnPayEdit(c *blademaster.Context) {
// httpPostFunCheckCookie(
// new(model.MCNPayEditReq),
// func(cont context.Context, arg interface{}) (res interface{}, err error) {
// var uids,name *http.Cookie
// args := arg.(*model.MCNPayEditReq)
// if name, err = c.Request.Cookie("username"); err == nil {
// args.UserName = name.Value
// }
// if uids, err = c.Request.Cookie("uid"); err == nil {
// if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
// return
// }
// }
// return nil, srv.MCNPayEdit(cont, arg.(*model.MCNPayEditReq))
// },
// "mcnPayEdit")(c)
// }
func mcnPayStateEdit(c *blademaster.Context) {
httpPostJSONCookie(
new(model.MCNPayStateEditReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.MCNPayStateEditReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.MCNPayStateEdit(cont, arg.(*model.MCNPayStateEditReq))
},
"mcnPayStateEdit")(c)
}
func mcnStateEdit(c *blademaster.Context) {
httpPostJSONCookie(
new(model.MCNStateEditReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.MCNStateEditReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.MCNStateEdit(cont, arg.(*model.MCNStateEditReq))
},
"mcnStateEdit")(c)
}
func mcnRenewal(c *blademaster.Context) {
httpPostJSONCookie(
new(model.MCNRenewalReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.MCNRenewalReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.MCNRenewal(cont, arg.(*model.MCNRenewalReq))
},
"mcnRenewal")(c)
}
func mcnInfo(c *blademaster.Context) {
httpGetFunCheckCookie(
new(model.MCNInfoReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.MCNInfo(cont, arg.(*model.MCNInfoReq))
},
"mcnInfo")(c)
}
func mcnUPList(c *blademaster.Context) {
httpGetWriterByExport(
new(model.MCNUPListReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.MCNUPList(cont, arg.(*model.MCNUPListReq))
},
"mcnUPList")(c)
}
func mcnUPStatEdit(c *blademaster.Context) {
httpPostJSONCookie(
new(model.MCNUPStateEditReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.MCNUPStateEditReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.MCNUPStateEdit(cont, arg.(*model.MCNUPStateEditReq))
},
"mcnUPStatEdit")(c)
}
func mcnCheatList(c *blademaster.Context) {
httpGetFunCheckCookie(
new(model.MCNCheatListReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.MCNCheatList(cont, arg.(*model.MCNCheatListReq))
},
"mcnCheatList")(c)
}
func mcnCheatUPList(c *blademaster.Context) {
httpGetFunCheckCookie(
new(model.MCNCheatUPListReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.MCNCheatUPList(cont, arg.(*model.MCNCheatUPListReq))
},
"mcnCheatUPList")(c)
}
func mcnImportUPInfo(c *blademaster.Context) {
httpGetFunCheckCookie(
new(model.MCNImportUPInfoReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.MCNImportUPInfo(cont, arg.(*model.MCNImportUPInfoReq))
},
"mcnImportUPInfo")(c)
}
func mcnImportUPRewardSign(c *blademaster.Context) {
httpPostJSONCookie(
new(model.MCNImportUPRewardSignReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.MCNImportUPRewardSignReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.MCNImportUPRewardSign(cont, arg.(*model.MCNImportUPRewardSignReq))
},
"mcnImportUPRewardSign")(c)
}
func mcnIncreaseList(c *blademaster.Context) {
httpGetFunCheckCookie(
new(model.MCNIncreaseListReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.MCNIncreaseList(cont, arg.(*model.MCNIncreaseListReq))
},
"mcnIncreaseList")(c)
}

View File

@@ -0,0 +1,57 @@
package http
import (
"context"
"net/http"
"strconv"
"go-common/app/admin/main/mcn/model"
"go-common/library/net/http/blademaster"
)
func recommendAdd(c *blademaster.Context) {
httpPostJSONCookie(
new(model.RecommendUpReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.RecommendUpReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.RecommendAdd(cont, arg.(*model.RecommendUpReq))
},
"recommendAdd")(c)
}
func recommendOP(c *blademaster.Context) {
httpPostJSONCookie(
new(model.RecommendStateOpReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
var uids, name *http.Cookie
args := arg.(*model.RecommendStateOpReq)
if name, err = c.Request.Cookie("username"); err == nil {
args.UserName = name.Value
}
if uids, err = c.Request.Cookie("uid"); err == nil {
if args.UID, err = strconv.ParseInt(uids.Value, 10, 64); err != nil {
return
}
}
return nil, srv.RecommendOP(cont, arg.(*model.RecommendStateOpReq))
},
"recommendOP")(c)
}
func recommendList(c *blademaster.Context) {
httpGetWriterByExport(
new(model.MCNUPRecommendReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.RecommendList(cont, arg.(*model.MCNUPRecommendReq))
},
"recommendList")(c)
}

View File

@@ -0,0 +1,35 @@
package http
import (
"context"
"go-common/app/admin/main/mcn/model"
"go-common/library/net/http/blademaster"
)
func arcTopDataStatistics(c *blademaster.Context) {
httpGetWriterByExport(
new(model.McnGetRankReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.ArcTopDataStatistics(cont, arg.(*model.McnGetRankReq))
},
"ArcTopDataStatistics")(c)
}
func mcnsTotalDatas(c *blademaster.Context) {
httpGetFunCheckCookie(
new(model.TotalMcnDataReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.McnsTotalDatas(cont, arg.(*model.TotalMcnDataReq))
},
"McnsTotalDatas")(c)
}
func mcnFansAnalyze(c *blademaster.Context) {
httpGetFunCheckCookie(
new(model.McnCommonReq),
func(cont context.Context, arg interface{}) (res interface{}, err error) {
return srv.McnFansAnalyze(cont, arg.(*model.McnCommonReq))
},
"McnFansAnalyze")(c)
}

View File

@@ -0,0 +1,67 @@
package http
import (
"bytes"
"io/ioutil"
"net/http"
"path"
"time"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
const (
maxFileSize = 20 << 20
)
func upload(c *bm.Context) {
c.Request.ParseMultipartForm(maxFileSize)
imageFile, header, err := c.Request.FormFile("file")
if err != nil {
c.JSON(nil, err)
return
}
if header.Size > maxFileSize {
c.JSON(nil, ecode.MCNContractFileSize)
return
}
fileExt := path.Ext(header.Filename)
if fileExt == "" {
c.JSON(nil, ecode.MCNUnknownFileTypeErr)
return
}
defer imageFile.Close()
bs, err := ioutil.ReadAll(imageFile)
if err != nil {
c.JSON(nil, err)
return
}
filetype := http.DetectContentType(bs)
switch filetype {
case
"image/jpeg",
"image/jpg",
"image/png",
"application/pdf":
case "application/octet-stream", "application/zip":
switch fileExt[1:] {
case "doc":
filetype = "application/doc"
case "docx":
filetype = "application/docx"
case "docm":
filetype = "application/docm"
}
case "application/msword":
filetype = "application/doc"
case "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
filetype = "application/docx"
case "application/vnd.ms-word.document.macroEnabled.12":
filetype = "application/docm"
default:
c.JSON(nil, ecode.MCNUnknownFileTypeErr)
return
}
c.JSON(srv.Upload(c, "", filetype, time.Now().Unix(), bytes.NewReader(bs)))
}

View File

@@ -0,0 +1,81 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"audit_log.go",
"mcn.go",
"msg.go",
"recommend.go",
"service.go",
"statistics.go",
"upload.go",
],
importpath = "go-common/app/admin/main/mcn/service",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/mcn/conf:go_default_library",
"//app/admin/main/mcn/dao/bfs:go_default_library",
"//app/admin/main/mcn/dao/msg:go_default_library",
"//app/admin/main/mcn/dao/up:go_default_library",
"//app/admin/main/mcn/dao/videoup:go_default_library",
"//app/admin/main/mcn/model:go_default_library",
"//app/interface/main/mcn/model/datamodel:go_default_library",
"//app/interface/main/mcn/tool/worker:go_default_library",
"//app/service/main/account/api:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//app/service/main/member/api:go_default_library",
"//app/service/main/member/model/block:go_default_library",
"//library/database/sql:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/metadata:go_default_library",
"//library/queue/databus/report:go_default_library",
"//library/sync/errgroup:go_default_library",
"//library/time:go_default_library",
"//library/xstr: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 = [
"audit_log_test.go",
"mcn_test.go",
"msg_test.go",
"recommend_test.go",
"service_test.go",
"statistics_test.go",
"upload_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/mcn/conf:go_default_library",
"//app/admin/main/mcn/model:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,33 @@
package service
import (
"context"
"time"
"go-common/library/log"
manager "go-common/library/queue/databus/report"
)
// AddAuditLog .
func (s *Service) AddAuditLog(c context.Context, bizID int, tp int8, action string, uid int64, uname string, oids []int64, index []interface{}, content map[string]interface{}) error {
var err error
for _, oid := range oids {
managerInfo := &manager.ManagerInfo{
UID: uid,
Uname: uname,
Business: bizID,
Type: int(tp),
Action: action,
Oid: oid,
Ctime: time.Now(),
Index: index,
Content: content,
}
if err = manager.Manager(managerInfo); err != nil {
log.Error("manager.Manager(%+v) error(%+v)", managerInfo, err)
continue
}
log.Info("s.managerSendLog(%+v)", managerInfo)
}
return err
}

View File

@@ -0,0 +1,30 @@
package service
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestServiceAddAuditLog(t *testing.T) {
convey.Convey("AddAuditLog", t, func(ctx convey.C) {
var (
c = context.Background()
bizID = int(0)
tp = int8(0)
action = ""
uid = int64(0)
uname = ""
oids = []int64{}
index = []interface{}{}
content map[string]interface{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := s.AddAuditLog(c, bizID, tp, action, uid, uname, oids, index, content)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,297 @@
package service
import (
"context"
"fmt"
"testing"
"go-common/app/admin/main/mcn/model"
"github.com/smartystreets/goconvey/convey"
)
func TestServiceMcnSignEntry(t *testing.T) {
convey.Convey("McnSignEntry", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNSignEntryReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := s.McnSignEntry(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestServiceMcnSignList(t *testing.T) {
convey.Convey("McnSignList", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNSignStateReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err := s.McnSignList(c, arg)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestServiceMcnSignOP(t *testing.T) {
convey.Convey("McnSignOP", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNSignStateOpReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := s.McnSignOP(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestServiceMcnUPReviewList(t *testing.T) {
convey.Convey("McnUPReviewList", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPStateReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err := s.McnUPReviewList(c, arg)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestServiceMcnUPOP(t *testing.T) {
convey.Convey("McnUPOP", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPStateOpReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := s.McnUPOP(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestServiceMcnPermitOP(t *testing.T) {
convey.Convey("McnPermitOP", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNSignPermissionReq{}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := s.McnPermitOP(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestServicegetPermitOpenOrClosed(t *testing.T) {
convey.Convey("getPermitOpenOrClosed", t, func(ctx convey.C) {
var (
a = uint32(5)
b = uint32(5)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
open, closed := s.getPermitOpenOrClosed(a, b)
ctx.Convey("Then open,closed should not be nil.", func(ctx convey.C) {
ctx.So(closed, convey.ShouldNotBeNil)
ctx.So(open, convey.ShouldNotBeNil)
})
})
})
}
func TestServicegetUpPermitString(t *testing.T) {
convey.Convey("getPermitOpenOrClosed", t, func(ctx convey.C) {
var (
a = uint32(5)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
ps := s.getUpPermitString(a)
ctx.Convey("Then open,closed should not be nil.", func(ctx convey.C) {
ctx.So(ps, convey.ShouldNotBeNil)
})
})
})
}
func TestServiceMcnUPPermitList(t *testing.T) {
convey.Convey("McnUPPermitList", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPPermitStateReq{}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
res, err := s.McnUPPermitList(c, arg)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestServiceMcnUPPermitOP(t *testing.T) {
convey.Convey("McnUPPermitOP", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPPermitOPReq{}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := s.McnUPPermitOP(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestServiceMCNList(t *testing.T) {
convey.Convey("MCNList", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNListReq{State: -1}
)
arg.MCNMID = 12345
arg.Export = "csv"
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err := s.MCNList(c, arg)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
for k, v := range res.List {
fmt.Printf("re[%d]:%+v", k, v)
}
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestServiceMCNPayEdit(t *testing.T) {
convey.Convey("MCNPayEdit", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNPayEditReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := s.MCNPayEdit(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestServiceMCNPayStateEdit(t *testing.T) {
convey.Convey("MCNPayStateEdit", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNPayStateEditReq{ID: 1, MCNMID: 212895899, SignID: 1}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := s.MCNPayStateEdit(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestServiceMCNStateEdit(t *testing.T) {
convey.Convey("MCNStateEdit", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNStateEditReq{ID: 1, MCNMID: 1212, Action: model.McnAccountRestore}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := s.MCNStateEdit(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestServiceMCNRenewal(t *testing.T) {
convey.Convey("MCNRenewal", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNRenewalReq{ID: 5, MCNMID: 27515432, BeginDate: "2018-09-22", EndDate: "2019-09-23", ContractLink: "ContractLink"}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := s.MCNRenewal(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestServiceMCNInfo(t *testing.T) {
convey.Convey("MCNInfo", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNInfoReq{ID: 9}
)
arg.MCNMID = 27515432
ctx.Convey("When everything gose positive", func(ctx convey.C) {
res, err := s.MCNInfo(c, arg)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
fmt.Println(res)
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestServiceMCNUPList(t *testing.T) {
convey.Convey("McnUPList", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPListReq{SignID: 3, State: -1, SortFansCountActive: "asc"}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err := s.MCNUPList(c, arg)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
for k, v := range res.List {
fmt.Printf("re[%d]:%+v \n", k, v)
}
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestServiceMCNUPStateEdit(t *testing.T) {
convey.Convey("MCNUPStateEdit", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPStateEditReq{ID: 1, SignID: 1}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := s.MCNUPStateEdit(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}

View File

@@ -0,0 +1,30 @@
package service
import (
"context"
"go-common/app/admin/main/mcn/model"
"go-common/library/log"
"go-common/library/net/metadata"
)
// sendMsg send msg
func (s *Service) sendMsg(c context.Context, arg *model.ArgMsg) error {
var err error
mids, title, content, code := arg.MsgInfo(s.msgMap[arg.MSGType])
if len(mids) == 0 || title == "" || content == "" || code == "" {
log.Warn("mid(%+v) title(%s) content(%s) code(%s) sth is empty!", mids, title, content, code)
return nil
}
if err = s.msg.MutliSendSysMsg(c, mids, code, title, content, metadata.String(c, metadata.RemoteIP)); err != nil {
log.Error("s.msg.MutliSendSysMsg(%+v,%s,%s,%s,%s) error(%+v)", mids, code, title, content, metadata.String(c, metadata.RemoteIP), err)
}
return err
}
func (s *Service) setMsgTypeMap() {
s.msgMap = make(map[model.MSGType]*model.MSG, len(s.c.Property.MSG))
for _, msg := range s.c.Property.MSG {
s.msgMap[msg.MSGType] = msg
}
}

View File

@@ -0,0 +1,35 @@
package service
import (
"context"
"testing"
"go-common/app/admin/main/mcn/model"
"github.com/smartystreets/goconvey/convey"
)
func TestServicesendMsg(t *testing.T) {
convey.Convey("sendMsg", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.ArgMsg{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := s.sendMsg(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestServicesetMsgTypeMap(t *testing.T) {
convey.Convey("setMsgTypeMap", t, func(ctx convey.C) {
ctx.Convey("When everything goes positive", func(ctx convey.C) {
s.setMsgTypeMap()
ctx.Convey("No return values", func(ctx convey.C) {
})
})
})
}

View File

@@ -0,0 +1,192 @@
package service
import (
"context"
"fmt"
"go-common/app/admin/main/mcn/model"
accgrpc "go-common/app/service/main/account/api"
memgrpc "go-common/app/service/main/member/api"
blkmdl "go-common/app/service/main/member/model/block"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/xstr"
)
// RecommendAdd .
func (s *Service) RecommendAdd(c context.Context, arg *model.RecommendUpReq) error {
var (
err error
ok bool
bindMids []int64
blockInfo *memgrpc.BlockInfoReply
bi *model.UpBaseInfo
pi *model.UpPlayInfo
mbi map[int64]*model.UpBaseInfo
mpi map[int64]*model.UpPlayInfo
rpp *model.McnUpRecommendPool
)
if blockInfo, err = s.memGRPC.BlockInfo(c, &memgrpc.MemberMidReq{Mid: arg.UpMid}); err != nil {
return err
}
if blockInfo.BlockStatus > int32(blkmdl.BlockStatusFalse) {
return fmt.Errorf("添加到推荐池的mid为(%d)的up主已经被封禁", arg.UpMid)
}
if bindMids, err = s.dao.McnUpBindMids(c, []int64{arg.UpMid}); err != nil {
return err
}
if len(bindMids) > 0 {
return fmt.Errorf("添加到推荐池的mid为(%s)的up主已经被绑定", xstr.JoinInts(bindMids))
}
if rpp, err = s.dao.McnUpRecommendMid(c, arg.UpMid); err != nil {
return err
}
if rpp != nil && rpp.State != model.MCNUPRecommendStateDel {
return ecode.MCNRecommendUpInPool
}
if mbi, err = s.dao.UpBaseInfoMap(c, []int64{arg.UpMid}); err != nil {
return err
}
if mpi, err = s.dao.UpPlayInfoMap(c, []int64{arg.UpMid}); err != nil {
return err
}
rp := &model.McnUpRecommendPool{UpMid: arg.UpMid}
if bi, ok = mbi[arg.UpMid]; ok {
rp.FansCount = bi.FansCount
rp.ActiveTid = bi.ActiveTid
}
if pi, ok = mpi[arg.UpMid]; ok {
rp.ArchiveCount = pi.ArticleCount
rp.PlayCountAccumulate = pi.PlayCountAccumulate
rp.PlayCountAverage = pi.PlayCountAverage
}
if _, err = s.dao.AddMcnUpRecommend(c, rp); err != nil {
return err
}
s.worker.Add(func() {
index := []interface{}{int8(model.MCNUPRecommendStateOff), arg.UpMid}
content := map[string]interface{}{
"up_mid": arg.UpMid,
"fans_count": rp.FansCount,
"archive_count": rp.ArchiveCount,
"play_count_accumulate": rp.PlayCountAccumulate,
"play_count_average": rp.PlayCountAverage,
"active_tid": rp.ActiveTid,
"source": model.MCNUPRecommendStateManual,
}
s.AddAuditLog(context.Background(), model.MCNRecommendLogBizID, int8(model.MCNUPRecommendActionAdd), model.MCNUPRecommendActionAdd.String(), arg.UID, arg.UserName, []int64{arg.UpMid}, index, content)
})
return nil
}
// RecommendOP .
func (s *Service) RecommendOP(c context.Context, arg *model.RecommendStateOpReq) error {
var (
err error
blockInfosReply *memgrpc.BlockBatchInfoReply
blockMids, bindMids, banMids, recMids []int64
mrp map[int64]*model.McnUpRecommendPool
)
if len(arg.UpMids) == 0 {
return ecode.MCNRecommendUpMidsIsEmpty
}
if arg.Action == model.MCNUPRecommendActionOn || arg.Action == model.MCNUPRecommendActionRestore {
if blockInfosReply, err = s.memGRPC.BlockBatchInfo(c, &memgrpc.MemberMidsReq{Mids: arg.UpMids}); err != nil {
return err
}
for _, v := range blockInfosReply.BlockInfos {
if v.BlockStatus > int32(blkmdl.BlockStatusFalse) {
blockMids = append(blockMids, v.MID)
}
}
if len(blockMids) > 0 {
return fmt.Errorf("推荐的mid为(%s)的up主已经被封禁", xstr.JoinInts(blockMids))
}
if bindMids, err = s.dao.McnUpBindMids(c, arg.UpMids); err != nil {
return err
}
if len(bindMids) > 0 {
return fmt.Errorf("推荐的mid为(%s)的up主已经被绑定", xstr.JoinInts(bindMids))
}
}
state := arg.Action.GetState()
if state == model.MCNUPRecommendStateUnKnown {
return ecode.MCNRecommendUpStateFlowErr
}
if mrp, err = s.dao.McnUpRecommendMids(c, arg.UpMids); err != nil {
return err
}
for _, upMids := range arg.UpMids {
if rp, ok := mrp[upMids]; ok {
if rp.State == model.MCNUPRecommendStateBan && arg.Action == model.MCNUPRecommendActionOn {
banMids = append(banMids, upMids)
}
if rp.State == model.MCNUPRecommendStateOn && arg.Action == model.MCNUPRecommendActionRestore {
recMids = append(recMids, upMids)
}
}
}
if len(banMids) > 0 {
return fmt.Errorf("推荐的mid为(%s)的up主已被禁止推荐,不能推荐", xstr.JoinInts(banMids))
}
if len(recMids) > 0 {
return fmt.Errorf("推荐的mid为(%s)的up主已被推荐,不需要恢复", xstr.JoinInts(recMids))
}
if _, err = s.dao.UpMcnUpsRecommendOP(c, arg.UpMids, state); err != nil {
return err
}
for _, mid := range arg.UpMids {
s.worker.Add(func() {
index := []interface{}{int8(state), mid}
content := map[string]interface{}{
"up_mid": mid,
}
s.AddAuditLog(context.Background(), model.MCNRecommendLogBizID, int8(state), arg.Action.String(), arg.UID, arg.UserName, []int64{mid}, index, content)
})
}
return nil
}
// RecommendList .
func (s *Service) RecommendList(c context.Context, arg *model.MCNUPRecommendReq) (res *model.McnUpRecommendListReply, err error) {
var (
mids, tids []int64
tpNames map[int64]string
accsReply *accgrpc.InfosReply
)
res = new(model.McnUpRecommendListReply)
res.Page = arg.Page
if res.TotalCount, err = s.dao.McnUpRecommendTotal(c, arg); err != nil {
return
}
if res.TotalCount <= 0 {
return
}
if res.List, err = s.dao.McnUpRecommends(c, arg); err != nil {
return
}
if len(res.List) <= 0 {
return
}
for _, v := range res.List {
mids = append(mids, v.UpMid)
tids = append(tids, int64(v.ActiveTid))
}
if accsReply, err = s.accGRPC.Infos3(c, &accgrpc.MidsReq{Mids: mids}); err != nil {
log.Error("s.accGRPC.Infos3(%+v) err(%v)", mids, err)
err = nil
}
tpNames = s.videoup.GetTidName(tids)
infos := accsReply.Infos
for _, v := range res.List {
if info, ok := infos[v.UpMid]; ok {
v.UpName = info.Name
}
if tyName, ok := tpNames[int64(v.ActiveTid)]; ok {
v.TpName = tyName
} else {
v.TpName = model.DefaultTyName
}
}
return
}

View File

@@ -0,0 +1,56 @@
package service
import (
"context"
"testing"
"go-common/app/admin/main/mcn/model"
"github.com/smartystreets/goconvey/convey"
)
func TestServiceRecommendAdd(t *testing.T) {
convey.Convey("RecommendAdd", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.RecommendUpReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := s.RecommendAdd(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestServiceRecommendOP(t *testing.T) {
convey.Convey("RecommendOP", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.RecommendStateOpReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := s.RecommendOP(c, arg)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestServiceRecommendList(t *testing.T) {
convey.Convey("RecommendList", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.MCNUPRecommendReq{}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err := s.RecommendList(c, arg)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}

View File

@@ -0,0 +1,68 @@
package service
import (
"context"
"go-common/app/admin/main/mcn/conf"
bfs "go-common/app/admin/main/mcn/dao/bfs"
msg "go-common/app/admin/main/mcn/dao/msg"
dao "go-common/app/admin/main/mcn/dao/up"
videoup "go-common/app/admin/main/mcn/dao/videoup"
"go-common/app/admin/main/mcn/model"
"go-common/app/interface/main/mcn/tool/worker"
accgrpc "go-common/app/service/main/account/api"
arcgrpc "go-common/app/service/main/archive/api"
memgrpc "go-common/app/service/main/member/api"
"github.com/pkg/errors"
)
// Service struct
type Service struct {
c *conf.Config
dao *dao.Dao
bfs *bfs.Dao
msg *msg.Dao
videoup *videoup.Dao
msgMap map[model.MSGType]*model.MSG
memGRPC memgrpc.MemberClient
accGRPC accgrpc.AccountClient
arcGRPC arcgrpc.ArchiveClient
worker *worker.Pool
}
// New init
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
dao: dao.New(c),
bfs: bfs.New(c),
msg: msg.New(c),
videoup: videoup.New(c),
worker: worker.New(nil),
}
var err error
if s.accGRPC, err = accgrpc.NewClient(c.GRPCClient.Account); err != nil {
panic(errors.WithMessage(err, "Failed to dial account service"))
}
if s.arcGRPC, err = arcgrpc.NewClient(c.GRPCClient.Archive); err != nil {
panic(errors.WithMessage(err, "Failed to dial archive service"))
}
if s.memGRPC, err = memgrpc.NewClient(c.GRPCClient.Member); err != nil {
panic(errors.WithMessage(err, "Failed to dial member service"))
}
s.setMsgTypeMap()
return s
}
// Ping Service
func (s *Service) Ping(c context.Context) (err error) {
return s.dao.Ping(c)
}
// Close Service
func (s *Service) Close() {
s.dao.Close()
s.worker.Close()
s.worker.Wait()
}

View File

@@ -0,0 +1,33 @@
package service
import (
"flag"
"os"
"go-common/app/admin/main/mcn/conf"
)
var (
s *Service
)
func init() {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.account.mcn-admin")
flag.Set("conf_token", "BVWgBtBvS2pkTBbmxAl0frX6KRA14d5P")
flag.Set("tree_id", "6813")
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/mcn-admin-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
s = New(conf.Conf)
}

View File

@@ -0,0 +1,215 @@
package service
import (
"context"
"fmt"
"time"
"go-common/app/admin/main/mcn/model"
dtmdl "go-common/app/interface/main/mcn/model/datamodel"
accgrpc "go-common/app/service/main/account/api"
arcgrpc "go-common/app/service/main/archive/api"
"go-common/library/log"
"go-common/library/sync/errgroup"
xtime "go-common/library/time"
"github.com/pkg/errors"
)
// ArcTopDataStatistics .
func (s *Service) ArcTopDataStatistics(c context.Context, arg *model.McnGetRankReq) (res *model.McnGetRankUpFansReply, err error) {
return s.dao.ArcTopDataStatistics(c, arg)
}
// McnsTotalDatas .
func (s *Service) McnsTotalDatas(c context.Context, arg *model.TotalMcnDataReq) (res *model.TotalMcnDataInfo, err error) {
var (
signUpsTotal, FanTotal, videoupTotal, playTotal int64
mids, fansMids, ArcsMids, avids, tids, arcsTids, typeTids []int64
m *model.McnDataOverview
mrf map[int8][]*model.McnRankFansOverview
ras []*model.McnRankArchiveLikesOverview
mmd map[string][]*model.McnDataTypeSummary
)
td := new(thirdDataMap)
res = new(model.TotalMcnDataInfo)
res.TopInfo = new(model.McnDataTopInfo)
res.TypesInfo = new(model.McnDataTypesInfo)
date := xtime.Time(time.Date(arg.Date.Time().Year(), arg.Date.Time().Month(), arg.Date.Time().Day()-1, 0, 0, 0, 0, time.Local).Unix())
if m, err = s.dao.McnDataOverview(c, date); err != nil {
return
}
res.BaseInfo = m
if mrf, fansMids, err = s.dao.McnRankFansOverview(c, model.DataTypeDay, date, model.TopDataLenth); err != nil {
return
}
if ras, ArcsMids, avids, arcsTids, err = s.dao.McnRankArchiveLikesOverview(c, model.DataTypeDay, date, model.TopDataLenth); err != nil {
return
}
if mmd, typeTids, err = s.dao.McnDataTypeSummary(c, date); err != nil {
return
}
mids = append(mids, fansMids...)
mids = append(mids, ArcsMids...)
tids = append(tids, arcsTids...)
tids = append(tids, typeTids...)
if td.infosReply, err = s.accGRPC.Infos3(c, &accgrpc.MidsReq{Mids: mids}); err != nil {
log.Error("s.accGRPC.Infos3(%+v) error(%+v)", mids, err)
err = nil
}
if td.archivesReply, err = s.arcGRPC.Arcs(c, &arcgrpc.ArcsRequest{Aids: avids}); err != nil {
log.Error("s.arcGRPC.Arcs(%+v) error(%+v)", avids, err)
err = nil
}
td.tpNames = s.videoup.GetTidName(tids)
for view, data := range mrf {
for _, v := range data {
var (
rateIncr int64
name, _, _, _ = td.getTypeName(v.Mid, 0, 0, 0)
)
if v.Fans != 0 {
rateIncr = (10000 * v.FansIncr) / v.Fans
}
fr := &model.FansRankIncr{Mid: v.Mid, Name: name, Rank: v.Rank, FansIncr: v.FansIncr, Fans: v.Fans, RateIncr: rateIncr, SignID: v.SignID}
switch model.DataViewFansTop(view) {
case model.McnFansIncr:
res.TopInfo.McnFansIncr = append(res.TopInfo.McnFansIncr, fr)
case model.McnFansIncrRate:
res.TopInfo.McnFansRateIncr = append(res.TopInfo.McnFansRateIncr, fr)
case model.UpFansIncr:
res.TopInfo.UpFansIncr = append(res.TopInfo.UpFansIncr, fr)
case model.UpFansIncrRate:
res.TopInfo.UpFansRateIncr = append(res.TopInfo.UpFansRateIncr, fr)
}
}
}
for _, v := range ras {
var mcnName, upName, avTitle, tpName = td.getTypeName(v.McnMid, v.UpMid, v.Avid, int64(v.Tid))
lr := &model.LikesRankIncr{McnMid: v.McnMid, McnName: mcnName,
UpMid: v.UpMid, UpName: upName, AVID: v.Avid, AVTitle: avTitle,
TID: v.Tid, TypeName: tpName, LikesIncr: v.Likes, PlayIncr: v.Plays, SignID: v.SignID}
res.TopInfo.ArcLikesIncr = append(res.TopInfo.ArcLikesIncr, lr)
}
for vt, data := range mmd {
for _, v := range data {
var _, _, _, tpName = td.getTypeName(0, 0, 0, int64(v.Tid))
dt := &model.DataTypes{TID: v.Tid, TypeName: tpName, Amount: v.Amount}
switch vt {
case fmt.Sprintf("%d-%d", model.SignUpsAccumulate, model.DataTypeAccumulate):
signUpsTotal += v.Amount
res.TypesInfo.SignUps = append(res.TypesInfo.SignUps, dt)
case fmt.Sprintf("%d-%d", model.FansIncr, model.DataTypeDay):
FanTotal += v.Amount
res.TypesInfo.FansIncr = append(res.TypesInfo.FansIncr, dt)
case fmt.Sprintf("%d-%d", model.VideoUpsIncr, model.DataTypeDay):
videoupTotal += v.Amount
res.TypesInfo.VideoupIncr = append(res.TypesInfo.VideoupIncr, dt)
case fmt.Sprintf("%d-%d", model.PlaysIncr, model.DataTypeDay):
playTotal += v.Amount
res.TypesInfo.PlayIncr = append(res.TypesInfo.PlayIncr, dt)
}
}
}
statTypeRate(res.TypesInfo.SignUps, signUpsTotal)
statTypeRate(res.TypesInfo.FansIncr, FanTotal)
statTypeRate(res.TypesInfo.VideoupIncr, videoupTotal)
statTypeRate(res.TypesInfo.PlayIncr, playTotal)
return
}
type thirdDataMap struct {
tpNames map[int64]string
infosReply *accgrpc.InfosReply
archivesReply *arcgrpc.ArcsReply
}
func (td *thirdDataMap) getTypeName(mcnMid, upMid, avid, tid int64) (mcnName, upName, avTitle, tpName string) {
if td.infosReply != nil {
infos := td.infosReply.Infos
if info, ok := infos[mcnMid]; ok {
mcnName = info.Name
}
if info, ok := infos[upMid]; ok {
upName = info.Name
}
}
if td.archivesReply != nil {
archives := td.archivesReply.Arcs
if archive, ok := archives[avid]; ok {
avTitle = archive.Title
}
}
tpName = td.tpNames[tid]
return
}
func statTypeRate(dts []*model.DataTypes, total int64) {
for _, v := range dts {
if total != 0 {
v.Rate = (10000 * v.Amount) / total
}
v.Total = total
}
}
// McnFansAnalyze .
func (s *Service) McnFansAnalyze(c context.Context, arg *model.McnCommonReq) (res *model.McnGetMcnFansReply, err error) {
var (
f *dtmdl.DmConMcnFansD
sex *dtmdl.DmConMcnFansSexW
age *dtmdl.DmConMcnFansAgeW
playWay *dtmdl.DmConMcnFansPlayWayW
areas []*dtmdl.DmConMcnFansAreaW
types []*dtmdl.DmConMcnFansTypeW
tags []*dtmdl.DmConMcnFansTagW
g errgroup.Group
)
res = new(model.McnGetMcnFansReply)
g.Go(func() (err error) {
if f, err = s.dao.DataFans(c, arg); err != nil {
log.Error("s.dao.DataFans(%+v) error(%v)", arg, err)
return
}
res.FansOverview = f
return
})
g.Go(func() (err error) {
if sex, age, playWay, err = s.dao.DataFansBaseAttr(c, arg); err != nil {
log.Error("s.dao.DataFansBaseAttr(%+v) error(%v)", arg, err)
return
}
res.FansSex = sex
res.FansAge = age
res.FansPlayWay = playWay
return
})
g.Go(func() (err error) {
if areas, err = s.dao.DataFansArea(c, arg); err != nil {
log.Error("s.dao.DataFansArea(%+v) error(%v)", arg, err)
return
}
res.FansArea = areas
return
})
g.Go(func() (err error) {
if types, err = s.dao.DataFansType(c, arg); err != nil {
log.Error("s.dao.DataFansType(%+v) error(%v)", arg, err)
return
}
res.FansType = types
return
})
g.Go(func() (err error) {
if tags, err = s.dao.DataFansTag(c, arg); err != nil {
log.Error("s.dao.DataFansTag(%+v) error(%v)", arg, err)
return
}
res.FansTag = tags
return
})
if err = g.Wait(); err != nil {
err = errors.WithStack(err)
}
return
}

View File

@@ -0,0 +1,57 @@
package service
import (
"context"
"testing"
"go-common/app/admin/main/mcn/model"
"github.com/smartystreets/goconvey/convey"
)
func TestServiceArcTopDataStatistics(t *testing.T) {
convey.Convey("ArcTopDataStatistics", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.McnGetRankReq{}
)
arg.SignID = 214
ctx.Convey("When everything gose positive", func(ctx convey.C) {
res, err := s.ArcTopDataStatistics(c, arg)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestServiceMcnsTotalDatas(t *testing.T) {
convey.Convey("McnsTotalDatas", t, func(ctx convey.C) {
var (
c = context.Background()
arg = &model.TotalMcnDataReq{Date: 1542211200}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
res, err := s.McnsTotalDatas(c, arg)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestServicestatTypeRate(t *testing.T) {
convey.Convey("statTypeRate", t, func(ctx convey.C) {
var (
dts = []*model.DataTypes{}
total = int64(111)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
statTypeRate(dts, total)
ctx.Convey("No return values", func(ctx convey.C) {
})
})
})
}

View File

@@ -0,0 +1,11 @@
package service
import (
"context"
"io"
)
// Upload http upload file.
func (s *Service) Upload(c context.Context, fileName, fileType string, expire int64, body io.Reader) (location string, err error) {
return s.bfs.Upload(c, fileName, fileType, expire, body)
}

View File

@@ -0,0 +1,28 @@
package service
import (
"context"
"io"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestServiceUpload(t *testing.T) {
convey.Convey("Upload", t, func(ctx convey.C) {
var (
c = context.Background()
fileName = ""
fileType = ""
expire = int64(0)
body io.Reader
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
location, err := s.Upload(c, fileName, fileType, expire, body)
ctx.Convey("Then err should be nil.location should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(location, convey.ShouldNotBeNil)
})
})
})
}