Files
admin e6956aa001 Initial commit: TaskPool React panel
- React frontend with route-level code splitting
- Backend rebranded from Baihu to TaskPool
- DB brand migration script and local compatibility
2026-07-26 08:43:52 +08:00

95 lines
1.9 KiB
Go

package cache
import (
"sync"
"github.com/engigu/taskpool/internal/constant"
"github.com/engigu/taskpool/internal/database"
"github.com/engigu/taskpool/internal/models"
)
// siteCache 站点设置内存缓存
var (
siteCache = make(map[string]string)
siteCacheMu sync.RWMutex
siteCacheInit bool
)
// LoadSiteCache 从数据库加载站点设置到缓存
func LoadSiteCache() {
siteCacheMu.Lock()
defer siteCacheMu.Unlock()
// 先填充默认值
if defaults, ok := constant.DefaultSettings[constant.SectionSite]; ok {
for k, v := range defaults {
siteCache[k] = v
}
}
// 从数据库加载覆盖
var settings []models.Setting
database.DB.Where("section = ?", constant.SectionSite).Find(&settings)
for _, setting := range settings {
siteCache[setting.Key] = string(setting.Value)
}
siteCacheInit = true
}
// ensureSiteCache 确保站点缓存已初始化
func ensureSiteCache() {
siteCacheMu.RLock()
init := siteCacheInit
siteCacheMu.RUnlock()
if !init {
LoadSiteCache()
}
}
// GetSiteCache 从缓存获取站点设置
func GetSiteCache(key string) string {
ensureSiteCache()
siteCacheMu.RLock()
defer siteCacheMu.RUnlock()
if val, ok := siteCache[key]; ok {
return val
}
if def, ok := constant.DefaultSettings[constant.SectionSite][key]; ok {
return def
}
return ""
}
// SetSiteCache 更新缓存中的站点设置
func SetSiteCache(key, value string) {
siteCacheMu.Lock()
siteCache[key] = value
siteCacheMu.Unlock()
}
// GetSiteCacheAll 获取整个站点设置缓存
func GetSiteCacheAll() map[string]string {
ensureSiteCache()
siteCacheMu.RLock()
defer siteCacheMu.RUnlock()
result := make(map[string]string)
for k, v := range siteCache {
result[k] = v
}
return result
}
// SetSiteCacheBatch 批量更新缓存
func SetSiteCacheBatch(values map[string]string) {
siteCacheMu.Lock()
for k, v := range values {
siteCache[k] = v
}
siteCacheMu.Unlock()
}