From e43ada57f7ffdaf570c54b19316a7f0cacfaec1f Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期五, 27 三月 2026 12:21:59 +0800
Subject: [PATCH] #

---
 src/main/webapp/views/login.html |   53 +++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 45 insertions(+), 8 deletions(-)

diff --git a/src/main/webapp/views/login.html b/src/main/webapp/views/login.html
index 47918db..73d60c3 100644
--- a/src/main/webapp/views/login.html
+++ b/src/main/webapp/views/login.html
@@ -260,15 +260,43 @@
         }
 
         .login-submit {
-            width: 100%;
             display: inline-flex;
             align-items: center;
             justify-content: center;
             font-size: 16px;
             font-weight: 600;
             border-radius: 16px;
-            margin-top: 6px;
             box-shadow: 0 14px 24px rgba(46, 115, 223, 0.28);
+        }
+
+        .login-actions {
+            display: flex;
+            flex-direction: column;
+            gap: 12px;
+            margin-top: 6px;
+        }
+
+        .login-actions .el-button {
+            width: 100%;
+            margin-left: 0;
+            box-sizing: border-box;
+        }
+
+        .login-passkey {
+            display: inline-flex;
+            align-items: center;
+            justify-content: center;
+            border-radius: 16px;
+            border-color: rgba(71, 110, 162, 0.24);
+            color: #26496a;
+            background: rgba(245, 249, 255, 0.96);
+        }
+
+        .login-passkey-tip {
+            margin-top: 12px;
+            color: #7b8c9d;
+            font-size: 12px;
+            line-height: 1.7;
         }
 
         .tools-dialog .el-dialog,
@@ -484,7 +512,7 @@
                 <div class="login-subtitle">{{ text('login.subtitle', '璇疯緭鍏ヨ处鍙峰拰瀵嗙爜杩涘叆绯荤粺銆�') }}</div>
             </div>
             <div class="login-body">
-                <el-form ref="loginForm" class="login-form" :model="loginForm" :rules="loginRules" @submit.native.prevent>
+                <el-form ref="loginForm" class="login-form" :model="loginForm" :rules="loginRules" :validate-on-rule-change="false" @submit.native.prevent>
                     <el-form-item prop="mobile">
                         <el-input v-model.trim="loginForm.mobile" :placeholder="text('login.username', '璐﹀彿')" clearable @keyup.enter.native="handleLogin">
                             <i slot="prefix" class="el-input__icon el-icon-user"></i>
@@ -495,9 +523,17 @@
                             <i slot="prefix" class="el-input__icon el-icon-lock"></i>
                         </el-input>
                     </el-form-item>
-                    <el-button class="login-submit" type="primary" :loading="loginLoading" @click="handleLogin">
-                        {{ text('login.submit', '鐧诲綍') }}
-                    </el-button>
+                    <div class="login-actions">
+                        <el-button class="login-submit" type="primary" :loading="loginLoading" @click="handleLogin">
+                            {{ text('login.submit', '鐧诲綍') }}
+                        </el-button>
+                        <el-button class="login-passkey" plain :loading="passkeyLoading" @click="handlePasskeyLogin">
+                            {{ text('login.passkey.submit', '閫氳瀵嗛挜鐧诲綍') }}
+                        </el-button>
+                    </div>
+                    <div class="login-passkey-tip">
+                        {{ text('login.passkey.tip', '鏀寔浣跨敤璁惧鐢熺墿璇嗗埆鎴栧畨鍏ㄥ瘑閽ョ櫥褰曘�傚彲鍏堣緭鍏ヨ处鍙风缉灏忓嚟璇佽寖鍥达紝鐣欑┖鍒欏皾璇曞彂鐜板紡鐧诲綍銆�') }}
+                    </div>
                 </el-form>
             </div>
         </section>
@@ -532,7 +568,7 @@
         append-to-body>
         <div class="mfa-tip">{{ text('login.mfa.tip', '璐﹀彿瀵嗙爜宸查�氳繃锛岃杈撳叆韬唤楠岃瘉鍣ㄤ腑鐨� 6 浣嶅姩鎬侀獙璇佺爜鍚庣户缁櫥褰曘��') }}</div>
         <div class="mfa-account">{{ text('login.mfa.currentAccount', '褰撳墠璐﹀彿锛�') }}<strong>{{ mfaPending.username || loginForm.mobile || '--' }}</strong></div>
-        <el-form ref="mfaForm" :model="mfaForm" :rules="mfaRules" label-width="82px" size="small" @submit.native.prevent>
+        <el-form ref="mfaForm" :model="mfaForm" :rules="mfaRules" :validate-on-rule-change="false" label-width="82px" size="small" @submit.native.prevent>
             <el-form-item :label="text('login.mfa.codeLabel', '楠岃瘉鐮�')" prop="code">
                 <el-input v-model.trim="mfaForm.code" maxlength="6" :placeholder="text('login.mfa.codePlaceholder', '璇疯緭鍏�6浣嶅姩鎬佺爜')" @keyup.enter.native="handleMfaLogin"></el-input>
             </el-form-item>
@@ -567,7 +603,8 @@
 <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
 <script type="text/javascript" src="../static/js/tools/md5.js"></script>
 <script type="text/javascript" src="../static/js/common.js"></script>
+<script type="text/javascript" src="../static/js/webauthn-utils.js"></script>
 <script type="text/javascript" src="../static/vue/js/vue.min.js"></script>
 <script type="text/javascript" src="../static/vue/element/element.js"></script>
-<script type="text/javascript" src="../static/js/login/login.js?v=20260311_login_mfa"></script>
+<script type="text/javascript" src="../static/js/login/login.js?v=20260311_login_passkey"></script>
 </html>

--
Gitblit v1.9.1