zhb 3 주 전
부모
커밋
a7ca80fd64
46개의 변경된 파일861개의 추가작업 그리고 384개의 파일을 삭제
  1. 2 2
      components/cwg-combox.vue
  2. 14 0
      components/cwg-complex-search.vue
  3. 6 5
      components/cwg-empty-state.vue
  4. 13 4
      components/cwg-link.vue
  5. 10 1
      components/cwg-notice-drawer.vue
  6. 3 1
      components/cwg-notice.vue
  7. 31 0
      components/cwg-page-wrapper.vue
  8. 7 14
      components/cwg-payment.vue
  9. 0 3
      components/cwg-pc-header.vue
  10. 10 2
      components/cwg-right-drawer.vue
  11. 154 0
      components/cwg-sidebar-toggle.vue
  12. 21 20
      components/cwg-sidebar.vue
  13. 33 17
      components/cwg-tabel.vue
  14. 16 0
      components/cwg-tips-popup.vue
  15. 32 0
      composables/useLeftSidebarCollapse.ts
  16. 2 2
      config/index.ts
  17. 3 2
      locale/cn.json
  18. 3 1
      pages/activities/monthly-list.vue
  19. 3 1
      pages/activities/surplus-list.vue
  20. 1 1
      pages/analytics/components/List.vue
  21. 55 30
      pages/common/download.vue
  22. 4 2
      pages/customer/components/AccountList.vue
  23. 0 7
      pages/customer/components/TerminalChangePasswordDialog.vue
  24. 2 2
      pages/customer/components/digitalPayConfirmPopup.vue
  25. 0 7
      pages/customer/create-account.vue
  26. 2 2
      pages/customer/dashboard.vue
  27. 22 3
      pages/customer/deposit-select.vue
  28. 47 29
      pages/customer/deposit.vue
  29. 8 9
      pages/customer/recording-history.vue
  30. 7 8
      pages/customer/settings.vue
  31. 3 2
      pages/customer/style.scss
  32. 8 6
      pages/follow/account-management.vue
  33. 8 9
      pages/follow/record.vue
  34. 8 6
      pages/follow/trading-management.vue
  35. 57 18
      pages/ib/components/applyIbDialog.vue
  36. 29 3
      pages/ib/customer.vue
  37. 16 6
      pages/ib/index.vue
  38. 5 3
      pages/login/components/LoginHeaderGroup.vue
  39. 51 33
      pages/login/index.vue
  40. 2 2
      pages/login/regist.vue
  41. 18 9
      pages/mine/components/FileManagementTab.vue
  42. 0 7
      pages/mine/components/SecurityCenterTab.vue
  43. 106 20
      static/scss/global/global.scss
  44. 1 1
      static/svg-icons-lib.js
  45. 3 3
      utils/request.js
  46. 35 81
      windows/left-window.vue

+ 2 - 2
components/cwg-combox.vue

@@ -163,9 +163,9 @@ const handleComboxChange = (text) => {
     display: flex;
     align-items: center;
     //justify-content: center;
-    color: #d5d5d5;
+    color: var(--input-disabled-text-color);
     border: 1px solid #e5e5e5;
     border-radius: 4px;
-    background-color: var(--bs-secondary-bg) !important;
+    background-color: var(--input-disabled-bg-color) !important;
 }
 </style>

+ 14 - 0
components/cwg-complex-search.vue

