2026-03-28 23:30:02 +08:00
|
|
|
|
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签名密钥",
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
2026-05-04 22:02:26 +08:00
|
|
|
|
Name: "jwt_expire",
|
|
|
|
|
|
Value: "2",
|
|
|
|
|
|
Description: "accessToken 有效期(小时),建议 0.5~2 小时",
|
2026-03-28 23:30:02 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
2026-05-04 22:02:26 +08:00
|
|
|
|
Name: "refresh_token_expire_days",
|
|
|
|
|
|
Value: "7",
|
|
|
|
|
|
Description: "refreshToken 滑动有效期(天),每次刷新可重新计算",
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
Name: "session_absolute_expire_days",
|
|
|
|
|
|
Value: "30",
|
|
|
|
|
|
Description: "会话绝对过期上限(天),超过必须重新登录,refreshToken 滑动续期不能突破此上限",
|
2026-03-28 23:30:02 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
2026-05-04 22:02:26 +08:00
|
|
|
|
Name: "refresh_advance_seconds",
|
|
|
|
|
|
Value: "60",
|
|
|
|
|
|
Description: "accessToken 提前多少秒触发刷新(前端读取)",
|
2026-03-28 23:30:02 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
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表示不按数量清理)",
|
|
|
|
|
|
},
|
2026-05-04 22:02:26 +08:00
|
|
|
|
{
|
|
|
|
|
|
Name: "refresh_token_cleanup_days",
|
|
|
|
|
|
Value: "7",
|
|
|
|
|
|
Description: "刷新令牌过期后保留天数(0表示不自动清理)",
|
|
|
|
|
|
},
|
2026-03-28 23:30:02 +08:00
|
|
|
|
}...)
|
|
|
|
|
|
|
|
|
|
|
|
// ===== Cookie相关默认项 =====
|
|
|
|
|
|
defaultSettings = append(defaultSettings, []models.Settings{
|
|
|
|
|
|
{
|
|
|
|
|
|
Name: "cookie_secure",
|
2026-03-31 02:14:08 +08:00
|
|
|
|
Value: "false",
|
|
|
|
|
|
Description: "是否启用安全Cookie(仅HTTPS),开启后HTTP访问可能导致登录失败",
|
2026-03-28 23:30:02 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
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
|
|
|
|
|
|
}
|