feat(admin): 修改密码功能(PBKDF2原密码校验 + 新密码≥8位合规 + 页面 + 导航入口)
- AdminUserService.changePassword: verify旧密码 + 新密码≥8位且≠原密码 + hash更新 - AdminController: GET/POST /admin/password(当前登录用户,Sa-Token loginId) - password.ftl: 表单 + 前端JS预校验(长度/一致/新旧不同) - _macros.ftl: 侧边栏footer加修改密码入口 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -70,6 +70,7 @@
|
||||
<a href="${basePath}/admin/migrate" class="nav-item <#if active=='migrate'>active</#if>">数据迁移</a>
|
||||
</nav>
|
||||
<div class="sidebar-footer">
|
||||
<a href="${basePath}/admin/password" class="nav-item" style="border-left:none">修改密码</a>
|
||||
<a href="${basePath}/admin/logout" class="logout-link">退出登录</a>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
<#--
|
||||
修改密码页
|
||||
校验:原密码正确 + 新密码 ≥ 8 位 + 新旧不同 + 两次新密码一致(前端 JS + 后端 AdminUserServiceImpl 兜底)
|
||||
-->
|
||||
<#import "_macros.ftl" as m>
|
||||
<@m.layout active="password" title="修改密码">
|
||||
<#if msg?has_content>
|
||||
<div class="alert <#if msg!='pwddone'>alert-warn</#if>">
|
||||
<#if msg=='pwddone'>✅ 密码修改成功,下次登录请使用新密码
|
||||
<#elseif msg=='pwdfail'>❌ 修改失败:原密码错误,或新密码不合规(至少 8 位且与原密码不同)
|
||||
<#elseif msg=='pwdconfirm'>❌ 两次输入的新密码不一致
|
||||
</#if>
|
||||
</div>
|
||||
</#if>
|
||||
|
||||
<div style="max-width:420px;background:#fff;border-radius:8px;padding:24px 28px;box-shadow:0 1px 6px rgba(0,0,0,.07)">
|
||||
<p class="muted" style="margin-bottom:16px">当前默认密码为弱密码(admin123),建议尽快修改为含字母+数字的强密码。</p>
|
||||
<form method="post" action="${basePath}/admin/password" id="pwdForm">
|
||||
<div class="modal-body">
|
||||
<div class="form-group"><label>原密码</label><input type="password" name="oldPassword" required autocomplete="current-password"></div>
|
||||
<div class="form-group"><label>新密码(至少 8 位,建议字母+数字)</label><input type="password" name="newPassword" id="newPwd" required autocomplete="new-password"></div>
|
||||
<div class="form-group"><label>确认新密码</label><input type="password" name="confirmPassword" id="confirmPwd" required autocomplete="new-password"></div>
|
||||
</div>
|
||||
<div style="margin-top:8px;text-align:right">
|
||||
<button type="submit" class="btn btn-primary">确认修改</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// 前端预校验:长度 ≥ 8 + 两次一致 + 新旧不同(后端服务层强校验兜底)
|
||||
document.getElementById('pwdForm').addEventListener('submit', function (e) {
|
||||
var np = document.getElementById('newPwd').value;
|
||||
var cp = document.getElementById('confirmPwd').value;
|
||||
var op = document.getElementsByName('oldPassword')[0].value;
|
||||
if (np.length < 8) { e.preventDefault(); alert('新密码至少 8 位'); return; }
|
||||
if (np !== cp) { e.preventDefault(); alert('两次输入的新密码不一致'); return; }
|
||||
if (np === op) { e.preventDefault(); alert('新密码不能与原密码相同'); return; }
|
||||
});
|
||||
</script>
|
||||
</@m.layout>
|
||||
Reference in New Issue
Block a user