@@ -457,6 +457,15 @@ onMounted(() => {
         flex: none;
     }
 
+    :deep(.uni-easyinput__content) {
+        height: px2rpx(35) !important;
+        min-height: px2rpx(35) !important;
+    }
+
+    :deep(.uni-easyinput__content-input) {
+        height: px2rpx(35) !important;
+    }
+
     .uni-date {
         width: px2rpx(250) !important;
         flex: none;
@@ -471,7 +480,12 @@ onMounted(() => {
         .reset-btn,
         .search-btn {
             background-color: var(--btn-color);
+            height: px2rpx(35);
+            min-height: px2rpx(35);
             line-height: px2rpx(35);
+            padding: 0 px2rpx(16);
+            margin: 0;
+            box-sizing: border-box;
             font-size: px2rpx(14);
         }
 

+ 6 - 5
components/cwg-empty-state.vue

@@ -29,19 +29,20 @@ const props = defineProps({
   //gap: px2rpx(16);
 
   .img {
-    width: px2rpx(120) !important;
-    height: px2rpx(120) !important;
+    width: px2rpx(80) !important;
+    height: px2rpx(80) !important;
     flex-shrink: 0;
   }
 
   .title {
     color: var(--bs-emphasis-color);
     font-family: Roboto;
-    font-size: px2rpx(18);
+    font-size: px2rpx(16);
     font-style: normal;
     font-weight: bold;
-    line-height: px2rpx(44);
-    margin-bottom: px2rpx(8);
+    line-height: px2rpx(24);
+    margin-top: px2rpx(12);
+    margin-bottom: 0;
   }
 
   .text {

+ 13 - 4
components/cwg-link.vue

@@ -1,7 +1,12 @@
 <template>
   <!-- #ifdef H5 -->
   <!-- H5 端:支持普通跳转 / PDF预览 / 文件下载 -->
-  <a v-if="isDownload" class="pdf-link" :href="url" :download="downloadName" target="_blank">
+  <a v-if="isDownload" class="pdf-link" :href="url" :download="downloadName" target="_blank" :title="resolvedTitle">
+    <slot v-if="slots['default']"></slot>
+    <view v-else>{{ t(props.title) || props.title }}</view>
+  </a>
+  <a v-else-if="isHtml" class="pdf-link" :href="url" :target="target || '_blank'" :title="resolvedTitle"
+    rel="noopener noreferrer">
     <slot v-if="slots['default']"></slot>
     <view v-else>{{ t(props.title) || props.title }}</view>
   </a>
@@ -21,7 +26,7 @@
 </template>
 
 <script setup>
-import { useSlots } from 'vue'
+import { computed, useSlots } from 'vue'
 import { openLocalPdf } from '@/utils/pdf'
 import { openExternalUrl } from '@/utils/openExternalUrl'
 import { useI18n } from 'vue-i18n'
@@ -40,9 +45,13 @@ const props = defineProps({
   // 下载文件名(下载时必填)
   downloadName: String
 })
-    // console.log(props, 1111);
-// 判断是否是下载类型
+
 const isDownload = props.type === 'download'
+const isHtml = props.type === 'html'
+const resolvedTitle = computed(() => {
+  if (!props.title) return undefined
+  return t(props.title)
+})
 
 const handleClick = () => {
   if (!props.url) return

+ 10 - 1
components/cwg-notice-drawer.vue

@@ -12,7 +12,9 @@
                     </view>
                 </view>
             </view>
-            <cwg-empty-state v-else />
+            <view class="list-empty-state drawer-empty-state" v-else>
+                <cwg-empty-state />
+            </view>
             <view class="logout-wrap">
                 <view class="logout-btn" @click="goMore">
                     <cwg-icon name="logout" :size="16" color="#97A1C0" />
@@ -89,6 +91,13 @@ defineExpose({
 
 .notification-list {
     width: 100%;
+    flex: 1;
+    overflow-y: auto;
+}
+
+.drawer-empty-state {
+    flex: 1;
+    min-height: px2rpx(240);
 }
 
 .notification-item {

+ 3 - 1
components/cwg-notice.vue

@@ -28,7 +28,9 @@
                         </view>
                     </view>
 
-                    <cwg-empty-state v-else />
+                    <view class="list-empty-state-compact" v-else>
+                        <cwg-empty-state />
+                    </view>
                     <view class="p-2">
                         <view @click="goMore" class="btn w-100 btn-danger waves-effect waves-light " v-t="'News.More'">
                         </view>

+ 31 - 0
components/cwg-page-wrapper.vue

@@ -52,6 +52,12 @@
       <cwg-footer-link />
     </cwg-match-media>
 
+    <cwg-match-media :min-width="992" v-if="!isLoginPage">
+      <view class="desktop-sidebar-toggle-fixed" :style="toggleFixedStyle">
+        <cwg-sidebar-toggle />
+      </view>
+    </cwg-match-media>
+
   </view>
 </template>
 
@@ -72,8 +78,20 @@ import { customApi } from '@/service/custom'
 import tool from "@/global/tool"
 import LiveChatService from '@/utils/liveChat.js'
 import { useWindowWidth } from '@/composables/useWindowWidth'
+import { useLeftSidebarCollapse } from '@/composables/useLeftSidebarCollapse'
 const windowWidth = useWindowWidth(300)
 const isMobile = computed(() => windowWidth.value <= 991)
+const { isCollapsed, syncCollapsedFromDom } = useLeftSidebarCollapse()
+
+const SIDEBAR_WIDTH_EXPANDED = 280
+const SIDEBAR_WIDTH_COLLAPSED = 64
+
+const toggleFixedStyle = computed(() => {
+  const width = isCollapsed.value ? SIDEBAR_WIDTH_COLLAPSED : SIDEBAR_WIDTH_EXPANDED
+  return {
+    left: `${width}px`,
+  }
+})
 const { t, locale } = useI18n()
 const globalStore = useGlobalStore()
 const router = useRouter()
@@ -282,6 +300,7 @@ const pushToSingle = (newsType: number) => {
 }
 
 onMounted(() => {
+  syncCollapsedFromDom()
   // 只在组件挂载时注册事件监听器
   uni.$once('open-ib', handleOpenIb)
   uni.$on('open-right-drawer', handleOpenRightDrawer)
@@ -573,4 +592,16 @@ onShow(() => {
     opacity: 1;
   }
 }
+
+.desktop-sidebar-toggle-fixed {
+  position: fixed;
+  top: 56px;
+  z-index: 120;
+  display: flex;
+  align-items: center;
+  height: 48px;
+  padding: 0 8px;
+  box-sizing: border-box;
+  transition: left 281ms cubic-bezier(0.4, 0, 0.2, 1);
+}
 </style>

+ 7 - 14
components/cwg-payment.vue

@@ -28,8 +28,8 @@
 
           </view>
           <view class="drawer-actions">
-            <button class=" action-btn" @click.stop="goPages(1)" v-t="'wallet.item6'"></button>
-            <button class="action-btn" @click.stop="goPages(2)" v-t="'wallet.item7'"></button>
+            <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goPages(1)" v-t="'wallet.item6'"></button>
+            <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goPages(2)" v-t="'wallet.item7'"></button>
           </view>
         </view>
         <view class="right-drawer custom-payment-drawer" v-if="mode === 'ib'">
@@ -46,9 +46,9 @@
 
           </view>
           <view class="drawer-actions">
-            <button class="action-btn" @click.stop="goIbPages(1)" v-t="'Custom.Index.Withdrawals'"></button>
-            <button class="action-btn" @click.stop="goIbPages(2)" v-t="'Home.page_ib.item4'"></button>
-            <button class="action-btn" @click.stop="goIbPages(3)" v-t="'Ib.Transfer.CommissionIssue'"></button>
+            <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goIbPages(1)" v-t="'Custom.Index.Withdrawals'"></button>
+            <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goIbPages(2)" v-t="'Home.page_ib.item4'"></button>
+            <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goIbPages(3)" v-t="'Ib.Transfer.CommissionIssue'"></button>
           </view>
         </view>
         <view class="right-drawer custom-payment-drawer" v-if="mode === 'follow'">
@@ -61,7 +61,7 @@
 
           </view>
           <view class="drawer-actions">
-            <button class="action-btn" @click.stop="goFollowPages(1)" v-t="'Documentary.console.item17'"></button>
+            <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goFollowPages(1)" v-t="'Documentary.console.item17'"></button>
           </view>
         </view>
       </template>
@@ -369,20 +369,13 @@ onUnmounted(() => {
         flex: 1;
         height: px2rpx(36);
         line-height: px2rpx(36);
-        background-color: #f5f5f5;
-        border: 1px solid #97A1C0;
-        color: var(--bs-heading-color);
         font-size: px2rpx(13);
-        border-radius: px2rpx(6);
         margin: 0;
+        padding: 0 px2rpx(8);
 
         &::after {
           border: none;
         }
-
-        &:active {
-          background-color: #e4e7ed;
-        }
       }
     }
   }

+ 0 - 3
components/cwg-pc-header.vue

@@ -12,9 +12,6 @@
 					@click="openLeftDrawer" />
 			</div>
 			<div class="right">
-        <!-- #ifndef APP-PLUS -->
-        <cwg-system />
-        <!-- #endif  -->
 				<cwg-notice />
 				<cwg-right-drawer />
 			</div>

+ 10 - 2
components/cwg-right-drawer.vue

@@ -21,9 +21,9 @@
                         <view class="dropdown-divider my-1"></view>
                     </view>
                     <view v-for="item in menuList" :key="item.id">
-                        <view class="dropdown-item d-flex align-items-center gap-2 cursor-pointer"
+                        <view class="dropdown-item user-menu-item d-flex align-items-center gap-2 cursor-pointer"
                             @click="handleNavigate(item.path)">
-                            <cwg-icon :name="item.icon" :size="16" color="#97A1C0" />
+                            <cwg-icon :name="item.icon" :size="16" color="#000" />
                             <text v-t="item.name"></text>
                         </view>
                     </view>
@@ -182,6 +182,14 @@ defineExpose({ openNotice, close })
         position: relative;
     }
 
+    .user-menu-item {
+        color: var(--bs-emphasis-color);
+
+        text {
+            color: var(--bs-emphasis-color);
+        }
+    }
+
     .right-drawer {
         width: px2rpx(300);
         background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;

+ 154 - 0
components/cwg-sidebar-toggle.vue

@@ -0,0 +1,154 @@
+<template>
+  <view class="sidebar-toggle-wrap">
+    <uni-tooltip :content="toggleLabel" placement="right">
+      <view class="sidebar-toggle-btn" @click="toggleLeftSidebar">
+        <view class="sidebar-toggle-icon" :class="{ collapsed: isCollapsed }">
+          <span class="toggle-bar toggle-bar-top"></span>
+          <span class="toggle-bar toggle-bar-mid">
+            <span class="toggle-arrow"></span>
+          </span>
+          <span class="toggle-bar toggle-bar-bottom"></span>
+        </view>
+      </view>
+    </uni-tooltip>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { computed, onMounted } from 'vue'
+import { useI18n } from 'vue-i18n'
+import { useLeftSidebarCollapse } from '@/composables/useLeftSidebarCollapse'
+
+const { t } = useI18n()
+const { toggleLeftSidebar, syncCollapsedFromDom, isCollapsed } = useLeftSidebarCollapse()
+
+const toggleLabel = computed(() =>
+  isCollapsed.value ? t('Home.msg.sidebarExpand') : t('Home.msg.sidebarCollapse')
+)
+
+onMounted(() => {
+  syncCollapsedFromDom()
+})
+</script>
+
+<style scoped lang="scss">
+@import "@/uni.scss";
+
+.sidebar-toggle-wrap {
+  :deep(.uni-tooltip-popup) {
+    width: auto !important;
+    padding: 4px 8px;
+    white-space: nowrap;
+    line-height: 1.4;
+  }
+}
+
+.sidebar-toggle-btn {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: px2rpx(36);
+  height: px2rpx(36);
+  cursor: pointer;
+  flex-shrink: 0;
+  background: transparent;
+  border: none;
+}
+
+.sidebar-toggle-icon {
+  width: 18px;
+  height: 14px;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+
+  .toggle-bar {
+    display: block;
+    height: 2px;
+    background-color: #97A1C0;
+    border-radius: 2px;
+    transition: width 0.28s cubic-bezier(0.4, 0, 0.2, 1),
+      margin 0.28s cubic-bezier(0.4, 0, 0.2, 1),
+      transform 0.28s cubic-bezier(0.4, 0, 0.2, 1);
+  }
+
+  .toggle-bar-top,
+  .toggle-bar-bottom {
+    width: 100%;
+  }
+
+  .toggle-bar-mid {
+    position: relative;
+    width: 100%;
+    margin-left: 0;
+  }
+
+  .toggle-arrow {
+    position: absolute;
+    left: 0;
+    top: 50%;
+    width: 100%;
+    height: 2px;
+    background-color: #97A1C0;
+    border-radius: 2px;
+    transform: translateY(-50%);
+    transform-origin: left center;
+    transition: width 0.28s cubic-bezier(0.4, 0, 0.2, 1),
+      left 0.28s cubic-bezier(0.4, 0, 0.2, 1),
+      transform 0.28s cubic-bezier(0.4, 0, 0.2, 1);
+
+    &::before {
+      content: '';
+      position: absolute;
+      top: 50%;
+      width: 6px;
+      height: 6px;
+      border-left: 2px solid #97A1C0;
+      border-bottom: 2px solid #97A1C0;
+      transform: translateY(-50%) rotate(45deg);
+      transform-origin: center;
+      transition: transform 0.28s cubic-bezier(0.4, 0, 0.2, 1),
+        left 0.28s cubic-bezier(0.4, 0, 0.2, 1),
+        right 0.28s cubic-bezier(0.4, 0, 0.2, 1),
+        opacity 0.28s cubic-bezier(0.4, 0, 0.2, 1);
+    }
+  }
+
+  &:not(.collapsed) {
+    .toggle-bar-mid {
+      width: 100%;
+      margin-left: 0;
+    }
+
+    .toggle-arrow {
+      padding-left: 8px;
+      box-sizing: border-box;
+
+      &::before {
+        left: 0;
+        right: auto;
+        opacity: 1;
+        transform: translateY(-50%) rotate(45deg);
+      }
+    }
+  }
+
+  &.collapsed {
+    .toggle-bar-mid {
+      width: 55%;
+      margin-left: 45%;
+    }
+
+    .toggle-arrow {
+      padding-left: 0;
+
+      &::before {
+        left: auto;
+        right: 0;
+        opacity: 1;
+        transform: translateY(-50%) rotate(-135deg);
+      }
+    }
+  }
+}
+</style>

+ 21 - 20
components/cwg-sidebar.vue

@@ -41,16 +41,16 @@
         </view>
 
         <view class="wallet-actions" v-if="mode === 'customer'">
-          <button class="action-btn" @click.stop="goPages(1)" v-t="'wallet.item6'"></button>
-          <button class="action-btn" @click.stop="goPages(2)" v-t="'wallet.item7'"></button>
+          <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goPages(1)" v-t="'wallet.item6'"></button>
+          <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goPages(2)" v-t="'wallet.item7'"></button>
         </view>
         <view class="wallet-actions" v-if="mode === 'ib'">
-          <button class="action-btn" @click.stop="goIbPages(1)" v-t="'Custom.Index.Withdrawals'"></button>
-          <button class="action-btn" @click.stop="goIbPages(2)" v-t="'Home.page_ib.item4'"></button>
+          <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goIbPages(1)" v-t="'Custom.Index.Withdrawals'"></button>
+          <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goIbPages(2)" v-t="'Home.page_ib.item4'"></button>
           <!--                  <button class="action-btn" @click.stop="goIbPages(3)" v-t="'Ib.Transfer.CommissionIssue'"></button>-->
         </view>
         <view class="wallet-actions" v-if="mode === 'follow'">
-          <button class="action-btn" @click.stop="goFollow()" v-t="'Documentary.console.item17'"></button>
+          <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goFollow()" v-t="'Documentary.console.item17'"></button>
         </view>
       </view>
     </view>
@@ -78,19 +78,19 @@
       <view
         class="menu-item btn-outline-danger btn btn-app-nav  btn-shadow mb-2 w-100 waves-effect ib-box btn-mode menu-item ib-box"
         @click="setMode('customer')" v-if="mode !== 'customer'">
-        <cwg-icon name="crm-trade" :size="20" :color="'#EE1C25'" />
+        <cwg-icon name="crm-trade" :size="20" color="#000" />
         <view class="menu-label" v-t="'Home.msg.Custom'" />
       </view>
       <view
         class="menu-item btn-outline-danger btn btn-app-nav  btn-shadow mb-2 w-100 waves-effect ib-box btn-mode menu-item ib-box"
         @click="setMode('ib')" v-if="mode !== 'ib' && ibStatus">
-        <cwg-icon name="crm-ib" :size="20" :color="'#EE1C25'" />
+        <cwg-icon name="crm-ib" :size="20" color="#000" />
         <view class="menu-label" v-t="'Home.msg.Ib'" />
       </view>
       <view
         class="menu-item btn-outline-danger btn btn-app-nav  btn-shadow mb-2 w-100 waves-effect ib-box btn-mode menu-item ib-box"
         @click="setMode('follow')" v-if="mode !== 'follow'">
-        <cwg-icon name="crm-gd" :size="20" :color="'#EE1C25'" />
+        <cwg-icon name="crm-gd" :size="20" color="#000" />
         <view class="menu-label" v-t="'Documentary.title'" />
       </view>
     </view>
@@ -398,20 +398,13 @@ onUnmounted(() => {
           flex: 1;
           height: px2rpx(32);
           line-height: px2rpx(32);
-          background-color: #f5f5f5;
-          border: 1px solid #97A1C0;
-          color: var(--bs-heading-color);
           font-size: 13px;
-          border-radius: px2rpx(4);
           margin: 0;
+          padding: 0 px2rpx(8);
 
           &::after {
             border: none;
           }
-
-          &:active {
-            background-color: #e4e7ed;
-          }
         }
       }
     }
@@ -482,12 +475,20 @@ onUnmounted(() => {
     align-items: center;
     gap: px2rpx(8);
     display: flex;
-    //color: #fff;
+    color: var(--bs-emphasis-color);
+
+    :deep(.zui-svg-icon-image) {
+      transition: filter 0.15s ease;
+    }
 
     &:hover {
-      // color: var(--bs-btn-hover-color);
-      // background-color: var(--bs-btn-hover-bg);
-      // border-color: var(--bs-btn-hover-border-color);
+      color: var(--bs-btn-hover-color);
+      background-color: var(--bs-btn-hover-bg);
+      border-color: var(--bs-btn-hover-border-color);
+
+      :deep(.zui-svg-icon-image) {
+        filter: brightness(0) invert(1);
+      }
     }
   }
 

+ 33 - 17
components/cwg-tabel.vue

@@ -2,6 +2,7 @@
     <view>
         <!-- 统一表格容器,根据屏幕宽度自适应 -->
         <view class="table-container" :class="{ 'mobile-table': isMobile }">
+            <view class="table-body-area" :class="{ 'is-empty': !loading && tableData.length === 0, 'is-loading': loading }">
             <uni-table :type="selectionType" :border="false" @selection-change="handleSelectionChange" emptyText="">
                 <!-- 表头:根据设备类型显示不同的列 -->
                 <uni-tr class="table-header">
@@ -16,16 +17,8 @@
                         </view>
                     </uni-th>
                 </uni-tr>
-              <view v-if="loading" class="empty-state">
-                <uni-loading  />
-              </view>
-              <!-- 空状态 -->
-              <view v-if="!loading && tableData.length === 0" class="empty-state">
-
-                <cwg-empty-state v-if="!loading && tableData.length === 0" />
-              </view>
                 <!-- 表格主体 -->
-              <template v-else>
+              <template v-if="!loading && tableData.length > 0">
                 <template v-for="(row, rowIndex) in tableData" :key="rowIndex">
                   <uni-tr>
                     <!-- 数据列:根据设备类型动态渲染 -->
@@ -114,6 +107,13 @@
               </template>
 
             </uni-table>
+            <view v-if="loading" class="table-empty-state">
+                <uni-loading />
+            </view>
+            <view v-else-if="tableData.length === 0" class="table-empty-state">
+                <cwg-empty-state />
+            </view>
+            </view>
         </view>
 
 
@@ -781,6 +781,30 @@ defineExpose({
     color: var(--color-slate-800);
   box-shadow: none;
 
+    .table-body-area {
+        display: flex;
+        flex-direction: column;
+        min-height: px2rpx(360);
+
+        &.is-empty,
+        &.is-loading {
+            :deep(.uni-table-scroll) {
+                flex-shrink: 0;
+                overflow: visible;
+            }
+        }
+    }
+
+    .table-empty-state {
+        flex: 1;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        min-height: px2rpx(280);
+        padding: px2rpx(24) px2rpx(20) px2rpx(40);
+        box-sizing: border-box;
+    }
+
     .action-wrapper {
         display: flex;
         justify-content: center;
@@ -1143,14 +1167,6 @@ defineExpose({
         gap: px2rpx(10);
     }
 }
-.empty-state{
-  width: 100%;
-  height: 100%;
-  position: absolute;
-  left: 50%;
-  top: 60%;
-  transform: translate(-50%, 0);
-}
 .morebox{
   width: 100%;
   height: 100%;

+ 16 - 0
components/cwg-tips-popup.vue

@@ -63,6 +63,22 @@ const tosubmitConfirm = () => {
 
 <style lang="scss" scoped>
 .popup-content {
+    text-align: left;
+
+    .des1 {
+        text-align: left;
+    }
+
+    :deep(.popup-text),
+    :deep(rich-text),
+    :deep(p),
+    :deep(div),
+    :deep(ol),
+    :deep(ul),
+    :deep(li) {
+        text-align: left !important;
+    }
+
     p {
         text-align: left;
     }

+ 32 - 0
composables/useLeftSidebarCollapse.ts

@@ -0,0 +1,32 @@
+import { ref } from 'vue'
+
+const isCollapsed = ref(false)
+
+function syncCollapsedFromDom() {
+  if (typeof document === 'undefined') return
+  const leftWindow = document.querySelector('uni-left-window')
+  isCollapsed.value = leftWindow?.classList.contains('collapsed') ?? false
+}
+
+function toggleLeftSidebar() {
+  isCollapsed.value = !isCollapsed.value
+  const leftWindow = document.querySelector('uni-left-window')
+  const content = document.querySelector('uni-content')
+  if (!leftWindow || !content) return
+
+  if (isCollapsed.value) {
+    leftWindow.classList.add('collapsed')
+    content.classList.add('collapsed')
+  } else {
+    leftWindow.classList.remove('collapsed')
+    content.classList.remove('collapsed')
+  }
+}
+
+export function useLeftSidebarCollapse() {
+  return {
+    isCollapsed,
+    toggleLeftSidebar,
+    syncCollapsedFromDom,
+  }
+}

+ 2 - 2
config/index.ts

@@ -1,8 +1,8 @@
 // #ifdef H5
 let [p, h] = [window.location.protocol, window.location.host];
 let isIP = /^\d+\.\d+\.\d+\.\d+:\d+$/.test(h);
-let [ho, dt] = isIP ? ['44a5c8109e4', 'com'] : h.split('.').slice(-2);
-// let [ho, dt] = isIP ? ['cwgvu', 'club'] : h.split('.').slice(-2);
+// let [ho, dt] = isIP ? ['44a5c8109e4', 'com'] : h.split('.').slice(-2);
+let [ho, dt] = isIP ? ['cwgvu', 'club'] : h.split('.').slice(-2);
 let ht = p == 'http:' ? 'https:' : p;
 console.log(ho, dt, ht, 1009);
 // #else

+ 3 - 2
locale/cn.json

@@ -28,7 +28,6 @@
       "t3": "总存款",
       "t4": "总取款"
     }
-
   },
   "common": {
     "confirm": "确认",
@@ -1172,7 +1171,9 @@
       "content4": "您已经提交申请,请耐心等待审核通过",
       "item1": "最新活动",
       "item2": "今日不再推送",
-      "item3": "关闭"
+      "item3": "关闭",
+      "sidebarExpand": "展开",
+      "sidebarCollapse": "缩放"
     }
   },
   "PersonalManagement": {

+ 3 - 1
pages/activities/monthly-list.vue

@@ -5,7 +5,9 @@
         <view id="custom_history" class="">
             <view class="main-content">
                 <!-- 无任务列表提示 -->
-                <cwg-empty-state v-if="!tableData || tableData.length === 0" title="UtaskList.item12" />
+                <view class="list-empty-state" v-if="!tableData || tableData.length === 0">
+                    <cwg-empty-state title="UtaskList.item12" />
+                </view>
                 <!-- 数据卡片展示 -->
                 <view class="outer-card" v-for="(item, index) in tableData" :key="index"
                     v-show="tableData && tableData.length > 0">

+ 3 - 1
pages/activities/surplus-list.vue

@@ -5,7 +5,9 @@
 
             <view class="main-content">
                 <!-- 无任务列表提示 -->
-                <cwg-empty-state v-if="!tableData || tableData.length === 0" title="UtaskList.item12" />
+                <view class="list-empty-state" v-if="!tableData || tableData.length === 0">
+                    <cwg-empty-state title="UtaskList.item12" />
+                </view>
                 <!-- 数据卡片展示 -->
                 <view class="outer-card" v-for="(item, index) in tableData" :key="index"
                     v-show="tableData && tableData.length > 0">

+ 1 - 1
pages/analytics/components/List.vue

@@ -54,7 +54,7 @@
     </view>
 
     <!-- 空状态 -->
-    <view v-else-if="!loading && list.length === 0" class="empty">
+    <view v-else-if="!loading && list.length === 0" class="list-empty-state empty">
       <cwg-empty-state />
     </view>
     <view class="table-loading-mask">

+ 55 - 30
pages/common/download.vue

@@ -34,7 +34,8 @@
                                         <view class="col-lg-4 mb-5">
                                           <cwg-link type="download"
                                                     :url="config.Host80 + '/mt/cwgmarketssvgltd4setup.exe'"
-                                                    downloadName="cwgmarketssvgltd4setup.exe">
+                                                    downloadName="cwgmarketssvgltd4setup.exe"
+                                                    title="Downloadpage.item4">
 
                                             <view class="card card-action action-elevate action-border-primary">
                                                 <view class="row g-0">
@@ -67,7 +68,8 @@
                                         <view class="col-lg-4 mb-5">
                                           <cwg-link type="download" class="download-card"
                                                     :url="config.Host80 + '/mt/mt4.zip'"
-                                                    downloadName="mt4.zip">
+                                                    downloadName="mt4.zip"
+                                                    title="Downloadpage.item4-1">
 <!--                                            <view class="btn btn-danger waves-effect waves-light">-->
 <!--                                              <i class="fi fi-rr-download"></i> {{-->
 <!--                                                t('Downloadpage.item6-1') }}-->
@@ -101,7 +103,8 @@
                                         <view class="col-lg-4 mb-5">
                                           <cwg-link type="download" class="download-card"
                                                     :url="config.Host80 + '/mt/MetaTrader4.pkg'"
-                                                    downloadName="MetaTrader4.pkg">
+                                                    downloadName="MetaTrader4.pkg"
+                                                    title="Downloadpage.item6">
 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
 <!--                                              class="fi fi-rr-download"></i> {{-->
 <!--                                                t('Downloadpage.item6-1') }}</view>-->
@@ -133,7 +136,8 @@
                                         <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item38'" />
                                         <view class="col-lg-4 mb-5">
                                           <cwg-link type="html" target="_blank"
-                                                    :url="'https://www.' + config.host + '.com/' + locale + '/vu-mt4-web-trading/web'">
+                                                    :url="'https://www.' + config.host + '.com/' + locale + '/vu-mt4-web-trading/web'"
+                                                    title="Downloadpage.item38">
 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
 <!--                                              class="fi fi-rr-download"></i> 开始交易</view>-->
 
@@ -163,7 +167,8 @@
                                         <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item7'" />
                                         <view class="col-lg-6 mb-5">
                                           <cwg-link type="download" class="download-card" :url="mt41"
-                                                    downloadName="MetaTrader4.abb">
+                                                    downloadName="MetaTrader4.abb"
+                                                    title="Downloadpage.item9">
 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
 <!--                                              class="fi fi-rr-download"></i> {{-->
 <!--                                                t('Downloadpage.item6-1') }}</view>-->
@@ -171,8 +176,8 @@
                                             <view class="card card-action action-elevate action-border-primary">
                                                 <view class="row g-0">
                                                     <view class="col-md-6">
-                                                        <view class="card-header border-0 p-0 m-2 position-relative ">
-                                                            <QrCode :text="mt42" />
+                                                        <view class="card-header border-0 download-qr-header position-relative">
+                                                            <QrCode :text="mt42" :width="qrSize" :height="qrSize" />
                                                             <!-- <image src="/static/images/vu/android.png" alt=""
                                                                 mode="widthFix" class="img-fluid" /> -->
                                                         </view>
@@ -194,7 +199,8 @@
                                         </view>
                                         <view class="col-lg-6 mb-5">
                                           <cwg-link type="download" class="download-card" :url="mt42"
-                                                    downloadName="MetaTrader4.apk">
+                                                    downloadName="MetaTrader4.apk"
+                                                    title="Downloadpage.item9">
 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
 <!--                                              class="fi fi-rr-download"></i> {{-->
 <!--                                                t('Downloadpage.item6-1') }}</view>-->
@@ -202,9 +208,8 @@
                                             <view class="card card-action action-elevate action-border-primary">
                                                 <view class="row g-0">
                                                     <view class="col-md-6">
-                                                        <view
-                                                            class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
-                                                            <QrCode :text="mt42" />
+                                                        <view class="card-header border-0 download-qr-header position-relative overflow-hidden">
+                                                            <QrCode :text="mt42" :width="qrSize" :height="qrSize" />
                                                             <!-- <image src="/static/images/vu/metatrade.png" alt=""
                                                                 mode="widthFix" class="img-fluid" /> -->
                                                         </view>
@@ -225,7 +230,8 @@
                                         </view>
                                         <view class="col-lg-6 mb-5">
                                           <cwg-link type="download" class="download-card" :url="mt43"
-                                                    downloadName="MetaTrader4.app">
+                                                    downloadName="MetaTrader4.app"
+                                                    title="Downloadpage.item10">
 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
 <!--                                              class="fi fi-rr-download"></i> {{-->
 <!--                                                t('Downloadpage.item6-1') }}</view>-->
@@ -233,9 +239,8 @@
                                             <view class="card card-action action-elevate action-border-primary">
                                                 <view class="row g-0">
                                                     <view class="col-md-6">
-                                                        <view
-                                                            class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
-                                                            <QrCode :text="mt43" />
+                                                        <view class="card-header border-0 download-qr-header position-relative overflow-hidden">
+                                                            <QrCode :text="mt43" :width="qrSize" :height="qrSize" />
                                                             <!-- <image src="/static/images/vu/ios-1.png" alt=""
                                                                 mode="widthFix" class="img-fluid" /> -->
                                                         </view>
@@ -265,7 +270,8 @@
                                         <view class="col-lg-4 mb-5">
                                           <cwg-link type="download" class="download-card"
                                                     :url="config.Host80 + '/mt/cwgmarketssvg5setup.exe'"
-                                                    downloadName="cwgmarketssvg5setup.exe">
+                                                    downloadName="cwgmarketssvg5setup.exe"
+                                                    title="Downloadpage.item4">
 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
 <!--                                              class="fi fi-rr-download"></i> {{-->
 <!--                                                t('Downloadpage.item6-1') }}</view>-->
@@ -298,7 +304,8 @@
                                         <view class="col-lg-4 mb-5">
                                           <cwg-link type="download" class="download-card"
                                                     :url="config.Host80 + '/mt/mt5.zip'"
-                                                    downloadName="mt5.zip">
+                                                    downloadName="mt5.zip"
+                                                    title="Downloadpage.item4-1">
 <!--                                            <view class="btn btn-danger waves-effect waves-light">-->
 <!--                                              <i class="fi fi-rr-download"></i> {{-->
 <!--                                                t('Downloadpage.item6-1') }}-->
@@ -332,7 +339,8 @@
                                         <view class="col-lg-4 mb-5">
                                           <cwg-link type="download" class="download-card"
                                                     :url="config.Host80 + '/mt/MetaTrader5.pkg'"
-                                                    downloadName="MetaTrader5.pkg">
+                                                    downloadName="MetaTrader5.pkg"
+                                                    title="Downloadpage.item6">
 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
 <!--                                              class="fi fi-rr-download"></i> {{-->
 <!--                                                t('Downloadpage.item6-1') }}</view>-->
@@ -365,7 +373,8 @@
                                         <view class="col-lg-4 mb-5">
                                           <cwg-link type="html"
                                                     class="download-card download-card-web" target="_blank"
-                                                    :url="'https://www.' + config.host + '.com/' + locale + '/mt5/web'">
+                                                    :url="'https://www.' + config.host + '.com/' + locale + '/mt5/web'"
+                                                    title="Downloadpage.item39">
 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
 <!--                                              class="fi fi-rr-download"></i> 开始交易</view>-->
 
@@ -395,7 +404,8 @@
                                         <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item13'" />
                                         <view class="col-lg-6 mb-5">
                                           <cwg-link type="download" class="download-card" :url="mt51"
-                                                    downloadName="MetaTrader5.abb">
+                                                    downloadName="MetaTrader5.abb"
+                                                    title="Downloadpage.item14">
 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
 <!--                                              class="fi fi-rr-download"></i> {{-->
 <!--                                                t('Downloadpage.item6-1') }}</view>-->
@@ -403,8 +413,8 @@
                                             <view class="card card-action action-elevate action-border-primary">
                                                 <view class="row g-0">
                                                     <view class="col-md-6">
-                                                        <view class="card-header border-0 p-0 m-2 position-relative ">
-                                                            <QrCode :text="mt52" />
+                                                        <view class="card-header border-0 download-qr-header position-relative">
+                                                            <QrCode :text="mt52" :width="qrSize" :height="qrSize" />
                                                             <!-- <image src="/static/images/vu/android.png" alt=""
                                                                 mode="widthFix" class="img-fluid" /> -->
                                                         </view>
@@ -426,7 +436,8 @@
                                         </view>
                                         <view class="col-lg-6 mb-5">
                                           <cwg-link type="download" class="download-card" :url="mt52"
-                                                    downloadName="MetaTrader5.apk">
+                                                    downloadName="MetaTrader5.apk"
+                                                    title="Downloadpage.item14">
 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
 <!--                                              class="fi fi-rr-download"></i> {{-->
 <!--                                                t('Downloadpage.item6-1') }}</view>-->
@@ -434,9 +445,8 @@
                                             <view class="card card-action action-elevate action-border-primary">
                                                 <view class="row g-0">
                                                     <view class="col-md-6">
-                                                        <view
-                                                            class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
-                                                            <QrCode :text="mt52" />
+                                                        <view class="card-header border-0 download-qr-header position-relative overflow-hidden">
+                                                            <QrCode :text="mt52" :width="qrSize" :height="qrSize" />
                                                             <!-- <image src="/static/images/vu/metatrade.png" alt=""
                                                                 mode="widthFix" class="img-fluid" /> -->
                                                         </view>
@@ -457,7 +467,8 @@
                                         </view>
                                         <view class="col-lg-6 mb-5">
                                           <cwg-link type="download" class="download-card" :url="mt53"
-                                                    downloadName="MetaTrader5.app">
+                                                    downloadName="MetaTrader5.app"
+                                                    title="Downloadpage.item15">
 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
 <!--                                              class="fi fi-rr-download"></i> {{-->
 <!--                                                t('Downloadpage.item6-1') }}</view>-->
@@ -465,9 +476,8 @@
                                             <view class="card card-action action-elevate action-border-primary">
                                                 <view class="row g-0">
                                                     <view class="col-md-6">
-                                                        <view
-                                                            class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
-                                                            <QrCode :text="mt53" />
+                                                        <view class="card-header border-0 download-qr-header position-relative overflow-hidden">
+                                                            <QrCode :text="mt53" :width="qrSize" :height="qrSize" />
                                                             <!-- <image src="/static/images/vu/ios-1.png" alt=""
                                                                 mode="widthFix" class="img-fluid" /> -->
                                                         </view>
@@ -511,6 +521,7 @@ const mt43 = ref('https://apps.apple.com/us/app/metatrader-4/id496212596?server=
 const mt51 = ref('https://download.metatrader.com/cdn/mobile/mt5/android?server=CWGMarketsSVG-Demo,CWGMarketsSVG-Live')
 const mt52 = ref(`${config.Host80}/mt/metatrader5.apk`)
 const mt53 = ref('https://download.metatrader.com/cdn/mobile/mt5/ios?server=CWGMarketsSVG-Demo,CWGMarketsSVG-Live')
+const qrSize = 160
 const tabsConfig = computed(() => [
     { text: 'MT4', value: 'MT4' },
     { text: 'MT5', value: 'MT5' },
@@ -527,6 +538,20 @@ onMounted(async () => {
 </script>
 <style lang="scss" scoped>
 @import "@/uni.scss";
+
+:deep(.nav-pills .nav-link.active) {
+    color: #fff;
+    background-color: #FF8110;
+}
+
+.download-qr-header {
+    padding: 12px 0;
+    margin: 0;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
 /* 让 card 本身等高,但内部元素自适应 */
 .row {
     display: flex;

+ 4 - 2
pages/customer/components/AccountList.vue

@@ -6,7 +6,7 @@
                 <view class="border-0 card-header">
                     <view class="d-flex flex-wrap gap-3 align-items-center justify-content-between mb-3">
                         <h3 class="mb-0" v-t="'Custom.Index.AccountList'"></h3>
-                        <button type="button" class="btn  btn-secondary  btn-shadow waves-effect"
+                        <button type="button" class="btn btn-danger btn-shadow waves-effect"
                             @click="createAccount">
                             <view class="d-flex align-items-center">
                                 <cwg-icon name="crm-plus" :size="14" color="#fff" />
@@ -45,7 +45,9 @@
                                     <view class="table-loading-mask">
                                         <uni-loading v-if="loading" />
                                     </view>
-                                    <cwg-empty-state v-if="!loading && accounts.length == 0" />
+                                    <view v-if="!loading && accounts.length == 0" class="list-empty-state col-12">
+                                        <cwg-empty-state />
+                                    </view>
                                     <DeleteAccountDialogs ref="deleteAccountDialogRef"
                                         v-model:visible="deleteAccountDialogVisible" />
                                     <cwg-improve-popup v-model:visible="dialogCheck" @confirm="confirm" />

+ 0 - 7
pages/customer/components/TerminalChangePasswordDialog.vue

@@ -247,13 +247,6 @@ watch(() => props.visible, (newVal) => {
         font-size: px2rpx(14);
         color: var(--bs-emphasis-color);
         line-height: px2rpx(24);
-
-        &::before {
-            content: '●';
-            display: inline-block;
-            font-size: px2rpx(10);
-            margin-right: px2rpx(4);
-        }
     }
 
     .isOK {

+ 2 - 2
pages/customer/components/digitalPayConfirmPopup.vue

@@ -57,7 +57,7 @@ const props = defineProps({
     data: { type: Object, default: () => ({ balance: 0, income: 0 }) },
     WireTransferAccount: { type: Object, default: () => ({ name: '', type: '', address: '', url: '' }) },
 });
-const emit = defineEmits(['update:visible']);
+const emit = defineEmits(['update:visible', 'confirm']);
 const hashCode = ref('')
 
 const { t } = useI18n();
@@ -81,7 +81,7 @@ const handleConfirm = () => {
         })
         return
     }
-    emit('confirm', { iamge:imageUrl.value,hashCode:hashCode.value, })
+    emit('confirm', { voucherUrl: imageUrl.value, hashCode: hashCode.value })
     close()
 }
 const close = () => { visible.value = false; imageUrl.value = "";hashCode.value = '' };

+ 0 - 7
pages/customer/create-account.vue

@@ -761,13 +761,6 @@ onMounted(() => {
     .notice-item {
         font-size: px2rpx(14);
         line-height: px2rpx(24);
-
-        &::before {
-            content: '●';
-            display: inline-block;
-            font-size: px2rpx(10);
-            margin-right: px2rpx(4);
-        }
     }
 
     .isOK {

+ 2 - 2
pages/customer/dashboard.vue

@@ -6,7 +6,7 @@
         <view class="">{{ dateWeek }}</view>
       </view>
 
-      <button type="button" class="btn  btn-secondary  btn-shadow waves-effect"
+      <button type="button" class="btn btn-danger btn-shadow waves-effect"
               @click="createAccount">
         <view class="d-flex align-items-center">
           <cwg-icon name="crm-plus" :size="14" color="#fff" />
@@ -1034,7 +1034,7 @@
     display: flex;
     align-items: center;
     gap: px2rpx(8);
-    font-size: px2rpx(16);
+    font-size: px2rpx(14);
     margin-bottom: px2rpx(10);
     color: #999;
   }

+ 22 - 3
pages/customer/deposit-select.vue

@@ -458,9 +458,9 @@
         <!--提交后的弹出框-->
         <CheckPopup v-model:visible="dialogCheckSuccess" :goPayLink="goPayLink" @close="closeDia" />
         <!-- 提交后失败弹窗 -->
-        <cwg-error-popup v-model:visible="dialogCheckError" :responseMessage="RES" />
+        <cwg-error-popup v-model:visible="dialogCheckError" :responseMessage="RES" @confirm="closeErrorDia" />
         <!-- 最后失败弹窗 -->
-        <cwg-error-popup v-model:visible="dialogError" @confirm="closeDia" :responseMessage="RES" />
+        <cwg-error-popup v-model:visible="dialogError" @confirm="closeErrorDia" :responseMessage="RES" />
         <!-- 最后成功弹窗 -->
         <cwg-success-popup v-model:visible="dialogSuccess" @confirm="closeDia" />
         <!-- 等待弹窗 -->
@@ -1537,10 +1537,13 @@ const submitDealResult = async () => {
         dialogDealResult.value = false
     }
 }
-const closeDia = () => {
+const closeErrorDia = () => {
     dialogCheck.value = false
     dialogVisible.value = false
     dialogCheckOK.value = false
+}
+const closeDia = () => {
+    closeErrorDia()
     isStep3.value = false
     step2.value = false
     showTable()
@@ -2054,6 +2057,22 @@ watch(() => params.agree6, (newVal) => {
 
 <style lang="scss" scoped>
 @import "@/uni.scss";
+
+:deep(.base-info-form .uni-forms-item.agree) {
+    label {
+        display: flex;
+        align-items: flex-start;
+        gap: px2rpx(8);
+
+        text {
+            color: #000;
+            font-weight: 600;
+            font-size: px2rpx(14);
+            line-height: 1.5;
+        }
+    }
+}
+
 .card-header{
   border: none;
 }

+ 47 - 29
pages/customer/deposit.vue

@@ -70,7 +70,7 @@
                                                         WireTransferAccount.bankUname || '--'
                                                     }}</text></view>
                                             <view class="row"><text class="label">{{ t('Custom.Deposit.bankName')
-                                                    }}</text><text class="content">{{ WireTransferAccount.bankName
+                                            }}</text><text class="content">{{ WireTransferAccount.bankName
                                                         ||
                                                         '--'
                                                     }}</text></view>
@@ -80,7 +80,7 @@
                                                         WireTransferAccount.bankCardNum || '--'
                                                     }}</text></view>
                                             <view class="row"><text class="label">{{ t('Custom.Deposit.bankAddr')
-                                                    }}</text><text class="content">{{ WireTransferAccount.bankAddr
+                                            }}</text><text class="content">{{ WireTransferAccount.bankAddr
                                                         ||
                                                         '--'
                                                     }}</text></view>
@@ -90,7 +90,7 @@
                                                         WireTransferAccount.swiftCode || '--'
                                                     }}</text></view>
                                             <view class="row"><text class="label">{{ t('Custom.Deposit.bankCode')
-                                                    }}</text><text class="content">{{ WireTransferAccount.bankCode
+                                            }}</text><text class="content">{{ WireTransferAccount.bankCode
                                                         ||
                                                         '--'
                                                     }}</text></view>
@@ -143,7 +143,7 @@
                                             <view class="label-with-icon">
                                                 <text>{{ t('Custom.Deposit.EstimatedAmount') + '(' +
                                                     `${channelData.transformCurrency || channelData.currency}` + ')'
-                                                    }}</text>
+                                                }}</text>
                                                 <uni-tooltip placement="right">
                                                     <!-- <view class="help-icon">ⓘ</view> -->
                                                     <cwg-icon name="icon_about us" :size="16" />
@@ -154,8 +154,7 @@
                                             </view>
                                         </h5>
                                         <uni-forms-item>
-                                            <uni-easyinput v-model="params.amount1" disabled
-                                                :placeholder="''" />
+                                            <uni-easyinput v-model="params.amount1" disabled :placeholder="''" />
                                         </uni-forms-item>
                                     </view>
                                     <!-- 优惠码 -->
@@ -202,16 +201,16 @@
                                                 <checkbox :checked="params.agree4"
                                                     @click="params.agree4 = !params.agree4" />
                                                 <text>{{ t('news_add_field1.activitiesNZ.itemDeposit1')
-                                                    }}</text>
+                                                }}</text>
                                             </label>
                                             <view style="line-height: 1.5; font-size: 14px">
                                                 <text>{{ t('news_add_field1.activitiesNZ.itemDeposit2')
-                                                    }}</text>
+                                                }}</text>
                                                 <text class="clause crm-cursor" @click="dialogClauseNZ = true">{{
                                                     t('news_add_field1.activitiesNZ.itemDeposit3')
-                                                    }}</text>
+                                                }}</text>
                                                 <text>{{ t('news_add_field1.activitiesNZ.itemDeposit4')
-                                                    }}</text>
+                                                }}</text>
                                             </view>
                                         </uni-forms-item>
 
@@ -224,15 +223,15 @@
                                                 <checkbox :checked="params.agree5"
                                                     @click="params.agree5 = !params.agree5" />
                                                 <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit1')
-                                                    }}</text>
+                                                }}</text>
                                             </label>
                                             <view style="line-height: 1.5; font-size: 14px">
                                                 <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit2')
-                                                    }}</text>
+                                                }}</text>
                                                 <text class="clause crm-cursor" @click="dialogClauseNZTwo = true">{{
                                                     t('news_add_field1.activitiesNZTwo.itemDeposit3') }}</text>
                                                 <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit4')
-                                                    }}</text>
+                                                }}</text>
                                             </view>
                                         </uni-forms-item>
 
