From 8665daa7aa863f96d0d8f27c167edae1efc38022 Mon Sep 17 00:00:00 2001
From: zjk <852185829@qq.com>
Date: 星期五, 31 七月 2026 14:46:19 +0800
Subject: [PATCH] Merge branch 'master' into dev

---
 ruoyi-ui/src/views/visitor-admin/system/config.vue |  106 +++++++++++++++++++++++++++++++---------------------
 1 files changed, 63 insertions(+), 43 deletions(-)

diff --git a/ruoyi-ui/src/views/visitor-admin/system/config.vue b/ruoyi-ui/src/views/visitor-admin/system/config.vue
index aeb0039..b684e2e 100644
--- a/ruoyi-ui/src/views/visitor-admin/system/config.vue
+++ b/ruoyi-ui/src/views/visitor-admin/system/config.vue
@@ -11,7 +11,7 @@
           type="button"
           @click="activeTab = tab.value"
         >
-          <span class="nav-folder"></span>
+          <svg-icon class-name="config-nav-icon" :icon-class="tab.icon" />
           <span>{{ tab.label }}</span>
         </button>
       </aside>
@@ -20,33 +20,52 @@
         <section v-show="activeTab === 'register'">
           <div class="config-section">
             <h2>登记模式设置</h2>
-            <label v-for="item in registerSwitches" :key="item.prop" class="config-switch-row">
-              <span class="row-icon"></span>
-              <span class="row-label">{{ item.label }}</span>
-              <input v-model="form[item.prop]" type="checkbox">
-              <span class="switch-control"></span>
+            <label class="config-switch-row">
+              <svg-icon class-name="row-icon" icon-class="config-onsite-register" />
+              <span class="row-label">现场登记</span>
+              <input v-model="form.onsiteRegistrationEnabled" type="checkbox">
+              <span class="switch-control" />
             </label>
+            <label class="config-switch-row">
+              <svg-icon class-name="row-icon" icon-class="config-appointment-register" />
+              <span class="row-label">预约登记</span>
+              <input v-model="form.appointmentRegistrationEnabled" type="checkbox">
+              <span class="switch-control" />
+            </label>
+            <div v-if="form.appointmentRegistrationEnabled" class="appointment-time-row">
+              <svg-icon class-name="row-icon" icon-class="config-appointment-time" />
+              <span class="row-label">预约登记默认访问时间</span>
+              <span class="time-day">当天</span>
+              <el-time-picker
+                v-model="form.appointmentDefaultVisitTime"
+                class="appointment-time-input"
+                value-format="HH:mm"
+                format="HH:mm"
+                placeholder="请选择时间"
+                :clearable="false"
+              />
+            </div>
           </div>
 
           <div class="config-section">
             <h2>接待人验证开关</h2>
             <p>设置登记、签离时是否需要接待人确认。若关闭,访客认证后直接打印凭条/签离时自动回收门禁权限。</p>
             <label v-for="item in receiverSwitches" :key="item.prop" class="config-switch-row">
-              <span class="row-icon"></span>
+              <svg-icon class-name="row-icon" :icon-class="item.icon" />
               <span class="row-label">{{ item.label }}</span>
               <input v-model="form[item.prop]" type="checkbox">
-              <span class="switch-control"></span>
+              <span class="switch-control" />
             </label>
           </div>
 
           <div class="config-section">
             <h2>人脸验证方式</h2>
-            <p>人像对比即身份证和人脸对比确保为同一人(手动录入身份证除外),全方位人脸采集则360°采集人脸照片。</p>
+            <p>人像对比即身份证和人脸对比确保为同一人(手动录入身份证除外),人脸采集则采集访客人脸照片。</p>
             <label v-for="item in faceSwitches" :key="item.prop" class="config-switch-row">
-              <span class="row-icon"></span>
+              <svg-icon class-name="row-icon" :icon-class="item.icon" />
               <span class="row-label">{{ item.label }}</span>
               <input v-model="form[item.prop]" type="checkbox">
-              <span class="switch-control"></span>
+              <span class="switch-control" />
             </label>
           </div>
 
@@ -54,10 +73,10 @@
             <h2>身份证手动输入</h2>
             <p>关闭后仅可刷身份证登记/签离。强制人脸比对时,开启则支持手动输入身份证并做人脸采集。</p>
             <label class="config-switch-row">
-              <span class="row-icon"></span>
+              <svg-icon class-name="row-icon" icon-class="config-id-card" />
               <span class="row-label">允许手动输入身份证</span>
               <input v-model="form.manualIdCardEnabled" type="checkbox">
-              <span class="switch-control"></span>
+              <span class="switch-control" />
             </label>
           </div>
         </section>
@@ -68,15 +87,14 @@
               <div class="config-section">
                 <h2>凭条样式配置</h2>
                 <p>勾选需要在凭条上打印的字段,支持拖拽排序(至少勾选1个字段)</p>
-                <draggable v-model="printFieldOptions" class="print-field-list" handle=".print-field-drag" ghost-class="print-field-ghost" :delay="120" @end="syncPrintFieldsOrder">
+                <draggable v-model="printFieldOptions" class="print-field-list" ghost-class="print-field-ghost" chosen-class="print-field-chosen" :delay="120" :animation="160" @end="syncPrintFieldsOrder">
                   <label v-for="item in printFieldOptions" :key="item.fieldCode" class="print-field-item">
