From a66ff0e3cfa7fd65c2350af6c986eaa127c7af69 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 02 四月 2026 16:45:24 +0800
Subject: [PATCH] #登录页修复

---
 rsf-design/src/views/basic-info/bas-station-area/index.vue                   |   64 ++++++----
 rsf-design/src/views/auth/login/index.vue                                    |   15 +-
 rsf-design/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue |   39 ++----
 rsf-design/src/locales/langs/en.json                                         |  101 ++++++----------
 rsf-design/src/locales/langs/zh.json                                         |   99 ++++++---------
 rsf-design/src/assets/images/user/avatar.webp                                |    0 
 6 files changed, 141 insertions(+), 177 deletions(-)

diff --git a/rsf-design/src/assets/images/user/avatar.webp b/rsf-design/src/assets/images/user/avatar.webp
index 6d7234b..4a90bfb 100644
--- a/rsf-design/src/assets/images/user/avatar.webp
+++ b/rsf-design/src/assets/images/user/avatar.webp
Binary files differ
diff --git a/rsf-design/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue b/rsf-design/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue
index 6efbeec..2329355 100644
--- a/rsf-design/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue
+++ b/rsf-design/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue
@@ -27,24 +27,12 @@
           />
           <div class="w-[calc(100%-60px)] h-full">
             <span class="block text-sm font-medium text-g-800 truncate">{{
-              userInfo.userName
+              displayNickname
             }}</span>
-            <span class="block mt-0.5 text-xs text-g-500 truncate">{{ userInfo.email }}</span>
+            <span class="block mt-0.5 text-xs text-g-500 truncate">{{ displaySubTitle }}</span>
           </div>
         </div>
         <ul class="py-4 mt-3 border-t border-g-300/80">
-          <li class="btn-item" @click="goPage('/system/user-center')">
-            <ArtSvgIcon icon="ri:user-3-line" />
-            <span>{{ $t('topBar.user.userCenter') }}</span>
-          </li>
-          <li class="btn-item" @click="toDocs()">
-            <ArtSvgIcon icon="ri:book-2-line" />
-            <span>{{ $t('topBar.user.docs') }}</span>
-          </li>
-          <li class="btn-item" @click="toGithub()">
-            <ArtSvgIcon icon="ri:github-line" />
-            <span>{{ $t('topBar.user.github') }}</span>
-          </li>
           <li class="btn-item" @click="lockScreen()">
             <ArtSvgIcon icon="ri:lock-line" />
             <span>{{ $t('topBar.user.lockScreen') }}</span>
@@ -61,26 +49,25 @@
 
 <script setup>
   import { useI18n } from 'vue-i18n'
-  import { useRouter } from 'vue-router'
   import { ElMessageBox } from 'element-plus'
   import { useUserStore } from '@/store/modules/user'
-  import { WEB_LINKS } from '@/utils/constants'
   import { mittBus } from '@/utils/sys'
   defineOptions({ name: 'ArtUserMenu' })
-  const router = useRouter()
   const { t } = useI18n()
   const userStore = useUserStore()
   const { getUserInfo: userInfo } = storeToRefs(userStore)
   const userMenuPopover = ref()
-  const goPage = (path) => {
-    router.push(path)
-  }
-  const toDocs = () => {
-    window.open(WEB_LINKS.DOCS)
-  }
-  const toGithub = () => {
-    window.open(WEB_LINKS.GITHUB)
-  }
+  const displayNickname = computed(
+    () =>
+      userInfo.value?.nickname ||
+      userInfo.value?.nickName ||
+      userInfo.value?.realName ||
+      userInfo.value?.userName ||
+      '-'
+  )
+  const displaySubTitle = computed(
+    () => userInfo.value?.userName || userInfo.value?.email || ''
+  )
   const lockScreen = () => {
     mittBus.emit('openLockScreen')
   }
