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,61 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["mine_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-interface/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"mine.go",
"service.go",
],
importpath = "go-common/app/interface/main/app-interface/service/account",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-interface/conf:go_default_library",
"//app/interface/main/app-interface/dao/account:go_default_library",
"//app/interface/main/app-interface/dao/audio:go_default_library",
"//app/interface/main/app-interface/dao/bplus:go_default_library",
"//app/interface/main/app-interface/dao/member:go_default_library",
"//app/interface/main/app-interface/dao/pay:go_default_library",
"//app/interface/main/app-interface/dao/relation:go_default_library",
"//app/interface/main/app-interface/dao/sidebar:go_default_library",
"//app/interface/main/app-interface/model:go_default_library",
"//app/interface/main/app-interface/model/space:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/relation/model:go_default_library",
"//app/service/main/resource/model:go_default_library",
"//library/log:go_default_library",
"//library/sync/errgroup.v2: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,362 @@
package space
import (
"context"
"encoding/json"
"fmt"
"sync"
"go-common/app/interface/main/app-interface/model/space"
accmdl "go-common/app/service/main/account/model"
relmdl "go-common/app/service/main/relation/model"
"go-common/library/log"
"go-common/library/sync/errgroup.v2"
)
const (
_initSidebarKey = "sidebar_%d_%d"
_selfCenter = 6
_mySerive = 7
_creative = 11
_ipadSelfCenter = 12
_ipadCreative = 13
)
var (
iphoneMenu = map[int]string{
_creative: "创作中心",
_selfCenter: "个人中心",
_mySerive: "我的服务",
}
iphoneNormalMenu = []int{_creative, _selfCenter, _mySerive}
iphoneFilterMenu = []int{_selfCenter, _mySerive}
ipadNormalMenu = []int{_ipadCreative, _ipadSelfCenter}
ipadFilterMenu = []int{_ipadSelfCenter}
)
// Mine mine center for iphone/android
func (s *Service) Mine(c context.Context, mid int64, platform, filtered string, build int, plat int8) (mine *space.Mine, err error) {
var whiteMap, rdMap map[int64]bool
mine = new(space.Mine)
mine.Official.Type = -1
if mid > 0 {
if mine, whiteMap, rdMap, err = s.userInfo(c, mid, platform, plat); err != nil {
return
}
}
if platform == "ios" {
mine.Sections = s.sections(c, whiteMap, rdMap, mid, build, filtered == "1", plat)
}
return
}
// MineIpad mine center for ipad
func (s *Service) MineIpad(c context.Context, mid int64, platform, filtered string, build int, plat int8) (mine *space.Mine, err error) {
var whiteMap, rdMap map[int64]bool
mine = new(space.Mine)
mine.Official.Type = -1
if mid > 0 {
if mine, whiteMap, rdMap, err = s.userInfo(c, mid, platform, plat); err != nil {
return
}
}
mine.IpadSections, mine.IpadUpperSections = s.ipadSections(c, whiteMap, rdMap, mid, build, filtered == "1", plat)
return
}
func (s *Service) userInfo(c context.Context, mid int64, platform string, plat int8) (mine *space.Mine, whiteMap, rdMap map[int64]bool, err error) {
mine = new(space.Mine)
whiteMap = make(map[int64]bool)
rdMap = make(map[int64]bool)
eg := errgroup.WithContext(c)
// account userinfo
eg.Go(func(ctx context.Context) (err error) {
var ps *accmdl.ProfileStat
if ps, err = s.accDao.Profile3(ctx, mid); err != nil {
log.Error("s.accDao.UserInfo(%d) error(%v)", mid, err)
return
}
if ps.Silence == 1 {
if mine.EndTime, err = s.accDao.BlockTime(ctx, mid); err != nil {
log.Error("%+v", err)
err = nil
}
}
mine.Silence = ps.Silence
mine.Mid = ps.Mid
mine.Name = ps.Name
mine.Face = ps.Face
mine.Coin = ps.Coins
if ps.Pendant.Image != "" {
mine.Pendant = &space.Pendant{Image: ps.Pendant.Image}
}
switch ps.Sex {
case "男":
mine.Sex = 1
case "女":
mine.Sex = 2
default:
mine.Sex = 0
}
mine.Rank = ps.Rank
mine.Level = ps.Level
if ps.Vip.Status == 1 {
mine.VipType = ps.Vip.Type
}
if ps.Official.Role == 0 {
mine.Official.Type = -1
} else {
if ps.Official.Role <= 2 {
mine.Official.Type = 0
} else {
mine.Official.Type = 1
}
mine.Official.Desc = ps.Official.Title
}
return
})
// music card
eg.Go(func(ctx context.Context) (err error) {
cardm, err := s.audioDao.Card(ctx, mid)
if err != nil {
log.Error("%+v", err)
err = nil
return
}
if card, ok := cardm[mid]; ok && card.Type == 1 && card.Status == 1 {
mine.AudioType = card.Type
}
return
})
// following and follower
eg.Go(func(ctx context.Context) (err error) {
var stat *relmdl.Stat
if stat, err = s.relDao.Stat(ctx, mid); err != nil {
log.Error("%+v", err)
err = nil
return
}
mine.Following = stat.Following
mine.Follower = stat.Follower
return
})
// new followers
eg.Go(func(ctx context.Context) (err error) {
if mine.NewFollowers, err = s.relDao.FollowersUnreadCount(ctx, mid); err != nil {
log.Error("%+v", err)
err = nil
return
}
return
})
// dynamic count
eg.Go(func(ctx context.Context) (err error) {
var count int64
if count, err = s.bplusDao.DynamicCount(ctx, mid); err != nil {
log.Error("%+v", err)
err = nil
return
}
mine.Dynamic = count
return
})
// bcoin
eg.Go(func(ctx context.Context) (err error) {
var bp float64
if bp, err = s.payDao.UserWalletInfo(ctx, mid, platform); err != nil {
log.Error("%+v", err)
err = nil
return
}
mine.BCoin = bp
return
})
// creative
eg.Go(func(ctx context.Context) (err error) {
var (
isUp int
show int
)
if isUp, show, err = s.memberDao.Creative(ctx, mid); err != nil {
log.Error("%+v", err)
err = nil
return
}
mine.ShowVideoup = show
mine.ShowCreative = isUp
return
})
if platform == "ios" {
var mutex sync.Mutex
//white
for _, v := range s.white[plat] {
tmpID := v.ID
tmpURL := v.URL
eg.Go(func(ctx context.Context) (err error) {
ok, err := s.accDao.UserCheck(ctx, mid, tmpURL)
if err != nil {
log.Error("s.accDao.UserCheck error(%+v)", err)
err = nil
return
}
if ok {
mutex.Lock()
whiteMap[tmpID] = true
mutex.Unlock()
}
return
})
}
//redDot
for _, v := range s.redDot[plat] {
tmpID := v.ID
tmpURL := v.URL
eg.Go(func(ctx context.Context) (err error) {
ok, err := s.accDao.RedDot(ctx, mid, tmpURL)
if err != nil {
log.Error("s.accDao.RedDot error(%+v)", err)
err = nil
return
}
if ok {
mutex.Lock()
rdMap[tmpID] = true
mutex.Unlock()
}
return
})
}
}
// when account info error,return,ingore else error
err = eg.Wait()
return
}
func (s *Service) sections(c context.Context, whiteMap, rdMap map[int64]bool, mid int64, build int, filtered bool, plat int8) (sections []*space.Section) {
menus := iphoneNormalMenu
if filtered {
menus = iphoneFilterMenu
}
for _, module := range menus {
key := fmt.Sprintf(_initSidebarKey, plat, module)
ss, ok := s.sectionCache[key]
if !ok {
continue
}
var items []*space.SectionItem
for _, si := range ss {
if !si.CheckLimit(build) {
continue
}
if si.Item.Name == "离线缓存" && filtered {
continue
}
if si.Item.WhiteURL != "" && !whiteMap[si.Item.ID] {
continue
}
tmpItem := &space.SectionItem{
Title: si.Item.Name,
Icon: si.Item.Logo,
NeedLogin: si.Item.NeedLogin,
URI: si.Item.Param,
}
if si.Item.Red != "" && rdMap[si.Item.ID] {
tmpItem.RedDot = 1
}
items = append(items, tmpItem)
}
if len(items) == 0 {
continue
}
sections = append(sections, &space.Section{
Title: iphoneMenu[module],
Items: items,
})
}
return
}
func (s *Service) ipadSections(c context.Context, whiteMap, rdMap map[int64]bool, mid int64, build int, filtered bool, plat int8) (ipadSections, ipadUpperSections []*space.SectionItem) {
menus := ipadNormalMenu
if filtered {
menus = ipadFilterMenu
}
for _, module := range menus {
key := fmt.Sprintf(_initSidebarKey, plat, module)
ss, ok := s.sectionCache[key]
if !ok {
continue
}
for _, si := range ss {
if !si.CheckLimit(build) {
continue
}
if si.Item.Name == "离线缓存" && filtered {
continue
}
if si.Item.WhiteURL != "" && !whiteMap[si.Item.ID] {
continue
}
tmpItem := &space.SectionItem{
Title: si.Item.Name,
Icon: si.Item.Logo,
NeedLogin: si.Item.NeedLogin,
URI: si.Item.Param,
}
if si.Item.Red != "" && rdMap[si.Item.ID] {
tmpItem.RedDot = 1
}
if module == _ipadCreative {
ipadUpperSections = append(ipadUpperSections, tmpItem)
} else {
ipadSections = append(ipadSections, tmpItem)
}
}
}
return
}
// Myinfo simple myinfo
func (s *Service) Myinfo(c context.Context, mid int64) (myinfo *space.Myinfo, err error) {
var pf *accmdl.ProfileStat
if pf, err = s.accDao.Profile3(c, mid); err != nil {
log.Error("%+v", err)
return
}
p, _ := json.Marshal(pf)
log.Warn("myinfo mid(%d) pf(%s)", mid, p)
myinfo = new(space.Myinfo)
if pf.Silence == 1 {
if myinfo.EndTime, err = s.accDao.BlockTime(c, mid); err != nil {
log.Error("%+v", err)
err = nil
}
}
myinfo.Coins = pf.Coins
myinfo.Sign = pf.Sign
switch pf.Sex {
case "男":
myinfo.Sex = 1
case "女":
myinfo.Sex = 2
default:
myinfo.Sex = 0
}
myinfo.Mid = mid
myinfo.Birthday = pf.Birthday.Time().Format("2006-01-02")
myinfo.Name = pf.Name
myinfo.Face = pf.Face
myinfo.Rank = pf.Rank
myinfo.Level = pf.Level
myinfo.Vip = pf.Vip
myinfo.Silence = pf.Silence
myinfo.EmailStatus = pf.EmailStatus
myinfo.TelStatus = pf.TelStatus
myinfo.Official = pf.Official
myinfo.Identification = pf.Identification
if pf.Pendant.Image != "" {
myinfo.Pendant = &space.Pendant{Image: pf.Pendant.Image}
}
return
}

