package configser import ( "strconv" "strings" ) // AppConfigVM 注入全站页面的公共配置(字段名与接口 newAddressInfo / seoInfo 对齐)。 type AppConfigVM struct { ForeverURLAddr string `json:"foreverUrlAddr"` NewURLAddr string `json:"newUrlAddr"` NewURLAddr1 string `json:"newUrlAddr1"` NewURLAddr2 string `json:"newUrlAddr2"` GmailAddr string `json:"gmailAddr"` QQ string `json:"qq"` TGGroup string `json:"tgGroup"` Telegram string `json:"telegram"` PotaoGroup string `json:"potaoGroup"` CustomerServiceHost string `json:"customerServiceHost"` AppAddr string `json:"appAddr"` OfficialAppAddr string `json:"officialAppAddr"` PDFAddr string `json:"pdfAddr"` TwitterAddr string `json:"twitterAddr"` SeoInfo SeoInfo `json:"seoInfo,omitempty"` SeoNavInfo SeoNavInfo `json:"seoNavInfo,omitempty"` NavPageList []NavPageItem `json:"navPageList,omitempty"` Advitise AdvitiseData `json:"advitise"` DetailTopList []Advertisement `json:"detailTopList,omitempty"` NineGridList []Advertisement `json:"nineGridList,omitempty"` DetailBannerList []Advertisement `json:"detailbannerList,omitempty"` BottomBanner []Advertisement `json:"bottomBanner,omitempty"` DialogList []Advertisement `json:"dialogList,omitempty"` } // BuildAppConfigVM 从上游配置组装前端可用字段。 func BuildAppConfigVM(info *ConfigInfoResp) AppConfigVM { if info == nil { return AppConfigVM{} } addr := info.NewAddressInfo return AppConfigVM{ ForeverURLAddr: sanitizeURL(addr.ForeverURLAddr), NewURLAddr: sanitizeURL(addr.NewURLAddr), NewURLAddr1: sanitizeURL(addr.NewURLAddr1), NewURLAddr2: sanitizeURL(addr.NewURLAddr2), GmailAddr: strings.TrimSpace(addr.GmailAddr), QQ: strings.TrimSpace(addr.QQ), TGGroup: sanitizeURL(addr.TGGroup), Telegram: sanitizeURL(addr.Telegram), PotaoGroup: sanitizeURL(firstNonEmptyURL(info.Config.PotaoGroup, addr.PotaoGroup)), CustomerServiceHost: sanitizeURL(addr.CustomerServiceHost), AppAddr: sanitizeURL(addr.AppAddr), OfficialAppAddr: sanitizeURL(addr.OfficialAppAddr), PDFAddr: sanitizeURL(addr.PDFAddr), TwitterAddr: sanitizeURL(addr.TwitterAddr), NavPageList: buildNavPageList(info.NavPageList), Advitise: info.Advitise, DetailTopList: buildAdvertisementList(info.Advitise.DetailTopList), NineGridList: buildAdvertisementList(info.Advitise.NineGridList), DetailBannerList: buildAdvertisementList(info.Advitise.DetailBannerList), BottomBanner: buildAdvertisementList(info.Advitise.BottomBanner), DialogList: buildAdvertisementList(info.Advitise.DialogList), SeoInfo: SeoInfo{ Title: strings.TrimSpace(info.SeoInfo.Title), Description: strings.TrimSpace(info.SeoInfo.Description), Keywords: info.SeoInfo.Keywords, CanonicalURL: strings.TrimSpace(info.SeoInfo.CanonicalURL), WebSiteName: strings.TrimSpace(info.SeoInfo.WebSiteName), }, SeoNavInfo: SeoNavInfo{ DhTitle: strings.TrimSpace(info.SeoNavInfo.DhTitle), DhDescription: strings.TrimSpace(info.SeoNavInfo.DhDescription), DhKeyworld: info.SeoNavInfo.DhKeyworld, DhSiteName: strings.TrimSpace(info.SeoNavInfo.DhSiteName), }, } } func buildAdvertisementList(list []Advertisement) []Advertisement { if len(list) == 0 { return nil } out := make([]Advertisement, 0, len(list)) for _, item := range list { item.ID = strings.TrimSpace(item.ID) item.Images = sanitizeURL(item.Images) item.Link = sanitizeURL(item.Link) item.Title = strings.TrimSpace(item.Title) if item.Images == "" { continue } out = append(out, item) } return out } // NineGridRow 按首页设计每行返回两个 banner,超出当前行时返回空切片。 func (c AppConfigVM) NineGridRow(row int) []Advertisement { if row < 0 { return nil } start := row * 2 if start >= len(c.NineGridList) { return nil } end := start + 2 if end > len(c.NineGridList) { end = len(c.NineGridList) } return c.NineGridList[start:end] } // QRText 下载弹窗二维码、跳转及复制链接内容:仅使用应用下载地址 appAddr。 func (c AppConfigVM) QRText() string { return strings.TrimSpace(c.AppAddr) } func buildNavPageList(list []NavPageItem) []NavPageItem { if len(list) == 0 { return nil } out := make([]NavPageItem, 0, len(list)) for _, item := range list { u := sanitizeURL(item.URL) if u == "" { continue } out = append(out, NavPageItem{Line: item.Line, URL: u}) } return out } func (n NavPageItem) Label() string { digits := []string{"", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"} if n.Line >= 1 && n.Line <= 10 { return "线路" + digits[n.Line] } if n.Line > 0 { return "线路" + strconv.Itoa(n.Line) } return "线路" } func sanitizeURL(v string) string { v = strings.TrimSpace(v) v = strings.TrimRight(v, "\\") return strings.TrimSpace(v) } func firstNonEmptyURL(values ...string) string { for _, v := range values { if sanitizeURL(v) != "" { return v } } return "" }