From 5203822b3252932a3c9b36e6439938bdf3589ac1 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 23 Sep 2026 16:32:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B9=BF=E5=91=8A=E6=94=B9=E4=B8=BA=E5=8F=82?= =?UTF-8?q?=E8=80=83=E6=A8=A1=E6=9D=BF=E4=BB=8E=E5=AA=92=E8=B5=84=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E6=8C=89=20AppId=20=E6=8B=89=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 proxy.QueryAdvitise / storage.QueryAdvitiseList,调用 /media/web/app/advitise - proxy.AdvitiseInfo 兼容 id 为数字或字符串 - configser 改用 UpdateAdvitiseData,定时拉取并拼接 CDN,移除广告中心(Jt)拉取 - proto.AdvitiseData 改为 proxy.AdvitiseData 别名,应用列表 A/B 广告位改用 appInfoAList/appInfoBList - 同步 swagger 文档 Co-Authored-By: Claude Opus 5.5 (1M context) --- app/api/proto/ads.go | 21 +---- app/service/appser/cache.go | 4 +- app/service/configser/announcement.go | 120 +++++++++----------------- app/service/configser/catch.go | 6 +- pub/storage/proxy/object.go | 24 ++++++ pub/storage/proxy/types.go | 28 ++++++ pub/storage/upload.go | 4 + 7 files changed, 104 insertions(+), 103 deletions(-) diff --git a/app/api/proto/ads.go b/app/api/proto/ads.go index ce87080..d4900db 100644 --- a/app/api/proto/ads.go +++ b/app/api/proto/ads.go @@ -13,22 +13,5 @@ type AdsClickInfo struct { Location int64 `json:"location,omitempty" binding:"required"` // 位置ID } -type AdvitiseData struct { - HomeList []proxy.AdvitiseInfo `json:"homeList" bson:"homeList"` // 首页列表 - DetailTopList []proxy.AdvitiseInfo `json:"detailTopList" bson:"detailTopList"` // 详情页顶部广告 - NineGridList []proxy.AdvitiseInfo `json:"nineGridList" bson:"nineGridList"` // 9宫格 - DetailbannerList []proxy.AdvitiseInfo `json:"detailbannerList" bson:"detailbannerList"` // 详情banner - LaunchScreenList []proxy.AdvitiseInfo `json:"launchScreenList"` // 启动页广告 - FloatingList []proxy.AdvitiseInfo `json:"floatingList" bson:"floatingList"` // 悬浮小方块 - AList []proxy.AdvitiseInfo `json:"AList"` // 固定12广告位 - BList []proxy.AdvitiseInfo `json:"BList"` // 固定13广告位 - DialogList []proxy.AdvitiseInfo `json:"dialogList" bson:"dialogList"` // 弹窗广告 - BottomBanner []proxy.AdvitiseInfo `json:"bottomBanner" bson:"bottomBanner"` // 底部banner - - VideoInfoList []proxy.AdvitiseInfo `json:"videoInfoList" bson:"videoInfoList"` // 视频详情 - DownList []proxy.AdvitiseInfo `json:"downList" bson:"downList"` // 底部广告 - FriendList []proxy.AdvitiseInfo `json:"friendList" bson:"friendList"` // 友链 - TitleList []proxy.AdvitiseInfo `json:"titleList" bson:"titleList"` // 标题广告 - PlayList []proxy.AdvitiseInfo `json:"playList" bson:"playList"` // 播放强制跳转 - PauseyList []proxy.AdvitiseInfo `json:"pauseyList" bson:"pauseyList"` // 暂停广告 -} +// AdvitiseData 广告数据,直接使用媒资中心返回的结构 +type AdvitiseData = proxy.AdvitiseData diff --git a/app/service/appser/cache.go b/app/service/appser/cache.go index d21ae5f..9ff2b65 100644 --- a/app/service/appser/cache.go +++ b/app/service/appser/cache.go @@ -124,7 +124,7 @@ func UpdateAppListCache(ctx context.Context) { } // 广告位 A(code=12) if category.Code == 12 { - for _, ad := range advitise.AList { + for _, ad := range advitise.AppInfoAList { apps = append(apps, proto.AppInfoData{ AdvitiseId: ad.Id, CategoryId: category.Id, @@ -137,7 +137,7 @@ func UpdateAppListCache(ctx context.Context) { } // 广告位 B(code=13) if category.Code == 13 { - for _, ad := range advitise.BList { + for _, ad := range advitise.AppInfoBList { apps = append(apps, proto.AppInfoData{ AdvitiseId: ad.Id, CategoryId: category.Id, diff --git a/app/service/configser/announcement.go b/app/service/configser/announcement.go index f37e2ca..f2f3002 100644 --- a/app/service/configser/announcement.go +++ b/app/service/configser/announcement.go @@ -1,97 +1,61 @@ package configser import ( - "strconv" - "videoweb/app/api/proto" - "videoweb/app/appg" - "videoweb/pub/adcenter" + "context" + "net/http" "videoweb/pub/common/log" "videoweb/pub/common/netutil" + "videoweb/pub/pubdef" + "videoweb/pub/storage" "videoweb/pub/storage/proxy" ) -// UpdateAdvitiseDataFromJt 从广告中心拉取福利页广告 -func UpdateAdvitiseDataFromJt() { +// UpdateAdvitiseData 从媒资中心按 AppId 拉取广告,图片拼接 CDN 后写入缓存 +func UpdateAdvitiseData(ctx context.Context) { config := GetConfigInfo() - var resp proto.AdvitiseData - jtAds, err := adcenter.JtAdvertiseThreeServer(appg.Conf.AdCenter.ApiDomain, appg.Conf.AdCenter.MerchantCode, appg.Conf.AdCenter.AppCode, appg.Conf.AdCenter.AesKey) - if err != nil { - log.Error("JtAdvertiseThreeServer error occur", log.E(err)) + queryAdvitiseReq := &proxy.AppAdvitiseInfoReq{ + Id: pubdef.AppId, + } + advitiseResult, err := storage.QueryAdvitiseList(ctx, queryAdvitiseReq, "") + if err != nil || advitiseResult.Code != http.StatusOK { + if advitiseResult != nil { + log.Warn("UpdateAdvitiseData.QueryAdvitiseList failed", log.Any("filter", queryAdvitiseReq), log.E(err), log.Any("respCode", advitiseResult.Code)) + } else { + log.Warn("UpdateAdvitiseData.QueryAdvitiseList failed", log.Any("filter", queryAdvitiseReq), log.E(err)) + } return } - adMap := make(map[string]adcenter.AdCacheInfo) - for _, loc := range jtAds { - pos, err := strconv.Atoi(loc.AdvertiseLocationCode) - if err != nil { - log.Error("广告位置代码错误,必须为数字", log.Any("code", loc.AdvertiseLocationCode)) - continue - } - //if pos < 100001 { - // continue - //} - ads := make([]proxy.AdvitiseInfo, 0) - for _, ad := range loc.AdDetailInfoList { - //extra := ad.GetExtraData() - ads = append(ads, proxy.AdvitiseInfo{ - Id: ad.AdvertiseCode, - Location: int64(pos), - Title: ad.AdvertiseName, - Images: netutil.MergeURL(config.ImgCdn, ad.GetCoverLsj()), - Link: ad.GetRealLink(), - }) - adMap[ad.AdvertiseCode] = adcenter.AdCacheInfo{ - AdvertiseCode: ad.AdvertiseCode, - CustomerCode: ad.CustomerCode, - AdvertiseName: ad.AdvertiseName, - AdvertiseUrl: ad.AdvertiseUrl, - AdvertiseIcon: ad.AdvertiseIcon, - AdvertiseType: ad.AdvertiseType, - AdMode: ad.AdMode, - AppCode: ad.AppCode, - LocationType: ad.LocationType, - AdvertiseDesc: ad.AdvertiseDesc, - PageType: ad.PageType, - StartTimeStamp: ad.StartTimeStamp, - EndTimeStamp: ad.EndTimeStamp, - Sort: ad.Sort, - AdExtData: ad.AdExtData, - DeptCode: loc.DeptCode, - MerchantCode: loc.MerchantCode, - AdvertiseLocationCode: loc.AdvertiseLocationCode, - AdvertiseLocationName: loc.AdvertiseLocationName, - DisplayMode: loc.DisplayMode, - AdvertiseHeight: loc.AdvertiseHeight, - AdvertiseWidth: loc.AdvertiseWidth, - MaterialType: loc.MaterialType, - AdLimit: loc.AdLimit, - } - } - switch pos { - case 1: //弹窗 - resp.DialogList = ads - case 2: // 应用 - resp.DetailTopList = ads - case 3: // 横幅 - resp.NineGridList = ads - resp.DetailbannerList = ads - case 12: - resp.AList = ads - case 13: - resp.BList = ads - } + data := advitiseResult.Data + for _, list := range []*[]proxy.AdvitiseInfo{ + &data.DialogList, + &data.HomeList, + &data.VideoTopList, + &data.VideoDownList, + &data.HotAppList, + &data.NewAppList, + &data.MustAppList, + &data.TitleAppList, + &data.FriendList, + &data.NineGridList, + &data.VideoList, + &data.StopList, + &data.ForcedJumpList, + &data.AppInfoAList, + &data.AppInfoBList, + } { + mergeAdvitiseImages(*list, config.ImgCdn) } + CacheMgr.Lock.Lock() defer CacheMgr.Lock.Unlock() - CacheMgr.Advitise = resp - CacheMgr.AdvitiseMap = adMap + CacheMgr.Advitise = data } -func GetAdvertiseLocation(adverId string) (res adcenter.AdCacheInfo) { - CacheMgr.Lock.RLock() - defer CacheMgr.Lock.RUnlock() - if ad, ok := CacheMgr.AdvitiseMap[adverId]; ok { - res = ad +func mergeAdvitiseImages(list []proxy.AdvitiseInfo, cdn string) { + for i := range list { + if len(list[i].Images) > 0 { + list[i].Images = netutil.MergeURL(cdn, list[i].Images) + } } - return } diff --git a/app/service/configser/catch.go b/app/service/configser/catch.go index 19c6e67..986002d 100644 --- a/app/service/configser/catch.go +++ b/app/service/configser/catch.go @@ -8,7 +8,6 @@ import ( "sync" "videoweb/app/api/proto" "videoweb/app/service/translationser" - "videoweb/pub/adcenter" "videoweb/pub/common/log" "videoweb/pub/common/netutil" "videoweb/pub/common/srvdef" @@ -36,7 +35,6 @@ type CacheInfo struct { Lock sync.RWMutex // 读写锁 Config proto.ConfigInfo // 系统配置缓存 Advitise proto.AdvitiseData - AdvitiseMap map[string]adcenter.AdCacheInfo TagCategoryList []proto.VideoTagCategoryData TotalHistory int64 IpBlackMaps map[string]struct{} @@ -63,14 +61,14 @@ func Start() { ctx := context.Background() dataReport.StartSDKConfigCron() UpdateConfigInfo(ctx) - UpdateAdvitiseDataFromJt() + UpdateAdvitiseData(ctx) updateIpBlack() updateTagsCache() updateAppRichTexts() updateAnnouncements() _, _ = skdCron.AddFunc("0 */5 * * * ?", func() { UpdateConfigInfo(ctx) - UpdateAdvitiseDataFromJt() + UpdateAdvitiseData(ctx) updateIpBlack() updateTagsCache() updateAppRichTexts() diff --git a/pub/storage/proxy/object.go b/pub/storage/proxy/object.go index 40b87ef..57a3789 100644 --- a/pub/storage/proxy/object.go +++ b/pub/storage/proxy/object.go @@ -156,6 +156,30 @@ func QueryMedia(baseInfo *MediaQueryeReq, domain string) (result *VideoQueryResu return } +func QueryAdvitise(baseInfo *AppAdvitiseInfoReq, domain string) (result *AdvitiseQuerysResult, err error) { + result = &AdvitiseQuerysResult{} + paramJson, err := json.Marshal(baseInfo) + if err != nil { + return + } + if len(domain) == 0 { + domain = DomainAddressRepair(domain, BucketVideoAddressV2) + } + url := domain + if !strings.Contains(domain, "/media/web/app/advitise") { + url = domain + "/media/web/app/advitise" + } + fr, err := http.Post(url, header, bytes.NewReader(paramJson)) + if err != nil { + return + } + if err = json.Unmarshal(fr.Data, result); err != nil { + fmt.Println(err) + return nil, err + } + return +} + func QueryMedias(baseInfo *MediaQueryesReq, domain string) (result *VideoQuerysResult, err error) { result = &VideoQuerysResult{ Data: make([]MediaResp, 0), diff --git a/pub/storage/proxy/types.go b/pub/storage/proxy/types.go index eee6f54..bbd7939 100644 --- a/pub/storage/proxy/types.go +++ b/pub/storage/proxy/types.go @@ -1,6 +1,7 @@ package proxy import ( + "encoding/json" "strings" "time" "videoweb/pub/models/videoinformationmod" @@ -425,6 +426,33 @@ type AdvitiseInfo struct { Images string `json:"images" bson:"images"` // 视频banner Link string `json:"link" bson:"link"` // 链接 } + +// UnmarshalJSON 兼容远端 id 返回数字或字符串两种格式,统一解析为字符串,避免大整数(雪花ID)在 JS 端丢精度 +func (a *AdvitiseInfo) UnmarshalJSON(data []byte) error { + type alias AdvitiseInfo + aux := &struct { + Id json.RawMessage `json:"id"` + *alias + }{alias: (*alias)(a)} + if err := json.Unmarshal(data, aux); err != nil { + return err + } + raw := strings.TrimSpace(string(aux.Id)) + switch { + case raw == "" || raw == "null": + a.Id = "" + case strings.HasPrefix(raw, `"`): + var s string + if err := json.Unmarshal([]byte(raw), &s); err != nil { + return err + } + a.Id = s + default: + a.Id = raw + } + return nil +} + type AdvitiseData struct { DialogList []AdvitiseInfo `json:"dialogList" bson:"dialogList"` // 弹窗广告 HomeList []AdvitiseInfo `json:"homeList" bson:"homeList"` // 首页列表 diff --git a/pub/storage/upload.go b/pub/storage/upload.go index 5b7a39a..06bc7e6 100644 --- a/pub/storage/upload.go +++ b/pub/storage/upload.go @@ -29,6 +29,10 @@ func UploadImage(ctx context.Context, f *multipart.FileHeader, domain string) (p return proxy.UploadImg(f.Filename, buffer.Bytes(), domain) } +func QueryAdvitiseList(ctx context.Context, in *proxy.AppAdvitiseInfoReq, domain string) (*proxy.AdvitiseQuerysResult, error) { + return proxy.QueryAdvitise(in, domain) +} + func QueryMedias(ctx context.Context, in *proxy.MediaQueryesReq, domain string) (*proxy.VideoQuerysResult, error) { return proxy.QueryMedias(in, domain) }