From 5d321660a2f1a4b8756f816283e96481a8c934e4 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 28 十月 2026 14:26:30 +0800
Subject: [PATCH] feat(app): 更新应用名称并优化批次绑定功能

---
 src/views/_core/authentication/login.vue |   66 ++++++++++++++++++++++++++++++--
 1 files changed, 61 insertions(+), 5 deletions(-)

diff --git a/src/views/_core/authentication/login.vue b/src/views/_core/authentication/login.vue
index 883e6ea..80fd448 100644
--- a/src/views/_core/authentication/login.vue
+++ b/src/views/_core/authentication/login.vue
@@ -11,10 +11,15 @@
 
 import { checkCaptcha, getCaptcha } from '#/api/core/auth';
 import { useAuthStore } from '#/store';
+import { selectTerminal, terminalType } from '#/mobile/terminal';
+import { errorText } from '#/mobile/api';
+import { useRoute } from 'vue-router';
 
 defineOptions({ name: 'Login' });
 
 const authStore = useAuthStore();
+const route = useRoute();
+const loginError = ref(route.query.loadError ? '鑿滃崟鍔犺浇澶辫触锛岃閲嶆柊鐧诲綍鍚庨噸璇曘��' : '');
 const captchaEnable = isCaptchaEnable();
 
 const loginRef = ref();
@@ -22,13 +27,24 @@
 
 const captchaType = 'blockPuzzle'; // 楠岃瘉鐮佺被鍨嬶細'blockPuzzle' | 'clickWord'
 
+/** 婊戝潡楠岃瘉鐮佸昂瀵革細绉诲姩绔寜瑙嗗彛瀹藉害鏀剁缉锛岄伩鍏嶈秴鍑哄睆骞曟棤娉曟嫋鍔� */
+const captchaImgSize = computed(() => {
+  const width =
+    terminalType.value === 'mobile'
+      ? Math.min(315, Math.max(260, window.innerWidth - 48))
+      : 400;
+  return { width: `${width}px`, height: `${Math.round(width / 2)}px` };
+});
+
 /** 澶勭悊鐧诲綍 */
 async function handleLogin(values: AuthApi.LoginParams) {
   if (captchaEnable) {
     verifyRef.value.show();
     return;
   }
-  await authStore.authLogin('username', values);
+  loginError.value = '';
+  try { await authStore.authLogin('username', values); }
+  catch (e) { loginError.value = errorText(e); }
 }
 
 /** 楠岃瘉鐮侀�氳繃锛屾墽琛岀櫥褰� */
@@ -37,10 +53,11 @@
 }: {
   captchaVerification: string;
 }) {
-  await authStore.authLogin('username', {
+  loginError.value = '';
+  try { await authStore.authLogin('username', {
     ...(await loginRef.value.getFormApi().getValues()),
     captchaVerification,
-  });
+  }); } catch (e) { loginError.value = errorText(e); }
 }
 
 const formSchema = computed((): VbenFormSchema[] => {
@@ -79,12 +96,36 @@
 
 <template>
   <div>
+    <div class="login-brand">
+      <img
+        src="/images/tahe-logo.png"
+        alt="濉旀渤绉嶄笟"
+        class="login-brand-logo"
+      />
+      <p class="login-brand-name">濉旀渤绉嶄笟鍔犲伐閿�鍞緵搴旈摼鏁板瓧鍖栫鐞嗗钩鍙�</p>
+    </div>
+    <fieldset class="terminal-selector">
+      <legend>閫夋嫨浣跨敤绔�</legend>
+      <div class="terminal-options">
+        <label :class="{ selected: terminalType === 'mobile' }">
+          <input type="radio" name="terminal" value="mobile" :checked="terminalType === 'mobile'" :disabled="authStore.loginLoading" @change="selectTerminal('mobile')" />
+          <span>绉诲姩绔�</span>
+        </label>
+        <label :class="{ selected: terminalType === 'pc' }">
+          <input type="radio" name="terminal" value="pc" :checked="terminalType === 'pc'" :disabled="authStore.loginLoading" @change="selectTerminal('pc')" />
+          <span>PC 绔�</span>
+        </label>
+      </div>
+      <p>宸叉寜灞忓箷澶у皬閫夋嫨锛屽彲鎵嬪姩鍒囨崲</p>
+    </fieldset>
     <AuthenticationLogin
       ref="loginRef"
       :form-schema="formSchema"
       :loading="authStore.loginLoading"
+      :show-field-labels="terminalType === 'mobile'"
+      :submit-button-text="terminalType === 'mobile' ? '鐧诲綍绉诲姩绔�' : '鐧诲綍 PC 绔�'"
       title="娆㈣繋鍥炴潵"
-      sub-title="鐧诲綍绉嶆涓氭暟瀛楀寲骞冲彴锛屽紑鍚櫤鎱х妞�"
+      :sub-title="terminalType === 'mobile' ? '浣跨敤宸叉湁璐﹀彿鐧诲綍鐜板満浣滀笟' : '鐧诲綍濉旀渤绉嶄笟鍔犲伐閿�鍞緵搴旈摼鏁板瓧鍖栫鐞嗗钩鍙�'"
       :show-code-login="false"
       :show-qrcode-login="false"
       :show-third-party-login="false"
@@ -93,15 +134,30 @@
       :show-doc-link="false"
       @submit="handleLogin"
     />
+    <p v-if="loginError" class="login-error" role="alert">{{loginError}}</p>
     <Verification
       ref="verifyRef"
       v-if="captchaEnable"
       :captcha-type="captchaType"
       :check-captcha-api="checkCaptcha"
       :get-captcha-api="getCaptcha"
-      :img-size="{ width: '400px', height: '200px' }"
+      :img-size="captchaImgSize"
       mode="pop"
       @on-success="handleVerifySuccess"
     />
   </div>
 </template>
+
+<style scoped>
+.login-brand { display: flex; flex-direction: column; align-items: center; gap: 8px; margin-bottom: 24px; }
+.login-brand-logo { height: 72px; width: auto; }
+.login-brand-name { margin: 0; text-align: center; font-size: 16px; font-weight: 600; letter-spacing: 0.02em; color: #0f172a; }
+.terminal-selector { border: 0; margin: 0 0 24px; padding: 0; }
+.login-error { padding:12px;color:#b91c1c;background:#fef2f2;border-radius:8px; }
+.terminal-selector legend { font-size: 16px; margin-bottom: 8px; }
+.terminal-options { display: flex; gap: 12px; }
+.terminal-options label { display:flex;align-items:center;justify-content:center;gap:8px;flex:1;min-height:52px;border:1px solid #64748b;border-radius:8px;cursor:pointer; }
+.terminal-options label.selected { border-color:#0369a1;color:#0369a1;background:#f0f9ff; }
+.terminal-options label:focus-within { outline:2px solid #0369a1;outline-offset:2px; }
+.terminal-selector p { margin-top:8px;color:#475569;font-size:14px; }
+</style>

--
Gitblit v1.9.3