diff --git a/rsf-design/src/locales/langs/en.json b/rsf-design/src/locales/langs/en.json
index 81d450c..f6ae9c9 100644
--- a/rsf-design/src/locales/langs/en.json
+++ b/rsf-design/src/locales/langs/en.json
@@ -113,13 +113,39 @@
     "noData": "No printable data"
   },
   "table": {
-    "index": "No.",
+    "form": {
+      "reset": "Reset",
+      "submit": "Submit"
+    },
+    "searchBar": {
+      "reset": "Reset",
+      "search": "Search",
+      "expand": "Expand",
+      "collapse": "Collapse",
+      "searchInputPlaceholder": "Please enter",
+      "searchSelectPlaceholder": "Please select"
+    },
+    "selection": "Select",
+    "sizeOptions": {
+      "small": "Compact",
+      "default": "Default",
+      "large": "Loose"
+    },
+    "column": {
+      "selection": "Select",
+      "expand": "Expand",
+      "index": "Index"
+    },
+    "index": "Index",
     "unit": "Unit",
     "id": "ID",
     "name": "Name",
     "code": "Code",
+    "keyword": "Keyword",
     "status": "Status",
+    "type": "Type",
     "memo": "Remark",
+    "remark": "Remark",
     "createBy": "Created By",
     "createTime": "Created At",
     "updateBy": "Updated By",
@@ -131,7 +157,20 @@
     "wcs": "WCS",
     "source": "Source",
     "supplier": "Supplier",
-    "supplierBatch": "Supplier Batch"
+    "supplierBatch": "Supplier Batch",
+    "batch": "Batch",
+    "quantity": "Quantity",
+    "materialCode": "Material Code",
+    "materialName": "Material Name",
+    "menuType": "Menu Type",
+    "iconPreview": "Icon Preview",
+    "componentKey": "Component Key",
+    "permissionKey": "Permission Key",
+    "zebra": "Zebra",
+    "border": "Border",
+    "headerBackground": "Header BG",
+    "topLevelMenu": "Top Level Menu",
+    "emptyText": "No data"
   },
   "search": {
     "placeholder": "Search page",
@@ -635,64 +674,6 @@
       "tokenMetric": "Tokens: prompt {prompt} / completion {completion} / total {total}",
       "streaming": "Streaming"
     }
-  },
-  "table": {
-    "form": {
-      "reset": "Reset",
-      "submit": "Submit"
-    },
-    "searchBar": {
-      "reset": "Reset",
-      "search": "Search",
-      "expand": "Expand",
-      "collapse": "Collapse",
-      "searchInputPlaceholder": "Please enter",
-      "searchSelectPlaceholder": "Please select"
-    },
-    "selection": "Select",
-    "sizeOptions": {
-      "small": "Compact",
-      "default": "Default",
-      "large": "Loose"
-    },
-    "column": {
-      "selection": "Select",
-      "expand": "Expand",
-      "index": "Index"
-    },
-    "index": "Index",
-    "id": "ID",
-    "name": "Name",
-    "code": "Code",
-    "keyword": "Keyword",
-    "operation": "Operation",
-    "status": "Status",
-    "type": "Type",
-    "source": "Source",
-    "supplier": "Supplier",
-    "supplierBatch": "Supplier Batch",
-    "memo": "Remark",
-    "remark": "Remark",
-    "createBy": "Created By",
-    "updateBy": "Updated By",
-    "updateTime": "Updated At",
-    "createTime": "Created At",
-    "unit": "Unit",
-    "batch": "Batch",
-    "quantity": "Quantity",
-    "materialCode": "Material Code",
-    "materialName": "Material Name",
-    "wcs": "WCS",
-    "menuType": "Menu Type",
-    "iconPreview": "Icon Preview",
-    "componentKey": "Component Key",
-    "permissionKey": "Permission Key",
-    "sort": "Sort",
-    "zebra": "Zebra",
-    "border": "Border",
-    "headerBackground": "Header BG",
-    "topLevelMenu": "Top Level Menu",
-    "emptyText": "No data"
   },
   "message": {
     "requestTimeoutStopped": "Request timed out and waiting has stopped",
diff --git a/rsf-design/src/locales/langs/zh.json b/rsf-design/src/locales/langs/zh.json
index 12e8965..4133832 100644
--- a/rsf-design/src/locales/langs/zh.json
+++ b/rsf-design/src/locales/langs/zh.json
@@ -113,13 +113,39 @@
     "noData": "鏆傛棤鎵撳嵃鏁版嵁"
   },
   "table": {
+    "form": {
+      "reset": "閲嶇疆",
+      "submit": "鎻愪氦"
+    },
+    "searchBar": {
+      "reset": "閲嶇疆",
+      "search": "鏌ヨ",
+      "expand": "灞曞紑",
+      "collapse": "鏀惰捣",
+      "searchInputPlaceholder": "璇疯緭鍏�",
+      "searchSelectPlaceholder": "璇烽�夋嫨"
+    },
+    "selection": "閫夋嫨",
+    "sizeOptions": {
+      "small": "绱у噾",
+      "default": "榛樿",
+      "large": "瀹芥澗"
+    },
+    "column": {
+      "selection": "鍕鹃��",
+      "expand": "灞曞紑",
+      "index": "搴忓彿"
+    },
     "index": "搴忓彿",
     "unit": "鍗曚綅",
     "id": "ID",
     "name": "鍚嶇О",
     "code": "缂栫爜",
+    "keyword": "鍏抽敭瀛�",
     "status": "鐘舵��",
+    "type": "绫诲瀷",
     "memo": "澶囨敞",
+    "remark": "澶囨敞",
     "createBy": "鍒涘缓浜�",
     "createTime": "鍒涘缓鏃堕棿",
     "updateBy": "鏇存柊浜�",
@@ -131,7 +157,20 @@
     "wcs": "WCS",
     "source": "鏉ユ簮",
     "supplier": "渚涘簲鍟�",
-    "supplierBatch": "渚涘簲鍟嗘壒娆�"
+    "supplierBatch": "渚涘簲鍟嗘壒娆�",
+    "batch": "鎵规",
+    "quantity": "鏁伴噺",
+    "materialCode": "鐗╂枡缂栫爜",
+    "materialName": "鐗╂枡鍚嶇О",
+    "menuType": "鑿滃崟绫诲瀷",
+    "iconPreview": "鍥炬爣棰勮",
+    "componentKey": "缁勪欢鏍囪瘑",
+    "permissionKey": "鏉冮檺鏍囪瘑",
+    "zebra": "鏂戦┈绾�",
+    "border": "杈规",
+    "headerBackground": "琛ㄥご鑳屾櫙",
+    "topLevelMenu": "椤剁骇鑿滃崟",
+    "emptyText": "鏆傛棤鏁版嵁"
   },
   "search": {
     "placeholder": "鎼滅储椤甸潰",
@@ -637,64 +676,6 @@
       "tokenMetric": "Tokens: prompt {prompt} / completion {completion} / total {total}",
       "streaming": "鐢熸垚涓�"
     }
