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

28
app/admin/main/feed/BUILD Normal file
View File

@@ -0,0 +1,28 @@
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/admin/main/feed/cmd:all-srcs",
"//app/admin/main/feed/conf:all-srcs",
"//app/admin/main/feed/dao/account:all-srcs",
"//app/admin/main/feed/dao/archive:all-srcs",
"//app/admin/main/feed/dao/bfs:all-srcs",
"//app/admin/main/feed/dao/egg:all-srcs",
"//app/admin/main/feed/dao/pgc:all-srcs",
"//app/admin/main/feed/dao/search:all-srcs",
"//app/admin/main/feed/dao/show:all-srcs",
"//app/admin/main/feed/http:all-srcs",
"//app/admin/main/feed/model:all-srcs",
"//app/admin/main/feed/service:all-srcs",
"//app/admin/main/feed/util:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,54 @@
### 天马流量后台
##### Version 1.1.6
> 1.流量后台23期
##### Version 1.1.5
> 1.事件专题卡片
##### Version 1.1.4
> 1.事件专题卡片
##### Version 1.1.3
> 1.修复频道干预筛选错误
##### Version 1.1.2
> 1.频道tab干预
##### Version 1.1.1
> 1.字符串两端 空格过滤
##### Version 1.1.0
> 1.APP首页运营tab大卡支持PGC内容播放
> 2.修复搜索词 重复问题
##### Version 1.0.9
> 1.APP首页运营tab大卡支持PGC内容播放
##### Version 1.0.8
> 1.fix 搜索词优先级问题
##### Version 1.0.7
> 1.流量后台21期 批量获取pgc卡片数据
##### Version 1.0.6
##### Version 1.0.5
> 1.【热门运营】【卡片位置推荐】新增创作新星卡片
> 2.【频道运营】【卡片位置推荐】新增PGC聚合卡片和单推UP主卡片
##### Version 1.0.4
> 1.后台搜索优化V2
##### Version 1.0.3
> 1.此版retag错误 跳过
##### Version 1.0.2
> 1.manager搜索改版
##### Version 1.0.1
> 1.grpc方式调pcg接口
##### Version 1.0.0
> 1.初始化代码

View File

@@ -0,0 +1,12 @@
# Owner
liweijia
renwei
# Author
zhaoshichen
quguolin
# Reviewer
renwei
liweijia
zhaoshichen

View File

@@ -0,0 +1,18 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- liweijia
- quguolin
- renwei
- zhaoshichen
labels:
- admin
- admin/main/feed
- main
options:
no_parent_owners: true
reviewers:
- liweijia
- quguolin
- renwei
- zhaoshichen

View File

@@ -0,0 +1,10 @@
#### feed
##### 项目简介
> 1.天马流量后台
##### 编译环境
> 请只用golang v1.9.x以上版本编译执行。
##### 依赖包
> 1.公共包go-common

View File

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

View File

@@ -0,0 +1,126 @@
version = "1.0.0"
user = "nobody"
dir = "./"
family = "feed-admin"
env = "uat"
[log]
dir = "/data/log/feed-admin/"
[orm]
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 = 5
idleTimeout = "4h"
[ormResource]
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 = 5
idleTimeout = "4h"
[HTTPServer]
addr = "0.0.0.0:6683"
timeout = "1s"
[auth]
managerHost = "http://uat-manager.bilibili.co"
dashboardHost = "http://dashboard-mng.bilibili.co"
dashboardCaller = "manager-go"
[auth.DsHTTPClient]
key = "manager-go"
secret = "949bbb2dd3178252638c2407578bc7ad"
dial = "1s"
timeout = "1s"
keepAlive = "60s"
[auth.DsHTTPClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[auth.MaHTTPClient]
key = "f6433799dbd88751"
secret = "36f8ddb1806207fe07013ab6a77a3935"
dial = "1s"
timeout = "1s"
keepAlive = "60s"
[auth.MaHTTPClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[auth.session]
sessionIDLength = 32
cookieLifeTime = 1800
cookieName = "mng-go"
domain = ".bilibili.co"
[auth.session.Memcache]
name = "go-business/auth"
proto = "tcp"
addr = "172.16.33.54:11211"
active = 10
idle = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "80s"
[httpClient]
key = "1f2620da295d326b"
secret = "test"
dial = "500ms"
timeout = "2s"
keepAlive = "60s"
timer = 10
[httpClient.breaker]
window = "10s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[bfs]
#key = "b525299741c108ef"
#secret = "ef1d0b536d4bcef04dd7c75014c51f"
#addr = "http://uat-bfs.bilibili.co/bfs/feed-admin/"
#bucket = "feed-admin"
#timeout = "10s"
key = "b525299741c108ef"
secret = "ef1d0b536d4bcef04dd7c75014c51f"
addr = "http://bfs.bilibili.co/bfs/feed-admin/"
bucket = "feed-admin"
timeout = "10s"
maxFileSize = 10485760
[archiveRPC]
timeout = "500ms"
[archiveRPC.conf]
domain = "api.bilibili.co"
key = "53e2fa226f5ad348"
secret = "3cf6bd1b0ff671021da5f424fea4b04a"
[accountRPC]
timeout = "500ms"
[accountRPC.conf]
domain = "api.bilibili.co"
key = "53e2fa226f5ad348"
secret = "3cf6bd1b0ff671021da5f424fea4b04a"
[memcache]
name = "tv-admin"
proto = "tcp"
addr = "172.18.33.60:11236"
active = 10
idle = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "80s"
[cfg]
# HotCroFre = "*/30 * * * * *"
# DarkCroFre = "*/30 * * * * *"
HotCroFre = "0 */10 * * * *"
DarkCroFre = "0 */10 * * * *"
# DarkCroFre = "0 */10 * * * *"
[host]
manager = "http://uat-manager.bilibili.co"

View File

@@ -0,0 +1,50 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"go-common/app/admin/main/feed/conf"
"go-common/app/admin/main/feed/http"
"go-common/library/log"
"go-common/library/net/trace"
"go-common/library/queue/databus/report"
)
func main() {
flag.Parse()
if err := conf.Init(); err != nil {
log.Error("conf.Init() error(%v)", err)
panic(err)
}
log.Init(conf.Conf.Log)
defer log.Close()
trace.Init(conf.Conf.Tracer)
defer trace.Close()
report.InitManager(conf.Conf.ManagerReport)
// service init
http.Init(conf.Conf)
log.Info("feed-admin start")
signalHandler()
}
func signalHandler() {
var (
c = make(chan os.Signal, 1)
)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
log.Info("feed-admin get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGSTOP, syscall.SIGINT:
log.Info("feed-admin exit")
return
case syscall.SIGHUP:
default:
return
}
}
}

View File

@@ -0,0 +1,40 @@
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["conf.go"],
importpath = "go-common/app/admin/main/feed/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/cache/memcache:go_default_library",
"//library/conf:go_default_library",
"//library/database/orm:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/permit:go_default_library",
"//library/net/rpc: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,142 @@
package conf
import (
"errors"
"flag"
"go-common/library/cache/memcache"
"go-common/library/conf"
"go-common/library/database/orm"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/permit"
"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
client *conf.Client
// Conf of config
Conf = &Config{}
)
// Memcache memcache.
type Memcache struct {
*memcache.Config
}
// Bfs Bfs.
type Bfs struct {
Timeout xtime.Duration
MaxFileSize int
Bucket string
Addr string
Key string
Secret string
}
// Cfg def
type Cfg struct {
// HotCroFre hotword crontab frequency
HotCroFre string
// DarkCroFre darkword crontab frequency
DarkCroFre string
//RunCront is run crontab
RunCront bool
}
//Host host
type Host struct {
Manager string
}
// Config def.
type Config struct {
// base
// http
HTTPServer *bm.ServerConfig
// httpClinet
HTTPClient *bm.ClientConfig
// host
Host *Host
// auth
Auth *permit.Config
// db
ORM *orm.Config
// db
ORMResource *orm.Config
// log
Log *log.Config
// tracer
Tracer *trace.Config
//mc
Memcache *Memcache
// Bfs
Bfs *Bfs
// log
ManagerReport *databus.Config
// BroadcastRPC grpc
PGCRPC *warden.ClientConfig
// rpc client
AccountRPC *rpc.ClientConfig
ArchiveRPC *rpc.ClientConfig
// Cfg
Cfg *Cfg
}
func local() (err error) {
_, err = toml.DecodeFile(confPath, &Conf)
return
}
func remote() (err error) {
if client, err = conf.New(); err != nil {
return
}
if err = load(); err != nil {
return
}
go func() {
for range client.Event() {
log.Info("config reload")
if load() != nil {
log.Error("config reload error (%v)", err)
}
}
}()
return
}
func load() (err error) {
var (
s string
ok bool
tmpConf *Config
)
if s, ok = client.Toml2(); !ok {
return errors.New("load config center error")
}
if _, err = toml.Decode(s, &tmpConf); err != nil {
return errors.New("could not decode config")
}
*Conf = *tmpConf
return
}
func init() {
flag.StringVar(&confPath, "conf", "", "default config path")
}
// Init int config
func Init() error {
if confPath != "" {
return local()
}
return remote()
}

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"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//library/ecode: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/admin/main/feed/dao/account",
tags = ["automanaged"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/account/rpc/client: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 account
import (
"context"
"go-common/app/admin/main/feed/conf"
account "go-common/app/service/main/account/model"
accrpc "go-common/app/service/main/account/rpc/client"
)
// Dao is account dao.
type Dao struct {
// rpc
accRPC *accrpc.Service3
}
// New account dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
accRPC: accrpc.New3(c.AccountRPC),
}
return
}
// Card3 get card info by mid
func (d *Dao) Card3(c context.Context, mid int64) (res *account.Card, err error) {
arg := &account.ArgMid{Mid: mid}
if res, err = d.accRPC.Card3(c, arg); err != nil {
return
}
return
}

View File

@@ -0,0 +1,51 @@
package account
import (
"context"
"encoding/json"
"flag"
"fmt"
"path/filepath"
"testing"
"time"
"go-common/app/admin/main/feed/conf"
"go-common/library/ecode"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func init() {
dir, _ := filepath.Abs("../../cmd/feed-admin-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(5 * time.Second)
}
func Test_Card(t *testing.T) {
Convey("Card", t, func() {
acc, err := d.Card3(context.TODO(), 400062)
if err != nil {
if err.Error() == ecode.MemberNotExist.Error() {
fmt.Println("MemberNotExist")
return
}
}
So(err, ShouldBeNil)
v, err := json.Marshal(acc)
if err != nil {
fmt.Printf("%v", err)
return
}
if v == nil {
fmt.Println("empty value")
} else {
fmt.Println(string(v))
}
})
}

View File

@@ -0,0 +1,49 @@
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/admin/main/feed/conf:go_default_library",
"//library/ecode: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/admin/main/feed/dao/archive",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/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,35 @@
package archive
import (
"context"
"go-common/app/admin/main/feed/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 {
// rpc
arcRPC *arcrpc.Service2
}
// New account dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
arcRPC: arcrpc.New2(c.ArchiveRPC),
}
return
}
// Archive3 get archive.
func (d *Dao) Archive3(c context.Context, aid int64) (a *api.Arc, err error) {
arg := &archive.ArgAid2{Aid: aid}
if a, err = d.arcRPC.Archive3(c, arg); err != nil {
log.Error("d.arcRPC.Archive3(%v) error(%+v)", arg, err)
return
}
return
}

View File

@@ -0,0 +1,51 @@
package archive
import (
"context"
"encoding/json"
"flag"
"fmt"
"path/filepath"
"testing"
"time"
"go-common/app/admin/main/feed/conf"
"go-common/library/ecode"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func init() {
dir, _ := filepath.Abs("../../cmd/feed-admin-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
time.Sleep(5 * time.Second)
}
func Test_Archive3(t *testing.T) {
Convey("Card", t, func() {
arc, err := d.Archive3(context.TODO(), 10099667)
if err != nil {
if err == ecode.NothingFound {
fmt.Println("NothingFound")
return
}
}
So(err, ShouldBeNil)
v, err := json.Marshal(arc)
if err != nil {
fmt.Println(err)
return
}
if v == nil {
fmt.Println("empty value")
} else {
fmt.Println(string(v))
}
})
}

View File

@@ -0,0 +1,45 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["bfs_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["bfs.go"],
importpath = "go-common/app/admin/main/feed/dao/bfs",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/conf: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,118 @@
package bfs
import (
"bytes"
"context"
"crypto/hmac"
"crypto/md5"
"crypto/sha1"
"encoding/base64"
"encoding/hex"
"fmt"
"hash"
"io"
"net/http"
"strconv"
"time"
"go-common/app/admin/main/feed/conf"
"go-common/library/log"
)
const (
_template = "%s\n%s\n\n%d\n"
_method = "PUT"
)
// Dao is bfs dao.
type Dao struct {
c *conf.Config
client *http.Client
bucket string
url string
key string
secret string
}
//New bfs dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
// http client
client: &http.Client{
Timeout: time.Duration(c.Bfs.Timeout),
},
bucket: c.Bfs.Bucket,
url: c.Bfs.Addr,
key: c.Bfs.Key,
secret: c.Bfs.Secret,
}
return
}
// Upload upload bfs.
func (d *Dao) Upload(c context.Context, fileType string, body io.Reader) (location string, err error) {
req, err := http.NewRequest(_method, d.url, body)
if err != nil {
log.Error("http.NewRequest error (%v) | fileType(%s) body(%v)", err, fileType, body)
return
}
expire := time.Now().Unix()
authorization := authorize(d.key, d.secret, _method, d.bucket, expire)
req.Header.Set("Host", d.url)
req.Header.Add("Date", fmt.Sprint(expire))
req.Header.Add("Authorization", authorization)
req.Header.Add("Content-Type", fileType)
log.Error("Authorization_:%v", authorization)
// timeout
c, cancel := context.WithTimeout(c, time.Duration(d.c.Bfs.Timeout))
req = req.WithContext(c)
defer cancel()
resp, err := d.client.Do(req)
if err != nil {
log.Error("d.Client.Do error(%v) | _url(%s) req(%v)", err, d.url, req)
err = fmt.Errorf("d.Client.Do error(%v) | _url(%s) req(%v)", err, d.url, req)
return
}
if resp.StatusCode != http.StatusOK {
log.Error("Upload http.StatusCode nq http.StatusOK (%d) | url(%s)", resp.StatusCode, d.url)
err = fmt.Errorf("Upload http.StatusCode nq http.StatusOK (%d) | url(%s)", resp.StatusCode, d.url)
return
}
header := resp.Header
code := header.Get("Code")
if code != strconv.Itoa(http.StatusOK) {
log.Error("strconv.Itoa err, code(%s) | url(%s)", code, d.url)
err = fmt.Errorf("strconv.Itoa err, code(%s) | url(%s)", code, d.url)
return
}
location = header.Get("Location")
return
}
// authorize returns authorization for upload file to bfs
func authorize(key, secret, method, bucket string, expire int64) (authorization string) {
var (
content string
mac hash.Hash
signature string
)
content = fmt.Sprintf(_template, method, bucket, expire)
mac = hmac.New(sha1.New, []byte(secret))
mac.Write([]byte(content))
signature = base64.StdEncoding.EncodeToString(mac.Sum(nil))
authorization = fmt.Sprintf("%s:%s:%d", key, signature, expire)
return
}
// FileMd5 calculates the local file's md5 and store it in a file
func (d *Dao) FileMd5(content []byte) (md5Str string, err error) {
md5hash := md5.New()
if _, err = io.Copy(md5hash, bytes.NewReader(content)); err != nil {
log.Error("FileMd5 is error (%v)", err)
return
}
md5 := md5hash.Sum(nil)
md5Str = hex.EncodeToString(md5[:])
return
}

View File

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

View File

@@ -0,0 +1,43 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/admin/main/feed/dao/egg",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//library/database/orm:go_default_library",
"//vendor/github.com/jinzhu/gorm:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = ["//app/admin/main/feed/conf:go_default_library"],
)

View File

@@ -0,0 +1,46 @@
package egg
import (
"context"
"go-common/app/admin/main/feed/conf"
"go-common/library/database/orm"
"github.com/jinzhu/gorm"
)
// Dao struct user of color egg Dao.
type Dao struct {
// db
DB *gorm.DB
}
// New create a instance of color egg Dao and return.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// db
DB: orm.NewMySQL(c.ORM),
}
d.initORM()
return
}
func (d *Dao) initORM() {
d.DB.LogMode(true)
}
// Ping check connection of db , mc.
func (d *Dao) Ping(c context.Context) (err error) {
if d.DB != nil {
err = d.DB.DB().PingContext(c)
return
}
return
}
// Close close connection of db , mc.
func (d *Dao) Close() {
if d.DB != nil {
d.DB.Close()
}
}

View File

@@ -0,0 +1,33 @@
package egg
import (
"flag"
"go-common/app/admin/main/feed/conf"
"os"
"testing"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app", "feed-admin")
flag.Set("app_id", "main.web-svr.feed-admin")
flag.Set("conf_token", "e0d2b216a460c8f8492473a2e3cdd218")
flag.Set("tree_id", "45266")
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)
os.Exit(m.Run())
}

View File