View File

@@ -0,0 +1,67 @@
package space
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-interface/conf"
. "github.com/smartystreets/goconvey/convey"
)
var s *Service
func init() {
dir, _ := filepath.Abs("../../cmd/app-interface-test.toml")
flag.Set("conf", dir)
conf.Init()
s = New(conf.Conf)
time.Sleep(3 * time.Second)
}
func Test_Mine(t *testing.T) {
Convey("Test_Mine", t, func() {
mine, err := s.Mine(context.Background(), 16840123, "ios", "", 0, 0)
So(err, ShouldBeNil)
for _, s := range mine.Sections {
Printf("%+v\n", s.Title)
for _, item := range s.Items {
Printf("%+v\n", item.Title)
}
}
})
}
func Test_MineIpad(t *testing.T) {
Convey("Test_Mine", t, func() {
mine, err := s.MineIpad(context.Background(), 16840123, "ios", "", 0, 2)
So(err, ShouldBeNil)
for _, item := range mine.IpadSections {
Printf("%+v\n", item.Title)
}
})
}
func Test_MyInfo(t *testing.T) {
Convey("Test_MyInfo", t, func() {
myinfo, err := s.Myinfo(context.Background(), 1684013)
So(err, ShouldBeNil)
Printf("%+v", myinfo)
})
}
func Test_LoadSidebar(t *testing.T) {
Convey("Test_LoadSidebar", t, func() {
Println("starting...")
sections := s.sections(context.Background(), nil, nil, 1, 1, true, 1)
for _, section := range sections {
Println("section标题:" + section.Title)
for _, item := range section.Items {
Println(item.Title)
}
}
})
}

