Create & Init Project...

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

View File

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

View File

@@ -0,0 +1,54 @@
package show
import (
"context"
"time"
"go-common/app/interface/main/app-show/conf"
"go-common/library/cache/redis"
"go-common/library/database/sql"
)
// Dao is show dao.
type Dao struct {
// mysql
db *sql.DB
getHead *sql.Stmt
getItem *sql.Stmt
getHeadTmp *sql.Stmt
getItemTmp *sql.Stmt
// redis
rcmmndRds *redis.Pool
rcmmndExp int
}
// New new a show dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// mysql
db: sql.NewMySQL(c.MySQL.Show),
// redis
rcmmndRds: redis.NewPool(c.Redis.Recommend.Config),
rcmmndExp: int(time.Duration(c.Redis.Recommend.Expire) / time.Second),
}
d.getHead = d.db.Prepared(_headSQL)
d.getItem = d.db.Prepared(_itemSQL)
d.getHeadTmp = d.db.Prepared(_headTmpSQL)
d.getItemTmp = d.db.Prepared(_itemTmpSQL)
return d
}
// Close close memcache resource.
func (d *Dao) Close() (err error) {
if d.rcmmndRds != nil {
return d.rcmmndRds.Close()
}
return nil
}
func (d *Dao) Ping(c context.Context) (err error) {
conn := d.rcmmndRds.Get(c)
_, err = conn.Do("SET", "PING", "PONG")
conn.Close()
return
}

View File

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

View File

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

View File

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