Files
yunrui_asset/docs/superpowers/specs/2026-06-12-system-settings-rewrite-design.md
zhang1106 85d6b2c633 refactor: 重写系统设置模块,新增维护模式与登录策略功能
- 移除大量无实际效果的冗余配置项
- 新增维护模式拦截逻辑,支持管理员豁免
- 重构登录失败次数限制,从配置动态读取阈值
- 新增站点Logo支持与配置管理
- 优化用户管理页面数据拉取逻辑
- 新增端口批量创建范围模式功能
- 更新依赖包版本与缓存策略
2026-06-12 14:16:29 +08:00

6.4 KiB
Raw Permalink Blame History

系统设置页面重写设计

概述

重写系统设置主页面(SystemSettings.jsx),遵循务实原则:每个设置项都必须有实际效果。移除所有"只写不读"的设置项,新增 maintenance_mode 和 max_login_attempts 的后端执行逻辑。

范围:仅重写系统设置主页面,备份相关 3 个页面(数据备份管理、自动备份设置、远端备份配置)保持不变。

设计决策

  • 方案 A:保持 3 Tab 结构(基本设置、外观设置、关于系统)
  • 务实派:移除所有无实际效果的设置项,保留的每个设置项都必须有前后端闭环
  • 精简优先:不新增功能,先做精简

设置项清单

Tab 1:基本设置

设置项 Key 类型 实际效果
网站名称 site_name 文本输入 侧边栏顶部显示的系统名称
网站 Logo site_logo URL 输入 + 预览 侧边栏顶部显示的 Logo 图片
空闲超时 idle_timeout 数字(分钟) 前端空闲检测倒计时,超时后自动登出
最大登录尝试 max_login_attempts 数字 后端登录接口校验,超限后锁定账户
维护模式 maintenance_mode 开关 后端中间件拦截,普通用户无法登录

Tab 2:外观设置

设置项 Key 类型 实际效果
主色调 primary_color 颜色选择器 全局 CSS 变量,影响按钮/链接/渐变等
辅助色调 secondary_color 颜色选择器 全局 CSS 变量,影响渐变/悬停效果

Tab 3:关于系统

内容 类型 说明
系统版本、Node 版本、平台、运行时间、内存 只读展示 从后端 /system/info 获取
设备/机柜/机房/用户统计 只读展示 从后端统计获取
公司名称、联系邮箱、联系电话、公司地址、系统描述 可编辑表单 保存到 system_settings

移除的设置项

以下设置项从前端页面和后端 initDefaultSettings 中移除(数据库已有记录不主动删除):

  • timezone — 时区设置(无效果)
  • date_format — 日期格式(无效果)
  • compact_mode — 紧凑模式(无效果)
  • sidebar_collapsed — 侧边栏折叠(无效果)
  • table_row_height — 表格行高(无效果)
  • animation_enabled — 动画效果(无效果)
  • session_timeout — 登录有效期(与 idle_timeout 重复)
  • idle_warning_time — 空闲警告时间(前端未使用)
  • privacy_policy — 隐私政策 URL(前端未使用)
  • terms_of_service — 服务条款 URL(前端未使用)

后端实现

maintenance_mode 实现

  1. backend/middleware/auth.jsauthMiddleware 中增加维护模式检查
  2. SystemSetting 表读取 maintenance_mode 值(可缓存,避免每次查询)
  3. 登录接口:maintenance_mode === true 时,只允许管理员角色登录,其他用户返回 503 + 提示信息
  4. 已登录用户:普通用户的 API 请求返回 503,管理员不受影响
  5. 缓存策略:内存缓存 maintenance_mode 值,设置保存时清除缓存

max_login_attempts 实现

现有 User 模型中已有 loginCount(记录失败次数)和 lockedUntil(锁定截止时间)字段,无需新增。改动如下:

  1. 登录接口逻辑:
    • 从 system_settings 动态读取 max_login_attempts 值(替代原来的硬编码 MAX_LOGIN_ATTEMPTS
    • 使用现有 user.loginCount 记录失败次数
    • 使用现有 user.lockedUntil 记录锁定截止时间
    • 锁定时间改为 30 分钟(原来的 3 分钟偏短)
  2. 登录成功时重置 loginCount = 0lockedUntil = null(已有逻辑不变)

移除设置项的后端处理

  1. initDefaultSettings 数组中移除上述 10 个设置项
  2. reset/:key 路由的 defaultValues 对象同步清理
  3. 已有数据库记录不主动删除(避免数据迁移问题),前端不再展示即可

site_logo 后端

  • 无需额外后端改动,已有 site_logo 设置项在 initDefaultSettings
  • 前端通过 /api/system-settings 接口获取

前端实现

页面结构

保持当前 SystemSettings.jsx 的整体布局(顶部导航栏 + Tab 切换),重写内容区:

Tab 1 - 基本设置:

  • 站点信息卡片:网站名称 + 网站 Logo URL(带预览按钮,点击弹窗显示 Logo 图片)
  • 安全设置卡片:空闲超时 + 最大登录尝试 + 维护模式(维护模式开关带醒目 Alert 警告提示)

Tab 2 - 外观设置:

  • 主题色卡片:主色调 + 辅色调(保留当前 ColorPicker + 实时预览)
  • 移除界面布局卡片和动画效果卡片

Tab 3 - 关于系统:

  • 保持当前设计不变(系统信息展示 + 公司信息编辑表单)

清理死代码

  1. 移除 handleSaveSettingsfrontend_port 相关逻辑(第 118-203 行)
  2. 移除 renderFormItemfrontend_port 特殊处理(第 252 行)
  3. 移除 getSelectOptions 中 timezone、date_format、compact_mode、animation_enabled、sidebar_collapsed、dark_mode 的选项映射
  4. 移除 settingGroups 中时间设置分组
  5. configStore 的 defaultConfig 中移除 timezonedate_formatcompact_modesidebar_collapsedanimation_enabled
  6. configStore 的 defaultConfig 中增加 site_logo: ''

site_logo 显示

  1. 侧边栏组件读取 config.site_logo,有值时用 <img> 显示,无值时用默认图标
  2. Logo 预览按钮:点击后弹窗显示 Logo 图片,无效 URL 显示错误提示

维护模式前端提示

  1. 维护模式开关开启时,显示醒目的 Alert 提示"开启后普通用户将无法登录"
  2. 前端 axios 拦截器:如果 API 返回 503(维护模式),跳转到维护提示页面或显示全局提示

涉及的文件

后端

  • backend/models/User.js — 新增 loginFailCount、loginLockedUntil 字段
  • backend/routes/auth.js — 登录接口增加尝试次数限制逻辑
  • backend/middleware/auth.js — 增加维护模式检查
  • backend/routes/systemSettings.js — 清理 initDefaultSettings、reset/:key 的 defaultValues

前端

  • frontend/src/pages/SystemSettings.jsx — 重写页面内容
  • frontend/src/stores/configStore.js — 清理 defaultConfig,增加 site_logo
  • frontend/src/App.jsx — 侧边栏 Logo 显示、503 拦截
  • frontend/src/api/index.js — 可能需要调整(检查是否有清理项)