@@ -0,0 +1,53 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"grpc.go",
],
importpath = "go-common/app/admin/main/feed/dao/pgc",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/service/openplatform/pgc-season/api/grpc/episode/v1:go_default_library",
"//app/service/openplatform/pgc-season/api/grpc/season/v1: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"],
)
go_test(
name = "go_default_test",
srcs = [
"dao_test.go",
"grpc_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,34 @@
package pgc
import (
"go-common/app/admin/main/feed/conf"
epgrpc "go-common/app/service/openplatform/pgc-season/api/grpc/episode/v1"
seasongrpc "go-common/app/service/openplatform/pgc-season/api/grpc/season/v1"
"go-common/library/log"
)
// Dao is show dao.
type Dao struct {
// grpc
rpcClient seasongrpc.SeasonClient
epClient epgrpc.EpisodeClient
}
// New new a bangumi dao.
func New(c *conf.Config) (*Dao, error) {
var ep epgrpc.EpisodeClient
rpcClient, err := seasongrpc.NewClient(nil)
if err != nil {
log.Error("seasongrpc NewClientt error(%v)", err)
return nil, err
}
if ep, err = epgrpc.NewClient(nil); err != nil {
log.Error("eprpc NewClientt error(%v)", err)
return nil, err
}
d := &Dao{
rpcClient: rpcClient,
epClient: ep,
}
return d, nil
}

View File

@@ -0,0 +1,34 @@
package pgc
import (
"flag"
"os"
"testing"
"go-common/app/admin/main/feed/conf"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app", "feed-admin")
flag.Set("app_id", "main.web-svr.feed-admin")
flag.Set("conf_token", "e0d2b216a460c8f8492473a2e3cdd218")
flag.Set("tree_id", "45266")
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)
os.Exit(m.Run())
}

View File

@@ -0,0 +1,38 @@
package pgc
import (
"context"
epgrpc "go-common/app/service/openplatform/pgc-season/api/grpc/episode/v1"
seasongrpc "go-common/app/service/openplatform/pgc-season/api/grpc/season/v1"
"go-common/library/log"
)
//CardsInfoReply pgc grpc
func (d *Dao) CardsInfoReply(c context.Context, seasonIds []int32) (res map[int32]*seasongrpc.CardInfoProto, err error) {
arg := &seasongrpc.SeasonInfoReq{
SeasonIds: seasonIds,
}
info, err := d.rpcClient.Cards(c, arg)
if err != nil {
log.Error("d.rpcClient.Cards error(%v)", err)
return nil, err
}
res = info.Cards
return
}
//CardsEpInfoReply get pgc ep cards values by epid
func (d *Dao) CardsEpInfoReply(c context.Context, epIds []int32) (res map[int32]*epgrpc.EpisodeCardsProto, err error) {
var epInfo *epgrpc.EpisodeCardsReply
arg := &epgrpc.EpReq{
Epids: epIds,
}
epInfo, err = d.epClient.Cards(c, arg)
if err != nil {
log.Error("d.rpcClient.Cards error(%v)", err)
return nil, err
}
res = epInfo.Cards
return
}

View File

@@ -0,0 +1,40 @@
package pgc
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestPgcCardsInfoReply(t *testing.T) {
convey.Convey("CardsInfoReply", t, func(ctx convey.C) {
var (
c = context.Background()
seasonIds = []int32{33730}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err := d.CardsInfoReply(c, seasonIds)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestPgcCardsEpInfoReply(t *testing.T) {
convey.Convey("CardsEpInfoReply", t, func(ctx convey.C) {
var (
c = context.Background()
epIds = []int32{117117}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err := d.CardsEpInfoReply(c, epIds)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}

View File

@@ -0,0 +1,54 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"search.go",
],
importpath = "go-common/app/admin/main/feed/dao/search",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/admin/main/feed/model/search:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/database/orm:go_default_library",
"//vendor/github.com/jinzhu/gorm:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = [
"dao_test.go",
"search_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,49 @@
package search
import (
"context"
"go-common/app/admin/main/feed/conf"
"go-common/library/cache/memcache"
"go-common/library/database/orm"
"github.com/jinzhu/gorm"
)
// Dao struct user of color egg Dao.
type Dao struct {
// db
DB *gorm.DB
MC *memcache.Pool
}
// New create a instance of color egg Dao and return.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// db
DB: orm.NewMySQL(c.ORMResource),
MC: memcache.NewPool(c.Memcache.Config),
}
d.initORM()
return
}
func (d *Dao) initORM() {
d.DB.LogMode(true)
}
// Ping check connection of db , mc.
func (d *Dao) Ping(c context.Context) (err error) {
if d.DB != nil {
err = d.DB.DB().PingContext(c)
return
}
return
}
// Close close connection of db , mc.
func (d *Dao) Close() {
if d.DB != nil {
d.DB.Close()
}
}

View File

@@ -0,0 +1,32 @@
package search
import (
"flag"
"go-common/app/admin/main/feed/conf"
"os"
"testing"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.web-svr.feed-admin")
flag.Set("conf_token", "e0d2b216a460c8f8492473a2e3cdd218")
flag.Set("tree_id", "45266")
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)
os.Exit(m.Run())
}

View File

@@ -0,0 +1,52 @@
package search
import (
"context"
"time"
searchModel "go-common/app/admin/main/feed/model/search"
"go-common/library/cache/memcache"
)
//SetSearchAuditStat set hot publish state to MC
func (d *Dao) SetSearchAuditStat(c context.Context, key string, state bool) (err error) {
var (
conn memcache.Conn
p searchModel.PublishState
)
p.Date = time.Now().Format("2006-01-02")
p.State = state
conn = d.MC.Get(c)
defer conn.Close()
itemJSON := &memcache.Item{
Key: key,
Flags: memcache.FlagJSON,
Object: p,
Expiration: 0,
}
if err = conn.Set(itemJSON); err != nil {
return
}
return
}
//GetSearchAuditStat get hot publish state from MC
func (d *Dao) GetSearchAuditStat(c context.Context, key string) (f bool, date string, err error) {
var (
conn memcache.Conn
item *memcache.Item
p searchModel.PublishState
)
conn = d.MC.Get(c)
defer conn.Close()
if item, err = conn.Get(key); err != nil {
if err == memcache.ErrNotFound {
return false, "", nil
}
return
}
if err = conn.Scan(item, &p); err != nil {
return
}
return p.State, p.Date, nil
}

View File

@@ -0,0 +1,42 @@
package search
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestSearchSetSearchAuditStat(t *testing.T) {
convey.Convey("SetSearchAuditStat", t, func(ctx convey.C) {
var (
c = context.Background()
key = "test"
state bool
)
state = true
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err := d.SetSearchAuditStat(c, key, state)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestSearchGetSearchAuditStat(t *testing.T) {
convey.Convey("GetSearchAuditStat", t, func(ctx convey.C) {
var (
c = context.Background()
key = "test"
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
f, date, err := d.GetSearchAuditStat(c, key)
ctx.Convey("Then err should be nil.f,date should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(date, convey.ShouldNotBeNil)
ctx.So(f, convey.ShouldNotBeNil)
})
})
})
}

View File

@@ -0,0 +1,66 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"app_active.go",
"card_set_stars.go",
"channel_tab.go",
"dao.go",
"event_topic.go",
"search_web.go",
"search_web_card.go",
],
importpath = "go-common/app/admin/main/feed/dao/show",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/admin/main/feed/model/common:go_default_library",
"//app/admin/main/feed/model/show:go_default_library",
"//library/database/orm:go_default_library",
"//library/log:go_default_library",
"//vendor/github.com/jinzhu/gorm:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = [
"app_active_test.go",
"card_set_stars_test.go",
"channel_tab_test.go",
"dao_test.go",
"event_topic_test.go",
"search_web_card_test.go",
"search_web_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/admin/main/feed/model/show:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,24 @@
package show
import (
"context"
"go-common/app/admin/main/feed/model/show"
"go-common/library/log"
"github.com/jinzhu/gorm"
)
// AAFindByID app active table find by id
func (d *Dao) AAFindByID(c context.Context, id int64) (active *show.AppActive, err error) {
active = &show.AppActive{}
if err = d.DB.Model(&show.AppActive{}).Where("id = ?", id).First(active).Error; err != nil {
if err == gorm.ErrRecordNotFound {
active = nil
err = nil
} else {
log.Error("dao.ormshow.app_active.findByID error(%v)", err)
}
}
return
}

View File

@@ -0,0 +1,23 @@
package show
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestShow_app_activeFindByID(t *testing.T) {
convey.Convey("AAFindByID", t, func(ctx convey.C) {
var (
c = context.Background()
id = int64(1)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
_, err := d.AAFindByID(c, id)
ctx.Convey("Then err should be nil.active should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}

View File

@@ -0,0 +1,57 @@
package show
import (
"go-common/app/admin/main/feed/model/common"
"go-common/app/admin/main/feed/model/show"
"go-common/library/log"
)
// PopularStarsAdd add popuar stars card
func (d *Dao) PopularStarsAdd(param *show.PopularStarsAP) (err error) {
if err = d.DB.Create(param).Error; err != nil {
log.Error("dao.show.PopularStarsAdd error(%v)", err)
return
}
return
}
// PopularStarsUpdate update popuar stars card
func (d *Dao) PopularStarsUpdate(param *show.PopularStarsUP) (err error) {
if err = d.DB.Model(&show.PopularStarsUP{}).Update(param).Error; err != nil {
log.Error("dao.show.PopularStarsUpdate error(%v)", err)
return
}
return
}
// PopularStarsDelete delete popuar stars card
func (d *Dao) PopularStarsDelete(id int64, t string) (err error) {
up := map[string]interface{}{
"deleted": common.Deleted,
}
w := map[string]interface{}{
"id": id,
"type": t,
}
if err = d.DB.Model(&show.PopularStars{}).Where(w).Update(up).Error; err != nil {
log.Error("dao.show.PopularStarsDelete error(%v)", err)
return
}
return
}
// PopularStarsReject reject popuar stars card
func (d *Dao) PopularStarsReject(id int64, t string) (err error) {
up := map[string]interface{}{
"status": common.Rejecte,
}
w := map[string]interface{}{
"id": id,
"type": t,
}
if err = d.DB.Model(&show.PopularStars{}).Where(w).Update(up).Error; err != nil {
log.Error("dao.show.PopularStarsReject error(%v)", err)
return
}
return
}

View File

@@ -0,0 +1,63 @@
package show
import (
"go-common/app/admin/main/feed/model/show"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestShowPopularStarsAdd(t *testing.T) {
convey.Convey("PopularStarsAdd", t, func(ctx convey.C) {
var (
param = &show.PopularStarsAP{
Type: "up_rcmd_new",
Value: "31",
Title: "title",
LongTitle: "longtitle",
Content: "[{\"id\":10099666,\"title\":\"uat-case-新转码系统1515660475\"},{\"id\":10099667,\"title\":\"测试-test22-秒开-1515660506\"}]",
}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.PopularStarsAdd(param)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowPopularStarsUpdate(t *testing.T) {
convey.Convey("PopularStarsUpdate", t, func(ctx convey.C) {
var (
param = &show.PopularStarsUP{
ID: 16,
Type: "up_rcmd_new",
Value: "32",
Title: "title",
LongTitle: "longtitle",
Content: "[{\"id\":10099666,\"title\":\"uat-case-新转码系统1515660475\"},{\"id\":10099667,\"title\":\"测试-test22-秒开-1515660506\"}]",
}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.PopularStarsUpdate(param)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowPopularStarsDelete(t *testing.T) {
convey.Convey("PopularStarsDelete", t, func(ctx convey.C) {
var (
id = int64(11)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.PopularStarsDelete(id, "up_rcmd_new")
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}

View File

@@ -0,0 +1,71 @@
package show
import (
"time"
"go-common/app/admin/main/feed/model/common"
"go-common/app/admin/main/feed/model/show"
"go-common/library/log"
)
// ChannelTabAdd add channel tab
func (d *Dao) ChannelTabAdd(param *show.ChannelTabAP) (err error) {
if err = d.DB.Create(param).Error; err != nil {
log.Error("dao.show.ChannelTabAdd error(%v)", err)
return
}
return
}
// ChannelTabUpdate update channel tab
func (d *Dao) ChannelTabUpdate(param *show.ChannelTabUP) (err error) {
if err = d.DB.Model(&show.ChannelTabUP{}).Update(param).Error; err != nil {
log.Error("dao.show.ChannelTabUpdate error(%v)", err)
return
}
return
}
// ChannelTabDelete delete channel tab
func (d *Dao) ChannelTabDelete(id int64) (err error) {
up := map[string]interface{}{
"is_delete": common.Deleted,
}
if err = d.DB.Model(&show.ChannelTab{}).Where("id = ?", id).Update(up).Error; err != nil {
log.Error("dao.show.ChannelTabDelete error(%v)", err)
return
}
return
}
// ChannelTabOffline offline channel tab
func (d *Dao) ChannelTabOffline(id int64) (err error) {
up := map[string]interface{}{
"etime": time.Now().Unix(),
}
if err = d.DB.Model(&show.ChannelTab{}).Where("id = ?", id).Update(up).Error; err != nil {
log.Error("dao.show.ChannelTabOffline error(%v)", err)
return
}
return
}
// ChannelTabValid conflict check
func (d *Dao) ChannelTabValid(id, tagID, sTime int64, eTime int64, priority int) (count int, err error) {
w := map[string]interface{}{
"is_delete": common.NotDeleted,
"tag_id": tagID,
}
if priority != 0 {
w["priority"] = priority
}
query := d.DB.Model(&show.ChannelTab{}).Where("stime < ?", eTime).Where("etime > ?", sTime)
if id != 0 {
query = query.Where("id != ?", id)
}
if err = query.Where(w).Count(&count).Error; err != nil {
log.Error("dao.show.ChannelTabValid error(%v)", err)
return
}
return
}

View File

@@ -0,0 +1,70 @@
package show
import (
"testing"
"go-common/app/admin/main/feed/model/show"
"github.com/smartystreets/goconvey/convey"
)
func TestShowChannelTabAdd(t *testing.T) {
convey.Convey("ChannelTabAdd", t, func(ctx convey.C) {
var (
param = &show.ChannelTabAP{}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.ChannelTabAdd(param)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowChannelTabUpdate(t *testing.T) {
convey.Convey("ChannelTabUpdate", t, func(ctx convey.C) {
var (
param = &show.ChannelTabUP{}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.ChannelTabUpdate(param)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowChannelTabDelete(t *testing.T) {
convey.Convey("ChannelTabDelete", t, func(ctx convey.C) {
var (
id = int64(0)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.ChannelTabDelete(id)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowChannelTabValid(t *testing.T) {
convey.Convey("ChannelTabValid", t, func(ctx convey.C) {
var (
id = int64(0)
tagID = int64(0)
sTime = int64(0)
eTime = int64(0)
priority = int(0)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
count, err := d.ChannelTabValid(id, tagID, sTime, eTime, priority)
ctx.Convey("Then err should be nil.count should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(count, convey.ShouldNotBeNil)
})
})
})
}

View File

@@ -0,0 +1,46 @@
package show
import (
"context"
"go-common/app/admin/main/feed/conf"
"go-common/library/database/orm"
"github.com/jinzhu/gorm"
)
// Dao struct user of color egg Dao.
type Dao struct {
// db
DB *gorm.DB
}
// New create a instance of color egg Dao and return.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// db
DB: orm.NewMySQL(c.ORM),
}
d.initORM()
return
}
func (d *Dao) initORM() {
d.DB.LogMode(true)
}
// Ping check connection of db , mc.
func (d *Dao) Ping(c context.Context) (err error) {
if d.DB != nil {
err = d.DB.DB().PingContext(c)
return
}
return
}
// Close close connection of db , mc.
func (d *Dao) Close() {
if d.DB != nil {
d.DB.Close()
}
}

View File

@@ -0,0 +1,36 @@
package show
import (
"flag"
"os"
"testing"
"go-common/app/admin/main/feed/conf"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app", "feed-admin")
flag.Set("app_id", "main.web-svr.feed-admin")
flag.Set("conf_token", "e0d2b216a460c8f8492473a2e3cdd218")
flag.Set("tree_id", "45266")
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/feed-admin-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
os.Exit(m.Run())
}

View File

@@ -0,0 +1,56 @@
package show
import (
"go-common/app/admin/main/feed/model/common"
"go-common/app/admin/main/feed/model/show"
"go-common/library/log"
"github.com/jinzhu/gorm"
)
// EventTopicAdd add event topic
func (d *Dao) EventTopicAdd(param *show.EventTopicAP) (err error) {
if err = d.DB.Create(param).Error; err != nil {
log.Error("dao.show.EventTopicAdd error(%v)", err)
return
}
return
}
// EventTopicUpdate update event topic
func (d *Dao) EventTopicUpdate(param *show.EventTopicUP) (err error) {
if err = d.DB.Model(&show.EventTopicUP{}).Update(param).Error; err != nil {
log.Error("dao.show.EventTopicUpdate error(%v)", err)
return
}
return
}
// EventTopicDelete delete cevent topic
func (d *Dao) EventTopicDelete(id int64) (err error) {
up := map[string]interface{}{
"deleted": common.Deleted,
}
if err = d.DB.Model(&show.EventTopic{}).Where("id = ?", id).Update(up).Error; err != nil {
log.Error("dao.show.EventTopicDelete error(%v)", err)
return
}
return
}
// ETFindByID event topic table find by id
func (d *Dao) ETFindByID(id int64) (topic *show.EventTopic, err error) {
topic = &show.EventTopic{}
w := map[string]interface{}{
"deleted": common.NotDeleted,
}
if err = d.DB.Model(&show.EventTopic{}).Where("id = ?", id).Where(w).First(topic).Error; err != nil {
if err == gorm.ErrRecordNotFound {
topic = nil
err = nil
} else {
log.Error("dao.ormshow.event_topic.findByID error(%v)", err)
}
}
return
}

View File

@@ -0,0 +1,80 @@
package show
import (
"go-common/app/admin/main/feed/model/show"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestShowEventTopicAdd(t *testing.T) {
convey.Convey("EventTopicAdd", t, func(ctx convey.C) {
var (
param = &show.EventTopicAP{
Title: "title",
Desc: "desc",
Cover: "cover",
Retype: 1,
Revalue: "revalue",
Corner: "corner",
Person: "person",
}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.EventTopicAdd(param)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowEventTopicUpdate(t *testing.T) {
convey.Convey("EventTopicUpdate", t, func(ctx convey.C) {
var (
param = &show.EventTopicUP{
ID: 1,
Title: "title111",
Desc: "desc111",
Cover: "cover111",
Retype: 1,
Revalue: "revalue111",
Corner: "corner111",
}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.EventTopicUpdate(param)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowEventTopicDelete(t *testing.T) {
convey.Convey("EventTopicDelete", t, func(ctx convey.C) {
var (
id = int64(1)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.EventTopicDelete(id)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowETFindByID(t *testing.T) {
convey.Convey("ETFindByID", t, func(ctx convey.C) {
var (
id = int64(2)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
_, err := d.ETFindByID(id)
ctx.Convey("Then err should be nil.topic should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}

View File

@@ -0,0 +1,195 @@
package show
import (
"encoding/json"
"fmt"
"go-common/app/admin/main/feed/model/common"
"go-common/app/admin/main/feed/model/show"
"go-common/library/log"
"github.com/jinzhu/gorm"
)
// SearchWebAdd add search web
func (d *Dao) SearchWebAdd(param *show.SearchWebAP) (err error) {
var (
querys []*show.SearchWebQuery
)
if param.Query != "" {
if err = json.Unmarshal([]byte(param.Query), &querys); err != nil {
return
}
}
tx := d.DB.Begin()
if err = tx.Model(&show.SearchWeb{}).Create(param).Error; err != nil {
log.Error("SearchWebAdd tx.Model Create(%+v) error(%v)", param, err)
err = tx.Rollback().Error
return
}
if len(querys) > 0 {
if err = tx.Model(&show.SearchWeb{}).Exec(show.BatchAddQuerySQL(param.ID, querys)).Error; err != nil {
log.Error("SearchWebAdd tx.Model Exec(%+v) error(%v)", param, err)
err = tx.Rollback().Error
return
}
}
if err = tx.Commit().Error; err != nil {
return
}
return
}
// SearchWebUpdate update
func (d *Dao) SearchWebUpdate(param *show.SearchWebUP) (err error) {
var (
newQuerys []*show.SearchWebQuery
)
if param.Query != "" {
if err = json.Unmarshal([]byte(param.Query), &newQuerys); err != nil {
return
}
}
tx := d.DB.Begin()
if err = tx.Error; err != nil {
log.Error("dao.SearchWebUpdate.DB.Begin error(%v)", err)
return
}
if err = tx.Model(&show.SearchWeb{}).Update(param).Error; err != nil {
log.Error("dao.SearchWebUpdate (%+v) error(%v)", param, err)
err = tx.Rollback().Error
return
}
var (
mapOldCData, mapNewQData map[int64]*show.SearchWebQuery
upQData, addQData, oldQData []*show.SearchWebQuery
delQData []int64
)
if len(newQuerys) > 0 {
if err = d.DB.Model(&show.SearchWeb{}).Where("sid=?", param.ID).Where("deleted=?", common.NotDeleted).Find(&oldQData).Error; err != nil {
log.Error("dao.SearchWebUpdate Find Old data (%+v) error(%v)", param.ID, err)
return
}
mapOldCData = make(map[int64]*show.SearchWebQuery, len(oldQData))
for _, v := range oldQData {
mapOldCData[v.ID] = v
}
//新数据在老数据中 更新老数据。新的数据不在老数据 添加新数据
for _, qData := range newQuerys {
if _, ok := mapOldCData[qData.ID]; ok {
upQData = append(upQData, qData)
} else {
addQData = append(addQData, qData)
}
}
mapNewQData = make(map[int64]*show.SearchWebQuery, len(newQuerys))
for _, v := range newQuerys {
mapNewQData[v.ID] = v
}
//老数据在新数据中 上面已经处理。老数据不在新数据中 删除老数据
for _, qData := range oldQData {
if _, ok := mapNewQData[qData.ID]; !ok {
delQData = append(delQData, qData.ID)
}
}
if len(upQData) > 0 {
if err = tx.Model(&show.SearchWebQuery{}).Exec(show.BatchEditQuerySQL(upQData)).Error; err != nil {
log.Error("dao.SearchWebUpdate tx.Model Exec(%+v) error(%v)", upQData, err)
err = tx.Rollback().Error
return
}
}
if len(delQData) > 0 {
if err = tx.Model(&show.SearchWebQuery{}).Where("id IN (?)", delQData).Updates(map[string]interface{}{"deleted": common.Deleted}).Error; err != nil {
log.Error("dao.SearchWebUpdate Updates(%+v) error(%v)", delQData, err)
err = tx.Rollback().Error
return
}
}
if len(addQData) > 0 {
if err = tx.Model(&show.SearchWebQuery{}).Exec(show.BatchAddQuerySQL(param.ID, addQData)).Error; err != nil {
log.Error("EditContest s.dao.DB.Model Create(%+v) error(%v)", addQData, err)
err = tx.Rollback().Error
return
}
}
} else {
if err = tx.Model(&show.SearchWebQuery{}).Where("sid IN (?)", param.ID).Updates(map[string]interface{}{"deleted": common.Deleted}).Error; err != nil {
log.Error("dao.SearchWebUpdate Updates(%+v) error(%v)", param.ID, err)
err = tx.Rollback().Error
return
}
}
err = tx.Commit().Error
return
}
// SearchWebDelete delete search web
func (d *Dao) SearchWebDelete(id int64) (err error) {
up := map[string]interface{}{
"deleted": common.Deleted,
}
tx := d.DB.Begin()
if err = tx.Error; err != nil {
log.Error("dao.SearchWebDelete.DB.Begin error(%v)", err)
return
}
if err = tx.Model(&show.SearchWeb{}).Where("id = ?", id).Update(up).Error; err != nil {
log.Error("dao.show.SearchWebDelete(%+v) error(%v)", id, err)
err = tx.Rollback().Error
return
}
if err = tx.Model(&show.SearchWebQuery{}).Where("sid = (?)", id).Updates(map[string]interface{}{"deleted": common.Deleted}).Error; err != nil {
log.Error("dao.SearchWebDelete Updates(%+v) error(%v)", id, err)
err = tx.Rollback().Error
return
}
err = tx.Commit().Error
return
}
// SearchWebOption option search web
func (d *Dao) SearchWebOption(up *show.SearchWebOption) (err error) {
if err = d.DB.Model(&show.SearchWebOption{}).Update(up).Error; err != nil {
log.Error("dao.SearchWebOption Updates(%+v) error(%v)", up, err)
}
return
}
// SWTimeValid search web time validate
func (d *Dao) SWTimeValid(param *show.SWTimeValid) (count int, err error) {
query := d.DB.Table("search_web_query").
Select("search_web_query.id").
Joins("left join search_web ON search_web.id = search_web_query.sid").
Where("value = ?", param.Query).
Where("priority = ?", param.Priority).
Where("`check` in (?)", []int{common.Verify, common.Pass, common.Valid}).
Where("stime <= ?", param.ETime).
Where("etime >= ?", param.STime).
Where("search_web_query.deleted = 0").
Where("search_web.deleted = 0")
if param.ID != 0 {
query = query.Where("search_web.id != ?", param.ID)
}
if err = query.Count(&count).Error; err != nil {
log.Error("dao.SWTimeValid Count error(%v)", err)
}
return
}
//SWFindByID search web table value find by id
func (d *Dao) SWFindByID(id int64) (value *show.SearchWeb, err error) {
value = &show.SearchWeb{}
w := map[string]interface{}{
"deleted": common.NotDeleted,
"id": id,
}
if err = d.DB.Model(&show.SearchWeb{}).Where(w).Find(value).Error; err != nil {
if err == gorm.ErrRecordNotFound {
err = fmt.Errorf("ID为%d的数据不存在", id)
return
}
return
}
return
}

View File

@@ -0,0 +1,56 @@
package show
import (
"go-common/app/admin/main/feed/model/common"
"go-common/app/admin/main/feed/model/show"
"go-common/library/log"
"github.com/jinzhu/gorm"
)
// SearchWebCardAdd add search web card
func (d *Dao) SearchWebCardAdd(param *show.SearchWebCardAP) (err error) {
if err = d.DB.Create(param).Error; err != nil {
log.Error("dao.show.SearchWebCardAdd error(%v)", err)
return
}
return
}
// SearchWebCardUpdate search update web card
func (d *Dao) SearchWebCardUpdate(param *show.SearchWebCardUP) (err error) {
if err = d.DB.Model(&show.SearchWebCardUP{}).Update(param).Error; err != nil {
log.Error("dao.show.SearchWebCardUpdate error(%v)", err)
return
}
return
}
// SearchWebCardDelete search delete cweb card
func (d *Dao) SearchWebCardDelete(id int64) (err error) {
up := map[string]interface{}{
"deleted": common.Deleted,
}
if err = d.DB.Model(&show.SearchWebCard{}).Where("id = ?", id).Update(up).Error; err != nil {
log.Error("dao.show.SearchWebCardDelete error(%v)", err)
return
}
return
}
// SWBFindByID search web card table find by id
func (d *Dao) SWBFindByID(id int64) (card *show.SearchWebCard, err error) {
card = &show.SearchWebCard{}
w := map[string]interface{}{
"deleted": common.NotDeleted,
}
if err = d.DB.Model(&show.SearchWebCard{}).Where("id = ?", id).Where(w).First(card).Error; err != nil {
if err == gorm.ErrRecordNotFound {
card = nil
err = nil
} else {
log.Error("dao.ormshow.event_topic.findByID error(%v)", err)
}
}
return
}

View File

@@ -0,0 +1,83 @@
package show
import (
"testing"
"go-common/app/admin/main/feed/model/show"
"github.com/smartystreets/goconvey/convey"
)
func TestShowSearchWebCardAdd(t *testing.T) {
convey.Convey("SearchWebCardAdd", t, func(ctx convey.C) {
var (
param = &show.SearchWebCardAP{
Type: 1,
Title: "搜索卡片",
Desc: "卡片描述",
Cover: "//bfs:",
ReType: 1,
ReValue: "http://",
Corner: "角标",
Person: "person",
}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.SearchWebCardAdd(param)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowSearchWebCardUpdate(t *testing.T) {
convey.Convey("SearchWebCardUpdate", t, func(ctx convey.C) {
var (
param = &show.SearchWebCardUP{
ID: 1,
Type: 1,
Title: "AA搜索卡片",
Desc: "AA卡片描述",
Cover: "//bfs:",
ReType: 1,
ReValue: "http://",
Corner: "角标",
}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.SearchWebCardUpdate(param)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowSearchWebCardDelete(t *testing.T) {
convey.Convey("SearchWebCardDelete", t, func(ctx convey.C) {
var (
id = int64(1)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.SearchWebCardDelete(id)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowSWBFindByID(t *testing.T) {
convey.Convey("SWBFindByID", t, func(ctx convey.C) {
var (
id = int64(1)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
_, err := d.SWBFindByID(id)
ctx.Convey("Then err should be nil.topic should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}

View File

@@ -0,0 +1,120 @@
package show
import (
"testing"
"go-common/app/admin/main/feed/model/show"
"github.com/smartystreets/goconvey/convey"
)
func TestShowSearchWebAdd(t *testing.T) {
convey.Convey("SearchWebAdd", t, func(ctx convey.C) {
var (
param = &show.SearchWebAP{
CardType: 1,
CardValue: "10",
Stime: 1545701985,
Etime: 1545711985,
Priority: 1,
Person: "quguolin",
ApplyReason: "test",
Query: "[{\"id\":7,\"value\":\"test1\"},{\"id\":8,\"value\":\"test2\"}]",
}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.SearchWebAdd(param)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowSearchWebUpdate(t *testing.T) {
convey.Convey("SearchWebUpdate", t, func(ctx convey.C) {
var (
param = &show.SearchWebUP{
ID: 2,
CardType: 1,
CardValue: "10",
Stime: 1545701985,
Etime: 1545711985,
Check: 1,
Status: 1,
Priority: 1,
Person: "quguolin",
ApplyReason: "test",
Query: "[{\"id\":7,\"value\":\"test1\"},{\"id\":8,\"value\":\"test2\"},{\"sid\":10099668,\"value\":\"aaa\"}]",
}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.SearchWebUpdate(param)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowSearchWebDelete(t *testing.T) {
convey.Convey("SearchWebDelete", t, func(ctx convey.C) {
var (
id = int64(4)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.SearchWebDelete(id)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowSearchWebOption(t *testing.T) {
convey.Convey("SearchWebOption", t, func(ctx convey.C) {
var (
up = &show.SearchWebOption{
ID: 1,
Check: 4,
Status: 1,
}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.SearchWebOption(up)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowSWTimeValid(t *testing.T) {
convey.Convey("SWTimeValid", t, func(ctx convey.C) {
var (
up = &show.SWTimeValid{
Priority: 1,
Query: "test1",
STime: 1543190400,
ETime: 1543449600,
}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
_, err := d.SWTimeValid(up)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestShowSWFindByID(t *testing.T) {
convey.Convey("SWFindByID", t, func(ctx convey.C) {
var (
id = int64(1)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
d.SWFindByID(id)
})
})
}

View File

@@ -0,0 +1,60 @@
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"bangumi.go",
"bfs.go",
"channel.go",
"common.go",
"egg.go",
"http.go",
"popular.go",
"search.go",
],
importpath = "go-common/app/admin/main/feed/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/admin/main/feed/model/channel:go_default_library",
"//app/admin/main/feed/model/common:go_default_library",
"//app/admin/main/feed/model/egg:go_default_library",
"//app/admin/main/feed/model/search:go_default_library",
"//app/admin/main/feed/model/show:go_default_library",
"//app/admin/main/feed/service/bfs:go_default_library",
"//app/admin/main/feed/service/channel:go_default_library",
"//app/admin/main/feed/service/common:go_default_library",
"//app/admin/main/feed/service/egg:go_default_library",
"//app/admin/main/feed/service/pgc:go_default_library",
"//app/admin/main/feed/service/popular:go_default_library",
"//app/admin/main/feed/service/search:go_default_library",
"//app/admin/main/feed/util:go_default_library",
"//app/service/openplatform/pgc-season/api/grpc/episode/v1:go_default_library",
"//app/service/openplatform/pgc-season/api/grpc/season/v1: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/permit:go_default_library",
"//library/net/http/blademaster/render:go_default_library",
"//library/time:go_default_library",
"//vendor/github.com/jinzhu/gorm: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 http
import (
epgrpc "go-common/app/service/openplatform/pgc-season/api/grpc/episode/v1"
seasongrpc "go-common/app/service/openplatform/pgc-season/api/grpc/season/v1"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
//getPgcSeason GetSeason get season from pgc with grpc
func getPgcSeason(c *bm.Context) {
var (
err error
seasonCards map[int32]*seasongrpc.CardInfoProto
)
res := map[string]interface{}{}
param := &struct {
ID int32 `form:"id" validate:"required"`
}{}
if err = c.Bind(param); err != nil {
return
}
v := []int32{param.ID}
if seasonCards, err = pgcSvr.GetSeason(c, v); err != nil {
res["message"] = "获取失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(seasonCards, nil)
}
//getPgcSeasons GetSeasons get season from pgc with grpc
func getPgcSeasons(c *bm.Context) {
var (
err error
seasonCards map[int32]*seasongrpc.CardInfoProto
)
res := map[string]interface{}{}
param := &struct {
IDs []int32 `form:"ids,split" validate:"required,dive,gt=0"`
}{}
if err = c.Bind(param); err != nil {
return
}
if seasonCards, err = pgcSvr.GetSeason(c, param.IDs); err != nil {
res["message"] = "获取失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(seasonCards, nil)
}
//getPgcEp GetSeasons get ep from pgc with grpc
func getPgcEp(c *bm.Context) {
var (
err error
epCards map[int32]*epgrpc.EpisodeCardsProto
)
res := map[string]interface{}{}
param := &struct {
IDs []int32 `form:"ids,split" validate:"required,dive,gt=0"`
}{}
if err = c.Bind(param); err != nil {
return
}
if epCards, err = pgcSvr.GetEp(c, param.IDs); err != nil {
res["message"] = "获取失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(epCards, nil)
}

View File

@@ -0,0 +1,55 @@
package http
import (
"io/ioutil"
"net/http"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/render"
)
func clientUpload(c *bm.Context) {
var (
req = c.Request
md5 string
url string
)
req.ParseMultipartForm(int64(bfsSvc.BfsMaxSize))
file, _, err := req.FormFile("file")
if err != nil {
log.Error("c.Request().FormFile(\"file\") error(%v) | ", err)
c.JSON(nil, ecode.RequestErr)
return
}
bs, err := ioutil.ReadAll(file)
file.Close()
if err != nil {
log.Error("ioutil.ReadAll(c.Request().Body) error(%v)", err)
c.JSON(nil, ecode.RequestErr)
return
}
if md5, err = bfsSvc.FileMd5(bs); err != nil {
log.Error("bfsSvc.FileMd5 error(%v)", err)
c.JSON(nil, ecode.RequestErr)
return
}
ftype := http.DetectContentType(bs)
//if model.IsCoverType(ftype) {
// log.Error("filetype not allow file type(%s)", ftype)
// renderErrMsg(c, ecode.RequestErr.Code(), "文件上传错误:图片类型错误")
// return
//}
if url, err = bfsSvc.ClientUpCover(c, ftype, bs); err != nil {
log.Error("bfsSvc.ClientUpCover error(%v)", err)
c.JSON("文件上传错误:"+err.Error(), ecode.RequestErr)
return
}
data := map[string]interface{}{
"url": url,
"md5": md5,
"size": len(bs),
}
c.Render(http.StatusOK, render.MapJSON(data))
}

View File

@@ -0,0 +1,264 @@
package http
import (
"strings"
"go-common/app/admin/main/feed/model/channel"
cardmodel "go-common/app/admin/main/feed/model/channel"
"go-common/app/admin/main/feed/model/common"
"go-common/app/admin/main/feed/model/show"
"go-common/app/admin/main/feed/util"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func trimSpace(v string) string {
return strings.TrimSpace(v)
}
func addCardSetup(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &channel.AddCardSetup{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
req.Value = trimSpace(req.Value)
if err = chanelSvc.AddCardSetup(req, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func cardSetupList(c *bm.Context) {
var (
err error
cPager *cardmodel.SetupPager
)
res := map[string]interface{}{}
req := &struct {
ID int `form:"id"`
Type string `form:"type" validate:"required"`
Person string `form:"person"`
Title string `form:"title"`
Ps int `json:"ps" form:"ps" default:"20"` // 分页大小
Pn int `json:"pn" form:"pn" default:"1"` // 第几个分页
}{}
if err = c.Bind(req); err != nil {
return
}
if cPager, err = chanelSvc.CardSetupList(req.ID, req.Type, req.Person, req.Title, req.Pn, req.Ps); err != nil {
res["message"] = "卡片获取失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(cPager, nil)
}
func delCardSetup(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &struct {
ID int `form:"id" validate:"required"`
Type string `form:"type" validate:"required"`
}{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if err = chanelSvc.DelCardSetup(req.ID, req.Type, name, uid); err != nil {
res["message"] = "卡片删除失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func updateCardSetup(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &cardmodel.UpdateCardSetup{}
if err = c.Bind(req); err != nil {
return
}
req.Value = trimSpace(req.Value)
card := &cardmodel.AddCardSetup{
Type: req.Type,
Value: req.Value,
Title: req.Title,
LongTitle: req.LongTitle,
Content: req.Content,
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if err = chanelSvc.UpdateCardSetup(req.ID, card, name, uid); err != nil {
res["message"] = "卡片更新失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func tabList(c *bm.Context) {
var (
err error
pager *show.ChannelTabPager
)
res := map[string]interface{}{}
req := &show.ChannelTabLP{}
if err = c.Bind(req); err != nil {
return
}
if pager, err = chanelSvc.TabList(req); err != nil {
res["message"] = "列表获取失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(pager, nil)
}
func addTab(c *bm.Context) {
var (
err error
//title string
)
res := map[string]interface{}{}
req := &show.ChannelTabAP{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
req.Person = name
req.UID = uid
if _, err = commonSvc.CardPreview(c, common.CardChannelTab, req.TabID); err != nil {
return
}
if err = chanelSvc.AddTab(c, req, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func updateTab(c *bm.Context) {
var (
err error
//title string
)
res := map[string]interface{}{}
req := &show.ChannelTabUP{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if req.ID <= 0 {
c.JSONMap(map[string]interface{}{"message": "ID 参数不合法"}, ecode.RequestErr)
c.Abort()
return
}
req.Person = name
req.UID = uid
if _, err = commonSvc.CardPreview(c, common.CardChannelTab, req.TabID); err != nil {
return
}
if err = chanelSvc.UpdateTab(c, req, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func deleteTab(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &struct {
ID int64 `form:"id" validate:"required"`
}{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if req.ID <= 0 {
c.JSONMap(map[string]interface{}{"message": "ID 参数不合法"}, ecode.RequestErr)
c.Abort()
return
}
if err = chanelSvc.DeleteTab(req.ID, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func offlineTab(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &struct {
ID int64 `form:"id" validate:"required"`
}{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if req.ID <= 0 {
c.JSONMap(map[string]interface{}{"message": "ID 参数不合法"}, ecode.RequestErr)
c.Abort()
return
}
if err = chanelSvc.OfflineTab(req.ID, name, uid); err != nil {
res["message"] = "卡片下线失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}

View File

@@ -0,0 +1,95 @@
package http
import (
"strconv"
"go-common/app/admin/main/feed/model/common"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func managerInfo(c *bm.Context) (uid int64, username string) {
if nameInter, ok := c.Get("username"); ok {
username = nameInter.(string)
}
if uidInter, ok := c.Get("uid"); ok {
uid = uidInter.(int64)
}
if username == "" {
cookie, err := c.Request.Cookie("username")
if err != nil {
log.Error("managerInfo get cookie error (%v)", err)
return
}
username = cookie.Value
c, err := c.Request.Cookie("uid")
if err != nil {
log.Error("managerInfo get cookie error (%v)", err)
return
}
uidInt, _ := strconv.Atoi(c.Value)
uid = int64(uidInt)
}
return
}
func cardPreview2(c *bm.Context) {
var (
err error
title string
res = map[string]interface{}{}
)
type Card struct {
Type string `form:"type" validate:"required"`
ID int64 `form:"id" validate:"required"`
}
card := &Card{}
if err = c.Bind(card); err != nil {
return
}
if title, err = commonSvc.CardPreview(c, card.Type, card.ID); err != nil {
res["message"] = err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
titleReturn := common.CardPreview{
Title: title,
}
c.JSON(titleReturn, nil)
}
func actionLog(c *bm.Context) {
var (
res = map[string]interface{}{}
)
type Log struct {
Type int64 `form:"module" validate:"required"`
Uame string `form:"uname"`
CtimeFrom string `form:"ctime_from"`
CtimeTo string `form:"ctime_to"`
Ps int64 `form:"ps" default:"20"`
Pn int64 `form:"pn" default:"1"`
}
log := &Log{}
if err := c.Bind(log); err != nil {
return
}
searchRes, err := commonSvc.LogAction(c, log.Type, log.Ps, log.Pn, log.CtimeFrom, log.CtimeTo, log.Uame)
if err != nil {
res["message"] = err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
res["data"] = searchRes.Item
res["pager"] = searchRes.Page
c.JSONMap(res, nil)
}
func cardType(c *bm.Context) {
var (
res = map[string]interface{}{}
)
res["data"] = commonSvc.CardType()
c.JSONMap(res, nil)
}

View File

@@ -0,0 +1,224 @@
package http
import (
"encoding/json"
"fmt"
eggModel "go-common/app/admin/main/feed/model/egg"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"github.com/jinzhu/gorm"
)
func addEgg(c *bm.Context) {
var (
err error
p []eggModel.Plat
)
res := map[string]interface{}{}
param := new(eggModel.Obj)
if err = c.Bind(param); err != nil {
return
}
uid, name := managerInfo(c)
e := &eggModel.Egg{
Stime: param.Stime,
Etime: param.Etime,
ShowCount: param.ShowCount,
UID: uid,
Publish: eggModel.NotPublish,
Person: name,
Delete: eggModel.NotDelete,
}
if err = json.Unmarshal([]byte(param.Plat), &p); err != nil {
res["message"] = "参数有误:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
if err = checkEgg(param.Query, e); err != nil {
res["message"] = err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
if err = eggSvc.AddEgg(e, p, param.Query); err != nil {
res["message"] = "添加失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//delEgg delete egg
func delEgg(c *bm.Context) {
var (
err error
egg *eggModel.Egg
)
res := map[string]interface{}{}
param := &struct {
ID uint `form:"id" validate:"required"`
}{}
if err = c.Bind(param); err != nil {
return
}
if egg, err = eggSvc.EggWithID(param.ID); err != nil {
if err == gorm.ErrRecordNotFound {
res["message"] = "找不到数据:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
res["message"] = "删除失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
if egg.Publish == eggModel.Publish {
res["message"] = "已发布彩蛋不能删除"
c.JSONMap(res, ecode.RequestErr)
return
}
uid, name := managerInfo(c)
if err = eggSvc.DelEgg(param.ID, name, uid); err != nil {
res["message"] = "删除失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//pubEgg publish egg
func pubEgg(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
param := &struct {
ID uint `form:"id" validate:"required"`
Publish uint8 `form:"publish"`
}{}
if err = c.Bind(param); err != nil {
return
}
uid, name := managerInfo(c)
if err = eggSvc.PubEgg(param.ID, param.Publish, name, uid); err != nil {
res["message"] = "发布失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//updateEgg update egg
func updateEgg(c *bm.Context) {
var (
err error
p []eggModel.Plat
)
res := map[string]interface{}{}
param := new(eggModel.ObjUpdate)
if err = c.Bind(param); err != nil {
return
}
uid, name := managerInfo(c)
e := &eggModel.Egg{
ID: param.ID,
Stime: param.Stime,
Etime: param.Etime,
ShowCount: param.ShowCount,
UID: uid,
Publish: eggModel.NotPublish,
Person: name,
Delete: eggModel.NotDelete,
}
if err = json.Unmarshal([]byte(param.Plat), &p); err != nil {
res["message"] = "json解析失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
if err = checkEgg(param.Query, e); err != nil {
res["message"] = err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
if err = eggSvc.UpdateEgg(e, p, param.Query); err != nil {
res["message"] = "更新失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//checkEgg check egg error
func checkEgg(w []string, e *eggModel.Egg) (err error) {
var (
flag bool
eW string
)
if len(w) > 20 {
err = fmt.Errorf("搜索词不能大于20个")
return
}
if e.ShowCount > 10 {
err = fmt.Errorf("彩蛋展示次数不能大于10")
return
}
if flag, eW, err = eggSvc.IsWdExist(w, e.Stime, e.Etime, e.ID); err != nil {
log.Error("eggSrv.checkEgg IsWdExist error(%v)", err)
return
}
if flag {
err = fmt.Errorf("搜索词 (%v) 已有彩蛋,请勿重复添加", eW)
return
}
return
}
//indexEgg get egg list
func indexEgg(c *bm.Context) {
var (
err error
eggs *eggModel.IndexPager
)
res := map[string]interface{}{}
param := &eggModel.IndexParam{}
if err = c.Bind(param); err != nil {
return
}
if eggs, err = eggSvc.IndexEgg(param); err != nil {
res["message"] = "查询失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(eggs, nil)
}
//searchEgg search api for search
func searchEgg(c *bm.Context) {
var (
err error
eggs []eggModel.SearchEgg
)
res := map[string]interface{}{}
if eggs, err = eggSvc.SearchEgg(); err != nil {
res["message"] = "搜索查询失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(eggs, nil)
}
//SearchEggWeb search api for web
func SearchEggWeb(c *bm.Context) {
var (
err error
eggs []eggModel.SearchEggWeb
)
res := map[string]interface{}{}
if eggs, err = eggSvc.SearchEggWeb(); err != nil {
res["message"] = "Web搜索查询失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(eggs, nil)
}

View File

@@ -0,0 +1,164 @@
package http
import (
"go-common/app/admin/main/feed/conf"
bfssvr "go-common/app/admin/main/feed/service/bfs"
"go-common/app/admin/main/feed/service/channel"
"go-common/app/admin/main/feed/service/common"
"go-common/app/admin/main/feed/service/egg"
pgcsvr "go-common/app/admin/main/feed/service/pgc"
"go-common/app/admin/main/feed/service/popular"
"go-common/app/admin/main/feed/service/search"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/permit"
)
var (
authSvc *permit.Permit
eggSvc *egg.Service
bfsSvc *bfssvr.Service
searchSvc *search.Service
pgcSvr *pgcsvr.Service
chanelSvc *channel.Service
popularSvc *popular.Service
cardSvc *channel.Service
commonSvc *common.Service
)
// initService init service
func initService(c *conf.Config) {
authSvc = permit.New(c.Auth)
eggSvc = egg.New(c)
bfsSvc = bfssvr.New(c)
searchSvc = search.New(c)
pgcSvr = pgcsvr.New(c)
chanelSvc = channel.New(c)
cardSvc = channel.New(c)
popularSvc = popular.New(c)
commonSvc = common.New(c)
}
// Init init http sever instance.
func Init(c *conf.Config) {
initService(c)
engine := bm.DefaultServer(c.HTTPServer)
innerRouter(engine)
// init internal server
if err := engine.Start(); err != nil {
log.Error("httpx.Serve error(%v)", err)
panic(err)
}
}
// innerRouter
func innerRouter(e *bm.Engine) {
// ping monitor
e.GET("/monitor/ping", ping)
//modules color eggs
feed := e.Group("/x/admin/feed")
{
feed.POST("/upload", clientUpload)
//对外 搜索
feed.GET("/eggSearch", searchEgg)
//对外 web
feed.GET("/eggSearchWeb", SearchEggWeb)
common := feed.Group("/common")
{
common.GET("/card/titlePreview", cardPreview2)
common.GET("/log/action", actionLog)
common.GET("/pgc/season", getPgcSeason)
common.GET("/pgc/seasons", getPgcSeasons)
common.GET("/pgc/ep", getPgcEp)
common.GET("/card/type", cardType)
}
egg := feed.Group("/egg")
{
egg.POST("/add", addEgg)
egg.GET("/index", indexEgg)
egg.POST("/update", updateEgg)
egg.POST("/publish", pubEgg)
egg.POST("/delete", delEgg)
}
//对外
open := feed.Group("/open")
{
//search
open.POST("/search/addHotword", openAddHotword) //搜索 添加热词
open.POST("/search/addDarkword", openAddDarkword) //搜索 添加黑马词
open.GET("/search/blackList", openBlacklist) //搜索 黑名单
open.GET("/search/hotwords", openHotList) //搜索 热词
open.GET("/search/darkword", openDarkword) //搜索 获取黑马词
open.GET("/search/webSearch", openSearchWeb) //web 搜索
open.POST("/ai/addPopStars", aiAddPopularStars) //AI 添加新星卡片
}
search := feed.Group("/search", authSvc.Permit("SEARCH_HOTWORD"))
{
search.GET("/blackList", blackList)
search.POST("/addBlack", addBlack)
search.POST("/delBlack", delBlack)
search.GET("/hot", HotList)
search.POST("/addInter", addInter)
search.POST("/updateInter", updateInter)
search.POST("/deleteHot", deleteHot)
search.POST("/updateSearch", updateSearch)
search.POST("/publishHot", publishHotWord)
search.POST("/publishDark", publishDarkWord)
search.GET("/dark", darkList)
search.POST("/delDark", deleteDark)
}
searchWeb := feed.Group("/search/web")
{
searchWeb.GET("/card/list", searchWebCardList)
searchWeb.POST("/card/add", addSearchWebCard)
searchWeb.POST("/card/update", upSearchWebCard)
searchWeb.POST("/card/delete", delSearchWebCard)
searchWeb.GET("/list", searchWebList)
searchWeb.POST("/add", addSearchWeb)
searchWeb.POST("/update", upSearchWeb)
searchWeb.POST("/delete", delSearchWeb)
searchWeb.POST("/opt", optSearchWeb)
}
cardsetup := feed.Group("/cardsetup")
{
cardsetup.POST("/add", addCardSetup)
cardsetup.GET("/list", cardSetupList)
cardsetup.POST("/delete", delCardSetup)
cardsetup.POST("/update", updateCardSetup)
}
channel := feed.Group("/channel")
{
tab := channel.Group("/tab")
{
tab.GET("/list", tabList)
tab.POST("/add", addTab)
tab.POST("/update", updateTab)
tab.POST("/delete", deleteTab)
tab.POST("/offline", offlineTab)
}
}
popular := feed.Group("/popular")
{
eventTopic := popular.Group("/event_topic")
{
eventTopic.GET("/list", eventTopicList)
eventTopic.POST("/add", addEventTopic)
eventTopic.POST("/update", upEventTopic)
eventTopic.GET("/delete", delEventTopic)
}
stars := popular.Group("/stars")
{
stars.GET("/list", popularStarsList)
stars.POST("/add", addPopularStars)
stars.POST("/update", updatePopularStars)
stars.POST("/delete", deletePopularStars)
stars.POST("/reject", rejectPopularStars)
}
}
}
}
// ping check server ok.
func ping(c *bm.Context) {
}

View File

@@ -0,0 +1,377 @@
package http
import (
"context"
"encoding/json"
"fmt"
"strconv"
"go-common/app/admin/main/feed/model/common"
"go-common/app/admin/main/feed/model/show"
"go-common/app/admin/main/feed/util"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func eventTopicList(c *bm.Context) {
var (
err error
pager *show.EventTopicPager
)
res := map[string]interface{}{}
req := &show.EventTopicLP{}
if err = c.Bind(req); err != nil {
return
}
if pager, err = popularSvc.EventTopicList(req); err != nil {
res["message"] = "列表获取失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(pager, nil)
}
func addEventTopic(c *bm.Context) {
var (
err error
//title string
)
res := map[string]interface{}{}
req := &show.EventTopicAP{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
req.Person = name
if err = popularSvc.AddEventTopic(c, req, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func upEventTopic(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &show.EventTopicUP{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if req.ID <= 0 {
c.JSONMap(map[string]interface{}{"message": "ID 参数不合法"}, ecode.RequestErr)
c.Abort()
return
}
if err = popularSvc.UpdateEventTopic(c, req, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func delEventTopic(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &struct {
ID int64 `form:"id" validate:"required"`
}{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if req.ID <= 0 {
c.JSONMap(map[string]interface{}{"message": "ID 参数不合法"}, ecode.RequestErr)
c.Abort()
return
}
if err = popularSvc.DeleteEventTopic(req.ID, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func popularStarsList(c *bm.Context) {
var (
err error
pager *show.PopularStarsPager
)
res := map[string]interface{}{}
req := &show.PopularStarsLP{}
if err = c.Bind(req); err != nil {
return
}
if pager, err = popularSvc.PopularStarsList(req); err != nil {
res["message"] = "列表获取失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(pager, nil)
}
//ValidateUpid .
func ValidateUpid(c context.Context, idStr string) (name string, err error) {
var (
id int64
)
if id, err = strconv.ParseInt(idStr, 10, 64); err != nil {
return
}
if name, err = commonSvc.CardPreview(c, common.CardUp, id); err != nil {
return
}
return
}
//ValidateAvid .
func ValidateAvid(c context.Context, values string) (err error) {
type Content struct {
ID int64 `json:"id"`
Title string `json:"title"`
}
var contents []*Content
if err = json.Unmarshal([]byte(values), &contents); err != nil {
return
}
dup := make(map[int64]bool)
for _, v := range contents {
if v == nil {
return fmt.Errorf("不能提交空数据!")
}
if dup[v.ID] {
return fmt.Errorf("重复视频ID (%d)", v.ID)
}
dup[v.ID] = true
if _, err = commonSvc.CardPreview(c, common.CardAv, v.ID); err != nil {
return
}
}
if len(contents) < 3 {
return fmt.Errorf("视频组成最少三个")
}
if len(contents) > 5 {
return fmt.Errorf("视频组成不能超过5个")
}
return
}
func addPopularStars(c *bm.Context) {
var (
err error
upName string
)
res := map[string]interface{}{}
req := &show.PopularStarsAP{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if err = ValidateAvid(c, req.Content); err != nil {
c.JSONMap(map[string]interface{}{"message": "视频ID 校验失败:" + err.Error()}, ecode.RequestErr)
c.Abort()
return
}
req.Value = util.TrimStrSpace(req.Value)
if upName, err = ValidateUpid(c, req.Value); err != nil {
c.JSONMap(map[string]interface{}{"message": "up主ID 校验失败:" + err.Error()}, ecode.RequestErr)
c.Abort()
return
}
req.Person = name
req.UID = uid
req.LongTitle = upName
if err = popularSvc.AddPopularStars(c, req, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func updatePopularStars(c *bm.Context) {
var (
err error
upName string
)
res := map[string]interface{}{}
req := &show.PopularStarsUP{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if req.ID <= 0 {
c.JSONMap(map[string]interface{}{"message": "ID 参数不合法"}, ecode.RequestErr)
c.Abort()
return
}
if err = ValidateAvid(c, req.Content); err != nil {
c.JSONMap(map[string]interface{}{"message": err.Error()}, ecode.RequestErr)
c.Abort()
return
}
req.Value = util.TrimStrSpace(req.Value)
if upName, err = ValidateUpid(c, req.Value); err != nil {
c.JSONMap(map[string]interface{}{"message": err.Error()}, ecode.RequestErr)
c.Abort()
return
}
req.LongTitle = upName
if err = popularSvc.UpdatePopularStars(c, req, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func deletePopularStars(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &struct {
ID int64 `form:"id" validate:"required"`
}{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if req.ID <= 0 {
c.JSONMap(map[string]interface{}{"message": "ID 参数不合法"}, ecode.RequestErr)
c.Abort()
return
}
if err = popularSvc.DeletePopularStars(req.ID, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func rejectPopularStars(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &struct {
ID int64 `form:"id" validate:"required"`
}{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if req.ID <= 0 {
c.JSONMap(map[string]interface{}{"message": "ID 参数不合法"}, ecode.RequestErr)
c.Abort()
return
}
if err = popularSvc.RejectPopularStars(req.ID, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func aiAddPopularStars(c *bm.Context) {
var (
err error
aids []byte
addPopStar []*show.PopularStarsAP
)
res := map[string]interface{}{}
req := &struct {
Data string `form:"data" validate:"required"`
}{}
if err = c.Bind(req); err != nil {
return
}
log.Info("aiAddPopularStars value(%v)", req.Data)
values := make([]*show.PopularStarsAIAP, 0)
if err = json.Unmarshal([]byte(req.Data), &values); err != nil {
log.Error("aiAddPopularStars.Unmarshal value(%v) error(%v)", req.Data, err)
res["message"] = "数据解析失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
for _, v := range values {
var (
AiValues []*show.AiValue
upName string
)
for _, aid := range v.Aids {
aiValue := &show.AiValue{
ID: aid,
}
AiValues = append(AiValues, aiValue)
}
if aids, err = json.Marshal(AiValues); err != nil {
log.Error("aiAddPopularStars.Marshal value(%v) error(%v)", v.Aids, err)
res["message"] = "数据encode失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
}
mid := strconv.FormatInt(v.Mid, 10)
if upName, err = ValidateUpid(c, mid); err != nil {
c.JSONMap(map[string]interface{}{"message": "up主ID 校验失败:" + err.Error()}, ecode.RequestErr)
c.Abort()
return
}
tmp := &show.PopularStarsAP{
LongTitle: upName,
Value: strconv.FormatInt(v.Mid, 10),
Content: string(aids),
}
addPopStar = append(addPopStar, tmp)
}
if err = popularSvc.AIAddPopularStars(c, addPopStar); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}

View File

@@ -0,0 +1,593 @@
package http
import (
"encoding/json"
searchModel "go-common/app/admin/main/feed/model/search"
"go-common/app/admin/main/feed/model/show"
"go-common/app/admin/main/feed/util"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
"go-common/library/time"
)
//Black 黑名单
func blackList(c *bm.Context) {
var (
err error
black []searchModel.Black
)
res := map[string]interface{}{}
if black, err = searchSvc.BlackList(); err != nil {
res["message"] = "获取失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(black, nil)
}
//addBlack 添加黑名单
func addBlack(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
param := new(searchModel.Black)
if err = c.Bind(param); err != nil {
return
}
uid, name := managerInfo(c)
if err = searchSvc.AddBlack(c, param.Searchword, name, uid); err != nil {
res["message"] = "获取失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//delBlack 删除黑名单
func delBlack(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
param := new(struct {
ID int `form:"id" validate:"required"`
})
if err = c.Bind(param); err != nil {
return
}
uid, name := managerInfo(c)
if err = searchSvc.DelBlack(c, param.ID, name, uid); err != nil {
res["message"] = "获取失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//openAddDarkword 对外 添加黑马词
func openAddDarkword(c *bm.Context) {
var (
err error
dark searchModel.OpenDark
)
res := map[string]interface{}{}
param := &struct {
Data string `form:"data" validate:"required"`
}{}
if err = c.Bind(param); err != nil {
return
}
if err = json.Unmarshal([]byte(param.Data), &dark); err != nil {
res["message"] = "参数有误:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
if err = searchSvc.OpenAddDarkword(c, dark); err != nil {
res["message"] = "添加失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//openBlacklist 对外 黑名单列表
func openBlacklist(c *bm.Context) {
var (
err error
black []searchModel.Black
)
res := map[string]interface{}{}
if black, err = searchSvc.BlackList(); err != nil {
res["message"] = "获取失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(black, nil)
}
//OpenHotList 对外 黑名单列表
func openHotList(c *bm.Context) {
var (
err error
hot []searchModel.Intervene
)
res := map[string]interface{}{}
if hot, err = searchSvc.OpenHotList(c); err != nil {
res["message"] = "获取失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(hot, nil)
}
//openDarkword 对外 获取黑马词
func openDarkword(c *bm.Context) {
var (
err error
dark []searchModel.Dark
)
res := map[string]interface{}{}
if dark, err = searchSvc.GetDarkPub(c); err != nil {
res["message"] = "获取失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(dark, nil)
}
//openAddHotword 对外 添加搜索热词
func openAddHotword(c *bm.Context) {
var (
err error
hot searchModel.OpenHot
)
res := map[string]interface{}{}
param := &struct {
Data string `form:"data" validate:"required"`
}{}
if err = c.Bind(param); err != nil {
return
}
if err = json.Unmarshal([]byte(param.Data), &hot); err != nil {
res["message"] = "参数有误:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
if err = searchSvc.OpenAddHotword(c, hot); err != nil {
res["message"] = "添加失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//publishHotWord publish hot word
func publishHotWord(c *bm.Context) {
var (
err error
res = map[string]interface{}{}
)
uid, name := managerInfo(c)
if err = searchSvc.SetHotPub(c, name, uid); err != nil {
res["message"] = "发布失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//publishDark publish dark word
func publishDarkWord(c *bm.Context) {
var (
err error
res = map[string]interface{}{}
)
uid, name := managerInfo(c)
if err = searchSvc.SetDarkPub(c, name, uid); err != nil {
res["message"] = "发布失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//addInter 添加干预
func addInter(c *bm.Context) {
var (
err error
res = map[string]interface{}{}
)
param := searchModel.InterveneAdd{}
if err = c.Bind(&param); err != nil {
return
}
uid, name := managerInfo(c)
if err = searchSvc.AddInter(c, param, name, uid); err != nil {
res["message"] = "添加失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//updateInter 更新干预
func updateInter(c *bm.Context) {
var (
err error
res = map[string]interface{}{}
)
param := struct {
ID int `form:"id" validate:"required"`
Searchword string `form:"searchword" validate:"required"`
Rank int `form:"position" validate:"required"`
Tag string `form:"tag"`
Stime time.Time `form:"stime" validate:"required"`
Etime time.Time `form:"etime" validate:"required"`
}{}
if err = c.Bind(&param); err != nil {
return
}
inter := searchModel.InterveneAdd{
Searchword: param.Searchword,
Rank: param.Rank,
Tag: param.Tag,
Stime: param.Stime,
Etime: param.Etime,
}
uid, name := managerInfo(c)
if err = searchSvc.UpdateInter(c, inter, param.ID, name, uid); err != nil {
res["message"] = "更新失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//deleteHot 删除热词
func deleteHot(c *bm.Context) {
var (
err error
res = map[string]interface{}{}
)
param := struct {
ID int `form:"id" validate:"required"`
Type uint8 `form:"type" validate:"required"`
}{}
if err = c.Bind(&param); err != nil {
return
}
uid, name := managerInfo(c)
if err = searchSvc.DeleteHot(c, param.ID, param.Type, name, uid); err != nil {
res["message"] = "删除失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//deleteDark 删除黑马词
func deleteDark(c *bm.Context) {
var (
err error
res = map[string]interface{}{}
)
param := struct {
ID int `form:"id" validate:"required"`
}{}
if err = c.Bind(&param); err != nil {
return
}
uid, name := managerInfo(c)
if err = searchSvc.DeleteDark(c, param.ID, name, uid); err != nil {
res["message"] = "删除失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//updateSearch 更新搜索推过来的词
func updateSearch(c *bm.Context) {
var (
err error
res = map[string]interface{}{}
)
param := struct {
ID int `form:"id" validate:"required"`
Tag string `form:"tag"`
}{}
if err = c.Bind(&param); err != nil {
return
}
uid, name := managerInfo(c)
if err = searchSvc.UpdateSearch(c, param.Tag, param.ID, name, uid); err != nil {
res["message"] = "更新失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
//HotList 搜索热词
func HotList(c *bm.Context) {
var (
err error
hotout searchModel.HotwordOut
)
res := map[string]interface{}{}
param := struct {
Date string `form:"date" validate:"required"`
}{}
if err = c.Bind(&param); err != nil {
return
}
if hotout, err = searchSvc.HotList(c, param.Date); err != nil {
res["message"] = "获取热词失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(hotout, nil)
}
//darkList 黑马词
func darkList(c *bm.Context) {
var (
err error
darkout searchModel.DarkwordOut
)
res := map[string]interface{}{}
param := struct {
Date string `form:"date" validate:"required"`
}{}
if err = c.Bind(&param); err != nil {
return
}
if darkout, err = searchSvc.DarkList(c, param.Date); err != nil {
res["message"] = "获取黑马词失败:" + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(darkout, nil)
}
func searchWebCardList(c *bm.Context) {
var (
err error
pager *show.SearchWebCardPager
)
res := map[string]interface{}{}
req := &show.SearchWebCardLP{}
if err = c.Bind(req); err != nil {
return
}
if pager, err = searchSvc.SearchWebCardList(req); err != nil {
res["message"] = "列表获取失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(pager, nil)
}
func addSearchWebCard(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &show.SearchWebCardAP{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
req.Person = name
if err = searchSvc.AddSearchWebCard(c, req, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func upSearchWebCard(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &show.SearchWebCardUP{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if req.ID <= 0 {
c.JSONMap(map[string]interface{}{"message": "ID 参数不合法"}, ecode.RequestErr)
c.Abort()
return
}
if err = searchSvc.UpdateSearchWebCard(c, req, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func delSearchWebCard(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &struct {
ID int64 `form:"id" validate:"required"`
}{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if req.ID <= 0 {
c.JSONMap(map[string]interface{}{"message": "ID 参数不合法"}, ecode.RequestErr)
c.Abort()
return
}
if err = searchSvc.DeleteSearchWebCard(req.ID, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func searchWebList(c *bm.Context) {
var (
err error
pager *show.SearchWebPager
)
res := map[string]interface{}{}
req := &show.SearchWebLP{}
if err = c.Bind(req); err != nil {
return
}
if pager, err = searchSvc.SearchWebList(req); err != nil {
res["message"] = "列表获取失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(pager, nil)
}
func openSearchWeb(c *bm.Context) {
var (
err error
pager []*show.SearchWeb
)
res := map[string]interface{}{}
if pager, err = searchSvc.OpenSearchWebList(); err != nil {
res["message"] = "列表获取失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(pager, nil)
}
func addSearchWeb(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &show.SearchWebAP{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
req.Person = name
if err = searchSvc.AddSearchWeb(c, req, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func upSearchWeb(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &show.SearchWebUP{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if req.ID <= 0 {
c.JSONMap(map[string]interface{}{"message": "ID 参数不合法"}, ecode.RequestErr)
c.Abort()
return
}
if err = searchSvc.UpdateSearchWeb(c, req, name, uid); err != nil {
res["message"] = "卡片创建失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func delSearchWeb(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &struct {
ID int64 `form:"id" validate:"required"`
}{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if req.ID <= 0 {
c.JSONMap(map[string]interface{}{"message": "ID 参数不合法"}, ecode.RequestErr)
c.Abort()
return
}
if err = searchSvc.DeleteSearchWeb(req.ID, name, uid); err != nil {
res["message"] = "卡片删除失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}
func optSearchWeb(c *bm.Context) {
var (
err error
)
res := map[string]interface{}{}
req := &struct {
ID int64 `form:"id" validate:"required"`
Opt string `form:"opt" validate:"required"`
}{}
if err = c.Bind(req); err != nil {
return
}
uid, name := util.UserInfo(c)
if name == "" {
c.JSONMap(map[string]interface{}{"message": "请重新登录"}, ecode.Unauthorized)
c.Abort()
return
}
if err = searchSvc.OptionSearchWeb(req.ID, req.Opt, name, uid); err != nil {
res["message"] = "修改失败 " + err.Error()
c.JSONMap(res, ecode.RequestErr)
return
}
c.JSON(nil, nil)
}

View File

@@ -0,0 +1,25 @@
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/admin/main/feed/model/channel:all-srcs",
"//app/admin/main/feed/model/common:all-srcs",
"//app/admin/main/feed/model/egg:all-srcs",
"//app/admin/main/feed/model/search:all-srcs",
"//app/admin/main/feed/model/show:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

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 = ["card.go"],
importpath = "go-common/app/admin/main/feed/model/channel",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = ["//app/admin/main/feed/model/common: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,77 @@
package channel
import (
"go-common/app/admin/main/feed/model/common"
)
var (
//NotDelete not delete
NotDelete uint8
//Delete delete
Delete uint8 = 1
//LogBusPgcsRcmd log business id
LogBusPgcsRcmd = 203
//LogBusRcmdNew log business id
LogBusRcmdNew = 204
//ActUpCsPgcRcmd log
ActUpCsPgcRcmd = "ActUpCsPgcRcmd"
//ActUpCsRcmdNew log
ActUpCsRcmdNew = "ActUpCsRcmdNew"
//ActDelCsPgcRcmd log
ActDelCsPgcRcmd = "ActDelCsPgcRcmd"
//ActDelCsRcmdNew log
ActDelCsRcmdNew = "ActDelCsRcmdNew"
//ActAddCsPgcRcmd log
ActAddCsPgcRcmd = "ActAddCsPgcRcmd"
//ActAddCsRcmdNew log
ActAddCsRcmdNew = "ActAddCsRcmdNew"
)
//AddCardSetup 复合卡片 需要首先单独创建 然后再在频道首页创建
type AddCardSetup struct {
Type string `form:"type" validate:"required"`
Value string `form:"value"`
Title string `form:"title"`
LongTitle string `form:"longtitle"`
Content string `form:"content" validate:"required"`
UID int64 `gorm:"column:uid"`
Person string
}
//UpdateCardSetup 复合卡片 需要首先单独创建 然后再在频道首页创建
type UpdateCardSetup struct {
ID int `form:"id" validate:"required"`
Type string `form:"type" validate:"required"`
Value string `form:"value"`
Title string `form:"title" validate:"required"`
LongTitle string `form:"longtitle"`
Content string `form:"content" validate:"required"`
}
//Setup 复合卡片 需要首先单独创建 然后再在频道首页创建
type Setup struct {
ID int `json:"id"`
Type string `json:"type"`
Value string `json:"value"`
Title string `json:"title"`
LongTitle string `json:"longtitle"`
Content string `json:"content"`
Deleted int `json:"deleted"`
Person string `json:"person"`
}
//SetupPager return values
type SetupPager struct {
Item []*Setup `json:"item"`
Page common.Page `json:"page"`
}
// TableName DarkPubLog dark word publish log
func (a Setup) TableName() string {
return "card_set"
}
// TableName DarkPubLog dark word publish log
func (a AddCardSetup) TableName() string {
return "card_set"
}

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 = [
"card.go",
"common.go",
"log.go",
],
importpath = "go-common/app/admin/main/feed/model/common",
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,20 @@
package common
const (
//CardPgc .
CardPgc = "pgc"
//CardAv card av
CardAv = "av"
//CardUp card uper
CardUp = "up"
//CardChannelTab .
CardChannelTab = "channel_tab"
//CardEventTopic 事件专题卡片
CardEventTopic = "event_topic"
//CardPgcsRcmd pgc聚集卡
CardPgcsRcmd = "pgcs_rcmd"
//CardUpRcmdNew 热门新星卡片
CardUpRcmdNew = "up_rcmd_new"
//CardSearchWeb 搜索web卡片
CardSearchWeb = "search_web"
)

View File

@@ -0,0 +1,42 @@
package common
const (
//NotDeleted db not deleted
NotDeleted = 0
//Deleted db deleted
Deleted = 1
//Verify 待审核
Verify = 1
//Pass 已通过
Pass = 2
//Rejecte 已拒绝
Rejecte = 3
//Valid 已生效
Valid = 4
//InValid 已失效
InValid = 5
//StatusOnline status online
StatusOnline = 1
//StatusDownline status downline
StatusDownline = 0
//OptionOnline option online
OptionOnline = "online"
//OptionHidden option downline
OptionHidden = "hidden"
//OptionPass option pass
OptionPass = "pass"
//OptionReject option reject
OptionReject = "reject"
)
//Page pager
type Page struct {
Num int `json:"num"`
Size int `json:"size"`
Total int `json:"total"`
}
//CardPreview card preview
type CardPreview struct {
Title string `json:"title"`
}

View File

@@ -0,0 +1,53 @@
package common
const (
//BusinessID action log business ID
BusinessID = 204
//LogPopularStars popular new start card log
LogPopularStars = 0
//LogChannelTab channel tab log
LogChannelTab = 1
//LogEventTopic popular event topic log
LogEventTopic = 2
//LogSWEBCard search web card log
LogSWEBCard = 3
//LogSWEB search web log
LogSWEB = 4
)
//LogManager .
type LogManager struct {
ID int `json:"id"`
OID int `json:"oid"`
Uname string `json:"uname"`
UID int `json:"uid"`
Type int `json:"module"`
ExtraData string `json:"content"`
Action string `json:"action"`
CTime string `json:"ctime"`
}
//LogSearch .
type LogSearch struct {
ID int `json:"id"`
OID int `json:"oid"`
Uname string `json:"uname"`
UID int `json:"uid"`
Type int `json:"type"`
ExtraData string `json:"extra_data"`
Action string `json:"action"`
CTime string `json:"ctime"`
}
//ManagerPage .
type ManagerPage struct {
CurrentPage int `json:"current_page"`
TotalItems int `json:"total_items"`
PageSize int `json:"page_size"`
}
//LogManagers .
type LogManagers struct {
Item []*LogManager `json:"item"`
Page ManagerPage `json:"pager"`
}

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 = ["egg.go"],
importpath = "go-common/app/admin/main/feed/model/egg",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/model/common: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,154 @@
package egg
import (
"go-common/app/admin/main/feed/model/common"
"go-common/library/time"
)
var (
//NotDelete egg not deleted
NotDelete uint8
//Delete egg deleted
Delete uint8 = 1
//Publish egg publish
Publish uint8 = 1
//NotPublish egg not publish
NotPublish uint8
//Business log businessID
Business = 201
)
//Obj add egg object
type Obj struct {
Query []string `json:"query" form:"query,split" validate:"required"`
Stime time.Time `json:"stime" form:"stime"`
Etime time.Time `json:"etime" form:"etime"`
ShowCount int `json:"show_count" form:"show_count" validate:"required"`
Plat string `json:"plat" form:"plat" validate:"required"`
}
//ObjUpdate add egg object
type ObjUpdate struct {
ID uint `form:"id" validate:"required"`
Query []string `json:"query" form:"query,split" validate:"required"`
Stime time.Time `json:"stime" form:"stime"`
Etime time.Time `json:"etime" form:"etime"`
ShowCount int `json:"show_count" form:"show_count" validate:"required"`
Plat string `json:"plat" form:"plat" validate:"required"`
}
//Plat egg plat
type Plat struct {
EggID uint `json:"egg_id"`
Plat uint8 `json:"plat"`
Conditions string `json:"conditions"`
Build string `json:"build"`
URL string `json:"url"`
Md5 string `json:"md5"`
Size uint `json:"size"`
Deleted uint8 `json:"deleted"`
}
//Query egg query
type Query struct {
EggID uint
Word string
STime time.Time
ETime time.Time
Deleted uint8
}
//Egg egg
type Egg struct {
ID uint
Stime time.Time
Etime time.Time
ShowCount int
UID int64 `gorm:"column:uid"`
Publish uint8
Person string
Delete uint8
}
//IndexParam Index egg index param
type IndexParam struct {
ID string `json:"id" form:"id"` // ID
Stime string `json:"stime" form:"stime"` // 开始时间
Etime string `json:"etime" form:"etime"` // 结束时间
Person string `json:"person" form:"person"` // 创建人
Word string `json:"word" form:"word"` // 关键词
Ps int `json:"ps" form:"ps" default:"20"` // 分页大小
Pn int `json:"pn" form:"pn" default:"1"` // 第几个分页
}
//Index egg index
type Index struct {
ID uint `json:"id"`
Words string `json:"words"`
Stime time.Time `json:"stime"`
Etime time.Time `json:"etime"`
Plat []Plat `json:"plat"`
ShowCount int `json:"show_count"`
Publish uint8 `json:"publish"`
Person string `json:"person"`
}
//IndexPager return values
type IndexPager struct {
Item []*Index `json:"item"`
Page common.Page `json:"page"`
}
//SearchEgg for searching
type SearchEgg struct {
ID uint `json:"id"`
Words []string `json:"query_list"`
Stime time.Time `json:"stime"`
Etime time.Time `json:"etime"`
Plat map[uint8]Plat `json:"plat"`
//Plat []Plat `json:"plat"`
ShowCount int `json:"show_count"`
Publish uint8 `json:"publish"`
}
//SearchEggWeb for searching
type SearchEggWeb struct {
ID uint `json:"id"`
Words []string `json:"query_list"`
Stime time.Time `json:"stime"`
Etime time.Time `json:"etime"`
Plat map[uint8][]Plat `json:"plat"`
//Plat []Plat `json:"plat"`
ShowCount int `json:"show_count"`
Publish uint8 `json:"publish"`
}
// TableName Egg
func (a SearchEggWeb) TableName() string {
return "egg"
}
// TableName Egg
func (a Egg) TableName() string {
return "egg"
}
// TableName Egg plat
func (a Plat) TableName() string {
return "egg_plat"
}
// TableName Egg query
func (a Query) TableName() string {
return "egg_query"
}
// TableName Egg
func (a Index) TableName() string {
return "egg"
}
// TableName Egg
func (a SearchEgg) TableName() string {
return "egg"
}

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 = ["search.go"],
importpath = "go-common/app/admin/main/feed/model/search",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = ["//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,197 @@
package search
import "go-common/library/time"
var (
//NotDelete not delete
NotDelete uint8
//Delete delete
Delete uint8 = 1
//Business log business ID
Business = 202
//ActionAddBlack log action
ActionAddBlack = "ActionAddBlack"
//ActionDelBlack log action
ActionDelBlack = "ActionDelBlack"
//ActionAddInter log action
ActionAddInter = "ActionAddInter"
//ActionUpdateInter log action
ActionUpdateInter = "ActionUpdateInter"
//ActionUpdateSearch log action
ActionUpdateSearch = "ActionUpdateSearch"
//ActionPublishHot log action
ActionPublishHot = "ActionPublishHot"
//ActionPublishDark log action
ActionPublishDark = "ActionPublishDark"
//ActionOpenAddHot log action
ActionOpenAddHot = "ActionOpenAddHot"
//ActionDeleteHot delete hot word
ActionDeleteHot = "ActionDeleteHot"
//ActionOpenAddDark log action
ActionOpenAddDark = "ActionOpenAddDark"
//ActionDeleteDark action delete darkword
ActionDeleteDark = "ActionDeleteDark"
//HotAI hot word from AI
HotAI uint8 = 1
//HotOpe hot word from operate
HotOpe uint8 = 2
)
//Hot search history from ai and search words
type Hot struct {
ID uint `json:"-"`
Searchword string `json:"searchword"`
PV int64 `json:"pv"`
Atime string
}
//OpenHot open api for searhc add hot every day
type OpenHot struct {
Date string `json:"date"`
Values []Hot `json:"values"`
}
//Dark search dark list
type Dark struct {
ID uint `json:"id"`
Searchword string `json:"searchword" form:"searchword"`
PV int64 `json:"pv" form:"pv"`
Atime string `json:"atime"`
Deleted uint8 `json:"deleted"`
}
//OpenDark open api for search add dark word every day
type OpenDark struct {
Date string `json:"date"`
Values []Dark `json:"values"`
}
//Black search Black
type Black struct {
Searchword string `json:"searchword" form:"searchword" validate:"required"`
ID int `json:"id"`
Deleted uint8 `json:"deleted"`
}
//AddBlack add search Black
type AddBlack struct {
Searchword string `json:"searchword" form:"searchword" validate:"required"`
}
//Intervene search intervene word
type Intervene struct {
ID int `json:"id" form:"id"`
Searchword string `json:"searchword" form:"searchword"`
Rank int `json:"position" form:"position"`
Pv int `json:"pv"`
Tag string `json:"tag" form:"tag"`
Stime time.Time `json:"stime" form:"stime"`
Etime time.Time `json:"etime" form:"etime"`
Deleted uint8 `json:"deleted"`
}
//InterveneAdd add search intervene word
type InterveneAdd struct {
ID int `json:"id" form:"id"`
Searchword string `json:"searchword" form:"searchword"`
Rank int `json:"position" form:"position"`
Tag string `json:"tag" form:"tag"`
Stime time.Time `json:"stime" form:"stime"`
Etime time.Time `json:"etime" form:"etime"`
}
//HotwordOut hotword out put with publish state
type HotwordOut struct {
Hotword []Intervene `json:"hotword"`
State uint8 `json:"state"`
}
//DarkwordOut hotword out put with publish state
type DarkwordOut struct {
Darkword []Dark `json:"darkword"`
State uint8 `json:"state"`
}
//History search History
type History struct {
ID int `json:"id" form:"id"`
Searchword string `json:"searchword"`
Pv int `json:"pv"`
Position int `json:"position"`
Atime string `json:"atime"`
Tag string `json:"tag"`
Deleted uint8 `json:"deleted"`
}
//PublishState hot word publish state
type PublishState struct {
Date string
State bool
}
//HotPubLog hotword publish log
type HotPubLog struct {
ID int `json:"id" form:"id"`
Searchword string `json:"searchword" form:"searchword"`
Position int `json:"position" form:"position"`
Pv int `json:"pv"`
Tag string `json:"tag" form:"tag"`
Stime time.Time `json:"stime" form:"stime"`
Etime time.Time `json:"etime" form:"etime"`
Atime string `json:"atime"`
Groupid int64 `json:"groupid"`
}
//DarkPubLog dark publish log
type DarkPubLog struct {
ID uint `json:"id"`
Searchword string `json:"searchword" form:"searchword"`
Pv int64 `json:"pv" form:"pv"`
Atime string `json:"atime"`
Groupid int64 `json:"groupid"`
}
// TableName search box history
func (a Hot) TableName() string {
return "search_histories"
}
// TableName search_blacklist
func (a Black) TableName() string {
return "search_blacklist"
}
// TableName search_darkword
func (a Dark) TableName() string {
return "search_darkword"
}
// TableName search_histories
func (a History) TableName() string {
return "search_histories"
}
// TableName search_blacklist
func (a AddBlack) TableName() string {
return "search_blacklist"
}
// TableName search_intervene
func (a Intervene) TableName() string {
return "search_intervene"
}
// TableName InterveneAdd search_intervene
func (a InterveneAdd) TableName() string {
return "search_intervene"
}
// TableName DarkPubLog dark word publish log
func (a DarkPubLog) TableName() string {
return "search_darkword_log"
}
// TableName DarkPubLog dark word publish log
func (a HotPubLog) TableName() string {
return "search_hotword_log"
}

View File

@@ -0,0 +1,41 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"app_active.go",
"card_set_stars.go",
"channel_tab.go",
"event_topic.go",
"search_web.go",
"search_web_card.go",
"search_web_query.go",
],
importpath = "go-common/app/admin/main/feed/model/show",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/model/common:go_default_library",
"//library/time:go_default_library",
"//library/xstr:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,11 @@
package show
//AppActive db show app_active table
type AppActive struct {
Name string `json:"name,omitempty"`
}
// TableName .
func (a AppActive) TableName() string {
return "app_active"
}

View File

@@ -0,0 +1,95 @@
package show
import (
"go-common/app/admin/main/feed/model/common"
xtime "go-common/library/time"
)
//PopularStars channel tab
type PopularStars struct {
ID int64 `json:"id"`
Type string `json:"type"`
Value string `json:"value"`
Title string `json:"title"`
LongTitle string `json:"longtitle"`
Content string `json:"content"`
Deleted int `json:"deleted"`
Person string `json:"person"`
Source int `json:"source"`
Status int `json:"status"`
Mtime xtime.Time `json:"mtime"`
}
//PopularStarsPager .
type PopularStarsPager struct {
Item []*PopularStars `json:"item"`
Page common.Page `json:"page"`
}
// TableName .
func (a PopularStars) TableName() string {
return "card_set"
}
/*
---------------------------
struct param
---------------------------
*/
//PopularStarsAP popular stars add param
type PopularStarsAP struct {
Type string `form:"type" validate:"required"`
Value string `form:"value" validate:"required"`
Title string `form:"title" validate:"required"`
LongTitle string `form:"longtitle" validate:"required"`
Content string `form:"content" validate:"required"`
UID int64 `form:"person" gorm:"column:uid"`
Person string `form:"person"`
Source int
Status int
}
//PopularStarsAIAP popular stars ai add param
type PopularStarsAIAP struct {
Mid int64 `form:"mid"`
Aids []int64 `form:"aids"`
}
//AiValue ai insert value
type AiValue struct {
ID int64 `json:"id"`
}
//PopularStarsUP channel tab update param
type PopularStarsUP struct {
ID int64 `form:"id" validate:"required"`
Type string `form:"type" validate:"required"`
Value string `form:"value" validate:"required"`
Title string `form:"title" validate:"required"`
LongTitle string `form:"longtitle"`
Content string `form:"content" validate:"required"`
Status int `form:"status"`
}
//PopularStarsLP channel tab list param
type PopularStarsLP struct {
ID int `form:"id"`
Title string `form:"title"`
LongTitle string `form:"longtitle"`
Person string `form:"person"`
Source int `form:"source" default:"-1"`
Status int `form:"status"`
Ps int `form:"ps" default:"20"` // 分页大小
Pn int `form:"pn" default:"1"` // 第几个分页
}
// TableName .
func (a PopularStarsAP) TableName() string {
return "card_set"
}
// TableName .
func (a PopularStarsUP) TableName() string {
return "card_set"
}

View File

@@ -0,0 +1,84 @@
package show
import "go-common/app/admin/main/feed/model/common"
//ChannelTab channel tab
type ChannelTab struct {
ID int64 `json:"id" form:"id"`
TagID int64 `json:"tag_id" form:"tag_id" validate:"required"`
TabID int64 `json:"tab_id" form:"tab_id" validate:"required"`
Title string `json:"title" form:"title" validate:"required"`
Stime int64 `json:"stime" form:"stime" validate:"required"`
Etime int64 `json:"etime" form:"etime" validate:"required"`
Check int `json:"check" form:"check"`
Priority int `json:"priority" form:"priority" validate:"required"`
UID int64 `json:"uid" form:"uid"`
Person string `json:"person" form:"person"`
IsDelete int `json:"is_delete" form:"is_delete"`
Status int `json:"status" form:"status"`
}
//ChannelTabPager .
type ChannelTabPager struct {
Item []*ChannelTab `json:"item"`
Page common.Page `json:"page"`
}
// TableName .
func (a ChannelTab) TableName() string {
return "channel_tab"
}
/*
---------------------------
struct param
---------------------------
*/
//ChannelTabAP channel tab add param
type ChannelTabAP struct {
TagID int64 `form:"tag_id" validate:"required"`
TabID int64 `form:"tab_id" validate:"required"`
Title string `form:"title" validate:"required"`
Stime int64 `form:"stime" validate:"required"`
Etime int64 `form:"etime" validate:"required"`
Priority int `form:"priority" validate:"required"`
UID int64 `form:"uid" gorm:"column:uid"`
Person string `form:"person"`
}
//ChannelTabUP channel tab update param
type ChannelTabUP struct {
ID int64 `form:"id" validate:"required"`
TagID int64 `form:"tag_id" validate:"required"`
TabID int64 `form:"tab_id" validate:"required"`
Title string `form:"title" validate:"required"`
Stime int64 `form:"stime" validate:"required"`
Etime int64 `form:"etime" validate:"required"`
Priority int `form:"priority" validate:"required"`
UID int64 `form:"uid" gorm:"column:uid"`
Person string `form:"person"`
}
//ChannelTabLP channel tab list param
type ChannelTabLP struct {
TagID int `form:"tag_id"`
TabID int `form:"tab_id"`
Stime int64 `form:"stime"`
Etime int64 `form:"etime"`
Status int `form:"status"`
Person string `form:"person"`
Order int `form:"order" default:"2"`
Ps int `form:"ps" default:"20"` // 分页大小
Pn int `form:"pn" default:"1"` // 第几个分页
}
// TableName .
func (a ChannelTabAP) TableName() string {
return "channel_tab"
}
// TableName .
func (a ChannelTabUP) TableName() string {
return "channel_tab"
}

View File

@@ -0,0 +1,76 @@
package show
import (
"go-common/app/admin/main/feed/model/common"
)
//EventTopic event topic
type EventTopic struct {
ID int64 `json:"id" form:"id"`
Title string `json:"title" form:"title"`
Desc string `json:"desc" form:"desc"`
Cover string `json:"cover" form:"cover"`
Retype int `json:"re_type" gorm:"column:re_type" form:"re_type"`
Revalue string `json:"re_value" gorm:"column:re_value" form:"string"`
Corner string `json:"corner" form:"corner"`
Person string `json:"person" form:"person"`
Deleted int `json:"deleted" form:"deleted"`
}
//EventTopicPager .
type EventTopicPager struct {
Item []*EventTopic `json:"item"`
Page common.Page `json:"page"`
}
// TableName .
func (a EventTopic) TableName() string {
return "event_topic"
}
/*
---------------------------
struct param
---------------------------
*/
//EventTopicAP event topic add param
type EventTopicAP struct {
Title string `json:"title" form:"title" validate:"required"`
Desc string `json:"desc" form:"desc" validate:"required"`
Cover string `json:"cover" form:"cover" validate:"required"`
Retype int `json:"re_type" form:"re_type" gorm:"column:re_type" validate:"required"`
Revalue string `json:"re_value" form:"re_value" gorm:"column:re_value" validate:"required"`
Corner string `json:"corner" form:"corner"`
Person string `json:"person" form:"person"`
}
//EventTopicUP event topic update param
type EventTopicUP struct {
ID int64 `form:"id" validate:"required"`
Title string `json:"title" form:"title" validate:"required"`
Desc string `json:"desc" form:"desc" validate:"required"`
Cover string `json:"cover" form:"cover" validate:"required"`
Retype int `json:"re_type" form:"re_type" gorm:"column:re_type" validate:"required"`
Revalue string `json:"re_value" form:"re_value" gorm:"column:re_value" validate:"required"`
Corner string `json:"corner" form:"corner"`
}
//EventTopicLP event topic list param
type EventTopicLP struct {
ID int `form:"id"`
Person string `form:"person"`
Title string `form:"title"`
Ps int `form:"ps" default:"20"` // 分页大小
Pn int `form:"pn" default:"1"` // 第几个分页
}
// TableName .
func (a EventTopicAP) TableName() string {
return "event_topic"
}
// TableName .
func (a EventTopicUP) TableName() string {
return "event_topic"
}

View File

@@ -0,0 +1,112 @@
package show
import (
"go-common/app/admin/main/feed/model/common"
xtime "go-common/library/time"
)
//SearchWeb search web
type SearchWeb struct {
ID int64 `json:"id" form:"id"`
CardType int `json:"card_type" form:"card_type"`
CardValue string `json:"card_value" form:"card_value"`
Stime xtime.Time `json:"stime" form:"stime"`
Etime xtime.Time `json:"etime" form:"etime"`
Check int `json:"check" form:"check"`
Status int `json:"status" form:"status"`
Priority int `json:"priority" form:"priority"`
Person string `json:"person" form:"person"`
ApplyReason string `json:"apply_reason" form:"apply_reason"`
Deleted int `json:"deleted" form:"deleted"`
Query []*SearchWebQuery `json:"query" form:"query" gorm:"-"`
Card interface{} `json:"card" gorm:"-"`
}
//SearchWebPager .
type SearchWebPager struct {
Item []*SearchWeb `json:"item"`
Page common.Page `json:"page"`
}
// TableName .
func (a SearchWeb) TableName() string {
return "search_web"
}
/*
---------------------------
struct param
---------------------------
*/
//SearchWebAP add param
type SearchWebAP struct {
ID int64 `json:"id" form:"id"`
CardType int `json:"card_type" form:"card_type" validate:"required"`
CardValue string `json:"card_value" form:"card_value" validate:"required"`
Stime xtime.Time `json:"stime" form:"stime" validate:"required"`
Etime xtime.Time `json:"etime" form:"etime" validate:"required"`
Priority int `json:"priority" form:"priority" validate:"required"`
Check int `form:"check" default:"1"`
Person string `json:"person" form:"person"`
ApplyReason string `json:"apply_reason" form:"apply_reason"`
Query string `json:"query" form:"query" gorm:"-" validate:"required"`
}
//SearchWebUP update param
type SearchWebUP struct {
ID int64 `form:"id" validate:"required"`
CardType int `json:"card_type" form:"card_type"`
CardValue string `json:"card_value" form:"card_value"`
Stime xtime.Time `json:"stime" form:"stime"`
Etime xtime.Time `json:"etime" form:"etime"`
Check int `json:"check" form:"check"`
Status int `json:"status" form:"status"`
Priority int `json:"priority" form:"priority"`
Person string `json:"person" form:"person"`
ApplyReason string `json:"apply_reason" form:"apply_reason"`
Query string `json:"query" form:"query" gorm:"-" validate:"required"`
}
//SearchWebLP list param
type SearchWebLP struct {
ID int `form:"id"`
Check int `form:"check"`
Person string `form:"person"`
STime string `form:"stime"`
ETime string `form:"etime"`
Ps int `form:"ps" default:"20"`
Pn int `form:"pn" default:"1"`
}
//SearchWebOption option web card (online,hidden,pass,reject)
type SearchWebOption struct {
ID int64 `form:"id" validate:"required"`
Check int `json:"check" form:"check"`
Status int `json:"status" form:"status"`
}
//SWTimeValid option web card (online,hidden,pass,reject)
type SWTimeValid struct {
ID int64
Query string
Priority int
STime xtime.Time
ETime xtime.Time
CardValue string
}
// TableName .
func (a SearchWebOption) TableName() string {
return "search_web"
}
// TableName .
func (a SearchWebAP) TableName() string {
return "search_web"
}
// TableName .
func (a SearchWebUP) TableName() string {
return "search_web"
}

View File

@@ -0,0 +1,84 @@
package show
import (
"go-common/app/admin/main/feed/model/common"
"go-common/library/time"
)
//SearchWebCard web card
type SearchWebCard struct {
ID int64 `form:"id" gorm:"column:id" json:"id"`
Type int64 `form:"type" gorm:"column:type" json:"type"`
Title string `form:"title" gorm:"column:title" json:"title"`
Desc string `form:"desc" gorm:"column:desc" json:"desc"`
Cover string `form:"cover" gorm:"column:cover" json:"cover"`
ReType int64 `form:"re_type" gorm:"column:re_type" json:"re_type"`
ReValue string `form:"re_value" gorm:"column:re_value" json:"re_value"`
Corner string `form:"corner" gorm:"column:corner" json:"corner"`
Person string `form:"person" gorm:"column:person" json:"person"`
Deleted int64 `form:"deleted" gorm:"column:deleted" json:"deleted"`
Ctime time.Time `form:"string" gorm:"column:ctime" json:"ctime"`
Mtime time.Time `form:"string" gorm:"column:mtime" json:"mtime"`
}
//SearchWebCardPager .
type SearchWebCardPager struct {
Item []*SearchWebCard `json:"item"`
Page common.Page `json:"page"`
}
// TableName .
func (a SearchWebCard) TableName() string {
return "search_web_card"
}
/*
---------------------------
struct param
---------------------------
*/
//SearchWebCardAP web card add param
type SearchWebCardAP struct {
Type int64 `form:"type" gorm:"column:type" json:"type"`
Title string `form:"title" gorm:"column:title" json:"title"`
Desc string `form:"desc" gorm:"column:desc" json:"desc"`
Cover string `form:"cover" gorm:"column:cover" json:"cover"`
ReType int64 `form:"re_type" gorm:"column:re_type" json:"re_type"`
ReValue string `form:"re_value" gorm:"column:re_value" json:"re_value"`
Corner string `form:"corner" gorm:"column:corner" json:"corner"`
Person string `form:"person" gorm:"column:person" json:"person"`
}
//SearchWebCardUP web card update param
type SearchWebCardUP struct {
ID int64 `form:"id" gorm:"column:id" json:"id"`
Type int64 `form:"type" gorm:"column:type" json:"type"`
Title string `form:"title" gorm:"column:title" json:"title"`
Desc string `form:"desc" gorm:"column:desc" json:"desc"`
Cover string `form:"cover" gorm:"column:cover" json:"cover"`
ReType int64 `form:"re_type" gorm:"column:re_type" json:"re_type"`
ReValue string `form:"re_value" gorm:"column:re_value" json:"re_value"`
Corner string `form:"corner" gorm:"column:corner" json:"corner"`
}
//SearchWebCardLP search web card list param
type SearchWebCardLP struct {
ID int `form:"id"`
Person string `form:"person"`
Title string `form:"title"`
Ps int `form:"ps" default:"20"` // 分页大小
Pn int `form:"pn" default:"1"` // 第几个分页
STime string `form:"stime"`
ETime string `form:"etime"`
}
// TableName .
func (a SearchWebCardAP) TableName() string {
return "search_web_card"
}
// TableName .
func (a SearchWebCardUP) TableName() string {
return "search_web_card"
}

View File

@@ -0,0 +1,54 @@
package show
import (
"fmt"
"strings"
"go-common/library/xstr"
)
const (
_queryInsertSQL = "INSERT INTO search_web_query(sid,value) VALUES %s"
_queryEditSQL = "UPDATE search_web_query SET value = CASE %s END WHERE id IN (%s)"
)
//SearchWebQuery search web query
type SearchWebQuery struct {
ID int64 `json:"id" form:"id"`
SID int64 `json:"sid" form:"sid" gorm:"column:sid"`
Value string `json:"value" form:"value"`
Deleted int `json:"deleted" form:"deleted"`
}
// TableName .
func (a SearchWebQuery) TableName() string {
return "search_web_query"
}
// BatchAddQuerySQL .
func BatchAddQuerySQL(sID int64, data []*SearchWebQuery) string {
if len(data) == 0 {
return ""
}
var rowStrings []string
for _, v := range data {
rowStrings = append(rowStrings, fmt.Sprintf("(%d,'%s')", sID, v.Value))
}
return fmt.Sprintf(_queryInsertSQL, strings.Join(rowStrings, ","))
}
// BatchEditQuerySQL .
func BatchEditQuerySQL(querys []*SearchWebQuery) string {
if len(querys) == 0 {
return ""
}
var (
oidsStr string
ids []int64
)
for _, query := range querys {
oidsStr = fmt.Sprintf("%s WHEN id = %d THEN '%s'", oidsStr, query.ID, query.Value)
ids = append(ids, query.ID)
}
return fmt.Sprintf(_queryEditSQL, oidsStr, xstr.JoinInts(ids))
}

View File

@@ -0,0 +1,27 @@
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/admin/main/feed/service/bfs:all-srcs",
"//app/admin/main/feed/service/channel:all-srcs",
"//app/admin/main/feed/service/common:all-srcs",
"//app/admin/main/feed/service/egg:all-srcs",
"//app/admin/main/feed/service/pgc:all-srcs",
"//app/admin/main/feed/service/popular:all-srcs",
"//app/admin/main/feed/service/search:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

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 = ["bfs.go"],
importpath = "go-common/app/admin/main/feed/service/bfs",
tags = ["automanaged"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/admin/main/feed/dao/bfs:go_default_library",
"//library/ecode: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,48 @@
package bfs
import (
"bytes"
"context"
"go-common/app/admin/main/feed/conf"
bfsdao "go-common/app/admin/main/feed/dao/bfs"
"go-common/library/ecode"
"go-common/library/log"
)
// Service bfs service.
type Service struct {
dao *bfsdao.Dao
BfsMaxSize int
}
// New new a bfs service.
func New(c *conf.Config) (s *Service) {
s = &Service{
dao: bfsdao.New(c),
BfsMaxSize: c.Bfs.MaxFileSize,
}
return
}
// ClientUpCover client upload cover.
func (s *Service) ClientUpCover(c context.Context, fileType string, body []byte) (url string, err error) {
if len(body) == 0 {
err = ecode.FileNotExists
return
}
if len(body) > s.BfsMaxSize {
err = ecode.FileTooLarge
return
}
url, err = s.dao.Upload(c, fileType, bytes.NewReader(body))
if err != nil {
log.Error("s.bfs.Upload error(%v)", err)
}
return
}
// FileMd5 is used for calculating file md5.
func (s *Service) FileMd5(content []byte) (md5Str string, err error) {
return s.dao.FileMd5(content)
}

View File

@@ -0,0 +1,41 @@
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"card_setup.go",
"tab.go",
],
importpath = "go-common/app/admin/main/feed/service/channel",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/admin/main/feed/dao/account:go_default_library",
"//app/admin/main/feed/dao/archive:go_default_library",
"//app/admin/main/feed/dao/pgc:go_default_library",
"//app/admin/main/feed/dao/show:go_default_library",
"//app/admin/main/feed/model/channel:go_default_library",
"//app/admin/main/feed/model/common:go_default_library",
"//app/admin/main/feed/model/show:go_default_library",
"//app/admin/main/feed/util: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,229 @@
package channel
import (
"encoding/json"
"fmt"
"strconv"
"go-common/app/admin/main/feed/conf"
accdao "go-common/app/admin/main/feed/dao/account"
arcdao "go-common/app/admin/main/feed/dao/archive"
pgcdao "go-common/app/admin/main/feed/dao/pgc"
showdao "go-common/app/admin/main/feed/dao/show"
cardmodel "go-common/app/admin/main/feed/model/channel"
"go-common/app/admin/main/feed/model/common"
"go-common/app/admin/main/feed/util"
"go-common/library/log"
)
// Service is search service
type Service struct {
showDao *showdao.Dao
pgcDao *pgcdao.Dao
accDao *accdao.Dao
arcDao *arcdao.Dao
}
// New new a search service
func New(c *conf.Config) (s *Service) {
var (
pgc *pgcdao.Dao
err error
)
if pgc, err = pgcdao.New(c); err != nil {
log.Error("pgcdao.New error(%v)", err)
return
}
s = &Service{
showDao: showdao.New(c),
pgcDao: pgc,
accDao: accdao.New(c),
arcDao: arcdao.New(c),
}
return
}
//parseConten parse string type id to int type id
func parseConten(content string) (s string, err error) {
type Content struct {
ID string `json:"id"`
Title string `json:"title"`
}
var contents []Content
if err = json.Unmarshal([]byte(content), &contents); err != nil {
return
}
type ContentTrans struct {
ID int64 `json:"id"`
Title string `json:"title"`
}
var cTrans []ContentTrans
for _, v := range contents {
var s int64
if s, err = strconv.ParseInt(v.ID, 10, 64); err != nil {
return "", err
}
v := ContentTrans{
ID: s,
Title: v.Title,
}
cTrans = append(cTrans, v)
}
var b []byte
if b, err = json.Marshal(cTrans); err != nil {
return "", err
}
return string(b), nil
}
//AddCardSetup card set up
func (s *Service) AddCardSetup(card *cardmodel.AddCardSetup, person string, uid int64) (err error) {
var (
flag bool
e error
)
flag, e = isDup(card.Content)
if e != nil {
return e
}
if flag {
return fmt.Errorf("ID重复")
}
card.Person = person
card.UID = uid
if card.Content, err = parseConten(card.Content); err != nil {
return
}
if err = s.showDao.DB.Model(&cardmodel.AddCardSetup{}).
Create(card).Error; err != nil {
log.Error("chanelSvc.AddCardSetup Create error(%v)", err)
return
}
if card.Type == common.CardPgcsRcmd {
if err = util.AddLog(cardmodel.LogBusPgcsRcmd, person, uid, 0, cardmodel.ActAddCsPgcRcmd, card); err != nil {
log.Error("chanelSvc.UpdateCardSetup AddLog error(%v)", err)
return
}
} else if card.Type == common.CardUpRcmdNew {
if err = util.AddLog(cardmodel.LogBusRcmdNew, person, uid, 0, cardmodel.ActAddCsRcmdNew, card); err != nil {
log.Error("chanelSvc.UpdateCardSetup AddLog error(%v)", err)
return
}
}
return
}
//CardSetupList card set up
func (s *Service) CardSetupList(id int, t string, person string, title string, pn int, ps int) (cPager *cardmodel.SetupPager, err error) {
cPager = &cardmodel.SetupPager{
Page: common.Page{
Num: pn,
Size: ps,
},
}
w := map[string]interface{}{
"deleted": cardmodel.NotDelete,
"type": t,
}
query := s.showDao.DB.Model(&cardmodel.Setup{})
if id != 0 {
w["id"] = id
}
if person != "" {
query = query.Where("person like ?", "%"+person+"%")
}
if title != "" {
if t == "up_rcmd_new" {
query = query.Where("long_title like ?", "%"+title+"%")
} else {
query = query.Where("title like ?", "%"+title+"%")
}
}
if err = query.Where(w).Count(&cPager.Page.Total).Error; err != nil {
log.Error("chanelSvc.CardSetupList Index count error(%v)", err)
return
}
cards := []*cardmodel.Setup{}
if err = query.Where(w).Order("`id` DESC").Offset((pn - 1) * ps).Limit(ps).Find(&cards).Error; err != nil {
log.Error("chanelSvc.CardSetupList First error(%v)", err)
return
}
cPager.Item = cards
return
}
//DelCardSetup card set up
func (s *Service) DelCardSetup(id int, t string, person string, uid int64) (err error) {
dbModel := s.showDao.DB.Model(&cardmodel.Setup{})
dbModel = dbModel.Where("id = ?", id).Where("type = ?", t)
if err = dbModel.Update("deleted", cardmodel.Delete).Error; err != nil {
log.Error("chanelSvc.CardSetupList First error(%v)", err)
return
}
if t == common.CardPgcsRcmd {
if err = util.AddLog(cardmodel.LogBusPgcsRcmd, person, uid, int64(id), cardmodel.ActDelCsPgcRcmd, ""); err != nil {
log.Error("chanelSvc.UpdateCardSetup AddLog error(%v)", err)
return
}
} else if t == common.CardUpRcmdNew {
if err = util.AddLog(cardmodel.LogBusRcmdNew, person, uid, int64(id), cardmodel.ActDelCsRcmdNew, ""); err != nil {
log.Error("chanelSvc.UpdateCardSetup AddLog error(%v)", err)
return
}
}
return
}
func isDup(con string) (flag bool, err error) {
type Content struct {
ID string `json:"id"`
}
value := []Content{}
if err := json.Unmarshal([]byte(con), &value); err != nil {
return false, err
}
s := make(map[string]bool)
for _, v := range value {
if s[v.ID] {
return true, nil
}
s[v.ID] = true
}
return false, nil
}
//UpdateCardSetup card set up
func (s *Service) UpdateCardSetup(id int, card *cardmodel.AddCardSetup, person string, uid int64) (err error) {
var (
flag bool
e error
)
flag, e = isDup(card.Content)
if e != nil {
return e
}
if flag {
return fmt.Errorf("ID重复")
}
if card.Content, err = parseConten(card.Content); err != nil {
return
}
dbModel := s.showDao.DB.Model(&cardmodel.Setup{})
dbModel = dbModel.Where("id = ?", id).Where("type = ?", card.Type)
if err = dbModel.Update(card).Error; err != nil {
log.Error("chanelSvc.CardSetupList First error(%v)", err)
return
}
if card.Type == common.CardPgcsRcmd {
if err = util.AddLog(cardmodel.LogBusPgcsRcmd, person, uid, int64(id), cardmodel.ActUpCsPgcRcmd, card); err != nil {
log.Error("chanelSvc.UpdateCardSetup AddLog error(%v)", err)
return
}
} else if card.Type == common.CardUpRcmdNew {
if err = util.AddLog(cardmodel.LogBusRcmdNew, person, uid, int64(id), cardmodel.ActUpCsRcmdNew, card); err != nil {
log.Error("chanelSvc.UpdateCardSetup AddLog error(%v)", err)
return
}
}
return
}

View File

@@ -0,0 +1,223 @@
package channel
import (
"context"
"fmt"
"time"
"go-common/app/admin/main/feed/model/common"
"go-common/app/admin/main/feed/model/show"
"go-common/app/admin/main/feed/util"
"go-common/library/log"
)
const (
//TabOnline channel tab online
TabOnline = 1
//TabDownline channel tab down line
TabDownline = 2
//TabWaitOnline channel tab wait to line
TabWaitOnline = 3
//OrderTimeDown channel tab oder by stime desc
OrderTimeDown = 1
//OrderTimeUp channel tab oder by stime asc
OrderTimeUp = 2
//ActionAddCTab log action
ActionAddCTab = "ActAddChannelTab"
//ActionUpCTab log action
ActionUpCTab = "ActUpChannelTab"
//ActionDelCTab log action
ActionDelCTab = "ActDelChannelTab"
//ActionOfflineCTab log action
ActionOfflineCTab = "ActOfflineChannelTab"
)
//TabList channel tab list
func (s *Service) TabList(lp *show.ChannelTabLP) (pager *show.ChannelTabPager, err error) {
var (
eTime int64
sTime int64
)
pager = &show.ChannelTabPager{
Page: common.Page{
Num: lp.Pn,
Size: lp.Ps,
},
}
w := map[string]interface{}{
"is_delete": common.NotDeleted,
}
query := s.showDao.DB.Model(&show.ChannelTab{})
if lp.TagID > 0 {
w["tag_id"] = lp.TagID
}
if lp.TabID > 0 {
w["tab_id"] = lp.TabID
}
if lp.Stime > 0 {
query = query.Where("stime >= ?", lp.Stime)
}
if lp.Etime > 0 {
query = query.Where("etime <= ?", lp.Etime)
}
if lp.Person != "" {
query = query.Where("person like ?", "%"+lp.Person+"%")
}
if lp.Status == TabWaitOnline {
if lp.Stime != 0 {
if lp.Stime < time.Now().Unix() {
sTime = time.Now().Unix()
} else {
sTime = lp.Stime
}
} else {
sTime = time.Now().Unix()
}
query = query.Where("stime >= ?", sTime)
} else if lp.Status == TabOnline {
if lp.Stime != 0 {
if lp.Stime < time.Now().Unix() {
sTime = time.Now().Unix()
} else {
sTime = lp.Stime
}
} else {
sTime = time.Now().Unix()
}
if lp.Etime != 0 {
if lp.Etime > time.Now().Unix() {
eTime = time.Now().Unix()
} else {
eTime = lp.Etime
}
} else {
eTime = time.Now().Unix()
}
query = query.Where("stime < ?", sTime).Where("etime >= ?", eTime)
} else if lp.Status == TabDownline {
if lp.Etime != 0 {
if lp.Etime < time.Now().Unix() {
eTime = lp.Etime
} else {
eTime = time.Now().Unix()
}
} else {
eTime = time.Now().Unix()
}
query = query.Where("etime < ?", eTime)
}
if lp.Order == OrderTimeDown {
query = query.Order("`stime` ASC")
} else if lp.Order == OrderTimeUp {
query = query.Order("`stime` DESC")
}
if err = query.Where(w).Count(&pager.Page.Total).Error; err != nil {
log.Error("chanelSvc.CardSetupList Index count error(%v)", err)
return
}
tabs := []*show.ChannelTab{}
if err = query.Where(w).Order("`id` DESC").Offset((lp.Pn - 1) * lp.Ps).Limit(lp.Ps).Find(&tabs).Error; err != nil {
log.Error("chanelSvc.CardSetupList First error(%v)", err)
return
}
for k, v := range tabs {
//online for fe
if time.Now().Unix() < v.Stime {
tabs[k].Status = TabWaitOnline
} else if time.Now().Unix() >= v.Etime {
tabs[k].Status = TabDownline
} else {
tabs[k].Status = TabOnline
}
}
pager.Item = tabs
return
}
//AddTab add channel tab
func (s *Service) AddTab(c context.Context, param *show.ChannelTabAP, name string, uid int64) (err error) {
if err = s.IsValid(0, param.TagID, param.Stime, param.Etime, param.Priority); err != nil {
return
}
if err = s.showDao.ChannelTabAdd(param); err != nil {
return
}
if err = util.AddLogs(common.LogChannelTab, name, uid, 0, ActionAddCTab, param); err != nil {
log.Error("chanelSvc.AddTab AddLog error(%v)", err)
return
}
return
}
//IsValid validate data
func (s *Service) IsValid(id, tagID, sTime int64, eTime int64, priority int) (err error) {
var (
count int
)
if sTime > eTime {
err = fmt.Errorf("开始时间不能大于结束时间")
return
}
if sTime < time.Now().Unix() {
err = fmt.Errorf("生效时间需要大于当前时间")
return
}
if count, err = s.showDao.ChannelTabValid(id, tagID, sTime, eTime, priority); err != nil {
return
}
if count > 0 {
err = fmt.Errorf("已有该排序无法创建,请重新选择")
return
}
if count, err = s.showDao.ChannelTabValid(id, tagID, sTime, eTime, 0); err != nil {
return
}
if count >= 3 {
stimeStr := time.Unix(sTime, 0).Format("2006-01-02 15:04:05")
etimeStr := time.Unix(eTime, 0).Format("2006-01-02 15:04:05")
str := "频道在" + stimeStr + " 至 " + etimeStr + " 时间段内已有3个运营tab无法创建"
err = fmt.Errorf(str)
return
}
return
}
//UpdateTab update channel tab
func (s *Service) UpdateTab(c context.Context, param *show.ChannelTabUP, name string, uid int64) (err error) {
if err = s.IsValid(param.ID, param.TagID, param.Stime, param.Etime, param.Priority); err != nil {
return
}
if err = s.showDao.ChannelTabUpdate(param); err != nil {
return
}
if err = util.AddLogs(common.LogChannelTab, name, uid, 0, ActionUpCTab, param); err != nil {
log.Error("chanelSvc.UpdateTab AddLog error(%v)", err)
return
}
return
}
//DeleteTab delete channel tab
func (s *Service) DeleteTab(id int64, name string, uid int64) (err error) {
if err = s.showDao.ChannelTabDelete(id); err != nil {
return
}
if err = util.AddLogs(common.LogChannelTab, name, uid, id, ActionDelCTab, id); err != nil {
log.Error("chanelSvc.DeleteTab AddLog error(%v)", err)
return
}
return
}
//OfflineTab offline channel tab
func (s *Service) OfflineTab(id int64, name string, uid int64) (err error) {
if err = s.showDao.ChannelTabOffline(id); err != nil {
return
}
if err = util.AddLogs(common.LogChannelTab, name, uid, id, ActionOfflineCTab, id); err != nil {
log.Error("chanelSvc.DeleteTab AddLog error(%v)", err)
return
}
return
}

View File

@@ -0,0 +1,49 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"cardpreview.go",
"cardtype.go",
"common.go",
"log.go",
],
importpath = "go-common/app/admin/main/feed/service/common",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/admin/main/feed/dao/account:go_default_library",
"//app/admin/main/feed/dao/archive:go_default_library",
"//app/admin/main/feed/dao/pgc:go_default_library",
"//app/admin/main/feed/dao/show:go_default_library",
"//app/admin/main/feed/model/common:go_default_library",
"//app/admin/main/feed/model/show:go_default_library",
"//app/admin/main/search/model:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//app/service/openplatform/pgc-season/api/grpc/season/v1: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,79 @@
package common
import (
"context"
"fmt"
"go-common/app/admin/main/feed/model/common"
showModel "go-common/app/admin/main/feed/model/show"
account "go-common/app/service/main/account/model"
"go-common/app/service/main/archive/api"
seasondao "go-common/app/service/openplatform/pgc-season/api/grpc/season/v1"
"go-common/library/ecode"
)
//CardPreview card preview
func (s *Service) CardPreview(c context.Context, cType string, id int64) (title string, err error) {
var (
accCard *account.Card
appActive *showModel.AppActive
eventTopic *showModel.EventTopic
webCard *showModel.SearchWebCard
seaCards map[int32]*seasondao.CardInfoProto
arcCard *api.Arc
)
switch cType {
case common.CardPgc:
v := []int32{int32(id)}
if seaCards, err = s.pgcDao.CardsInfoReply(c, v); err != nil {
return
}
if v, ok := seaCards[int32(id)]; ok {
return v.Title, nil
}
return "", fmt.Errorf("无效pgc卡片ID(%d)", id)
case common.CardAv:
if arcCard, err = s.arcDao.Archive3(c, id); err != nil {
if err.Error() == ecode.NothingFound.Error() {
return "", fmt.Errorf("无效稿件ID(%d)", id)
}
return
}
return arcCard.Title, nil
case common.CardUp:
if accCard, err = s.accDao.Card3(c, id); err != nil {
if err.Error() == ecode.MemberNotExist.Error() {
return "", fmt.Errorf("无效up主ID(%d)", id)
}
return
}
return accCard.Name, nil
case common.CardChannelTab:
if appActive, err = s.showDao.AAFindByID(c, int64(id)); err != nil {
return "", err
}
if appActive == nil {
return "", fmt.Errorf("无效tab卡片ID(%d)", id)
}
return appActive.Name, nil
case common.CardEventTopic:
if eventTopic, err = s.showDao.ETFindByID(id); err != nil {
return "", err
}
if eventTopic == nil {
return "", fmt.Errorf("无效事件专题卡片ID(%d)", id)
}
return eventTopic.Title, nil
case common.CardSearchWeb:
if webCard, err = s.showDao.SWBFindByID(id); err != nil {
return "", err
}
if webCard == nil {
return "", fmt.Errorf("无效web卡片ID(%d)", id)
}
return webCard.Title, nil
default:
err = fmt.Errorf("参数错误")
return "", err
}
}

View File

@@ -0,0 +1,25 @@
package common
//CardMap .
type CardMap struct {
Name string `json:"name"`
ID int `json:"id"`
}
//WebSearch .
type WebSearch struct {
CardList []*CardMap `json:"web_search"`
}
//CardType .
func (s *Service) CardType() (m *WebSearch) {
c := &CardMap{
Name: "特殊小卡",
ID: 1,
}
cards := make([]*CardMap, 0)
cards = append(cards, c)
return &WebSearch{
CardList: cards,
}
}

View File

@@ -0,0 +1,42 @@
package common
import (
"go-common/app/admin/main/feed/conf"
accdao "go-common/app/admin/main/feed/dao/account"
arcdao "go-common/app/admin/main/feed/dao/archive"
pgcdao "go-common/app/admin/main/feed/dao/pgc"
showdao "go-common/app/admin/main/feed/dao/show"
"go-common/library/log"
httpx "go-common/library/net/http/blademaster"
)
// Service is search service
type Service struct {
showDao *showdao.Dao
pgcDao *pgcdao.Dao
accDao *accdao.Dao
arcDao *arcdao.Dao
client *httpx.Client
managerURL string
}
// New new a search service
func New(c *conf.Config) (s *Service) {
var (
pgc *pgcdao.Dao
err error
)
if pgc, err = pgcdao.New(c); err != nil {
log.Error("pgcdao.New error(%v)", err)
return
}
s = &Service{
showDao: showdao.New(c),
pgcDao: pgc,
accDao: accdao.New(c),
arcDao: arcdao.New(c),
client: httpx.NewClient(c.HTTPClient),
managerURL: c.Host.Manager,
}
return
}

View File

@@ -0,0 +1,72 @@
package common
import (
"encoding/json"
"net/url"
"strconv"
"go-common/app/admin/main/feed/model/common"
searchModel "go-common/app/admin/main/search/model"
bm "go-common/library/net/http/blademaster"
)
const (
logURL = "/x/admin/search/log"
)
//LogAction log action
func (s *Service) LogAction(c *bm.Context, typ, ps, pn int64, ctimeFrom, ctimeTo, uName string) (res *common.LogManagers, err error) {
var (
items []*common.LogManager
)
res = &common.LogManagers{}
params := url.Values{}
params.Set("appid", "log_audit")
params.Set("business", strconv.FormatUint(common.BusinessID, 10))
params.Set("order", "ctime")
params.Set("type", strconv.FormatInt(typ, 10))
params.Set("ps", strconv.FormatInt(ps, 10))
params.Set("pn", strconv.FormatInt(pn, 10))
if ctimeFrom != "" {
params.Set("ctime_from", ctimeFrom)
}
if ctimeTo != "" {
params.Set("ctime_to", ctimeTo)
}
if uName != "" {
params.Set("uname", uName)
}
type log struct {
Code int `json:"code"`
Data *searchModel.SearchResult `json:"data"`
}
l := &log{}
if err = s.client.Get(c, s.managerURL+logURL, "", params, l); err != nil {
return
}
var logS []*common.LogSearch
for _, v := range l.Data.Result {
log := &common.LogSearch{}
if err = json.Unmarshal(v, log); err != nil {
return
}
logS = append(logS, log)
}
for _, v := range logS {
tmp := &common.LogManager{
OID: v.OID,
Uname: v.Uname,
UID: v.UID,
Type: v.Type,
ExtraData: v.ExtraData,
Action: v.Action,
CTime: v.CTime,
}
items = append(items, tmp)
}
res.Item = items
res.Page.TotalItems = int(l.Data.Page.Total)
res.Page.PageSize = l.Data.Page.Ps
res.Page.CurrentPage = l.Data.Page.Pn
return
}

View File

@@ -0,0 +1,37 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["egg.go"],
importpath = "go-common/app/admin/main/feed/service/egg",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/admin/main/feed/dao/egg:go_default_library",
"//app/admin/main/feed/model/common:go_default_library",
"//app/admin/main/feed/model/egg:go_default_library",
"//app/admin/main/feed/util:go_default_library",
"//library/log: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,397 @@
package egg
import (
"time"
"go-common/app/admin/main/feed/conf"
"go-common/app/admin/main/feed/dao/egg"
"go-common/app/admin/main/feed/model/common"
eggModel "go-common/app/admin/main/feed/model/egg"
Log "go-common/app/admin/main/feed/util"
"go-common/library/log"
libTime "go-common/library/time"
)
const (
//_ActionAdd log action add
_ActionAdd = "add"
//_ActionUpdate log action update
_ActionUpdate = "update"
//_ActionDel log action delete
_ActionDel = "delete"
//_ActionPub log action publish
_ActionPub = "publish"
)
// Service is egg service
type Service struct {
dao *egg.Dao
}
// New new a egg service
func New(c *conf.Config) (s *Service) {
s = &Service{
dao: egg.New(c),
}
return
}
//EggWithID get egg with ID
func (s *Service) EggWithID(id uint) (egg *eggModel.Egg, err error) {
egg = &eggModel.Egg{}
if err = s.dao.DB.Model(&eggModel.Egg{}).Where("id = ?", id).
Where("`delete` != ?", eggModel.Delete).First(egg).
Error; err != nil {
log.Error("eggSrv.DelEgg Update error(%v)", err)
return
}
return
}
//DelEgg update egg
func (s *Service) DelEgg(id uint, person string, uid int64) (err error) {
tx := s.dao.DB.Begin()
if err = tx.Model(&eggModel.Egg{}).Where("id = ?", id).Update("delete", eggModel.Delete).Error; err != nil {
log.Error("eggSrv.DelEgg Update error(%v)", err)
return
}
if err = tx.Model(&eggModel.Query{}).Where("egg_id = ?", id).Update("deleted", eggModel.Delete).Error; err != nil {
log.Error("eggSrv.DelEgg UpdateQuery error(%v)", err)
return
}
tx.Commit()
if err = Log.AddLog(eggModel.Business, person, uid, int64(id), _ActionDel, ""); err != nil {
log.Error("eggSrv.AddEgg AddLog error(%v)", err)
return
}
return
}
//PubEgg publish egg
func (s *Service) PubEgg(id uint, publish uint8, person string, uid int64) (err error) {
if err = s.dao.DB.Model(&eggModel.Egg{}).Where("id = ?", id).Update("publish", publish).Error; err != nil {
log.Error("eggSrv.PubEgg Update error(%v)", err)
return
}
if err = Log.AddLog(eggModel.Business, person, uid, int64(id), _ActionPub, ""); err != nil {
log.Error("eggSrv.PubEgg AddLog error(%v)", err)
return
}
return
}
//UpdateEgg update egg
func (s *Service) UpdateEgg(e *eggModel.Egg, p []eggModel.Plat, w []string) (err error) {
tx := s.dao.DB.Begin()
db := tx.Model(&eggModel.Egg{}).Where("id = ?", e.ID).Update(e)
if err = db.Error; err != nil {
log.Error("eggSrv.UpdateEgg UpdateEgg egg error(%v)", err)
return
}
db = tx.Model(&eggModel.Plat{}).Where("egg_id = ?", e.ID).Update("deleted", eggModel.Delete)
if err = db.Error; err != nil {
log.Error("eggSrv.UpdateEgg UpdatePlat error(%v)", err)
return
}
db = tx.Model(&eggModel.Query{}).Where("egg_id = ?", e.ID).Update("deleted", eggModel.Delete)
if err = db.Error; err != nil {
log.Error("eggSrv.UpdateEgg UpdateQuery error(%v)", err)
return
}
for _, v := range p {
v.EggID = e.ID
v.Deleted = eggModel.NotDelete
db := tx.Model(&eggModel.Plat{}).Create(v)
if err = db.Error; err != nil {
log.Error("eggSrv.UpdateEgg create egg plat error(%v)", err)
return
}
}
for _, v := range w {
q := eggModel.Query{
Word: v,
EggID: e.ID,
STime: e.Stime,
ETime: e.Etime,
Deleted: eggModel.NotDelete,
}
db := tx.Model(&eggModel.Query{}).Create(q)
if err = db.Error; err != nil {
log.Error("eggSrv.UpdateEgg create egg query error(%v)", err)
return
}
}
tx.Commit()
obj := map[string]interface{}{
"egg": e,
"plat": p,
"words": w,
}
if err = Log.AddLog(eggModel.Business, e.Person, e.UID, int64(e.ID), _ActionUpdate, obj); err != nil {
log.Error("eggSrv.AddEgg AddLog error(%v)", err)
return
}
return
}
//AddEgg add egg
func (s *Service) AddEgg(e *eggModel.Egg, p []eggModel.Plat, w []string) (err error) {
tx := s.dao.DB.Begin()
db := tx.Model(&eggModel.Egg{}).Create(e)
if err = db.Error; err != nil {
log.Error("eggSrv.AddEgg create egg error(%v)", err)
return
}
for _, v := range p {
v.EggID = e.ID
v.Deleted = eggModel.NotDelete
db := tx.Model(&eggModel.Plat{}).Create(v)
if err = db.Error; err != nil {
log.Error("eggSrv.AddEgg create egg plat error(%v)", err)
return
}
}
for _, v := range w {
q := eggModel.Query{
Word: v,
EggID: e.ID,
STime: e.Stime,
ETime: e.Etime,
Deleted: eggModel.NotDelete,
}
db := tx.Model(&eggModel.Query{}).Create(q)
if err = db.Error; err != nil {
log.Error("eggSrv.AddEgg create egg query error(%v)", err)
return
}
}
tx.Commit()
obj := map[string]interface{}{
"egg": e,
"plat": p,
"words": w,
}
if err = Log.AddLog(eggModel.Business, e.Person, e.UID, int64(e.ID), _ActionAdd, obj); err != nil {
log.Error("eggSrv.AddEgg AddLog error(%v)", err)
return
}
return
}
//IsWdExist the word will add is exist
func (s *Service) IsWdExist(words []string, sTime, eTime libTime.Time, eggID uint) (exist bool, w string, err error) {
var (
c int
)
for _, v := range words {
query := s.dao.DB.Model(&eggModel.Query{}).
Where("deleted=?", eggModel.NotDelete).
Where("word = ?", v).
Where("s_time < ?", eTime).
Where("e_time > ?", sTime)
if eggID != 0 {
query = query.Where("egg_id != ?", eggID)
}
if err = query.Count(&c).Error; err != nil {
log.Error("eggSrv.IsWdExist Query error(%v)", err)
return
}
if c > 0 {
return true, v, nil
}
}
return false, "", nil
}
func (s *Service) qWord(word string) (ids []uint, err error) {
q := []eggModel.Query{}
if err = s.dao.DB.Model(&eggModel.Query{}).Where("deleted=?", eggModel.NotDelete).
Where("word like ?", "%"+word+"%").Find(&q).Error; err != nil {
log.Error("eggSrv.IndexEgg Query error(%v)", err)
return
}
for _, v := range q {
ids = append(ids, v.EggID)
}
return
}
//IndexEgg egg list
func (s *Service) IndexEgg(param *eggModel.IndexParam) (values *eggModel.IndexPager, err error) {
values = &eggModel.IndexPager{
Page: common.Page{
Num: param.Pn,
Size: param.Ps,
},
}
w := map[string]interface{}{
"delete": eggModel.NotDelete,
}
if param.ID != "" {
w["id"] = param.ID
}
query := s.dao.DB.Model(&eggModel.Index{}).Where(w)
if param.Stime != "" {
query = query.Where("stime >= ?", param.Stime)
}
if param.Etime != "" {
query = query.Where("etime <= ?", param.Etime)
}
if param.Person != "" {
query = query.Where("person like ?", "%"+param.Person+"%")
}
if param.Word != "" {
var ids = []uint{}
if ids, err = s.qWord(param.Word); err != nil {
return
}
if len(ids) != 0 {
query = query.Where("id in (?)", ids)
} else {
query = query.Where("id in (?)", 0)
}
}
if err = query.Order("`id` DESC").Offset((param.Pn - 1) * param.Ps).Limit(param.Ps).Find(&values.Item).Error; err != nil {
log.Error("eggSrv.IndexEgg Index list error(%v)", err)
return
}
if err = query.Count(&values.Page.Total).Error; err != nil {
log.Error("eggSrv.IndexEgg Index count error(%v)", err)
return
}
for k, v := range values.Item {
q := []eggModel.Query{}
p := []eggModel.Plat{}
//select egg query words
w := map[string]interface{}{
"egg_id": v.ID,
"deleted": eggModel.NotDelete,
}
if err = s.dao.DB.Model(&eggModel.Query{}).Where(w).Find(&q).Error; err != nil {
log.Error("eggSrv.IndexEgg Query error(%v)", err)
return
}
for _, qV := range q {
if values.Item[k].Words == "" {
values.Item[k].Words = qV.Word
} else {
values.Item[k].Words = values.Item[k].Words + "," + qV.Word
}
}
//select egg plat
w = map[string]interface{}{
"egg_id": v.ID,
"deleted": eggModel.NotDelete,
}
if err = s.dao.DB.Model(&eggModel.Plat{}).Where(w).Find(&p).Error; err != nil {
log.Error("eggSrv.IndexEgg Plat error(%v)", err)
return
}
values.Item[k].Plat = p
}
return
}
//SearchEgg search egg list
func (s *Service) SearchEgg() (values []eggModel.SearchEgg, err error) {
param := eggModel.IndexParam{}
w := map[string]interface{}{
"delete": eggModel.NotDelete,
"publish": eggModel.Publish,
}
cTime := time.Now().Unix()
cTime = cTime + 10*60
tm := time.Unix(cTime, 0)
param.Stime = tm.Format("2006-01-02 15:04:05")
param.Etime = param.Stime
query := s.dao.DB.Model(&eggModel.SearchEgg{}).Where(w)
query = query.Where("stime <= ?", param.Stime).Where("etime >= ?", param.Etime)
if err = query.Order("`id` DESC").Find(&values).Error; err != nil {
log.Error("eggSrv.SearchEgg Index list error(%v)", err)
return
}
for k, v := range values {
q := []eggModel.Query{}
p := []eggModel.Plat{}
Words := []string{}
//select egg query words
w := map[string]interface{}{
"egg_id": v.ID,
"deleted": eggModel.NotDelete,
}
if err = s.dao.DB.Model(&eggModel.Query{}).Where(w).Find(&q).Error; err != nil {
log.Error("eggSrv.IndexEgg Query error(%v)", err)
return
}
for _, v := range q {
Words = append(Words, v.Word)
}
values[k].Words = Words
//select egg plat
w = map[string]interface{}{
"egg_id": v.ID,
"deleted": eggModel.NotDelete,
}
if err = s.dao.DB.Model(&eggModel.Plat{}).Where(w).Find(&p).Error; err != nil {
log.Error("eggSrv.IndexEgg Plat error(%v)", err)
return
}
values[k].Plat = make(map[uint8]eggModel.Plat)
for _, v := range p {
values[k].Plat[v.Plat] = v
}
}
return
}
//SearchEggWeb search egg list
func (s *Service) SearchEggWeb() (values []eggModel.SearchEggWeb, err error) {
param := eggModel.IndexParam{}
w := map[string]interface{}{
"delete": eggModel.NotDelete,
"publish": eggModel.Publish,
}
cTime := time.Now().Unix()
cTime = cTime + 10*60
tm := time.Unix(cTime, 0)
param.Stime = tm.Format("2006-01-02 15:04:05")
param.Etime = param.Stime
query := s.dao.DB.Model(&eggModel.SearchEgg{}).Where(w)
query = query.Where("stime <= ?", param.Stime).Where("etime >= ?", param.Etime)
if err = query.Order("`id` DESC").Find(&values).Error; err != nil {
log.Error("eggSrv.SearchEgg Index list error(%v)", err)
return
}
for k, v := range values {
q := []eggModel.Query{}
p := []eggModel.Plat{}
Words := []string{}
//select egg query words
w := map[string]interface{}{
"egg_id": v.ID,
"deleted": eggModel.NotDelete,
}
if err = s.dao.DB.Model(&eggModel.Query{}).Where(w).Find(&q).Error; err != nil {
log.Error("eggSrv.IndexEgg Query error(%v)", err)
return
}
for _, v := range q {
Words = append(Words, v.Word)
}
values[k].Words = Words
//select egg plat
w = map[string]interface{}{
"egg_id": v.ID,
"deleted": eggModel.NotDelete,
}
if err = s.dao.DB.Model(&eggModel.Plat{}).Where(w).Find(&p).Error; err != nil {
log.Error("eggSrv.IndexEgg Plat error(%v)", err)
return
}
values[k].Plat = make(map[uint8][]eggModel.Plat)
for _, v := range p {
values[k].Plat[v.Plat] = append(values[k].Plat[v.Plat], v)
}
}
return
}

View File

@@ -0,0 +1,35 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["pgc.go"],
importpath = "go-common/app/admin/main/feed/service/pgc",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/admin/main/feed/dao/pgc:go_default_library",
"//app/service/openplatform/pgc-season/api/grpc/episode/v1:go_default_library",
"//app/service/openplatform/pgc-season/api/grpc/season/v1: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,48 @@
package pgc
import (
"context"
"go-common/app/admin/main/feed/conf"
pgcdao "go-common/app/admin/main/feed/dao/pgc"
epgrpc "go-common/app/service/openplatform/pgc-season/api/grpc/episode/v1"
seasongrpc "go-common/app/service/openplatform/pgc-season/api/grpc/season/v1"
"go-common/library/log"
)
// Service is egg service
type Service struct {
pgc *pgcdao.Dao
}
// New new a egg service
func New(c *conf.Config) (s *Service) {
var (
b *pgcdao.Dao
err error
)
if b, err = pgcdao.New(c); err != nil {
log.Error("pgcdao.New error(%v)", err)
return
}
s = &Service{
pgc: b,
}
return
}
//GetSeason get season from pgc
func (s *Service) GetSeason(c context.Context, seasonIDs []int32) (seasonCards map[int32]*seasongrpc.CardInfoProto, err error) {
if seasonCards, err = s.pgc.CardsInfoReply(c, seasonIDs); err != nil {
log.Error("%+v", err)
}
return
}
//GetEp get ep from pgc
func (s *Service) GetEp(c context.Context, epIds []int32) (res map[int32]*epgrpc.EpisodeCardsProto, err error) {
if res, err = s.pgc.CardsEpInfoReply(c, epIds); err != nil {
log.Error("%+v", err)
}
return
}

View File

@@ -0,0 +1,39 @@
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"event_topic.go",
"service.go",
"stars.go",
],
importpath = "go-common/app/admin/main/feed/service/popular",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/admin/main/feed/dao/show:go_default_library",
"//app/admin/main/feed/model/common:go_default_library",
"//app/admin/main/feed/model/show:go_default_library",
"//app/admin/main/feed/util:go_default_library",
"//library/log:go_default_library",
"//vendor/github.com/jinzhu/gorm: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,88 @@
package popular
import (
"context"
"go-common/app/admin/main/feed/model/common"
"go-common/app/admin/main/feed/model/show"
"go-common/app/admin/main/feed/util"
"go-common/library/log"
)
const (
//ActionAddCEventTopic log action
ActionAddCEventTopic = "ActAddEventTopic"
//ActionUpCEventTopic log action
ActionUpCEventTopic = "ActUpEventTopic"
//ActionDelCEventTopic log action
ActionDelCEventTopic = "ActDelEventTopic"
)
//EventTopicList channel EventTopic list
func (s *Service) EventTopicList(lp *show.EventTopicLP) (pager *show.EventTopicPager, err error) {
pager = &show.EventTopicPager{
Page: common.Page{
Num: lp.Pn,
Size: lp.Ps,
},
}
w := map[string]interface{}{
"deleted": common.NotDeleted,
}
query := s.showDao.DB.Model(&show.EventTopic{})
if lp.ID > 0 {
w["id"] = lp.ID
}
if lp.Person != "" {
query = query.Where("person like ?", "%"+lp.Person+"%")
}
if lp.Title != "" {
query = query.Where("title like ?", "%"+lp.Title+"%")
}
if err = query.Where(w).Count(&pager.Page.Total).Error; err != nil {
log.Error("popularSvc.EventTopicList count error(%v)", err)
return
}
EventTopics := make([]*show.EventTopic, 0)
if err = query.Where(w).Order("`id` DESC").Offset((lp.Pn - 1) * lp.Ps).Limit(lp.Ps).Find(&EventTopics).Error; err != nil {
log.Error("popularSvc.EventTopicList Find error(%v)", err)
return
}
pager.Item = EventTopics
return
}
//AddEventTopic add channel EventTopic
func (s *Service) AddEventTopic(c context.Context, param *show.EventTopicAP, name string, uid int64) (err error) {
if err = s.showDao.EventTopicAdd(param); err != nil {
return
}
if err = util.AddLogs(common.LogEventTopic, name, uid, 0, ActionAddCEventTopic, param); err != nil {
log.Error("popularSvc.AddEventTopic AddLog error(%v)", err)
return
}
return
}
//UpdateEventTopic update channel EventTopic
func (s *Service) UpdateEventTopic(c context.Context, param *show.EventTopicUP, name string, uid int64) (err error) {
if err = s.showDao.EventTopicUpdate(param); err != nil {
return
}
if err = util.AddLogs(common.LogEventTopic, name, uid, 0, ActionUpCEventTopic, param); err != nil {
log.Error("popularSvc.UpdateEventTopic AddLog error(%v)", err)
return
}
return
}
//DeleteEventTopic delete channel EventTopic
func (s *Service) DeleteEventTopic(id int64, name string, uid int64) (err error) {
if err = s.showDao.EventTopicDelete(id); err != nil {
return
}
if err = util.AddLogs(common.LogEventTopic, name, uid, id, ActionDelCEventTopic, id); err != nil {
log.Error("popularSvc.DeleteEventTopic AddLog error(%v)", err)
return
}
return
}

View File

@@ -0,0 +1,19 @@
package popular
import (
"go-common/app/admin/main/feed/conf"
showdao "go-common/app/admin/main/feed/dao/show"
)
// Service is search service
type Service struct {
showDao *showdao.Dao
}
// New new a search service
func New(c *conf.Config) (s *Service) {
s = &Service{
showDao: showdao.New(c),
}
return
}

View File

@@ -0,0 +1,218 @@
package popular
import (
"context"
"fmt"
"go-common/app/admin/main/feed/model/common"
"go-common/app/admin/main/feed/model/show"
"go-common/app/admin/main/feed/util"
"go-common/library/log"
"github.com/jinzhu/gorm"
)
const (
//ActionAddCPopular .
ActionAddCPopular = "ActAddPopularStars"
//ActionUpCPopular .
ActionUpCPopular = "ActUpPopularStars"
//ActionDelCPopular .
ActionDelCPopular = "ActDelPopularStars"
//ActionRejCPopular .
ActionRejCPopular = "ActRejPopularStars"
//_CardTypeUpRcmdNew 热门新星卡片
_CardTypeUpRcmdNew = "up_rcmd_new"
//ActionAIAddCPopular .
ActionAIAddCPopular = "ActAIAddPopularStars"
//_CardSourceOperate popular stars build by operate
_CardSourceOperate = 0
//_CardSourceAI popular stars build by ai
_CardSourceAI = 1
)
//PopularStarsList channel Popular list
func (s *Service) PopularStarsList(lp *show.PopularStarsLP) (pager *show.PopularStarsPager, err error) {
pager = &show.PopularStarsPager{
Page: common.Page{
Num: lp.Pn,
Size: lp.Ps,
},
}
w := map[string]interface{}{
"deleted": common.NotDeleted,
"type": _CardTypeUpRcmdNew,
}
query := s.showDao.DB.Model(&show.PopularStars{})
if lp.ID > 0 {
w["id"] = lp.ID
}
if lp.Status > 0 {
w["status"] = lp.Status
}
if lp.Source >= 0 {
if lp.Source == 0 {
query = query.Where(map[string]interface{}{"source": _CardSourceOperate})
} else {
w["source"] = lp.Source
}
}
if lp.Person != "" {
query = query.Where("person like ?", "%"+lp.Person+"%")
}
if lp.LongTitle != "" {
query = query.Where("long_title like ?", "%"+lp.LongTitle+"%")
}
if err = query.Where(w).Count(&pager.Page.Total).Error; err != nil {
log.Error("popularSvc.PopularStarsList Index count error(%v)", err)
return
}
Populars := make([]*show.PopularStars, 0)
if err = query.Where(w).Order("`id` DESC").Offset((lp.Pn - 1) * lp.Ps).Limit(lp.Ps).Find(&Populars).Error; err != nil {
log.Error("popularSvc.PopularStarsList First error(%v)", err)
return
}
pager.Item = Populars
return
}
//AddPopularStars add popular stars
func (s *Service) AddPopularStars(c context.Context, param *show.PopularStarsAP, name string, uid int64) (err error) {
var (
popStars *show.PopularStars
)
if popStars, err = s.ValidMid(param.Value); err != nil {
fmt.Println("error")
return
}
if popStars.ID != 0 {
err = fmt.Errorf("up主ID 已存在")
return
}
param.Type = _CardTypeUpRcmdNew
param.Source = _CardSourceOperate
param.Status = common.Pass
if err = s.showDao.PopularStarsAdd(param); err != nil {
return
}
if err = util.AddLogs(common.LogPopularStars, name, uid, 0, ActionAddCPopular, param); err != nil {
log.Error("popularSvc.AddPopularStars AddLog error(%v)", err)
return
}
return
}
//UpdatePopularStars update channel Popular
func (s *Service) UpdatePopularStars(c context.Context, param *show.PopularStarsUP, name string, uid int64) (err error) {
var (
popStars *show.PopularStars
)
if popStars, err = s.ValidMid(param.Value); err != nil {
return
}
if popStars.ID != 0 && popStars.ID != param.ID {
err = fmt.Errorf("up主ID 已存在")
return
}
param.Type = _CardTypeUpRcmdNew
param.Status = common.Pass
if err = s.showDao.PopularStarsUpdate(param); err != nil {
return
}
if err = util.AddLogs(common.LogPopularStars, name, uid, 0, ActionUpCPopular, param); err != nil {
log.Error("popularSvc.UpdatePopularStars AddLog error(%v)", err)
return
}
return
}
//DeletePopularStars delete channel Popular
func (s *Service) DeletePopularStars(id int64, name string, uid int64) (err error) {
if err = s.showDao.PopularStarsDelete(id, _CardTypeUpRcmdNew); err != nil {
return
}
if err = util.AddLogs(common.LogPopularStars, name, uid, id, ActionDelCPopular, id); err != nil {
log.Error("popularSvc.DeletePopularStars AddLog error(%v)", err)
return
}
return
}
//RejectPopularStars reject channel Popular
func (s *Service) RejectPopularStars(id int64, name string, uid int64) (err error) {
if err = s.showDao.PopularStarsReject(id, _CardTypeUpRcmdNew); err != nil {
return
}
if err = util.AddLogs(common.LogPopularStars, name, uid, id, ActionRejCPopular, id); err != nil {
log.Error("popularSvc.DeletePopularStars AddLog error(%v)", err)
return
}
return
}
//ValidMid mid must unique
func (s *Service) ValidMid(mid string) (popStars *show.PopularStars, err error) {
w := map[string]interface{}{
"value": mid,
"deleted": common.NotDeleted,
"type": _CardTypeUpRcmdNew,
}
popStars = &show.PopularStars{}
if err = s.showDao.DB.Model(&show.PopularStars{}).Where(w).Find(&popStars).Error; err != nil {
if err == gorm.ErrRecordNotFound {
err = nil
return
}
log.Error("popularSvc.ValidMid Find error(%v)", err)
return
}
return
}
//AIAddPopularStars add popular stars
func (s *Service) AIAddPopularStars(c context.Context, values []*show.PopularStarsAP) (err error) {
if err = util.AddLogs(common.LogPopularStars, "AI", 0, 0, ActionAIAddCPopular, values); err != nil {
log.Error("popularSvc.AIAddPopularStars AddLog error(%v)", err)
return
}
for _, v := range values {
var popStars *show.PopularStars
if popStars, err = s.ValidMid(v.Value); err != nil {
log.Error("popularSvc.AIAddPopularStars ValidMid value(%v) error(%v)", v, err)
continue
}
if popStars.ID != 0 {
//运营创建的优先级最高
if popStars.Source == _CardSourceOperate {
continue
}
//已通过的优先级较高
if popStars.Status == common.Pass {
continue
}
tmp := &show.PopularStarsUP{
ID: popStars.ID,
Content: v.Content,
LongTitle: v.LongTitle,
}
if err = s.showDao.PopularStarsUpdate(tmp); err != nil {
log.Error("popularSvc.AIAddPopularStars PopularStarsUpdate value(%v) error(%v)", tmp, err)
continue
}
} else {
tmp := &show.PopularStarsAP{
Type: _CardTypeUpRcmdNew,
Source: _CardSourceAI,
Status: common.Verify,
Value: v.Value,
Content: v.Content,
LongTitle: v.LongTitle,
}
if err = s.showDao.PopularStarsAdd(tmp); err != nil {
log.Error("popularSvc.AIAddPopularStars PopularStarsAdd value(%v) error(%v)", tmp, err)
continue
}
}
}
return
}

View File

@@ -0,0 +1,60 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"search.go",
"search_web.go",
],
importpath = "go-common/app/admin/main/feed/service/search",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/admin/main/feed/dao/search:go_default_library",
"//app/admin/main/feed/dao/show:go_default_library",
"//app/admin/main/feed/model/common:go_default_library",
"//app/admin/main/feed/model/search:go_default_library",
"//app/admin/main/feed/model/show:go_default_library",
"//app/admin/main/feed/util:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//vendor/github.com/jinzhu/gorm:go_default_library",
"//vendor/github.com/robfig/cron:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = ["search_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/feed/conf:go_default_library",
"//app/admin/main/feed/model/search:go_default_library",
"//library/log:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,543 @@
package search
import (
"context"
"flag"
"fmt"
"path/filepath"
"testing"
"time"
"go-common/app/admin/main/feed/conf"
searchModel "go-common/app/admin/main/feed/model/search"
"go-common/library/log"
"github.com/smartystreets/goconvey/convey"
)
var (
s *Service
c = context.Background()
)
func init() {
var (
err error
)
dir, _ := filepath.Abs("../../cmd/feed-admin-test.toml")
flag.Set("conf", dir)
conf.Init()
if s = New(conf.Conf); err != nil {
log.Error("bgmdao.New error(%v)", err)
return
}
}
func TestIsTodayAutoPubHot(t *testing.T) {
convey.Convey("isTodayAutoPubHot", t, func(ctx convey.C) {
var (
c = context.Background()
err error
res bool
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err = s.isTodayAutoPubHot(c)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestIsTodayAutoPubDark(t *testing.T) {
convey.Convey("isTodayAutoPubDark", t, func(ctx convey.C) {
var (
err error
res bool
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err = s.isTodayAutoPubDark(c)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}
func TestParseTime(t *testing.T) {
convey.Convey("parseTime", t, func(ctx convey.C) {
var (
err error
res time.Time
)
timeTwelve := time.Now().Format("2006-01-02 ") + "12:00:00"
layout := "2006-01-02 15:04:05"
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err = s.parseTime(timeTwelve, layout)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestHotwordFromDB(t *testing.T) {
convey.Convey("HotwordFromDB", t, func(ctx convey.C) {
var (
err error
res []searchModel.Intervene
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, _, err = s.HotwordFromDB("2018-09-05")
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestDarkwordFromDB(t *testing.T) {
convey.Convey("HotwordFromDB", t, func(ctx convey.C) {
var (
err error
res []searchModel.Dark
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, _, err = s.DarkwordFromDB(time.Now().Format("2006-01-02"))
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestOpenHotList(t *testing.T) {
convey.Convey("HotwordFromDB", t, func(ctx convey.C) {
var (
err error
res []searchModel.Intervene
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
//c = context.Background()
//res, err = s.OpenHotList(c)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestHotList(t *testing.T) {
convey.Convey("HotList", t, func(ctx convey.C) {
var (
err error
res []searchModel.Intervene
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
//res, err = s.HotList(c)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestDarkList(t *testing.T) {
convey.Convey("DarkList", t, func(ctx convey.C) {
var (
err error
res []searchModel.Intervene
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
//res, err = s.DarkList(c)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestBlackList(t *testing.T) {
convey.Convey("BlackList", t, func(ctx convey.C) {
var (
err error
res []searchModel.Black
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err = s.BlackList()
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestDelBlack(t *testing.T) {
convey.Convey("DelBlack", t, func(ctx convey.C) {
var (
err error
res []searchModel.Black
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
//res, err = s.DelBlack()
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestAddBlack(t *testing.T) {
convey.Convey("AddBlack", t, func(ctx convey.C) {
var (
err error
res []searchModel.Black
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
//err = s.AddBlack()
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestCheckBlack(t *testing.T) {
convey.Convey("checkBlack", t, func(ctx convey.C) {
var (
err error
res bool
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err = s.checkBlack("test")
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestCheckInter(t *testing.T) {
convey.Convey("checkInter", t, func(ctx convey.C) {
var (
err error
res bool
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err = s.checkInter("test", 0)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestCheckTimeConflict(t *testing.T) {
convey.Convey("checkTimeConflict", t, func(ctx convey.C) {
var (
err error
res bool
model = searchModel.InterveneAdd{
Rank: 10,
Stime: 1536134791,
Etime: 1536134791,
}
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, err = s.checkTimeConflict(model, 0)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestAddInter(t *testing.T) {
convey.Convey("checkTimeConflict", t, func(ctx convey.C) {
var (
err error
res bool
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
//res, err = s.AddInter(model, 0)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestUpdateInter(t *testing.T) {
convey.Convey("UpdateInter", t, func(ctx convey.C) {
var (
err error
res bool
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
//res, err = s.AddInter(model, 0)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestUpdateSearch(t *testing.T) {
convey.Convey("UpdateSearch", t, func(ctx convey.C) {
var (
err error
res bool
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
//res, err = s.AddInter(model, 0)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestDeleteHot(t *testing.T) {
convey.Convey("DeleteHot", t, func(ctx convey.C) {
var (
err error
res bool
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err = s.DeleteHot(c, 10, 2, "quguolin", 100)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestDeleteDark(t *testing.T) {
convey.Convey("DeleteDark", t, func(ctx convey.C) {
var (
err error
res bool
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err = s.DeleteDark(c, 10, "quguolin", 100)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestOpenAddDarkword(t *testing.T) {
convey.Convey("OpenAddDarkword", t, func(ctx convey.C) {
var (
err error
res bool
value searchModel.OpenDark
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err = s.OpenAddDarkword(c, value)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestOpenAddHotword(t *testing.T) {
convey.Convey("OpenAddHotword", t, func(ctx convey.C) {
var (
err error
res bool
//value searchModel.OpenHot
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
//err = s.OpenAddHotword(c, value)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestGetHotPub(t *testing.T) {
convey.Convey("GetHotPub", t, func(ctx convey.C) {
var (
err error
res bool
//value searchModel.OpenHot
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
//err = s.OpenAddHotword(c, value)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestGetDarkPub(t *testing.T) {
convey.Convey("GetDarkPub", t, func(ctx convey.C) {
var (
err error
res bool
//value searchModel.OpenHot
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
//err = s.GetDarkPub(c, value)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestSetHotPub(t *testing.T) {
convey.Convey("SetHotPub", t, func(ctx convey.C) {
var (
err error
res bool
//value searchModel.OpenHot
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err = s.SetHotPub(c, "quguolin", 100)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestHotPubLog(t *testing.T) {
convey.Convey("HotPubLog", t, func(ctx convey.C) {
var (
err error
res bool
value []searchModel.Intervene
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
err = s.HotPubLog(value)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestGetHotPubLog(t *testing.T) {
convey.Convey("GetHotPubLog", t, func(ctx convey.C) {
var (
err error
res []searchModel.Intervene
pub bool
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, pub, err = s.GetHotPubLog("2018-09-03")
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
//ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res, pub)
})
})
}
func TestGetDarkPubLog(t *testing.T) {
convey.Convey("GetDarkPubLog", t, func(ctx convey.C) {
var (
err error
res []searchModel.Dark
pub bool
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
res, pub, err = s.GetDarkPubLog("2018-09-03")
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
//ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res, pub)
})
})
}
func TestSetDarkPub(t *testing.T) {
convey.Convey("SetDarkPub", t, func(ctx convey.C) {
var (
err error
res []searchModel.Intervene
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
s.SetDarkPub(c, "quguolin", 10)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
//ctx.So(res, convey.ShouldNotBeNil)
})
fmt.Println(res)
})
})
}
func TestDarkPubLog(t *testing.T) {
convey.Convey("DarkPubLog", t, func(ctx convey.C) {
var (
err error
dark []searchModel.Dark
)
ctx.Convey("When everything goes positive", func(ctx convey.C) {
s.DarkPubLog(dark)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
//ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}

View File

@@ -0,0 +1,430 @@
package search
import (
"context"
"encoding/json"
"fmt"
"strconv"
"time"
"go-common/app/admin/main/feed/model/common"
"go-common/app/admin/main/feed/model/show"
showModel "go-common/app/admin/main/feed/model/show"
"go-common/app/admin/main/feed/util"
"go-common/library/log"
"github.com/jinzhu/gorm"
)
const (
//_ActAddSearchWebCard log action
_ActAddSearchWebCard = "ActAddSearchWebCard"
//_ActUpSearchWebCard log action
_ActUpSearchWebCard = "ActUpSearchWebCard"
//_ActDelSearchWebCard log action
_ActDelSearchWebCard = "ActDelSearchWebCard"
//_ActAddSearchWeb log action
_ActAddSearchWeb = "ActAddSearchWeb"
//_ActUpSearchWeb log action
_ActUpSearchWeb = "ActUpSearchWeb"
//_ActDelSearchWeb log action
_ActDelSearchWeb = "ActDelSearchWeb"
//_ActOptSearchWeb log action
_ActOptSearchWeb = "ActOptSearchWeb"
)
var (
_emptyWebQuery = make([]*show.SearchWebQuery, 0)
)
//SearchWebCardList channel SearchWebCard list
func (s *Service) SearchWebCardList(lp *show.SearchWebCardLP) (pager *show.SearchWebCardPager, err error) {
pager = &show.SearchWebCardPager{
Page: common.Page{
Num: lp.Pn,
Size: lp.Ps,
},
}
w := map[string]interface{}{
"deleted": common.NotDeleted,
}
query := s.showDao.DB.Model(&show.SearchWebCard{})
if lp.ID > 0 {
w["id"] = lp.ID
}
if lp.Person != "" {
query = query.Where("person like ?", "%"+lp.Person+"%")
}
if lp.Title != "" {
query = query.Where("title like ?", "%"+lp.Title+"%")
}
if lp.STime != "" {
query = query.Where("ctime >= ?", lp.STime)
}
if lp.ETime != "" {
query = query.Where("ctime <= ?", lp.ETime)
}
if err = query.Where(w).Count(&pager.Page.Total).Error; err != nil {
log.Error("searchWebSvc.SearchWebCardList count error(%v)", err)
return
}
SearchWebCards := make([]*show.SearchWebCard, 0)
if err = query.Where(w).Order("`id` DESC").Offset((lp.Pn - 1) * lp.Ps).Limit(lp.Ps).Find(&SearchWebCards).Error; err != nil {
log.Error("searchWebSvc.SearchWebCardList Find error(%v)", err)
return
}
pager.Item = SearchWebCards
return
}
//AddSearchWebCard add channel SearchWebCard
func (s *Service) AddSearchWebCard(c context.Context, param *show.SearchWebCardAP, name string, uid int64) (err error) {
if err = s.showDao.SearchWebCardAdd(param); err != nil {
return
}
if err = util.AddLogs(common.LogSWEBCard, name, uid, 0, _ActAddSearchWebCard, param); err != nil {
log.Error("searchWebSvc.AddSearchWebCard AddLog error(%v)", err)
return
}
return
}
//UpdateSearchWebCard update channel SearchWebCard
func (s *Service) UpdateSearchWebCard(c context.Context, param *show.SearchWebCardUP, name string, uid int64) (err error) {
if err = s.showDao.SearchWebCardUpdate(param); err != nil {
return
}
if err = util.AddLogs(common.LogSWEBCard, name, uid, 0, _ActUpSearchWebCard, param); err != nil {
log.Error("searchWebSvc.UpdateSearchWebCard AddLog error(%v)", err)
return
}
return
}
//DeleteSearchWebCard delete channel SearchWebCard
func (s *Service) DeleteSearchWebCard(id int64, name string, uid int64) (err error) {
if err = s.showDao.SearchWebCardDelete(id); err != nil {
return
}
if err = util.AddLogs(common.LogSWEBCard, name, uid, id, _ActDelSearchWebCard, id); err != nil {
log.Error("searchWebSvc.DeleteSearchWebCard AddLog error(%v)", err)
return
}
return
}
//SearchWebList SearchWeb list
func (s *Service) SearchWebList(lp *show.SearchWebLP) (pager *show.SearchWebPager, err error) {
pager = &show.SearchWebPager{
Page: common.Page{
Num: lp.Pn,
Size: lp.Ps,
},
}
w := map[string]interface{}{
"deleted": common.NotDeleted,
}
query := s.showDao.DB.Model(&show.SearchWeb{})
if lp.ID > 0 {
w["id"] = lp.ID
}
if lp.Person != "" {
query = query.Where("person like ?", "%"+lp.Person+"%")
}
if lp.STime != "" {
query = query.Where("stime >= ?", lp.STime)
}
if lp.ETime != "" {
query = query.Where("etime <= ?", lp.ETime)
}
cTimeStr := util.CTimeStr()
if lp.Check != 0 {
if lp.Check == common.Pass {
//已通过 未生效
query = query.Where("`check` = ?", common.Pass)
query = query.Where("stime > ?", cTimeStr)
} else if lp.Check == common.Valid {
//已通过 已生效
query = query.Where("`check` = ?", common.Pass)
query = query.Where("stime <= ?", cTimeStr).Where("etime >= ?", cTimeStr)
} else if lp.Check == common.InValid {
//已通过 已失效
query = query.Where("(`check` = ? AND etime <= ?) OR (`check` = ?)", common.Pass, cTimeStr, common.InValid)
} else {
query = query.Where("`check` = ? ", lp.Check)
}
}
if err = query.Where(w).Count(&pager.Page.Total).Error; err != nil {
log.Error("searchSvc.SearchWebList count error(%v)", err)
return
}
SearchWebs := make([]*show.SearchWeb, 0)
if err = query.Where(w).Order("`id` DESC").Offset((lp.Pn - 1) * lp.Ps).Limit(lp.Ps).Find(&SearchWebs).Error; err != nil {
log.Error("searchSvc.SearchWebList Find error(%v)", err)
return
}
if len(SearchWebs) > 0 {
var (
ids []int64
queryMap map[int64][]*show.SearchWebQuery
)
for _, v := range SearchWebs {
if v.Check == common.Pass {
c := time.Now().Unix()
if (c >= v.Stime.Time().Unix()) && (c <= v.Etime.Time().Unix()) {
v.Check = common.Valid
} else if c > v.Etime.Time().Unix() && v.Check != common.InValid {
v.Check = common.InValid
v.Status = common.StatusDownline
}
}
webCard := &show.SearchWebCard{}
cardWhere := map[string]interface{}{
"deleted": common.NotDeleted,
"id": v.CardValue,
}
if err = s.showDao.DB.Model(&show.SearchWebCard{}).Where(cardWhere).First(webCard).Error; err != nil {
if err == gorm.ErrRecordNotFound {
err = nil
} else {
log.Error("searchSvc.SearchWebCard Find error(%v)", err)
return
}
}
v.Card = webCard
ids = append(ids, v.ID)
}
where := map[string]interface{}{
"deleted": common.NotDeleted,
}
SearchWebQuery := make([]*show.SearchWebQuery, 0)
if err = s.showDao.DB.Model(&show.SearchWebQuery{}).Where(where).Where("sid in (?)", ids).Find(&SearchWebQuery).Error; err != nil {
log.Error("searchSvc.SearchWebList Find error(%v)", err)
return
}
queryMap = make(map[int64][]*show.SearchWebQuery, len(SearchWebQuery))
for _, v := range SearchWebQuery {
queryMap[v.SID] = append(queryMap[v.SID], v)
}
for _, v := range SearchWebs {
if value, ok := queryMap[v.ID]; ok {
v.Query = value
} else {
v.Query = _emptyWebQuery
}
}
}
pager.Item = SearchWebs
return
}
//OpenSearchWebList SearchWeb list
func (s *Service) OpenSearchWebList() (SearchWebs []*show.SearchWeb, err error) {
cTimeStr := util.CTimeStr()
SearchWebs = make([]*show.SearchWeb, 0)
w := map[string]interface{}{
"deleted": common.NotDeleted,
"check": common.Pass,
}
query := s.showDao.DB.Model(&show.SearchWeb{})
//已通过 已生效
query = query.Where("stime <= ?", cTimeStr).Where("etime >= ?", cTimeStr)
if err = query.Where(w).Order("`id` DESC").Find(&SearchWebs).Error; err != nil {
log.Error("searchSvc.OpenSearchWebList Find error(%v)", err)
return
}
if len(SearchWebs) > 0 {
var (
ids []int64
queryMap map[int64][]*show.SearchWebQuery
)
for _, v := range SearchWebs {
webCard := &show.SearchWebCard{}
cardWhere := map[string]interface{}{
"deleted": common.NotDeleted,
"id": v.CardValue,
}
if err = s.showDao.DB.Model(&show.SearchWebCard{}).Where(cardWhere).First(webCard).Error; err != nil {
if err == gorm.ErrRecordNotFound {
err = nil
webCard = nil
} else {
log.Error("searchSvc.OpenSearchWebList Find error(%v)", err)
}
}
if webCard != nil {
v.Card = webCard
} else {
v.Card = struct{}{}
}
ids = append(ids, v.ID)
}
where := map[string]interface{}{
"deleted": common.NotDeleted,
}
SearchWebQuery := make([]*show.SearchWebQuery, 0)
if err = s.showDao.DB.Model(&show.SearchWebQuery{}).Where(where).Where("sid in (?)", ids).Find(&SearchWebQuery).Error; err != nil {
log.Error("searchSvc.OpenSearchWebList Find error(%v)", err)
return
}
queryMap = make(map[int64][]*show.SearchWebQuery, len(SearchWebQuery))
for _, v := range SearchWebQuery {
queryMap[v.SID] = append(queryMap[v.SID], v)
}
for _, v := range SearchWebs {
if value, ok := queryMap[v.ID]; ok {
v.Query = value
} else {
v.Query = _emptyWebQuery
}
}
}
return
}
//Validate validate search web card
func (s *Service) Validate(p *show.SWTimeValid) (err error) {
var (
querys []*show.SearchWebQuery
webCard *showModel.SearchWebCard
id int64
)
if id, err = strconv.ParseInt(p.CardValue, 10, 64); err != nil {
return
}
if webCard, err = s.showDao.SWBFindByID(id); err != nil {
return err
}
if webCard == nil {
return fmt.Errorf("无效web卡片ID(%d)", id)
}
if err = json.Unmarshal([]byte(p.Query), &querys); err != nil {
log.Error("searchSvc.Validate json.Unmarshal(%v) error(%v)", p, err)
return
}
if len(querys) == 0 {
err = fmt.Errorf("query不能为空")
return
}
for _, v := range querys {
count := 0
p.Query = v.Value
if count, err = s.showDao.SWTimeValid(p); err != nil {
return
}
if count > 0 {
err = fmt.Errorf("相同query(%s)该位置已有运营卡片", v.Value)
}
}
return
}
//AddSearchWeb add SearchWeb
func (s *Service) AddSearchWeb(c context.Context, param *show.SearchWebAP, name string, uid int64) (err error) {
p := &show.SWTimeValid{
Priority: param.Priority,
STime: param.Stime,
ETime: param.Etime,
Query: param.Query,
CardValue: param.CardValue,
}
if err = s.Validate(p); err != nil {
return
}
if err = s.showDao.SearchWebAdd(param); err != nil {
return
}
if err = util.AddLogs(common.LogSWEB, name, uid, 0, _ActAddSearchWeb, param); err != nil {
log.Error("searchSvc.AddSearchWeb AddLog error(%v)", err)
return
}
return
}
//UpdateSearchWeb update SearchWeb
func (s *Service) UpdateSearchWeb(c context.Context, param *show.SearchWebUP, name string, uid int64) (err error) {
var (
swValue *show.SearchWeb
)
p := &show.SWTimeValid{
ID: param.ID,
Priority: param.Priority,
STime: param.Stime,
ETime: param.Etime,
Query: param.Query,
CardValue: param.CardValue,
}
if err = s.Validate(p); err != nil {
return
}
if swValue, err = s.showDao.SWFindByID(param.ID); err != nil {
log.Error("searchSvc.UpdateSearchWeb AddLog error(%v)", err)
return
}
//待审核&已通过&已生效-》编辑-》状态不变;其它-》编辑-》审待核
cTime := time.Now().Unix()
if (swValue.Check == common.Verify) ||
(swValue.Check == common.Pass && swValue.Stime.Time().Unix() > cTime ||
(swValue.Check == common.Pass && (cTime > swValue.Stime.Time().Unix() && cTime <= swValue.Stime.Time().Unix()))) {
param.Check = swValue.Check
param.Status = swValue.Status
} else {
param.Check = common.Verify
param.Status = common.StatusDownline
}
if err = s.showDao.SearchWebUpdate(param); err != nil {
return
}
if err = util.AddLogs(common.LogSWEB, name, uid, 0, _ActUpSearchWeb, param); err != nil {
log.Error("searchSvc.UpdateSearchWeb AddLog error(%v)", err)
return
}
return
}
//DeleteSearchWeb delete SearchWeb
func (s *Service) DeleteSearchWeb(id int64, name string, uid int64) (err error) {
if err = s.showDao.SearchWebDelete(id); err != nil {
return
}
if err = util.AddLogs(common.LogSWEB, name, uid, id, _ActDelSearchWeb, id); err != nil {
log.Error("searchSvc.DeleteSearchWeb AddLog error(%v)", err)
return
}
return
}
//OptionSearchWeb option SearchWeb
func (s *Service) OptionSearchWeb(id int64, opt string, name string, uid int64) (err error) {
up := &show.SearchWebOption{}
if opt == common.OptionOnline {
up.Status = common.StatusOnline
up.Check = common.Pass
} else if opt == common.OptionHidden {
up.Status = common.StatusDownline
up.Check = common.InValid
} else if opt == common.OptionPass {
up.Status = common.StatusOnline
up.Check = common.Pass
} else if opt == common.OptionReject {
up.Status = common.StatusDownline
up.Check = common.Rejecte
} else {
err = fmt.Errorf("参数不合法")
return
}
up.ID = id
if err = s.showDao.SearchWebOption(up); err != nil {
return
}
logParam := map[string]interface{}{
"id": id,
"opt": opt,
"up": up,
}
if err = util.AddLogs(common.LogSWEB, name, uid, id, _ActOptSearchWeb, logParam); err != nil {
log.Error("searchSvc.OptionSearchWeb AddLog error(%v)", err)
return
}
return
}

View File

@@ -0,0 +1,16 @@
{
"swagger": "2.0",
"info": {
"title": "go-common api",
"description": "api",
"version": "1.0",
"contact": {
"email": "lintanghui@bilibili.com"
},
"license": {
"name": "Apache 2.0",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
}
},
"paths": {}
}

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 = ["dao.go"],
importpath = "go-common/app/admin/main/feed/util",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/feed/model/common:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/queue/databus/report:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

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