From bd6b518aae61608ddc2d82b43ccc283dc95b9c54 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 11 三月 2026 13:59:33 +0800
Subject: [PATCH] #

---
 src/main/webapp/views/detail.html |   77 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 76 insertions(+), 1 deletions(-)

diff --git a/src/main/webapp/views/detail.html b/src/main/webapp/views/detail.html
index 301d6b2..bbed975 100644
--- a/src/main/webapp/views/detail.html
+++ b/src/main/webapp/views/detail.html
@@ -394,6 +394,47 @@
                                 </div>
                             </el-form-item>
                         </el-col>
+                        <el-col :xs="24">
+                            <el-form-item label="閫氳瀵嗛挜">
+                                <div class="mfa-panel">
+                                    <div class="mfa-head">
+                                        <div class="mfa-title">璁惧鐢熺墿璇嗗埆 / 瀹夊叏瀵嗛挜鐧诲綍</div>
+                                        <div class="mfa-actions">
+                                            <el-button
+                                                v-if="!form.passkeyBound"
+                                                type="primary"
+                                                plain
+                                                icon="el-icon-key"
+                                                @click="openPasskeyRegisterDialog">缁戝畾閫氳瀵嗛挜</el-button>
+                                            <el-button
+                                                v-else
+                                                type="danger"
+                                                plain
+                                                icon="el-icon-delete"
+                                                @click="openPasskeyRemoveDialog">瑙g粦閫氳瀵嗛挜</el-button>
+                                        </div>
+                                    </div>
+                                    <div class="mfa-meta">
+                                        <div class="mfa-meta-item">
+                                            <div class="mfa-meta-label">缁戝畾鐘舵��</div>
+                                            <div class="mfa-meta-value">{{ form.passkeyBound ? '宸茬粦瀹�' : '鏈粦瀹�' }}</div>
+                                        </div>
+                                        <div class="mfa-meta-item">
+                                            <div class="mfa-meta-label">鏄剧ず鍚嶇О</div>
+                                            <div class="mfa-meta-value">{{ form.passkeyName || '--' }}</div>
+                                        </div>
+                                        <div class="mfa-meta-item">
+                                            <div class="mfa-meta-label">缁戝畾鏃堕棿</div>
+                                            <div class="mfa-meta-value">{{ form.passkeyBoundTime$ || '--' }}</div>
+                                        </div>
+                                    </div>
+                                    <div class="mfa-tip">
+                                        <span v-if="form.passkeyBound">鏈�杩戜娇鐢細{{ form.passkeyLastUsedTime$ || '--' }}</span>
+                                        <span v-else>缁戝畾鍚庡彲鐩存帴浣跨敤璁惧鎸囩汗銆佷汉鑴告垨瀹夊叏瀵嗛挜鐧诲綍銆傝鑳藉姏瑕佹眰娴忚鍣ㄦ敮鎸侀�氳瀵嗛挜锛屼笖绯荤粺浠� HTTPS 鎴� localhost 鎵撳紑銆�</span>
+                                    </div>
+                                </div>
+                            </el-form-item>
+                        </el-col>
                     </el-row>
                     <div class="footer-bar">
                         <el-button type="primary" :loading="saving" @click="handleSave">纭淇敼</el-button>
@@ -476,12 +517,46 @@
             </div>
         </el-form>
     </el-dialog>
+
+    <el-dialog
+        class="mfa-dialog"
+        :title="passkeyDialogMode === 'register' ? '缁戝畾閫氳瀵嗛挜' : '瑙g粦閫氳瀵嗛挜'"
+        :visible.sync="passkeyDialogVisible"
+        width="520px"
+        :close-on-click-modal="false"
+        @close="closePasskeyDialog"
+        append-to-body>
+        <div class="mfa-setup">
+            <div v-if="passkeyDialogMode === 'register'" class="mfa-setup-tip">缁戝畾鏃朵細寮瑰嚭绯荤粺绾ц韩浠介獙璇佺獥鍙o紝璇蜂娇鐢ㄥ綋鍓嶈澶囩殑浜鸿劯銆佹寚绾广�丳IN 鎴栧畨鍏ㄥ瘑閽ュ畬鎴愮‘璁ゃ�傝嫢娴忚鍣ㄦ垨鐜涓嶆敮鎸侊紝鏃犳硶鍚敤璇ヨ兘鍔涖��</div>
+            <div v-else class="mfa-setup-tip">瑙g粦鍓嶈杈撳叆褰撳墠瀵嗙爜纭銆傝В缁戝悗灏嗕笉鑳藉啀鐢ㄥ綋鍓嶉�氳瀵嗛挜鐩存帴鐧诲綍銆�</div>
+        </div>
+        <el-form
+            ref="passkeyForm"
+            class="password-form"
+            :model="passkeyForm"
+            :rules="passkeyRules"
+            label-width="112px"
+            size="small"
+            @submit.native.prevent>
+            <el-form-item v-if="passkeyDialogMode === 'register'" label="鏄剧ず鍚嶇О" prop="name">
+                <el-input v-model.trim="passkeyForm.name" maxlength="100" autocomplete="off" placeholder="渚嬪锛氬姙鍏鐢佃剳"></el-input>
+            </el-form-item>
+            <el-form-item label="褰撳墠瀵嗙爜" prop="currentPassword">
+                <el-input v-model="passkeyForm.currentPassword" type="password" show-password autocomplete="off"></el-input>
+            </el-form-item>
+            <div class="mfa-footer">
+                <el-button @click="closePasskeyDialog">鍏抽棴</el-button>
+                <el-button type="primary" :loading="passkeySubmitting" @click="handlePasskeySubmit">淇濆瓨</el-button>
+            </div>
+        </el-form>
+    </el-dialog>
 </div>
 </body>
 <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/detail/detail.js?v=20260311_detail_mfa"></script>
+<script type="text/javascript" src="../static/js/detail/detail.js?v=20260311_detail_passkey"></script>
 </html>

--
Gitblit v1.9.1