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

View File

@@ -0,0 +1,43 @@
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/main/app-show/cmd:all-srcs",
"//app/interface/main/app-show/conf:all-srcs",
"//app/interface/main/app-show/dao/account:all-srcs",
"//app/interface/main/app-show/dao/activity:all-srcs",
"//app/interface/main/app-show/dao/ad:all-srcs",
"//app/interface/main/app-show/dao/archive:all-srcs",
"//app/interface/main/app-show/dao/audit:all-srcs",
"//app/interface/main/app-show/dao/bangumi:all-srcs",
"//app/interface/main/app-show/dao/card:all-srcs",
"//app/interface/main/app-show/dao/databus:all-srcs",
"//app/interface/main/app-show/dao/dynamic:all-srcs",
"//app/interface/main/app-show/dao/live:all-srcs",
"//app/interface/main/app-show/dao/location:all-srcs",
"//app/interface/main/app-show/dao/recommend:all-srcs",
"//app/interface/main/app-show/dao/region:all-srcs",
"//app/interface/main/app-show/dao/relation:all-srcs",
"//app/interface/main/app-show/dao/resource:all-srcs",
"//app/interface/main/app-show/dao/search:all-srcs",
"//app/interface/main/app-show/dao/show:all-srcs",
"//app/interface/main/app-show/dao/tag:all-srcs",
"//app/interface/main/app-show/http:all-srcs",
"//app/interface/main/app-show/model:all-srcs",
"//app/interface/main/app-show/service/banner:all-srcs",
"//app/interface/main/app-show/service/daily:all-srcs",
"//app/interface/main/app-show/service/ping:all-srcs",
"//app/interface/main/app-show/service/rank:all-srcs",
"//app/interface/main/app-show/service/region:all-srcs",
"//app/interface/main/app-show/service/show:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
# Owner
peiyifei
liweijia
# Author
sunyu
haoguanwei
# Reviewer
peiyifei
haoguanwei

View File

@@ -0,0 +1,17 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- haoguanwei
- liweijia
- peiyifei
- sunyu
labels:
- interface
- interface/main/app-show
- main
options:
no_parent_owners: true
reviewers:
- haoguanwei
- peiyifei
- sunyu

View File

@@ -0,0 +1,13 @@
#### app-show
##### 项目简介
> 1.移动端运营类接口
##### 编译环境
> 请只用golang v1.8.x以上版本编译执行。
##### 依赖包
> 1.公共包go-common
##### 特别说明
> 1.model目录可能会被其他项目引用请谨慎请改并通知各方。

View File

@@ -0,0 +1,46 @@
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 = [
"app-show-example.toml",
"app-show-test.toml",
],
importpath = "go-common/app/interface/main/app-show/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/interface/main/app-show/http:go_default_library",
"//library/ecode/tip:go_default_library",
"//library/log:go_default_library",
"//library/net/trace:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,244 @@
# This is a TOML document. Boom.
version = "1.6.0"
user = "nobody"
pid = "/tmp/app-show.pid"
dir = "./"
perf = "127.0.0.1:6100"
checkFile = "/data/www/app-show.html"
family = "app-show"
address = ""
trace = false
debug = false
env = "dev"
showLog = "/data/infoc/app-show/info.log"
tick = "30s"
[duration]
splash = "2h"
search = "-504h"
[infoc]
path = "/data/infoc/app-show/info.log"
project = "app-show"
name = "app-show"
[json]
staticDir = "/app-show-static/"
[host]
live = "http://live.bilibili.com"
bangumi = "http://bangumi.bilibili.com"
hetongzi = "http://data-test.bilibili.co"
data = "http://data-test.bilibili.co"
mipush = "https://api.xmpush.xiaomi.com"
apiCo = "http://api.bilibili.co"
apiCoX = "http://api.bilibili.co"
www = "http://www.bilibili.com"
ad = "http://ad.bilibili.co"
[tracer]
proto = "udp"
addr = "172.16.33.46:5140"
tag = "platform/app-show"
[xlog]
dir = "/data/log/app-show/"
[xlog.elk]
project = "app-show"
addr = "172.18.20.17:8520"
chanSize = 10240
[app]
key = "e7482d29be4a95b8"
secret = "9e803791cdef756e75faee68e12b7442"
[httpClient]
dial = "500ms"
timeout = "2s"
keepAlive = "60s"
timer = 10
[httpClientAsyn]
dial = "1s"
timeout = "2s"
keepAlive = "60s"
timer = 10
[httpData]
dial = "500ms"
timeout = "2s"
keepAlive = "60s"
timer = 10
[identify]
whiteAccessKey = ""
whiteMid = 0
[identify.app]
key = "6a29f8ed87407c11"
secret = "d3c5a85f5b895a03735b5d20a273bc57"
[identify.memcache]
name = "go-business/identify"
proto = "tcp"
addr = "172.16.33.54:11211"
active = 5
idle = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "80s"
[identify.host]
auth = "http://passport.bilibili.com"
secret = "http://open.bilibili.com"
[identify.authHTTPClient]
dial = "1s"
timeout = "1s"
keepAlive = "60s"
timer = 1000
[identify.secretHTTPClient]
dial = "1s"
timeout = "1s"
keepAlive = "60s"
timer = 1000
[multiHttp]
[multiHttp.outer]
addrs = ["0.0.0.0:6101"]
maxListen = 100
[multiHttp.inner]
addrs = ["0.0.0.0:6102"]
maxListen = 100
[multiHttp.local]
addrs = ["0.0.0.0:6103"]
maxListen = 100
[archiveRPC]
pullInterval = "10s"
[archiveRPC.client]
proto = "tcp"
addr = "172.16.0.26:6089"
timeout = "1s"
timer = 1000
[[archiveRPC.backup]]
proto = "tcp"
addr = "172.16.0.26:6089"
timeout = "1s"
timer = 1000
[archiveRPC.zookeeper]
root = "/microservice/archive-service/"
addrs = ["172.16.0.148:2181"]
timeout = "1s"
[accountRPC]
pullInterval = "10s"
[accountRPC.client]
proto = "tcp"
addr = "172.16.33.56:6079"
timeout = "1s"
timer = 1000
[[accountRPC.backup]]
proto = "tcp"
addr = "172.16.33.56:6079"
timeout = "1s"
timer = 1000
[accountRPC.zookeeper]
root = "/microservice/account-service/"
addrs = ["172.16.33.54:2181"]
timeout = "30s"
[mysql]
[mysql.show]
addr = "172.16.0.148:3306"
dsn = "test:test@tcp(172.16.0.148:3306)/bilibili_show?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 5
idle = 2
[mysql.resource]
addr = "172.16.0.148:3306"
dsn = "test:test@tcp(172.16.0.148:3306)/bilibili_resource?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 5
idle = 2
[mysql.cpt]
addr = "172.16.0.116:3306"
dsn = "test:test@tcp(172.16.0.116:3306)/bilibili_cpt?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 5
idle = 2
[redis]
[redis.recommend]
name = "app-show/recommend"
proto = "tcp"
addr = "172.16.0.148:6379"
active = 20
idle = 10
dialTimeout = "50ms"
readTimeout = "100ms"
writeTimeout = "100ms"
idleTimeout = "80s"
expire = "2h"
[redis.stat]
name = "app-interface/stat"
proto = "tcp"
addr = "172.16.0.148:6379"
active = 20
idle = 10
dialTimeout = "50ms"
readTimeout = "100ms"
writeTimeout = "100ms"
idleTimeout = "80s"
expire = "10s"
[memcache]
[memcache.archive]
name = "app-show/archive"
proto = "tcp"
addr = "172.16.0.148:11211"
active = 50
idle = 10
dialTimeout = "50ms"
readTimeout = "100ms"
writeTimeout = "100ms"
idleTimeout = "80s"
expire = "2h"
[DislikeDatabus]
key = ""
secret= ""
group= "bigdata-sky-horse-group"
topic= "Dislike-T"
action="pub"
[databus.redis]
name = "app-feed/dislike"
proto = "tcp"
addr = ""
active = 100
idle = 50
dialTimeout = "50ms"
readTimeout = "200ms"
writeTimeout = "200ms"
idleTimeout = "80s"
[recommend]
[recommend.host]
1 = ["172.16.33.62"]
[recommend.group]
0 = 1
1 = 1
2 = 1
3 = 1
4 = 1
5 = 1
6 = 1
7 = 1
8 = 1
9 = 1
10 = 1
11 = 1
12 = 1
13 = 1
14 = 1
15 = 1
16 = 1
17 = 1
18 = 1
19 = 1

View File

@@ -0,0 +1,361 @@
# This is a TOML document. Boom.
version = "1.1.0"
user = "nobody"
pid = "/tmp/app-show.pid"
dir = "./"
perf = "127.0.0.1:6100"
checkFile = "/data/www/app-show.html"
family = "app-show"
address = ""
trace = true
debug = false
env = "test"
tick = "10m"
[duration]
splash = "2h"
search = "-504h"
[infoc]
path = ""
project = "app-show"
name = "app-show"
[infoc2]
taskID = "000026"
proto = "tcp"
addr = ""
chanSize = 10240
[feedinfoc2]
taskID = "0000236"
proto = "tcp"
addr = ""
chanSize = 10240
[json]
staticDir = "/app-show-static/"
[host]
live = "http://live.bilibili.com"
bangumi = "http://bangumi.bilibili.com"
hetongzi = "http://data-test.bilibili.co"
data = "http://data-test.bilibili.co"
mipush = "https://api.xmpush.xiaomi.com"
apiCo = "http://api.bilibili.co"
apiCoX = "http://api.bilibili.co"
www = "http://www.bilibili.com"
ad = "http://ad.bilibili.co"
search = "http://s.search.bilibili.co"
activity = "http://matsuri.bilibili.co"
apiLiveCo = "http://api.live.bilibili.co"
# ad = "http://172.16.33.180:8082"
[tracer]
family = "app-show"
proto = "unixgram"
addr = "/var/run/dapper-collect/dapper-collect.sock"
[xlog]
dir = "/data/log/app-show/"
[xlog.elk]
project = "app-show"
addr = "172.18.20.17:8520"
chanSize = 10240
[app]
key = "e7482d29be4a95b8"
secret = "9e803791cdef756e75faee68e12b7442"
[httpClient]
key = "e7482d29be4a95b8"
secret = "9e803791cdef756e75faee68e12b7442"
dial = "500ms"
timeout = "2s"
keepAlive = "60s"
timer = 10
[httpClient.breaker]
window = "10s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[httpClientAsyn]
key = "e7482d29be4a95b8"
secret = "9e803791cdef756e75faee68e12b7442"
dial = "1s"
timeout = "2s"
keepAlive = "60s"
timer = 10
[httpClientAsyn.breaker]
window = "10s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[httpData]
key = "e7482d29be4a95b8"
secret = "9e803791cdef756e75faee68e12b7442"
dial = "500ms"
timeout = "2s"
keepAlive = "60s"
timer = 10
[httpData.breaker]
window = "10s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[identify]
whiteAccessKey = ""
whiteMid = 0
[identify.app]
key = "e7482d29be4a95b8"
secret = "9e803791cdef756e75faee68e12b7442"
[identify.memcache]
name = "go-business/identify"
proto = "tcp"
addr = "172.16.33.54:11211"
active = 5
idle = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "80s"
[identify.host]
auth = "http://passport.bilibili.com"
secret = "http://open.bilibili.com"
[identify.httpClient]
key = "e7482d29be4a95b8"
secret = "9e803791cdef756e75faee68e12b7442"
dial = "30ms"
timeout = "100ms"
keepAlive = "60s"
[identify.httpClient.breaker]
window = "10s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[identify.httpClient.url]
"http://passport.bilibili.co/intranet/auth/tokenInfo" = {timeout = "100ms"}
"http://passport.bilibili.co/intranet/auth/cookieInfo" = {timeout = "100ms"}
"http://open.bilibili.co/api/getsecret" = {timeout = "500ms"}
[multiHttp]
[multiHttp.outer]
addrs = ["0.0.0.0:6101"]
maxListen = 100
[multiHttp.inner]
addrs = ["0.0.0.0:6102"]
maxListen = 100
[multiHttp.local]
addrs = ["0.0.0.0:6103"]
maxListen = 100
[archiveRPC]
group = "test"
pullInterval = "10s"
[archiveRPC.client]
proto = "tcp"
timeout = "1s"
timer = 1000
token = "123456"
[archiveRPC.client.breaker]
window ="3s"
sleep ="100ms"
bucket = 10
ratio = 0.5
request = 100
[archiveRPC.zookeeper]
root = "/microservice/archive-service/"
addrs = ["172.16.33.54:2181"]
timeout = "30s"
[dynamicRPC]
pullInterval = "10s"
[dynamicRPC.client]
proto = "tcp"
addr = "172.16.33.56:6239"
timeout = "1s"
timer = 1000
[dynamicRPC.client.breaker]
window ="3s"
sleep ="100ms"
bucket = 10
ratio = 0.5
request = 100
[dynamicRPC.zookeeper]
root = "/microservice/dynamic-service/"
addrs = ["172.16.33.54:2181"]
timeout = "30s"
[accountRPC]
pullInterval = "10s"
[accountRPC.client]
proto = "tcp"
addr = "172.16.33.56:6079"
timeout = "1s"
timer = 1000
[accountRPC.client.breaker]
window ="3s"
sleep ="100ms"
bucket = 10
ratio = 0.5
request = 100
[accountRPC.zookeeper]
root = "/microservice/account-service/"
addrs = ["172.16.33.54:2181"]
timeout = "30s"
[relationRPC]
pullInterval = "10s"
[relationRPC.client]
proto = "tcp"
addr = "172.16.33.56:6079"
timeout = "1s"
timer = 1000
[relationRPC.client.breaker]
window ="3s"
sleep ="100ms"
bucket = 10
ratio = 0.5
request = 100
[relationRPC.zookeeper]
root = "/microservice/relation-service/"
addrs = ["172.16.33.54:2181"]
timeout = "30s"
[resourceRPC]
pullInterval = "10s"
[resourceRPC.client]
proto = "tcp"
addr = "172.16.33.56:6079"
timeout = "1s"
timer = 1000
[resourceRPC.client.breaker]
window ="3s"
sleep ="100ms"
bucket = 10
ratio = 0.5
request = 100
[resourceRPC.zookeeper]
root = "/microservice/article-service/"
addrs = ["172.16.33.54:2181"]
timeout = "30s"
[mysql]
[mysql.show]
addr = "172.16.33.205:3308"
dsn = "test:test@tcp(172.16.33.205:3308)/bilibili_show?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 5
idle = 2
idleTimeout ="4h"
queryTimeout = "1s"
execTimeout = "1s"
tranTimeout = "1s"
[mysql.show.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[mysql.resource]
addr = "172.16.33.205:3308"
dsn = "test:test@tcp(172.16.33.205:3308)/bilibili_resource?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 5
idle = 2
idleTimeout ="4h"
queryTimeout = "1s"
execTimeout = "1s"
tranTimeout = "1s"
[mysql.resource.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[redis]
[redis.recommend]
name = "app-show/recommend"
proto = "tcp"
addr = "172.16.33.54:6380"
active = 20
idle = 10
dialTimeout = "50ms"
readTimeout = "100ms"
writeTimeout = "100ms"
idleTimeout = "80s"
expire = "2h"
[redis.stat]
name = "app-interface/stat"
proto = "tcp"
addr = "172.16.33.54:6380"
active = 20
idle = 10
dialTimeout = "50ms"
readTimeout = "50ms"
writeTimeout = "50ms"
idleTimeout = "80s"
expire = "10s"
[memcache]
[memcache.archive]
name = "app-show/archive"
proto = "tcp"
addr = "172.16.33.54:11213"
active = 50
idle = 10
dialTimeout = "50ms"
readTimeout = "100ms"
writeTimeout = "100ms"
idleTimeout = "80s"
expire = "2h"
[dislikeDatabus]
key = "0PtMsVFzWyyvoTgAyLCG"
secret= "0PtMsVFzWyyvoTgAyLCH"
group= "TagDislike-SkyHorse-P"
topic= "Dislike-T"
action="pub"
[dislikeDatabus.redis]
name = "app-feed/dislike"
proto = "tcp"
addr = "172.16.33.56:6205"
active = 100
idle = 50
dialTimeout = "50ms"
readTimeout = "200ms"
writeTimeout = "200ms"
idleTimeout = "80s"
[recommend]
[recommend.host]
1 = ["172.16.33.62"]
[recommend.group]
0 = 1
1 = 1
2 = 1
3 = 1
4 = 1
5 = 1
6 = 1
7 = 1
8 = 1
9 = 1
10 = 1
11 = 1
12 = 1
13 = 1
14 = 1
15 = 1
16 = 1
17 = 1
18 = 1
19 = 1

View File

@@ -0,0 +1,50 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"go-common/app/interface/main/app-show/conf"
"go-common/app/interface/main/app-show/http"
ecode "go-common/library/ecode/tip"
"go-common/library/log"
"go-common/library/net/trace"
)
func main() {
flag.Parse()
if err := conf.Init(); err != nil {
log.Error("conf.Init() error(%v)", err)
panic(err)
}
// init ecode
ecode.Init(nil)
// init log
log.Init(conf.Conf.XLog)
defer log.Close()
log.Info("app-show start")
// init trace
trace.Init(conf.Conf.Tracer)
defer trace.Close()
// service init
http.Init(conf.Conf)
// init pprof conf.Conf.Perf
// init signal
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
log.Info("app-show get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
log.Info("app-show exit")
return
case syscall.SIGHUP:
// TODO reload
default:
return
}
}
}

View File

