From 21599300cc73ff7384b74cc5e4ac2cbd82bdc293 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 28 十月 2026 18:34:29 +0800
Subject: [PATCH] feat(wls): 更新销售退货功能支持关联销售出库单

---
 src/packages/effects/layouts/src/authentication/authentication.vue |  377 ++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 322 insertions(+), 55 deletions(-)

diff --git a/src/packages/effects/layouts/src/authentication/authentication.vue b/src/packages/effects/layouts/src/authentication/authentication.vue
index 3410935..ae5fbea 100644
--- a/src/packages/effects/layouts/src/authentication/authentication.vue
+++ b/src/packages/effects/layouts/src/authentication/authentication.vue
@@ -7,7 +7,6 @@
 
 import { Copyright } from '../basic/copyright';
 import AuthenticationFormView from './form.vue';
-import SloganIcon from './icons/slogan.vue';
 import Toolbar from './toolbar.vue';
 
 interface Props {
@@ -43,19 +42,18 @@
  * @zh_CN 鏍规嵁涓婚閫夋嫨鍚堥�傜殑 logo 鍥炬爣
  */
 const logoSrc = computed(() => {
-  // 濡傛灉鏄殫鑹蹭富棰樹笖鎻愪緵浜� logoDark锛屽垯浣跨敤鏆楄壊涓婚鐨� logo
   if (isDark.value && props.logoDark) {
     return props.logoDark;
   }
-  // 鍚﹀垯浣跨敤榛樿鐨� logo
   return props.logo;
 });
+
 </script>
 
 <template>
   <div
     :class="[isDark ? 'dark' : '']"
-    class="flex min-h-full flex-1 overflow-x-hidden select-none"
+    class="agri-auth flex min-h-full flex-1 overflow-x-hidden select-none"
   >
     <template v-if="toolbar">
       <slot name="toolbar">
@@ -65,7 +63,7 @@
     <!-- 宸︿晶璁よ瘉闈㈡澘 -->
     <AuthenticationFormView
       v-if="authPanelLeft"
-      class="min-h-full w-2/5 flex-1"
+      class="agri-left-panel min-h-full w-2/5 flex-1"
       data-side="left"
     >
       <template v-if="copyright" #copyright>
@@ -79,10 +77,10 @@
     </AuthenticationFormView>
 
     <slot name="logo">
-      <!-- 澶撮儴 Logo 鍜屽簲鐢ㄥ悕绉� -->
+      <!-- 澶撮儴 Logo 鍜屽簲鐢ㄥ悕绉帮紙灏忓睆灞曠ず锛屽ぇ灞忕敱鍝佺墝鍖轰唬鏇匡級 -->
       <div
         v-if="logoSrc || appName"
-        class="absolute top-0 left-0 z-10 flex flex-1"
+        class="agri-mini-logo absolute top-0 left-0 z-10 flex flex-1"
         @click="clickLogo"
       >
         <div
@@ -104,34 +102,38 @@
     </slot>
 
     <!-- 绯荤粺浠嬬粛 -->
-    <div v-if="!authPanelCenter" class="relative hidden w-0 flex-1 lg:block">
-      <div
-        class="absolute inset-0 size-full bg-background-deep dark:bg-[#070709]"
-      >
-        <div class="login-background absolute top-0 left-0 size-full"></div>
+    <div v-if="!authPanelCenter" class="relative hidden w-0 flex-[1.18] lg:block">
+      <div class="agri-promo-layer absolute inset-0 size-full overflow-hidden">
         <div
           :key="authPanelLeft ? 'left' : authPanelRight ? 'right' : 'center'"
-          class="mr-20 flex-col-center h-full px-8 text-center"
-          :class="{
-            'enter-x': authPanelLeft,
-            '-enter-x': authPanelRight,
-          }"
+          class="agri-promo relative flex h-full flex-col items-end justify-start px-10 pt-16 text-left"
         >
