package officialwebsiteser import ( "91porn-server/common/log" officialwebsitemod "91porn-server/models/v/officialWebsitemod" "github.com/robfig/cron/v3" ) var seoSlugBackfillCron *cron.Cron // StartSeoSlugBackfillCron 启动定时任务:扫描官网各表(Video/Hero/Album/News/Photograph) // 中缺失 seoSlug 的记录,按标题自动生成并回填。 // 启动后异步先跑一次(补存量),之后每小时扫一次(兜底导入/批量遗漏的记录)。 func StartSeoSlugBackfillCron() { go backfillAllSeoSlug() // 首次异步执行,避免阻塞服务启动 seoSlugBackfillCron = cron.New() if _, err := seoSlugBackfillCron.AddFunc("@every 1h", backfillAllSeoSlug); err != nil { log.Error("StartSeoSlugBackfillCron AddFunc fail", log.E(err)) return } seoSlugBackfillCron.Start() } func backfillAllSeoSlug() { backfillVideoSeoSlug() backfillHeroSeoSlug() backfillAlbumSeoSlug() backfillNewsSeoSlug() backfillPhotographSeoSlug() } // seoSlugMissingFilter 匹配 seoSlug 字段缺失或为空的记录。 func seoSlugMissingFilter() officialwebsitemod.M { return officialwebsitemod.M{"$or": []officialwebsitemod.M{ {"seoSlug": officialwebsitemod.M{"$exists": false}}, {"seoSlug": ""}, }} } // setSeoSlug 回填单条记录的 seoSlug。 func setSeoSlug(update func(officialwebsitemod.M, officialwebsitemod.M) (int64, error), id interface{}, slug string) { if _, err := update(officialwebsitemod.M{"_id": id}, officialwebsitemod.M{"$set": officialwebsitemod.M{"seoSlug": slug}}); err != nil { log.Error("backfill seoSlug update fail", log.E(err), log.Any("id", id)) } } func backfillVideoSeoSlug() { mod := &officialwebsitemod.Video{} list, err := mod.FindMany(seoSlugMissingFilter()) if err != nil { log.Error("backfill video seoSlug find fail", log.E(err)) return } for i := range list { if list[i].Title == "" { continue } slug, e := resolveVideoSeoSlug("", list[i].Title, list[i].ID) if e != nil || slug == "" { continue } setSeoSlug(mod.Update, list[i].ID, slug) } } func backfillHeroSeoSlug() { mod := &officialwebsitemod.Hero{} list, err := mod.FindMany(seoSlugMissingFilter()) if err != nil { log.Error("backfill hero seoSlug find fail", log.E(err)) return } for i := range list { if list[i].Name == "" { continue } slug, e := resolveHeroSeoSlug("", list[i].Name, list[i].ID) if e != nil || slug == "" { continue } setSeoSlug(mod.Update, list[i].ID, slug) } } func backfillAlbumSeoSlug() { mod := &officialwebsitemod.Album{} list, err := mod.FindMany(seoSlugMissingFilter()) if err != nil { log.Error("backfill album seoSlug find fail", log.E(err)) return } for i := range list { if list[i].Title == "" { continue } slug, e := resolveAlbumSeoSlug("", list[i].Title, list[i].ID) if e != nil || slug == "" { continue } setSeoSlug(mod.Update, list[i].ID, slug) } } func backfillNewsSeoSlug() { mod := &officialwebsitemod.News{} list, err := mod.FindMany(seoSlugMissingFilter()) if err != nil { log.Error("backfill news seoSlug find fail", log.E(err)) return } for i := range list { if list[i].Title == "" { continue } slug, e := resolveNewsSeoSlug("", list[i].Title, list[i].ID) if e != nil || slug == "" { continue } setSeoSlug(mod.Update, list[i].ID, slug) } } func backfillPhotographSeoSlug() { mod := &officialwebsitemod.Photograph{} list, err := mod.FindMany(seoSlugMissingFilter()) if err != nil { log.Error("backfill photograph seoSlug find fail", log.E(err)) return } for i := range list { if list[i].Name == "" { continue } slug, e := resolvePhotographSeoSlug("", list[i].Name, list[i].ID) if e != nil || slug == "" { continue } setSeoSlug(mod.Update, list[i].ID, slug) } }