-  },
-  "table": {
-    "form": {
-      "reset": "閲嶇疆",
-      "submit": "鎻愪氦"
-    },
-    "searchBar": {
-      "reset": "閲嶇疆",
-      "search": "鏌ヨ",
-      "expand": "灞曞紑",
-      "collapse": "鏀惰捣",
-      "searchInputPlaceholder": "璇疯緭鍏�",
-      "searchSelectPlaceholder": "璇烽�夋嫨"
-    },
-    "selection": "閫夋嫨",
-    "sizeOptions": {
-      "small": "绱у噾",
-      "default": "榛樿",
-      "large": "瀹芥澗"
-    },
-    "column": {
-      "selection": "鍕鹃��",
-      "expand": "灞曞紑",
-      "index": "搴忓彿"
-    },
-    "index": "搴忓彿",
-    "id": "ID",
-    "name": "鍚嶇О",
-    "code": "缂栫爜",
-    "keyword": "鍏抽敭瀛�",
-    "operation": "鎿嶄綔",
-    "status": "鐘舵��",
-    "type": "绫诲瀷",
-    "source": "鏉ユ簮",
-    "supplier": "渚涘簲鍟�",
-    "supplierBatch": "渚涘簲鍟嗘壒娆�",
-    "memo": "澶囨敞",
-    "remark": "澶囨敞",
-    "createBy": "鍒涘缓浜�",
-    "updateBy": "鏇存柊浜�",
-    "updateTime": "鏇存柊鏃堕棿",
-    "createTime": "鍒涘缓鏃堕棿",
-    "unit": "鍗曚綅",
-    "batch": "鎵规",
-    "quantity": "鏁伴噺",
-    "materialCode": "鐗╂枡缂栫爜",
-    "materialName": "鐗╂枡鍚嶇О",
-    "wcs": "WCS",
-    "menuType": "鑿滃崟绫诲瀷",
-    "iconPreview": "鍥炬爣棰勮",
-    "componentKey": "缁勪欢鏍囪瘑",
-    "permissionKey": "鏉冮檺鏍囪瘑",
-    "sort": "鎺掑簭",
-    "zebra": "鏂戦┈绾�",
-    "border": "杈规",
-    "headerBackground": "琛ㄥご鑳屾櫙",
-    "topLevelMenu": "椤剁骇鑿滃崟",
-    "emptyText": "鏆傛棤鏁版嵁"
   },
   "message": {
     "requestTimeoutStopped": "璇锋眰瓒呮椂锛屽凡鍋滄绛夊緟",
diff --git a/rsf-design/src/views/auth/login/index.vue b/rsf-design/src/views/auth/login/index.vue
index 2ed47e0..57fe948 100644
--- a/rsf-design/src/views/auth/login/index.vue
+++ b/rsf-design/src/views/auth/login/index.vue
@@ -14,6 +14,7 @@
             ref="formRef"
             :model="formData"
             :rules="rules"
+            :validate-on-rule-change="false"
             :key="formKey"
             @keyup.enter="handleSubmit"
             style="margin-top: 25px"
@@ -74,12 +75,12 @@
               </ElButton>
             </div>
 
-            <div class="mt-5 text-sm text-gray-600">
-              <span>{{ $t('login.noAccount') }}</span>
-              <RouterLink class="text-theme" :to="{ name: 'Register' }">{{
-                $t('login.register')
-              }}</RouterLink>
-            </div>
+<!--            <div class="mt-5 text-sm text-gray-600">-->
+<!--              <span>{{ $t('login.noAccount') }}</span>-->
+<!--              <RouterLink class="text-theme" :to="{ name: 'Register' }">{{-->
+<!--                $t('login.register')-->
+<!--              }}</RouterLink>-->
+<!--            </div>-->
           </ElForm>
         </div>
       </div>
@@ -236,6 +237,8 @@
   onMounted(async () => {
     hydrateRememberedLogin()
     await loadLoginSupports()
+    await nextTick()
+    formRef.value?.clearValidate()
   })
 
   const showLoginSuccessNotice = () => {
diff --git a/rsf-design/src/views/basic-info/bas-station-area/index.vue b/rsf-design/src/views/basic-info/bas-station-area/index.vue
index 562414f..95f6f39 100644
--- a/rsf-design/src/views/basic-info/bas-station-area/index.vue
+++ b/rsf-design/src/views/basic-info/bas-station-area/index.vue
@@ -404,7 +404,9 @@
     } catch (error) {
       detailDrawerVisible.value = false
       detailData.value = {}
-      ElMessage.error(error?.message || t('pages.basicInfo.basStationArea.messages.detailLoadFailed'))
+      ElMessage.error(
+        error?.message || t('pages.basicInfo.basStationArea.messages.detailLoadFailed')
+      )
     } finally {
       detailLoading.value = false
     }
@@ -465,7 +467,9 @@
       )
       await handleShowDialog('edit', detail)
     } catch (error) {
-      ElMessage.error(error?.message || t('pages.basicInfo.basStationArea.messages.detailLoadFailed'))
+      ElMessage.error(
+        error?.message || t('pages.basicInfo.basStationArea.messages.detailLoadFailed')
+      )
     }
   }
 