-          <template v-if="sloganImage">
-            <img
-              :alt="appName"
-              :src="sloganImage"
-              class="h-64 w-2/5 animate-float"
-            />
-          </template>
-          <SloganIcon v-else :alt="appName" class="h-64 w-2/5 animate-float" />
-          <div class="text-1xl mt-6 font-sans text-foreground lg:text-2xl">
-            {{ pageTitle }}
+          <!-- 鍝佺墝鍖� -->
+          <div class="agri-brand">
+            <div class="flex items-center gap-4">
+              <img
+                src="/images/tahe-logo.png"
+                alt="濉旀渤绉嶄笟"
+                class="h-16 w-auto shrink-0 rounded-xl bg-white/95 p-1.5 shadow-lg"
+              />
+              <div>
+                <div class="agri-brand-title text-3xl font-semibold tracking-[0.14em] xl:text-4xl">
+                  {{ pageTitle }}
+                </div>
+                <div class="agri-brand-sub mt-2 text-xs tracking-[0.3em] xl:text-sm">
+                  AGRICULTURE DIGITAL PLATFORM
+                </div>
+              </div>
+            </div>
+            <div class="agri-brand-tag mt-6 flex items-center justify-end gap-4">
+              <span class="agri-brand-tag-line h-px w-12"></span>
+              <span class="text-base tracking-[0.22em]">{{ pageDescription }}</span>
+              <span class="agri-brand-tag-line h-px w-12"></span>
+            </div>
           </div>
-          <div class="mt-2 dark:text-muted-foreground">
-            {{ pageDescription }}
-          </div>
+
         </div>
+
       </div>
     </div>
 
@@ -154,37 +156,302 @@
     </div>
 
     <!-- 鍙充晶璁よ瘉闈㈡澘 -->
-    <AuthenticationFormView
-      v-if="authPanelRight"
-      class="min-h-full w-2/5 flex-1"
-      data-side="right"
-    >
-      <template v-if="copyright" #copyright>
-        <slot name="copyright">
-          <Copyright
-            v-if="preferences.copyright.enable"
-            v-bind="preferences.copyright"
-          />
-        </slot>
-      </template>
-    </AuthenticationFormView>
+    <div v-if="authPanelRight" class="agri-form-wrap relative">
+      <AuthenticationFormView class="agri-form-panel min-h-full w-full" data-side="right" />
+
+      <!-- 鍗$墖鍙充笂鏍戝彾瑁呴グ -->
+      <svg
+        class="pointer-events-none absolute top-0 right-0 h-36 w-40"
+        viewBox="0 0 180 150"
+        aria-hidden="true"
+      >
+        <path d="M180 4c-26 22-38 52-36 92" fill="none" stroke="#4ade80" stroke-width="2" stroke-linecap="round" />
+        <g fill="#4ade80" opacity="0.85">
+          <path d="M160 22q-16-10-30-2 12 12 30 2Z" />
+          <path d="M150 44q-18-6-30 4 14 10 30-4Z" />
+          <path d="M146 70q-18-2-28 10 16 7 28-10Z" />
+          <path d="M146 96q-16 2-24 14 16 4 24-14Z" />
+        </g>
+        <g fill="#86efac" opacity="0.7">
+          <path d="M164 34q4-16 18-22 2 16-18 22Z" />
+          <path d="M156 60q6-14 20-18 0 16-20 18Z" />
+          <path d="M152 86q8-12 22-14-2 16-22 14Z" />
+        </g>
+        <g fill="#bbf7d0" opacity="0.45">
+          <path d="M96 118q-14-8-26-1 10 10 26 1Z" />
+          <path d="M70 136q-12-6-22 0 9 8 22 0Z" />
+        </g>
+      </svg>
+
+      <!-- 鍗$墖搴曢儴鍐滃満鎻掔敾 -->
+      <svg
+        class="agri-farm pointer-events-none absolute inset-x-0 bottom-0 h-24 w-full"
+        viewBox="0 0 560 130"
+        preserveAspectRatio="xMidYMax slice"
+        aria-hidden="true"
+      >
+        <path d="M0 92 Q120 62 260 88 T560 80 V130 H0 Z" fill="#dcfce7" />
+        <path d="M0 112 Q160 88 320 110 T560 104 V130 H0 Z" fill="#bbf7d0" />
+        <g fill="#a7f3d0">
+          <path d="M36 76 L58 58 L80 76 Z" />
+          <rect x="42" y="76" width="32" height="22" fill="#ecfdf5" />
+          <rect x="54" y="84" width="9" height="14" fill="#86efac" />
+        </g>
+        <g>
+          <rect x="116" y="78" width="4" height="16" fill="#86efac" />
+          <circle cx="118" cy="70" r="12" fill="#86efac" />
+          <rect x="146" y="84" width="3.5" height="12" fill="#6ee7b7" />
+          <circle cx="148" cy="78" r="8" fill="#6ee7b7" />
+        </g>
+        <g stroke="#6ee7b7" stroke-width="3" stroke-linecap="round">
+          <path d="M470 100V64" />
+          <path d="M470 64l-14-10M470 64l16-6M470 64l-2 18" />
+        </g>
+        <g fill="#a7f3d0">
+          <path d="M498 82 L514 68 L530 82 Z" />
+          <rect x="503" y="82" width="22" height="16" fill="#ecfdf5" />
+        </g>
+      </svg>
+    </div>
   </div>
 </template>
 
 <style scoped>
