init: web_hgcg_server 初始化提交

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-10-27 16:44:55 +08:00
co-authored by Claude Opus 4.7
commit 189556e702
627 changed files with 126228 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
package cfg
import (
"context"
"strings"
"sync"
"go.mongodb.org/mongo-driver/bson"
)
var appKeyCache struct {
sync.RWMutex
value string
ready bool
}
// CacheAppKey 把系统配置里的 appKey 放进内存,供媒资写接口读取。
func CacheAppKey(appKey string) {
appKeyCache.Lock()
appKeyCache.value = strings.TrimSpace(appKey)
appKeyCache.ready = true
appKeyCache.Unlock()
}
// CachedAppKey 返回已缓存的 appKey。缓存未建立时读取 sys_cfg 并写入缓存。
func CachedAppKey(ctx context.Context) string {
appKeyCache.RLock()
if appKeyCache.ready {
value := appKeyCache.value
appKeyCache.RUnlock()
return value
}
appKeyCache.RUnlock()
sysCfg, serr := FindOneSysCfg(ctx, bson.M{FN.SysCfg.Id: 1})
if serr != nil || sysCfg == nil {
return ""
}
value := strings.TrimSpace(sysCfg.AppKey)
CacheAppKey(value)
return value
}
+9
View File
@@ -0,0 +1,9 @@
package cfg
import (
"videoweb/pub/mongos"
)
var (
sysCfgColl *mongos.Collection
)
+55
View File
@@ -0,0 +1,55 @@
package cfg
import (
"context"
"videoweb/pub/common/log"
"videoweb/pub/common/srvdef"
"videoweb/pub/mongos"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
)
// Init 初始化数据
func Init(ctx context.Context) {
sysCfgColl = mongos.Shop.Coll(TN.SysCfg)
}
// FindOneSysCfg 查找一个系统配置
func FindOneSysCfg(ctx context.Context, filter bson.M) (
*SysCfg, *srvdef.SrvErr) {
var sysCfg SysCfg
if err := sysCfgColl.FindOneEx(
ctx, &sysCfg, filter); err != nil {
if err != mongo.ErrNoDocuments {
log.Info("cfg:FindOneSysCfg db.FindOneEx failed",
log.E(err), log.Any("filter", filter))
return nil, srvdef.New(srvdef.ErrDbQueryError, "", "")
}
return nil, srvdef.New(srvdef.ErrDbQueryError, "", "")
}
return &sysCfg, nil
}
// UpdateOneSysCfg 更新一个系统配置
func UpdateOneSysCfg(ctx context.Context, filter bson.M, update bson.M) *srvdef.SrvErr {
result, err := sysCfgColl.UpdateOne(ctx, filter, update)
if err != nil {
log.Warn("cfg:UpdateOneSysCfg db.UpdateOne failed",
log.E(err), log.Any("filter", filter))
return srvdef.New(srvdef.ErrDbUpdateError, "", "")
}
if result.MatchedCount != 1 {
return srvdef.New(srvdef.ErrDbUpdateError, "", "")
}
return nil
}
func DeleteOneSysCfg(ctx context.Context, filter bson.M) *srvdef.SrvErr {
_, err := sysCfgColl.DeleteOne(ctx, filter)
if err != nil {
log.Warn("cfg:DeleteOneSysCfg db.DeleteOne failed", log.Any("filter", filter), log.E(err))
return srvdef.New(srvdef.ErrDbQueryError, "", "")
}
return nil
}
+90
View File
@@ -0,0 +1,90 @@
package cfg
type TagSysCfg struct {
AppAddr string
OfficialAppAddr string
ForeverUrlAddr string
GitAddr string
GmailAddr string
Id string
ImgAppCdn string
ImgWebCdn string
MediaAppCdn string
MediaWebCdn string
NewUrlAddr string
NewUrlAddr1 string
NewUrlAddr2 string
QQ string
Telegram string
TelegramAdd string
TgGroup string
TranslationAddr string
TwitterAddr string
WatermarkImage string
WatermarkMedia string
WatermarkMediaTop string
WatermarkMediaTopRight string
WatermarkMediaBottomLeft string
CustomerServiceHost string
WeiChart string
DHNewUrlAddr1 string
DHNewUrlAddr2 string
DHNewUrlAddr3 string
DHForeverUrlAddr string
DHTitle string
DHKeyworld string
DHDescription string
DHSiteName string
ChannelCode string
EnableH265 string
AppKey string
}
var FN struct {
SysCfg TagSysCfg
}
var TN struct {
SysCfg string
}
func init() {
FN.SysCfg.AppAddr = "appAddr"
FN.SysCfg.OfficialAppAddr = "officialAppAddr"
FN.SysCfg.ForeverUrlAddr = "foreverUrlAddr"
FN.SysCfg.GitAddr = "gitAddr"
FN.SysCfg.GmailAddr = "gmailAddr"
FN.SysCfg.Id = "_id"
FN.SysCfg.ImgAppCdn = "imgAppCdn"
FN.SysCfg.ImgWebCdn = "imgWebCdn"
FN.SysCfg.MediaAppCdn = "mediaAppCdn"
FN.SysCfg.MediaWebCdn = "mediaWebCdn"
FN.SysCfg.NewUrlAddr = "newUrlAddr"
FN.SysCfg.NewUrlAddr1 = "newUrlAddr1"
FN.SysCfg.NewUrlAddr2 = "newUrlAddr2"
FN.SysCfg.QQ = "qq"
FN.SysCfg.Telegram = "telegram"
FN.SysCfg.TelegramAdd = "telegramAdd"
FN.SysCfg.TgGroup = "tgGroup"
FN.SysCfg.TranslationAddr = "translationAddr"
FN.SysCfg.TwitterAddr = "twitterAddr"
FN.SysCfg.WatermarkImage = "watermarkImage"
FN.SysCfg.WatermarkMedia = "watermarkMedia"
FN.SysCfg.WatermarkMediaTop = "watermarkMediaTop"
FN.SysCfg.WatermarkMediaTopRight = "watermarkMediaTopRight"
FN.SysCfg.WatermarkMediaBottomLeft = "watermarkMediaBottomLeft"
FN.SysCfg.CustomerServiceHost = "customerServiceHost"
FN.SysCfg.WeiChart = "weiChart"
FN.SysCfg.DHNewUrlAddr1 = "dHNewUrlAddr1"
FN.SysCfg.DHNewUrlAddr2 = "dHNewUrlAddr2"
FN.SysCfg.DHNewUrlAddr3 = "dHNewUrlAddr3"
FN.SysCfg.DHForeverUrlAddr = "dHForeverUrlAddr"
FN.SysCfg.DHTitle = "dhTitle"
FN.SysCfg.DHKeyworld = "dhKeyworld"
FN.SysCfg.DHDescription = "dhDescription"
FN.SysCfg.DHSiteName = "dhSiteName"
FN.SysCfg.ChannelCode = "channelCode"
FN.SysCfg.EnableH265 = "enableH265"
FN.SysCfg.AppKey = "appKey"
TN.SysCfg = "sys_cfg"
}
+74
View File
@@ -0,0 +1,74 @@
package cfg
import "strings"
// @table:sys_cfg
type SysCfg struct {
Id int64 `json:"id" bson:"_id"`
UnencryptedCdn string `json:"unencryptedCdn" bson:"unencryptedCdn"` // 不加密资源使用的cdn
SitemapDefaultImages []string `json:"sitemapDefaultImages" bson:"sitemapDefaultImages"` // Sitemap里面默认封面图
ImgAppCdn string `json:"imgAppCdn" bson:"imgAppCdn"` // 图片CDN(app使用)
ImgWebCdn string `json:"imgWebCdn" bson:"imgWebCdn"` // 图片CDN(web使用)
MediaWebCdn string `json:"mediaWebCdn" bson:"mediaWebCdn"` // 视频CDN(web使用)
MediaAppCdn string `json:"mediaAppCdn" bson:"mediaAppCdn"` // 视频CDN(app使用)
ImgAppUsCdn string `json:"imgAppUsCdn" bson:"imgAppUsCdn"` // 图片CDN(海外app使用)
MediaAppUsCdn string `json:"mediaAppUsCdn" bson:"mediaAppUsCdn"` // 视频CDN(海外app使用)
WatermarkImage string `json:"watermarkImage" bson:"watermarkImage"` // 图片水印文件
WatermarkMedia string `json:"watermarkMedia" bson:"watermarkMedia"` // 视频水印文件(底部右边)
WatermarkMediaTop string `json:"watermarkMediaTop" bson:"watermarkMediaTop"` // 视频水印文件(顶部左边)
WatermarkMediaTopRight string `json:"watermarkMediaTopRight" bson:"watermarkMediaTopRight"` // 视频水印文件(顶部右边)
WatermarkMediaBottomLeft string `json:"watermarkMediaBottomLeft" bson:"watermarkMediaBottomLeft"` // 视频水印文件(底部左边)
Mp4Addr string `json:"mp4Addr" bson:"mp4Addr"` // mp4地址(web使用)
PdfAddr string `json:"pdfAddr" bson:"pdfAddr"` // 回家的路PDF
CustomerServiceHost string `json:"customerServiceHost" bson:"customerServiceHost"` // 在线客服
//网站管理
NewUrlAddr string `json:"newUrlAddr" bson:"newUrlAddr"` //最新地址
NewUrlAddr1 string `json:"newUrlAddr1" bson:"newUrlAddr1"` //最新地址(备用地址1)
NewUrlAddr2 string `json:"newUrlAddr2" bson:"newUrlAddr2"` //最新地址(备用地址2)
ForeverUrlAddr string `json:"foreverUrlAddr" bson:"foreverUrlAddr"` //永久地址
GmailAddr string `json:"gmailAddr" bson:"gmailAddr"` //邮箱地址
AppAddr string `json:"appAddr" bson:"appAddr"` //APP下载地址(落地页)
OfficialAppAddr string `json:"officialAppAddr" bson:"officialAppAddr"` //官网app地址
WeiChart string `json:"weiChart" bson:"weiChart"` //微信群
QQ string `json:"qq" bson:"qq"` //qq群
TgGroup string `json:"tgGroup" bson:"tgGroup"` //tg群
PotaoGroup string `json:"potaoGroup" bson:"potaoGroup"` //土豆群
GitAddr string `json:"gitAddr" bson:"gitAddr"` //git地址
TwitterAddr string `json:"twitterAddr" bson:"twitterAddr"` //推特地址
Telegram string `json:"telegram" bson:"telegram"` //商务tg
TelegramAdd string `json:"telegramAdd" bson:"telegramAdd"` //加入我们tg
TranslationAddr string `json:"translationAddr" bson:"translationAddr"` //应用导航
//SEO
WebTitle string `json:"webTitle" bson:"webTitle"` // 网站SEO标题
WebKeyworld []string `json:"webKeyworld" bson:"webKeyworld"` // 网站SEO关键字
WebDescription string `json:"webDescription" bson:"webDescription"` // 网站SEO描述
WebSiteName string `json:"webSiteName" bson:"webSiteName"` // 网站SEO网站名称
WebAddr string `json:"webAddr" bson:"webAddr"` // 网站SEO网站地址
DHNewUrlAddr1 string `json:"dhNewUrlAddr1" bson:"dhNewUrlAddr1"` // 导航页-线路1
DHNewUrlAddr2 string `json:"dhNewUrlAddr2" bson:"dhNewUrlAddr2"` // 导航页-线路2
DHNewUrlAddr3 string `json:"dhNewUrlAddr3" bson:"dhNewUrlAddr3"` // 导航页-线路3
FreeVPN string `json:"freeVPN" bson:"freeVPN"` // 免费vpn链接
UseAddress []string `json:"useAddress" bson:"useAddress"` // 所有使用中的域名
AdvitiesTopicNum int64 `json:"advitiesTopicNum" bson:"advitiesTopicNum"` // 广告间隔
DHTitle string `json:"dhTitle" bson:"dhTitle"` // 导航SEO标题
DHKeyworld []string `json:"dhKeyworld" bson:"dhKeyworld"` // 导航SEO关键字
DHDescription string `json:"dhDescription" bson:"dhDescription"` // 导航SEO描述
DHSiteName string `json:"dhSiteName" bson:"dhSiteName"` // 导航SEO网站名称
ActressBackGround string `json:"actressBackGround" bson:"actressBackGround"` // 女优通用背景图
ChannelCode string `json:"channelCode" bson:"channelCode"` // 渠道码
EnableH265 bool `json:"enableH265" bson:"enableH265"` // 是否允许客户端使用 H265 地址播放
AppKey string `json:"appKey" bson:"appKey"` // 媒资库 appKey,调用 media 写接口时传入
}
// SEOBaseURL 返回与页面 canonical 一致的 SEO 主域。
// 永久域名未配置时回退到 WebAddr,避免生成空地址。
func (c *SysCfg) SEOBaseURL() string {
if c == nil {
return ""
}
base := strings.TrimSpace(c.ForeverUrlAddr)
if base == "" {
base = strings.TrimSpace(c.WebAddr)
}
return strings.TrimRight(base, "/")
}