@@ -563,39 +567,47 @@
       await fetchBasStationAreaPage({
         ...reportQueryParams.value,
         current: 1,
-        pageSize: Number(pagination.total) > 0 ? Number(pagination.total) : Number(payload?.pageSize) || 20
+        pageSize:
+          Number(pagination.total) > 0 ? Number(pagination.total) : Number(payload?.pageSize) || 20
       })
     ).records
   }
 
-  const { previewVisible, previewRows, previewMeta, handlePreviewVisibleChange, handleExport, handlePrint } =
-    usePrintExportPage({
-      downloadFileName: 'bas-station-area.xlsx',
-      requestExport: (payload) =>
-        fetchExportBasStationAreaReport(payload, {
-          headers: {
-            Authorization: userStore.accessToken || ''
-          }
-        }),
-      resolvePrintRecords,
-      buildPreviewRows: (records) =>
-        buildBasStationAreaPrintRows(records, {
-          t,
-          resolveAreaLabel,
-          resolveCrossZoneAreaLabel,
-          resolveContainerTypeLabel,
-          resolveTypeLabel,
-          resolveStationAliasLabel,
-          resolveUseStatusLabel
-        }),
-      buildPreviewMeta
-    })
+  const {
+    previewVisible,
+    previewRows,
+    previewMeta,
+    handlePreviewVisibleChange,
+    handleExport,
+    handlePrint
+  } = usePrintExportPage({
+    downloadFileName: 'bas-station-area.xlsx',
+    requestExport: (payload) =>
+      fetchExportBasStationAreaReport(payload, {
+        headers: {
+          Authorization: userStore.accessToken || ''
+        }
+      }),
+    resolvePrintRecords,
+    buildPreviewRows: (records) =>
+      buildBasStationAreaPrintRows(records, {
+        t,
+        resolveAreaLabel,
+        resolveCrossZoneAreaLabel,
+        resolveContainerTypeLabel,
+        resolveTypeLabel,
+        resolveStationAliasLabel,
+        resolveUseStatusLabel
+      }),
+    buildPreviewMeta
+  })
 
   const resolvedPreviewMeta = computed(() =>
     buildBasStationAreaReportMeta({
       previewMeta: previewMeta.value,
       count: previewRows.value.length,
-      orientation: previewMeta.value?.reportStyle?.orientation || BAS_STATION_AREA_REPORT_STYLE.orientation,
+      orientation:
+        previewMeta.value?.reportStyle?.orientation || BAS_STATION_AREA_REPORT_STYLE.orientation,
       t
     })
   )

--
Gitblit v1.9.1