后台登录改造:自建登录页 + Cookie 会话,弃用 basic auth 弹窗

- editor-api 新增 /admin/login|session|logout:HttpOnly Cookie 会话(落盘持久化)、
  登录失败限速(5 次锁 5 分钟)、鉴权改为「X-Editor-Token 或 会话」双通道
- 登录页重做:品牌标识、图标输入框、密码可见切换、柔光背景,深浅色适配
- 前端以 /admin/session 探测部署模式:国内机走本机会话,CF 版走原令牌流程
- nginx:/admin/ 与 /api/v2/editor/ 去掉 basic auth 与令牌注入,登录凭据只存 Cookie
- bootstrap.sh 同步 ADMIN_USER/ADMIN_PASS,保持一键迁移能力
This commit is contained in:
zqlit committed 2026-10-04 23:40:23 +08:00
1 parent 96751b8143
commit 9f586d625b
5 files changed
+484 -39

No files matched your search

+93 -11
View File
@@ -174,18 +174,100 @@ select{appearance:none;cursor:pointer;padding-right:28px;
/* ---------------------------------------------------------- 登录 */
.gate{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px;background:var(--bg)}
.login-card{
width:100%;max-width:340px;padding:32px;
background:var(--card);
border:1px solid var(--line);border-radius:16px;
box-shadow:var(--shadow-pop);
/* 背景不做成"一张白纸",用两层柔光拉开纵深 —— 纯 CSS,零额外请求。
国内机版的后台是直连的,页面本身秒开,这里不引入任何图片。 */
.gate{
position:relative;min-height:100vh;
display:flex;align-items:center;justify-content:center;
padding:24px;background:var(--bg);overflow:hidden;
}
.login-card h1{font-size:19px;color:var(--accent)}
.login-card .sub{margin:3px 0 26px;font-size:12px;color:var(--muted)}
.login-card form{margin-top:0}
.login-card .btn{margin-top:6px}
.login-card .hint{margin:18px 0 0;font-size:11px;line-height:1.7;color:var(--muted);text-align:center}
.gate::before,.gate::after{
content:'';position:absolute;pointer-events:none;border-radius:50%;
}
.gate::before{
width:560px;height:560px;left:50%;top:-200px;transform:translateX(-50%);
background:radial-gradient(circle,var(--accent-soft),transparent 68%);
}
.gate::after{
width:440px;height:440px;right:-150px;bottom:-170px;
background:radial-gradient(circle,var(--accent-soft),transparent 72%);
}
.login-card{
position:relative;z-index:1;
width:100%;max-width:372px;padding:34px 32px 26px;
background:var(--card);
border:1px solid var(--line);border-radius:18px;
box-shadow:0 1px 2px rgba(24,48,36,.04),0 18px 46px -20px rgba(24,48,36,.30);
}
/* 品牌行 —— 复用侧栏的「优」字标,视觉上前后统一 */
.login-brand{display:flex;align-items:center;gap:11px;margin-bottom:24px}
.lb-mark{
display:flex;align-items:center;justify-content:center;
width:38px;height:38px;flex:none;border-radius:11px;
font-size:18px;font-weight:700;color:var(--on-accent);
background:linear-gradient(145deg,var(--accent),var(--accent-hover));
box-shadow:0 6px 14px -7px var(--accent);
}
.lb-text{display:flex;flex-direction:column;line-height:1.4;min-width:0}
.lb-text strong{font-size:14px;font-weight:600;color:var(--text)}
.lb-text span{font-size:11px;color:var(--muted);letter-spacing:.02em}
.login-head{margin-bottom:22px}
.login-head h1{font-size:21px;font-weight:600;letter-spacing:-.01em;color:var(--text)}
.login-head .sub{margin:6px 0 0;font-size:12px;line-height:1.6;color:var(--muted)}
.login-card .field{margin-bottom:15px}
.login-card .btn{margin-top:4px}
.login-card .alert{margin-bottom:14px}
/* 带图标的输入框 */
.lg-input{position:relative;display:flex;align-items:center}
.lg-input>svg{
position:absolute;left:12px;width:15px;height:15px;
color:var(--muted);pointer-events:none;transition:color .15s;
}
.lg-input input{
height:42px;padding:0 12px 0 36px;font-size:13px;
background:var(--bg);border-radius:9px;
}
.lg-input input:focus{border-color:var(--accent);background:var(--card);box-shadow:0 0 0 3px var(--accent-soft)}
.lg-input:focus-within>svg{color:var(--accent)}
/* 有「显示密码」按钮的那一行,右边多让出 40px */
.lg-input.has-peek input{padding-right:40px}
.lg-peek{
position:absolute;right:6px;
display:flex;align-items:center;justify-content:center;
width:30px;height:30px;padding:0;
color:var(--muted);background:transparent;
border:0;border-radius:7px;cursor:pointer;
transition:color .15s,background-color .15s;
}
.lg-peek:hover{color:var(--accent);background:var(--accent-soft)}
.lg-peek svg{width:15px;height:15px}
.lg-opt{
margin-left:6px;padding:1px 6px;border-radius:20px;
font-size:10px;font-weight:400;color:var(--muted);
background:var(--surface);border:1px solid var(--line);
}
.lg-submit{
height:42px;margin-top:9px;border-radius:9px;
font-size:13px;letter-spacing:.14em;
box-shadow:0 9px 20px -12px var(--accent);
}
.lg-submit:hover:not(:disabled){box-shadow:0 11px 24px -12px var(--accent)}
.login-foot{
display:flex;align-items:center;justify-content:center;gap:7px;
margin-top:22px;padding-top:16px;
border-top:1px solid var(--line);
font-size:11px;color:var(--muted);
}
.lg-dot{width:5px;height:5px;border-radius:50%;background:var(--success);flex:none}
/* ---------------------------------------------------------- 主框架 */