View File

@@ -0,0 +1,125 @@
package space
import (
"context"
"fmt"
"time"
"go-common/app/interface/main/app-interface/conf"
accdao "go-common/app/interface/main/app-interface/dao/account"
audiodao "go-common/app/interface/main/app-interface/dao/audio"
bplusdao "go-common/app/interface/main/app-interface/dao/bplus"
memberdao "go-common/app/interface/main/app-interface/dao/member"
paydao "go-common/app/interface/main/app-interface/dao/pay"
reldao "go-common/app/interface/main/app-interface/dao/relation"
sidedao "go-common/app/interface/main/app-interface/dao/sidebar"
"go-common/app/interface/main/app-interface/model"
resmodel "go-common/app/service/main/resource/model"
"go-common/library/log"
)
// Service is space service
type Service struct {
c *conf.Config
accDao *accdao.Dao
audioDao *audiodao.Dao
relDao *reldao.Dao
bplusDao *bplusdao.Dao
payDao *paydao.Dao
memberDao *memberdao.Dao
sideDao *sidedao.Dao
sectionCache map[string][]*SectionItem
white map[int8][]*SectionURL
redDot map[int8][]*SectionURL
}
// SectionItem is
type SectionItem struct {
Item *resmodel.SideBar
Limit []*resmodel.SideBarLimit
}
// SectionURL is
type SectionURL struct {
ID int64
URL string
}
// CheckLimit is
func (item *SectionItem) CheckLimit(build int) bool {
for _, l := range item.Limit {
if model.InvalidBuild(build, l.Build, l.Condition) {
return false
}
}
return true
}
// New new space
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
accDao: accdao.New(c),
audioDao: audiodao.New(c),
relDao: reldao.New(c),
bplusDao: bplusdao.New(c),
payDao: paydao.New(c),
memberDao: memberdao.New(c),
sideDao: sidedao.New(c),
sectionCache: map[string][]*SectionItem{},
white: map[int8][]*SectionURL{},
redDot: map[int8][]*SectionURL{},
}
if err := s.loadSidebar(); err != nil {
panic(fmt.Sprintf("load sidebar error(%+v)", err))
}
go s.tickproc()
return s
}
// tickproc tick load cache.
func (s *Service) tickproc() {
for {
time.Sleep(time.Duration(s.c.Tick))
s.loadSidebar()
}
}
func (s *Service) loadSidebar() (err error) {
var sidebar *resmodel.SideBars
if sidebar, err = s.sideDao.Sidebars(context.TODO()); err != nil {
log.Error("s.sideDao.SideBars error(%v)", err)
return
}
ss := make(map[string][]*SectionItem)
white := make(map[int8][]*SectionURL)
redDot := make(map[int8][]*SectionURL)
for _, item := range sidebar.SideBar {
item.Plat = s.convertPlat(item.Plat)
key := fmt.Sprintf(_initSidebarKey, item.Plat, item.Module)
ss[key] = append(ss[key], &SectionItem{
Item: item,
Limit: sidebar.Limit[item.ID],
})
if item.WhiteURL != "" {
white[item.Plat] = append(white[item.Plat], &SectionURL{ID: item.ID, URL: item.WhiteURL})
}
if item.Red != "" {
redDot[item.Plat] = append(redDot[item.Plat], &SectionURL{ID: item.ID, URL: item.Red})
}
}
s.sectionCache = ss
s.white = white
s.redDot = redDot
return
}
func (s *Service) convertPlat(oldPlat int8) (newPlat int8) {
newPlat = oldPlat
if oldPlat == 9 {
newPlat = model.PlatAndroidB
} else if oldPlat == 10 {
newPlat = model.PlatIPhoneB
}
return newPlat
}