@@ -315,7 +314,7 @@
 
                                     <button class="btn btn-dark waves-effect waves-light" @click="submitConfirm">{{
                                         t('Btn.Submit')
-                                        }}</button>
+                                    }}</button>
 
                                 </view>
 
@@ -348,9 +347,9 @@
         <!--提交后的弹出框-->
         <CheckPopup v-model:visible="dialogCheckSuccess" :goPayLink="goPayLink" @close="closeDia" />
         <!-- 提交后失败弹窗 -->
-        <cwg-error-popup v-model:visible="dialogCheckError" :responseMessage="RES" />
+        <cwg-error-popup v-model:visible="dialogCheckError" :responseMessage="RES" @confirm="closeErrorDia" />
         <!-- 最后失败弹窗 -->
-        <cwg-error-popup v-model:visible="dialogError" @confirm="closeDia" :responseMessage="RES" />
+        <cwg-error-popup v-model:visible="dialogError" @confirm="closeErrorDia" :responseMessage="RES" />
         <!-- 最后成功弹窗 -->
         <cwg-success-popup v-model:visible="dialogSuccess" @confirm="closeDia" />
         <!-- 等待弹窗 -->
@@ -563,7 +562,7 @@ watch(
 )
 const bankDate = ref([])
 const channelData = reactive({
-  rate:''
+    rate: ''
 })
 const WireTransferAccount = reactive({})
 const actionAdd1 = ref("")
