- SecurityHeaders 中间件生成随机 nonce,注入 context - BuildPageData/BuildAdminPageData 将 CSPNonce 传递给模板 - 所有 19 个模板文件 <script> 标签添加 nonce 属性 - 移除所有内联事件处理(onclick/onerror),改用事件监听 - 移除所有 javascript:void(0) 链接,改用 # 号 + preventDefault - utils.js 添加全局 avatar 图片加载失败回退处理 - common.js 登出按钮添加 preventDefault - audit.js 关闭弹窗按钮改用事件监听
49 lines
2.0 KiB
HTML
49 lines
2.0 KiB
HTML
{{template "layout/header.html" .}}
|
|
<body>
|
|
|
|
{{template "layout/nav.html" .}}
|
|
|
|
<main class="auth-page">
|
|
<div class="auth-card">
|
|
<h2>登录 MetaLab</h2>
|
|
<p class="auth-subtitle">回到开发者社区</p>
|
|
<form id="loginForm" novalidate>
|
|
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
|
|
<div class="form-group">
|
|
<label for="email">邮箱地址</label>
|
|
<input type="email" id="email" placeholder="your@email.com" required>
|
|
<span class="form-error" id="emailError">请输入有效的邮箱地址</span>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="password">密码</label>
|
|
<input type="password" id="password" placeholder="输入密码" required>
|
|
<span class="form-error" id="passwordError">请输入密码</span>
|
|
</div>
|
|
<div class="form-group remember-group">
|
|
<label class="remember-label">
|
|
<input type="checkbox" id="rememberMe">
|
|
保持登录 30 天
|
|
</label>
|
|
<span class="remember-hint">非共享设备推荐</span>
|
|
</div>
|
|
<button type="submit" class="submit-btn" id="submitBtn">登 录</button>
|
|
</form>
|
|
<div class="auth-footer">
|
|
{{if not .IsMaintenance}}还没有账号?<a href="/auth/register">立即注册</a>{{end}}
|
|
</div>
|
|
</div>
|
|
</main>
|
|
|
|
<div class="toast" id="toast"></div>
|
|
|
|
{{template "layout/footer.html" .}}
|
|
|
|
<button class="scroll-top-btn" id="scrollTopBtn">
|
|
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="19" x2="12" y2="5"/><polyline points="5 12 12 5 19 12"/></svg>
|
|
</button>
|
|
|
|
<script src="/static/js/common.js?v={{assetV "/static/js/common.js"}}" nonce="{{.CSPNonce}}"></script>
|
|
<script src="/static/js/login.js?v={{assetV "/static/js/login.js"}}" nonce="{{.CSPNonce}}"></script>
|
|
</body>
|
|
</html>
|