Files
web_huangguo2_server/app/service/translationser/catch.go
T
2026-09-29 10:47:38 +08:00

174 lines
5.3 KiB
Go

package translationser
import (
"context"
"sync"
"videoweb/app/api/proto"
"videoweb/pub/common/log"
"videoweb/pub/common/netutil"
"videoweb/pub/models/cfg"
"videoweb/pub/models/translationcategorymod"
"videoweb/pub/models/translationmod"
"videoweb/pub/pubdef"
"github.com/robfig/cron/v3"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo/options"
)
var (
CacheMgr CacheInfo //
skdCron *cron.Cron
)
type CacheInfo struct {
Lock sync.RWMutex // 读写锁
TranslationData proto.AppTranslationInfo // 导航信息缓存
BottomTranslationData proto.AppTranslationInfo // 底部导航信息缓存
TranslationMap map[int64]proto.TranslationInfo
}
func init() {
skdCron = cron.New(cron.WithSeconds()) // 秒级定时任务
CacheMgr.TranslationData = proto.AppTranslationInfo{}
CacheMgr.BottomTranslationData = proto.AppTranslationInfo{}
CacheMgr.TranslationMap = make(map[int64]proto.TranslationInfo)
}
func Start() {
ctx := context.Background()
UpdateTranslationInfo(ctx)
_, _ = skdCron.AddFunc("0 */5 * * * ?", func() {
UpdateTranslationInfo(ctx)
})
skdCron.Start()
}
func UpdateTranslationInfo(ctx context.Context) {
filter := bson.M{cfg.FN.SysCfg.Id: 1}
sysCfg, _ := cfg.FindOneSysCfg(context.Background(), filter)
if sysCfg == nil {
return
}
translation := proto.AppTranslationInfo{}
bottomTranslation := proto.AppTranslationInfo{}
wg := &sync.WaitGroup{}
wg.Add(2)
var translationCategoryList translationcategorymod.TranslationCategoryList
var translationList translationmod.TranslationInfoList
go func() {
defer wg.Done()
categoryFilter := bson.M{
translationcategorymod.FN.TranslationCategory.Status: true,
}
categoryOpt := &options.FindOptions{}
categoryOpt.SetLimit(1000).SetSort(bson.M{translationcategorymod.FN.TranslationCategory.Rank: -1})
translationCategoryList, _ = translationcategorymod.FindManyTranslationCategorys(ctx, categoryFilter, categoryOpt)
}()
go func() {
defer wg.Done()
translationFilter := bson.M{
translationmod.FN.TranslationInfo.Status: true,
}
translationOpt := &options.FindOptions{}
translationOpt.SetLimit(1000).SetSort(bson.M{translationmod.FN.TranslationInfo.Rank: -1})
translationList, _ = translationmod.FindManyTranslationInfos(ctx, translationFilter, translationOpt)
}()
wg.Wait()
tempTranslationMap := make(map[int64]proto.TranslationInfo)
for _, categoryInfo := range translationCategoryList {
categoryTemp := proto.TranslationCategory{
ID: categoryInfo.Id,
Name: categoryInfo.Name,
Icon: netutil.MergeURL(sysCfg.ImgAppCdn, categoryInfo.Icon),
TranslationList: make([]proto.TranslationInfo, 0),
CategoryType: categoryInfo.CategoryType,
SeoInfo: categoryInfo.SeoInfo,
}
if categoryTemp.CategoryType == pubdef.TranslationTypeUrl {
categoryTemp.UrlValue = categoryInfo.UrlValue
} else if categoryInfo.CategoryType == pubdef.TranslationTypeSub {
for _, translationInfo := range translationList {
if categoryInfo.Id == translationInfo.TransCategoryId {
translationTmp := proto.TranslationInfo{
ID: translationInfo.Id,
Name: translationInfo.Name,
}
if translationInfo.IsFriendAds {
translationTmp.IsFriendAds = true
// 友链广告 获取的时候添加
// TODO:顶部暂不支持 。
continue
} else {
translationTmp.UrlValue = translationInfo.Link
}
if translationTmp.UrlValue == "" {
continue
}
tempTranslationMap[translationInfo.Id] = translationTmp
categoryTemp.TranslationList = append(categoryTemp.TranslationList, translationTmp)
}
}
} else if categoryInfo.CategoryType == pubdef.TranslationTypeBottom {
for _, translationInfo := range translationList {
if categoryInfo.Id == translationInfo.TransCategoryId {
translationTmp := proto.TranslationInfo{
ID: translationInfo.Id,
Name: translationInfo.Name,
}
if translationInfo.IsFriendAds {
translationTmp.IsFriendAds = true
// 友链广告 获取的时候添加
} else {
translationTmp.UrlValue = translationInfo.Link
}
tempTranslationMap[translationInfo.Id] = translationTmp
categoryTemp.TranslationList = append(categoryTemp.TranslationList, translationTmp)
}
}
bottomTranslation.CategoryList = append(bottomTranslation.CategoryList, categoryTemp)
continue
} else {
continue
}
translation.CategoryList = append(translation.CategoryList, categoryTemp)
}
log.Info("", log.Any("categoryInfo.Name", translation.CategoryList))
CacheMgr.Lock.Lock()
defer CacheMgr.Lock.Unlock()
CacheMgr.TranslationData = translation
CacheMgr.BottomTranslationData = bottomTranslation
CacheMgr.TranslationMap = tempTranslationMap
}
func GetTranslationData() proto.AppTranslationInfo {
CacheMgr.Lock.RLock()
defer CacheMgr.Lock.RUnlock()
log.Info("GetTranslationData", log.Any("TranslationData", CacheMgr.TranslationData))
return CacheMgr.TranslationData
}
func GetTranslationBottomList() proto.AppTranslationInfo {
CacheMgr.Lock.RLock()
defer CacheMgr.Lock.RUnlock()
return CacheMgr.BottomTranslationData
}
func GetTranslationInfo(id int64) *proto.TranslationInfo {
CacheMgr.Lock.RLock()
defer CacheMgr.Lock.RUnlock()
if v, ok := CacheMgr.TranslationMap[id]; ok {
return &v
}
return nil
}