系统偏好策略与个人设置
管理员在「系统设置 → 界面与体验 → 偏好策略」设置每项偏好的系统默认值与「用户可修改」。 初始值沿用内置默认值,所有项目初始允许用户修改。后台支持按分组、名称、已调整或禁止修改筛选, 「恢复内置策略」会同时恢复该项内置值和允许修改状态;编辑后统一保存。
生效规则
| 状态 | 生效值 |
|---|---|
| 允许修改,用户没有个人覆盖 | 系统默认值 |
| 允许修改,用户有明确选择 | 个人覆盖值,即使恰好等于系统默认值也保留选择 |
| 禁止修改 | 系统值;个人旧选择保留但暂停生效 |
| 再次允许修改 | 恢复原个人选择,没有则跟随系统 |
个人设置中的「跟随系统」删除单项覆盖;「恢复系统默认」清除个人偏好覆盖,保留终端收藏目录。 复制与导入使用 { "overrides": { ... } } 文档,导入跳过未知、非法或系统锁定的项目并反馈数量。 系统策略和个人文档分别保存于现有 system_settings.data 的 ui 模块与 users.preferences,无需增加表或字段。 旧个人 JSON 不参与新模型解析,不提供历史数据转换。
依赖与展示
偏好目录位于 packages/shared/src/preferences/,包含 schema、默认值、选项、分组与显式 applicableWhen。 条件只描述偏好之间的适用关系,并在启动导入时校验未知字段和循环依赖。
父项被锁定不会向子项传播修改限制。例如系统强制开启面包屑时,用户仍可调整允许修改的图标等子项; 系统关闭面包屑时,相关子项不适用并在个人面板隐藏。后台始终能编辑所有项目,同时显示适用条件。 空个人分组自动隐藏;全部普通偏好不可编辑时隐藏面板入口,但系统开启屏幕锁时仍保留设备密码设置入口。
灰色与色弱模式按互斥规则解析:系统强制开启的模式优先;用户明确开启另一可编辑模式时关闭前者。 减弱动效使路由与标签动画不生效。操作系统深浅色、浏览器通知授权、菜单权限等环境条件仍由前端判断。 浏览器通知授权和设备锁屏密码不是偏好覆盖,必要操作继续可用。
数据访问与更新
- 完整生效值由共享
resolvePreferences()派生,业务组件继续读取usePreferences().preferences。 setPreferences()只提交变化字段,终端使用嵌套稀疏对象。可编辑性经canEditPreference()判断; 仅判断系统锁定时使用canOverridePreference()。GET /api/auth/preferences与PUT /api/auth/preferences使用{ overrides }文档;写入校验字段类型、 范围与最新系统策略。锁定项可保留原值或删除覆盖,不能新增或修改覆盖。- 策略经登录用户设置投影下发,和个人偏好、认证并行预取。未成功取得策略和个人数据前只允许缓存展示,禁止写入。
- 保存系统策略后发送
preferences:policy-updated。跨进程接收节点先失效策略缓存,再通知浏览器重新读取; 重连及窗口聚焦也刷新策略,不受个人「切回窗口自动刷新」开关影响。 - 主题快捷入口、文件视图、个人通知、终端与各表格独立样式均遵循策略。 默认分页大小只影响尚未临时选择条数的列表,用户本次浏览手动选择后继续保留。
- 终端字体、主题、滚回行数等支持当前会话更新;渲染器切换在重新打开终端时生效。
新增偏好(2026-09:顶栏时钟、定时深色)
- 顶栏时钟(
topbarClock:关闭 / 12 小时制 / 24 小时制,默认关闭)+时钟显示日期(默认开,仅时钟开启时适用):顶栏右侧图标区前渲染,分钟对齐 tick,无秒级定时器开销。 - 定时深色(
scheduledDarkMode:关闭 / 自定义时段+起止HH:mm,默认关闭,默认 18:00–06:00):时段内无条件使用深色(颜色模式已是深色时自然一致),时段外跟随颜色模式;窗口可跨午夜,起止相同视为空窗口。适用性沿用"按取值"惯例(与"跟随系统"半夜的表现一致),不向深色相关子项传播。 - 解析收口在共享
isScheduledDarkNow/msUntilScheduleBoundary:主题 Provider 用一次性定时器打到下一边界重算,挂载前缓存快照同样参与解析,避免半夜刷新闪浅色。
新增偏好
在共享 schema 增加字段、默认值与取值约束,再在目录中登记标签、分组、控件元信息和适用条件; 嵌套终端字段按叶子管理,收藏等个人内容不登记为系统策略。后台编辑器由目录派生,个人专用控件使用 PreferenceControl 包装以获得隐藏与单项恢复能力。不要在 Web、Server 或 Mock 再维护一份默认值。
相关机制参见运行时设置。