Files
NetworkAuth/database/settings.go

340 lines
9.2 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package database
import (
"NetworkAuth/config"
"NetworkAuth/models"
"github.com/sirupsen/logrus"
)
// ============================================================================
// 公共函数
// ============================================================================
// SeedDefaultSettings 初始化默认系统设置
// - 检查各项设置是否已存在,如不存在则创建默认值
// - 包含站点基本信息、SEO设置等常用配置项
func SeedDefaultSettings() error {
db, err := GetDB()
if err != nil {
return err
}
// 生成安全的随机密钥
jwtSecret, err := config.GenerateSecureJWTSecret()
if err != nil {
return err
}
encryptionKey, err := config.GenerateSecureEncryptionKey()
if err != nil {
return err
}
isInstalledDefault := "0"
// 定义默认设置项
var defaultSettings []models.Settings
// ===== 系统安装状态 =====
defaultSettings = append(defaultSettings, []models.Settings{
{
Name: "is_installed",
Value: isInstalledDefault,
Description: "系统是否已初始化安装0=未安装1=已安装",
},
}...)
// ===== 系统和安全相关默认项 =====
defaultSettings = append(defaultSettings, []models.Settings{
{
Name: "maintenance_mode",
Value: "0",
Description: "维护模式0=关闭维护模式1=开启维护模式",
},
{
Name: "encryption_key",
Value: encryptionKey,
Description: "数据加密密钥",
},
{
Name: "jwt_secret",
Value: jwtSecret,
Description: "JWT签名密钥",
},
{
Name: "jwt_expire",
Value: "2",
Description: "accessToken 有效期(小时),建议 0.5~2 小时",
},
{
Name: "refresh_token_expire_days",
Value: "7",
Description: "refreshToken 滑动有效期(天),每次刷新可重新计算",
},
{
Name: "session_absolute_expire_days",
Value: "30",
Description: "会话绝对过期上限超过必须重新登录refreshToken 滑动续期不能突破此上限",
},
{
Name: "refresh_advance_seconds",
Value: "60",
Description: "accessToken 提前多少秒触发刷新(前端读取)",
},
{
Name: "max_upload_size",
Value: "10",
Description: "文件上传最大尺寸",
},
{
Name: "max_upload_size_unit",
Value: "MB",
Description: "文件上传大小单位B/KB/MB/GB",
},
}...)
// ===== 日志清理策略默认项 =====
defaultSettings = append(defaultSettings, []models.Settings{
{
Name: "login_log_cleanup_days",
Value: "30",
Description: "登录日志保留天数0表示不按天清理",
},
{
Name: "login_log_cleanup_limit",
Value: "10000",
Description: "登录日志保留条数0表示不按数量清理",
},
{
Name: "operation_log_cleanup_days",
Value: "30",
Description: "操作日志保留天数0表示不按天清理",
},
{
Name: "operation_log_cleanup_limit",
Value: "10000",
Description: "操作日志保留条数0表示不按数量清理",
},
{
Name: "refresh_token_cleanup_days",
Value: "7",
Description: "刷新令牌过期后保留天数0表示不自动清理",
},
}...)
// ===== Cookie相关默认项 =====
defaultSettings = append(defaultSettings, []models.Settings{
{
Name: "cookie_secure",
Value: "false",
Description: "是否启用安全Cookie仅HTTPS开启后HTTP访问可能导致登录失败",
},
{
Name: "cookie_same_site",
Value: "Lax",
Description: "Cookie SameSite属性Strict/Lax/None",
},
{
Name: "cookie_domain",
Value: "",
Description: "Cookie域名",
},
{
Name: "cookie_max_age",
Value: "86400",
Description: "Cookie最大存活时间",
},
}...)
// ===== 站点基本信息默认项 =====
defaultSettings = append(defaultSettings, []models.Settings{
{
Name: "site_title",
Value: "NetworkAuth",
Description: "网站标题,显示在浏览器标题栏和页面顶部",
},
{
Name: "site_keywords",
Value: "NetworkAuth,网络授权服务,GoLang,Web服务",
Description: "网站关键词用于SEO优化多个关键词用逗号分隔",
},
{
Name: "site_description",
Value: "网络授权服务 (NetworkAuth) 是一个专注于应用鉴权、接口管理和动态逻辑分发的后端系统",
Description: "网站描述用于SEO优化和社交媒体分享",
},
{
Name: "site_logo",
Value: "/logo.svg",
Description: "网站Logo图片路径",
},
{
Name: "contact_email",
Value: "admin@example.com",
Description: "联系邮箱,用于客服和业务咨询",
},
}...)
// ===== 页脚与备案相关默认项 =====
defaultSettings = append(defaultSettings, []models.Settings{
{
Name: "footer_text",
Value: "Copyright © 2026 NetworkAuth. All Rights Reserved.",
Description: "页脚展示的版权或说明信息",
},
{
Name: "icp_record",
Value: "",
Description: "ICP备案号留空则不显示",
},
{
Name: "icp_record_link",
Value: "https://beian.miit.gov.cn",
Description: "工信部ICP备案查询链接留空则不显示",
},
{
Name: "psb_record",
Value: "",
Description: "公安备案号,留空则不显示",
},
{
Name: "psb_record_link",
Value: "",
Description: "公安备案查询链接,留空则不显示",
},
}...)
// ===== 前端平台配置相关默认项 =====
defaultSettings = append(defaultSettings, []models.Settings{
{
Name: "platform_fixed_header",
Value: "1",
Description: "是否固定页头 (0 = 关闭1 = 开启)",
},
{
Name: "platform_hidden_side_bar",
Value: "0",
Description: "是否隐藏侧边栏 (0 = 关闭1 = 开启)",
},
{
Name: "platform_multi_tags_cache",
Value: "0",
Description: "是否开启多标签页缓存 (0 = 关闭1 = 开启)",
},
{
Name: "platform_keep_alive",
Value: "1",
Description: "是否开启组件缓存 (0 = 关闭1 = 开启)",
},
{
Name: "platform_layout",
Value: "vertical",
Description: "布局模式 (vertical/horizontal/mix/comprehensive)",
},
{
Name: "platform_theme",
Value: "light",
Description: "主题配色 (light/dark)",
},
{
Name: "platform_dark_mode",
Value: "0",
Description: "是否开启暗黑模式 (0 = 关闭1 = 开启)",
},
{
Name: "platform_overall_style",
Value: "light",
Description: "整体风格",
},
{
Name: "platform_grey",
Value: "0",
Description: "是否开启灰色模式 (0 = 关闭1 = 开启)",
},
{
Name: "platform_weak",
Value: "0",
Description: "是否开启色弱模式 (0 = 关闭1 = 开启)",
},
{
Name: "platform_hide_tabs",
Value: "0",
Description: "是否隐藏标签页 (0 = 关闭1 = 开启)",
},
{
Name: "platform_hide_footer",
Value: "0",
Description: "是否隐藏页脚 (0 = 关闭1 = 开启)",
},
{
Name: "platform_stretch",
Value: "0",
Description: "是否开启页面宽度拉伸 (0 = 关闭1 = 开启)",
},
{
Name: "platform_sidebar_status",
Value: "1",
Description: "侧边栏状态 (0 = 折叠1 = 展开)",
},
{
Name: "platform_ep_theme_color",
Value: "#409EFF",
Description: "Element Plus 主题色",
},
{
Name: "platform_show_logo",
Value: "1",
Description: "是否显示Logo (0 = 关闭1 = 开启)",
},
{
Name: "platform_show_model",
Value: "smart",
Description: "显示模式 (smart等)",
},
{
Name: "platform_menu_arrow_icon_no_transition",
Value: "0",
Description: "菜单箭头图标是否取消过渡动画 (0 = 关闭1 = 开启)",
},
{
Name: "platform_caching_async_routes",
Value: "0",
Description: "是否缓存异步路由 (0 = 关闭1 = 开启)",
},
{
Name: "platform_tooltip_effect",
Value: "light",
Description: "提示框效果 (light/dark)",
},
{
Name: "platform_responsive_storage_name_space",
Value: "responsive-",
Description: "响应式存储命名空间",
},
{
Name: "platform_menu_search_history",
Value: "6",
Description: "菜单搜索历史最大记录数",
},
}...)
// 逐个检查并创建不存在的设置项
for _, setting := range defaultSettings {
var count int64
if err := db.Model(&models.Settings{}).Where("name = ?", setting.Name).Count(&count).Error; err != nil {
return err
}
if count == 0 {
if err := db.Create(&setting).Error; err != nil {
logrus.WithError(err).WithField("name", setting.Name).Error("创建系统设置失败")
return err
}
logrus.WithField("name", setting.Name).WithField("value", setting.Value).Debug("创建系统设置项")
}
}
logrus.Info("系统设置初始化完成")
return nil
}