-                    <span class="print-field-drag">↕</span>
                     <input v-model="form.printFields" type="checkbox" :value="item.fieldCode">
                     <span>{{ item.fieldName }}</span>
                   </label>
                 </draggable>
                 <button class="sort-hint" type="button">
-                  <span>↕</span>
+                  <i class="el-icon-s-opportunity sort-hint-icon" aria-hidden="true" />
                   <span>长按选项拖拽排序</span>
                 </button>
               </div>
@@ -85,17 +103,21 @@
             <aside class="print-preview">
               <div class="preview-title">
                 <span>效果预览</span>
-                <button type="button" title="刷新预览" @click="refreshPreview">↻</button>
+                <button type="button" title="刷新预览" aria-label="刷新预览" @click="refreshPreview">
+                  <i class="el-icon-refresh" aria-hidden="true" />
+                </button>
               </div>
-              <section class="ticket-preview" aria-label="登记凭证预览">
-                <h3>登记凭证</h3>
-                <div class="ticket-rows">
-                  <div v-for="row in ticketRows" :key="row.label" class="ticket-row">
-                    <strong>{{ row.label }}</strong>
-                    <span>{{ row.value }}</span>
+              <div class="preview-stage">
+                <section class="ticket-preview" aria-label="登记凭证预览">
+                  <h3>登记凭证</h3>
+                  <div class="ticket-rows">
+                    <div v-for="row in ticketRows" :key="row.label" class="ticket-row">
+                      <strong>{{ row.label }}</strong>
+                      <span>{{ row.value }}</span>
+                    </div>
                   </div>
-                </div>
-              </section>
+                </section>
+              </div>
             </aside>
           </div>
         </section>
@@ -109,13 +131,14 @@
                   <span>系统名称</span>
                   <input v-model="form.systemName" type="text" placeholder="请输入系统名称">
                 </label>
-                <label class="input-field">
+                <div class="input-field">
                   <span>Logo</span>
-                  <div class="logo-upload">
+                  <label class="logo-upload">
                     <input v-hasPermi="['visitor:config:edit']" type="file" accept="image/*" :disabled="uploadingLogo" @change="handleLogoChange">
-                    <span>{{ uploadingLogo ? '上传中' : logoFileName }}</span>
-                  </div>
-                </label>
+                    <span class="logo-upload-button">选择文件</span>
+                    <span class="logo-file-name">{{ uploadingLogo ? '上传中' : logoFileName }}</span>
+                  </label>
+                </div>
               </div>
             </div>
 
@@ -137,10 +160,10 @@
               <h2>入口配置</h2>
               <p>关闭后入口不显示,但是仍可以点击该区域进入。</p>
               <label class="config-switch-row">
-                <span class="row-icon"></span>
+                <svg-icon class-name="row-icon" icon-class="config-device" />
                 <span class="row-label">访客机管理侧入口</span>
                 <input v-model="form.visitorMachineEntryEnabled" type="checkbox">
-                <span class="switch-control"></span>
+                <span class="switch-control" />
               </label>
             </div>
           </div>
@@ -163,6 +186,7 @@
 const defaultForm = {
   onsiteRegistrationEnabled: true,
   appointmentRegistrationEnabled: true,
+  appointmentDefaultVisitTime: '',
   registerReceiverConfirmEnabled: false,
   signReceiverConfirmEnabled: false,
   faceCompareEnabled: false,
@@ -188,21 +212,17 @@
       logoFileName: '未选择任何文件',
       form: { ...defaultForm },
       tabs: [
-        { value: 'register', label: '登记配置' },
-        { value: 'print', label: '打印凭条配置' },
-        { value: 'system', label: '系统信息' }
-      ],
-      registerSwitches: [
-        { prop: 'onsiteRegistrationEnabled', label: '现场登记' },
-        { prop: 'appointmentRegistrationEnabled', label: '预约登记' }
+        { value: 'register', label: '登记配置', icon: 'config-register' },
+        { value: 'print', label: '打印凭条配置', icon: 'config-print' },
+        { value: 'system', label: '系统信息', icon: 'config-system' }
       ],
       receiverSwitches: [
-        { prop: 'registerReceiverConfirmEnabled', label: '登记需接待人确认' },
-        { prop: 'signReceiverConfirmEnabled', label: '签离需接待人确认' }
+        { prop: 'registerReceiverConfirmEnabled', label: '登记需接待人确认', icon: 'config-receiver-confirm' },
+        { prop: 'signReceiverConfirmEnabled', label: '签离需接待人确认', icon: 'config-sign-confirm' }
       ],
       faceSwitches: [
-        { prop: 'faceCompareEnabled', label: '人像对比' },
-        { prop: 'faceCaptureEnabled', label: '全方位人脸采集' }
+        { prop: 'faceCompareEnabled', label: '人像对比', icon: 'config-face-compare' },
+        { prop: 'faceCaptureEnabled', label: '人脸采集', icon: 'config-face-capture' }
       ],
       printFieldOptions: [
         { fieldCode: 'visitorName', fieldName: '访客姓名' },

--
Gitblit v1.7.1