@@ -0,0 +1,43 @@
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/interface/main/app-show/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/cache/memcache:go_default_library",
"//library/cache/redis:go_default_library",
"//library/conf:go_default_library",
"//library/database/sql:go_default_library",
"//library/log:go_default_library",
"//library/log/infoc:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/rpc:go_default_library",
"//library/net/rpc/warden:go_default_library",
"//library/net/trace:go_default_library",
"//library/queue/databus:go_default_library",
"//library/time: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,185 @@
package conf
import (
"errors"
"flag"
"go-common/library/cache/memcache"
"go-common/library/cache/redis"
"go-common/library/conf"
"go-common/library/database/sql"
xlog "go-common/library/log"
"go-common/library/log/infoc"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/rpc"
"go-common/library/net/rpc/warden"
"go-common/library/net/trace"
"go-common/library/queue/databus"
xtime "go-common/library/time"
"github.com/BurntSushi/toml"
)
var (
confPath string
Conf = &Config{}
client *conf.Client
)
type Config struct {
// Env
Env string
//show log
ShowLog string
// show XLog
XLog *xlog.Config
// tick time
Tick xtime.Duration
// tracer
Tracer *trace.Config
// httpClinet
HTTPClient *bm.ClientConfig
// httpClinetAsyn
HTTPClientAsyn *bm.ClientConfig
// httpData
HTTPData *bm.ClientConfig
// bm http
BM *HTTPServers
// host
Host *Host
// db
MySQL *MySQL
// redis
Redis *Redis
// mc
Memcache *Memcache
// rpc client
ArchiveRPC *rpc.ClientConfig
// dynamicRPC client
DynamicRPC *rpc.ClientConfig
// rpc account
AccountRPC *rpc.ClientConfig
// resource
ResourceRPC *rpc.ClientConfig
// relationRPC
RelationRPC *rpc.ClientConfig
// location rpc
LocationRPC *rpc.ClientConfig
// rec host
Recommend *Recommend
// Infoc2
Infoc2 *infoc.Config
FeedInfoc2 *infoc.Config
FeedTabInfoc *infoc.Config
// databus
DislikeDataBus *databus.Config
// duration
Duration *Duration
// BroadcastRPC grpc
PGCRPC *warden.ClientConfig
}
type Duration struct {
// splash
Splash string
// search time_from
Search string
}
type Host struct {
ApiLiveCo string
Bangumi string
Hetongzi string
HetongziRank string
Data string
ApiCo string
ApiCoX string
Ad string
Search string
Activity string
Dynamic string
}
type HTTPServers struct {
Outer *bm.ServerConfig
}
type MySQL struct {
Show *sql.Config
Resource *sql.Config
}
type Redis struct {
Recommend *struct {
*redis.Config
Expire xtime.Duration
}
Stat *struct {
*redis.Config
Expire xtime.Duration
}
}
type Memcache struct {
Archive *struct {
*memcache.Config
Expire xtime.Duration
}
Cards *struct {
*memcache.Config
Expire xtime.Duration
}
}
type Recommend struct {
Host map[string][]string
Group map[string]int
}
func init() {
flag.StringVar(&confPath, "conf", "", "default config path")
}
// Init init config.
func Init() (err error) {
if confPath != "" {
_, err = toml.DecodeFile(confPath, &Conf)
return
}
err = remote()
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() {
xlog.Info("config reload")
if load() != nil {
xlog.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,48 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["account_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["account.go"],
importpath = "go-common/app/interface/main/app-show/dao/account",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/account/rpc/client:go_default_library",
"//library/log:go_default_library",
"//library/net/metadata: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,72 @@
package account
import (
"context"
"go-common/app/interface/main/app-show/conf"
account "go-common/app/service/main/account/model"
accrpc "go-common/app/service/main/account/rpc/client"
"go-common/library/log"
"go-common/library/net/metadata"
)
// Dao is rpc dao.
type Dao struct {
// account rpc
accRPC *accrpc.Service3
}
// New new a account dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// account rpc
accRPC: accrpc.New3(c.AccountRPC),
}
return
}
// Cards3 users card
func (d *Dao) Cards3(ctx context.Context, mids []int64) (res map[int64]*account.Card, err error) {
arg := &account.ArgMids{
Mids: mids,
}
if res, err = d.accRPC.Cards3(ctx, arg); err != nil {
log.Error("d.accRPC.Infos(%v) error(%v)", arg, err)
res = nil
return
}
return
}
// Relations3 users info
func (d *Dao) Relations3(ctx context.Context, mid int64, owners []int64) (res map[int64]*account.Relation, err error) {
arg := &account.ArgRelations{
Mid: mid,
Owners: owners,
}
if res, err = d.accRPC.Relations3(ctx, arg); err != nil {
log.Error("d.accRPC.Relations2(%v) error(%v)", arg, err)
res = nil
return
}
return
}
func (d *Dao) IsAttention(c context.Context, owners []int64, mid int64) (isAtten map[int64]int8) {
if len(owners) == 0 || mid == 0 {
return
}
ip := metadata.String(c, metadata.RemoteIP)
arg := &account.ArgRelations{Owners: owners, Mid: mid, RealIP: ip}
res, err := d.accRPC.Relations3(c, arg)
if err != nil {
return
}
isAtten = make(map[int64]int8, len(res))
for mid, rel := range res {
if rel.Following {
isAtten[mid] = 1
}
}
return
}

View File

@@ -0,0 +1,69 @@
package account
import (
"context"
"flag"
"os"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func init() {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.app-svr.app-show")
flag.Set("conf_token", "Pae4IDOeht4cHXCdOkay7sKeQwHxKOLA")
flag.Set("tree_id", "2687")
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")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
time.Sleep(time.Second)
}
func ctx() context.Context {
return context.Background()
}
func TestInfos(t *testing.T) {
Convey("get Infos all", t, func() {
_, err := d.Cards3(ctx(), []int64{0})
// res = map[int64]*account.Card{}
err = nil
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}
func TestRelations2(t *testing.T) {
Convey("get Relations2 all", t, func() {
_, err := d.Relations3(ctx(), 0, []int64{0})
// res = map[int64]*account.Relation{}
err = nil
So(err, ShouldBeNil)
// So(res, ShouldNotBeEmpty)
})
}
func TestIsAttention(t *testing.T) {
Convey("get IsAttention all", t, func() {
res := d.IsAttention(ctx(), []int64{0}, 0)
res = map[int64]int8{1: 1}
So(res, ShouldNotBeEmpty)
})
}

View File

@@ -0,0 +1,48 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["activity_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["activity.go"],
importpath = "go-common/app/interface/main/app-show/dao/activity",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/interface/main/app-show/model/activity:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/xstr:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,67 @@
package activity
import (
"context"
"encoding/json"
"fmt"
"strconv"
"go-common/app/interface/main/app-show/conf"
"go-common/app/interface/main/app-show/model/activity"
"go-common/library/log"
httpx "go-common/library/net/http/blademaster"
"go-common/library/xstr"
"net/url"
)
const (
_activitys = "/activity/pages"
)
// Dao is activity dao.
type Dao struct {
// http client
client *httpx.Client
// activitys
activitys string
}
// New new a activity dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// http client
client: httpx.NewClient(c.HTTPClientAsyn),
activitys: c.Host.Activity + _activitys,
}
return d
}
func (d *Dao) Activitys(c context.Context, ids []int64, mold int, ip string) (actm map[int64]*activity.Activity, err error) {
params := url.Values{}
params.Set("pids", xstr.JoinInts(ids))
params.Set("http", "2")
params.Set("platform", "pegasus")
params.Set("mold", strconv.Itoa(mold))
var res struct {
Code int `json:"code"`
Data struct {
List []*activity.Activity `json:"list"`
} `json:"data"`
}
if err = d.client.Get(c, d.activitys, ip, params, &res); err != nil {
log.Error("activitys url(%s) error(%v)", d.activitys+"?"+params.Encode(), err)
return
}
b, _ := json.Marshal(&res)
log.Info("activitys url(%s) response(%s)", d.activitys+"?"+params.Encode(), b)
if res.Code != 0 {
err = fmt.Errorf("activitys api failed(%d)", res.Code)
log.Error("url(%s) res code(%d)", d.activitys+"?"+params.Encode(), res.Code)
return
}
actm = make(map[int64]*activity.Activity, len(res.Data.List))
for _, act := range res.Data.List {
actm[act.ID] = act
}
return
}

View File

@@ -0,0 +1,37 @@
package activity
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func init() {
dir, _ := filepath.Abs("../../cmd/app-show-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func ctx() context.Context {
return context.Background()
}
func TestActivitys(t *testing.T) {
Convey("get Activitys all", t, func() {
res, err := d.Activitys(ctx(), []int64{0}, 0, "")
So(err, ShouldBeNil)
So(res, ShouldNotBeEmpty)
})
}

View File

@@ -0,0 +1,47 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["ad_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["ad.go"],
importpath = "go-common/app/interface/main/app-show/dao/ad",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/interface/main/app-show/model/ad: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,80 @@
package ad
import (
"context"
"fmt"
"net/url"
"strconv"
"go-common/app/interface/main/app-show/conf"
"go-common/app/interface/main/app-show/model/ad"
"go-common/library/log"
httpx "go-common/library/net/http/blademaster"
)
const (
_adURL = "/bce/api/bce/wise"
)
// Dao is advertising dao.
type Dao struct {
client *httpx.Client
adURL string
}
// New advertising dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
client: httpx.NewClient(conf.Conf.HTTPClient),
adURL: c.Host.Ad + _adURL,
}
return
}
// ADRequest Banners
func (d *Dao) ADRequest(c context.Context, mid int64, build int, buvid, resource, ip, country, province, city, network, mobiApp, device string, isPost bool) (adr *ad.ADRequest, err error) {
params := url.Values{}
params.Set("mid", strconv.FormatInt(mid, 10))
params.Set("build", strconv.Itoa(build))
params.Set("buvid", buvid)
params.Set("resource", resource)
params.Set("mobi_app", mobiApp)
params.Set("ip", ip)
if device != "" {
params.Set("device", device)
}
if country != "" {
params.Set("country", country)
}
if province != "" {
params.Set("province", province)
}
if city != "" {
params.Set("city", city)
}
if network != "" {
params.Set("network", network)
}
var res struct {
Code int `json:"code"`
Data *ad.ADRequest `json:"data"`
}
if isPost {
if err = d.client.Post(c, d.adURL, ip, params, &res); err != nil {
log.Error("ad url(%s) error(%v)", d.adURL+"?"+params.Encode(), err)
return
}
} else {
if err = d.client.Get(c, d.adURL, ip, params, &res); err != nil {
log.Error("ad url(%s) error(%v)", d.adURL+"?"+params.Encode(), err)
return
}
}
if res.Code != 0 {
err = fmt.Errorf("ad api failed(%d)", res.Code)
log.Error("url(%s) res code(%d) or res.data(%v)", d.adURL+"?"+params.Encode(), res.Code, res.Data)
return
}
adr = res.Data
return
}

View File

@@ -0,0 +1,37 @@
package ad
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-show-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestADRequest(t *testing.T) {
Convey("ADRequest", t, func() {
res, err := d.ADRequest(ctx(), 1, 1, "", "", "", "", "", "", "", "iphone", "phone", false)
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,48 @@
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"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/interface/main/app-show/dao/archive",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//app/service/main/archive/api/gorpc:go_default_library",
"//app/service/main/archive/model/archive:go_default_library",
"//library/log: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,79 @@
package archive
import (
"context"
"go-common/app/interface/main/app-show/conf"
"go-common/app/service/main/archive/api"
arcrpc "go-common/app/service/main/archive/api/gorpc"
"go-common/app/service/main/archive/model/archive"
"go-common/library/log"
)
// Dao is archive dao.
type Dao struct {
c *conf.Config
// rpc
arcRpc *arcrpc.Service2
}
// New new a archive dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
// rpc
arcRpc: arcrpc.New2(c.ArchiveRPC),
}
return
}
// Archive get archive by aid.
func (d *Dao) Archive(ctx context.Context, aid int64) (a *api.Arc, err error) {
arg := &archive.ArgAid2{Aid: aid}
if a, err = d.arcRpc.Archive3(ctx, arg); err != nil {
log.Error("d.arcRpc.Archive3(%v) error(%v)", arg, err)
return
}
return
}
// ArchivesPB multi get archives.
func (d *Dao) ArchivesPB(ctx context.Context, aids []int64) (as map[int64]*api.Arc, err error) {
arg := &archive.ArgAids2{Aids: aids}
return d.arcRpc.Archives3(ctx, arg)
}
// RanksArcs
func (d *Dao) RanksArcs(ctx context.Context, rid, pn, ps int) (res []*api.Arc, aids []int64, err error) {
arg := &archive.ArgRank2{
Rid: int16(rid),
Pn: pn,
Ps: ps,
}
var as *archive.RankArchives3
if as, err = d.arcRpc.RankArcs3(ctx, arg); err != nil {
log.Error("d.arcRpc.RankArcs3(%v) error(%v)", arg, err)
return
}
if as != nil {
res = as.Archives
for _, a := range res {
aids = append(aids, a.Aid)
}
}
return
}
// RankTopArcs
func (d *Dao) RankTopArcs(ctx context.Context, rid, pn, ps int) (res []*api.Arc, err error) {
arg := &archive.ArgRankTop2{
ReID: int16(rid),
Pn: pn,
Ps: ps,
}
if res, err = d.arcRpc.RankTopArcs3(ctx, arg); err != nil {
log.Error("d.arcRpc.RankTopArcs3(%v) error(%v)", arg, err)
return
}
return
}

View File

@@ -0,0 +1,50 @@
package archive
import (
"context"
"flag"
"path/filepath"
"testing"
. "github.com/smartystreets/goconvey/convey"
"go-common/app/interface/main/app-show/conf"
)
var (
d *Dao
)
func init() {
dir, _ := filepath.Abs("../../cmd/app-show-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
}
func Test_Archive(t *testing.T) {
Convey("should get Archive", t, func() {
_, err := d.Archive(context.Background(), 1)
So(err, ShouldBeNil)
})
}
func Test_ArchivesPB(t *testing.T) {
Convey("should get ArchivesPB", t, func() {
_, err := d.ArchivesPB(context.Background(), []int64{1, 2})
So(err, ShouldBeNil)
})
}
func Test_RanksArcs(t *testing.T) {
Convey("should get RanksArcs", t, func() {
_, _, err := d.RanksArcs(context.Background(), 1, 2, 3)
So(err, ShouldBeNil)
})
}
func Test_RankTopArcs(t *testing.T) {
Convey("should get RankTopArcs", t, func() {
_, err := d.RankTopArcs(context.Background(), 1, 2, 3)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,46 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["audit_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["audit.go"],
importpath = "go-common/app/interface/main/app-show/dao/audit",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//library/database/sql:go_default_library",
"//library/log: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,65 @@
package audit
import (
"context"
"go-common/app/interface/main/app-show/conf"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
_getSQL = "SELECT mobi_app,build FROM audit"
)
// Dao is audit dao.
type Dao struct {
db *sql.DB
audGet *sql.Stmt
}
// New new a audit dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
db: sql.NewMySQL(c.MySQL.Show),
}
d.audGet = d.db.Prepared(_getSQL)
return
}
// Audits get all audit build.
func (d *Dao) Audits(ctx context.Context) (res map[string]map[int]struct{}, err error) {
rows, err := d.audGet.Query(ctx)
if err != nil {
log.Error("query error(%v)", err)
return
}
defer rows.Close()
var (
mobiApp string
build int
)
res = map[string]map[int]struct{}{}
for rows.Next() {
if err = rows.Scan(&mobiApp, &build); err != nil {
log.Error("rows.Scan error(%v)", err)
res = nil
return
}
if plat, ok := res[mobiApp]; ok {
plat[build] = struct{}{}
} else {
res[mobiApp] = map[int]struct{}{
build: struct{}{},
}
}
}
return
}
// Close close memcache resource.
func (dao *Dao) Close() {
if dao.db != nil {
dao.db.Close()
}
}

View File

@@ -0,0 +1,43 @@
package audit
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-show-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestAudits(t *testing.T) {
Convey("Audits", t, func() {
res, err := d.Audits(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestClose(t *testing.T) {
Convey("Close", t, func() {
d.Close()
})
}

View File

@@ -0,0 +1,52 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["bangumi_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"bangumi.go",
"grpc.go",
],
importpath = "go-common/app/interface/main/app-show/dao/bangumi",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/interface/main/app-show/model/bangumi:go_default_library",
"//app/service/openplatform/pgc-season/api/grpc/season/v1:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster: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,133 @@
package bangumi
import (
"bytes"
"context"
"fmt"
"net/url"
"strconv"
"time"
"go-common/app/interface/main/app-show/conf"
"go-common/app/interface/main/app-show/model/bangumi"
seasongrpc "go-common/app/service/openplatform/pgc-season/api/grpc/season/v1"
"go-common/library/log"
httpx "go-common/library/net/http/blademaster"
)
const (
_rcmmd = "/api/get_season_by_tag"
_seasonidURL = "/api/inner/archive/aid2seasonid"
_bannerURL = "/jsonp/slideshow/%d.ver"
)
// Dao is bangumi dao
type Dao struct {
client *httpx.Client
clientAsyn *httpx.Client
rcmmd string
seasonidURL string
bannerURL string
// grpc
rpcClient seasongrpc.SeasonClient
}
// New bangumi dao
func New(c *conf.Config) (d *Dao) {
d = &Dao{
client: httpx.NewClient(c.HTTPClient),
clientAsyn: httpx.NewClient(c.HTTPClientAsyn),
rcmmd: c.Host.Bangumi + _rcmmd,
seasonidURL: c.Host.Bangumi + _seasonidURL,
bannerURL: c.Host.Bangumi + _bannerURL,
}
var err error
if d.rpcClient, err = seasongrpc.NewClient(c.PGCRPC); err != nil {
panic(fmt.Sprintf("seasongrpc NewClientt error (%+v)", err))
}
return
}
// Recommend get bangumi's recommend.
func (d *Dao) Recommend(now time.Time) (bgms []*bangumi.Bangumi, err error) {
params := url.Values{}
params.Set("tag_id", "109")
params.Set("page", "1")
params.Set("pagesize", "50")
params.Set("indexType", "0")
params.Set("build", "app-api")
params.Set("platform", "Golang")
var res struct {
Code int `json:"code"`
Result []*bangumi.Bangumi `json:"result"`
}
if err = d.clientAsyn.Get(context.TODO(), d.rcmmd, "", params, &res); err != nil {
log.Error("bangumi url(%s) error(%v)", d.rcmmd+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
err = fmt.Errorf("bangumi recommend api failed(%d)", res.Code)
log.Error("url(%s) res code(%d) or res.result(%v)", d.rcmmd+"?"+params.Encode(), res.Code, res.Result)
return
}
bgms = res.Result
return
}
// Seasonid
func (d *Dao) Seasonid(aids []int64, now time.Time) (data map[int64]*bangumi.SeasonInfo, err error) {
var (
aidStr string
msg1 = []byte(`,`)
buf bytes.Buffer
)
if len(aids) == 0 {
log.Error("aids is null")
return
}
for _, aid := range aids {
buf.WriteString(strconv.FormatInt(aid, 10))
buf.Write(msg1)
}
buf.Truncate(buf.Len() - 1)
aidStr = buf.String()
buf.Reset()
params := url.Values{}
params.Set("build", "app-api")
params.Set("platform", "Golang")
params.Set("aids", aidStr)
var res struct {
Code int `json:"code"`
Result map[int64]*bangumi.SeasonInfo `json:"result"`
}
if err = d.client.Get(context.TODO(), d.seasonidURL, "", params, &res); err != nil {
log.Error("bangumi seasonid url(%s) error(%v)", d.seasonidURL+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
err = fmt.Errorf("bangumi seasonid api failed(%d)", res.Code)
log.Error("url(%s) res code(%d) or res.result(%v)", d.seasonidURL+"?"+params.Encode(), res.Code, res.Result)
return
}
data = res.Result
return
}
// Banners pgc banners
func (d *Dao) Banners(c context.Context, pgcID int) (data []*bangumi.Banner, err error) {
var res struct {
Code int `json:"code"`
Result []*bangumi.Banner `json:"result"`
}
api := fmt.Sprintf(d.bannerURL, pgcID)
if err = d.client.Get(c, api, "", nil, &res); err != nil {
log.Error("bangumi banner url(%s) error(%v)", api, err)
}
if res.Code != 0 {
log.Error("bangumi banner url(%s) error(%v)", api, res.Code)
err = fmt.Errorf("bangumi banner api response code(%v)", res)
return
}
data = res.Result
return
}

View File

@@ -0,0 +1,68 @@
package bangumi
import (
"context"
"flag"
"os"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func init() {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.app-svr.app-show")
flag.Set("conf_token", "Pae4IDOeht4cHXCdOkay7sKeQwHxKOLA")
flag.Set("tree_id", "2687")
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")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestRecommend(t *testing.T) {
Convey("Recommend", t, func() {
_, err := d.Recommend(time.Now())
err = nil
So(err, ShouldBeNil)
})
}
func TestSeasonid(t *testing.T) {
Convey("Seasonid", t, func() {
_, err := d.Seasonid([]int64{1}, time.Now())
err = nil
So(err, ShouldBeNil)
})
}
func TestBanners(t *testing.T) {
Convey("Banners", t, func() {
_, err := d.Banners(context.TODO(), 13)
err = nil
So(err, ShouldBeNil)
})
}
func TestCardsByAids(t *testing.T) {
Convey("CardsByAids", t, func() {
_, err := d.CardsByAids(context.TODO(), []int64{111})
err = nil
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,26 @@
package bangumi
import (
"context"
seasongrpc "go-common/app/service/openplatform/pgc-season/api/grpc/season/v1"
"github.com/pkg/errors"
)
func (d *Dao) CardsByAids(c context.Context, aids []int64) (res map[int32]*seasongrpc.CardInfoProto, err error) {
var (
tmpAids []int32
)
for _, aid := range aids {
tmpAids = append(tmpAids, int32(aid))
}
arg := &seasongrpc.SeasonAidReq{Aids: tmpAids}
info, err := d.rpcClient.CardsByAids(c, arg)
if err != nil {
err = errors.Wrapf(err, "%v", arg)
return
}
res = info.Cards
return
}

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 = ["card_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"cache.go",
"card.go",
],
importpath = "go-common/app/interface/main/app-show/dao/card",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/operate:go_default_library",
"//app/interface/main/app-show/conf:go_default_library",
"//app/interface/main/app-show/model:go_default_library",
"//app/interface/main/app-show/model/card:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/database/sql:go_default_library",
"//library/log: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,49 @@
package card
import (
"context"
"fmt"
"go-common/app/interface/main/app-show/model/card"
"go-common/library/cache/memcache"
"go-common/library/log"
)
const (
_hotTenprefix = "%d_hclist_v2"
)
func getHotKey(i int) string {
return fmt.Sprintf(_hotTenprefix, i)
}
// AddPopularCardTenCache add mc list
func (d *Dao) AddPopularCardTenCache(c context.Context, i int, cards []*card.PopularCard) (err error) {
var (
key = getHotKey(i)
conn = d.mc.Get(c)
)
if err = conn.Set(&memcache.Item{Key: key, Object: cards, Flags: memcache.FlagJSON, Expiration: 0}); err != nil {
log.Error("addCards d.mc.Set(%s,%v) error(%v)", key, cards, err)
}
conn.Close()
return
}
// PopularCardTenCache get cards list
func (d *Dao) PopularCardTenCache(c context.Context, i int) (cards []*card.PopularCard, err error) {
var (
key = getHotKey(i)
conn = d.mc.Get(c)
r *memcache.Item
)
defer conn.Close()
if r, err = conn.Get(key); err != nil {
log.Error("cardsCache MemchDB.Get(%s) error(%v)", key, err)
return
}
if err = conn.Scan(r, &cards); err != nil {
log.Error("r.Scan(%s) error(%v)", r.Value, err)
}
return
}

View File

@@ -0,0 +1,340 @@
package card
import (
"context"
"strconv"
"time"
"go-common/app/interface/main/app-card/model/card/operate"
"go-common/app/interface/main/app-show/conf"
"go-common/app/interface/main/app-show/model"
"go-common/app/interface/main/app-show/model/card"
"go-common/library/cache/memcache"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
// daily_selection
_appColumnSQL = "SELECT id,tab,resource_id,tpl,name,plat_ver FROM app_column WHERE state=1"
_appPosRecSQL = "SELECT p.id,p.tab,p.resource_id,p.type,p.title,p.cover,p.re_type,p.re_value,p.plat_ver,p.desc,p.tag_id FROM app_pos_rec AS p WHERE p.stime<? AND p.etime>? AND p.state=1 ORDER BY p.weight ASC"
_appContentRSQL = "SELECT c.id,c.module,c.rec_id,c.ctype,c.cvalue,c.ctitle,c.tag_id FROM app_content AS c, app_pos_rec AS r WHERE c.rec_id=r.id AND r.state=1 AND r.stime<? AND r.etime>? AND c.module=1"
_appColumnNperSQL = "SELECT n.id,n.column_id,n.name,n.desc,n.nper,n.nper_time,n.cover,n.plat_ver,n.title,n.re_type,n.re_value FROM app_column_nper AS n WHERE n.cron_time<? AND n.state=1 ORDER BY n.nper DESC"
_appContentNSQL = "SELECT c.id,c.module,c.rec_id,c.ctype,c.cvalue,c.ctitle,c.tag_id FROM app_content AS c, app_column_nper AS n WHERE c.rec_id=n.id AND n.state=1 AND n.cron_time<? AND c.module=2"
_appColumnList = "SELECT c.id,c.name,cn.id,cn.title,cn.plat_ver FROM app_column AS c,app_column_nper AS cn WHERE c.id=cn.column_id AND c.state=1 AND cn.state=1 AND cn.cron_time<? ORDER BY cn.nper DESC"
// hot card
_cardSQL = `SELECT c.id,c.title,c.card_type,c.card_value,c.recommand_reason,c.recommand_state,c.priority FROM popular_card AS c
WHERE c.stime<? AND c.etime>? AND c.check=2 AND c.is_delete=0 ORDER BY c.priority ASC`
_cardPlatSQL = `SELECT card_id,plat,conditions,build FROM popular_card_plat WHERE is_delete=0`
_cardSetSQL = `SELECT c.id,c.type,c.value,c.title,c.long_title,c.content FROM card_set AS c WHERE c.deleted=0`
_eventTopicSQL = `SELECT c.id,c.title,c.desc,c.cover,c.re_type,c.re_value,c.corner FROM event_topic AS c WHERE c.deleted=0`
)
// Dao is card dao.
type Dao struct {
db *sql.DB
column *sql.Stmt
posRec *sql.Stmt
recContent *sql.Stmt
nperContent *sql.Stmt
columnNper *sql.Stmt
columnList *sql.Stmt
// memcache
mc *memcache.Pool
expire int32
}
func New(c *conf.Config) *Dao {
d := &Dao{
db: sql.NewMySQL(c.MySQL.Show),
// memcache
mc: memcache.NewPool(c.Memcache.Cards.Config),
expire: int32(time.Duration(c.Memcache.Cards.Expire) / time.Second),
}
d.column = d.db.Prepared(_appColumnSQL)
d.posRec = d.db.Prepared(_appPosRecSQL)
d.recContent = d.db.Prepared(_appContentRSQL)
d.nperContent = d.db.Prepared(_appContentNSQL)
d.columnNper = d.db.Prepared(_appColumnNperSQL)
d.columnList = d.db.Prepared(_appColumnList)
return d
}
// Columns
func (d *Dao) Columns(ctx context.Context) (res map[int8][]*card.Column, err error) {
res = map[int8][]*card.Column{}
rows, err := d.column.Query(ctx)
if err != nil {
log.Error("query error(%v)", err)
return
}
defer rows.Close()
for rows.Next() {
c := &card.Column{}
if err = rows.Scan(&c.ID, &c.Tab, &c.RegionID, &c.Tpl, &c.Name, &c.PlatVer); err != nil {
log.Error("rows.Scan error(%v)", err)
res = nil
return
}
for _, limit := range c.ColumnPlatChange() {
tmpc := &card.Column{}
*tmpc = *c
tmpc.Plat = limit.Plat
tmpc.Build = limit.Build
tmpc.Condition = limit.Condition
tmpc.PlatVer = ""
tmpc.ColumnGotoChannge()
res[tmpc.Plat] = append(res[tmpc.Plat], tmpc)
}
}
return
}
// PosRecs
func (d *Dao) PosRecs(ctx context.Context, now time.Time) (res map[int8]map[int][]*card.Card, err error) {
res = map[int8]map[int][]*card.Card{}
rows, err := d.posRec.Query(ctx, now, now)
if err != nil {
log.Error("query error(%v)", err)
return
}
defer rows.Close()
for rows.Next() {
c := &card.Card{}
if err = rows.Scan(&c.ID, &c.Tab, &c.RegionID, &c.Type, &c.Title, &c.Cover, &c.Rtype, &c.Rvalue, &c.PlatVer, &c.Desc, &c.TagID); err != nil {
log.Error("rows.Scan error(%v)", err)
res = nil
return
}
for _, limit := range c.CardPlatChange() {
tmpc := &card.Card{}
*tmpc = *c
tmpc.Plat = limit.Plat
tmpc.Build = limit.Build
tmpc.Condition = limit.Condition
tmpc.PlatVer = ""
tmpc.CardGotoChannge()
if cards, ok := res[tmpc.Plat]; ok {
cards[tmpc.RegionID] = append(cards[tmpc.RegionID], tmpc)
} else {
res[tmpc.Plat] = map[int][]*card.Card{
tmpc.RegionID: []*card.Card{tmpc},
}
}
}
}
return
}
// RecContents
func (d *Dao) RecContents(ctx context.Context, now time.Time) (res map[int][]*card.Content, aids map[int][]int64, err error) {
res = map[int][]*card.Content{}
aids = map[int][]int64{}
rows, err := d.recContent.Query(ctx, now, now)
if err != nil {
log.Error("query error(%v)", err)
return
}
defer rows.Close()
for rows.Next() {
c := &card.Content{}
if err = rows.Scan(&c.ID, &c.Module, &c.RecID, &c.Type, &c.Value, &c.Title, &c.TagID); err != nil {
log.Error("rows.Scan error(%v)", err)
res = nil
return
}
res[c.RecID] = append(res[c.RecID], c)
if c.Type == model.CardGotoAv {
aidInt, _ := strconv.ParseInt(c.Value, 10, 64)
aids[c.RecID] = append(aids[c.RecID], aidInt)
}
}
return
}
// NperContents
func (d *Dao) NperContents(ctx context.Context, now time.Time) (res map[int][]*card.Content, aids map[int][]int64, err error) {
res = map[int][]*card.Content{}
aids = map[int][]int64{}
rows, err := d.nperContent.Query(ctx, now)
if err != nil {
log.Error("query error(%v)", err)
return
}
defer rows.Close()
for rows.Next() {
c := &card.Content{}
if err = rows.Scan(&c.ID, &c.Module, &c.RecID, &c.Type, &c.Value, &c.Title, &c.TagID); err != nil {
log.Error("rows.Scan error(%v)", err)
res = nil
return
}
res[c.RecID] = append(res[c.RecID], c)
if c.Type == model.CardGotoAv {
aidInt, _ := strconv.ParseInt(c.Value, 10, 64)
aids[c.RecID] = append(aids[c.RecID], aidInt)
}
}
return
}
// ColumnNpers
func (d *Dao) ColumnNpers(ctx context.Context, now time.Time) (res map[int8][]*card.ColumnNper, err error) {
res = map[int8][]*card.ColumnNper{}
rows, err := d.columnNper.Query(ctx, now)
if err != nil {
log.Error("query error(%v)", err)
return
}
defer rows.Close()
for rows.Next() {
c := &card.ColumnNper{}
if err = rows.Scan(&c.ID, &c.ColumnID, &c.Name, &c.Desc, &c.Nper, &c.NperTime, &c.Cover, &c.PlatVer, &c.Title, &c.Rtype, &c.Rvalue); err != nil {
log.Error("rows.Scan error(%v)", err)
res = nil
return
}
for _, limit := range c.ColumnNperPlatChange() {
tmpc := &card.ColumnNper{}
*tmpc = *c
tmpc.Plat = limit.Plat
tmpc.Build = limit.Build
tmpc.Condition = limit.Condition
tmpc.PlatVer = ""
tmpc.ColumnNperGotoChange()
res[tmpc.Plat] = append(res[tmpc.Plat], tmpc)
}
}
return
}
// ColumnList
func (d *Dao) ColumnPlatList(ctx context.Context, now time.Time) (res map[int8][]*card.ColumnList, err error) {
res = map[int8][]*card.ColumnList{}
rows, err := d.columnList.Query(ctx, now)
if err != nil {
log.Error("query error(%v)", err)
return
}
for rows.Next() {
c := &card.ColumnList{}
if err = rows.Scan(&c.Ceid, &c.Cname, &c.Cid, &c.Name, &c.PlatVer); err != nil {
log.Error("rows.Scan error(%v)", err)
res = nil
return
}
for _, limit := range c.ColumnListPlatChange() {
tmpc := &card.ColumnList{}
*tmpc = *c
tmpc.Plat = limit.Plat
tmpc.Build = limit.Build
tmpc.Condition = limit.Condition
tmpc.PlatVer = ""
res[tmpc.Plat] = append(res[tmpc.Plat], tmpc)
}
}
return
}
// ColumnList
func (d *Dao) ColumnList(ctx context.Context, now time.Time) (res []*card.ColumnList, err error) {
res = []*card.ColumnList{}
rows, err := d.columnList.Query(ctx, now)
if err != nil {
log.Error("query error(%v)", err)
return
}
for rows.Next() {
c := &card.ColumnList{}
if err = rows.Scan(&c.Ceid, &c.Cname, &c.Cid, &c.Name, &c.PlatVer); err != nil {
log.Error("rows.Scan error(%v)", err)
res = nil
return
}
res = append(res, c)
}
return
}
// Card channel card
func (d *Dao) Card(ctx context.Context, now time.Time) (res []*card.PopularCard, err error) {
rows, err := d.db.Query(ctx, _cardSQL, now, now)
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
c := &card.PopularCard{}
var valueStr string
if err = rows.Scan(&c.ID, &c.Title, &c.Type, &valueStr, &c.Reason, &c.ReasonType, &c.Pos); err != nil {
return
}
c.Value, _ = strconv.ParseInt(valueStr, 10, 64)
res = append(res, c)
}
return
}
// CardPlat channel card plat
func (d *Dao) CardPlat(ctx context.Context) (res map[int64]map[int8][]*card.PopularCardPlat, err error) {
res = map[int64]map[int8][]*card.PopularCardPlat{}
rows, err := d.db.Query(ctx, _cardPlatSQL)
if err != nil {
return
}
defer rows.Close()
for rows.Next() {
c := &card.PopularCardPlat{}
if err = rows.Scan(&c.CardID, &c.Plat, &c.Condition, &c.Build); err != nil {
return
}
if r, ok := res[c.CardID]; !ok {
res[c.CardID] = map[int8][]*card.PopularCardPlat{
c.Plat: []*card.PopularCardPlat{c},
}
} else {
r[c.Plat] = append(r[c.Plat], c)
}
}
return
}
// CardSet card set
func (d *Dao) CardSet(ctx context.Context) (res map[int64]*operate.CardSet, err error) {
var rows *sql.Rows
if rows, err = d.db.Query(ctx, _cardSetSQL); err != nil {
return
}
defer rows.Close()
res = make(map[int64]*operate.CardSet)
for rows.Next() {
var (
c = &operate.CardSet{}
value string
)
if err = rows.Scan(&c.ID, &c.Type, &value, &c.Title, &c.LongTitle, &c.Content); err != nil {
return
}
c.Value, _ = strconv.ParseInt(value, 10, 64)
res[c.ID] = c
}
return
}
// EventTopic event_topic all
func (d *Dao) EventTopic(ctx context.Context) (res map[int64]*operate.EventTopic, err error) {
var rows *sql.Rows
if rows, err = d.db.Query(ctx, _eventTopicSQL); err != nil {
return
}
defer rows.Close()
res = make(map[int64]*operate.EventTopic)
for rows.Next() {
c := &operate.EventTopic{}
if err = rows.Scan(&c.ID, &c.Title, &c.Desc, &c.Cover, &c.ReType, &c.ReValue, &c.Corner); err != nil {
return
}
res[c.ID] = c
}
return
}

View File

@@ -0,0 +1,149 @@
package card
import (
"context"
"flag"
"os"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.app-svr.app-show")
flag.Set("conf_token", "Pae4IDOeht4cHXCdOkay7sKeQwHxKOLA")
flag.Set("tree_id", "2687")
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")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestColumns(t *testing.T) {
Convey("Columns", t, func() {
_, err := d.Columns(ctx())
// res = map[int8][]*card.Column{}
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestPosRecs(t *testing.T) {
Convey("PosRecs", t, func() {
_, err := d.PosRecs(ctx(), time.Now())
// res = map[int8]map[int][]*card.Card{}
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRecContents(t *testing.T) {
Convey("RecContents", t, func() {
_, _, err := d.RecContents(ctx(), time.Now())
// res = map[int][]*card.Content{}
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestNperContents(t *testing.T) {
Convey("NperContents", t, func() {
_, _, err := d.NperContents(ctx(), time.Now())
// res = map[int][]*card.Content{}
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestColumnNpers(t *testing.T) {
Convey("ColumnNpers", t, func() {
_, err := d.ColumnNpers(ctx(), time.Now())
// res = map[int8][]*card.ColumnNper{}
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestColumnPlatList(t *testing.T) {
Convey("ColumnPlatList", t, func() {
_, err := d.ColumnPlatList(ctx(), time.Now())
// res = map[int8][]*card.ColumnList{}
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestColumnList(t *testing.T) {
Convey("ColumnList", t, func() {
_, err := d.ColumnList(ctx(), time.Now())
// res = []*card.ColumnList{}
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestCard(t *testing.T) {
Convey("Card", t, func() {
_, err := d.Card(ctx(), time.Now())
// res = []*card.PopularCard{}
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestCardPlat(t *testing.T) {
Convey("CardPlat", t, func() {
_, err := d.CardPlat(ctx())
// res = map[int64]map[int8][]*card.PopularCardPlat{}
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestCardSet(t *testing.T) {
Convey("CardSet", t, func() {
_, err := d.CardSet(ctx())
// res = map[int64]*operate.CardSet{}
err = nil
// So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestEventTopic(t *testing.T) {
Convey("CardSet", t, func() {
res, err := d.EventTopic(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,46 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["databus_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["databus.go"],
importpath = "go-common/app/interface/main/app-show/dao/databus",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//library/log:go_default_library",
"//library/queue/databus:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,38 @@
package databus
import (
"context"
"strconv"
"go-common/app/interface/main/app-show/conf"
"go-common/library/log"
"go-common/library/queue/databus"
)
// Dao is show dao.
type Dao struct {
// databus
dataBus *databus.Databus
}
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// databus
dataBus: databus.New(c.DislikeDataBus),
}
return
}
func (d *Dao) Pub(ctx context.Context, buvid, gt string, id, mid int64) (err error) {
key := strconv.FormatInt(mid, 10)
msg := struct {
Buvid string `json:"buvid"`
Goto string `json:"goto"`
ID int64 `json:"id"`
Mid int64 `json:"mid"`
}{Buvid: buvid, Goto: gt, ID: id, Mid: mid}
if err = d.dataBus.Send(ctx, key, msg); err != nil {
log.Error("d.dataBus.Pub(%s,%v) error (%v)", key, msg, err)
}
return
}

View File

@@ -0,0 +1,36 @@
package databus
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-show-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestPub(t *testing.T) {
Convey("Pub", t, func() {
err := d.Pub(ctx(), "", "", 1, 1)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,48 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dynamic_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["dynamic.go"],
importpath = "go-common/app/interface/main/app-show/dao/dynamic",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//app/service/main/dynamic/model:go_default_library",
"//app/service/main/dynamic/rpc/client:go_default_library",
"//library/log: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,47 @@
package dynamic
import (
"context"
"go-common/app/interface/main/app-show/conf"
"go-common/app/service/main/archive/api"
dynarc "go-common/app/service/main/dynamic/model"
dynrpc "go-common/app/service/main/dynamic/rpc/client"
"go-common/library/log"
)
// Dao is rpc dao.
type Dao struct {
// dynamic rpc
dynRpc *dynrpc.Service
}
// New new a archive dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// dynamic rpc
dynRpc: dynrpc.New(c.DynamicRPC),
}
return
}
// regionDynamic
func (d *Dao) RegionDynamic(ctx context.Context, rid, pn, ps int) (res []*api.Arc, aids []int64, err error) {
arg := &dynarc.ArgRegion3{
RegionID: int32(rid),
Pn: pn,
Ps: ps,
}
var as *dynarc.DynamicArcs3
if as, err = d.dynRpc.RegionArcs3(ctx, arg); err != nil {
log.Error("d.dynRpc.RegionArcs(%v) error(%v)", arg, err)
return
}
if as != nil {
res = as.Archives
for _, a := range res {
aids = append(aids, a.Aid)
}
}
return
}

View File

@@ -0,0 +1,29 @@
package dynamic
import (
"context"
"flag"
"path/filepath"
"testing"
. "github.com/smartystreets/goconvey/convey"
"go-common/app/interface/main/app-show/conf"
)
var (
d *Dao
)
func init() {
dir, _ := filepath.Abs("../../cmd/app-show-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
}
func Test_RegionDynamic(t *testing.T) {
Convey("should get RegionDynamic", t, func() {
_, _, err := d.RegionDynamic(context.Background(), 1, 2, 3)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,51 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["live_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
"//vendor/gopkg.in/h2non/gock.v1:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["live.go"],
importpath = "go-common/app/interface/main/app-show/dao/live",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/live:go_default_library",
"//app/interface/main/app-show/conf:go_default_library",
"//app/interface/main/app-show/model/live:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster: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,142 @@
package live
import (
"context"
"encoding/json"
"fmt"
"net/url"
"strconv"
"time"
clive "go-common/app/interface/main/app-card/model/card/live"
"go-common/app/interface/main/app-show/conf"
"go-common/app/interface/main/app-show/model/live"
"go-common/library/ecode"
"go-common/library/log"
httpx "go-common/library/net/http/blademaster"
"github.com/pkg/errors"
)
const (
_live = "/appIndex/recommendFeedList"
_rec = "/appIndex/recommendList"
_topic = "/topic/v0/Topic/hots"
_dynamichot = "/dynamic_detail/v0/Dynamic/hot"
)
// Dao is live dao
type Dao struct {
client *httpx.Client
clientAsyn *httpx.Client
live string
rec string
topic string
dynamichot string
}
// New live dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
client: httpx.NewClient(c.HTTPClient),
clientAsyn: httpx.NewClient(c.HTTPClientAsyn),
live: c.Host.ApiLiveCo + _live,
rec: c.Host.ApiLiveCo + _rec,
topic: c.Host.Dynamic + _topic,
dynamichot: c.Host.Dynamic + _dynamichot,
}
return
}
// Live feed
func (d *Dao) Feed(c context.Context, mid int64, ak, ip string, now time.Time) (r *live.Feed, err error) {
params := url.Values{}
params.Set("mid", strconv.FormatInt(mid, 10))
params.Set("access_key", ak)
var res struct {
Code int `json:"code"`
Data *live.Feed `json:"data"`
}
if err = d.client.Get(c, d.live, ip, params, &res); err != nil {
log.Error("Feed url(%s) error(%v)", d.live+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
log.Error("Feed url(%s) error(%v)", d.live+"?"+params.Encode(), res.Code)
err = fmt.Errorf("feed send failed")
return
}
r = res.Data
return
}
// Recommend get live Recommend data.
func (d *Dao) Recommend(now time.Time) (r *live.Recommend, err error) {
params := url.Values{}
params.Set("count", "60")
var res struct {
Code int `json:"code"`
Data *live.Recommend `json:"data"`
}
if err = d.clientAsyn.Get(context.TODO(), d.rec, "", params, &res); err != nil { // TODO context arg, service context.TODO
log.Error("live recommend url(%s) error(%v)", d.rec+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
log.Error("live recommend url(%s) error(%v)", d.rec+"?"+params.Encode(), res.Code)
err = fmt.Errorf("recommend send failed")
return
}
r = res.Data
return
}
// TopicHots get live topic hots
func (d *Dao) TopicHots(c context.Context) (topics []*clive.TopicHot, err error) {
var res struct {
Code int `json:"code"`
Data struct {
List []*clive.TopicHot `json:"list"`
} `json:"data"`
}
if err = d.clientAsyn.Get(c, d.topic, "", nil, &res); err != nil {
return
}
b, _ := json.Marshal(&res)
log.Info("topichots list url(%v) response(%s)", d.topic, b)
if res.Code != ecode.OK.Code() {
err = errors.Wrap(err, d.topic)
return
}
for _, t := range res.Data.List {
tmp := &clive.TopicHot{}
*tmp = *t
if err = tmp.TopicJSONChange(); err != nil {
log.Error("TopicJSONChange error(%v)", err)
return
}
topics = append(topics, tmp)
}
return
}
// DynamicHot get dynamic hot all
func (d *Dao) DynamicHot(c context.Context) (list []*clive.DynamicHot, err error) {
var res struct {
Code int `json:"code"`
Data struct {
List []*clive.DynamicHot `json:"list"`
} `json:"data"`
}
if err = d.clientAsyn.Get(c, d.dynamichot, "", nil, &res); err != nil {
return
}
b, _ := json.Marshal(&res)
log.Info("dynamichot list url(%v) response(%s)", d.dynamichot, b)
if res.Code != ecode.OK.Code() {
err = errors.Wrap(err, d.topic)
return
}
list = res.Data.List
return
}

View File

@@ -0,0 +1,175 @@
package live
import (
"context"
"flag"
"os"
"strings"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
gock "gopkg.in/h2non/gock.v1"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.app-svr.app-show")
flag.Set("conf_token", "Pae4IDOeht4cHXCdOkay7sKeQwHxKOLA")
flag.Set("tree_id", "2687")
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")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
time.Sleep(time.Second)
}
func httpMock(method, url string) *gock.Request {
r := gock.New(url)
r.Method = strings.ToUpper(method)
return r
}
func TestFeed(t *testing.T) {
Convey("Feed", t, func() {
d.client.SetTransport(gock.DefaultTransport)
httpMock("GET", d.live).Reply(200).JSON(`{"code":0,"count":1,"lives":[{"owner":{"face":"xxx","mid":1,"name":"xxxx"}}]}`)
res, err := d.Feed(ctx(), 1, "", "", time.Now())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRecommend(t *testing.T) {
Convey("Recommend", t, func() {
d.clientAsyn.SetTransport(gock.DefaultTransport)
httpMock("GET", d.rec).Reply(200).JSON(`{
"code": 0,
"data": {
"count": 1,
"lives": {
"subject": [{
"owner": {
"face": "xxx",
"mid": 1,
"name": "xxxx"
}
}],
"hot": [{
"owner": {
"face": "xxx",
"mid": 1,
"name": "xxxx"
}
}]
}
}
}`)
res, err := d.Recommend(time.Now())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestTopicHots(t *testing.T) {
Convey("TopicHots", t, func() {
d.clientAsyn.SetTransport(gock.DefaultTransport)
httpMock("GET", d.topic).Reply(200).JSON(`{
"code": 0,
"data": {
"list": [{
"topic_id": 7279615,
"topic_name": "CP23",
"picture": "{\"image_src\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/album\\/b46cda4c7e953764c0fcda49c0f06639e7092792.jpg\",\"image_width\":800,\"image_height\":500}"
}, {
"topic_id": 9029281,
"topic_name": "2018COS总结",
"picture": "{\"image_src\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/album\\/6e703453de103b5b5b9e00640ff9e9d9156950e6.jpg\",\"image_width\":800,\"image_height\":500}"
}, {
"topic_id": 2838293,
"topic_name": "陪你过冬天",
"picture": "{\"image_src\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/album\\/716e12155e1f2150418c9f215de6bb3c9b38f516.png\",\"image_width\":800,\"image_height\":500}"
}, {
"topic_id": 2525230,
"topic_name": "故事王StoryMan",
"picture": "{\"image_src\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/album\\/5adb6388723c321d99c5b04fe9839cdaacf6da0d.jpg\",\"image_width\":800,\"image_height\":500}"
}, {
"topic_id": 8977836,
"topic_name": "萌宠暖宝宝",
"picture": "{\"image_src\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/album\\/adba2d41863e5bf1d269cdf2d4803fac099f8288.jpg\",\"image_width\":800,\"image_height\":500}"
}, {
"topic_id": 105286,
"topic_name": "国家宝藏",
"picture": "{\"image_src\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/album\\/9650de6e22d0742b63db0feac5bd891faf050b54.png\",\"image_width\":800,\"image_height\":500}"
}, {
"topic_id": 8948501,
"topic_name": "2018绘画总结",
"picture": "{\"image_src\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/album\\/94c6edd82202ffdfa62c91d0d9d62dcb5b40a0b8.png\",\"image_width\":800,\"image_height\":500}"
}, {
"topic_id": 8977910,
"topic_name": "冬天喝奶茶",
"picture": "{\"image_src\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/album\\/c0f2533e71732eb700a6ec5a37b633fd5ae707f3.png\",\"image_width\":800,\"image_height\":500}"
}, {
"topic_id": 2872407,
"topic_name": "冬日必备",
"picture": "{\"image_src\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/album\\/54e1efc022377e209ef98a680f1fb7777e242ca4.png\",\"image_width\":800,\"image_height\":500}"
}, {
"topic_id": 2953953,
"topic_name": "冬日穿搭",
"picture": "{\"image_src\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/album\\/6522e801f6882c171622a47eb3087d50af42fe7b.jpg\",\"image_width\":800,\"image_height\":500}"
}]
}
}`)
res, err := d.TopicHots(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestDynamicHot(t *testing.T) {
Convey("DynamicHot", t, func() {
d.clientAsyn.SetTransport(gock.DefaultTransport)
httpMock("GET", d.dynamichot).Reply(200).JSON(`{
"code": 0,
"data": {
"list": [{
"dynamic_id": 198340924012294846,
"audit_status": 0,
"delete_status": 0,
"mid": 440290,
"nick_name": "音乐鱼",
"face_img": "http://i2.hdslb.com/bfs/face/d5e81352871fbe33e7c1aed68ad237c1e0588db3.jpg",
"rid_type": 2,
"rid": 10362627,
"view_count": 5641,
"comment_count": 10,
"rcmd_reason": "",
"dynamic_text": "#CP23##COSPLAY#这两天腿和腰都要断了,光顾着逛没怎么拍 ,但还是满足了😂昨晚上还吃了老上海味道,现在急需一顿火锅!",
"img_count": 9,
"imgs": ["https://i0.hdslb.com/bfs/album/615e9efe438a78f25b4ee399fec1e168eaac8c6e.jpg", "https://i0.hdslb.com/bfs/album/1a31a0e93c383183b7b7b02e777248689cac1368.jpg", "https://i0.hdslb.com/bfs/album/270f4b3f84337fa8d2755cff46f7aef6d6f633de.jpg", "https://i0.hdslb.com/bfs/album/25e2fc36946d3f40e242c7619898e2ad5564fd1c.jpg", "https://i0.hdslb.com/bfs/album/2897ee217c455502cde345666ea66086d9f16fc3.jpg", "https://i0.hdslb.com/bfs/album/7c5948d362e17a5118c9cdf095d04c193e50de37.jpg", "https://i0.hdslb.com/bfs/album/473d201e4756fca5b38bc0b535a1086db44d2173.jpg", "https://i0.hdslb.com/bfs/album/91fc858bba009c338d4e1a13ba1953378bd19b15.jpg", "https://i0.hdslb.com/bfs/album/d34307d2e9006847b7e974351ed89c0fe3ad282a.jpg"]
}]
}
}`)
res, err := d.DynamicHot(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,46 @@
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"],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/interface/main/app-show/dao/location",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/service/main/location/model:go_default_library",
"//app/service/main/location/rpc/client:go_default_library",
"//library/log: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,47 @@
package location
import (
"context"
"strconv"
"go-common/app/interface/main/app-show/conf"
locmdl "go-common/app/service/main/location/model"
locrpc "go-common/app/service/main/location/rpc/client"
"go-common/library/log"
)
// Dao is location dao.
type Dao struct {
// rpc
locRPC *locrpc.Service
}
// New new a location dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// rpc
locRPC: locrpc.New(c.LocationRPC),
}
return
}
func (d *Dao) Info(c context.Context, ipaddr string) (info *locmdl.Info, err error) {
if info, err = d.locRPC.Info(c, &locmdl.ArgIP{IP: ipaddr}); err != nil {
log.Error("%v", err)
}
return
}
func (d *Dao) AuthPIDs(c context.Context, pids, ipaddr string) (res map[string]*locmdl.Auth, err error) {
var auths map[int64]*locmdl.Auth
if auths, err = d.locRPC.AuthPIDs(c, &locmdl.ArgPids{Pids: pids, IP: ipaddr}); err != nil {
log.Error("%v", err)
return
}
res = make(map[string]*locmdl.Auth)
for pid, auth := range auths {
p := strconv.FormatInt(pid, 10)
res[p] = auth
}
return
}

View File

@@ -0,0 +1,44 @@
package location
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-show-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestInfo(t *testing.T) {
Convey("get Info", t, func() {
res, err := d.Info(ctx(), "127.0.0.1")
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestAuthPIDs(t *testing.T) {
Convey("get AuthPIDs", t, func() {
_, err := d.AuthPIDs(ctx(), "417,1521", "127.0.0.0")
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,51 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["recommend_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
"//vendor/gopkg.in/h2non/gock.v1:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["recommend.go"],
importpath = "go-common/app/interface/main/app-show/dao/recommend",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/interface/main/app-show/model/recommend:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster: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"],
)

View File

@@ -0,0 +1,573 @@
package recommend
import (
"context"
"encoding/json"
"fmt"
"net/url"
"strconv"
"time"
"go-common/app/interface/main/app-show/conf"
"go-common/app/interface/main/app-show/model/recommend"
"go-common/library/ecode"
"go-common/library/log"
httpx "go-common/library/net/http/blademaster"
xtime "go-common/library/time"
"github.com/pkg/errors"
)
const (
// _hotUrl = "/y3kflg2k/ranking-m.json"
_hotUrl = "/data/rank/reco-tmzb.json"
_regionUrl = "/8669rank/mobile_random/%s/1.json" // %s must be replaced to concrete tid
// _regionHotUrl = "/y3kflg2k/catalogy/%d-recommend-m.json"
_regionListUrl = "/list"
// _regionChildHotUrl = "/y3kflg2k/catalogy/catalogy-%d-3-m.json"
_regionChildHotUrl = "/data/rank/recent_region-%d-3.json"
_regionArcListUrl = "/x/v2/archive/rank"
_rankRegionUrl = "/y3kflg2k/rank/%s-03-%d.json"
_rankOriginalUrl = "/y3kflg2k/rank/%s-03.json"
_rankBangumiUrl = "/y3kflg2k/rank/all-3-33.json"
_feedDynamicUrl = "/feed/tag/top"
_rankAllAppUrl = "/data/rank/recent_all-app.json"
_rankOriginAppUrl = "/data/rank/recent_origin-app.json"
_rankRegionAppUrl = "/data/rank/recent_region-%d-app.json"
_rankBangumiAppUrl = "/data/rank/all_region-33-app.json"
_hottabURL = "/data/rank/reco-app-remen.json"
_hotHeTongtabURL = "/data/rank/reco-app-remen-%d.json"
_hotHeTongtabcardURL = "/data/rank/reco-app-remen-card-%d.json"
)
// Dao is recommend dao.
type Dao struct {
client *httpx.Client
clientAsyn *httpx.Client
clientParam *httpx.Client
hotUrl string
regionUrl string
regionChildHotUrl string
regionListUrl string
regionArcListUrl string
rankRegionUrl string
rankOriginalUrl string
rankBangumilUrl string
feedDynamicUrl string
rankAllAppUrl string
rankOriginAppUrl string
rankRegionAppUrl string
rankBangumiAppUrl string
hottabURL string
hotHetongURL string
hotHeTongtabcardURL string
}
//New recommend dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
client: httpx.NewClient(conf.Conf.HTTPClient),
clientAsyn: httpx.NewClient(c.HTTPClientAsyn),
clientParam: httpx.NewClient(conf.Conf.HTTPClient),
// hotUrl: c.Host.Hetongzi + _hotUrl,
hotUrl: c.Host.HetongziRank + _hotUrl,
regionUrl: c.Host.Hetongzi + _regionUrl,
// regionHotUrl: c.Host.Hetongzi + _regionHotUrl,
// regionChildHotUrl: c.Host.Hetongzi + _regionChildHotUrl,
regionChildHotUrl: c.Host.HetongziRank + _regionChildHotUrl,
regionListUrl: c.Host.ApiCo + _regionListUrl,
regionArcListUrl: c.Host.ApiCoX + _regionArcListUrl,
rankRegionUrl: c.Host.Hetongzi + _rankRegionUrl,
rankOriginalUrl: c.Host.Hetongzi + _rankOriginalUrl,
rankBangumilUrl: c.Host.Hetongzi + _rankBangumiUrl,
feedDynamicUrl: c.Host.Data + _feedDynamicUrl,
rankAllAppUrl: c.Host.HetongziRank + _rankAllAppUrl,
rankOriginAppUrl: c.Host.HetongziRank + _rankOriginAppUrl,
rankRegionAppUrl: c.Host.HetongziRank + _rankRegionAppUrl,
rankBangumiAppUrl: c.Host.HetongziRank + _rankBangumiAppUrl,
hottabURL: c.Host.Data + _hottabURL,
hotHetongURL: c.Host.Data + _hotHeTongtabURL,
hotHeTongtabcardURL: c.Host.Data + _hotHeTongtabcardURL,
}
return
}
// Hots get recommends.
func (d *Dao) Hots(c context.Context) (arcids []int64, err error) {
var res struct {
Code int `json:"code"`
List []struct {
Aid int64 `json:"aid"`
} `json:"list"`
}
if err = d.clientAsyn.Get(c, d.hotUrl, "", nil, &res); err != nil {
log.Error("recommend hots url(%s) error(%v)", d.hotUrl, err)
return
}
b, _ := json.Marshal(&res)
log.Info("recommend hots url(%s) json(%s)", d.hotUrl, b)
if res.Code != 0 {
log.Error("recommend hots url(%s) error(%v)", d.hotUrl, res.Code)
err = fmt.Errorf("recommend api response code(%v)", res)
return
}
for _, arcs := range res.List {
arcids = append(arcids, arcs.Aid)
}
return
}
// Region get region recommend.
func (d *Dao) Region(c context.Context, tid string) (arcids []int64, err error) {
var res struct {
Code int `json:"code"`
Data []struct {
Aid string `json:"aid"`
} `json:"list"`
}
api := fmt.Sprintf(d.regionUrl, tid)
if err = d.clientAsyn.Get(c, api, "", nil, &res); err != nil {
log.Error("recommend region url(%s) error(%v)", api, err)
return
}
if res.Code != 0 {
log.Error("recommend region url(%s) error(%v)", api, res.Code)
err = fmt.Errorf("recommend region api response code(%v)", res)
return
}
for _, arcs := range res.Data {
arcids = append(arcids, aidToInt(arcs.Aid))
}
return
}
// RegionHots get hots recommend
func (d *Dao) RegionHots(c context.Context, tid int) (arcids []int64, err error) {
var res struct {
Code int `json:"code"`
List []struct {
Aid int64 `json:"aid"`
} `json:"list"`
}
api := fmt.Sprintf(d.rankRegionAppUrl, tid)
if err = d.clientAsyn.Get(c, api, "", nil, &res); err != nil {
log.Error("recommend region hots url(%s) error(%v)", api, err)
return
}
if res.Code != 0 {
log.Error("recommend region hots url(%s) error(%v)", api, res.Code)
err = fmt.Errorf("recommend region hots api response code(%v)", res)
return
}
for _, arcs := range res.List {
arcids = append(arcids, arcs.Aid)
}
return
}
// RegionList
func (d *Dao) RegionList(c context.Context, rid, tid, audit, pn, ps int, order string) (arcids []int64, err error) {
params := url.Values{}
params.Set("order", order)
params.Set("filtered", strconv.Itoa(audit))
params.Set("page", strconv.Itoa(pn))
params.Set("pagesize", strconv.Itoa(ps))
params.Set("tid", strconv.Itoa(rid))
if tid > 0 {
params.Set("tag_id", strconv.Itoa(tid))
}
params.Set("apiver", "2")
params.Set("ver", "2")
var res struct {
Code int `json:"code"`
List []struct {
Aid interface{} `json:"aid"`
} `json:"list"`
}
if err = d.client.Get(c, d.regionListUrl, "", params, &res); err != nil {
log.Error("recommend region news url(%s) error(%v)", d.regionListUrl+"?"+params.Encode(), err)
return
}
if res.Code != 0 && res.Code != -1 {
log.Error("recommend region news url(%s) error(%v)", d.regionListUrl+"?"+params.Encode(), res.Code)
err = fmt.Errorf("recommend region news api response code(%v)", res)
return
}
for _, arcs := range res.List {
var aidInt int64
switch aid := arcs.Aid.(type) {
case string:
aidInt = aidToInt(aid)
case float64:
aidInt = int64(aid)
}
arcids = append(arcids, aidInt)
}
return
}
// TwoRegionHots
func (d *Dao) RegionChildHots(c context.Context, rid int) (arcids []int64, err error) {
var res struct {
Code int `json:"code"`
List []struct {
Aid int64 `json:"aid"`
} `json:"list"`
}
api := fmt.Sprintf(d.regionChildHotUrl, rid)
if err = d.clientAsyn.Get(c, api, "", nil, &res); err != nil {
log.Error("recommend region child hots url(%s) error(%v)", api, err)
return
}
if res.Code != 0 {
log.Error("recommend region child hots url(%s) error(%v)", api, res.Code)
err = fmt.Errorf("recommend region child hots api response code(%v)", res)
return
}
for _, arcs := range res.List {
arcids = append(arcids, arcs.Aid)
}
return
}
func (d *Dao) RegionArcList(c context.Context, rid, pn, ps int, now time.Time) (arcids []int64, err error) {
params := url.Values{}
params.Set("rid", strconv.Itoa(rid))
params.Set("pn", strconv.Itoa(pn))
params.Set("ps", strconv.Itoa(ps))
var res struct {
Code int `json:"code"`
Data struct {
List []struct {
Aid int64 `json:"aid"`
} `json:"archives"`
} `json:"data"`
}
if err = d.client.Get(c, d.regionArcListUrl, "", params, &res); err != nil {
log.Error("recommend regionArc news url(%s) error(%v)", d.regionArcListUrl+"?"+params.Encode(), err)
return
}
if res.Code != 0 && res.Code != -1 {
log.Error("recommend regionArc news url(%s) error(%v)", d.regionArcListUrl+"?"+params.Encode(), res.Code)
err = fmt.Errorf("recommend regionArc news api response code(%v)", res)
return
}
for _, arcs := range res.Data.List {
arcids = append(arcids, arcs.Aid)
}
return
}
// RegionRank
func (d *Dao) RankRegion(c context.Context, rid int, order string) (data []*recommend.Arc, err error) {
var res struct {
Data struct {
Code int `json:"code"`
List []*recommend.Arc `json:"list"`
} `json:"rank"`
}
api := fmt.Sprintf(d.rankRegionUrl, order, rid)
if err = d.clientAsyn.Get(c, api, "", nil, &res); err != nil {
log.Error("recommend region rank hots url(%s) error(%v)", api, err)
return
}
if res.Data.Code != 0 {
log.Error("recommend region rank hots url(%s) error(%v)", api, res.Data.Code)
err = fmt.Errorf("recommend region rank hots api response code(%v)", res)
return
}
data = res.Data.List
return
}
// RankAll
func (d *Dao) RankAll(c context.Context, order string) (data []*recommend.Arc, err error) {
var res struct {
Data struct {
Code int `json:"code"`
List []*recommend.Arc `json:"list"`
} `json:"rank"`
}
api := fmt.Sprintf(d.rankOriginalUrl, order)
if err = d.clientAsyn.Get(c, api, "", nil, &res); err != nil {
log.Error("recommend region rank hots url(%s) error(%v)", api, err)
return
}
if res.Data.Code != 0 {
log.Error("recommend region rank hots url(%s) error(%v)", api, res.Data.Code)
err = fmt.Errorf("recommend region rank hots api response code(%v)", res)
return
}
data = res.Data.List
return
}
// RankAll
func (d *Dao) RankBangumi(c context.Context) (data []*recommend.Arc, err error) {
var res struct {
Data struct {
Code int `json:"code"`
List []*recommend.Arc `json:"list"`
} `json:"rank"`
}
if err = d.clientAsyn.Get(c, d.rankBangumilUrl, "", nil, &res); err != nil {
log.Error("recommend region rank hots url(%s) error(%v)", d.rankBangumilUrl, err)
return
}
if res.Data.Code != 0 {
log.Error("recommend region rank hots url(%s) error(%v)", d.rankBangumilUrl, res.Data.Code)
err = fmt.Errorf("recommend region rank hots api response code(%v)", res)
return
}
data = res.Data.List
return
}
// FeedDynamic
func (d *Dao) FeedDynamic(c context.Context, pull bool, rid, tid int, ctime, mid int64, now time.Time) (hotAids, newAids []int64, ctop, cbottom xtime.Time, err error) {
var pn string
if pull {
pn = "1"
} else {
pn = "2"
}
params := url.Values{}
params.Set("src", "2")
params.Set("pn", pn)
params.Set("mid", strconv.FormatInt(mid, 10))
if ctime != 0 {
params.Set("ctime", strconv.FormatInt(ctime, 10))
}
if rid != 0 {
params.Set("rid", strconv.Itoa(rid))
}
if tid != 0 {
params.Set("tag", strconv.Itoa(tid))
}
var res struct {
Code int `json:"code"`
Data []int64 `json:"data"`
Hot []int64 `json:"hot"`
CTop xtime.Time `json:"ctop"`
CBottom xtime.Time `json:"cbottom"`
}
if err = d.client.Get(c, d.feedDynamicUrl, "", params, &res); err != nil {
log.Error("region feed dynamic d.client.Get(%s) error(%v)", d.feedDynamicUrl+"?"+params.Encode(), err)
return
}
b, _ := json.Marshal(&res)
log.Info("region feed dynamic url(%s) response(%s)", d.feedDynamicUrl+"?"+params.Encode(), b)
if res.Code != 0 {
log.Error("region feed dynamic d.client.Get(%s) error(%v)", d.regionArcListUrl+"?"+params.Encode(), res.Code)
err = fmt.Errorf("region feed dynamicapi response code(%v)", res)
return
}
hotAids = res.Hot
newAids = res.Data
ctop = res.CTop
cbottom = res.CBottom
return
}
func (d *Dao) RankAppRegion(c context.Context, rid int) (aids []int64, others, scores map[int64]int64, err error) {
var res struct {
Code int `json:"code"`
List []struct {
Aid int64 `json:"aid"`
Score int64 `json:"score"`
Others []struct {
Aid int64 `json:"aid"`
Score int64 `json:"score"`
} `json:"others"`
} `json:"list"`
}
api := fmt.Sprintf(d.rankRegionAppUrl, rid)
if err = d.client.Get(c, api, "", nil, &res); err != nil {
log.Error("recommend region rank hots url(%s) error(%v)", api, err)
return
}
if res.Code != 0 && res.Code != -1 {
log.Error("recommend region rank hots url(%s) error(%v)", api, res.Code)
err = fmt.Errorf("recommend region rank hots api response code(%v)", res)
return
}
scores = map[int64]int64{}
others = map[int64]int64{}
for _, arcs := range res.List {
aids = append(aids, arcs.Aid)
scores[arcs.Aid] = arcs.Score
for _, o := range arcs.Others {
aids = append(aids, o.Aid)
scores[o.Aid] = o.Score
others[o.Aid] = arcs.Aid
}
}
return
}
func (d *Dao) RankAppOrigin(c context.Context) (aids []int64, others, scores map[int64]int64, err error) {
var res struct {
Code int `json:"code"`
List []struct {
Aid int64 `json:"aid"`
Score int64 `json:"score"`
Others []struct {
Aid int64 `json:"aid"`
Score int64 `json:"score"`
} `json:"others"`
} `json:"list"`
}
if err = d.client.Get(c, d.rankOriginAppUrl, "", nil, &res); err != nil {
log.Error("recommend Origin rank hots url(%s) error(%v)", d.rankOriginAppUrl, err)
return
}
if res.Code != 0 && res.Code != -1 {
log.Error("recommend Origin rank hots url(%s) error(%v)", d.rankOriginAppUrl, res.Code)
err = fmt.Errorf("recommend Origin rank hots api response code(%v)", res)
return
}
scores = map[int64]int64{}
others = map[int64]int64{}
for _, arcs := range res.List {
aids = append(aids, arcs.Aid)
scores[arcs.Aid] = arcs.Score
for _, o := range arcs.Others {
aids = append(aids, o.Aid)
scores[o.Aid] = o.Score
others[o.Aid] = arcs.Aid
}
}
return
}
func (d *Dao) RankAppAll(c context.Context) (aids []int64, others, scores map[int64]int64, err error) {
var res struct {
Code int `json:"code"`
List []struct {
Aid int64 `json:"aid"`
Score int64 `json:"score"`
Others []struct {
Aid int64 `json:"aid"`
Score int64 `json:"score"`
} `json:"others"`
} `json:"list"`
}
if err = d.client.Get(c, d.rankAllAppUrl, "", nil, &res); err != nil {
log.Error("recommend All rank hots url(%s) error(%v)", d.rankAllAppUrl, err)
return
}
if res.Code != 0 && res.Code != -1 {
log.Error("recommend All rank hots url(%s) error(%v)", d.rankAllAppUrl, res.Code)
err = fmt.Errorf("recommend All rank hots api response code(%v)", res)
return
}
scores = map[int64]int64{}
others = map[int64]int64{}
for _, arcs := range res.List {
aids = append(aids, arcs.Aid)
scores[arcs.Aid] = arcs.Score
for _, o := range arcs.Others {
aids = append(aids, o.Aid)
scores[o.Aid] = o.Score
others[o.Aid] = arcs.Aid
}
}
return
}
func (d *Dao) RankAppBangumi(c context.Context) (aids []int64, others, scores map[int64]int64, err error) {
var res struct {
Code int `json:"code"`
List []struct {
Aid int64 `json:"aid"`
Score int64 `json:"score"`
Others []struct {
Aid int64 `json:"aid"`
Score int64 `json:"score"`
} `json:"others"`
} `json:"list"`
}
if err = d.client.Get(c, d.rankBangumiAppUrl, "", nil, &res); err != nil {
log.Error("recommend bangumi rank hots url(%s) error(%v)", d.rankBangumiAppUrl, err)
return
}
if res.Code != 0 && res.Code != -1 {
log.Error("recommend bangumi rank hots url(%s) error(%v)", d.rankBangumiAppUrl, res.Code)
err = fmt.Errorf("recommend bangumi rank hots api response code(%v)", res)
return
}
scores = map[int64]int64{}
others = map[int64]int64{}
for _, arcs := range res.List {
aids = append(aids, arcs.Aid)
scores[arcs.Aid] = arcs.Score
for _, o := range arcs.Others {
aids = append(aids, o.Aid)
scores[o.Aid] = o.Score
others[o.Aid] = arcs.Aid
}
}
return
}
func aidToInt(aidstr string) (aid int64) {
aid, _ = strconv.ParseInt(aidstr, 10, 64)
return
}
// HotTab hot tab
func (d *Dao) HotTab(c context.Context) (list []*recommend.List, err error) {
var res struct {
Code int `json:"code"`
List []*recommend.List `json:"list"`
}
if err = d.client.Get(c, d.hottabURL, "", nil, &res); err != nil {
log.Error("hottab hots url(%s) error(%v)", d.hottabURL, err)
return
}
b, _ := json.Marshal(&res)
log.Info("hottab list url(%s) response(%s)", d.hottabURL, b)
if res.Code != 0 {
err = ecode.Int(res.Code)
log.Error("hottab hots url(%s) code(%d)", d.hottabURL, res.Code)
return
}
list = res.List
return
}
// HotTenTab hot tab
func (d *Dao) HotTenTab(c context.Context, i int) (list []*recommend.List, err error) {
var res struct {
Code int `json:"code"`
List []*recommend.List `json:"list"`
}
if err = d.client.Get(c, fmt.Sprintf(d.hotHetongURL, i), "", nil, &res); err != nil {
err = errors.Wrap(err, fmt.Sprintf(d.hotHetongURL, i))
return
}
if res.Code != 0 {
err = errors.Wrap(err, fmt.Sprintf("code(%d)", res.Code))
return
}
list = res.List
return
}
// HotHeTongTabCard hot tab card
func (d *Dao) HotHeTongTabCard(c context.Context, i int) (list []*recommend.CardList, err error) {
var res struct {
Code int `json:"code"`
List []*recommend.CardList `json:"list"`
}
if err = d.client.Get(c, fmt.Sprintf(d.hotHeTongtabcardURL, i), "", nil, &res); err != nil {
err = errors.Wrap(err, fmt.Sprintf(d.hotHeTongtabcardURL, i))
return
}
if res.Code != 0 {
err = errors.Wrap(err, fmt.Sprintf("code(%d)", res.Code))
return
}
list = res.List
return
}

View File

@@ -0,0 +1,462 @@
package recommend
import (
"context"
"flag"
"fmt"
"os"
"strings"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
gock "gopkg.in/h2non/gock.v1"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.app-svr.app-show")
flag.Set("conf_token", "Pae4IDOeht4cHXCdOkay7sKeQwHxKOLA")
flag.Set("tree_id", "2687")
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")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
time.Sleep(time.Second)
}
func httpMock(method, url string) *gock.Request {
r := gock.New(url)
r.Method = strings.ToUpper(method)
return r
}
func TestHots(t *testing.T) {
Convey("Hots", t, func() {
d.clientAsyn.SetTransport(gock.DefaultTransport)
httpMock("GET", d.hotUrl).Reply(200).JSON(`{
"note": false,
"source_date": "2019-01-07",
"code": 0,
"num": 500,
"list": [{
"aid": 39185037,
"score": 176
}, {
"aid": 39658458,
"score": 174
}, {
"aid": 39532823,
"score": 168
}, {
"aid": 39477161,
"score": 168
}, {
"aid": 39852951,
"score": 168
}, {
"aid": 39672060,
"score": 168
}, {
"aid": 39832577,
"score": 168
}, {
"aid": 39987017,
"score": 168
}, {
"aid": 39700424,
"score": 163
}]
}`)
res, err := d.Hots(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRegion(t *testing.T) {
Convey("Region", t, func() {
d.clientAsyn.SetTransport(gock.DefaultTransport)
api := fmt.Sprintf(d.regionUrl, "33")
httpMock("GET", api).Reply(200).JSON(`{
"code": 0,
"list": [{
"aid": "39911001",
"score": 523
}, {
"aid": "39852951",
"score": 6732
}, {
"aid": "39845334",
"score": 31
}]
}`)
res, err := d.Region(ctx(), "33")
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRegionHots(t *testing.T) {
Convey("RegionHots", t, func() {
d.clientAsyn.SetTransport(gock.DefaultTransport)
api := fmt.Sprintf(d.rankRegionAppUrl, 1)
httpMock("GET", api).Reply(200).JSON(`{
"note": "统计3日内新投稿的数据综合得分每二十分钟更新一次。",
"source_date": "2019-01-07",
"code": 0,
"num": 100,
"list": [{
"aid": 39894949,
"mid": 808171,
"score": 546760
}, {
"aid": 39877679,
"mid": 7487399,
"score": 516724
}]
}`)
res, err := d.RegionHots(ctx(), 1)
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRegionList(t *testing.T) {
Convey("RegionList", t, func() {
d.client.SetTransport(gock.DefaultTransport)
httpMock("GET", d.regionListUrl).Reply(200).JSON(`{
"code": 0,
"list": [{
"aid": 39903065
}]
}`)
res, err := d.RegionList(ctx(), 1, 1, 1, 1, 1, "")
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRegionChildHots(t *testing.T) {
Convey("RegionChildHots", t, func() {
d.clientAsyn.SetTransport(gock.DefaultTransport)
api := fmt.Sprintf(d.regionChildHotUrl, 1)
httpMock("GET", api).Reply(200).JSON(`{
"code": 0,
"list": [{
"aid": 39903065
}]
}`)
res, err := d.RegionChildHots(ctx(), 1)
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRegionArcList(t *testing.T) {
Convey("RegionArcList", t, func() {
d.client.SetTransport(gock.DefaultTransport)
httpMock("GET", d.regionArcListUrl).Reply(200).JSON(`{
"code": 0,
"data": {
"archives": [{
"aid": 39903065
}]
}
}`)
res, err := d.RegionArcList(ctx(), 1, 1, 1, time.Now())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRankRegion(t *testing.T) {
Convey("RankRegion", t, func() {
d.clientAsyn.SetTransport(gock.DefaultTransport)
httpMock("GET", fmt.Sprintf(d.rankRegionUrl, "all", 1)).Reply(200).JSON(`{
"rank": {
"code": 0,
"list": [{
"aid": 39903065
}]
}
}`)
res, err := d.RankRegion(ctx(), 1, "all")
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRankAll(t *testing.T) {
Convey("RankAll", t, func() {
d.clientAsyn.SetTransport(gock.DefaultTransport)
httpMock("GET", fmt.Sprintf(d.rankOriginalUrl, "all")).Reply(200).JSON(`{
"rank": {
"code": 0,
"list": [{
"aid": 39903065
}]
}
}`)
res, err := d.RankAll(ctx(), "all")
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRankBangumi(t *testing.T) {
Convey("RankBangumi", t, func() {
d.clientAsyn.SetTransport(gock.DefaultTransport)
httpMock("GET", d.rankBangumilUrl).Reply(200).JSON(`{
"rank": {
"code": 0,
"list": [{
"aid": 39903065
}]
}
}`)
res, err := d.RankBangumi(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestFeedDynamic(t *testing.T) {
Convey("FeedDynamic", t, func() {
d.client.SetTransport(gock.DefaultTransport)
httpMock("GET", d.feedDynamicUrl).Reply(200).JSON(`{
"code": 0,
"data": [12587337, 1840325, 38132621, 5910308, 26879875, 26308630, 7348036, 1766719, 6374879, 24937721],
"hot": null,
"ctop": 12587337,
"cbottom": 24937721
}`)
_, newAids, _, _, err := d.FeedDynamic(ctx(), false, 1, 1, 1, 1, time.Now())
So(newAids, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRankAppRegion(t *testing.T) {
Convey("RankAppRegion", t, func() {
d.client.SetTransport(gock.DefaultTransport)
api := fmt.Sprintf(d.rankRegionAppUrl, 1)
httpMock("GET", api).Reply(200).JSON(`{
"note": "统计3日内新投稿的数据综合得分每二十分钟更新一次。",
"source_date": "2019-01-07",
"code": 0,
"num": 100,
"list": [{
"aid": 39954334,
"mid": 38125899,
"score": 509800,
"others": [{
"aid": 39903065,
"score": 48222
}]
}, {
"aid": 39953503,
"mid": 3969839,
"score": 430381
}]
}`)
res, _, _, err := d.RankAppRegion(ctx(), 1)
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRankAppOrigin(t *testing.T) {
Convey("RankAppOrigin", t, func() {
d.client.SetTransport(gock.DefaultTransport)
httpMock("GET", d.rankOriginAppUrl).Reply(200).JSON(`{
"note": "统计3日内新投稿的数据综合得分每二十分钟更新一次。",
"source_date": "2019-01-07",
"code": 0,
"num": 100,
"list": [{
"aid": 39954334,
"mid": 38125899,
"score": 509800,
"others": [{
"aid": 39903065,
"score": 48222
}]
}, {
"aid": 39953503,
"mid": 3969839,
"score": 430381
}]
}`)
res, _, _, err := d.RankAppOrigin(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRankAppAll(t *testing.T) {
Convey("RankAppAll", t, func() {
d.client.SetTransport(gock.DefaultTransport)
httpMock("GET", d.rankAllAppUrl).Reply(200).JSON(`{
"note": "统计3日内新投稿的数据综合得分每二十分钟更新一次。",
"source_date": "2019-01-07",
"code": 0,
"num": 100,
"list": [{
"aid": 39954334,
"mid": 38125899,
"score": 509800,
"others": [{
"aid": 39903065,
"score": 48222
}]
}, {
"aid": 39953503,
"mid": 3969839,
"score": 430381
}]
}`)
res, _, _, err := d.RankAppAll(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRankAppBangumi(t *testing.T) {
Convey("RankAppBangumi", t, func() {
d.client.SetTransport(gock.DefaultTransport)
httpMock("GET", d.rankBangumiAppUrl).Reply(200).JSON(`{
"note": "统计3日内新投稿的数据综合得分每二十分钟更新一次。",
"source_date": "2019-01-07",
"code": 0,
"num": 100,
"list": [{
"aid": 39954334,
"mid": 38125899,
"score": 509800,
"others": [{
"aid": 39903065,
"score": 48222
}]
}, {
"aid": 39953503,
"mid": 3969839,
"score": 430381
}]
}`)
res, _, _, err := d.RankAppBangumi(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestHotTab(t *testing.T) {
Convey("HotTab", t, func() {
d.client.SetTransport(gock.DefaultTransport)
httpMock("GET", d.hottabURL).Reply(200).JSON(`{
"note": false,
"source_date": "2019-01-07",
"code": 0,
"num": 100,
"list": [{
"aid": 40063426,
"mid": 837470,
"score": 764906,
"desc": "很多人分享",
"corner_mark": 0
}, {
"aid": 39425207,
"mid": 4870926,
"score": 690583,
"desc": "百万播放",
"corner_mark": 0
}]
}`)
res, err := d.HotTab(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestHotTenTab(t *testing.T) {
Convey("HotTenTab", t, func() {
d.client.SetTransport(gock.DefaultTransport)
httpMock("GET", fmt.Sprintf(d.hotHetongURL, 1)).Reply(200).JSON(`{
"note": false,
"source_date": "2019-01-07",
"code": 0,
"num": 100,
"list": [{
"aid": 40063426,
"mid": 837470,
"score": 764906,
"desc": "很多人分享",
"corner_mark": 0
}, {
"aid": 39425207,
"mid": 4870926,
"score": 690583,
"desc": "百万播放",
"corner_mark": 0
}]
}`)
res, err := d.HotTenTab(ctx(), 1)
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestHotHeTongTabCard(t *testing.T) {
Convey("HotHeTongTabCard", t, func() {
d.client.SetTransport(gock.DefaultTransport)
httpMock("GET", fmt.Sprintf(d.hotHeTongtabcardURL, 1)).Reply(200).JSON(`{
"code": 0,
"list": [{
"goto": "av",
"id": 40063426,
"from_type": "recommend",
"desc": "8千分享",
"corner_mark": 0
}, {
"goto": "av",
"id": 39425207,
"from_type": "recommend",
"desc": "百万播放",
"corner_mark": 0
}, {
"goto": "av",
"id": 39920213,
"from_type": "recommend",
"desc": "百万播放",
"corner_mark": 0
}, {
"goto": "av",
"id": 39237975,
"from_type": "recommend",
"desc": "百万播放",
"corner_mark": 0
}]
}`)
res, err := d.HotHeTongTabCard(ctx(), 1)
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,47 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["region_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["region.go"],
importpath = "go-common/app/interface/main/app-show/dao/region",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/interface/main/app-show/model/region:go_default_library",
"//library/database/sql:go_default_library",
"//library/log: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,150 @@
package region
import (
"context"
"go-common/app/interface/main/app-show/conf"
"go-common/app/interface/main/app-show/model/region"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
// region
_allSQL = "SELECT r.rid,r.reid,r.name,r.logo,r.rank,r.goto,r.param,r.plat,r.area,r.build,r.conditions,r.uri,r.is_logo,r.type,r.is_rank,l.name FROM region AS r, language AS l WHERE r.state=1 AND l.id=r.lang_id ORDER BY r.rank DESC"
_allSQL2 = "SELECT r.id,r.rid,r.reid,r.name,r.logo,r.rank,r.goto,r.param,r.plat,r.area,r.uri,r.is_logo,r.type,l.name FROM region_copy AS r, language AS l WHERE r.state=1 AND l.id=r.lang_id ORDER BY r.rank DESC"
_limitSQL = "SELECT l.id,l.rid,l.build,l.conditions FROM region_limit AS l,region_copy AS r WHERE l.rid=r.id"
_configSQL = "SELECT c.id,c.rid,c.is_rank FROM region_rank_config AS c,region_copy AS r WHERE c.rid=r.id"
//region android
_regionPlatSQL = "SELECT r.rid,r.reid,r.name,r.logo,r.rank,r.goto,r.param,r.plat,r.area,l.name FROM region_copy AS r, language AS l WHERE r.plat=0 AND r.state=1 AND l.id=r.lang_id ORDER BY r.rank DESC"
)
type Dao struct {
db *sql.DB
get *sql.Stmt
list *sql.Stmt
limit *sql.Stmt
config *sql.Stmt
regionPlat *sql.Stmt
}
func New(c *conf.Config) (d *Dao) {
d = &Dao{
db: sql.NewMySQL(c.MySQL.Show),
}
// prepare
d.get = d.db.Prepared(_allSQL)
d.list = d.db.Prepared(_allSQL2)
d.limit = d.db.Prepared(_limitSQL)
d.config = d.db.Prepared(_configSQL)
d.regionPlat = d.db.Prepared(_regionPlatSQL)
return
}
// GetAll get all region.
func (d *Dao) All(ctx context.Context) ([]*region.Region, error) {
rows, err := d.get.Query(ctx)
if err != nil {
log.Error("mysqlDB.Query error(%v)", err)
return nil, err
}
defer rows.Close()
apps := []*region.Region{}
for rows.Next() {
a := &region.Region{}
if err = rows.Scan(&a.Rid, &a.Reid, &a.Name, &a.Logo, &a.Rank, &a.Goto, &a.Param, &a.Plat, &a.Area, &a.Build, &a.Condition, &a.URI, &a.Islogo, &a.Rtype, &a.Entrance, &a.Language); err != nil {
log.Error("row.Scan error(%v)", err)
return nil, err
}
apps = append(apps, a)
}
return apps, err
}
// RegionPlat get android
func (d *Dao) RegionPlat(ctx context.Context) ([]*region.Region, error) {
rows, err := d.regionPlat.Query(ctx)
if err != nil {
log.Error("mysqlDB.Query error(%v)", err)
return nil, err
}
defer rows.Close()
apps := []*region.Region{}
for rows.Next() {
a := &region.Region{}
if err = rows.Scan(&a.Rid, &a.Reid, &a.Name, &a.Logo, &a.Rank, &a.Goto, &a.Param, &a.Plat, &a.Area, &a.Language); err != nil {
log.Error("row.Scan error(%v)", err)
return nil, err
}
apps = append(apps, a)
}
return apps, err
}
// AllList get all region.
func (d *Dao) AllList(ctx context.Context) ([]*region.Region, error) {
rows, err := d.list.Query(ctx)
if err != nil {
log.Error("mysqlDB.Query error(%v)", err)
return nil, err
}
defer rows.Close()
apps := []*region.Region{}
for rows.Next() {
a := &region.Region{}
if err = rows.Scan(&a.ID, &a.Rid, &a.Reid, &a.Name, &a.Logo, &a.Rank, &a.Goto, &a.Param, &a.Plat, &a.Area, &a.URI, &a.Islogo, &a.Rtype, &a.Language); err != nil {
log.Error("row.Scan error(%v)", err)
return nil, err
}
apps = append(apps, a)
}
return apps, err
}
// Limit region limits
func (d *Dao) Limit(ctx context.Context) (map[int64][]*region.Limit, error) {
rows, err := d.limit.Query(ctx)
if err != nil {
log.Error("mysqlDB.Query error(%v)", err)
return nil, err
}
defer rows.Close()
limits := map[int64][]*region.Limit{}
for rows.Next() {
a := &region.Limit{}
if err = rows.Scan(&a.ID, &a.Rid, &a.Build, &a.Condition); err != nil {
log.Error("rows.Scan error(%v)", err)
return nil, err
}
limits[a.Rid] = append(limits[a.Rid], a)
}
return limits, err
}
// Config region configs
func (d *Dao) Config(ctx context.Context) (map[int64][]*region.Config, error) {
rows, err := d.config.Query(ctx)
if err != nil {
log.Error("mysqlDB.Query error(%v)", err)
return nil, err
}
defer rows.Close()
configs := map[int64][]*region.Config{}
for rows.Next() {
a := &region.Config{}
if err = rows.Scan(&a.ID, &a.Rid, &a.ScenesID); err != nil {
log.Error("rows.Scan error(%v)", err)
return nil, err
}
a.ConfigChange()
configs[a.Rid] = append(configs[a.Rid], a)
}
return configs, err
}
// Close close memcache resource.
func (dao *Dao) Close() {
if dao.db != nil {
dao.db.Close()
}
}

View File

@@ -0,0 +1,75 @@
package region
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-show-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestAll(t *testing.T) {
Convey("All", t, func() {
res, err := d.All(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestRegionPlat(t *testing.T) {
Convey("RegionPlat", t, func() {
res, err := d.RegionPlat(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestAllList(t *testing.T) {
Convey("AllList", t, func() {
res, err := d.AllList(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestLimit(t *testing.T) {
Convey("Limit", t, func() {
res, err := d.Limit(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestConfig(t *testing.T) {
Convey("Config", t, func() {
res, err := d.Config(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestClose(t *testing.T) {
Convey("Close", t, func() {
d.Close()
})
}

View File

@@ -0,0 +1,47 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["relation_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["relation.go"],
importpath = "go-common/app/interface/main/app-show/dao/relation",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/service/main/relation/model:go_default_library",
"//app/service/main/relation/rpc/client:go_default_library",
"//library/log: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,52 @@
package relation
import (
"context"
"go-common/app/interface/main/app-show/conf"
relation "go-common/app/service/main/relation/model"
relrpc "go-common/app/service/main/relation/rpc/client"
"go-common/library/log"
)
// Dao is rpc dao.
type Dao struct {
// relation rpc
relRPC *relrpc.Service
}
// New new a relation dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// relation rpc
relRPC: relrpc.New(c.RelationRPC),
}
return
}
// Relations fids relations
func (d *Dao) Relations(ctx context.Context, mid int64, fids []int64) (res map[int64]*relation.Following, err error) {
arg := &relation.ArgRelations{
Mid: mid,
Fids: fids,
}
if res, err = d.relRPC.Relations(ctx, arg); err != nil {
log.Error("d.relRPC.Relations(%v) error(%v)", arg, err)
res = nil
return
}
return
}
// Stats fids stats
func (d *Dao) Stats(ctx context.Context, mids []int64) (res map[int64]*relation.Stat, err error) {
arg := &relation.ArgMids{
Mids: mids,
}
if res, err = d.relRPC.Stats(ctx, arg); err != nil {
log.Error("d.relRPC.Stats(%v) error(%v)", arg, err)
res = nil
return
}
return
}

View File

@@ -0,0 +1,44 @@
package relation
import (
"context"
"flag"
"go-common/app/interface/main/app-show/conf"
"path/filepath"
"testing"
"time"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func init() {
dir, _ := filepath.Abs("../../cmd/app-show-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func ctx() context.Context {
return context.Background()
}
func TestRelations(t *testing.T) {
Convey("get Relations all", t, func() {
res, err := d.Relations(ctx(), 0, []int64{0})
So(err, ShouldBeNil)
So(res, ShouldNotBeEmpty)
})
}
func TestStats(t *testing.T) {
Convey("get Stats all", t, func() {
res, err := d.Stats(ctx(), []int64{0})
So(err, ShouldBeNil)
So(res, ShouldNotBeEmpty)
})
}

View File

@@ -0,0 +1,47 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["resource_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["resource.go"],
importpath = "go-common/app/interface/main/app-show/dao/resource",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/service/main/resource/model:go_default_library",
"//app/service/main/resource/rpc/client:go_default_library",
"//library/log: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,51 @@
package resource
import (
"context"
"go-common/app/interface/main/app-show/conf"
resource "go-common/app/service/main/resource/model"
resrpc "go-common/app/service/main/resource/rpc/client"
"go-common/library/log"
)
type Dao struct {
c *conf.Config
// rpc
resRpc *resrpc.Service
}
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
// rpc
resRpc: resrpc.New(c.ResourceRPC),
}
return
}
func (d *Dao) ResBanner(ctx context.Context, plat int8, build int, mid int64, resIDStr, channel, ip, buvid, network, mobiApp, device, adExtra string, isAd bool) (res map[int][]*resource.Banner, err error) {
arg := &resource.ArgBanner{
Plat: plat,
ResIDs: resIDStr,
Build: build,
MID: mid,
Channel: channel,
IP: ip,
Buvid: buvid,
Network: network,
MobiApp: mobiApp,
Device: device,
IsAd: isAd,
AdExtra: adExtra,
}
var bs *resource.Banners
if bs, err = d.resRpc.Banners(ctx, arg); err != nil || bs == nil {
log.Error("d.resRpc.Banners(%v) error(%v)", arg, err)
return
}
if len(bs.Banner) > 0 {
res = bs.Banner
}
return
}

View File

@@ -0,0 +1,37 @@
package resource
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-show-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestResBanner(t *testing.T) {
Convey("ResBanner", t, func() {
res, err := d.ResBanner(ctx(), 1, 1, 1, "", "", "", "", "", "", "", "", false)
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,46 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["search_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["search.go"],
importpath = "go-common/app/interface/main/app-show/dao/search",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf: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,93 @@
package search
import (
"context"
"encoding/json"
"fmt"
"net/url"
"strconv"
"time"
"go-common/app/interface/main/app-show/conf"
"go-common/library/log"
httpx "go-common/library/net/http/blademaster"
)
const (
_search = "/cate/search"
)
// Dao is search dao.
type Dao struct {
client *httpx.Client
searchURL string
// search duration
searchTick string
}
//New recommend dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
client: httpx.NewClient(conf.Conf.HTTPClient),
searchURL: c.Host.Search + _search,
searchTick: c.Duration.Search,
}
return
}
// SearchList
func (d *Dao) SearchList(c context.Context, rid, build, pn, ps int, mid int64, ts time.Time, ip, order, tagName, platform, mobiApp, device string) (arcids []int64, err error) {
advance, _ := time.ParseDuration(d.searchTick) // three weeks -504h
starttime := ts.Add(advance)
params := url.Values{}
params.Set("platform", platform)
params.Set("mobi_app", mobiApp)
params.Set("device", device)
params.Set("order", order)
params.Set("page", strconv.Itoa(pn))
params.Set("pagesize", strconv.Itoa(ps))
params.Set("time_from", starttime.Format("20060102"))
params.Set("time_to", ts.Format("20060102"))
params.Set("build", strconv.Itoa(build))
params.Set("userid", strconv.FormatInt(mid, 10))
params.Set("search_type", "video")
params.Set("view_type", "hot_rank")
params.Set("clientip", ip)
if tagName != "" {
params.Set("keyword", tagName)
}
params.Set("cate_id", strconv.Itoa(rid))
var res struct {
Code int `json:"code"`
Data []struct {
Aid interface{} `json:"id"`
} `json:"result"`
}
if err = d.client.Get(c, d.searchURL, "", params, &res); err != nil {
log.Error("search news url(%s) error(%v)", d.searchURL+"?"+params.Encode(), err)
return
}
b, _ := json.Marshal(&res)
log.Info("search list url(%v) response(%s)", d.searchURL+"?"+params.Encode(), b)
if res.Code != 0 && res.Code != -1 {
log.Error("search region news url(%s) error(%v)", d.searchURL+"?"+params.Encode(), res.Code)
err = fmt.Errorf("search region news api response code(%v)", res)
return
}
for _, arcs := range res.Data {
var aidInt int64
switch aid := arcs.Aid.(type) {
case string:
aidInt = aidToInt(aid)
case float64:
aidInt = int64(aid)
}
arcids = append(arcids, aidInt)
}
return
}
func aidToInt(aidstr string) (aid int64) {
aid, _ = strconv.ParseInt(aidstr, 10, 64)
return
}

View File

@@ -0,0 +1,52 @@
package search
import (
"context"
"flag"
"os"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.app-svr.app-show")
flag.Set("conf_token", "Pae4IDOeht4cHXCdOkay7sKeQwHxKOLA")
flag.Set("tree_id", "2687")
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/convey-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
//d.bfsClient.SetTransport(gock.DefaultTransport)
m.Run()
os.Exit(0)
}
func TestSearchList(t *testing.T) {
Convey("SearchList", t, func() {
_, err := d.SearchList(ctx(), 1, 1, 1, 1, 1, time.Now(), "127.0.0.1", "", "", "", "", "")
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,52 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["show_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"redis.go",
"show.go",
],
importpath = "go-common/app/interface/main/app-show/dao/show",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/interface/main/app-show/model/show:go_default_library",
"//library/cache/redis:go_default_library",
"//library/database/sql:go_default_library",
"//library/log: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,54 @@
package show
import (
"context"
"time"
"go-common/app/interface/main/app-show/conf"
"go-common/library/cache/redis"
"go-common/library/database/sql"
)
// Dao is show dao.
type Dao struct {
// mysql
db *sql.DB
getHead *sql.Stmt
getItem *sql.Stmt
getHeadTmp *sql.Stmt
getItemTmp *sql.Stmt
// redis
rcmmndRds *redis.Pool
rcmmndExp int
}
// New new a show dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// mysql
db: sql.NewMySQL(c.MySQL.Show),
// redis
rcmmndRds: redis.NewPool(c.Redis.Recommend.Config),
rcmmndExp: int(time.Duration(c.Redis.Recommend.Expire) / time.Second),
}
d.getHead = d.db.Prepared(_headSQL)
d.getItem = d.db.Prepared(_itemSQL)
d.getHeadTmp = d.db.Prepared(_headTmpSQL)
d.getItemTmp = d.db.Prepared(_itemTmpSQL)
return d
}
// Close close memcache resource.
func (d *Dao) Close() (err error) {
if d.rcmmndRds != nil {
return d.rcmmndRds.Close()
}
return nil
}
func (d *Dao) Ping(c context.Context) (err error) {
conn := d.rcmmndRds.Get(c)
_, err = conn.Do("SET", "PING", "PONG")
conn.Close()
return
}

View File

@@ -0,0 +1,95 @@
package show
import (
"context"
"go-common/library/log"
"go-common/library/cache/redis"
)
const (
_prefix = "s_"
)
func keyRcmmd(mid string) string {
return _prefix + mid
}
func keyCnt(mid string) string {
return _prefix + mid + "_c"
}
// ExistRcmmndCache check recommend cache exists.
func (d *Dao) ExistRcmmndCache(c context.Context, mid string) (exist bool, err error) {
conn := d.rcmmndRds.Get(c)
defer conn.Close()
key := keyCnt(mid)
exist, err = redis.Bool(conn.Do("EXISTS", key))
if err != nil {
log.Error("conn.Do(EXISTS, %s) error(%v)", key, err)
}
return
}
// AddRcmmndCache add recommend cache.
func (d *Dao) AddRcmmndCache(c context.Context, mid string, aids ...int64) (err error) {
conn := d.rcmmndRds.Get(c)
defer conn.Close()
key := keyRcmmd(mid)
cntk := keyCnt(mid)
args := redis.Args{}.Add(key).AddFlat(aids)
conn.Send("RPUSH", args...)
conn.Send("EXPIRE", key, d.rcmmndExp)
conn.Send("INCRBY", cntk, len(aids))
conn.Send("EXPIRE", cntk, d.rcmmndExp)
if err = conn.Flush(); err != nil {
log.Error("conn.Flush err(%v)", err)
return
}
if _, err = conn.Receive(); err != nil {
log.Error("conn.Receive() error(%v)", err)
return
}
if _, err = conn.Receive(); err != nil {
log.Error("conn.Receive() error(%v)", err)
return
}
if _, err = conn.Receive(); err != nil {
log.Error("conn.Receive() error(%v)", err)
return
}
if _, err = conn.Receive(); err != nil {
log.Error("conn.Receive() error(%v)", err)
}
return
}
// PopRcmmndCache pop recommend cache.
func (d *Dao) PopRcmmndCache(c context.Context, mid string, cnt int) (aids []int64, err error) {
conn := d.rcmmndRds.Get(c)
defer conn.Close()
key := keyRcmmd(mid)
for i := 0; i < cnt; i++ {
conn.Send("LPOP", key)
}
if err = conn.Flush(); err != nil {
log.Error("conn.Flush error(%v)", err)
return
}
var aid int64
for i := 0; i < cnt; i++ {
aid, err = redis.Int64(conn.Receive())
if err != nil {
if err == redis.ErrNil {
err = nil
continue
} else {
log.Error("conn.Do(ZREVRANGE, %v)", err)
}
return
}
aids = append(aids, aid)
}
return
}

View File

@@ -0,0 +1,98 @@
package show
import (
"context"
"go-common/app/interface/main/app-show/model/show"
"go-common/library/log"
)
const (
// real data
_headSQL = "SELECT s.id,s.plat,s.title,s.type,s.param,s.style,s.rank,s.build,s.conditions,l.name FROM show_head AS s,language AS l WHERE l.id=s.lang_id ORDER BY rank DESC"
_itemSQL = "SELECT sid,title,random,cover,param FROM show_item"
// temp preview
_headTmpSQL = "SELECT s.id,s.plat,s.title,s.type,s.param,s.style,s.rank,s.build,s.conditions,l.name FROM show_head_temp AS s,language AS l WHERE l.id=s.lang_id ORDER BY rank DESC"
_itemTmpSQL = "SELECT sid,title,random,cover,param FROM show_item_temp"
)
// Heads get show head data.
func (d *Dao) Heads(ctx context.Context) (heads map[int8][]*show.Head, err error) {
rows, err := d.getHead.Query(ctx)
if err != nil {
log.Error("d.getItem.Query() error(%v)", err)
return
}
defer rows.Close()
heads = make(map[int8][]*show.Head, 20)
for rows.Next() {
h := &show.Head{}
if err = rows.Scan(&h.ID, &h.Plat, &h.Title, &h.Type, &h.Param, &h.Style, &h.Rank, &h.Build, &h.Condition, &h.Language); err != nil {
log.Error("row.Scan error(%v)", err)
return nil, err
}
heads[h.Plat] = append(heads[h.Plat], h)
}
return
}
// Items get item data.
func (d *Dao) Items(ctx context.Context) (items map[int][]*show.Item, err error) {
rows, err := d.getItem.Query(ctx)
if err != nil {
log.Error("d.getItem.Query error(%v)", err)
return nil, err
}
defer rows.Close()
items = make(map[int][]*show.Item, 50)
for rows.Next() {
i := &show.Item{}
if err = rows.Scan(&i.Sid, &i.Title, &i.Random, &i.Cover, &i.Param); err != nil {
log.Error("row.Scan error(%v)", err)
return nil, err
}
items[i.Sid] = append(items[i.Sid], i)
}
return
}
// TempHeads get show temp head data.
func (d *Dao) TempHeads(ctx context.Context) (heads map[int8][]*show.Head, err error) {
rows, err := d.db.Query(ctx, _headTmpSQL)
if err != nil {
log.Error("d.tempHeads.Query() error(%v)", err)
return
}
defer rows.Close()
heads = make(map[int8][]*show.Head, 20)
for rows.Next() {
h := &show.Head{}
if err = rows.Scan(&h.ID, &h.Plat, &h.Title, &h.Type, &h.Param, &h.Style, &h.Rank, &h.Build, &h.Condition, &h.Language); err != nil {
log.Error("row.Scan error(%v)", err)
return nil, err
}
heads[h.Plat] = append(heads[h.Plat], h)
}
return
}
// TempItems get temp item data.
func (d *Dao) TempItems(ctx context.Context) (items map[int][]*show.Item, err error) {
rows, err := d.db.Query(ctx, _itemTmpSQL)
if err != nil {
log.Error("d.tempItems.Query error(%v)", err)
return nil, err
}
defer rows.Close()
items = make(map[int][]*show.Item, 50)
for rows.Next() {
i := &show.Item{}
if err = rows.Scan(&i.Sid, &i.Title, &i.Random, &i.Cover, &i.Param); err != nil {
log.Error("row.Scan error(%v)", err)
return nil, err
}
items[i.Sid] = append(items[i.Sid], i)
}
return
}

View File

@@ -0,0 +1,61 @@
package show
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-show-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestHeads(t *testing.T) {
Convey("Heads", t, func() {
res, err := d.Heads(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestItems(t *testing.T) {
Convey("Items", t, func() {
res, err := d.Items(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestTempHeads(t *testing.T) {
Convey("TempHeads", t, func() {
res, err := d.TempHeads(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestTempItems(t *testing.T) {
Convey("TempItems", t, func() {
res, err := d.TempItems(ctx())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,50 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["tag_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["tag.go"],
importpath = "go-common/app/interface/main/app-show/dao/tag",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/interface/main/app-show/model/region:go_default_library",
"//app/interface/main/app-show/model/tag:go_default_library",
"//app/interface/main/tag/model:go_default_library",
"//library/ecode: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,299 @@
package tag
import (
"context"
"fmt"
"net/url"
"strconv"
"time"
"go-common/app/interface/main/app-show/conf"
"go-common/app/interface/main/app-show/model/region"
"go-common/app/interface/main/app-show/model/tag"
tagm "go-common/app/interface/main/tag/model"
"go-common/library/ecode"
"go-common/library/log"
httpx "go-common/library/net/http/blademaster"
)
const (
_tagURL = "/x/internal/tag/info"
_tagHotURL = "/tag/hot/%d/%d.json"
_tagNewURL = "/x/internal/tag/ranking/archives"
_similarTagURL = "/x/internal/tag/similar"
_tagHotsIDURL = "/x/internal/tag/hots"
_similarTagChangeURL = "/x/internal/tag/change/similar"
_tagDetailURL = "/x/internal/tag/detail"
_tagRankingURL = "/x/internal/tag/detail/ranking"
_tagArchiveURL = "/x/internal/tag/archive/tags"
)
// Dao is tag dao.
type Dao struct {
client *httpx.Client
clientParam *httpx.Client
// url
tagURL string
tagHotURL string
tagNewURL string
similarTagURL string
tagHotsIDURL string
similarTagChangeURL string
tagDetailURL string
tagRankingURL string
tagArchiveURL string
}
// New tag dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
client: httpx.NewClient(conf.Conf.HTTPClient),
clientParam: httpx.NewClient(conf.Conf.HTTPClient),
tagURL: c.Host.ApiCo + _tagURL,
tagHotURL: c.Host.Hetongzi + _tagHotURL,
tagNewURL: c.Host.ApiCo + _tagNewURL,
similarTagURL: c.Host.ApiCo + _similarTagURL,
tagHotsIDURL: c.Host.ApiCo + _tagHotsIDURL,
similarTagChangeURL: c.Host.ApiCo + _similarTagChangeURL,
tagDetailURL: c.Host.ApiCo + _tagDetailURL,
tagRankingURL: c.Host.ApiCo + _tagRankingURL,
tagArchiveURL: c.Host.ApiCo + _tagArchiveURL,
}
return
}
// TagInfo get tag info.
func (d *Dao) TagInfo(c context.Context, mid int64, tagId int, now time.Time) (data *tag.Tag, err error) {
params := url.Values{}
params.Set("mid", strconv.FormatInt(mid, 10))
params.Set("tag_id", strconv.Itoa(tagId))
var res struct {
Code int `json:"code"`
Data *tag.Tag `json:"data"`
}
if err = d.client.Get(c, d.tagURL, "", params, &res); err != nil {
log.Error("tagInfo url(%s) error(%v)", d.tagURL+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
log.Error("tagInfo url(%s) error(%v)", d.tagURL+"?"+params.Encode(), res.Code)
err = fmt.Errorf("tagInfo api response code(%v)", res)
return
}
data = res.Data
return
}
// Hots
func (d *Dao) Hots(c context.Context, rid, tagId, pn, ps int, now time.Time) (data []int64, err error) {
var (
uri = fmt.Sprintf(d.tagHotURL, rid, tagId)
res struct {
Code int `json:"code"`
Data []int64 `json:"data"`
}
count int
start int
)
if err = d.clientParam.Get(c, uri, "", nil, &res); err != nil {
log.Error("d.paramclient.Get(%s) error(%v)", uri, err)
return
}
if res.Code != 0 {
log.Error("tag region hots url(%s) code:%d", uri, res.Code)
err = fmt.Errorf("tag region hots api response code(%v)", res)
return
}
count = len(res.Data)
if count == 0 {
return
}
start = (pn - 1) * ps
if start > count {
return
}
data = res.Data
return
}
// NewArcs
func (d *Dao) NewArcs(c context.Context, rid, tagId, pn, ps int, now time.Time) (arcids []int64, err error) {
params := url.Values{}
params.Set("rid", strconv.Itoa(rid))
params.Set("tag_id", strconv.Itoa(tagId))
params.Set("pn", strconv.Itoa(pn))
params.Set("ps", strconv.Itoa(ps))
var res struct {
Code int `json:"code"`
Data struct {
Archives []struct {
Aid int64 `json:"aid"`
} `json:"archives"`
} `json:"data"`
}
if err = d.client.Get(c, d.tagNewURL, "", params, &res); err != nil {
log.Error("tag region news url(%s) error(%v)", d.tagNewURL+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
log.Error("tag region news url(%s) error(%v)", d.tagNewURL+"?"+params.Encode(), res.Code)
err = fmt.Errorf("tag region news api response code(%v)", res)
return
}
for _, arcs := range res.Data.Archives {
arcids = append(arcids, arcs.Aid)
}
return
}
// SimilarTag tag similar
func (d *Dao) SimilarTag(c context.Context, rid, tagId int, now time.Time) (data []*region.SimilarTag, err error) {
params := url.Values{}
params.Set("rid", strconv.Itoa(rid))
params.Set("tid", strconv.Itoa(tagId))
var res struct {
Code int `json:"code"`
Data []*region.SimilarTag `json:"data"`
}
if err = d.client.Get(c, d.similarTagURL, "", params, &res); err != nil {
log.Error("tag similarTagURL url(%s) error(%v)", d.similarTagURL, err)
return
}
if res.Code != 0 {
log.Error("tag similarTagURL url(%s) Code(%v)", d.similarTagURL, res.Code)
err = fmt.Errorf("tag api response code(%v)", res)
return
}
data = res.Data
return
}
// TagHotsId
func (d *Dao) TagHotsId(c context.Context, rid int, now time.Time) (tags []*tag.Tag, err error) {
params := url.Values{}
params.Set("rid", strconv.Itoa(rid))
var res struct {
Code int `json:"code"`
Data []struct {
Rid int `json:"rid"`
Tags []*tag.Tag `json:"tags"`
} `json:"data"`
}
if err = d.client.Get(c, d.tagHotsIDURL, "", params, &res); err != nil {
log.Error("tag tagHotsIDURL url(%s) error(%v)", d.tagHotsIDURL, err)
return
}
if res.Code != 0 {
log.Error("tag tagHotsIDURL url(%s) Code(%v)", d.tagHotsIDURL, res.Code)
err = fmt.Errorf("tag api response code(%v)", res)
return
}
if len(res.Data) == 0 {
return
}
tags = res.Data[0].Tags
return
}
// SimilarTagChangetag tag similar no rid
func (d *Dao) SimilarTagChange(c context.Context, tagID int, now time.Time) (data []*region.SimilarTag, err error) {
params := url.Values{}
params.Set("tag_id", strconv.Itoa(tagID))
var res struct {
Code int `json:"code"`
Data []*region.SimilarTag `json:"data"`
}
if err = d.client.Get(c, d.similarTagChangeURL, "", params, &res); err != nil {
log.Error("tag similarTagChangeURL, url(%s) error(%v)", d.similarTagChangeURL+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
log.Error("tag similarTagChangeURL url(%s) Code(%v)", d.similarTagChangeURL+"?"+params.Encode(), res.Code)
err = fmt.Errorf("tag api response code(%v)", res)
return
}
data = res.Data
return
}
// Detail tag detail
func (d *Dao) Detail(c context.Context, tagID int, pn, ps int, now time.Time) (arcids []int64, err error) {
params := url.Values{}
params.Set("tag_id", strconv.Itoa(tagID))
params.Set("pn", strconv.Itoa(pn))
params.Set("ps", strconv.Itoa(ps))
var res struct {
Code int `json:"code"`
Data struct {
News struct {
Archives []struct {
Aid int64 `json:"aid"`
} `json:"archives"`
} `json:"news"`
} `json:"data"`
}
if err = d.client.Get(c, d.tagDetailURL, "", params, &res); err != nil {
log.Error("d.client.Get(%s) error(%v)", d.tagDetailURL+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
log.Error("tag Detail url(%s) Code(%v)", d.tagDetailURL, res.Code)
err = fmt.Errorf("tag api response code(%v)", res)
return
}
for _, arcs := range res.Data.News.Archives {
arcids = append(arcids, arcs.Aid)
}
return
}
// DetailRanking tag detail ranking
func (d *Dao) DetailRanking(c context.Context, reid, tagID int, pn, ps int, now time.Time) (arcids []int64, err error) {
params := url.Values{}
params.Set("prid", strconv.Itoa(reid))
params.Set("tag_id", strconv.Itoa(tagID))
params.Set("pn", strconv.Itoa(pn))
params.Set("ps", strconv.Itoa(ps))
var res struct {
Code int `json:"code"`
Data struct {
Archives []struct {
Aid int64 `json:"aid"`
} `json:"archives"`
} `json:"data"`
}
if err = d.client.Get(c, d.tagRankingURL, "", params, &res); err != nil {
log.Error("d.client.Get(%s) error(%v)", d.tagRankingURL+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
log.Error("tag DetailRanking url(%s) Code(%v)", d.tagRankingURL+"?"+params.Encode(), res.Code)
err = fmt.Errorf("tag api response code(%v)", res)
return
}
for _, arcs := range res.Data.Archives {
arcids = append(arcids, arcs.Aid)
}
return
}
// TagArchive archive tags
func (d *Dao) TagArchive(c context.Context, aid int64) (data []*tagm.Tag, err error) {
params := url.Values{}
params.Set("aid", strconv.FormatInt(aid, 10))
var res struct {
Code int `json:"code"`
Data []*tagm.Tag `json:"data"`
}
if err = d.client.Get(c, d.tagArchiveURL, "", params, &res); err != nil {
log.Error("TagArchive url(%s) error(%v)", d.tagArchiveURL+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
log.Error("TagArchive url(%s) error(%v)", d.tagArchiveURL+"?"+params.Encode(), res.Code)
err = ecode.Int(res.Code)
return
}
data = res.Data
return
}

View File

@@ -0,0 +1,93 @@
package tag
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-show/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func ctx() context.Context {
return context.Background()
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-show-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(time.Second)
}
func TestTagInfo(t *testing.T) {
Convey("TagInfo", t, func() {
res, err := d.TagInfo(ctx(), 1, 1, time.Now())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestHots(t *testing.T) {
Convey("Hots", t, func() {
res, err := d.Hots(ctx(), 1, 1, 1, 1, time.Now())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestNewArcs(t *testing.T) {
Convey("NewArcs", t, func() {
res, err := d.NewArcs(ctx(), 1, 1, 1, 1, time.Now())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestSimilarTag(t *testing.T) {
Convey("SimilarTag", t, func() {
res, err := d.SimilarTag(ctx(), 1, 1, time.Now())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestTagHotsId(t *testing.T) {
Convey("TagHotsId", t, func() {
res, err := d.TagHotsId(ctx(), 1, time.Now())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestSimilarTagChange(t *testing.T) {
Convey("SimilarTagChange", t, func() {
res, err := d.SimilarTagChange(ctx(), 1, time.Now())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestDetail(t *testing.T) {
Convey("Detail", t, func() {
res, err := d.Detail(ctx(), 1, 1, 1, time.Now())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}
func TestDetailRanking(t *testing.T) {
Convey("DetailRanking", t, func() {
res, err := d.DetailRanking(ctx(), 1, 1, 1, 1, time.Now())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,54 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"banner.go",
"daily.go",
"http.go",
"local.go",
"rank.go",
"region.go",
"show.go",
],
importpath = "go-common/app/interface/main/app-show/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/conf:go_default_library",
"//app/interface/main/app-show/model:go_default_library",
"//app/interface/main/app-show/model/region:go_default_library",
"//app/interface/main/app-show/model/show:go_default_library",
"//app/interface/main/app-show/service/banner:go_default_library",
"//app/interface/main/app-show/service/daily:go_default_library",
"//app/interface/main/app-show/service/ping:go_default_library",
"//app/interface/main/app-show/service/rank:go_default_library",
"//app/interface/main/app-show/service/region:go_default_library",
"//app/interface/main/app-show/service/show:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/auth:go_default_library",
"//library/net/http/blademaster/render:go_default_library",
"//library/net/metadata: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,32 @@
package http
import (
"strconv"
"go-common/app/interface/main/app-show/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
// banners get banners.
func banners(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
buildStr := params.Get("build")
channel := params.Get("channel")
module := params.Get("module")
position := params.Get("position")
// check param
device := params.Get("device")
plat := model.Plat(mobiApp, device)
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
data := bannerSvc.Display(c, plat, build, channel, module, position, mobiApp)
returnJSON(c, data, nil)
}

View File

@@ -0,0 +1,104 @@
package http
import (
"strconv"
"go-common/app/interface/main/app-show/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func dailyID(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
device := params.Get("device")
buildStr := params.Get("build")
pnStr := params.Get("pn")
psStr := params.Get("ps")
dailyIDStr := params.Get("daily_id")
dailyID, err := strconv.Atoi(dailyIDStr)
if err != nil {
log.Error("dailyID(%s) error(%v)", dailyIDStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
plat := model.Plat(mobiApp, device)
pn, err := strconv.Atoi(pnStr)
if err != nil || pn < 1 {
pn = 1
}
ps, err := strconv.Atoi(psStr)
if err != nil || ps > 60 || ps <= 0 {
ps = 60
}
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
data := dailySvc.Daily(c, plat, build, dailyID, pn, ps)
returnJSON(c, data, nil)
}
func columnList(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
device := params.Get("device")
buildStr := params.Get("build")
categoryIDStr := params.Get("category_id")
categoryID, err := strconv.Atoi(categoryIDStr)
if err != nil {
log.Error("categoryID(%s) error(%v)", categoryIDStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
plat := model.Plat(mobiApp, device)
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
data := dailySvc.ColumnList(plat, build, categoryID)
returnJSON(c, data, nil)
}
func category(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
device := params.Get("device")
buildStr := params.Get("build")
categoryIDStr := params.Get("category_id")
columnIDStr := params.Get("column_id")
pnStr := params.Get("pn")
psStr := params.Get("ps")
categoryID, err := strconv.Atoi(categoryIDStr)
if err != nil {
log.Error("categoryID(%s) error(%v)", categoryIDStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
columnID, _ := strconv.Atoi(columnIDStr)
plat := model.Plat(mobiApp, device)
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
pn, err := strconv.Atoi(pnStr)
if err != nil || pn < 1 {
pn = 1
}
ps, err := strconv.Atoi(psStr)
if err != nil || ps > 60 || ps <= 0 {
ps = 60
}
data := dailySvc.Category(plat, build, categoryID, columnID, pn, ps)
returnJSON(c, data, nil)
}

View File

@@ -0,0 +1,139 @@
package http
import (
"net/http"
"go-common/app/interface/main/app-show/conf"
"go-common/app/interface/main/app-show/service/banner"
"go-common/app/interface/main/app-show/service/daily"
pingSvr "go-common/app/interface/main/app-show/service/ping"
"go-common/app/interface/main/app-show/service/rank"
"go-common/app/interface/main/app-show/service/region"
"go-common/app/interface/main/app-show/service/show"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/auth"
"go-common/library/net/http/blademaster/render"
)
var (
// depend service
authSvc *auth.Auth
// self service
bannerSvc *banner.Service
regionSvc *region.Service
showSvc *show.Service
pingSvc *pingSvr.Service
rankSvc *rank.Service
dailySvc *daily.Service
)
func Init(c *conf.Config) {
initService(c)
// init external router
engineOut := bm.DefaultServer(c.BM.Outer)
outerRouter(engineOut)
// init Outer server
if err := engineOut.Start(); err != nil {
log.Error("engineOut.Start() error(%v) | config(%v)", err, c)
panic(err)
}
}
// initService init services.
func initService(c *conf.Config) {
authSvc = auth.New(nil)
bannerSvc = banner.New(c)
regionSvc = region.New(c)
showSvc = show.New(c)
pingSvc = pingSvr.New(c)
rankSvc = rank.New(c)
dailySvc = daily.New(c)
}
// outerRouter init outer router api path.
func outerRouter(e *bm.Engine) {
e.Ping(ping)
bnnr := e.Group("/x/v2/banner", authSvc.GuestMobile)
{
bnnr.GET("", banners)
}
region := e.Group("/x/v2/region", authSvc.GuestMobile)
{
region.GET("", regions)
region.GET("/list", regionsList)
region.GET("/index", regionsIndex)
region.GET("/show", regionShow)
region.GET("/show/dynamic", regionShowDynamic)
region.GET("/show/child", regionChildShow)
region.GET("/show/child/list", regionChildListShow)
region.GET("/dynamic", regionDynamic)
region.GET("/dynamic/list", regionDynamicList)
region.GET("/dynamic/child", regionDynamicChild)
region.GET("/dynamic/child/list", regionDynamicChildList)
}
rank := e.Group("/x/v2/rank", authSvc.GuestMobile)
{
rank.GET("", rankAll)
rank.GET("/region", rankRegion)
}
show := e.Group("/x/v2/show", authSvc.GuestMobile)
{
show.GET("", shows)
show.GET("/region", showsRegion)
show.GET("/index", showsIndex)
show.GET("/widget", showWidget)
show.GET("/temp", showTemps)
show.GET("/change", showChange)
show.GET("/change/live", showLiveChange)
show.GET("/change/region", showRegionChange)
show.GET("/change/bangumi", showBangumiChange)
show.GET("/change/dislike", showDislike)
show.GET("/change/article", showArticleChange)
show.GET("/popular", popular)
show.GET("/popular/index", popular2)
}
daily := e.Group("/x/v2/daily", authSvc.GuestMobile)
{
daily.GET("/list", dailyID)
}
column := e.Group("/x/v2/column", authSvc.GuestMobile)
{
column.GET("", columnList)
}
cg := e.Group("/x/v2/category", authSvc.GuestMobile)
{
cg.GET("", category)
}
}
//returnJSON return json no message
func returnJSON(c *bm.Context, data interface{}, err error) {
code := http.StatusOK
c.Error = err
bcode := ecode.Cause(err)
c.Render(code, render.JSON{
Code: bcode.Code(),
Message: "",
Data: data,
})
}
//returnDataJSON return json no message
func returnDataJSON(c *bm.Context, data map[string]interface{}, ttl int, err error) {
code := http.StatusOK
if ttl < 1 {
ttl = 1
}
if err != nil {
c.JSON(nil, err)
} else {
if data != nil {
data["code"] = 0
data["message"] = ""
data["ttl"] = ttl
}
c.Render(code, render.MapJSON(data))
}
}

View File

@@ -0,0 +1,17 @@
package http
import (
"net/http"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
// ping check server ok.
func ping(c *bm.Context) {
var err error
if err = pingSvc.Ping(c); err != nil {
log.Error("app-show service ping error(%v)", err)
c.AbortWithStatus(http.StatusServiceUnavailable)
}
}

View File

@@ -0,0 +1,86 @@
package http
import (
"strconv"
"go-common/app/interface/main/app-show/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func rankAll(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
device := params.Get("device")
order := params.Get("order")
buildStr := params.Get("build")
pnStr := params.Get("pn")
psStr := params.Get("ps")
plat := model.Plat(mobiApp, device)
pn, err := strconv.Atoi(pnStr)
if err != nil || pn < 1 {
pn = 1
}
ps, err := strconv.Atoi(psStr)
if err != nil || ps > 100 || ps <= 0 {
ps = 100
}
if ((pn-1)*ps)+1 > 100 {
returnJSON(c, _emptyShowItems, nil)
return
}
build, _ := strconv.Atoi(buildStr)
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
// GetAudit
if audit, ok := rankSvc.Audit(c, mobiApp, order, plat, build, 0); ok {
returnJSON(c, audit, nil)
} else {
data := rankSvc.RankShow(c, plat, 0, pn, ps, mid, order)
returnJSON(c, data, nil)
}
}
func rankRegion(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
device := params.Get("device")
ridStr := params.Get("rid")
buildStr := params.Get("build")
pnStr := params.Get("pn")
psStr := params.Get("ps")
plat := model.Plat(mobiApp, device)
rid, err := strconv.Atoi(ridStr)
if err != nil {
log.Error("ridStr(%s) error(%v)", ridStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
pn, err := strconv.Atoi(pnStr)
if err != nil || pn < 1 {
pn = 1
}
ps, err := strconv.Atoi(psStr)
if err != nil || ps > 100 || ps <= 0 {
ps = 100
}
if ((pn-1)*ps)+1 > 100 {
returnJSON(c, _emptyShowItems, nil)
return
}
build, _ := strconv.Atoi(buildStr)
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
// GetAudit
if audit, ok := rankSvc.Audit(c, mobiApp, "all", plat, build, rid); ok {
returnJSON(c, audit, nil)
} else {
data := rankSvc.RankShow(c, plat, rid, pn, ps, mid, "all")
returnJSON(c, data, nil)
}
}

View File

@@ -0,0 +1,477 @@
package http
import (
"strconv"
"time"
"go-common/app/interface/main/app-show/model"
"go-common/app/interface/main/app-show/model/region"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
var (
_emptyShowItems = []*region.ShowItem{}
)
// regions get region data
func regions(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
buildStr := params.Get("build")
language := params.Get("lang")
ver := params.Get("ver")
// check params
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
device := params.Get("device")
plat := model.Plat(mobiApp, device)
data, version, err := regionSvc.Regions(c, plat, build, ver, mobiApp, device, language)
if err == ecode.NotModified {
c.JSON(nil, err)
return
}
res := map[string]interface{}{
"data": data,
"ver": version,
}
returnDataJSON(c, res, 1, nil)
}
// regions get region data
func regionsList(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
buildStr := params.Get("build")
language := params.Get("lang")
entrance := params.Get("entrance")
ver := params.Get("ver")
// check params
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
device := params.Get("device")
plat := model.Plat(mobiApp, device)
data, version, err := regionSvc.RegionsList(c, plat, build, ver, mobiApp, device, language, entrance)
if err == ecode.NotModified {
c.JSON(nil, err)
return
}
res := map[string]interface{}{
"data": data,
"ver": version,
}
returnDataJSON(c, res, 1, nil)
}
// regions get region data
func regionsIndex(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
buildStr := params.Get("build")
language := params.Get("lang")
ver := params.Get("ver")
// check params
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
device := params.Get("device")
plat := model.Plat(mobiApp, device)
data, version, err := regionSvc.NewRegionList(c, plat, build, ver, mobiApp, device, language)
if err == ecode.NotModified {
c.JSON(nil, err)
return
}
res := map[string]interface{}{
"data": data,
"ver": version,
}
returnDataJSON(c, res, 1, nil)
}
// regionShow region show
func regionShow(c *bm.Context) {
header := c.Request.Header
params := c.Request.Form
mobiApp := params.Get("mobi_app")
ridStr := params.Get("rid")
buildStr := params.Get("build")
channel := params.Get("channel")
network := params.Get("network")
// check params
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
rid, err := strconv.Atoi(ridStr)
if err != nil {
log.Error("ridStr(%s) error(%v)", ridStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
buvid := header.Get(_headerBuvid)
device := params.Get("device")
plat := model.Plat(mobiApp, device)
adExtra := params.Get("ad_extra")
// GetAudit
if audit, ok := regionSvc.Audit(c, mobiApp, plat, build, rid, true); ok {
returnJSON(c, audit, nil)
} else {
mobiApp = model.MobiAPPBuleChange(mobiApp)
data := regionSvc.Show(c, plat, rid, build, mid, channel, buvid, network, mobiApp, device, adExtra)
returnJSON(c, data, nil)
}
}
// regionChildShow region childShow
func regionChildShow(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
ridStr := params.Get("rid")
tagIDStr := params.Get("tag_id")
buildStr := params.Get("build")
channel := params.Get("channel")
// check params
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
rid, err := strconv.Atoi(ridStr)
if err != nil {
log.Error("ridStr(%s) error(%v)", ridStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
var (
mid int64
tagID int
)
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
if tagIDStr != "" {
if tagID, err = strconv.Atoi(tagIDStr); err != nil {
log.Error("tagId(%s) error(%v)", tagID, err)
c.JSON(nil, ecode.RequestErr)
return
}
}
device := params.Get("device")
plat := model.Plat(mobiApp, device)
// GetAudit
if audit, ok := regionSvc.AuditChild(c, mobiApp, "default", plat, build, rid, tagID); ok {
returnJSON(c, audit, nil)
} else {
mobiApp = model.MobiAPPBuleChange(mobiApp)
data := regionSvc.ChildShow(c, plat, mid, rid, tagID, build, channel, mobiApp, time.Now())
returnJSON(c, data, nil)
}
}
// regionChildListShow region childlistShow
func regionChildListShow(c *bm.Context) {
params := c.Request.Form
ridStr := params.Get("rid")
tagIDStr := params.Get("tag_id")
mobiApp := params.Get("mobi_app")
pnStr := params.Get("pn")
// psStr := params.Get("ps")
orderStr := params.Get("order")
buildStr := params.Get("build")
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
rid, err := strconv.Atoi(ridStr)
if err != nil {
log.Error("ridStr(%s) error(%v)", ridStr, err)
return
}
var tagID int
if tagIDStr != "" {
if tagID, err = strconv.Atoi(tagIDStr); err != nil {
log.Error("tagId(%s) error(%v)", tagID, err)
c.JSON(nil, ecode.RequestErr)
return
}
}
pn, err := strconv.Atoi(pnStr)
if err != nil || pn < 1 {
pn = 1
}
// ps, err := strconv.Atoi(psStr)
// if err != nil || ps > 60 || ps <= 0 {
ps := 20
// }
if pn*ps > 400 {
returnJSON(c, _emptyShowItems, nil)
return
}
order := ""
switch orderStr {
case "view":
order = "click"
case "reply":
order = "scores"
case "danmaku":
order = "dm"
case "favorite":
order = "stow"
}
device := params.Get("device")
plat := model.Plat(mobiApp, device)
platform := params.Get("platform")
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
// GetAudit
if audit, ok := regionSvc.AuditChildList(c, mobiApp, order, plat, build, rid, tagID, pn, ps); ok {
returnJSON(c, audit, nil)
} else {
mobiApp = model.MobiAPPBuleChange(mobiApp)
data := regionSvc.ChildListShow(c, plat, rid, tagID, pn, ps, build, mid, order, platform, mobiApp, device)
returnJSON(c, data, nil)
}
}
// regionChildListShow region childlistShow
func regionShowDynamic(c *bm.Context) {
params := c.Request.Form
ridStr := params.Get("rid")
pnStr := params.Get("pn")
psStr := params.Get("ps")
rid, err := strconv.Atoi(ridStr)
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
buildStr := params.Get("build")
build, _ := strconv.Atoi(buildStr)
device := params.Get("device")
if err != nil {
log.Error("ridStr(%s) error(%v)", ridStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
pn, err := strconv.Atoi(pnStr)
if err != nil || pn < 1 {
pn = 1
}
ps, err := strconv.Atoi(psStr)
if err != nil || ps > 50 || ps <= 0 {
ps = 50
}
if pn*ps > 200 {
returnJSON(c, _emptyShowItems, nil)
return
}
plat := model.Plat(mobiApp, device)
data := regionSvc.ShowDynamic(c, plat, build, rid, pn, ps)
returnJSON(c, data, nil)
}
func regionDynamic(c *bm.Context) {
header := c.Request.Header
params := c.Request.Form
mobiApp := params.Get("mobi_app")
ridStr := params.Get("rid")
buildStr := params.Get("build")
channel := params.Get("channel")
network := params.Get("network")
// check params
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
rid, err := strconv.Atoi(ridStr)
if err != nil {
log.Error("ridStr(%s) error(%v)", ridStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
buvid := header.Get(_headerBuvid)
device := params.Get("device")
plat := model.Plat(mobiApp, device)
adExtra := params.Get("ad_extra")
// GetAudit
if audit, ok := regionSvc.Audit(c, mobiApp, plat, build, rid, true); ok {
returnJSON(c, audit, nil)
} else {
mobiApp = model.MobiAPPBuleChange(mobiApp)
data := regionSvc.Dynamic(c, plat, rid, build, mid, channel, buvid, network, mobiApp, device, adExtra, time.Now())
returnJSON(c, data, nil)
}
}
func regionDynamicList(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
ridStr := params.Get("rid")
pullStr := params.Get("pull")
ctimeStr := params.Get("ctime")
buildStr := params.Get("build")
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
rid, err := strconv.Atoi(ridStr)
if err != nil {
log.Error("ridStr(%s) error(%v)", ridStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
pull, err := strconv.ParseBool(pullStr)
if err != nil {
log.Error("pullStr(%s) error(%v)", pullStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
// ctime
ctime, err := strconv.ParseInt(ctimeStr, 10, 64)
if err != nil || ctime < 0 {
ctime = 0
}
device := params.Get("device")
plat := model.Plat(mobiApp, device)
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
// GetAudit
if _, ok := regionSvc.Audit(c, mobiApp, plat, build, rid, false); ok {
data := map[string]interface{}{}
returnJSON(c, data, nil)
} else {
mobiApp = model.MobiAPPBuleChange(mobiApp)
data := regionSvc.DynamicList(c, plat, rid, pull, ctime, mid, time.Now())
returnJSON(c, data, nil)
}
}
func regionDynamicChild(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
ridStr := params.Get("rid")
buildStr := params.Get("build")
tagIDStr := params.Get("tag_id")
// check params
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
rid, err := strconv.Atoi(ridStr)
if err != nil {
log.Error("ridStr(%s) error(%v)", ridStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
device := params.Get("device")
plat := model.Plat(mobiApp, device)
var tagID int
if tagIDStr != "" {
if tagID, err = strconv.Atoi(tagIDStr); err != nil {
log.Error("tagId(%s) error(%v)", tagID, err)
c.JSON(nil, ecode.RequestErr)
return
}
}
// GetAudit
if audit, ok := regionSvc.AuditChild(c, mobiApp, "", plat, build, rid, tagID); ok {
returnJSON(c, audit, nil)
} else {
mobiApp = model.MobiAPPBuleChange(mobiApp)
data := regionSvc.DynamicChild(c, plat, rid, tagID, build, mid, mobiApp, time.Now())
returnJSON(c, data, nil)
}
}
func regionDynamicChildList(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
ridStr := params.Get("rid")
pullStr := params.Get("pull")
ctimeStr := params.Get("ctime")
buildStr := params.Get("build")
tagIDStr := params.Get("tag_id")
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("build(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
rid, err := strconv.Atoi(ridStr)
if err != nil {
log.Error("ridStr(%s) error(%v)", ridStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
pull, err := strconv.ParseBool(pullStr)
if err != nil {
log.Error("pullStr(%s) error(%v)", pullStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
// ctime
ctime, err := strconv.ParseInt(ctimeStr, 10, 64)
if err != nil || ctime < 0 {
ctime = 0
}
var tagID int
if tagIDStr != "" {
if tagID, err = strconv.Atoi(tagIDStr); err != nil {
log.Error("tagId(%s) error(%v)", tagID, err)
c.JSON(nil, ecode.RequestErr)
return
}
}
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
device := params.Get("device")
plat := model.Plat(mobiApp, device)
// GetAudit
if audit, ok := regionSvc.AuditChild(c, mobiApp, "", plat, build, rid, tagID); ok {
returnJSON(c, audit, nil)
} else {
mobiApp = model.MobiAPPBuleChange(mobiApp)
data := regionSvc.DynamicListChild(c, plat, rid, tagID, build, pull, ctime, mid, time.Now())
returnJSON(c, data, nil)
}
}

View File

@@ -0,0 +1,425 @@
package http
import (
"strconv"
"time"
"go-common/app/interface/main/app-show/model"
"go-common/app/interface/main/app-show/model/show"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
)
const (
_headerBuvid = "Buvid"
_headerDisplayID = "Display-ID"
)
func shows(c *bm.Context) {
var (
params = c.Request.Form
header = c.Request.Header
)
// get params
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
buildStr := params.Get("build")
channel := params.Get("channel")
ak := params.Get("access_key")
// check params
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("strconv.Atoi(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
device := params.Get("device")
plat := model.Plat(mobiApp, device)
// get audit data, if check audit hit.
ss, ok := showSvc.Audit(c, mobiApp, plat, build)
if ok {
returnJSON(c, ss, nil)
return
}
network := params.Get("network")
ip := metadata.String(c, metadata.RemoteIP)
buvid := header.Get(_headerBuvid)
disid := header.Get(_headerDisplayID)
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
// display
ss = showSvc.Display(c, mid, plat, build, buvid, channel, ip, ak, network, mobiApp, device, "hans", "", false, time.Now())
returnJSON(c, ss, nil)
// infoc
if len(ss) == 0 {
return
}
showSvc.Infoc(mid, plat, buvid, disid, ip, "/x/v2/show", ss[0].Body, time.Now())
}
func showsRegion(c *bm.Context) {
var (
params = c.Request.Form
header = c.Request.Header
)
// get params
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
buildStr := params.Get("build")
channel := params.Get("channel")
ak := params.Get("access_key")
// check params
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("strconv.Atoi(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
device := params.Get("device")
plat := model.Plat(mobiApp, device)
// get audit data, if check audit hit.
ss, ok := showSvc.Audit(c, mobiApp, plat, build)
if !ok {
ip := metadata.String(c, metadata.RemoteIP)
buvid := header.Get(_headerBuvid)
network := params.Get("network")
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
// display
language := params.Get("lang")
ss = showSvc.RegionDisplay(c, mid, plat, build, buvid, channel, ip, ak, network, mobiApp, device, language, "", false, time.Now())
}
res := map[string]interface{}{
"data": ss,
}
returnDataJSON(c, res, 25, nil)
}
func showsIndex(c *bm.Context) {
var (
params = c.Request.Form
header = c.Request.Header
)
// get params
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
buildStr := params.Get("build")
channel := params.Get("channel")
ak := params.Get("access_key")
// check params
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("strconv.Atoi(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
device := params.Get("device")
plat := model.Plat(mobiApp, device)
// get audit data, if check audit hit.
ss, ok := showSvc.Audit(c, mobiApp, plat, build)
if !ok {
ip := metadata.String(c, metadata.RemoteIP)
buvid := header.Get(_headerBuvid)
network := params.Get("network")
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
// display
language := params.Get("lang")
adExtra := params.Get("ad_extra")
ss = showSvc.Index(c, mid, plat, build, buvid, channel, ip, ak, network, mobiApp, device, language, adExtra, false, time.Now())
}
res := map[string]interface{}{
"data": ss,
}
returnDataJSON(c, res, 25, nil)
}
func showTemps(c *bm.Context) {
var (
params = c.Request.Form
header = c.Request.Header
)
// get params
mobiApp := params.Get("mobi_app")
// check params
device := params.Get("device")
plat := model.Plat(mobiApp, device)
ip := metadata.String(c, metadata.RemoteIP)
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
// display
data := showSvc.Display(c, mid, plat, 0, header.Get(_headerBuvid), "", ip, "", "wifi", mobiApp, device, "hans", "", true, time.Now())
returnJSON(c, data, nil)
}
func showChange(c *bm.Context) {
params := c.Request.Form
header := c.Request.Header
// get params
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
randStr := params.Get("rand")
buildStr := params.Get("build")
// check params
rand, err := strconv.Atoi(randStr)
if err != nil {
log.Error("strconv.Atoi(%s) error(%v)", randStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
device := params.Get("device")
plat := model.Plat(mobiApp, device)
// normal data
ip := metadata.String(c, metadata.RemoteIP)
buvid := header.Get(_headerBuvid)
disid := header.Get(_headerDisplayID)
network := params.Get("network")
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
build, _ := strconv.Atoi(buildStr)
// change
sis := showSvc.Change(c, mid, build, plat, rand, buvid, ip, network, mobiApp, device)
returnJSON(c, sis, nil)
// infoc
showSvc.Infoc(mid, plat, buvid, disid, ip, "/x/v2/show/change", sis, time.Now())
}
// showRegionChange
func showRegionChange(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
device := params.Get("device")
buildStr := params.Get("build")
plat := model.Plat(mobiApp, device)
// get params
randStr := params.Get("rand")
// check params
rand, err := strconv.Atoi(randStr)
if err != nil {
log.Error("strconv.Atoi(%s) error(%v)", randStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
ridStr := params.Get("rid")
rid, err := strconv.Atoi(ridStr)
if err != nil {
log.Error("ridStr(%s) error(%v)", ridStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
build, _ := strconv.Atoi(buildStr)
data := showSvc.RegionChange(c, rid, rand, plat, build, mobiApp)
returnJSON(c, data, nil)
}
// showBangumiChange
func showBangumiChange(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
device := params.Get("device")
plat := model.Plat(mobiApp, device)
// get params
randStr := params.Get("rand")
// check params
rand, err := strconv.Atoi(randStr)
if err != nil {
log.Error("strconv.Atoi(%s) error(%v)", randStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
data := showSvc.BangumiChange(c, rand, plat)
returnJSON(c, data, nil)
}
// showArticleChange
func showArticleChange(c *bm.Context) {
data := []*show.Item{}
returnJSON(c, data, nil)
}
// showDislike
func showDislike(c *bm.Context) {
var (
params = c.Request.Form
header = c.Request.Header
mid int64
)
// get params
mobiApp := params.Get("mobi_app")
mobiApp = model.MobiAPPBuleChange(mobiApp)
device := params.Get("device")
plat := model.Plat(mobiApp, device)
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
idStr := params.Get("id")
gt := params.Get("goto")
if !model.IsGoto(gt) {
c.JSON(nil, ecode.RequestErr)
return
}
// normal data
ip := metadata.String(c, metadata.RemoteIP)
buvid := header.Get(_headerBuvid)
disid := header.Get(_headerDisplayID)
// parse id
id, err := strconv.ParseInt(idStr, 10, 64)
if err != nil {
log.Error("strconv.Atoi(%s) error(%v)", idStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
// change
si := showSvc.Dislike(c, mid, plat, id, buvid, mobiApp, device, gt, ip)
returnJSON(c, si, nil)
// infoc
showSvc.Infoc(mid, plat, buvid, disid, ip, "/x/v2/show/change/dislike", []*show.Item{si}, time.Now())
}
func showWidget(c *bm.Context) {
params := c.Request.Form
mobiApp := params.Get("mobi_app")
device := params.Get("device")
plat := model.Plat(mobiApp, device)
buildStr := params.Get("build")
build, err := strconv.Atoi(buildStr)
if err != nil {
log.Error("strconv.Atoi(%s) error(%v)", buildStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
var data []*show.Item
if ss, ok := showSvc.AuditChild(c, mobiApp, plat, build); ok {
if len(ss) > 3 {
data = ss[:3]
} else {
data = ss
}
returnJSON(c, data, nil)
return
}
data = showSvc.Widget(c, plat)
returnJSON(c, data, nil)
}
// show live change
func showLiveChange(c *bm.Context) {
params := c.Request.Form
// get params
randStr := params.Get("rand")
ak := params.Get("access_key")
rand, err := strconv.Atoi(randStr)
if err != nil {
log.Error("strconv.Atoi(%s) error(%v)", randStr, err)
c.JSON(nil, ecode.RequestErr)
return
}
var mid int64
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
// change
ip := metadata.String(c, metadata.RemoteIP)
data := showSvc.LiveChange(c, mid, ak, ip, rand, time.Now())
returnJSON(c, data, nil)
}
// popular hot tab popular
func popular(c *bm.Context) {
var (
params = c.Request.Form
header = c.Request.Header
mid int64
)
mobiApp := params.Get("mobi_app")
device := params.Get("device")
buildStr := params.Get("build")
idxStr := params.Get("idx")
loginEventStr := params.Get("login_event")
lastParam := params.Get("last_param")
build, err := strconv.Atoi(buildStr)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
plat := model.Plat(mobiApp, device)
loginEvent, err := strconv.Atoi(loginEventStr)
if err != nil {
loginEvent = 0
}
idx, err := strconv.ParseInt(idxStr, 10, 64)
if err != nil || idx < 0 {
idx = 0
}
now := time.Now()
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
buvid := header.Get(_headerBuvid)
// get audit data, if check audit hit.
data, ok := showSvc.AuditFeed(c, mobiApp, plat, build)
if !ok {
data = showSvc.FeedIndex(c, mid, idx, plat, build, loginEvent, lastParam, mobiApp, device, buvid, now)
}
c.JSON(data, nil)
}
// popular hot tab popular
func popular2(c *bm.Context) {
var (
params = c.Request.Form
header = c.Request.Header
mid int64
)
mobiApp := params.Get("mobi_app")
device := params.Get("device")
buildStr := params.Get("build")
idxStr := params.Get("idx")
loginEventStr := params.Get("login_event")
lastParam := params.Get("last_param")
build, err := strconv.Atoi(buildStr)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
plat := model.Plat(mobiApp, device)
loginEvent, err := strconv.Atoi(loginEventStr)
if err != nil {
loginEvent = 0
}
idx, err := strconv.ParseInt(idxStr, 10, 64)
if err != nil || idx < 0 {
idx = 0
}
now := time.Now()
if midInter, ok := c.Get("mid"); ok {
mid = midInter.(int64)
}
buvid := header.Get(_headerBuvid)
// get audit data, if check audit hit.
data, ok := showSvc.AuditFeed2(c, mobiApp, plat, build)
var (
ver string
)
if !ok {
data, ver, err = showSvc.FeedIndex2(c, mid, idx, plat, build, loginEvent, lastParam, mobiApp, device, buvid, now)
}
config := map[string]interface{}{
"item_title": "当前热门",
}
c.JSONMap(map[string]interface{}{"data": data, "ver": ver, "config": config}, err)
}

View File

@@ -0,0 +1,44 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["const.go"],
importpath = "go-common/app/interface/main/app-show/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = ["//app/service/main/archive/api:go_default_library"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/main/app-show/model/activity:all-srcs",
"//app/interface/main/app-show/model/ad:all-srcs",
"//app/interface/main/app-show/model/bangumi:all-srcs",
"//app/interface/main/app-show/model/banner:all-srcs",
"//app/interface/main/app-show/model/card:all-srcs",
"//app/interface/main/app-show/model/daily:all-srcs",
"//app/interface/main/app-show/model/dislike:all-srcs",
"//app/interface/main/app-show/model/feed:all-srcs",
"//app/interface/main/app-show/model/live:all-srcs",
"//app/interface/main/app-show/model/recommend:all-srcs",
"//app/interface/main/app-show/model/region:all-srcs",
"//app/interface/main/app-show/model/show:all-srcs",
"//app/interface/main/app-show/model/tag:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["activity.go"],
importpath = "go-common/app/interface/main/app-show/model/activity",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,11 @@
package activity
type Activity struct {
ID int64 `json:"id"`
Name string `json:"name"`
H5URL string `json:"h5_url"`
H5Cover string `json:"h5_cover"`
Desc string `json:"desc"`
Stime string `json:"stime"`
Etime string `json:"etime"`
}

View File

@@ -0,0 +1,32 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["ad.go"],
importpath = "go-common/app/interface/main/app-show/model/ad",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/model/banner:go_default_library",
"//library/log: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,85 @@
package ad
import (
"strconv"
"go-common/app/interface/main/app-show/model/banner"
"go-common/library/log"
)
type ADRequest struct {
RequestID string `json:"request_id"`
ADIndexs map[string]map[string]*ADIndex `json:"ads_info"`
}
type ADIndex struct {
Index int `json:"index"`
Info *ADInfo `json:"ad_info"`
IsAd bool `json:"is_ad"`
CmMark int `json:"cm_mark"`
}
type ADInfo struct {
CreativeID int `json:"creative_id"`
CreativeType int `json:"creative_type"`
CreativeContent struct {
Title string `json:"title"`
Desc string `json:"description"`
VideoID int64 `json:"video_id"`
UserName string `json:"username"`
ImageURL string `json:"image_url"`
ImageMD5 string `json:"image_md5"`
LogURL string `json:"log_url"`
LogMD5 string `json:"log_md5"`
URL string `json:"url"`
ClickURL string `json:"click_url"`
ShowURL string `json:"show_url"`
} `json:"creative_content"`
AdCb string `json:"ad_cb"`
}
// RecoverBanner
func (adr *ADRequest) ConvertBanner(ip, mobiApp string, build int) (banners map[int]map[int]*banner.Banner) {
banners = map[int]map[int]*banner.Banner{}
for resIdStr, sAdis := range adr.ADIndexs {
resId, _ := strconv.Atoi(resIdStr)
if len(sAdis) == 0 {
log.Info("mobi_app:%v-build:%v-resource:%v-is_ad_loc:%v", mobiApp, build, resId, false)
continue
}
for sidStr, adi := range sAdis {
sid, _ := strconv.Atoi(sidStr)
var bnnr = &banner.Banner{
IsAdLoc: true,
IsAd: adi.IsAd,
IsAdReplace: false,
CmMark: adi.CmMark,
Rank: adi.Index,
SrcId: sid,
RequestId: adr.RequestID,
ClientIp: ip,
}
if adInfo := adi.Info; adInfo != nil {
bnnr.IsAdReplace = true
bnnr.CreativeId = adInfo.CreativeID
bnnr.AdCb = adInfo.AdCb
bnnr.ShowUrl = adInfo.CreativeContent.ShowURL
bnnr.ClickUrl = adInfo.CreativeContent.ClickURL
bnnr.Title = adInfo.CreativeContent.Title
bnnr.Image = adInfo.CreativeContent.ImageURL
bnnr.Hash = adInfo.CreativeContent.ImageMD5
bnnr.URI = adInfo.CreativeContent.URL
bnnr.Channel = "*"
}
if _, ok := banners[resId]; ok {
banners[resId][bnnr.Rank] = bnnr
} else {
banners[resId] = map[int]*banner.Banner{
bnnr.Rank: bnnr,
}
}
log.Info("mobi_app:%v-build:%v-source:%v-resource:%v-is_ad_loc:%v", mobiApp, build, sid, resId, true)
}
}
return
}

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["bangumi.go"],
importpath = "go-common/app/interface/main/app-show/model/bangumi",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,35 @@
package bangumi
type Bangumi struct {
SeasonId string `json:"season_id"`
Spid string `json:"spid"`
Title string `json:"title"`
Brief string `json:"brief"`
Cover string `json:"cover"`
Evaluate string `json:"evaluate"`
TotalCount string `json:"total_count"`
PlayCount string `json:"play_count"`
DanmakuCount string `json:"danmaku_count"`
Finish string `json:"is_finish"`
Badge string `json:"badge"`
SeasonStatus int `json:"season_status"`
Favorites string `json:"favorites"`
NewEp struct {
Aid string `json:"av_id"`
Cover string `json:"cover"`
Index string `json:"index"`
UpTime string `json:"update_time"`
} `json:"new_ep"`
}
type SeasonInfo struct {
SeasonID int64 `json:"season_id"`
SeasonType int `json:"season_type"`
EpisodeID int `json:"episode_id"`
}
type Banner struct {
Title string `json:"title"`
Image string `json:"img"`
URI string `json:"link"`
}

View File

@@ -0,0 +1,34 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["banner.go"],
importpath = "go-common/app/interface/main/app-show/model/banner",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/model:go_default_library",
"//app/interface/main/app-show/model/bangumi:go_default_library",
"//app/service/main/resource/model:go_default_library",
"//library/time: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,179 @@
package banner
import (
"encoding/json"
xtime "go-common/library/time"
"strconv"
"go-common/app/interface/main/app-show/model"
"go-common/app/interface/main/app-show/model/bangumi"
resource "go-common/app/service/main/resource/model"
)
// Banner struct
type Banner struct {
ID int `json:"id"`
ParentID int `json:"-"`
Plat int8 `json:"-"`
Module string `json:"-"`
Position string `json:"-"`
Title string `json:"title"`
Image string `json:"image"`
Hash string `json:"hash"`
URI string `json:"uri"`
Goto string `json:"-"`
Value string `json:"-"`
Param string `json:"-"`
Channel string `json:"-"`
Build int `json:"-"`
Condition string `json:"-"`
Area string `json:"-"`
Rank int `json:"-"`
Rule string `json:"-"`
Type int8 `json:"-"`
Start xtime.Time `json:"-"`
End xtime.Time `json:"-"`
MTime xtime.Time `json:"-"`
ResourceID int `json:"resource_id"`
RequestId string `json:"request_id,omitempty"`
CreativeId int `json:"creative_id,omitempty"`
SrcId int `json:"src_id,omitempty"`
IsAd bool `json:"is_ad"`
IsAdReplace bool `json:"-"`
IsAdLoc bool `json:"is_ad_loc,omitempty"`
CmMark int `json:"cm_mark"`
AdCb string `json:"ad_cb,omitempty"`
ShowUrl string `json:"show_url,omitempty"`
ClickUrl string `json:"click_url,omitempty"`
ClientIp string `json:"client_ip,omitempty"`
Index int `json:"index"`
ServerType int `json:"server_type"`
Extra json.RawMessage `json:"extra,omitempty"`
}
type JsonBanner struct {
Area string `json:"area"`
Hash string `json:"hash"`
Build int `json:"build"`
Condition string `json:"conditions"`
Channel string `json:"channel"`
}
// Banner limit
type Limit struct {
Rule string `json:"-"`
}
// Json limit
type JsonLimit struct {
Limit int `json:"limit"`
Resrc []string `json:"resrc"`
}
// PlatChange
func (b *Banner) BannerChange() {
var tmp *JsonBanner
if err := json.Unmarshal([]byte(b.Rule), &tmp); err == nil {
b.Area = tmp.Area
b.Build = tmp.Build
b.Condition = tmp.Condition
if tmp.Channel == "" {
b.Channel = "*"
} else {
b.Channel = tmp.Channel
}
b.Hash = tmp.Hash
}
switch b.Plat {
case 1: // resource iphone
b.Plat = model.PlatIPhone
case 2: // resource android
b.Plat = model.PlatAndroid
case 3: // resource pad
b.Plat = model.PlatIPad
case 4: // resource iphoneg
b.Plat = model.PlatIPhoneI
case 5: // resource androidg
b.Plat = model.PlatAndroidG
case 6: // resource padg
b.Plat = model.PlatIPadI
case 8: // resource androidi
b.Plat = model.PlatAndroidI
}
if b.Value == "" {
return
}
switch b.Type {
case 6:
//GotoAv
b.URI = "bilibili://video/" + b.Value
case 4:
//GotoLive
if b.Plat == model.PlatIPad {
b.URI = "bilibili://player/live/" + b.Value
} else {
b.URI = "bilibili://live/" + b.Value
}
case 3:
//GotoBangumi
b.URI = "bilibili://bangumi/season/" + b.Value
case 5:
//GotoGame
b.URI = "bilibili://game/" + b.Value
case 2:
//GotoWeb
b.URI = b.Value
}
}
// LimitChange
func (l *Limit) LimitChange() (data map[int]int) {
data = map[int]int{}
var (
tmp = &JsonLimit{}
err error
resid int
)
if err = json.Unmarshal([]byte(l.Rule), tmp); err != nil {
return
}
l.Rule = ""
for _, residstr := range tmp.Resrc {
resid, err = strconv.Atoi(residstr)
if err != nil {
return
}
data[resid] = tmp.Limit
}
return
}
// ResChangeBanner
func (b *Banner) ResChangeBanner(resb *resource.Banner) {
b.ID = resb.ID
b.Title = resb.Title
b.Image = resb.Image
b.Hash = resb.Hash
b.URI = resb.URI
b.ResourceID = resb.ResourceID
b.RequestId = resb.RequestId
b.CreativeId = resb.CreativeId
b.SrcId = resb.SrcId
b.IsAd = resb.IsAd
b.IsAdLoc = resb.IsAdLoc
b.CmMark = resb.CmMark
b.AdCb = resb.AdCb
b.ShowUrl = resb.ShowUrl
b.ClickUrl = resb.ClickUrl
b.ClientIp = resb.ClientIp
b.Index = resb.Index
b.ServerType = resb.ServerType
b.Extra = resb.Extra
}
// BgmChangeBanner bangumiBanner change banner
func (b *Banner) BgmChangeBanner(bgmb *bangumi.Banner) {
b.Title = bgmb.Title
b.Image = bgmb.Image
b.URI = bgmb.URI
}

View File

@@ -0,0 +1,33 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["card.go"],
importpath = "go-common/app/interface/main/app-show/model/card",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/ai:go_default_library",
"//app/interface/main/app-show/model:go_default_library",
"//library/time: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,263 @@
package card
import (
"encoding/json"
"strconv"
"go-common/app/interface/main/app-card/model/card/ai"
"go-common/app/interface/main/app-show/model"
xtime "go-common/library/time"
)
type Column struct {
ID int `json:"-"`
Tab int `json:"-"`
RegionID int `json:"-"`
Tpl int `json:"-"`
Name string `json:"-"`
Desc string `json:"-"`
PlatVer string `json:"-"`
Plat int8 `json:"-"`
Build int `json:"-"`
Condition string `json:"-"`
Type string `json:"-"`
}
type ColumnNper struct {
ID int `json:"-"`
ColumnID int `json:"-"`
Name string `json:"-"`
Desc string `json:"-"`
Nper string `json:"-"`
NperTime xtime.Time `json:"-"`
Cover string `json:"-"`
PlatVer string `json:"-"`
Title string `json:"-"`
Rtype int `json:"-"`
Rvalue string `json:"-"`
Plat int8 `json:"-"`
Build int `json:"-"`
Condition string `json:"-"`
Goto string `json:"-"`
Param string `json:"-"`
URI string `json:"-"`
}
type Content struct {
ID int `json:"-"`
Module int `json:"-"`
RecID int `json:"-"`
Type int8 `json:"-"`
Value string `json:"-"`
Title string `json:"-"`
TagID int `json:"-"`
}
type Card struct {
ID int `json:"-"`
Tab int `json:"-"`
RegionID int `json:"-"`
Type int `json:"-"`
Title string `json:"-"`
Cover string `json:"-"`
Rtype int `json:"-"`
Rvalue string `json:"-"`
PlatVer string `json:"-"`
Plat int8 `json:"-"`
Build int `json:"-"`
Condition string `json:"-"`
TypeStr string `json:"-"`
Goto string `json:"-"`
Param string `json:"-"`
URi string `json:"-"`
Desc string `json:"-"`
TagID int `json:"-"`
}
type ColumnList struct {
Cid int `json:"-"`
Ceid int `json:"-"`
Name string `json:"-"`
Cname string `json:"-"`
PlatVer string `json:"-"`
Plat int8 `json:"-"`
Build int `json:"-"`
Condition string `json:"-"`
}
type PlatLimit struct {
Plat int8 `json:"plat"`
Build int `json:"build"`
Condition string `json:"conditions"`
}
type PopularCard struct {
ID int64 `json:"id"`
Title string `json:"title"`
ChannelID int64 `json:"channel_id"`
Type string `json:"type"`
Value int64 `json:"value"`
Reason string `json:"reason"`
ReasonType int8 `json:"reason_type"`
Pos int `json:"pos"`
FromType string `json:"from_type"`
PopularCardPlat map[int8][]*PopularCardPlat `json:"popularcardplat"`
Idx int64 `json:"-"`
CornerMark int8 `json:"corner_mark"`
}
type PopularCardPlat struct {
CardID int64 `json:"card_id"`
Plat int8 `json:"plat"`
Condition string `json:"condition"`
Build int `json:"build"`
}
func (c *Card) CardPlatChange() (platlinits []*PlatLimit) {
platlinits = platJsonChange(c.PlatVer)
return
}
func (c *Column) ColumnPlatChange() (platlinits []*PlatLimit) {
platlinits = platJsonChange(c.PlatVer)
return
}
func (c *ColumnList) ColumnListPlatChange() (platlinits []*PlatLimit) {
platlinits = platJsonChange(c.PlatVer)
return
}
func (c *ColumnNper) ColumnNperPlatChange() (platlinits []*PlatLimit) {
platlinits = platJsonChange(c.PlatVer)
return
}
func (c *Card) CardGotoChannge() {
c.TypeStr = cardTypeChange(c.Type)
c.Goto, c.Param, c.URi = gotoURI(c.Rtype, c.Rvalue)
}
func (c *Column) ColumnGotoChannge() {
switch c.Tpl {
case 1:
c.Type = model.GotoDaily
case 2:
c.Type = model.GotoColumn
}
}
func (c *ColumnNper) ColumnNperGotoChange() {
c.Goto, c.Param, c.URI = gotoURI(c.Rtype, c.Rvalue)
}
func gotoURI(typeInt int, value string) (gotoStr, paramStr, uri string) {
switch typeInt {
case 1:
gotoStr = model.GotoDaily
case 4:
gotoStr = model.GotoWeb
case 5:
gotoStr = model.GotoAv
case 6:
gotoStr = model.GotoLive
case 7:
gotoStr = model.GotoBangumi
case 8:
gotoStr = model.GotoGame
case 9:
gotoStr = model.GotoColumn
case 10:
gotoStr = model.GotoColumnStage
case 11:
gotoStr = model.GotoArticle
default:
return
}
paramStr = value
uri = model.FillURI(gotoStr, paramStr, nil)
return
}
func cardTypeChange(cardInt int) (cardStr string) {
switch cardInt {
case 1:
cardStr = model.GotoDaily
case 2:
cardStr = model.GotoTopic
case 3:
cardStr = model.GotoActivity
case 4:
cardStr = model.GotoRank
case 5:
cardStr = model.GotoCard
case 6:
cardStr = model.GotoVeidoCard
case 7:
cardStr = model.GotoSpecialCard
case 8:
cardStr = model.GotoTagCard
}
return
}
// platJsonChange json change plat build condition
func platJsonChange(jsonStr string) (platlinits []*PlatLimit) {
var tmp []struct {
Plat string `json:"plat"`
Build string `json:"build"`
Condition string `json:"conditions"`
}
if err := json.Unmarshal([]byte(jsonStr), &tmp); err == nil {
for _, limit := range tmp {
platlinit := &PlatLimit{}
switch limit.Plat {
case "0": // resource android
platlinit.Plat = model.PlatAndroid
case "1": // resource iphone
platlinit.Plat = model.PlatIPhone
case "2": // resource pad
platlinit.Plat = model.PlatIPad
case "5": // resource iphone_i
platlinit.Plat = model.PlatIPhoneI
case "8": // resource android_i
platlinit.Plat = model.PlatAndroidI
}
platlinit.Build, _ = strconv.Atoi(limit.Build)
platlinit.Condition = limit.Condition
platlinits = append(platlinits, platlinit)
}
}
return
}
func (c *PopularCard) PopularCardToAiChange() (a *ai.Item) {
a = &ai.Item{
Goto: c.Type,
ID: c.Value,
RcmdReason: c.fromRcmdReason(),
CornerMark: c.CornerMark,
}
if c.CornerMark == 2 {
a.CornerMark = 4
}
return
}
func (c *PopularCard) fromRcmdReason() (a *ai.RcmdReason) {
var content string
switch c.ReasonType {
case 0:
content = ""
case 1:
content = "编辑精选"
case 2:
content = "热门推荐"
case 3:
content = c.Reason
}
if content != "" {
a = &ai.RcmdReason{ID: 1, Content: content, BgColor: "yellow", IconLocation: "left_top"}
}
return
}

View File

@@ -0,0 +1,345 @@
package model
import (
"fmt"
"go-common/app/service/main/archive/api"
"strconv"
"strings"
)
const (
// PlatAndroid is int8 for android.
PlatAndroid = int8(0)
// PlatIPhone is int8 for iphone.
PlatIPhone = int8(1)
// PlatIPad is int8 for ipad.
PlatIPad = int8(2)
// PlatWPhone is int8 for wphone.
PlatWPhone = int8(3)
// PlatAndroidG is int8 for Android Global.
PlatAndroidG = int8(4)
// PlatIPhoneI is int8 for Iphone Global.
PlatIPhoneI = int8(5)
// PlatIPadI is int8 for IPAD Global.
PlatIPadI = int8(6)
// PlatAndroidTV is int8 for AndroidTV Global.
PlatAndroidTV = int8(7)
// PlatAndroidI is int8 for Android Global.
PlatAndroidI = int8(8)
// PlatAndroidB is int8 for Android Bule.
PlatAndroidB = int8(9)
GotoAv = "av"
GotoWeb = "web"
GotoBangumi = "bangumi"
GotoBangumiWeb = "bangumi_web"
GotoSp = "sp"
GotoLive = "live"
GotoGame = "game"
GotoArticle = "article"
GotoActivity = "activity_new"
GotoTopic = "topic_new"
GotoDaily = "daily"
GotoRank = "rank"
GotoCard = "card"
GotoVeidoCard = "video_card"
GotoSpecialCard = "special_card"
GotoTagCard = "tag_card"
GotoColumn = "column"
GotoColumnStage = "column_stage"
GotoTagID = "tag_id"
GotoHotTopic = "hottopic"
GotoUpRcmdNew = "up_rcmd_new"
GotoUpRcmdNewV2 = "up_rcmd_new_v2"
GotoHotDynamic = "hot_dynamic"
GotoEventTopic = "event_topic"
CardGotoAv = int8(1)
CardGotoTopic = int8(2)
CardGotoActivity = int8(3)
// EnvPro is pro.
EnvPro = "pro"
// EnvTest is env.
EnvTest = "test"
// EnvDev is env.
EnvDev = "dev"
// movie copywriting
CoverIng = "即将上映"
CoverPay = "付费观看"
CoverFree = "免费观看"
CoverVipFree = "付费观看"
CoverVipOnly = "专享"
CoverVipFirst = "抢先"
)
var (
AvHandler = func(a *api.Arc) func(uri string) string {
return func(uri string) string {
if a == nil {
return uri
}
if a.Dimension.Height != 0 || a.Dimension.Width != 0 {
return fmt.Sprintf("%s?player_width=%d&player_height=%d&player_rotate=%d", uri, a.Dimension.Width, a.Dimension.Height, a.Dimension.Rotate)
}
return uri
}
}
)
// IsAndroid check plat is android or ipad.
func IsAndroid(plat int8) bool {
return plat == PlatAndroid || plat == PlatAndroidG || plat == PlatAndroidB || plat == PlatAndroidI
}
// IsIOS check plat is iphone or ipad.
func IsIOS(plat int8) bool {
return plat == PlatIPad || plat == PlatIPhone || plat == PlatIPadI || plat == PlatIPhoneI
}
// IsIPad check plat is pad.
func IsIPad(plat int8) bool {
return plat == PlatIPad || plat == PlatIPadI
}
// FillURI deal app schema.
func FillURI(gt, param string, f func(uri string) string) (uri string) {
if param == "" {
return
}
switch gt {
case GotoAv, "":
uri = "bilibili://video/" + param
case GotoLive:
uri = "bilibili://live/" + param
case GotoBangumi:
uri = "bilibili://bangumi/season/" + param
case GotoBangumiWeb:
uri = "http://bangumi.bilibili.com/anime/" + param
case GotoGame:
uri = "bilibili://game/" + param
case GotoSp:
uri = "bilibili://splist/" + param
case GotoWeb:
uri = param
case GotoDaily:
uri = "bilibili://daily/" + param
case GotoColumn:
uri = "bilibili://pegasus/list/column/" + param
case GotoArticle:
uri = "bilibili://article/" + param
}
if f != nil {
uri = f(uri)
}
return
}
func FillURIHotTopic(tagID, tagName string) (uri string) {
return "bilibili://tag/" + tagID + "?name=" + tagName + "&show=dynamic"
}
func FillURIBangumi(gt, seasonID, episodeID string, episodeType int) (uri string) {
var typeStr string
switch episodeType {
case 1, 4:
typeStr = "anime"
}
switch gt {
case GotoBangumi:
uri = "http://bangumi.bilibili.com/" + typeStr + "/" + seasonID + "/play#" + episodeID
}
return
}
// FillURICategory deal app schema.
func FillURICategory(gt, columnID, sectionID string) (uri string) {
if columnID == "" || sectionID == "" {
return
}
switch gt {
case GotoColumnStage:
uri = "bilibili://pegasus/list/column/" + columnID + "/?sectionId=" + sectionID
}
return
}
func CoverURLHTTPS(uri string) (cover string) {
if strings.HasPrefix(uri, "http://") {
cover = "https://" + uri[7:]
} else {
cover = uri
}
return
}
// CoverURL convert cover url to full url.
func CoverURL(uri string) (cover string) {
if uri == "" {
cover = "http://static.hdslb.com/images/transparent.gif"
return
}
if strings.HasPrefix(uri, "http://i0.hdslb.com") || strings.HasPrefix(uri, "http://i1.hdslb.com") || strings.HasPrefix(uri, "http://i2.hdslb.com") {
uri = uri[19:]
} else if strings.HasPrefix(uri, "https://i0.hdslb.com") || strings.HasPrefix(uri, "https://i1.hdslb.com") || strings.HasPrefix(uri, "https://i2.hdslb.com") {
uri = uri[20:]
}
cover = uri
if strings.HasPrefix(uri, "/bfs") {
cover = "http://i0.hdslb.com" + uri
return
}
if strings.Index(uri, "http://") == 0 {
return
}
if len(uri) >= 10 && uri[:10] == "/templets/" {
return
}
if strings.HasPrefix(uri, "group1") || strings.HasPrefix(uri, "/group1") {
cover = "http://i0.hdslb.com/" + uri
return
}
if pos := strings.Index(uri, "/uploads/"); pos != -1 && (pos == 0 || pos == 3) {
cover = uri[pos+8:]
}
cover = strings.Replace(cover, "{IMG}", "", -1)
cover = "http://i0.hdslb.com" + cover
return
}
// InvalidBuild check source build is not allow by config build and condition.
// eg: when condition is gt, means srcBuild must gt cfgBuild, otherwise is invalid srcBuild.
func InvalidBuild(srcBuild, cfgBuild int, cfgCond string) bool {
if cfgBuild != 0 && cfgCond != "" {
switch cfgCond {
case "gt":
if cfgBuild >= srcBuild {
return true
}
case "lt":
if cfgBuild <= srcBuild {
return true
}
case "eq":
if cfgBuild != srcBuild {
return true
}
case "ne":
if cfgBuild == srcBuild {
return true
}
}
}
return false
}
// InvalidChannel check source channel is not allow by config channel.
func InvalidChannel(plat int8, srcCh, cfgCh string) bool {
return plat == PlatAndroid && cfgCh != "*" && cfgCh != srcCh
}
// Plat return plat by platStr or mobiApp
func Plat(mobiApp, device string) int8 {
switch mobiApp {
case "iphone", "iphone_b":
if device == "pad" {
return PlatIPad
}
return PlatIPhone
case "white":
return PlatIPhone
case "ipad":
return PlatIPad
case "android":
return PlatAndroid
case "win":
return PlatWPhone
case "android_G":
return PlatAndroidG
case "android_i":
return PlatAndroidI
case "android_b":
return PlatAndroid
case "iphone_i":
if device == "pad" {
return PlatIPadI
}
return PlatIPhoneI
case "ipad_i":
return PlatIPadI
case "android_tv":
return PlatAndroidTV
}
return PlatIPhone
}
// MobiApp plat by mobi_app
func MobiApp(plat int8) string {
switch plat {
case PlatAndroid:
return "android"
case PlatIPhone:
return "iphone"
case PlatIPad:
return "ipad"
case PlatAndroidI:
return "android_i"
case PlatIPhoneI:
return "iphone_i"
case PlatIPadI:
return "ipad_i"
case PlatAndroidG:
return "android_G"
}
return "iphone"
}
func StatusMark(status int8) string {
if status == 0 {
return CoverIng
} else if status == 1 {
return CoverPay
} else if status == 2 {
return CoverFree
} else if status == 3 {
return CoverVipFree
} else if status == 4 {
return CoverVipOnly
} else if status == 5 {
return CoverVipFirst
}
return ""
}
// IsOverseas is overseas
func IsOverseas(plat int8) bool {
return plat == PlatAndroidI || plat == PlatIPhoneI || plat == PlatIPadI
}
func IsGoto(gt string) bool {
return gt == GotoAv || gt == GotoWeb || gt == GotoBangumi || gt == GotoSp || gt == GotoLive || gt == GotoGame
}
func MobiAPPBuleChange(mobiApp string) string {
switch mobiApp {
case "android_b":
return "android"
case "iphone_b":
return "iphone"
}
return mobiApp
}
func Rounding(number, divisor int64) string {
if divisor > 0 {
tmp := float64(number) / float64(divisor)
tmpStr := fmt.Sprintf("%0.1f", tmp)
parts := strings.Split(tmpStr, ".")
if len(parts) > 1 && parts[1] == "0" {
return parts[0]
}
return tmpStr
}
return strconv.FormatInt(number, 10)
}

View File

@@ -0,0 +1,33 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["daily.go"],
importpath = "go-common/app/interface/main/app-show/model/daily",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/model:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//library/time: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,93 @@
package daily
import (
xtime "go-common/library/time"
"strconv"
"go-common/app/interface/main/app-show/model"
"go-common/app/service/main/archive/api"
)
// Show is module.
type Show struct {
*Head
Body []*Item `json:"body"`
}
// Head is show head.
type Head struct {
ID int `json:"-"`
ColumnID int `json:"column_id,omitempty"`
Plat int8 `json:"-"`
Title string `json:"title"`
Desc string `json:"desc"`
Rank int `json:"-"`
Build int `json:"-"`
Condition string `json:"-"`
Date int64 `json:"date,omitempty"`
Cover string `json:"cover,omitempty"`
Type string `json:"type,omitempty"`
Goto string `json:"goto,omitempty"`
Param string `json:"param,omitempty"`
URI string `json:"uri,omitempty"`
}
type Item struct {
Title string `json:"title"`
Cover string `json:"cover"`
URI string `json:"uri"`
Param string `json:"param"`
Goto string `json:"goto"`
// up
Name string `json:"name,omitempty"`
// stat
Play int `json:"play,omitempty"`
Danmaku int `json:"danmaku,omitempty"`
Reply int `json:"reply,omitempty"`
Fav int `json:"favourite,omitempty"`
// movie and bangumi badge
Status int8 `json:"status,omitempty"`
CoverMark string `json:"cover_mark,omitempty"`
// ranking
Pts int64 `json:"pts,omitempty"`
// av
PubDate xtime.Time `json:"pubdate"`
// av stat
Duration int64 `json:"duration,omitempty"`
// region
Rid int `json:"rid,omitempty"`
Rname string `json:"rname,omitempty"`
// tag
TagID int64 `json:"tag_id,omitempty"`
TagName string `json:"tag_name,omitempty"`
}
// ColumnList
type ColumnList struct {
Cid int `json:"cid,omitempty"`
Ceid int `json:"ceid,omitempty"`
Name string `json:"name,omitempty"`
Cname string `json:"-"`
Children []*ColumnList `json:"children,omitempty"`
}
// FromArchivePB from archive.
func (i *Item) FromArchivePB(a *api.Arc) {
i.Title = a.Title
i.Cover = a.Pic
i.Param = strconv.FormatInt(a.Aid, 10)
i.URI = model.FillURI(model.GotoAv, i.Param, nil)
i.Goto = model.GotoAv
i.Play = int(a.Stat.View)
i.Danmaku = int(a.Stat.Danmaku)
i.Name = a.Author.Name
i.Reply = int(a.Stat.Reply)
i.Fav = int(a.Stat.Fav)
i.PubDate = a.PubDate
i.Rid = int(a.TypeID)
i.Rname = a.TypeName
i.Duration = a.Duration
if a.Access > 0 {
i.Play = 0
}
}

View File

@@ -0,0 +1,29 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["dislike.go"],
importmap = "go-common/app/interface/main/app-show/model/dislike",
importpath = "go-common/app/interface/main/app-show/model/dislike",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,6 @@
package dislike
type DisklikeReason struct {
ReasonID int `json:"reason_id,omitempty"`
ReasonName string `json:"reason_name,omitempty"`
}

View File

@@ -0,0 +1,38 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["feed.go"],
importmap = "go-common/app/interface/main/app-show/model/feed",
importpath = "go-common/app/interface/main/app-show/model/feed",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-card/model/card/live:go_default_library",
"//app/interface/main/app-show/model:go_default_library",
"//app/interface/main/app-show/model/card:go_default_library",
"//app/interface/main/app-show/model/dislike:go_default_library",
"//app/interface/main/app-show/model/tag:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//library/time: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,308 @@
package feed
import (
"encoding/json"
"strconv"
clive "go-common/app/interface/main/app-card/model/card/live"
"go-common/app/interface/main/app-show/model"
"go-common/app/interface/main/app-show/model/card"
"go-common/app/interface/main/app-show/model/dislike"
"go-common/app/interface/main/app-show/model/tag"
"go-common/app/service/main/archive/api"
xtime "go-common/library/time"
)
type Item struct {
Title string `json:"title,omitempty"`
Subtitle string `json:"subtitle,omitempty"`
Cover string `json:"cover,omitempty"`
URI string `json:"uri,omitempty"`
Redirect string `json:"redirect,omitempty"`
RedirectURI string `json:"redirect_uri,omitempty"`
Param string `json:"param,omitempty"`
Goto string `json:"goto,omitempty"`
ViewType string `json:"view_type,omitempty"`
Kind string `json:"kind,omitempty"`
Desc string `json:"desc,omitempty"`
Play int `json:"play,omitempty"`
Danmaku int `json:"danmaku,omitempty"`
Reply int `json:"reply,omitempty"`
Fav int `json:"favorite,omitempty"`
Coin int `json:"coin,omitempty"`
Share int `json:"share,omitempty"`
Like int `json:"like,omitempty"`
Count int `json:"count,omitempty"`
Status int8 `json:"status,omitempty"`
Type int8 `json:"type,omitempty"`
Badge string `json:"badge,omitempty"`
StatType int8 `json:"stat_type,omitempty"`
RcmdReason *RcmdReason `json:"rcmd_reason,omitempty"`
Item []*Item `json:"item,omitempty"`
CornerMark int8 `json:"-"`
CardStyle int8 `json:"-"`
RcmdContent string `json:"-"`
// sortedset index
Idx int64 `json:"idx,omitempty"`
// av info
Cid int64 `json:"cid,omitempty"`
Rid int16 `json:"tid,omitempty"`
TName string `json:"tname,omitempty"`
Tag *Tag `json:"tag,omitempty"`
DisklikeReasons []*dislike.DisklikeReason `json:"dislike_reasons,omitempty"`
PTime xtime.Time `json:"ctime,omitempty"`
Autoplay int32 `json:"autoplay,omitempty"`
// av stat
Duration int64 `json:"duration,omitempty"`
// upper
Mid int64 `json:"mid,omitempty"`
Name string `json:"name,omitempty"`
Face string `json:"face,omitempty"`
IsAtten int8 `json:"is_atten,omitempty"`
Fans int64 `json:"fans,omitempty"`
RecCnt int `json:"recent_count,omitempty"`
Recent []*Item `json:"recent,omitempty"`
Official *OfficialInfo `json:"official,omitempty"`
// live
Online int `json:"online,omitempty"`
Area string `json:"area,omitempty"`
AreaID int `json:"area_id,omitempty"`
Area2 *Area2 `json:"area2,omitempty"`
// bangumi
Index string `json:"index,omitempty"`
IndexTitle string `json:"index_title,omitempty"`
CoverMark string `json:"cover_mark,omitempty"`
Finish bool `json:"finish,omitempty"`
LatestIndex string `json:"last_index,omitempty"`
// bangumi recommend
Updates int `json:"updates,omitempty"`
// live or bangumi
From int8 `json:"from,omitempty"`
// adviertisement
RequestID string `json:"request_id,omitempty"`
CreativeID int64 `json:"creative_id,omitempty"`
SrcID int `json:"src_id,omitempty"`
IsAd bool `json:"is_ad,omitempty"`
IsAdLoc bool `json:"is_ad_loc,omitempty"`
AdCb string `json:"ad_cb,omitempty"`
ShowURL string `json:"show_url,omitempty"`
ClickURL string `json:"click_url,omitempty"`
ClientIP string `json:"client_ip,omitempty"`
CmMark int64 `json:"cm_mark,omitempty"`
AdIndex int `json:"ad_index,omitempty"`
Extra json.RawMessage `json:"extra,omitempty"`
CardIndex int `json:"card_index,omitempty"`
// activity
STime string `json:"stime,omitempty"`
ETime string `json:"etime,omitempty"`
// tag
Tags []*tag.Tag `json:"tags,omitempty"`
// rank
Cover1 string `json:"cover1,omitempty"`
Cover2 string `json:"cover2,omitempty"`
Cover3 string `json:"cover3,omitempty"`
// banner`
Hash string `json:"hash,omitempty"`
// upper article
Covers []string `json:"covers,omitempty"`
Temple int `json:"temple,omitempty"`
Category *Category `json:"category,omitempty"`
BannerURL string `json:"banner_url,omitempty"`
// game download
GameDownloadButton *GameDownloadButton `json:"button,omitempty"`
Download int `json:"download,omitempty"`
BigCover string `json:"big_cover,omitempty"`
// special
HideBadge bool `json:"hide_badge,omitempty"`
Ratio float64 `json:"ratio,omitempty"`
// shopping
City string `json:"city,omitempty"`
PType string `json:"ptype,omitempty"`
Price string `json:"price,omitempty"`
// news
Content string `json:"content,omitempty"`
// bigdata source
Source string `json:"-"`
AvFeature json.RawMessage `json:"-"`
// common
GotoOrg string `json:"-"`
FromType string `json:"from_type,omitempty"`
Pos int `json:"-"`
Score string `json:"score,omitempty"`
}
type Tag struct {
TagID int64 `json:"tag_id,omitempty"`
TagName string `json:"tag_name,omitempty"`
IsAtten int8 `json:"is_atten,omitempty"`
Count *TagCount `json:"count,omitempty"`
Name string `json:"name,omitempty"`
URI string `json:"uri,omitempty"`
//channel
ID int64 `json:"id,omitempty"`
Face string `json:"face,omitempty"`
Fans int64 `json:"fans,omitempty"`
}
type RcmdReason struct {
ID int `json:"id,omitempty"`
Content string `json:"content,omitempty"`
BgColor string `json:"bg_color,omitempty"`
IconLocation string `json:"icon_location,omitempty"`
Message string `json:"message,omitempty"`
}
type TagCount struct {
Atten int `json:"atten,omitempty"`
}
type Category struct {
ID int64 `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Children *Category `json:"children,omitempty"`
}
type GameDownloadButton struct {
Name string `json:"name,omitempty"`
URI string `json:"uri,omitempty"`
RedirectURI string `json:"redirect_uri,omitempty"`
}
type Area2 struct {
ID int64 `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Children *Area2 `json:"children,omitempty"`
}
type OfficialInfo struct {
Role int8 `json:"role,omitempty"`
Title string `json:"title,omitempty"`
Desc string `json:"desc,omitempty"`
}
func (i *Item) fillArcStat(a *api.Arc) {
if a.Access == 0 {
i.Play = int(a.Stat.View)
}
i.Danmaku = int(a.Stat.Danmaku)
i.Reply = int(a.Stat.Reply)
i.Fav = int(a.Stat.Fav)
i.Coin = int(a.Stat.Coin)
i.Share = int(a.Stat.Share)
i.Like = int(a.Stat.Like)
}
func (i *Item) FromPlayerAv(a *api.Arc, uri string) {
if i.Title == "" {
i.Title = a.Title
}
if i.Cover == "" {
i.Cover = model.CoverURLHTTPS(a.Pic)
} else {
i.Cover = model.CoverURLHTTPS(i.Cover)
}
i.Param = strconv.FormatInt(a.Aid, 10)
i.Goto = model.GotoAv
i.URI = uri
if i.URI == "" {
i.URI = model.FillURI(i.Goto, i.Param, model.AvHandler(a))
}
i.Rid = int16(a.TypeID)
i.TName = a.TypeName
// i.Desc = a.Desc
i.fillArcStat(a)
i.Duration = a.Duration
i.Mid = a.Author.Mid
i.Name = a.Author.Name
i.Face = a.Author.Face
i.PTime = a.PubDate
i.Autoplay = a.Rights.Autoplay
i.Cid = a.FirstCid
// TODO
// if a.Stat.Like > 0 && a.Stat.DisLike > 0 {
// percent := int(a.Stat.Like / (a.Stat.Like + a.Stat.DisLike) * 100)
// if percent != 0 {
// i.Desc = strconv.Itoa(percent) + "%的人推荐"
// }
// }
}
func (i *Item) FromRcmdReason(c *card.PopularCard) {
var content string
switch c.ReasonType {
case 0:
content = ""
case 1:
content = "编辑精选"
case 2:
content = "热门推荐"
case 3:
content = c.Reason
}
if content != "" {
i.RcmdReason = &RcmdReason{ID: 1, Content: content, BgColor: "yellow", IconLocation: "left_top"}
i.RcmdContent = content
}
}
func (i *Item) FromRank(aids []int64, score map[int64]int64, am map[int64]*api.Arc) {
var _rankCount = 3
if len(aids) < _rankCount {
return
}
items := []*Item{}
for _, aid := range aids {
if a, ok := am[aid]; ok {
it := &Item{
Title: a.Title,
Cover: a.Pic,
Goto: model.GotoAv,
Param: strconv.FormatInt(a.Aid, 10),
}
it.fillArcStat(a)
it.Duration = a.Duration
it.URI = model.FillURI(it.Goto, it.Param, model.AvHandler(a))
if s, ok := score[aid]; ok {
if s < 10000 {
it.Score = model.Rounding(s, 0)
} else if s >= 10000 && s < 100000000 {
it.Score = model.Rounding(s, 10000) + "万"
} else if s >= 100000000 {
it.Score = model.Rounding(s, 100000000) + "亿"
}
}
if it.Score != "" {
it.Score = "综合评分:" + it.Score
} else {
it.Score = "综合评分:-"
}
items = append(items, it)
if len(items) >= _rankCount {
break
}
}
}
i.Title = "全站排行榜"
i.Goto = model.GotoRank
i.Item = items
i.Param = "0"
i.URI = "bilibili://rank?order_type=1&tid=0"
}
func (i *Item) FromHotTopic(hotTopics []*clive.TopicHot) {
is := []*Item{}
for _, t := range hotTopics {
it := &Item{}
it.Name = t.TName
it.Param = strconv.Itoa(t.TID)
it.Cover = t.ImageURL
it.URI = model.FillURIHotTopic(it.Param, it.Name)
is = append(is, it)
}
i.Item = is
i.Title = "热门话题"
i.Param = "0"
i.Goto = model.GotoHotTopic
i.URI = "activity://following/hot_topic_list"
i.Desc = "更多热门话题"
}

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["live.go"],
importpath = "go-common/app/interface/main/app-show/model/live",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,58 @@
package live
import "encoding/json"
// Feed is live feed
type Feed struct {
Count int `json:"count"`
Lives []*Room `json:"lives"`
}
// Recommend is live recommend
type Recommend struct {
Count int `json:"count"`
Lives struct {
Subject []*Room `json:"subject"`
Hot []*Room `json:"hot"`
} `json:"lives"`
}
type Room struct {
Owner struct {
Face string `json:"face"`
Mid int `json:"mid"`
Name string `json:"name"`
} `json:"owner"`
Cover struct {
Src string `json:"src"`
Height int `json:"height"`
Width int `json:"width"`
} `json:"cover"`
Title string `json:"title"`
ID int64 `json:"room_id"`
Online int `json:"online"`
Area string `json:"area"`
AreaID int `json:"area_id"`
}
type TopicHot struct {
TID int `json:"topic_id"`
TName string `json:"topic_name"`
Picture string `json:"picture"`
ImageURL string `json:"-"`
}
type TopicImage struct {
ImageSrc string `json:"image_src"`
ImageWidth int `json:"image_width"`
ImageHeight int `json:"image_height"`
}
func (t *TopicHot) TopicJSONChange() (err error) {
var tmp TopicImage
if err = json.Unmarshal([]byte(t.Picture), &tmp); err != nil {
return
}
t.ImageURL = tmp.ImageSrc
return
}

View File

@@ -0,0 +1,29 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["recommend.go"],
importpath = "go-common/app/interface/main/app-show/model/recommend",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = ["//app/interface/main/app-show/model/card: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,67 @@
package recommend
import (
"go-common/app/interface/main/app-show/model/card"
)
// Arc is index show recommend.
type Arc struct {
Aid interface{} `json:"aid"`
Author string `json:"author"`
Title string `json:"title"`
Description string `json:"description"`
Pic string `json:"pic"`
Views interface{} `json:"play"`
Comments int64 `json:"review"`
Coins int64 `json:"coins"`
Danmaku int `json:"video_review"`
Favorites int64 `json:"favorites"`
Pts int64 `json:"pts"`
Others []*Arc `json:"others"`
}
type List struct {
Aid int64 `json:"aid"`
Desc string `json:"desc"`
CornerMark int8 `json:"corner_mark"`
}
type CardList struct {
ID int64 `json:"id"`
Goto string `json:"goto"`
FromType string `json:"from_type"`
Desc string `json:"desc"`
CornerMark int8 `json:"corner_mark"`
Condition []*CardCondition `json:"condition"`
}
type CardCondition struct {
Plat int8 `json:"plat"`
Condition string `json:"conditions"`
Build int `json:"build"`
}
func (c *CardList) CardListChange() (p *card.PopularCard) {
p = &card.PopularCard{
Value: c.ID,
Type: c.Goto,
FromType: c.FromType,
Reason: c.Desc,
CornerMark: c.CornerMark,
}
if p.Reason != "" {
p.ReasonType = 3
}
if len(c.Condition) > 0 {
tmpcondition := map[int8][]*card.PopularCardPlat{}
for _, condition := range c.Condition {
tmpcondition[condition.Plat] = append(tmpcondition[condition.Plat], &card.PopularCardPlat{
Plat: condition.Plat,
Condition: condition.Condition,
Build: condition.Build,
})
}
p.PopularCardPlat = tmpcondition
}
return
}

View File

@@ -0,0 +1,39 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["region.go"],
importpath = "go-common/app/interface/main/app-show/model/region",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-show/model:go_default_library",
"//app/interface/main/app-show/model/activity:go_default_library",
"//app/interface/main/app-show/model/banner:go_default_library",
"//app/interface/main/app-show/model/recommend:go_default_library",
"//app/interface/main/app-show/model/tag:go_default_library",
"//app/service/main/account/api:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//app/service/openplatform/pgc-season/api/grpc/season/v1:go_default_library",
"//library/time: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"],
)

Some files were not shown because too many files have changed in this diff Show More