## 1. ECS RAM 角色改为自动探测 原先要用户去阿里云控制台查「实例 RAM 角色名」再手填,纯属多余 —— 机器自己知道答案。 新增 fb_oss_detect_instance_role():读元数据 GET /latest/meta-data/ram/security-credentials/(末尾带斜杠)拿到角色名列表。 - 兼容单行 / 多行 / JSON 数组三种返回 - 未配置角色时 fb_oss_instance_creds() 自动探测,不再报「未配置」 - 后台改成只读展示「已绑定:xxx」,手填入口收进「高级」折叠里 - 保存时留空 = 自动探测后写入,不存空值 - 探测失败给出可操作原因(没绑角色 / 不在 ECS 上 / 元数据被禁用) ## 2. 邮件配置界面(原先完全缺失) lib/mailer.php 有完整 SMTP 实现,但后台一个输入框都没有, 只能改 config.php —— 用户装完根本找不到地方配。 根因有两层: - fb_setting_keys() 白名单里没有任何 smtp.* / notify.* 键, 就算加了表单,fb_set_setting() 也会把值全部丢弃 - 设置页只有「站点信息」「附件存储」两个区块 补上:白名单 15 个键 + 后台「邮件通知」区块 - SMTP 服务器/端口/加密方式(SSL/STARTTLS/不加密) - 登录账号/密码(留空不修改,避免每次重填) - 发件地址/显示名、超时、SSL 校验 - 通知规则:回复通知、每次回复都通知、新反馈通知管理员、发信冷却 - 「发送测试邮件」按钮,AJAX 发完就地显示成功或失败原因, 不用保存再靠猜 ## 3. 每个软件一个主题色 需求:从短链接进不同软件,颜色不同,一眼区分。 - software 表加 color 字段(幂等迁移) - 全站配色靠 --brand / --brand-600 / --brand-soft 三个变量, 按软件覆写这三个即可,不用为每个软件写一套 CSS - fb_color_variants() 由主色推出深一档(×0.85)与浅一档(往白混 88%) - 未配色的软件按 id 从 8 色调色板取默认色,保证同站不撞色 - 后台:颜色选择器(原生取色 + 8 个预设 + 用默认) - 前台:index / new / thread 都按当前软件注入主题色, meta theme-color 也跟着变 验证:三功能专项 30/30;新旧回归全过 (全新安装 33/33、老基线 25/25、附件 22/22、安装向导 60/60、约束检查 20/20)
This commit is contained in:
@@ -81,6 +81,50 @@ main.wrap{padding-top:24px; padding-bottom:40px; min-height:60vh}
|
||||
.page-head h1{margin-bottom:4px}
|
||||
.page-head .muted{font-size:14px; margin:0}
|
||||
|
||||
/* ---------- 主题色选择器 ---------- */
|
||||
.sw-dot{
|
||||
display:inline-block; width:10px; height:10px; border-radius:50%;
|
||||
flex:none; margin-right:2px; vertical-align:middle;
|
||||
box-shadow:0 0 0 1px rgba(0,0,0,.12);
|
||||
}
|
||||
.color-row{display:flex; align-items:center; gap:10px; flex-wrap:wrap}
|
||||
.color-input{
|
||||
width:46px; height:34px; padding:2px; border:1px solid var(--line-strong);
|
||||
border-radius:9px; background:var(--card); cursor:pointer; flex:none;
|
||||
}
|
||||
.color-presets{display:flex; gap:6px; flex-wrap:wrap}
|
||||
.color-preset{
|
||||
width:26px; height:26px; border-radius:50%; border:2px solid transparent;
|
||||
cursor:pointer; padding:0; flex:none; transition:transform .12s;
|
||||
}
|
||||
.color-preset:hover{transform:scale(1.12)}
|
||||
.color-preset.on{border-color:var(--fg); box-shadow:0 0 0 2px var(--card) inset}
|
||||
|
||||
/* ---------- 邮件测试 ---------- */
|
||||
.mail-test{
|
||||
display:flex; flex-wrap:wrap; align-items:center; gap:10px;
|
||||
padding:12px 14px; margin:6px 0 16px;
|
||||
background:var(--card); border:1px dashed var(--line); border-radius:11px;
|
||||
}
|
||||
.mail-test input[type=email]{
|
||||
flex:1 1 220px; min-width:180px;
|
||||
border:1px solid var(--line-strong); border-radius:9px; padding:8px 10px;
|
||||
font-size:14px; background:var(--card); color:var(--fg); font-family:inherit;
|
||||
}
|
||||
.mail-test-out{flex:1 1 100%; font-size:13px; line-height:1.6}
|
||||
.mail-test-out.ok{color:var(--ok)}
|
||||
.mail-test-out.err{color:#c9302c}
|
||||
|
||||
/* RAM 角色探测结果 */
|
||||
.role-ok{
|
||||
padding:8px 11px; border-radius:9px; font-size:13.5px;
|
||||
background:var(--ok-soft, #eef8f0); border:1px solid #cfe8d5;
|
||||
}
|
||||
.role-warn{
|
||||
padding:8px 11px; border-radius:9px; font-size:13.5px;
|
||||
background:#fff8e6; border:1px solid #f0e0b0; color:#8a6d1f;
|
||||
}
|
||||
|
||||
/* ---------- 表单就地校验的错误提示 ---------- */
|
||||
.field.has-error > input,
|
||||
.field.has-error > textarea,
|
||||
|
||||
Reference in New Issue
Block a user