@@ -1171,8 +1170,8 @@ const submitConfirm = async () => {
 }
 const confirmDigitalPayModal = (e) => {
     dialogDigitalPayConfirm.value = false;
-    imageUrl.value = e.image;
-  hashCode.value = e.hashCode;
+    imageUrl.value = e.voucherUrl || e.image || '';
+    hashCode.value = e.hashCode || '';
     openDontActive();
 }
 // 关闭数字支付确认弹窗
@@ -1234,7 +1233,7 @@ const submit = async () => {
             let res = await financialApi.telegraphicPay({
                 requiteVoucherUrl: imageUrl1.value,
                 amount: params.amount,
-                login: $route.query.login,
+                login: loginValue.value,
                 voucherUrl: imageUrl.value,
                 activityDeposit: params.agree2 ? 1 : 0,
                 activityPercentageGive: params.agree3 ? 1 : 0,
@@ -1266,9 +1265,9 @@ const submit = async () => {
             let res = await financialApi.digitalPay({
                 requiteVoucherUrl: imageUrl1.value,
                 amount: params.amount,
-                login: $route.query.login,
+                login: loginValue.value,
                 voucherUrl: imageUrl.value,
-                hashCode:hashCode.value,
+                hashCode: hashCode.value,
                 activityDeposit: params.agree2 ? 1 : 0,
                 activityPercentageGive: params.agree3 ? 1 : 0,
                 activityMidyearTenPercentGive: params.agree4 ? 1 : 0,
@@ -1462,10 +1461,13 @@ const submitDealResult = async () => {
         dialogDealResult.value = false
     }
 }
-const closeDia = () => {
+const closeErrorDia = () => {
     dialogCheck.value = false
     dialogVisible.value = false
     dialogCheckOK.value = false
+}
+const closeDia = () => {
+    closeErrorDia()
     showTable()
 }
 const isStep3Open = () => {
@@ -1925,7 +1927,7 @@ watch(loginValue, (login) => {
         get23nianzhongTwoLogin(login);
         getActivityExtensionGiveLogin(login);
         getActivityExtensionGiveLoginJoin(login);
-      // showCentAccountTransferTip(login);
+        // showCentAccountTransferTip(login);
         setTipsAmount()
     }
 })
@@ -1935,7 +1937,7 @@ watch(() => params.amount, (newVal) => {
     }
 })
 watch(() => channelData.rate, (newVal) => {
-  console.log(newVal,'channel')
+    console.log(newVal, 'channel')
     if (newVal && params.amount) {
         params.amount1 = (newVal * params.amount).toFixed(2)
     }
@@ -1999,7 +2001,7 @@ watch(() => params.agree6, (newVal) => {
                             t("Btn.Cancel"),
                             async () => {
                                 try {
-                                    const res = await activityApi.ActivityGiveCancel({ login: $route.query.login })
+                                    const res = await activityApi.ActivityGiveCancel({ login: loginValue.value, })
                                     if (res.code == Code.StatusOK) $pigeon.MessageOK(res.msg || t("Msg.Success"))
                                     else uni.showToast({ title: res.msg, icon: 'none' })
                                 } catch (error) {
@@ -2049,6 +2051,21 @@ watch(() => params.agree6, (newVal) => {
 <style lang="scss" scoped>
 @import "@/uni.scss";
 
+:deep(.base-info-form .uni-forms-item.agree) {
+    label {
+        display: flex;
+        align-items: flex-start;
+        gap: px2rpx(8);
+
+        text {
+            color: #000;
+            font-weight: 600;
+            font-size: px2rpx(14);
+            line-height: 1.5;
+        }
+    }
+}
+
 .custom-deposit {
     width: px2rpx(566);
     flex-shrink: 0;
@@ -2499,9 +2516,10 @@ watch(() => params.agree6, (newVal) => {
     display: flex;
     align-items: center;
     gap: px2rpx(8);
-  uni-text{
-    font-weight: 600;
-  }
+
+    uni-text {
+        font-weight: 600;
+    }
 
     :deep(.uni-tooltip) {
         display: flex;

+ 8 - 9
pages/customer/recording-history.vue

@@ -8,7 +8,7 @@
                 :show-operation="false">
                 <!-- 状态列自定义渲染 -->
                 <template #status="{ row }">
-                    <view v-if="getStatusText(row)" class="status-tag" :class="getStatusClass(row.status)">
+                    <view v-if="getStatusText(row)" class="status-tag" :class="getStatusClass(row)">
                         {{ getStatusText(row) }}
                     </view>
                     <view v-else></view>
@@ -291,14 +291,13 @@ const getStatusText = (row: any) => {
     return ''
 }
 // 获取状态样式类
-const getStatusClass = (status: number) => {
-    const classMap: Record<number, string> = {
-        1: 'status-pending',
-        2: 'status-success',
-        3: 'status-processing',
-        4: 'status-failed'
-    }
-    return classMap[status] || ''
+const getStatusClass = (row: any) => {
+    const text = getStatusText(row)
+    if (text === t('State.Refused')) return 'status-failed'
+    if (text === t('State.ToBeProcessed')) return 'status-pending'
+    if (text === t('State.Completed')) return 'status-success'
+    if (text === t('State.InTheProcessing')) return 'status-processing'
+    return ''
 }
 // 获取账户类型文本
 const getAccountTypeText = (type: number) => {

+ 7 - 8
pages/customer/settings.vue

@@ -260,14 +260,13 @@ const getStatusText = (row: any) => {
     return '--'
 }
 // 获取状态样式类
-const getStatusClass = (status: number) => {
-    const classMap: Record<number, string> = {
-        1: 'status-warning',
-        2: 'status-success',
-        3: 'status-processing',
-        4: 'status-danger'
-    }
-    return classMap[status] || ''
+const getStatusClass = (row: any) => {
+    const text = getStatusText(row)
+    if (text === t('State.Refused')) return 'status-failed'
+    if (text === t('State.ToBeProcessed')) return 'status-pending'
+    if (text === t('State.Completed')) return 'status-success'
+    if (text === t('State.InTheProcessing')) return 'status-processing'
+    return ''
 }
 // 获取账户类型文本
 const getAccountTypeText = (type: number) => {

+ 3 - 2
pages/customer/style.scss

@@ -144,8 +144,9 @@
       }
 
       text {
-        font-size: px2rpx(13);
-        color: var(--color-zinc-500);
+        font-size: px2rpx(14);
+        color: #000;
+        font-weight: 600;
         line-height: 1.5;
       }
     }

+ 8 - 6
pages/follow/account-management.vue

@@ -17,10 +17,9 @@
                 </view>
             </view>
         </view>
-        <view class="content-container">
+        <view class="content-container list-content-empty" v-if="accountDataLoading || accountData.length > 0">
             <uni-loading v-if="accountDataLoading" />
-            <template v-else>
-                <view class="field-container" v-if="accountData.length > 0">
+            <view class="field-container" v-else>
                     <view class="account-l-con" v-for="(item, index) in accountData" :key="index">
                         <view class="tit">
                             <view>
@@ -63,9 +62,12 @@
                             </view>
                         </view>
                     </view>
-                </view>
-                <cwg-empty-state v-if="accountData.length == 0" />
-            </template>
+            </view>
+        </view>
+        <view v-else class="content-container list-content-empty">
+            <view class="list-empty-state">
+                <cwg-empty-state />
+            </view>
         </view>
     </cwg-page-wrapper>
 </template>

+ 8 - 9
pages/follow/record.vue

@@ -7,7 +7,7 @@
             <cwg-tabel ref="tableRef" :columns="currentColumns" :immediate="false" :queryParams="search" :api="listApi"
                 :show-operation="false">
                 <template #status="{ row }">
-                    <view v-if="getStatusText(row)" class="status-tag" :class="getStatusClass(row.status)">
+                    <view v-if="getStatusText(row)" class="status-tag" :class="getStatusClass(row)">
                         {{ getStatusText(row) }}
                     </view>
                     <view v-else></view>
@@ -269,14 +269,13 @@ const getStatusText = (row: any) => {
     return ''
 }
 // 获取状态样式类
-const getStatusClass = (status: number) => {
-    const classMap: Record<number, string> = {
-        1: 'status-pending',
-        2: 'status-success',
-        3: 'status-processing',
-        4: 'status-danger'
-    }
-    return classMap[status] || ''
+const getStatusClass = (row: any) => {
+    const text = getStatusText(row)
+    if (text === t('State.Refused')) return 'status-failed'
+    if (text === t('State.ToBeProcessed')) return 'status-pending'
+    if (text === t('State.Completed')) return 'status-success'
+    if (text === t('State.InTheProcessing')) return 'status-processing'
+    return ''
 }
 // 获取账户类型文本
 const getAccountTypeText = (type: number) => {

+ 8 - 6
pages/follow/trading-management.vue

@@ -17,10 +17,9 @@
                 </view>
             </view>
         </view>
-        <view class="content-container">
+        <view class="content-container list-content-empty" v-if="accountDataLoading || accountData.length > 0">
             <uni-loading v-if="accountDataLoading" />
-            <template v-else>
-                <view class="field-container" v-if="accountData.length > 0">
+            <view class="field-container" v-else>
                     <view class="account-l-con" v-for="(item, index) in accountData" :key="index">
                         <view class="tit">
                             <view>
@@ -82,9 +81,12 @@
                             </view>
                         </view>
                     </view>
-                </view>
-                <cwg-empty-state v-if="accountData.length == 0" />
-            </template>
+            </view>
+        </view>
+        <view v-else class="content-container list-content-empty">
+            <view class="list-empty-state">
+                <cwg-empty-state />
+            </view>
         </view>
         <!-- 删除信号源 -->
         <cwg-popup v-model:visible="dialogFllowDelete" type="center" :mask-click="false" :show-footers="true"

+ 57 - 18
pages/ib/components/applyIbDialog.vue

@@ -12,14 +12,14 @@
           <table class="commission-table">
             <thead>
             <tr>
-              <th style="width: 60px;">{{ t('Ib.Custom.Status') }}</th>
-              <th style="width: 135px;"></th>
-              <th style="width: 100px;"></th>
-              <th style="width: 80px;">METAL</th>
-              <th>FX</th>
-              <th>ENERGY</th>
-              <th>CFD</th>
-              <th>INDEX</th>
+              <th class="status-col">{{ t('Ib.Custom.Status') }}</th>
+              <th class="group-col"></th>
+              <th class="type-col"></th>
+              <th class="value-col">METAL</th>
+              <th class="value-col">FX</th>
+              <th class="value-col">ENERGY</th>
+              <th class="value-col">CFD</th>
+              <th class="value-col">INDEX</th>
 <!--              <th>CRYPTO</th>-->
             </tr>
             </thead>
@@ -35,23 +35,23 @@
               <td class="center-td type-td">
                 {{ item.type }}
               </td>
-              <td style="width: 75px;">
+              <td class="value-col">
                 <cwg-combox v-model:value="item.energy" :options="formatOptions(item.energyOptions)"
                             :placeholder="t('placeholder.choose')" />
               </td>
-              <td>
+              <td class="value-col">
                 <cwg-combox v-model:value="item.forex" :options="formatOptions(item.forexOptions)"
                             :placeholder="t('placeholder.choose')" />
               </td>
-              <td>
+              <td class="value-col">
                 <cwg-combox v-model:value="item.energy2" :options="formatOptions(item.energy2Options)"
                             :placeholder="t('placeholder.choose')" />
               </td>
-              <td>
+              <td class="value-col">
                 <cwg-combox v-model:value="item.index" :options="formatOptions(item.indexOptions)"
                             :placeholder="t('placeholder.choose')" />
               </td>
-              <td>
+              <td class="value-col">
                 <cwg-combox v-model:value="item.metal" :options="formatOptions(item.metalOptions)"
                             :placeholder="t('placeholder.choose')" />
               </td>
@@ -530,12 +530,56 @@
 
   .commission-table {
     width: 100%;
+    table-layout: fixed;
     border-collapse: collapse;
     border-spacing: 0;
     font-size: px2rpx(14);
     color: var(--bs-emphasis-color);
     border: 1px solid #ebeef5;
 
+    .status-col {
+      width: 60px;
+    }
+
+    .group-col {
+      width: 135px;
+    }
+
+    .type-col {
+      width: 100px;
+    }
+
+    .value-col {
+      width: calc((100% - 295px) / 5);
+      padding: px2rpx(4);
+      box-sizing: border-box;
+      overflow: hidden;
+
+      :deep(.cwg-combox) {
+        width: 100%;
+        display: block;
+
+        :deep(.uni-select) {
+          width: 100%;
+          min-height: px2rpx(32);
+          box-sizing: border-box;
+        }
+
+        :deep(.uni-select__input-box) {
+          flex: 1;
+          width: 0;
+          min-width: 0;
+        }
+
+        :deep(.uni-select__input-text) {
+          text-align: center;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+        }
+      }
+    }
+
     thead {
       background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;
     }
@@ -568,11 +612,6 @@
     .type-td {
       color: var(--bs-emphasis-color);
     }
-
-    :deep(.cwg-combox) {
-      width: 100%;
-      width: px2rpx(60);
-    }
   }
 
   .dialog-account-adjust-body {

+ 29 - 3
pages/ib/customer.vue

@@ -370,7 +370,7 @@
 
   .pc-search-content {
     flex-direction: row;
-    align-items: flex-start;
+    align-items: center;
   }
 
   .search-bar {
@@ -387,6 +387,28 @@
       width: px2rpx(180) !important;
       flex: none;
     }
+
+    :deep(.uni-easyinput__content) {
+      height: px2rpx(35) !important;
+      min-height: px2rpx(35) !important;
+    }
+
+    :deep(.uni-easyinput__content-input) {
+      height: px2rpx(35) !important;
+    }
+
+    :deep(.search-btn) {
+      height: px2rpx(35);
+      min-height: px2rpx(35);
+      line-height: px2rpx(35);
+      padding: 0 px2rpx(16);
+      margin: 0;
+      box-sizing: border-box;
+    }
+
+    :deep(.form-actions) {
+      align-items: center;
+    }
   }
 
   .search-tabs {
@@ -398,12 +420,16 @@
 
     .tab-item {
       display: flex;
+      align-items: center;
       min-width: px2rpx(100);
       border: 1px solid #F0F0F0;
       border-radius: px2rpx(4);
       margin-right: px2rpx(5);
-      height: px2rpx(33);
-      line-height: px2rpx(33);
+      height: px2rpx(35);
+      line-height: px2rpx(35);
+      padding: 0 px2rpx(12);
+      box-sizing: border-box;
+      font-size: px2rpx(14);
       justify-content: center;
 
       &.active {

+ 16 - 6
pages/ib/index.vue

@@ -54,12 +54,12 @@
 <!--            </view>-->
 <!--          </view>-->
           <uni-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
-          <view class="card position-relative">
+          <view class="card position-relative stat-card-clickable" @click="toCustomManagement">
             <view class="card-body d-flex gap-3 align-items-center">
               <view class="clearfix pe-2 text-warning">
                 <cwg-icon name="crm-user" :size="35" color="#FDBB1F" />
               </view>
-              <view class="clearfix" @click="toCustomManagement">
+              <view class="clearfix">
                 <view class="mb-1">{{ t('Ib.Index.NameCustom') }}-{{ t('Ib.Index.Custom') }}</view>
                 <view class="mb-0 fw-bold">{{ ibData.customAmount || '0' }}</view>
               </view>
@@ -67,12 +67,12 @@
           </view>
           </uni-col>
           <uni-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
-          <view class="card position-relative">
+          <view class="card position-relative stat-card-clickable" @click="toIbManagement">
             <view class="card-body d-flex gap-3 align-items-center">
               <view class="clearfix pe-2 text-warning">
-                <cwg-icon name="crm-user" :size="35" color="#FDBB1F" />
+                <cwg-icon name="crm-ib" :size="35" color="#FDBB1F" />
               </view>
-              <view class="clearfix" @click="toIbManagement">
+              <view class="clearfix">
                 <view class="mb-1">{{ t('Ib.Index.NameCustom') }}-{{ t('Ib.Index.Agent') }}</view>
                 <view class="mb-0 fw-bold">{{ ibData.ibAmount || '0' }}</view>
               </view>
@@ -138,7 +138,7 @@
               </view>
               <view class="header-right" v-if="showAddMamAccount">
                 <cwg-dropdown :menu-list="addMamAccountMenus" @menuClick="handleAddMamAccountMenuClick">
-                  <button type="button" class="btn  btn-secondary  btn-shadow waves-effect add-mam-btn">
+                  <button type="button" class="btn btn-danger btn-shadow waves-effect add-mam-btn">
                     <cwg-icon name="icon_add" :size="16" color="#fff" />{{ t('Custom.Index.AddAccount') }}</button>
                 </cwg-dropdown>
               </view>
@@ -783,6 +783,8 @@ onMounted(async () => {
 
   /* 卡片通用样式 */
   .card {
+    border-radius: px2rpx(8);
+    box-shadow: 0 px2rpx(2) px2rpx(8) rgba(0, 0, 0, 0.06);
     //background: var(--bs-body-bg);
     //color: var(--bs-emphasis-color);
     //padding: px2rpx(12) px2rpx(16);
@@ -794,6 +796,14 @@ onMounted(async () => {
     flex-direction: column;
     min-height: px2rpx(110);
   }
+
+  .stat-card-clickable {
+    cursor: pointer;
+
+    &:hover {
+      box-shadow: 0 px2rpx(4) px2rpx(12) rgba(0, 0, 0, 0.1);
+    }
+  }
   
   .dashboard-container .card-body {
     flex: 1;

+ 5 - 3
pages/login/components/LoginHeaderGroup.vue

@@ -1,8 +1,10 @@
 <template>
   <view class="login-header-group">
+    <!-- #ifndef APP -->
     <view class="header-item">
-      <cwg-system :text-color="textColor" :icon-color="iconColor" event-source="login"/>
+      <cwg-system :text-color="textColor" :icon-color="iconColor" event-source="login" />
     </view>
+    <!-- #endif -->
     <view class="divider" :style="{ backgroundColor: dividerColor }"></view>
     <view class="header-item" style="margin-right: 10rpx">
       <cwg-language :text-color="textColor" :icon-color="iconColor" />
@@ -39,12 +41,12 @@ const dividerColor = computed(() => {
   align-items: center;
   padding: px2rpx(4) 0;
   height: px2rpx(36);
-  
+
   .header-item {
     display: flex;
     align-items: center;
   }
-  
+
   .divider {
     width: 1px;
     height: px2rpx(14);

+ 51 - 33
pages/login/index.vue

@@ -1,11 +1,11 @@
 <template>
-  <view class="login-page bg-body" :isHeaderFixed="true" :isLoginPage="true" :class="{'dark': isDark}">
+  <view class="login-page bg-body" :isHeaderFixed="true" :isLoginPage="true" :class="{ 'dark': isDark }">
     <view class="fixed" />
     <view class="main-content">
       <uni-row class="demo-uni-row">
         <cwg-match-media :min-width="991" style="height: 100%;">
           <uni-col :xs="24" :sm="24" :md="12" :lg="14" :xl="16" style="height: 100%">
-            <view class="left-bg">
+            <view class="left-bg" :style="{ backgroundImage: `url(${loginBg})` }">
               <view class="left-box">
                 <view class="inner">
                   <view class="title w-700">
@@ -34,7 +34,7 @@
                     <text v-t="'newSignin.item13_4'"></text> -->
                   </view>
                 </view>
-<!--                <image src="/static/images/trust-pilot.png" class="img-fluid mt&#45;&#45;10" mode="widthFix"></image>-->
+                <!--                <image src="/static/images/trust-pilot.png" class="img-fluid mt&#45;&#45;10" mode="widthFix"></image>-->
               </view>
             </view>
           </uni-col>
@@ -44,7 +44,7 @@
             <view class="global-header-bar pc-header">
               <view class="header-inner">
                 <view class="logo-placeholder"></view> <!-- 左侧可预留放logo或留空 -->
-                <LoginHeaderGroup text-color="#fff" :icon-color="isDark ? '#fff' : '#97A1C0' " />
+                <LoginHeaderGroup text-color="#fff" :icon-color="isDark ? '#fff' : '#97A1C0'" />
               </view>
             </view>
           </cwg-match-media>
@@ -54,13 +54,15 @@
             <view class="mobile-header-bar">
               <!--          <view class="fixed"/>-->
 
-              <LoginHeaderGroup text-color="#fff" :icon-color="isDark ? '#fff' : '#97A1C0' "/>
+              <LoginHeaderGroup text-color="#fff" :icon-color="isDark ? '#fff' : '#97A1C0'" />
             </view>
           </cwg-match-media>
           <view class="account">
             <view class="company u-flex-y u-flex-y-center">
-              <image v-if="!isDark" src="/static/images/vu/logo-full.svg" :class="isMobile?'company-icon-mini':'company-icon'" mode="widthFix"></image>
-              <image v-else src="/static/images/vu/logo-full-white.svg" :class="isMobile?'company-icon-mini':'company-icon'" mode="widthFix"></image>
+              <image v-if="!isDark" src="/static/images/vu/logo-full.svg"
+                :class="isMobile ? 'company-icon-mini' : 'company-icon'" mode="widthFix"></image>
+              <image v-else src="/static/images/vu/logo-full-white.svg"
+                :class="isMobile ? 'company-icon-mini' : 'company-icon'" mode="widthFix"></image>
 
             </view>
             <view class="tab-list">
@@ -122,24 +124,27 @@
                   <uni-row :gutter="20" class="formContent">
                     <uni-col :xs="24" :md="12">
                       <uni-forms-item name="country" :label="t('newSignup.item3')">
-                        <cwg-combox v-model:value="formData.country" :options="countryOptions" border="none" filterable :placeholder="t('newSignup.item4')">
+                        <cwg-combox v-model:value="formData.country" :options="countryOptions" border="none" filterable
+                          :placeholder="t('newSignup.item4')">
                         </cwg-combox>
                       </uni-forms-item>
                     </uni-col>
                     <uni-col :xs="24" :md="12">
                       <uni-forms-item name="phone" :label="t('newSignup.item5')">
-                        <uni-easyinput :customStyle="customStyle" v-model="formData.phone" border="none" :placeholder="t('newSignup.item6')"></uni-easyinput>
+                        <uni-easyinput :customStyle="customStyle" v-model="formData.phone" border="none"
+                          :placeholder="t('newSignup.item6')"></uni-easyinput>
                       </uni-forms-item>
                     </uni-col>
                     <uni-col :xs="24" :md="12">
                       <uni-forms-item name="birthDate" :label="t('newSignup.item18')">
-                        <uni-datetime-picker  type="date" v-model="formData.birthDate"
+                        <uni-datetime-picker type="date" v-model="formData.birthDate"
                           :placeholder="t('newSignup.item19')" @change="checkAge" />
                       </uni-forms-item>
                     </uni-col>
                     <uni-col :xs="24" :md="12">
                       <uni-forms-item name="email" :label="t('newSignup.item7')">
-                        <uni-easyinput :customStyle="customStyle" v-model="formData.email" :placeholder="t('newSignup.item8')" border="none"
+                        <uni-easyinput :customStyle="customStyle" v-model="formData.email"
+                          :placeholder="t('newSignup.item8')" border="none"
                           :disabled="!isAgeValid || !formData.birthDate"></uni-easyinput>
                       </uni-forms-item>
                     </uni-col>
@@ -147,7 +152,8 @@
                       <uni-forms-item name="emailCode" :label="t('newSignup.item9')">
                         <view style="display: flex;">
                           <view style="flex: 1;">
-                            <uni-easyinput :customStyle="customStyle" class="code" border="none" :disabled="!isAgeValid || !formData.birthDate" v-model="formData.emailCode"
+                            <uni-easyinput :customStyle="customStyle" class="code" border="none"
+                              :disabled="!isAgeValid || !formData.birthDate" v-model="formData.emailCode"
                               :placeholder="t('newSignup.item10')">
                             </uni-easyinput>
                           </view>
@@ -162,8 +168,9 @@
                     </uni-col>
                     <uni-col :xs="24" :md="12">
                       <uni-forms-item name="password" :label="t('newSignup.item12')">
-                        <uni-easyinput border="none" :customStyle="customStyle" v-model.trim="formData.password" :disabled="!isAgeValid || !formData.birthDate"
-                          :placeholder="t('newSignup.item13')" type="password"></uni-easyinput>
+                        <uni-easyinput border="none" :customStyle="customStyle" v-model.trim="formData.password"
+                          :disabled="!isAgeValid || !formData.birthDate" :placeholder="t('newSignup.item13')"
+                          type="password"></uni-easyinput>
                       </uni-forms-item>
                       <uni-col :xs="24" :md="24">
                         <uni-forms-item>
@@ -177,8 +184,9 @@
                     </uni-col>
                     <uni-col :xs="24" :md="12">
                       <uni-forms-item v-if="!isRouteHasId" name="linkValue" :label="t('newSignup.item14')">
-                        <uni-easyinput border="none" :customStyle="customStyle" v-model.trim="formData.linkValue" :disabled="!isAgeValid || !formData.birthDate"
-                          :placeholder="t('newSignup.item15')" @input="limitAgentIdLength"></uni-easyinput>
+                        <uni-easyinput border="none" :customStyle="customStyle" v-model.trim="formData.linkValue"
+                          :disabled="!isAgeValid || !formData.birthDate" :placeholder="t('newSignup.item15')"
+                          @input="limitAgentIdLength"></uni-easyinput>
                       </uni-forms-item>
                     </uni-col>
                   </uni-row>
@@ -249,6 +257,7 @@
 <script setup>
 import { ref, watch, onMounted, computed } from 'vue'
 import { onLoad } from '@dcloudio/uni-app'
+import ls from "@/utils/store2";
 import QrCode from '@/components/QrCode.vue'
 import { post } from '@/utils/request'
 import { userToken } from '@/composables/config'
@@ -265,6 +274,7 @@ import useUserStore from '@/stores/use-user-store'
 import useRouter from '@/hooks/useRouter'
 import { useI18n } from 'vue-i18n'
 import companyLogo from '@/static/images/logo4.png'
+import loginBg from '@/static/images/login-bg.jpeg'
 import LoginHeaderGroup from './components/LoginHeaderGroup.vue'
 import LiveChatService from '@/utils/liveChat.js'
 import { useWindowWidth } from '@/composables/useWindowWidth'
@@ -527,11 +537,11 @@ async function sendEmailCode() {
       start()
       return true
     } else {
-      showToast(res.msg,'error')
+      showToast(res.msg, 'error')
       return false
     }
-  }catch (e) {
-    showToast(e.msg,'error')
+  } catch (e) {
+    showToast(e.msg, 'error')
   }
 
 }
@@ -648,7 +658,7 @@ async function handleLogin() {
     })
     if (res.code === 200) {
       userToken.value = res.data
-      uni.showToast({ title:t('login.msg0_1'), icon:'success' })
+      uni.showToast({ title: t('login.msg0_1'), icon: 'success' })
       getCustomLoginInfo()
       // getCardUserInfo();
       reasonsRefusalList()
@@ -705,7 +715,7 @@ async function getCustomLoginInfo() {
       uni.$u.toast(res.msg || t('login.msg0'))
     }
   } catch (error) {
-    uni.$u.toast(error.msg || t('login.msg0'),'error')
+    uni.$u.toast(error.msg || t('login.msg0'), 'error')
     //  console.log(error, 111);
   }
 }
@@ -758,7 +768,7 @@ onMounted(() => {
     uni.removeStorageSync('logoutToSystem')
     uni.removeStorageSync('systemListCache')
   }
-  uni.$emit('updateSystemList','login')
+  uni.$emit('updateSystemList', 'login')
   const accountInfo = userStore.accountInfo
   if (accountInfo?.rememberPassword) {
     form.value.loginName = accountInfo?.loginName || ''
@@ -776,6 +786,7 @@ onMounted(() => {
 
   const hostParts = window.location.host.split('.')
   ho.value = hostParts.length > 1 ? hostParts[1] : ''
+  globalStore.setMode(ls.get('mode') || 'customer');
 })
 const inputType = ref('password')
 const isChatIconExpanded = ref(false)
@@ -833,6 +844,7 @@ const handleChatIconClick = () => {
   box-shadow: 0 px2rpx(8) px2rpx(20) rgba(0, 0, 0, 0.15);
   will-change: transform;
 }
+
 @media screen and (max-width: 991px) {
   .chat-icon {
     right: px2rpx(-25);
@@ -907,7 +919,6 @@ const handleChatIconClick = () => {
   .left-bg {
     height: 100%;
     min-height: calc(100vh - 120px);
-    background-image: url(/static/images/login-bg.jpeg);
     background-size: cover;
     background-position: center;
     display: flex;
@@ -1049,7 +1060,7 @@ const handleChatIconClick = () => {
       display: flex;
       flex-direction: column;
       //justify-content: center;
-      padding: 0 10%;
+      padding: 0 px2rpx(24);
 
       .company {
         padding: px2rpx(20) 0 px2rpx(30) 0;
@@ -1060,6 +1071,7 @@ const handleChatIconClick = () => {
       .company-icon {
         width: px2rpx(234);
       }
+
       .company-icon-mini {
         width: px2rpx(100);
       }
@@ -1222,6 +1234,7 @@ button {
 
 .cwg-button {
   padding: px2rpx(34) 0 !important;
+
   uni-button {
     border-radius: px2rpx(8)
   }
@@ -1249,7 +1262,7 @@ button {
   transition: all 0.3s ease;
 
   .tab-label {
-    font-size: px2rpx(24);
+    font-size: px2rpx(20);
   }
 
   &:hover,
@@ -1303,22 +1316,25 @@ button {
 
 :deep(.formContent) {
   padding: 0 10px;
+
   .uni-select,
   .uni-combox,
   .uni-easyinput__content,
   //.cwg-combox,
   .uni-date-editor--x {
     padding: 0.5rem px2rpx(10);
-    height: 3rem!important;
+    height: 3rem !important;
     //border: none !important;
     border-radius: px2rpx(8);
 
   }
-  .cwg-combox{
+
+  .cwg-combox {
     background-color: transparent !important;
   }
-  .code{
-    .uni-easyinput__content{
+
+  .code {
+    .uni-easyinput__content {
       border-radius: px2rpx(8) 0 0 px2rpx(8);
     }
   }
@@ -1421,12 +1437,14 @@ button {
   line-height: 20px;
   color: #000;
   font-size: px2rpx(14);
-:deep(.pdf-link){
-  width: auto;
 
-}
+  :deep(.pdf-link) {
+    width: auto;
+
+  }
+
   .desc-link {
-    display: inline-block!important;
+    display: inline-block !important;
     color: #e61f1e;
     text-decoration: underline;
 

+ 2 - 2
pages/login/regist.vue

@@ -1,7 +1,7 @@
 <template>
   <view class="regist-page" :isHeaderFixed="true" :isLoginPage="true">
     <view class="fixed" />
-    <view class="main-content">
+    <view class="main-content" :style="{ backgroundImage: `url(${loginBg})` }">
       <!-- 全局顶部栏:占据一整行,带有占位和背景 -->
       <cwg-match-media :min-width="991">
         <view class="global-header-bar pc-header">
@@ -214,6 +214,7 @@ import { userApi } from '@/api/user'
 import { openLocalPdf } from '@/utils/pdf.js'
 import ImportModel from './components/ImportModel.vue'
 import logoImage from '@/static/images/logo3.png'
+import loginBg from '@/static/images/login-bg.jpeg'
 import QrCode from '@/components/QrCode.vue'
 import LoginHeaderGroup from './components/LoginHeaderGroup.vue'
 import { useWindowWidth } from '@/composables/useWindowWidth'
@@ -715,7 +716,6 @@ onMounted(() => {
 .main-content {
   flex: 1;
   overflow: hidden;
-  background-image: url(/static/images/login-bg.jpeg);
   background-repeat: no-repeat;
   background-size: cover;
   background-position: center center;

+ 18 - 9
pages/mine/components/FileManagementTab.vue

@@ -26,13 +26,17 @@
                 <view :class="['status-badge', row.status]">{{ typeMap[row.type] }}</view>
             </template>
             <template #status="{ row }">
-                <view :class="['status-badge', row.status]">{{ stateMap[row.status] }}</view>
+                <view class="table-cell-center">
+                    <view :class="['status-badge', row.status]">{{ stateMap[row.status] }}</view>
+                </view>
             </template>
             <template #btn="{ row }">
-                <button class="btn-submit" :class="['operation-btn', row.status !== 4 ? 'disabled' : '']" :disabled="row.status !== 4" @click.stop="openAddFile(row)">
-                    <cwg-icon name="crm-image" :size="16" color="#1d293d" />
-                    <text v-t="'State.Again'" />
-                </button>
+                <view class="table-cell-center">
+                    <button class="btn-submit" :class="['operation-btn', row.status !== 4 ? 'disabled' : '']" :disabled="row.status !== 4" @click.stop="openAddFile(row)">
+                        <cwg-icon name="crm-image" :size="16" color="#1d293d" />
+                        <text v-t="'State.Again'" />
+                    </button>
+                </view>
             </template>
         </cwg-tabel>
         <add-file-dialog ref="addFileDialog" @file-added="customFileList" @success="addSuccess" />
@@ -120,13 +124,13 @@ const columns = computed(() => [
         tagMap: { 1: '启用', 10: '禁用' },
         tagTypeMap: { 1: 'success', 0: 'danger' },
         slot: 'status',
-        align: 'left'
+        align: 'center'
     },
     {
         prop: 'btn',
         label: '操作',
         slot: 'btn',
-        align: 'left'
+        align: 'center'
     }
 ])
 
@@ -218,8 +222,6 @@ defineProps<Props>();
   align-items: center;
   justify-content: center;
   padding: 0 px2rpx(10);
-  //border-radius: px2rpx(6);
-  //border: 1px solid var(--cwg-placeholder-color);
   box-sizing: border-box;
   height: px2rpx(36);
   line-height: px2rpx(36);
@@ -235,6 +237,13 @@ defineProps<Props>();
     }
 }
 
+.table-cell-center {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 100%;
+}
+
 .operation-btn.disabled {
     cursor: not-allowed;
     opacity: 0.5;

+ 0 - 7
pages/mine/components/SecurityCenterTab.vue

@@ -292,13 +292,6 @@ onMounted(() => {
         font-size: px2rpx(14);
         color: var(--bs-emphasis-color);
         line-height: px2rpx(24);
-
-        &::before {
-            content: '●';
-            display: inline-block;
-            font-size: px2rpx(10);
-            margin-right: px2rpx(4);
-        }
     }
 
     .isOK {

+ 106 - 20
static/scss/global/global.scss

@@ -290,6 +290,8 @@
     --bs-btn-secondary-active: #d93618;
     --cwg-placeholder-color: #909193;
     --cwg-gray-color: #495057;
+    --input-disabled-text-color: #97A1C0;
+    --input-disabled-bg-color: var(--bs-secondary-bg);
 }
 
 .dark {
@@ -640,10 +642,18 @@ uni-left-window {
     top: px2rpx(56);
     left: 0;
     z-index: 101;
-
+    overflow: visible;
     transition: width 281ms cubic-bezier(0.4, 0, 0.2, 1);
 }
 
+@media (min-width: 992px) {
+    uni-content .pages-header,
+    uni-content .app-page-head.card-header,
+    uni-content .create-page > .header {
+        padding-left: 44px;
+    }
+}
+
 uni-button[type='primary'] {
     background-color: #e61f1e !important;
 }
@@ -658,46 +668,43 @@ uni-left-window.collapsed {
     overflow: hidden;
 }
 
-uni-left-window.collapsed:hover {
-    width: px2rpx(280) !important;
-    white-space: nowrap;
-    overflow: hidden;
-}
-
 uni-content.collapsed {
     padding-left: px2rpx(64) !important;
 }
 
 @media screen and (max-width: 1100px) {
-    uni-left-window {
+    uni-left-window:not(.collapsed) {
+        width: px2rpx(280) !important;
+    }
+
+    uni-left-window.collapsed {
         width: px2rpx(64) !important;
-        white-space: nowrap;
-        overflow: hidden;
     }
 
-    uni-left-window:hover {
-        width: px2rpx(280) !important;
+    uni-content:not(.collapsed) {
+        padding-left: px2rpx(280) !important;
     }
 
-    uni-content {
+    uni-content.collapsed {
         padding-left: px2rpx(64) !important;
     }
 }
 
 @media screen and (max-width: 991px) {
-    uni-left-window {
+    uni-left-window,
+    uni-left-window:not(.collapsed),
+    uni-left-window.collapsed {
         width: px2rpx(0) !important;
         overflow: hidden;
         transition: width 281ms cubic-bezier(0.4, 0, 0.2, 1);
         white-space: nowrap;
     }
 
-    uni-content {
-        padding-left: px2rpx(0) !important;
-    }
-
-    uni-left-window:hover {
-        width: px2rpx(280) !important;
+    // Must beat `uni-content:not(.collapsed)` from the 1100px block (higher specificity).
+    uni-content,
+    uni-content:not(.collapsed),
+    uni-content.collapsed {
+        padding-left: 0 !important;
     }
 }
 
@@ -1289,6 +1296,85 @@ uni-content.collapsed {
     color: var(--bs-emphasis-color);
 }
 
+.notice-list {
+    .notice-item {
+        &::before {
+            content: '';
+            display: inline-block;
+            width: 4px;
+            height: 4px;
+            margin-right: 8px;
+            border-radius: 50%;
+            background-color: var(--cwg-placeholder-color);
+            vertical-align: middle;
+            position: relative;
+            top: -1px;
+        }
+    }
+
+    .notice-item.isOK::before {
+        background-color: var(--bs-success);
+    }
+}
+
+// 列表空状态垂直居中(非 cwg-tabel 场景)
+.list-empty-state {
+    width: 100%;
+    min-height: px2rpx(320);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex: 1;
+    box-sizing: border-box;
+    padding: px2rpx(24) px2rpx(20);
+}
+
+.list-empty-state-compact {
+    width: 100%;
+    min-height: px2rpx(160);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    box-sizing: border-box;
+    padding: px2rpx(16) px2rpx(12);
+}
+
+.list-content-empty {
+    min-height: px2rpx(360);
+    display: flex;
+    flex-direction: column;
+}
+
+// 不可编辑字段文案颜色全局统一
+.uni-easyinput__content.is-disabled {
+    background-color: var(--input-disabled-bg-color) !important;
+    color: var(--input-disabled-text-color) !important;
+
+    .uni-easyinput__content-input,
+    .uni-easyinput__content-textarea,
+    input,
+    textarea,
+    .uni-input-input {
+        color: var(--input-disabled-text-color) !important;
+        -webkit-text-fill-color: var(--input-disabled-text-color) !important;
+        opacity: 1 !important;
+    }
+}
+
+.disabled-text {
+    color: var(--input-disabled-text-color) !important;
+}
+
+.uni-select--disabled .uni-select__input-text {
+    color: var(--input-disabled-text-color) !important;
+}
+
+.uni-combox--disabled .uni-combox__input,
+.uni-combox--disabled .uni-combox__input-plac {
+    color: var(--input-disabled-text-color) !important;
+    -webkit-text-fill-color: var(--input-disabled-text-color) !important;
+}
+
 // 公共title样式
 .content-title {
     width: 100%;

+ 1 - 1
static/svg-icons-lib.js

@@ -172,7 +172,7 @@ const collections = {
         2
       ],
       "crm-ib": [
-        "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" class=\"IconContainer_icon__XfQWv\" viewBox=\"0 0 24 24\"><path stroke=\"#22ac38\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M17 17h3.305c.387 0 .695-.364.695-.804v-.751C21 13.548 19.67 12 18.024 12h-3.048M11 9.5a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0m8-3a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0M10.024 15C11.669 15 13 16.548 13 18.445v.75c0 .44-.308.805-.695.805h-7.61c-.38 0-.695-.357-.695-.804v-.751C4 16.54 5.337 15 6.976 15z\"/></svg>",
+        "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\" class=\"IconContainer_icon__XfQWv\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"#22ac38\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M17 17h3.305c.387 0 .695-.364.695-.804v-.751C21 13.548 19.67 12 18.024 12h-3.048M11 9.5a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0m8-3a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0M10.024 15C11.669 15 13 16.548 13 18.445v.75c0 .44-.308.805-.695.805h-7.61c-.38 0-.695-.357-.695-.804v-.751C4 16.54 5.337 15 6.976 15z\"/></svg>",
         2
       ],
       "crm-image": [

+ 3 - 3
utils/request.js

@@ -9,10 +9,10 @@ const timeout = 60000;
 const urlLoading = ['/list', '/page', '/field/params', '/dropdown', '/single', '/detail']
 import { CLIENT, lang, userToken, shopToken } from "@/composables/config";
 const LOGIN_PAGE_PATH = "/pages/login/index";
-import useGlobalStore from "@/stores/use-global-store";
+// import useGlobalStore from "@/stores/use-global-store";
 import useUserStore from "@/stores/use-user-store";
 
-const globalStore = useGlobalStore()
+// const globalStore = useGlobalStore()
 export const getCurrentPageUrl = () => {
   const pages = getCurrentPages(); // UniApp获取当前页面栈
   const currentPage = pages[pages.length - 1];
@@ -105,7 +105,7 @@ const responseInterceptor = (response, options = {}) => {
             success: () => {
               uni.setStorageSync('logoutToSystem',1)
               ls.set('mode', 'customer');
-              globalStore.setMode('customer');
+              // globalStore.setMode('customer');
               isRedirectingToLogin = false;
             },
             fail: () => {

+ 35 - 81
windows/left-window.vue

@@ -1,6 +1,7 @@
 <template>
-  <view class="cwg-sidebar bg-body" :class="{ 'sidebar-collapsed': isCollapsed, 'dark': isDark }">
-    <view class="menu-list">
+  <view class="left-window-root">
+    <view class="cwg-sidebar bg-body" :class="{ 'sidebar-collapsed': isCollapsed, 'dark': isDark }">
+      <view class="menu-list">
       <view class="menu" v-for="(item, index) in menus" :key="item.path + index">
         <view class="menu-item" @click="handleClick(index)">
           <cwg-icon :name="item.icon" :size="20" :color="!isDark ? '#6c8595' : '#fff'" />
@@ -20,72 +21,61 @@
       </view>
     </view>
     <view class="menu fixed">
-      <view class="menu-item btn-outline-danger btn  btn-danger btn-shadow mb-2 w-100 waves-effect ib-box btn-mode"
+      <view
+        class="menu-item btn btn-outline-danger btn-app-nav btn-shadow mb-2 w-100 waves-effect ib-box btn-mode"
         @click="setMode('customer')" v-if="mode !== 'customer'">
         <cwg-icon name="crm-trade" :size="20" color="#000" />
         <view class="menu-label" v-t="'Home.msg.Custom'" />
       </view>
-      <view class="menu-item btn-outline-danger btn btn-app-nav btn-shadow mb-2 w-100 waves-effect ib-box btn-mode"
+      <view
+        class="menu-item btn btn-outline-danger btn-app-nav btn-shadow mb-2 w-100 waves-effect ib-box btn-mode"
         @click="setMode('ib')" v-if="mode !== 'ib' && ibStatus">
         <cwg-icon name="crm-ib" :size="20" color="#000" />
         <view class="menu-label" v-t="'Home.msg.Ib'" />
       </view>
-      <view class="menu-item btn-outline-danger btn btn-app-nav btn-shadow mb-2 w-100 waves-effect ib-box btn-mode"
+      <view
+        class="menu-item btn btn-outline-danger btn-app-nav btn-shadow mb-2 w-100 waves-effect ib-box btn-mode"
         @click="setMode('follow')" v-if="mode !== 'follow'">
         <cwg-icon name="crm-gd" :size="20" color="#000" />
         <view class="menu-label" v-t="'Documentary.title'" />
       </view>
-      <view class="menu-item btn-outline-danger btn btn-app-nav btn-shadow mb-2 w-100 waves-effect zy-box"
-        @click="handleFixedMenuClick">
-        <view class="zy-icon1" :class="{ 'active': isCollapsed }">
-          <cwg-icon name="crm-zy" :size="20" color="#000" />
-        </view>
-
-      </view>
+    </view>
     </view>
   </view>
 </template>
 
 <script lang="ts" setup>
-import { ref, computed } from 'vue'
+import { computed, onMounted } from 'vue'
 import { storeToRefs } from 'pinia'
 import useUserStore from '@/stores/use-user-store'
 import { useMenuSplit } from '@/composables/useMenuSplit'
+import { useLeftSidebarCollapse } from '@/composables/useLeftSidebarCollapse'
 const { menus, setSubmenuRef, setMode, handleClick, handleSubmenuClick, mode } = useMenuSplit()
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
 import useGlobalStore from '@/stores/use-global-store'
 const globalStore = useGlobalStore()
 const isDark = computed(() => globalStore.theme === 'dark')
-// 控制侧边栏折叠状态
-const isCollapsed = ref(false)
+const { isCollapsed, syncCollapsedFromDom } = useLeftSidebarCollapse()
+
+onMounted(() => {
+  syncCollapsedFromDom()
+})
 
 // ib按钮展示
 const ibStatus = computed(() => {
   return userInfo.value?.customInfo?.ibInvalid == 0 && !!userInfo.value?.ibInfo
 })
-
-// 固定菜单项点击事件
-function handleFixedMenuClick() {
-  // 切换侧边栏折叠状态
-  isCollapsed.value = !isCollapsed.value
-  // 更新全局样式
-  const leftWindow = document.querySelector('uni-left-window')
-  const content = document.querySelector('uni-content')
-  if (leftWindow && content) {
-    if (isCollapsed.value) {
-      leftWindow.classList.add('collapsed')
-      content.classList.add('collapsed')
-    } else {
-      leftWindow.classList.remove('collapsed')
-      content.classList.remove('collapsed')
-    }
-  }
-}
 </script>
 <style scoped lang="scss">
 @import "@/uni.scss";
 
+.left-window-root {
+  position: relative;
+  width: 100%;
+  height: calc(100vh - 56px);
+}
+
 .cwg-sidebar {
   width: 100%;
   color: var(--bs-emphasis-color);
@@ -153,25 +143,26 @@ function handleFixedMenuClick() {
     }
   }
 
-  .zy-icon1{
-    display: flex;
-    align-items: center;
-    justify-content: center;
-  }
-
   .ib-box {
     border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);
     border-radius: var(--bs-btn-border-radius);
     background-color: var(--bs-btn-bg);
-    //border: 1px solid rgba(140, 69, 246, 0.2) !important;
     font-size: px2rpx(18);
     font-weight: 600;
-    //color: #fff;
+    color: var(--bs-emphasis-color);
+
+    :deep(.zui-svg-icon-image) {
+      transition: filter 0.15s ease;
+    }
 
     &:hover {
       color: var(--bs-btn-hover-color);
       background-color: var(--bs-btn-hover-bg);
       border-color: var(--bs-btn-hover-border-color);
+
+      :deep(.zui-svg-icon-image) {
+        filter: brightness(0) invert(1);
+      }
     }
   }
 
@@ -183,16 +174,6 @@ function handleFixedMenuClick() {
     }
   }
 
-  .zy-box {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-  }
-
-  .zy-box .active {
-    transform: rotate(180deg);
-  }
-
   .fixed {
     position: relative;
     width: 100%;
@@ -203,40 +184,13 @@ function handleFixedMenuClick() {
   }
 }
 
-.sidebar-collapsed:not(:hover) .menu-label,
-.sidebar-collapsed:not(:hover) .submenu-box,
-.sidebar-collapsed:not(:hover) .chevron-icon {
+.sidebar-collapsed .menu-label,
+.sidebar-collapsed .submenu-box,
+.sidebar-collapsed .chevron-icon {
   display: none;
 }
 
-.sidebar-collapsed:hover .menu-label,
-.sidebar-collapsed:hover .submenu-box,
-.sidebar-collapsed:hover .chevron-icon {
-  display: block;
-  //display: none;
-}
-
 .sidebar-collapsed .fixed {
   display: flex;
 }
-
-@media screen and (max-width: 1100px) {
-
-  .cwg-sidebar:not(:hover) .menu-label,
-  .cwg-sidebar:not(:hover) .submenu-box,
-  .cwg-sidebar:not(:hover) .chevron-icon {
-    display: none;
-  }
-
-  .cwg-sidebar:hover .menu-label,
-  .cwg-sidebar:hover .submenu-box,
-  .cwg-sidebar:hover .chevron-icon {
-    display: block;
-    //display: none;
-  }
-
-  .cwg-sidebar .fixed {
-    display: flex;
-  }
-}
 </style>