- 所有页面添加响应式CSS,支持手机/电脑自适应 - index.html: 导航栏active状态、表单、统计、借款列表响应式 - analysis.html: 图表、统计卡片响应式 - admin.html: 表格、搜索栏响应式 - reset-password.html: 登录卡片响应式 - 修复导航栏active类:analysis.html的分析标签高亮 - 非本人借款:隐藏修改按钮,快速还款改为快速查看 - 修复main.py重复函数 - 添加debt-manager.sh管理脚本
122 lines
6.4 KiB
HTML
122 lines
6.4 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>重置密码</title>
|
|
<style>
|
|
:root{--bg:#f5f5f7;--card:rgba(255,255,255,.72);--border:rgba(0,0,0,.06);--text:#1d1d1f;--text2:#6e6e73;--blue:#0071e3;--green:#34c759;--red:#ff3b30;--radius:20px;--radius-sm:10px;--radius-xs:8px}
|
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
body{font-family:-apple-system,BlinkMacSystemFont,"SF Pro Display","PingFang SC",sans-serif;background:var(--bg);color:var(--text);min-height:100vh;display:flex;align-items:center;justify-content:center;-webkit-font-smoothing:antialiased}
|
|
.auth-card{background:var(--card);backdrop-filter:saturate(180%) blur(20px);-webkit-backdrop-filter:saturate(180%) blur(20px);border-radius:var(--radius);padding:48px 44px;width:400px;border:1px solid var(--border);box-shadow:0 16px 48px rgba(0,0,0,.08);animation:fadeIn .3s ease-out}
|
|
@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
|
|
.auth-card h2{text-align:center;margin-bottom:32px;color:var(--text);font-size:22px;font-weight:700;letter-spacing:-.3px}
|
|
.auth-card .form-row{margin-bottom:18px}
|
|
.auth-card .form-row label{display:block;font-size:13px;font-weight:500;margin-bottom:4px}
|
|
.auth-card .form-row input{width:100%;padding:12px 16px;border:1px solid #d2d2d7;border-radius:var(--radius-xs);font-size:15px;outline:none;transition:all .2s;background:#fff;color:var(--text)}
|
|
.auth-card .form-row input:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(0,113,227,.12)}
|
|
.btn{width:100%;padding:12px 0;border:none;border-radius:var(--radius-xs);font-size:15px;font-weight:600;cursor:pointer;transition:all .2s;font-family:inherit;background:var(--blue);color:#fff}
|
|
.btn:hover{background:#0077ed}
|
|
.btn:disabled{opacity:.5;cursor:not-allowed}
|
|
.error-msg{display:none;font-size:12px;margin-top:12px;text-align:center;padding:10px 14px;border-radius:var(--radius-xs);background:rgba(255,59,48,.06);backdrop-filter:blur(20px);color:var(--red);border:1px solid rgba(255,59,48,.12);line-height:1.5}
|
|
.error-msg.show{display:flex;align-items:center;justify-content:center;gap:6px}
|
|
.success-msg{display:none;font-size:13px;margin-top:12px;text-align:center;padding:12px;border-radius:var(--radius-xs);background:rgba(52,199,89,.06);color:var(--green)}
|
|
.success-msg.show{display:block}
|
|
.loading{display:none;text-align:center;padding:40px;color:var(--text2);font-size:14px}
|
|
.loading.show{display:block}
|
|
.invalid{display:none;text-align:center;padding:40px;color:var(--text2);font-size:14px}
|
|
.invalid.show{display:block}
|
|
.links{text-align:center;margin-top:18px}
|
|
.links a{color:var(--blue);text-decoration:none;font-size:13px;font-weight:500}
|
|
.links a:hover{text-decoration:underline}
|
|
|
|
/* RESPONSIVE */
|
|
@media(max-width:480px){
|
|
.auth-card{width:calc(100% - 32px);padding:24px 20px;margin:16px}
|
|
.auth-card h2{font-size:18px;margin-bottom:24px}
|
|
.auth-card .form-row input{padding:10px 14px;font-size:14px}
|
|
}
|
|
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="auth-card" id="card">
|
|
<h2>重置密码</h2>
|
|
<div class="loading" id="loading">验证链接中...</div>
|
|
<div class="invalid" id="invalid" style="display:none">
|
|
<p style="font-size:24px;margin-bottom:12px">❌</p>
|
|
<p id="invalidMsg">链接无效或已过期</p>
|
|
<div class="links" style="margin-top:20px"><a href="/">返回登录</a></div>
|
|
</div>
|
|
<div id="resetForm" style="display:none">
|
|
<p style="font-size:13px;color:var(--text2);margin-bottom:18px;text-align:center">Hi <strong id="userName"></strong>,请设置新密码。</p>
|
|
<div class="form-row"><label>新密码</label><input type="password" id="newPwd" placeholder="请输入新密码"></div>
|
|
<div class="form-row"><label>确认新密码</label><input type="password" id="newPwd2" placeholder="请再次输入新密码" onkeydown="if(event.key==='Enter')doReset()"></div>
|
|
<div id="resetError" class="error-msg"><span>⚠</span><span id="resetErrorText"></span></div>
|
|
<div id="resetSuccess" class="success-msg"></div>
|
|
<button class="btn" id="resetBtn" onclick="doReset()">确认重置</button>
|
|
<div class="links"><a href="/">返回登录</a></div>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
const API='/api/v1';
|
|
const $=id=>document.getElementById(id);
|
|
const params=new URLSearchParams(window.location.search);
|
|
const token=params.get('token');
|
|
const uid=params.get('uid');
|
|
|
|
function showError(msg){$('resetErrorText').textContent=msg;$('resetError').classList.add('show');}
|
|
function hideError(){$('resetError').classList.remove('show');$('resetErrorText').textContent='';}
|
|
|
|
async function init(){
|
|
if(!token||!uid){$('loading').style.display='none';$('invalid').style.display='';$('invalidMsg').textContent='链接参数缺失';return;}
|
|
try{
|
|
const res=await fetch(API+'/auth/check-reset-token?token='+encodeURIComponent(token)+'&uid='+uid);
|
|
if(res.ok){
|
|
const data=await res.json();
|
|
$('userName').textContent=data.nickname;
|
|
$('loading').style.display='none';
|
|
$('resetForm').style.display='';
|
|
}else{
|
|
const data=await res.json().catch(()=>({}));
|
|
$('loading').style.display='none';
|
|
$('invalid').style.display='';
|
|
$('invalidMsg').textContent=data.detail||'链接无效';
|
|
}
|
|
}catch(e){
|
|
$('loading').style.display='none';
|
|
$('invalid').style.display='';
|
|
$('invalidMsg').textContent='网络异常,请稍后重试';
|
|
}
|
|
}
|
|
|
|
async function doReset(){
|
|
const nw=$('newPwd').value,nw2=$('newPwd2').value;
|
|
if(!nw){showError('请输入新密码');return;}
|
|
if(nw.length<6){showError('密码至少6位');return;}
|
|
if(nw!==nw2){showError('两次密码不一致');return;}
|
|
hideError();
|
|
$('resetBtn').disabled=true;$('resetBtn').textContent='重置中...';
|
|
try{
|
|
const res=await fetch(API+'/auth/reset-by-token',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({token,uid:+uid,new_password:nw})});
|
|
if(res.ok){
|
|
$('resetForm').style.display='none';
|
|
$('resetSuccess').style.display='';
|
|
$('resetSuccess').textContent='密码重置成功!';
|
|
setTimeout(()=>{window.location.href='/';},2000);
|
|
}else{
|
|
const data=await res.json().catch(()=>({}));
|
|
showError(data.detail||'重置失败');
|
|
$('resetBtn').disabled=false;$('resetBtn').textContent='确认重置';
|
|
}
|
|
}catch(e){
|
|
showError('网络异常,请稍后重试');
|
|
$('resetBtn').disabled=false;$('resetBtn').textContent='确认重置';
|
|
}
|
|
}
|
|
|
|
init();
|
|
</script>
|
|
</body>
|
|
</html>
|