fix(admin): 修复多页面设置加载失败 — renderOtherSettings 空指针崩溃
Some checks failed
CI / Lint + Build (push) Has been cancelled
Some checks failed
CI / Lint + Build (push) Has been cancelled
根因:site-settings.js 的 renderOtherSettings() 无条件访问 #general-settings 元素,但 brand/security/registration 三个模板 无此容器,导致 TypeError 被 catch 吞掉 → '加载设置失败'。 额外修复: - footer.html: ExtraJS 添加 ?v= 缓存版本哈希 - site-settings.js: API 失败时显式展示服务端错误消息(不再静默 return) - site_settings.go: Set() 改用 UPSERT(clause.OnConflict), 修复 GORM Save() 对不存在 key 首次保存时返回 ErrRecordNotFound
This commit is contained in:
@ -7,6 +7,7 @@ import (
|
||||
"metazone.cc/mce/internal/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
// SiteSettings 站点设置管理器(DB 持久化 + 内存缓存,不重启生效)
|
||||
@ -69,10 +70,13 @@ func (s *SiteSettings) GetBool(key string, defaultVal bool) bool {
|
||||
return b
|
||||
}
|
||||
|
||||
// Set 写入设置(同步写 DB + 更新内存)
|
||||
// Set 写入设置(同步写 DB + 更新内存,使用 UPSERT 兼容首次保存)
|
||||
func (s *SiteSettings) Set(key, value string) error {
|
||||
entry := model.SiteSetting{Key: key, Value: value}
|
||||
if err := s.db.Save(&entry).Error; err != nil {
|
||||
if err := s.db.Clauses(clause.OnConflict{
|
||||
Columns: []clause.Column{{Name: "key"}},
|
||||
DoUpdates: clause.AssignmentColumns([]string{"value"}),
|
||||
}).Create(&entry).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
s.mu.Lock()
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<script src="/shared/static/js/utils.js?v={{assetV "/shared/static/js/utils.js"}}" nonce="{{.CSPNonce}}"></script>
|
||||
<script src="/admin/static/js/common.js?v={{assetV "/admin/static/js/common.js"}}" nonce="{{.CSPNonce}}"></script>
|
||||
{{if .ExtraJS}}
|
||||
<script src="{{.ExtraJS}}" nonce="{{.CSPNonce}}"></script>
|
||||
<script src="{{.ExtraJS}}?v={{assetV .ExtraJS}}" nonce="{{.CSPNonce}}"></script>
|
||||
{{end}}
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -36,7 +36,10 @@
|
||||
async function loadSettings() {
|
||||
try {
|
||||
var res = await api.get('/api/admin/site-settings');
|
||||
if (!res.success) return;
|
||||
if (!res.success) {
|
||||
showToast(res.message || '加载设置失败', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
// 所有开关
|
||||
var audit = res.data.audit || {};
|
||||
@ -138,6 +141,7 @@
|
||||
// --- 渲染其他设置(过滤已有专属UI的key) ---
|
||||
function renderOtherSettings(all) {
|
||||
var container = document.getElementById('general-settings');
|
||||
if (!container) return; // 部分页面无此容器
|
||||
var filtered = [];
|
||||
Object.keys(all).forEach(function(k) {
|
||||
if (!DEDICATED_KEYS[k]) filtered.push(k);
|
||||
|
||||
Reference in New Issue
Block a user