-.login-background {
-  background:
-    radial-gradient(circle at 72% 38%, hsl(var(--primary) / 24%), transparent 42%),
-    linear-gradient(145deg, hsl(var(--background-deep)) 0%, hsl(var(--background)) 100%);
-  filter: blur(70px);
+.agri-auth {
+  position: relative;
+  min-height: 100dvh;
+  overflow-y: auto;
+  background-color: #124b39;
+  background-image: url('/agriculture-login-bg.png');
+  background-position: center;
+  background-size: cover;
+  isolation: isolate;
 }
 
-.dark {
-  .login-background {
-    background:
-      radial-gradient(circle at 72% 38%, hsl(var(--primary) / 18%), transparent 42%),
-      linear-gradient(145deg, hsl(var(--background-deep)) 0%, hsl(var(--background)) 100%);
-    filter: blur(70px);
+.login-background {
+  background-image: none;
+  filter: saturate(1.06) contrast(1.01);
+}
+
+.agri-left-panel,
+.agri-left-panel :deep(*) {
+  background-color: transparent !important;
+}
+
+/* 鍝佺墝鏂囧瓧锛氱櫧鑹� + 鏂囧瓧闃村奖淇濊瘉鍦ㄨ儗鏅浘涓婄殑鍙鎬� */
+.agri-brand-title {
+  color: #fff;
+  text-shadow: 0 2px 10px rgba(2, 44, 34, 0.6);
+}
+
+.agri-brand-sub {
+  color: rgba(240, 253, 250, 0.92);
+  text-shadow: 0 1px 6px rgba(2, 44, 34, 0.55);
+}
+
+.agri-brand-tag {
+  color: rgba(240, 253, 250, 0.92);
+  text-shadow: 0 1px 6px rgba(2, 44, 34, 0.55);
+}
+
+.agri-brand-tag-line { background: rgba(167, 243, 208, 0.8); }
+
+/* 澶у睆闅愯棌宸︿笂瑙掑皬 logo锛岀敱鍝佺墝鍖哄睍绀� */
+@media (min-width: 1024px) {
+  .agri-mini-logo {
+    display: none;
+  }
+}
+
+/* ---------- 鍝佺墝涓庡唴瀹� ---------- */
+.agri-promo {
+  max-width: 780px;
+  margin-left: clamp(2rem, 6vw, 7rem);
+  padding-top: 3rem;
+  padding-bottom: 4.5rem;
+}
+
+/* ---------- 鍙充晶鐧诲綍鍗$墖 ---------- */
+.agri-form-wrap {
+  align-self: center;
+  max-height: calc(100dvh - 5rem);
+  margin: 2.5rem clamp(1rem, 4vw, 4.5rem) 2.5rem 1.5rem;
+  width: 40%;
+  flex: 0.82 1 0%;
+  /* 澶栧眰缁熶竴鍦嗚瑁佸壀锛岄伩鍏嶅簳閮ㄦ彃鐢荤瓑鍏勫紵瑁呴グ鎶婂崱鐗囩洿瑙掑寲 */
+  overflow: hidden;
+  border-radius: 1.75rem;
+  box-shadow: 0 24px 70px rgba(2, 44, 34, 0.24);
+}
+
+.agri-form-panel {
+  overflow: auto;
+  border: 1px solid rgba(255, 255, 255, 0.9);
+  border-radius: 1.75rem;
+  background: rgba(250, 253, 251, 0.96) !important;
+  backdrop-filter: blur(18px);
+}
+
+/* 琛ㄥ崟鍐呭涓婄Щ锛屼负搴曢儴鎻掔敾鐣欏嚭绌洪棿 */
+.agri-form-wrap :deep(.side-content) {
+  margin-bottom: 4.5rem;
+}
+
+/* 鏍囬涓嬬殑缁胯壊瑁呴グ鏉� */
+.agri-form-wrap :deep(h2 + p)::after {
+  content: '';
+  display: block;
+  width: 2.75rem;
+  height: 0.28rem;
+  margin-top: 0.8rem;
+  border-radius: 9999px;
+  background: #16a34a;
+}
+
+/* 杈撳叆妗嗗墠缂�鍥炬爣 */
+.agri-form-wrap :deep(input[autocomplete='username']),
+.agri-form-wrap :deep(input[autocomplete='current-password']) {
+  padding-left: 2.6rem;
+  background-repeat: no-repeat;
+  background-position: 0.85rem center;
+  background-size: 1.05rem;
+}
+
+.agri-form-wrap :deep(input[autocomplete='username']) {
+  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2'/%3E%3Ccircle cx='12' cy='7' r='4'/%3E%3C/svg%3E");
+}
+
+.agri-form-wrap :deep(input[autocomplete='current-password']) {
+  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='11' width='18' height='11' rx='2'/%3E%3Cpath d='M7 11V7a5 5 0 0 1 10 0v4'/%3E%3C/svg%3E");
+}
+
+/* 杈撳叆妗嗘暣浣撹川鎰燂細鍔犻珮銆佸渾瑙掋�佹煍鍜岃竟妗嗐�佽仛鐒︾豢鑹插厜鍦� */
+.agri-form-wrap :deep(input) {
+  height: 3rem;
+  border-radius: 0.75rem;
+  border-color: rgba(15, 118, 110, 0.16);
+  background-color: #fff;
+  font-size: 0.95rem;
+  transition: border-color 200ms ease, box-shadow 200ms ease;
+}
+
+.agri-form-wrap :deep(input:hover) {
+  border-color: rgba(16, 185, 129, 0.45);
+}
+
+.agri-form-wrap :deep(input:focus),
+.agri-form-wrap :deep(input:focus-visible) {
+  border-color: #10b981;
+  box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.16);
+  outline: none;
+}
+
+.dark .agri-form-wrap :deep(input) {
+  border-color: rgba(255, 255, 255, 0.16);
+  background-color: rgba(255, 255, 255, 0.06);
+}
+
+.dark .agri-form-wrap :deep(input:focus),
+.dark .agri-form-wrap :deep(input:focus-visible) {
+  border-color: #34d399;
+  box-shadow: 0 0 0 3px rgba(52, 211, 153, 0.2);
+}
+
+@media (max-width: 1023px) {
+  .agri-farm {
+    display: none;
+  }
+}
+
+/* ---------- 鏆楄壊妯″紡 ---------- */
+.dark .login-background {
+  background-image:
+    linear-gradient(90deg, rgba(2, 26, 20, 0.9), rgba(2, 26, 20, 0.62)),
+    url('/agriculture-login-bg.png');
+}
+
+.dark .agri-form-panel {
+  background: rgba(13, 31, 25, 0.96) !important;
+}
+
+.dark .agri-form-wrap > svg {
+  opacity: 0.35;
+}
+
+/* ---------- 鍝嶅簲寮� ---------- */
+@media (max-width: 1023px) {
+  .agri-promo { margin-left: 2rem; }
+  .agri-form-wrap { margin-right: 1.25rem; }
+}
+
+@media (max-height: 720px) and (min-width: 1024px) {
+  .agri-form-wrap {
+    max-height: calc(100dvh - 2rem);
+    margin-top: 1rem;
+    margin-bottom: 1rem;
+  }
+
+  .agri-promo {
+    padding-top: 1.5rem;
+    padding-bottom: 3rem;
+  }
+
+  .agri-promo .mt-12 {
+    margin-top: 2rem;
+  }
+}
+
+@media (max-width: 767px) {
+  .agri-form-wrap {
+    align-self: stretch;
+    margin: 1rem;
+    width: auto;
+    flex: none;
+  }
+
+  .agri-form-panel {
+    border-radius: 1.5rem;
+  }
+}
+
+/* ---------- 鍏ュ満鍔ㄧ敾锛堢函 CSS锛屽姩鐢荤粨鏉熷繀鐒跺仠鐣欎簬鍙鎬侊級 ---------- */
+@media (prefers-reduced-motion: no-preference) {
+  .agri-promo {
+    animation: agri-in-left 0.75s cubic-bezier(0.22, 0.61, 0.36, 1) both;
+  }
+
+  .agri-form-wrap {
+    animation: agri-in-right 0.75s cubic-bezier(0.22, 0.61, 0.36, 1) both;
+  }
+
+}
+
+@keyframes agri-in-left {
+  from {
+    opacity: 0;
+    transform: translateX(-28px);
+  }
+}
+
+@keyframes agri-in-right {
+  from {
+    opacity: 0;
+    transform: translateX(28px);
+  }
+}
+
+@keyframes agri-in-up {
+  from {
+    opacity: 0;
+    transform: translateY(18px);
+  }
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .agri-auth :deep(*) {
+    animation-duration: 0.01ms !important;
+    animation-iteration-count: 1 !important;
+    transition-duration: 0.01ms !important;
   }
 }
 </style>

--
Gitblit v1.9.3