Files
laser-data-hub/templates/login.html
T
broccoliandClaude Fable 5 edfb216561 激光材料数据平台 1.3.0
公开数据看板、四位 Key 录入面板、管理后台与三级权限、动态字段配置、
PostgreSQL/SQLite 双支持、数据库备份,以及本版新增的成品图上传与预览。

图片相关:
- 录入表单支持相册选图与手机端直接拍照,每条记录最多 6 张
- 浏览器内压缩到最长边 1600 并剥离 EXIF,入库统一为 JPG/PNG
- 二进制直接入库,现有备份自动覆盖图片,部署无需新增卷
- 详情页缩略图宫格与全屏 lightbox,公开看板同样可见

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-26 22:06:02 +08:00

38 lines
2.3 KiB
HTML

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>登录 · {{ app_name }}</title><link rel="stylesheet" href="/static/app.css">
</head>
<body class="login-body">
<main class="login-shell">
<section class="login-brand">
<div class="brand-mark">L</div>
<p class="eyebrow">LASER MATERIAL DATA</p>
<h1>让每一次激光实验<br>都有据可循</h1>
<p>集中管理雕刻参数、材料物性与实验结果,数据可查、操作可审、系统可恢复。</p>
<div class="brand-stats"><span><b>32</b> 个标准字段</span><span><b>3</b> 级权限</span><span><b>100%</b> 审计留痕</span></div>
</section>
<section class="login-card">
<div class="mobile-logo"><div class="brand-mark">L</div><strong>{{ app_name }}</strong></div>
<p class="eyebrow">WELCOME BACK</p><h2>登录工作台</h2><p class="muted">使用管理员分配的账号继续</p>
<form id="loginForm">
<label>用户名<input name="username" autocomplete="username" placeholder="请输入用户名" required autofocus></label>
<label>密码<input type="password" name="password" autocomplete="current-password" placeholder="请输入密码" required></label>
<button class="primary wide" type="submit">安全登录 <span></span></button>
<p id="loginError" class="form-error" hidden></p>
</form>
<p class="login-foot">系统采用加密会话与完整审计日志保护数据安全</p>
</section>
</main>
<script>
document.querySelector('#loginForm').addEventListener('submit', async (event) => {
event.preventDefault(); const button=event.target.querySelector('button'); const error=document.querySelector('#loginError');
button.disabled=true; button.firstChild.textContent='登录中… '; error.hidden=true;
try { const response=await fetch('/api/auth/login',{method:'POST',body:new FormData(event.target)}); const data=await response.json();
if(!response.ok) throw new Error(data.message||'登录失败'); location.href='/admin';
} catch(e) { error.textContent=e.message; error.hidden=false; button.disabled=false; button.firstChild.textContent='安全登录 '; }
});
</script>
</body></html>