zhb há 1 mês atrás
pai
commit
9545133835
90 ficheiros alterados com 5952 adições e 5952 exclusões
  1. 44 0
      App.vue
  2. 1 1
      components/card-websdkLink.vue
  3. 1 1
      components/cwg-SuccessPrompt.vue
  4. 5 15
      components/cwg-asset-tabs.vue
  5. 5 2
      components/cwg-confirm-popup.vue
  6. 1 1
      components/cwg-custom-footer.vue
  7. 3 3
      components/cwg-detail-popup.vue
  8. 3 3
      components/cwg-file-picker-wrapper.vue
  9. 50 59
      components/cwg-file-picker.vue
  10. 10 10
      components/cwg-file.vue
  11. 2 1
      components/cwg-footer-link.vue
  12. 1 1
      components/cwg-header.vue
  13. 1 1
      components/cwg-image.vue
  14. 2 2
      components/cwg-notice-drawer.vue
  15. 2 2
      components/cwg-notice.vue
  16. 8 8
      components/cwg-payment.vue
  17. 1 1
      components/cwg-popup.vue
  18. 2 2
      components/cwg-sidebar.vue
  19. 1 1
      components/cwg-tabel.vue
  20. 4 8
      components/cwg-tooltip.vue
  21. 1 1
      components/cwg-video-player.vue
  22. 1 1
      components/cwg-wiper.vue
  23. 23 23
      pages/activities/components/ActivityDialogs.vue
  24. 6 5
      pages/activities/components/DrawLotteryRaffle.vue
  25. 8 8
      pages/activities/content.vue
  26. 14 11
      pages/activities/detail.vue
  27. 10 10
      pages/activities/index.vue
  28. 10 10
      pages/activities/monthly-list.vue
  29. 8 8
      pages/activities/surplus-list.vue
  30. 2 2
      pages/analytics/components/List.vue
  31. 2 2
      pages/analytics/detail.vue
  32. 51 57
      pages/common/download.vue
  33. 7 6
      pages/customer/account-select.vue
  34. 1 1
      pages/customer/components/ActivitiesSwiper.vue
  35. 2 2
      pages/customer/components/DeleteAccountDialogs.vue
  36. 3 3
      pages/customer/components/TerminalInfoDialog.vue
  37. 1 1
      pages/customer/components/TerminalNickNameDialog.vue
  38. 2 2
      pages/customer/components/Timeline.vue
  39. 1 1
      pages/customer/components/TransactionDialogs.vue
  40. 1 1
      pages/follow/follow-list.vue
  41. 560 583
      pages/follow/index.vue
  42. 18 18
      pages/follow/subscribe-list.vue
  43. 291 272
      pages/follow/trading-center-single.vue
  44. 489 488
      pages/follow/trading-center.vue
  45. 2 1
      pages/follow/trading-management.vue
  46. 230 241
      pages/ib/agentList.vue
  47. 832 919
      pages/ib/index.vue
  48. 31 57
      pages/ib/openAccount.vue
  49. 20 36
      pages/ib/openPammManager.vue
  50. 8 8
      pages/ib/promotion.vue
  51. 1 1
      pages/ib/settingPammManager.vue
  52. 3 3
      pages/login/index.vue
  53. 3 3
      pages/login/regist.vue
  54. 2 2
      pages/login/reset.vue
  55. 33 31
      pages/mine/components/BankInfoTab.vue
  56. 4 4
      pages/mine/improveImmediately.vue
  57. 128 61
      static/scss/global/global.scss
  58. 2 2
      uni.scss
  59. 2 2
      uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue
  60. 1 1
      uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue
  61. 1 1
      uni_modules/uni-combox/components/uni-combox/uni-combox.vue
  62. 245 243
      uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue
  63. 6 6
      uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue
  64. 2 2
      uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue
  65. 2 2
      uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue
  66. 160 159
      uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
  67. 4 4
      uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
  68. 1 1
      uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
  69. 4 4
      uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
  70. 630 601
      uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue
  71. 609 605
      uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue
  72. 259 256
      uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue
  73. 2 2
      uni_modules/uni-group/components/uni-group/uni-group.vue
  74. 8 8
      uni_modules/uni-icons/components/uni-icons/uni-icons.uvue
  75. 3 3
      uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue
  76. 197 197
      uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue
  77. 364 363
      uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue
  78. 1 1
      uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue
  79. 2 2
      uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue
  80. 1 1
      uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue
  81. 1 1
      uni_modules/uni-section/components/uni-section/uni-section.vue
  82. 1 1
      uni_modules/uni-table/components/uni-table/uni-table.vue
  83. 98 98
      uni_modules/uni-table/components/uni-thead/uni-thead.vue
  84. 140 140
      uni_modules/uni-table/components/uni-tr/uni-tr.vue
  85. 1 1
      uni_modules/uni-tabs/components/uni-tabs/uni-tabs.vue
  86. 139 139
      uni_modules/uni-title/components/uni-title/uni-title.vue
  87. 85 85
      uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue
  88. 10 10
      uni_modules/x-dropdown/readme.md
  89. 1 1
      windows/left-window.vue
  90. 14 5
      windows/top-window.vue

+ 44 - 0
App.vue

@@ -23,9 +23,53 @@ onShow((options) => {
 	updateRoute();
 	// checkUpdate()
 })
+
+// App.vue 或你的初始化文件中
+function initTheme() {
+	// #ifdef H5
+	// H5 端:使用 matchMedia 主动获取当前系统主题
+	const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches
+	const theme = isDarkMode ? 'dark' : 'light'
+	console.log('H5 初始主题:', theme)
+	globalStore.setGlobalTheme(theme)
+
+	// 监听变化(你的 onThemeChange 已经能工作,但可以再加一层保险)
+	const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)')
+	const handleChange = (e) => {
+		const newTheme = e.matches ? 'dark' : 'light'
+		console.log('matchMedia 监听到主题变化:', newTheme)
+		globalStore.setGlobalTheme(newTheme)
+	}
+	// 兼容旧版浏览器
+	if (darkModeQuery.addEventListener) {
+		darkModeQuery.addEventListener('change', handleChange)
+	} else {
+		darkModeQuery.addListener(handleChange)
+	}
+	// #endif
+
+	// #ifdef APP-PLUS
+	// App 端:使用原生 API
+	uni.getSystemInfo({
+		success: (res) => {
+			let theme = res.osTheme || 'light'
+			console.log('App 系统主题:', theme)
+			globalStore.setGlobalTheme(theme)
+		}
+	})
+	uni.onThemeChange((res) => {
+		console.log('App 主题变化:', res.theme)
+		globalStore.setGlobalTheme(res.theme)
+	})
+	// #endif
+}
+
+
 onLaunch((options) => {
 	// updateRoute();
 	// checkUpdate()
+	// 调用初始化
+	// initTheme()
 })
 
 watch(locale, () => {

+ 1 - 1
components/card-websdkLink.vue

@@ -190,7 +190,7 @@ defineExpose({
 
     .loading-text {
       font-size: px2rpx(14);
-      color: #666;
+      color: var(--bs-heading-color);
       margin: px2rpx(20) 0;
     }
   }

+ 1 - 1
components/cwg-SuccessPrompt.vue

@@ -64,7 +64,7 @@ const props = withDefaults(
 
 .success-prompt-desc {
   font-size: px2rpx(16);
-  color: #666;
+  color: var(--bs-heading-color);
   text-align: center;
   max-width: px2rpx(620);
   line-height: px2rpx(30);

+ 5 - 15
components/cwg-asset-tabs.vue

@@ -2,25 +2,15 @@
   <view class="asset-tabs">
     <!-- PC/平板 标签栏 -->
     <view class="tab-list">
-      <view
-        v-for="tab in tabs"
-        :key="tab.value"
-        class="tab-item"
-        :class="{ active: currentValue === tab.value }"
-        @click="handleClick(tab.value)"
-      >
+      <view v-for="tab in tabs" :key="tab.value" class="tab-item" :class="{ active: currentValue === tab.value }"
+        @click="handleClick(tab.value)">
         <text class="tab-label">{{ tab.text }}</text>
       </view>
     </view>
 
     <!-- 移动端 下拉选择器 -->
-    <cwg-combox
-      v-model:value="currentValue"
-      :clearable="false"
-      :options="tabs"
-      :placeholder="t('placeholder.choose')"
-      class="tab-picker"
-    />
+    <cwg-combox v-model:value="currentValue" :clearable="false" :options="tabs" :placeholder="t('placeholder.choose')"
+      class="tab-picker" />
   </view>
 </template>
 
@@ -94,7 +84,7 @@ const handleClick = (value) => {
 
 .tab-label {
   font-size: px2rpx(14);
-  color: #666;
+  color: var(--bs-heading-color);
   transition: all 0.3s;
 }
 

+ 5 - 2
components/cwg-confirm-popup.vue

@@ -74,6 +74,7 @@ onUnmounted(() => {
 
 <style scoped lang="scss">
 @import "@/uni.scss";
+
 :deep(.cwg-dialog) {
   width: px2rpx(500);
   background-color: #fff;
@@ -81,15 +82,17 @@ onUnmounted(() => {
   text-align: center;
   box-shadow: 0 px2rpx(10) px2rpx(20) rgba(0, 0, 0, 0.1);
 }
+
 .confirm-title {
   font-size: px2rpx(24);
   font-weight: 600;
-  color: #333;
+  color: var(--bs-heading-color);
   margin-bottom: px2rpx(30);
 }
+
 .confirm-content {
   font-size: px2rpx(20);
-  color: #666;
+  color: var(--bs-heading-color);
   margin-bottom: px2rpx(30);
   line-height: 1.5;
   word-break: break-word;

+ 1 - 1
components/cwg-custom-footer.vue

@@ -94,7 +94,7 @@ const linkList = [
 
         .copyright {
             width: 100%;
-            color: #999;
+            color: var(--bs-heading-color);
             margin-top: px2rpx(12);
         }
     }

+ 3 - 3
components/cwg-detail-popup.vue

@@ -150,7 +150,7 @@ const formatDate = (date, format) => {
     .dialog-title {
         font-size: px2rpx(20);
         font-weight: 600;
-        color: #333;
+        color: var(--bs-heading-color);
     }
 }
 
@@ -237,7 +237,7 @@ const formatDate = (date, format) => {
 
     .cancel-btn {
         background-color: #f5f5f5;
-        color: #666;
+        color: var(--bs-heading-color);
 
         &:active {
             background-color: #e8e8e8;
@@ -279,7 +279,7 @@ const formatDate = (date, format) => {
 
         &.default {
             background-color: #f5f5f5;
-            color: #666;
+            color: var(--bs-heading-color);
         }
     }
 }

+ 3 - 3
components/cwg-file-picker-wrapper.vue

@@ -520,7 +520,7 @@ const reUploadFile = (index) => {
 }
 
 .upload-icon {
-  color: #999;
+  color: var(--bs-heading-color);
 }
 
 /* 删除按钮 */
@@ -612,12 +612,12 @@ const reUploadFile = (index) => {
 .file-name {
   flex: 1;
   font-size: 14px;
-  color: #333;
+  color: var(--bs-heading-color);
 }
 
 .empty-text {
   text-align: center;
-  color: #999;
+  color: var(--bs-heading-color);
   padding: 20px 0;
 }
 </style>

+ 50 - 59
components/cwg-file-picker.vue

@@ -2,22 +2,10 @@
     <view class="common-file-uploader" :class="customClass">
         <!-- 编辑状态:显示可上传的文件选择器 -->
         <view v-if="editable" class="upload-wrapper">
-            <uni-file-picker
-              :limit="multiple ? limit : 1"
-              :title="title"
-              :file-mediatype="fileMediatype"
-              :mode="mode"
-              :auto-upload="false"
-              :value="fileList"
-              :disabled="disabled"
-              :readonly="readonly"
-              :image-styles="imageStyles"
-              :list-styles="listStyles"
-              :del-icon="showPreviewDelete"
-              :disablePreview="disablePreview"
-              :canChoose="canChoose"
-              @select="handleSelect"
-              @delete="handleDelete">
+            <uni-file-picker :limit="multiple ? limit : 1" :title="title" :file-mediatype="fileMediatype" :mode="mode"
+                :auto-upload="false" :value="fileList" :disabled="disabled" :readonly="readonly"
+                :image-styles="imageStyles" :list-styles="listStyles" :del-icon="showPreviewDelete"
+                :disablePreview="disablePreview" :canChoose="canChoose" @select="handleSelect" @delete="handleDelete">
                 <!-- 自定义上传按钮(单张图片且已有图片时显示替换) -->
                 <template v-if="$slots.default || showCustomButton">
                     <slot name="default">
@@ -29,7 +17,7 @@
                             </template>
                             <template v-else>
                                 <text class="plus">+</text>
-<!--                                <text class="tip">{{ uploadText || t('common.upload') }}</text>-->
+                                <!--                                <text class="tip">{{ uploadText || t('common.upload') }}</text>-->
                             </template>
                         </view>
                     </slot>
@@ -634,55 +622,58 @@ defineExpose({
                 border: none;
                 background: transparent;
             }
-          .uni-file-picker__files{
-            height: 100%;
-          }
-          .files-button{
-            height: 100%;
-          }
-          .custom-upload-btn {
-            width: 100%!important;
-            height: 100%!important;
-            display: flex;
-            flex-direction: column;
-            align-items: center;
-            justify-content: center;
 
-            &.replace-btn {
-              background: rgba(0, 0, 0, 0.03);
+            .uni-file-picker__files {
+                height: 100%;
+            }
 
-              .replace-icon {
-                font-size: 40px;
-                color: #666;
-                margin-bottom: 4px;
-                transform: rotate(90deg);
-              }
+            .files-button {
+                height: 100%;
+            }
 
-              .tip {
-                color: #666;
-              }
+            .custom-upload-btn {
+                width: 100% !important;
+                height: 100% !important;
+                display: flex;
+                flex-direction: column;
+                align-items: center;
+                justify-content: center;
+
+                &.replace-btn {
+                    background: rgba(0, 0, 0, 0.03);
+
+                    .replace-icon {
+                        font-size: 40px;
+                        color: var(--bs-heading-color);
+                        margin-bottom: 4px;
+                        transform: rotate(90deg);
+                    }
 
-              &:hover {
-                background: rgba(234, 32, 39, 0.05);
+                    .tip {
+                        color: var(--bs-heading-color);
+                    }
 
-                .replace-icon,
-                .tip {
-                  color: #ea2027;
+                    &:hover {
+                        background: rgba(234, 32, 39, 0.05);
+
+                        .replace-icon,
+                        .tip {
+                            color: #ea2027;
+                        }
+                    }
                 }
-              }
-            }
 
-            .plus {
-              font-size: 48px;
-              color: #9ca3af;
-              //line-height: 1;
-            }
+                .plus {
+                    font-size: 48px;
+                    color: #9ca3af;
+                    //line-height: 1;
+                }
 
-            .tip {
-              font-size: 24px;
-              color: #6b7280;
+                .tip {
+                    font-size: 24px;
+                    color: #6b7280;
+                }
             }
-          }
 
             .file-picker__box-list {
                 display: flex;
@@ -771,7 +762,7 @@ defineExpose({
                 right: 8px;
                 top: 8px;
                 font-size: 24px;
-                color: #666;
+                color: var(--bs-heading-color);
             }
         }
 
@@ -842,7 +833,7 @@ defineExpose({
             border: 1px solid #e5e7eb;
 
             text {
-                color: #999;
+                color: var(--bs-heading-color);
                 font-size: 24px;
             }
         }

+ 10 - 10
components/cwg-file.vue

@@ -1,21 +1,21 @@
 <template>
     <view class="file-preview">
         <!-- PDF 预览链接 -->
-<!--        <view v-if="isPdfFile" class="pdf-link" @click="handlePreviewPdf">-->
-<!--            <uni-icons type="document" size="20" color="#ff0000"></uni-icons>-->
-<!--            <text class="pdf-text">{{ displayFileName }}</text>-->
-<!--        </view>-->
+        <!--        <view v-if="isPdfFile" class="pdf-link" @click="handlePreviewPdf">-->
+        <!--            <uni-icons type="document" size="20" color="#ff0000"></uni-icons>-->
+        <!--            <text class="pdf-text">{{ displayFileName }}</text>-->
+        <!--        </view>-->
 
         <!-- 图片预览 -->
         <view v-if="isImageFile" class="image-preview">
-          <image :src="fullPath" mode="aspectFill" class="preview-image" @click.stop="handlePreviewImage" />
+            <image :src="fullPath" mode="aspectFill" class="preview-image" @click.stop="handlePreviewImage" />
         </view>
 
         <!-- 其他文件类型 -->
         <view v-else class="file-info">
-          <cwg-icon icon="crm-document" :size="24" color="#000" />
-<!--            <uni-icons type="folder" size="20" color="#007aff"></uni-icons>-->
-<!--            <text class="file-name">{{ displayFileName }}</text>-->
+            <cwg-icon icon="crm-document" :size="24" color="#000" />
+            <!--            <uni-icons type="folder" size="20" color="#007aff"></uni-icons>-->
+            <!--            <text class="file-name">{{ displayFileName }}</text>-->
         </view>
     </view>
 </template>
@@ -44,7 +44,7 @@ const props = defineProps({
 // 完整的文件路径
 const fullPath = computed(() => {
     console.log(props.updateUrl, props.path);
-    
+
     if (!props.path) return ''
     return props.updateUrl + props.path
 })
@@ -159,7 +159,7 @@ const handlePreviewImage = () => {
     align-items: center;
 
     .file-name {
-        color: #666;
+        color: var(--bs-heading-color);
         font-size: px2rpx(14);
         max-width: px2rpx(200);
         overflow: hidden;

+ 2 - 1
components/cwg-footer-link.vue

@@ -46,6 +46,7 @@ const linkList = [
         display: flex;
         justify-content: space-between;
         box-sizing: border-box;
+        padding: 0;
 
         @media screen and (max-width: 1504px) {
             padding: 0 px2rpx(16);
@@ -71,7 +72,7 @@ const linkList = [
 
         .copyright {
             width: 100%;
-            color: #999;
+            color: var(--bs-heading-color);
             margin-top: px2rpx(12);
         }
     }

+ 1 - 1
components/cwg-header.vue

@@ -2,7 +2,7 @@
   <view class="pages-header" v-if="showBack">
     <view class="header">
       <view v-if="showBackIcon" class="back">
-        <cwg-icon name="dropdown" class="back-icon" color="#000" @click="handleBack" />
+        <cwg-icon name="dropdown" class="back-icon" color="#fff" @click="handleBack" />
       </view>
       <view>{{ headerTitleReady ? headerTitle : '' }}</view>
     </view>

+ 1 - 1
components/cwg-image.vue

@@ -66,7 +66,7 @@ const handlePreviewImage = () => {
     align-items: center;
 
     .file-name {
-        color: #666;
+        color: var(--bs-heading-color);
         font-size: px2rpx(14);
         max-width: px2rpx(200);
         overflow: hidden;

+ 2 - 2
components/cwg-notice-drawer.vue

@@ -104,14 +104,14 @@ defineExpose({
 
         .item-title {
             font-size: px2rpx(14);
-            color: #333;
+            color: var(--bs-heading-color);
             line-height: 1.4;
             margin-bottom: px2rpx(4);
         }
 
         .item-time {
             font-size: px2rpx(12);
-            color: #999;
+            color: var(--bs-heading-color);
         }
     }
 

+ 2 - 2
components/cwg-notice.vue

@@ -173,14 +173,14 @@ onUnmounted(() => {
 
             .item-title {
                 font-size: px2rpx(14);
-                color: #333;
+                color: var(--bs-heading-color);
                 line-height: 1.4;
                 margin-bottom: px2rpx(4);
             }
 
             .item-time {
                 font-size: px2rpx(12);
-                color: #999;
+                color: var(--bs-heading-color);
             }
         }
 

+ 8 - 8
components/cwg-payment.vue

@@ -314,7 +314,7 @@ onUnmounted(() => {
       margin-left: px2rpx(6);
       font-size: px2rpx(14);
       font-weight: 500;
-      color: #97A1C0;
+      color: var(--bs-heading-color);
     }
   }
 
@@ -334,7 +334,7 @@ onUnmounted(() => {
 
       .drawer-title {
         font-size: px2rpx(14);
-        color: #333;
+        color: var(--bs-heading-color);
       }
     }
 
@@ -344,19 +344,19 @@ onUnmounted(() => {
       .balance-amount {
         font-size: px2rpx(18);
         font-weight: bold;
-        color: #97A1C0;
+        color: var(--bs-heading-color);
         margin-bottom: px2rpx(8);
       }
 
       .account-type {
         font-size: px2rpx(13);
-        color: #666;
+        color: var(--bs-heading-color);
         margin-bottom: px2rpx(4);
       }
 
       .account-number {
         font-size: px2rpx(13);
-        color: #999;
+        color: var(--bs-heading-color);
       }
     }
 
@@ -370,7 +370,7 @@ onUnmounted(() => {
         height: px2rpx(36);
         line-height: px2rpx(36);
         background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;
-        color: #333;
+        color: var(--bs-heading-color);
         font-size: px2rpx(13);
         border-radius: px2rpx(4);
         margin: 0;
@@ -408,14 +408,14 @@ onUnmounted(() => {
 
       .item-title {
         font-size: px2rpx(14);
-        color: #333;
+        color: var(--bs-heading-color);
         line-height: 1.4;
         margin-bottom: px2rpx(4);
       }
 
       .item-time {
         font-size: px2rpx(12);
-        color: #999;
+        color: var(--bs-heading-color);
       }
     }
 

+ 1 - 1
components/cwg-popup.vue

@@ -213,7 +213,7 @@ defineExpose({
     .dialog-title {
         font-size: px2rpx(20);
         font-weight: 600;
-        color: #333;
+        color: var(--bs-heading-color);
     }
 
     .dialog-close {

+ 2 - 2
components/cwg-sidebar.vue

@@ -366,7 +366,7 @@ onUnmounted(() => {
 
         .wallet-type {
           font-size: 12px;
-          color: #999;
+          color: var(--bs-heading-color);
           margin-bottom: px2rpx(4);
         }
 
@@ -377,7 +377,7 @@ onUnmounted(() => {
 
           .wallet-id {
             font-size: 12px;
-            color: #999;
+            color: var(--bs-heading-color);
           }
         }
       }

+ 1 - 1
components/cwg-tabel.vue

@@ -963,7 +963,7 @@ defineExpose({
 
 .detail-btn-mobile {
     background-color: #f0f0f0;
-    color: #333;
+    color: var(--bs-heading-color);
 }
 
 /* 分页样式 */

+ 4 - 8
components/cwg-tooltip.vue

@@ -4,12 +4,8 @@
 		<slot></slot>
 
 		<!-- 弹出层 -->
-		<view 
-			v-if="content || $slots.content" 
-			class="cwg-tooltip-popup"
-			:class="[`placement-${placement}`, { show: isVisible }]"
-			:style="popupStyle"
-		>
+		<view v-if="content || $slots.content" class="cwg-tooltip-popup"
+			:class="[`placement-${placement}`, { show: isVisible }]" :style="popupStyle">
 			<!-- 内容插槽 -->
 			<slot name="content">
 				{{ content }}
@@ -140,8 +136,8 @@ defineExpose({
 	display: none;
 	padding: px2rpx(16) px2rpx(24);
 	font-size: px2rpx(16);
-	color: #333;
-	
+	color: var(--bs-heading-color);
+
 	/* 你的样式要求 */
 	background-color: var(--color-slate-100) !important;
 	border-radius: px2rpx(8);

+ 1 - 1
components/cwg-video-player.vue

@@ -52,7 +52,7 @@ const onVideoError = (err) => {
     .video-title {
         font-size: 28rpx;
         font-weight: 600;
-        color: #333;
+        color: var(--bs-heading-color);
         margin-bottom: 20rpx;
         padding-left: 20rpx;
     }

+ 1 - 1
components/cwg-wiper.vue

@@ -218,7 +218,7 @@ const onItemClick = (index: number) => {
 
     .default-content {
         font-size: px2rpx(24);
-        color: #333;
+        color: var(--bs-heading-color);
     }
 }
 

+ 23 - 23
pages/activities/components/ActivityDialogs.vue

@@ -13,7 +13,7 @@
                 </view>
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogChinaUnionPay')">{{ t('Btn.Cancel')
-                        }}</button>
+                    }}</button>
                     <button class="btn-confirm" type="primary" @click="handleConfirm('toTransformActive')">{{
                         t('Btn.Confirm') }}</button>
                 </view>
@@ -33,7 +33,7 @@
                 </view>
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogChinaUnionPay1')">{{ t('Btn.Cancel')
-                        }}</button>
+                    }}</button>
                     <button class="btn-confirm" type="primary" @click="handleConfirm('toRealizationActive')">{{
                         t('Btn.Confirm') }}</button>
                 </view>
@@ -53,7 +53,7 @@
                 </view>
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogChinaUnionPayJX')">{{ t('Btn.Cancel')
-                        }}</button>
+                    }}</button>
                     <button class="btn-confirm" type="primary" @click="closeDialog('dialogChinaUnionPayJX')">{{
                         t('Btn.Confirm') }}</button>
                 </view>
@@ -80,7 +80,7 @@
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogDealResult')">{{ t('Btn.Cancel') }}</button>
                     <button class="btn-confirm" type="primary" @click="handleConfirm('toApply23')">{{ t('Btn.Confirm')
-                        }}</button>
+                    }}</button>
                 </view>
             </view>
         </uni-popup>
@@ -105,7 +105,7 @@
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogDealResultJx')">{{ t('Btn.Cancel') }}</button>
                     <button class="btn-confirm" type="primary" @click="handleConfirm('toApply23Jx')">{{ t('Btn.Confirm')
-                        }}</button>
+                    }}</button>
                 </view>
             </view>
         </uni-popup>
@@ -129,7 +129,7 @@
                 </scroll-view>
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogDealResultJxVip')">{{ t('Btn.Cancel')
-                        }}</button>
+                    }}</button>
                     <button class="btn-confirm" type="primary" @click="handleConfirm('toApply23JxVip')">{{
                         t('Btn.Confirm') }}</button>
                 </view>
@@ -176,9 +176,9 @@
                 </scroll-view>
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogDealResultCpt')">{{ t('Btn.Cancel')
-                        }}</button>
+                    }}</button>
                     <button class="btn-confirm" type="primary" @click="handleConfirm('toApplyCpt')">{{ t('Btn.Confirm')
-                        }}</button>
+                    }}</button>
                 </view>
             </view>
         </uni-popup>
@@ -202,7 +202,7 @@
                 </scroll-view>
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogDealResultJxJYB')">{{ t('Btn.Cancel')
-                        }}</button>
+                    }}</button>
                     <button class="btn-confirm" type="primary" @click="handleConfirm('toApply24JYBVip')">{{
                         t('Btn.Confirm') }}</button>
                 </view>
@@ -229,7 +229,7 @@
                 </scroll-view>
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogDealResultNoWorries')">{{ t('Btn.Cancel')
-                        }}</button>
+                    }}</button>
                     <button class="btn-confirm" type="primary" @click="handleConfirm('toApplyNoWorries')">{{
                         t('news_add_field1.activitiesNoWorries.item6_1') }}</button>
                 </view>
@@ -292,7 +292,7 @@
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogNewTask')">{{ t('Home.msg.item3') }}</button>
                     <button class="btn-confirm" type="primary" @click="closeDialog('dialogNewTask')">{{ t('Btn.Confirm')
-                        }}</button>
+                    }}</button>
                 </view>
             </view>
         </uni-popup>
@@ -310,7 +310,7 @@
                 </view>
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogNewTaskDraw')">{{ t('Home.msg.item3')
-                        }}</button>
+                    }}</button>
                 </view>
             </view>
         </uni-popup>
@@ -340,7 +340,7 @@
                 </scroll-view>
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogSurplusActivity')">{{ t('Btn.Cancel')
-                        }}</button>
+                    }}</button>
                     <button class="btn-confirm" type="primary" @click="handleConfirm('confirmSurplusActivity')"
                         :disabled="!selectedAccount || !selectedSurplusValue">{{ t('Btn.Confirm') }}</button>
                 </view>
@@ -361,7 +361,7 @@
                 </view>
                 <view class="popup-footer">
                     <button class="btn-cancel" @click="closeDialog('dialogSurplusActivity1')">{{ t('Btn.Cancel')
-                        }}</button>
+                    }}</button>
                     <button class="btn-confirm" type="primary" @click="handleConfirm('confirmSurplusActivity1')">{{
                         t('Btn.Confirm') }}</button>
                 </view>
@@ -565,7 +565,7 @@ const setPopupRef = (el: any, key: string) => {
         .popup-title {
             font-size: 32rpx;
             font-weight: bold;
-            color: #333;
+            color: var(--bs-heading-color);
         }
     }
 
@@ -576,7 +576,7 @@ const setPopupRef = (el: any, key: string) => {
             display: block;
             font-size: 28rpx;
             line-height: 1.6;
-            color: #666;
+            color: var(--bs-heading-color);
             text-align: center;
         }
 
@@ -587,7 +587,7 @@ const setPopupRef = (el: any, key: string) => {
                 display: block;
                 margin-bottom: 16rpx;
                 font-size: 28rpx;
-                color: #666;
+                color: var(--bs-heading-color);
             }
 
             .form-input {
@@ -604,13 +604,13 @@ const setPopupRef = (el: any, key: string) => {
                 border: 1rpx solid #e5e5e5;
                 border-radius: 8rpx;
                 font-size: 28rpx;
-                color: #333;
+                color: var(--bs-heading-color);
             }
         }
 
         .form-tip {
             font-size: 24rpx;
-            color: #999;
+            color: var(--bs-heading-color);
             margin-top: 10rpx;
         }
 
@@ -620,7 +620,7 @@ const setPopupRef = (el: any, key: string) => {
             gap: 20rpx;
             font-size: 28rpx;
             line-height: 1.6;
-            color: #666;
+            color: var(--bs-heading-color);
         }
 
         .calculator-item {
@@ -630,7 +630,7 @@ const setPopupRef = (el: any, key: string) => {
                 display: block;
                 margin-bottom: 16rpx;
                 font-size: 28rpx;
-                color: #666;
+                color: var(--bs-heading-color);
             }
 
             .calculator-input {
@@ -646,7 +646,7 @@ const setPopupRef = (el: any, key: string) => {
         .calculator-result {
             font-size: 28rpx;
             line-height: 1.8;
-            color: #666;
+            color: var(--bs-heading-color);
 
             .red {
                 color: #ff4d4f;
@@ -670,7 +670,7 @@ const setPopupRef = (el: any, key: string) => {
 
             &.btn-cancel {
                 background-color: #f5f5f5;
-                color: #666;
+                color: var(--bs-heading-color);
             }
 
             &.btn-confirm {

+ 6 - 5
pages/activities/components/DrawLotteryRaffle.vue

@@ -4,7 +4,8 @@
         <view class="times">{{ t('wallet.item10') }}{{ curLuckyDrawTimesF }}{{ t('wallet.item11') }}</view>
 
         <view class="lottery-grid">
-            <view v-for="(item, index) in lotteryList" :key="index" class="lottery-item" :class="{ active: drawIndex === index }">
+            <view v-for="(item, index) in lotteryList" :key="index" class="lottery-item"
+                :class="{ active: drawIndex === index }">
                 <image :src="item.icon" mode="aspectFill" />
                 <text>{{ item.name }}</text>
             </view>
@@ -77,14 +78,14 @@ const startDraw = () => {
     .title {
         font-size: 32rpx;
         font-weight: bold;
-        color: #333;
+        color: var(--bs-heading-color);
         text-align: center;
         margin-bottom: 20rpx;
     }
 
     .times {
         font-size: 28rpx;
-        color: #666;
+        color: var(--bs-heading-color);
         text-align: center;
         margin-bottom: 40rpx;
     }
@@ -112,7 +113,7 @@ const startDraw = () => {
 
             text {
                 font-size: 24rpx;
-                color: #666;
+                color: var(--bs-heading-color);
             }
 
             &.active {
@@ -121,7 +122,7 @@ const startDraw = () => {
                 box-shadow: 0 0 20rpx rgba(255, 215, 0, 0.5);
 
                 text {
-                    color: #333;
+                    color: var(--bs-heading-color);
                     font-weight: bold;
                 }
             }

+ 8 - 8
pages/activities/content.vue

@@ -298,11 +298,11 @@
                                 <view class="lis" style="margin-left: 15px;margin-top: 20px;">
                                     <h4><span v-t="'news_add_field1.activitiesJX.item8'" />{{
                                         timeJx.applicationStartTime
-                                    }}
+                                        }}
                                         - {{ timeJx.applicationEndTime }}</h4>
                                     <h4><span v-t="'news_add_field1.activitiesJX.item9'" />{{
                                         timeJx.activityStartTime
-                                    }} -
+                                        }} -
                                         {{ timeJx.activityEndTime }}</h4>
                                 </view>
                             </view>
@@ -435,7 +435,7 @@
                                 <view class="lis" style="margin-left: 15px;margin-top: 20px;">
                                     <h4><span v-t="'news_add_field1.activitiesNZ.item8'" />{{
                                         timeJx.applicationStartTime
-                                    }}
+                                        }}
                                         - {{ timeJx.applicationEndTime }}</h4>
                                 </view>
                             </view>
@@ -969,13 +969,13 @@
                                                 <view>
                                                     <span v-t="'news_add_field1.NewYear24.item10BG9'" v-if="!isZh" />
                                                     <span v-if="item.interestRateExtraDay == 1">{{ isCountDown1
-                                                    }}</span>
+                                                        }}</span>
                                                     <span v-if="item.interestRateExtraDay == 3">{{ isCountDown3
-                                                    }}</span>
+                                                        }}</span>
                                                     <span v-if="item.interestRateExtraDay == 5">{{ isCountDown5
-                                                    }}</span>
+                                                        }}</span>
                                                     <span v-if="item.interestRateExtraDay == 7">{{ isCountDown7
-                                                    }}</span>
+                                                        }}</span>
                                                     <span v-t="'news_add_field1.NewYear24.item10BG9'" v-if="!isZh" />
                                                 </view>
                                                 <view v-t="'news_add_field1.NewYear24.item10BG10'" />
@@ -1557,7 +1557,7 @@ th {
     }
 
     .describe {
-        color: #333;
+        color: var(--bs-heading-color);
         padding: 10px;
         font-size: 14px;
         line-height: 1.5;

+ 14 - 11
pages/activities/detail.vue

@@ -301,11 +301,11 @@
                                 <view class="lis" style="margin-left: 15px;margin-top: 20px;">
                                     <h4><span v-t="'news_add_field1.activitiesJX.item8'" />{{
                                         timeJx.applicationStartTime
-                                    }}
+                                        }}
                                         - {{ timeJx.applicationEndTime }}</h4>
                                     <h4><span v-t="'news_add_field1.activitiesJX.item9'" />{{
                                         timeJx.activityStartTime
-                                    }} -
+                                        }} -
                                         {{ timeJx.activityEndTime }}</h4>
                                 </view>
                             </view>
@@ -328,7 +328,8 @@
                       color: #3490CE;
                       text-align: center;
                       margin: 20px 0;">
-                                <cwg-link type="html" title="news_add_field1.activitiesJX.item22" class="crm-cursor" style="font-size: 16px;
+                                <cwg-link type="html" title="news_add_field1.activitiesJX.item22" class="crm-cursor"
+                                    style="font-size: 16px;
                       font-weight: bold;
                       color: #3490CE;
                       text-align: center;
@@ -369,7 +370,8 @@
                       color: #3490CE;
                       text-align: center;
                       margin: 20px 0;">
-                                <cwg-link type="html" title="news_add_field1.activitiesJX.item22" class="crm-cursor" style="font-size: 16px;
+                                <cwg-link type="html" title="news_add_field1.activitiesJX.item22" class="crm-cursor"
+                                    style="font-size: 16px;
                       font-weight: bold;
                       color: #3490CE;
                       text-align: center;
@@ -415,7 +417,8 @@
                       color: #3490CE;
                       text-align: center;
                       margin: 20px 0;">
-                                <cwg-link type="html" title="news_add_field1.activitiesJYB.item22" class="crm-cursor" style="font-size: 16px;
+                                <cwg-link type="html" title="news_add_field1.activitiesJYB.item22" class="crm-cursor"
+                                    style="font-size: 16px;
                       font-weight: bold;
                       color: #3490CE;
                       text-align: center;
@@ -435,7 +438,7 @@
                                 <view class="lis" style="margin-left: 15px;margin-top: 20px;">
                                     <h4><span v-t="'news_add_field1.activitiesNZ.item8'" />{{
                                         timeJx.applicationStartTime
-                                    }}
+                                        }}
                                         - {{ timeJx.applicationEndTime }}</h4>
                                 </view>
                             </view>
@@ -969,13 +972,13 @@
                                                 <view>
                                                     <span v-t="'news_add_field1.NewYear24.item10BG9'" v-if="!isZh" />
                                                     <span v-if="item.interestRateExtraDay == 1">{{ isCountDown1
-                                                    }}</span>
+                                                        }}</span>
                                                     <span v-if="item.interestRateExtraDay == 3">{{ isCountDown3
-                                                    }}</span>
+                                                        }}</span>
                                                     <span v-if="item.interestRateExtraDay == 5">{{ isCountDown5
-                                                    }}</span>
+                                                        }}</span>
                                                     <span v-if="item.interestRateExtraDay == 7">{{ isCountDown7
-                                                    }}</span>
+                                                        }}</span>
                                                     <span v-t="'news_add_field1.NewYear24.item10BG9'" v-if="!isZh" />
                                                 </view>
                                                 <view v-t="'news_add_field1.NewYear24.item10BG10'" />
@@ -1553,7 +1556,7 @@ th {
     }
 
     .describe {
-        color: #333;
+        color: var(--bs-heading-color);
         padding: 10px;
         font-size: 14px;
         line-height: 1.5;

+ 10 - 10
pages/activities/index.vue

@@ -415,7 +415,7 @@
                 <button type="primary" @click="toApplyNoWorries">{{
                     t('news_add_field1.activitiesNoWorries.item6_1') }}</button>
                 <button @click="toApplyNoWorriesCancel">{{ t('news_add_field1.activitiesNoWorries.item6_2')
-                }}</button>
+                    }}</button>
             </template>
         </cwg-popup>
 
@@ -430,7 +430,7 @@
                 <button type="primary" @click="realizationNoWorries">{{
                     t('news_add_field1.activitiesNoWorries.item6_1') }}</button>
                 <button @click="dialogNoWorries = false">{{ t('news_add_field1.activitiesNoWorries.item6_2')
-                    }}</button>
+                }}</button>
             </template>
         </cwg-popup>
 
@@ -445,7 +445,7 @@
                 <button type="primary" @click="dialogNoWorriesApply = false">{{
                     t('news_add_field1.activitiesNoWorries.item6_1') }}</button>
                 <button @click="dialogNoWorriesApply = false">{{ t('news_add_field1.activitiesNoWorries.item6_2')
-                }}</button>
+                    }}</button>
             </template>
         </cwg-popup>
 
@@ -470,7 +470,7 @@
             </view>
             <template #footer>
                 <button type="primary" @click="calculateIncome">{{ t('news_add_field1.NewYear24.item8_1')
-                    }}</button>
+                }}</button>
                 <button @click="openCalculatorFlag = false">{{ t('news_add_field1.NewYear24.item8_2') }}</button>
             </template>
         </cwg-popup>
@@ -2453,18 +2453,18 @@ onReachBottom(() => {
                     flex: 1;
                     padding-right: 10px;
                     box-sizing: border-box;
-                    color: #333;
+                    color: var(--bs-heading-color);
                 }
 
                 .card-time {
                     font-size: 12px;
-                    color: #999;
+                    color: var(--bs-heading-color);
                 }
             }
 
             .card-description {
                 font-size: 14px;
-                color: #666;
+                color: var(--bs-heading-color);
                 margin-bottom: 16px;
                 line-height: 1.4;
                 flex: 1;
@@ -2490,7 +2490,7 @@ onReachBottom(() => {
 
                 &.secondary {
                     border: 1px solid #ddd;
-                    color: #666;
+                    color: var(--bs-heading-color);
 
                     &:hover {
                         border-color: #eb3f57;
@@ -2500,7 +2500,7 @@ onReachBottom(() => {
 
                 &.disabled {
                     background: #f5f5f5;
-                    color: #999;
+                    color: var(--bs-heading-color);
                     pointer-events: none;
                     cursor: auto;
                 }
@@ -2544,7 +2544,7 @@ onReachBottom(() => {
         .form-label {
             width: 120px;
             font-weight: 500;
-            color: #333;
+            color: var(--bs-heading-color);
             font-size: 14px;
         }
 

+ 10 - 10
pages/activities/monthly-list.vue

@@ -224,7 +224,7 @@ const getStatusStyle = (status: number) => {
     } else if (status == 4) {
         return "color: #999999;"
     }
-    return "color: #333;"
+    return "color: var(--bs-heading-color);"
 }
 
 const getGiveStatusText = (giveStatus: number) => {
@@ -246,7 +246,7 @@ const getGiveStatusStyle = (giveStatus: number) => {
     } else if (giveStatus == 3) {
         return "color: #52c41a;"
     }
-    return "color: #333;"
+    return "color: var(--bs-heading-color);"
 }
 
 const canPerformAction = (task: any) => {
@@ -491,7 +491,7 @@ watch(
 
         .no-data-content {
             text-align: center;
-            color: #999;
+            color: var(--bs-heading-color);
 
             i {
                 font-size: px2rpx(48);
@@ -536,7 +536,7 @@ watch(
 
         .status-text {
             font-size: px2rpx(14);
-            color: #666;
+            color: var(--bs-heading-color);
             font-weight: 500;
         }
     }
@@ -602,15 +602,15 @@ watch(
 
             &.total-card {
                 background: #ffffff;
-                color: #333;
+                color: var(--bs-heading-color);
 
                 // border: 1px solid gray;
                 .card-value {
-                    color: #333;
+                    color: var(--bs-heading-color);
                 }
 
                 .card-desc {
-                    color: #999;
+                    color: var(--bs-heading-color);
                 }
 
                 // 状态卡片的特殊样式
@@ -651,7 +651,7 @@ watch(
             .card-content {
                 .card-title {
                     font-size: px2rpx(16);
-                    color: #666;
+                    color: var(--bs-heading-color);
                     margin-bottom: px2rpx(8);
                     font-weight: 500;
                 }
@@ -659,14 +659,14 @@ watch(
                 .card-value {
                     font-size: px2rpx(18);
                     font-weight: 700;
-                    color: #333;
+                    color: var(--bs-heading-color);
                     margin-bottom: px2rpx(4);
                     line-height: 1;
                 }
 
                 .card-desc {
                     font-size: px2rpx(12);
-                    color: #999;
+                    color: var(--bs-heading-color);
                     line-height: 1.4;
                 }
             }

+ 8 - 8
pages/activities/surplus-list.vue

@@ -332,7 +332,7 @@ watch(
 
         .no-data-content {
             text-align: center;
-            color: #999;
+            color: var(--bs-heading-color);
 
             i {
                 font-size: px2rpx(48);
@@ -377,7 +377,7 @@ watch(
 
         .status-text {
             font-size: px2rpx(14);
-            color: #666;
+            color: var(--bs-heading-color);
             font-weight: 500;
         }
     }
@@ -443,15 +443,15 @@ watch(
 
             &.total-card {
                 background: #ffffff;
-                color: #333;
+                color: var(--bs-heading-color);
 
                 // border: 1px solid gray;
                 .card-value {
-                    color: #333;
+                    color: var(--bs-heading-color);
                 }
 
                 .card-desc {
-                    color: #999;
+                    color: var(--bs-heading-color);
                 }
 
                 // 状态卡片的特殊样式
@@ -492,7 +492,7 @@ watch(
             .card-content {
                 .card-title {
                     font-size: px2rpx(16);
-                    color: #666;
+                    color: var(--bs-heading-color);
                     margin-bottom: px2rpx(8);
                     font-weight: 500;
                 }
@@ -500,14 +500,14 @@ watch(
                 .card-value {
                     font-size: px2rpx(18);
                     font-weight: 700;
-                    color: #333;
+                    color: var(--bs-heading-color);
                     margin-bottom: px2rpx(4);
                     line-height: 1;
                 }
 
                 .card-desc {
                     font-size: px2rpx(12);
-                    color: #999;
+                    color: var(--bs-heading-color);
                     line-height: 1.4;
                 }
             }

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

@@ -254,13 +254,13 @@ defineExpose({ load, loadMore })
   text-align: center;
   padding: px2rpx(10);
   font-size: px2rpx(14);
-  color: #999;
+  color: var(--bs-heading-color);
 }
 
 .empty {
   text-align: center;
   padding: 100rpx 0;
-  color: #999;
+  color: var(--bs-heading-color);
   font-size: px2rpx(14);
 }
 </style>

+ 2 - 2
pages/analytics/detail.vue

@@ -297,7 +297,7 @@ onUnmounted(() => {
         .con-time {
             margin-bottom: 10rpx;
             font-size: 12rpx;
-            color: #999;
+            color: var(--bs-heading-color);
         }
 
         .con-des {
@@ -402,7 +402,7 @@ uni-rich-text p {
     font-size: 14rpx !important;
     /* 对应 14px */
     line-height: 1.6 !important;
-    color: #333;
+    color: var(--bs-heading-color);
 }
 
 /* 覆盖 span 样式,移除固定字体和大小 */

+ 51 - 57
pages/common/download.vue

@@ -75,23 +75,21 @@
                                 <view class="qr-codes">
                                     <view class="qr-item">
                                         <view class="qr-label">Google Play</view>
-										// #ifdef H5
-										<QrCode v-if="showQrcode && mt41" :key="mt41" :text="mt41"></QrCode>
-										// #endif
-										// #ifdef APP-PLUS
-                                        <image class="mt" src="/static/images/mt/mt41.png" alt=""
-                                            mode="widthFix" />
-										// #endif
+                                        // #ifdef H5
+                                        <QrCode v-if="showQrcode && mt41" :key="mt41" :text="mt41"></QrCode>
+                                        // #endif
+                                        // #ifdef APP-PLUS
+                                        <image class="mt" src="/static/images/mt/mt41.png" alt="" mode="widthFix" />
+                                        // #endif
                                     </view>
                                     <view class="qr-item">
                                         <view class="qr-label">MetaTrader .Apk</view>
-										// #ifdef H5
-										<QrCode v-if="showQrcode && mt42" :key="mt41" :text="mt42"></QrCode>
-										// #endif
-										// #ifdef APP-PLUS
-                                        <image class="mt" src="/static/images/mt/mt42.png" alt=""
-                                            mode="widthFix" />
-										// #endif
+                                        // #ifdef H5
+                                        <QrCode v-if="showQrcode && mt42" :key="mt41" :text="mt42"></QrCode>
+                                        // #endif
+                                        // #ifdef APP-PLUS
+                                        <image class="mt" src="/static/images/mt/mt42.png" alt="" mode="widthFix" />
+                                        // #endif
                                     </view>
                                 </view>
                             </view>
@@ -107,13 +105,12 @@
                                 <view class="qr-codes qr-codes-single">
                                     <view class="qr-item">
                                         <view class="qr-label">App Store</view>
-										// #ifdef H5
-										<QrCode v-if="showQrcode && mt43" :key="mt43" :text="mt43"></QrCode>
-										// #endif
-										// #ifdef APP-PLUS
-                                        <image class="mt" src="/static/images/mt/mt43.png" alt=""
-                                            mode="widthFix" />
-										// #endif
+                                        // #ifdef H5
+                                        <QrCode v-if="showQrcode && mt43" :key="mt43" :text="mt43"></QrCode>
+                                        // #endif
+                                        // #ifdef APP-PLUS
+                                        <image class="mt" src="/static/images/mt/mt43.png" alt="" mode="widthFix" />
+                                        // #endif
                                     </view>
                                 </view>
                             </view>
@@ -192,23 +189,21 @@
                                 <view class="qr-codes">
                                     <view class="qr-item">
                                         <view class="qr-label">Google Play</view>
-										// #ifdef H5
-										<QrCode v-if="showQrcode && mt51" :key="mt51" :text="mt51"></QrCode>
-										// #endif
-										// #ifdef APP-PLUS
-                                        <image class="mt" src="/static/images/mt/mt51.png" alt=""
-                                            mode="widthFix" />
-										// #endif
+                                        // #ifdef H5
+                                        <QrCode v-if="showQrcode && mt51" :key="mt51" :text="mt51"></QrCode>
+                                        // #endif
+                                        // #ifdef APP-PLUS
+                                        <image class="mt" src="/static/images/mt/mt51.png" alt="" mode="widthFix" />
+                                        // #endif
                                     </view>
                                     <view class="qr-item">
                                         <view class="qr-label">MetaTrader .Apk</view>
-										// #ifdef H5
-										<QrCode v-if="showQrcode && mt52" :key="mt52" :text="mt52"></QrCode>
-										// #endif
-										// #ifdef APP-PLUS
-                                        <image class="mt" src="/static/images/mt/mt52.png" alt=""
-                                            mode="widthFix" />
-										// #endif
+                                        // #ifdef H5
+                                        <QrCode v-if="showQrcode && mt52" :key="mt52" :text="mt52"></QrCode>
+                                        // #endif
+                                        // #ifdef APP-PLUS
+                                        <image class="mt" src="/static/images/mt/mt52.png" alt="" mode="widthFix" />
+                                        // #endif
                                     </view>
                                 </view>
                             </view>
@@ -224,13 +219,12 @@
                                 <view class="qr-codes qr-codes-single">
                                     <view class="qr-item">
                                         <view class="qr-label">App Store</view>
-										// #ifdef H5
-										<QrCode v-if="showQrcode && mt53" :key="mt53" :text="mt53"></QrCode>
-										// #endif
-										// #ifdef APP-PLUS
-                                        <image class="mt" src="/static/images/mt/mt53.png" alt=""
-                                            mode="widthFix" />
-										// #endif
+                                        // #ifdef H5
+                                        <QrCode v-if="showQrcode && mt53" :key="mt53" :text="mt53"></QrCode>
+                                        // #endif
+                                        // #ifdef APP-PLUS
+                                        <image class="mt" src="/static/images/mt/mt53.png" alt="" mode="widthFix" />
+                                        // #endif
                                     </view>
                                 </view>
                             </view>
@@ -300,13 +294,13 @@ onMounted(async () => {
         .section-title {
             font-size: px2rpx(20);
             font-weight: 600;
-            color: #333;
+            color: var(--bs-heading-color);
             margin-bottom: px2rpx(8);
         }
 
         .section-subtitle {
             font-size: px2rpx(14);
-            color: #666;
+            color: var(--bs-heading-color);
             line-height: 1.5;
         }
     }
@@ -449,13 +443,13 @@ onMounted(async () => {
                 .card-title {
                     font-size: px2rpx(16);
                     font-weight: 600;
-                    color: #333;
+                    color: var(--bs-heading-color);
                     margin-bottom: px2rpx(4);
                 }
 
                 .card-desc {
                     font-size: px2rpx(13);
-                    color: #666;
+                    color: var(--bs-heading-color);
                 }
             }
         }
@@ -477,7 +471,7 @@ onMounted(async () => {
             .qr-label {
                 font-weight: 600;
                 font-size: px2rpx(13);
-                color: #333;
+                color: var(--bs-heading-color);
                 margin-bottom: px2rpx(10);
                 line-height: 2;
             }
@@ -588,13 +582,13 @@ onMounted(async () => {
         .feature-title {
             font-size: px2rpx(16);
             font-weight: 600;
-            color: #333;
+            color: var(--bs-heading-color);
             margin-bottom: px2rpx(6);
         }
 
         .feature-desc {
             font-size: px2rpx(14);
-            color: #666;
+            color: var(--bs-heading-color);
             line-height: 1.6;
         }
     }
@@ -621,7 +615,7 @@ onMounted(async () => {
 
             .info-subtitle {
                 font-size: px2rpx(14);
-                color: #666;
+                color: var(--bs-heading-color);
                 text-align: center;
                 margin-bottom: px2rpx(24);
             }
@@ -644,13 +638,13 @@ onMounted(async () => {
             .info-label {
                 font-size: px2rpx(15);
                 font-weight: 600;
-                color: #333;
+                color: var(--bs-heading-color);
                 margin-bottom: px2rpx(8);
             }
 
             .info-text {
                 font-size: px2rpx(14);
-                color: #666;
+                color: var(--bs-heading-color);
                 line-height: 1.6;
             }
 
@@ -768,7 +762,7 @@ onMounted(async () => {
 
         .el-tabs__item {
             font-size: px2rpx(15);
-            color: #999;
+            color: var(--bs-heading-color);
             padding: 0 px2rpx(20);
             height: px2rpx(44);
             line-height: px2rpx(44);
@@ -793,9 +787,9 @@ onMounted(async () => {
         border-radius: px2rpx(6);
     }
 }
-	
-.mt{
-	width: px2rpx(200) !important;
-	height: px2rpx(200) !important;
+
+.mt {
+    width: px2rpx(200) !important;
+    height: px2rpx(200) !important;
 }
 </style>

+ 7 - 6
pages/customer/account-select.vue

@@ -258,14 +258,14 @@ onMounted(() => {
     display: flex;
     flex-direction: column;
     font-size: px2rpx(14);
-    color: #333;
+    color: var(--bs-heading-color);
 }
 
 .table-header {
     display: flex;
     padding: px2rpx(10) 0;
     font-weight: 500;
-    color: #666;
+    color: var(--bs-heading-color);
 
     .header-cell {
         flex: 1;
@@ -383,7 +383,8 @@ radio {
         width: 100%;
 
     }
-    :deep(uni-swiper-item){
+
+    :deep(uni-swiper-item) {
         padding: 10px;
         box-sizing: border-box;
     }
@@ -434,7 +435,7 @@ radio {
 
             .tag-label {
                 font-size: px2rpx(12);
-                color: #666;
+                color: var(--bs-heading-color);
             }
         }
 
@@ -469,7 +470,7 @@ radio {
                 }
 
                 .label {
-                    color: #666;
+                    color: var(--bs-heading-color);
                     order: 1;
                 }
 
@@ -531,7 +532,7 @@ radio {
     margin: px2rpx(30) 0;
     font-size: px2rpx(14);
     line-height: 1.7;
-    color: #666;
+    color: var(--bs-heading-color);
     text-align: center;
 
     .pdfLink {

+ 1 - 1
pages/customer/components/ActivitiesSwiper.vue

@@ -102,7 +102,7 @@ const toActivities = () => {
 
     .default-content {
         font-size: 28rpx;
-        color: #333;
+        color: var(--bs-heading-color);
     }
 }
 

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

@@ -151,7 +151,7 @@ listApi.value = customApi.deleteAccountList
     .dialog-title {
         font-size: px2rpx(20);
         font-weight: 600;
-        color: #333;
+        color: var(--bs-heading-color);
     }
 }
 
@@ -187,7 +187,7 @@ listApi.value = customApi.deleteAccountList
     .empty-text {
         margin-top: px2rpx(20);
         font-size: px2rpx(18);
-        color: #999;
+        color: var(--bs-heading-color);
     }
 }
 </style>

+ 3 - 3
pages/customer/components/TerminalInfoDialog.vue

@@ -111,7 +111,7 @@ const copyValue = (text) => {
 
     .label {
         min-width: px2rpx(30);
-        color: #666;
+        color: var(--bs-heading-color);
         font-weight: normal;
         flex-shrink: 0;
     }
@@ -124,7 +124,7 @@ const copyValue = (text) => {
     }
 
     .value {
-        color: #333;
+        color: var(--bs-heading-color);
         flex: 1;
     }
 
@@ -136,7 +136,7 @@ const copyValue = (text) => {
         justify-content: center;
         margin-left: px2rpx(12);
         cursor: pointer;
-        color: #999;
+        color: var(--bs-heading-color);
         transition: color 0.2s;
 
         &:active {

+ 1 - 1
pages/customer/components/TerminalNickNameDialog.vue

@@ -132,7 +132,7 @@ const save = async () => {
 .input-hint {
     display: block;
     font-size: px2rpx(11);
-    color: #999;
+    color: var(--bs-heading-color);
     margin-top: px2rpx(6);
     line-height: 1.4;
 }

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

@@ -775,7 +775,7 @@ defineExpose({
 .loading-text {
     margin-top: px2rpx(20);
     font-size: px2rpx(28);
-    color: #666;
+    color: var(--bs-heading-color);
 }
 
 .loading-more,
@@ -786,7 +786,7 @@ defineExpose({
     justify-content: center;
     padding: px2rpx(30);
     font-size: px2rpx(28);
-    color: #999;
+    color: var(--bs-heading-color);
 }
 
 .empty-data {

+ 1 - 1
pages/customer/components/TransactionDialogs.vue

@@ -123,7 +123,7 @@ listApi.value = customApi.historyList
     .empty-text {
         margin-top: px2rpx(20);
         font-size: px2rpx(18);
-        color: #999;
+        color: var(--bs-heading-color);
     }
 }
 

+ 1 - 1
pages/follow/follow-list.vue

@@ -436,7 +436,7 @@ onMounted(() => {
 
         .title {
             font-weight: bold;
-            color: #333;
+            color: var(--bs-heading-color);
             padding-left: 8px;
             border-left: 4px solid #eb3f57;
             font-size: 16px;

+ 560 - 583
pages/follow/index.vue

@@ -13,9 +13,9 @@
                 </view>
                 <view class="select">
                   <cwg-dropdown :menu-list="loginOptions.map(item => ({
-                        label: item.platform + ' - ' + item.login + ' - ' + groupTypeName(item.type) + ' - ' + t('Custom.Deposit.AvailableBalance') + groupCurrency(item.currency) + item.balance,
-                        value: item
-                      }))" @menuClick="handleCommand">
+                    label: item.platform + ' - ' + item.login + ' - ' + groupTypeName(item.type) + ' - ' + t('Custom.Deposit.AvailableBalance') + groupCurrency(item.currency) + item.balance,
+                    value: item
+                  }))" @menuClick="handleCommand">
                     <view class="el-dropdown-link crm-cursor">
                       <text v-if="locale === 'es'">Selecciona</text>
                       <text v-else>{{ t('placeholder.choose') }}</text>
@@ -24,16 +24,13 @@
                   </cwg-dropdown>
                 </view>
               </view>
-              <view
-                class="content"
-                style="
+              <view class="content" style="
                   height: 40px;
                   display: inline-block;
                   font-size: 15px;
                   color: #eb3f57;
                   font-weight: bold;
-                "
-              >
+                ">
                 <view style="margin-bottom: 5px">
                   {{ ChartSet.platform || '--' }} - {{ ChartSet.login || '--' }} -
                   {{ groupTypeName(ChartSet.type) || '--' }}
@@ -59,13 +56,7 @@
               </view>
             </view>
           </uni-col>
-          <uni-col
-            :xs="24"
-            :sm="12"
-            :md="isDealLogin ? 8 : 12"
-            :lg="isDealLogin ? 4 : 6"
-            :xl="isDealLogin ? 4 : 6"
-          >
+          <uni-col :xs="24" :sm="12" :md="isDealLogin ? 8 : 12" :lg="isDealLogin ? 4 : 6" :xl="isDealLogin ? 4 : 6">
             <view class="custom-money">
               <view class="left">
                 <view class="tit">
@@ -85,13 +76,7 @@
               </view>
             </view>
           </uni-col>
-          <uni-col
-            :xs="24"
-            :sm="12"
-            :md="isDealLogin ? 8 : 12"
-            :lg="isDealLogin ? 4 : 6"
-            :xl="isDealLogin ? 4 : 6"
-          >
+          <uni-col :xs="24" :sm="12" :md="isDealLogin ? 8 : 12" :lg="isDealLogin ? 4 : 6" :xl="isDealLogin ? 4 : 6">
             <view class="custom-money">
               <view class="left">
                 <view class="tit">
@@ -213,20 +198,12 @@
                   </view>
                   <view class="bottom">
                     <view class="tab">
-                      <cwg-tabel
-                        :data="SubscribeProfitDate"
-                        class="crm_tab"
-                        :api="listApi"
-                        :columns="[
-                          { label: t('Documentary.console.item32'), prop: 'nickname', align: 'center', slot: 'nickname' },
-                          { label: t('Documentary.console.item33'), prop: 'nickname2', align: 'center', slot: 'nickname2' },
-                          { label: t('Documentary.console.item34'), prop: 'startTime', align: 'center', slot: 'startTime' },
-                          { label: t('Documentary.console.item35'), prop: 'endTime', align: 'center', slot: 'endTime' }
-                        ]"
-                        style="width: 100%"
-                        :show-operation="false"
-                        :showPagination="false"
-                      >
+                      <cwg-tabel :data="SubscribeProfitDate" class="crm_tab" :api="listApi" :columns="[
+                        { label: t('Documentary.console.item32'), prop: 'nickname', align: 'center', slot: 'nickname' },
+                        { label: t('Documentary.console.item33'), prop: 'nickname2', align: 'center', slot: 'nickname2' },
+                        { label: t('Documentary.console.item34'), prop: 'startTime', align: 'center', slot: 'startTime' },
+                        { label: t('Documentary.console.item35'), prop: 'endTime', align: 'center', slot: 'endTime' }
+                      ]" style="width: 100%" :show-operation="false" :showPagination="false">
                         <template #nickname="{ row }">
                           <text>{{ row.nickname || '--' }}</text>
                         </template>
@@ -250,593 +227,593 @@
       </uni-col>
     </uni-row>
     <!-- 申请成为信号源弹窗 -->
-    <applySignalDialog
-      :visible="isApplySignalVisible"
-      :loginOptions="loginOptions"
-      @close="isApplySignalVisible = false"
-      @confirm="onApplySignalConfirm"
-    />
+    <applySignalDialog :visible="isApplySignalVisible" :loginOptions="loginOptions"
+      @close="isApplySignalVisible = false" @confirm="onApplySignalConfirm" />
   </cwg-page-wrapper>
 </template>
 
 <script setup>
-  import { ref, computed, watch, onMounted ,nextTick} from 'vue'
-  import { useI18n } from 'vue-i18n'
-  import useRouter from '@/hooks/useRouter'
-  import { ibApi } from '@/service/ib'
-  import config from '@/config/index'
-  import useUserStore from '@/stores/use-user-store'
-  import { useStorage } from '@/hooks/useStorage'
-  import QrCode from '@/components/QrCode.vue'
-  import applySignalDialog from './components/applySignalDialog.vue'
-  import { useFilters } from '@/composables/useFilters'
-  import { isAfterJuly28 } from '@/utils/dateUtils'
-  import { documentaryApi } from '@/service/documentary'
-
-  const { t, locale } = useI18n()
-  const loading = ref(false)
-  const router = useRouter()
-  const { Code } = config
-  const { userInfo } = useUserStore()
-  const { numberFormat } = useFilters()
-  const listApi = ref(documentaryApi.followDailySubscribeProfit)
-  const ibData = ref({
-      customAmount: 0,
-      ibAmount: 0,
-    },
-  )
-  const selectedSpreadId = ref('')
-  const spreadList = ref([])
-  const excludeShowLoginTypes = ref([])
-  const pammManagerValid = ref()
-  const dialogPercent = ref(false)
-  const dialogPercentData = ref({
-    oldPercent: '',
-    mamListId: '',
-    oldOwnerId: '',
-    oldAccountId: '',
-    percent: '',
-  })
-
-  const getCustomLoginDown = async () => {
-    const res = await documentaryApi.followCustomDropdown()
-    if (res.code === Code.StatusOK) {
-      if (res.data?.length > 0) {
-        const options = res.data[0]
-        loginOptions.value = res.data
-        isDealLogin.value = options.isDealLogin
-        ChartSet.value = {
-          login: options.login,
-          leverage: '1:' + options.leverage,
-          platform: options.platform,
-          groupTypeName: options.groupTypeName,
-          type: options.type,
-          balance: options.balance,
-          currency: options.currency || '',
-        }
+import { ref, computed, watch, onMounted, nextTick } from 'vue'
+import { useI18n } from 'vue-i18n'
+import useRouter from '@/hooks/useRouter'
+import { ibApi } from '@/service/ib'
+import config from '@/config/index'
+import useUserStore from '@/stores/use-user-store'
+import { useStorage } from '@/hooks/useStorage'
+import QrCode from '@/components/QrCode.vue'
+import applySignalDialog from './components/applySignalDialog.vue'
+import { useFilters } from '@/composables/useFilters'
+import { isAfterJuly28 } from '@/utils/dateUtils'
+import { documentaryApi } from '@/service/documentary'
+
+const { t, locale } = useI18n()
+const loading = ref(false)
+const router = useRouter()
+const { Code } = config
+const { userInfo } = useUserStore()
+const { numberFormat } = useFilters()
+const listApi = ref(documentaryApi.followDailySubscribeProfit)
+const ibData = ref({
+  customAmount: 0,
+  ibAmount: 0,
+},
+)
+const selectedSpreadId = ref('')
+const spreadList = ref([])
+const excludeShowLoginTypes = ref([])
+const pammManagerValid = ref()
+const dialogPercent = ref(false)
+const dialogPercentData = ref({
+  oldPercent: '',
+  mamListId: '',
+  oldOwnerId: '',
+  oldAccountId: '',
+  percent: '',
+})
+
+const getCustomLoginDown = async () => {
+  const res = await documentaryApi.followCustomDropdown()
+  if (res.code === Code.StatusOK) {
+    if (res.data?.length > 0) {
+      const options = res.data[0]
+      loginOptions.value = res.data
+      isDealLogin.value = options.isDealLogin
+      ChartSet.value = {
+        login: options.login,
+        leverage: '1:' + options.leverage,
+        platform: options.platform,
+        groupTypeName: options.groupTypeName,
+        type: options.type,
+        balance: options.balance,
+        currency: options.currency || '',
       }
-    } else {
-      uni.showToast({ title: res.msg, icon: 'none' })
     }
-  }
-
-  const loginOptions = ref([])
-  const ChartSet = ref({})
-  const ChartSetDate = ref({})
-  const isDealLogin = ref(false)
-  const dealDate = ref({})
-  const SubscribeProfitDate = ref([])
-
-  const groupTypeName = (type) => {
-    if (!type) return '--'
-    if (type == 1) return t('AccountType.ClassicAccount')
-    if (type == 2) return t('AccountType.SeniorAccount')
-    if (type == 5) return t('AccountType.SpeedAccount')
-    if (type == 6) return t('AccountType.SpeedAccount')
-    if (type == 7) return t('AccountType.StandardAccount')
-    if (type == 8) return t('AccountType.CentAccount')
-    return type
-  }
-
-  const groupCurrency = (type) => {
-    console.log(type,'usd')
-    if (type == 'GBP') {
-      return ': £'
-    } else if (type == 'USD') {
-      return ': $'
-    } else if (type == 'EUR') {
-      return ': €'
-    } else if (type == 'USC') {
-      return ': ¢'
-    } else {
-      return ': $'
-    }
-  }
-
-  const groupCurrency1 = (type) => {
-    if (type == "GBP") {
-      return "£";
-    } else if (type == "USD") {
-      return "$";
-    } else if (type == "EUR") {
-      return "€";
-    } else if (type == "USC") {
-      return "¢";
-    } else {
-      return "$";
-    }
-  }
-
-  const handleCommand = ({ value }) => {
-    const data = {...value.value}
-    console.log(123,data)
-
-    isDealLogin.value = data.isDealLogin
-    ChartSet.value = {
-      login: data.login,
-      leverage: '1:' + data.leverage,
-      platform: data.platform,
-      groupTypeName: data.groupTypeName,
-      type: data.type,
-      balance: data.balance,
-      currency: data.currency || '',
-    }
-  }
-
-  const getDailyCompare = async (login) => {
-    const res = await documentaryApi.followDailyCompare({ login })
-    if (res.code === Code.StatusOK) {
-      ChartSetDate.value = res.data ?? {}
-    } else {
-      uni.showToast({ title: res.msg, icon: 'none' })
-    }
-  }
-
-  const getDailyDeal = async (login) => {
-    const res = await documentaryApi.followDailyDeal({ login })
-    if (res.code === Code.StatusOK) {
-      dealDate.value = res.data ?? {}
-    } else {
-      uni.showToast({ title: res.msg, icon: 'none' })
-    }
-  }
-
-  const getDailySubscribeProfit = async (login) => {
-    const res = await documentaryApi.followDailySubscribeProfit({ login })
-    if (res.code === Code.StatusOK) {
-      SubscribeProfitDate.value = res.data?.data ?? []
-    } else {
-      uni.showToast({ title: res.msg, icon: 'none' })
-    }
-  }
-  watch(()=>ChartSet.value.login,async (login)=>{
-    await getDailyCompare(login)
-    if (isDealLogin.value) {
-      await getDailyDeal(login)
-    } else {
-      await getDailySubscribeProfit(login)
-    }
-  })
-
-
-  const toDocumentary1 = () => {
-    router.push({ path: '/pages/follow/trading-center' })
-  }
-
-  const dialogFllowApplyOpen = () => {
-    isApplySignalVisible.value = true
-  }
-
-  const isApplySignalVisible = ref(false)
-  const onApplySignalConfirm = () => {
-    isApplySignalVisible.value = false
-  }
-
-  onMounted(async () => {
-    loading.value = true
-    await getCustomLoginDown()
-    loading.value = false
-  })
+  } else {
+    uni.showToast({ title: res.msg, icon: 'none' })
+  }
+}
+
+const loginOptions = ref([])
+const ChartSet = ref({})
+const ChartSetDate = ref({})
+const isDealLogin = ref(false)
+const dealDate = ref({})
+const SubscribeProfitDate = ref([])
+
+const groupTypeName = (type) => {
+  if (!type) return '--'
+  if (type == 1) return t('AccountType.ClassicAccount')
+  if (type == 2) return t('AccountType.SeniorAccount')
+  if (type == 5) return t('AccountType.SpeedAccount')
+  if (type == 6) return t('AccountType.SpeedAccount')
+  if (type == 7) return t('AccountType.StandardAccount')
+  if (type == 8) return t('AccountType.CentAccount')
+  return type
+}
+
+const groupCurrency = (type) => {
+  console.log(type, 'usd')
+  if (type == 'GBP') {
+    return ': £'
+  } else if (type == 'USD') {
+    return ': $'
+  } else if (type == 'EUR') {
+    return ': €'
+  } else if (type == 'USC') {
+    return ': ¢'
+  } else {
+    return ': $'
+  }
+}
+
+const groupCurrency1 = (type) => {
+  if (type == "GBP") {
+    return "£";
+  } else if (type == "USD") {
+    return "$";
+  } else if (type == "EUR") {
+    return "€";
+  } else if (type == "USC") {
+    return "¢";
+  } else {
+    return "$";
+  }
+}
+
+const handleCommand = ({ value }) => {
+  const data = { ...value.value }
+  console.log(123, data)
+
+  isDealLogin.value = data.isDealLogin
+  ChartSet.value = {
+    login: data.login,
+    leverage: '1:' + data.leverage,
+    platform: data.platform,
+    groupTypeName: data.groupTypeName,
+    type: data.type,
+    balance: data.balance,
+    currency: data.currency || '',
+  }
+}
+
+const getDailyCompare = async (login) => {
+  const res = await documentaryApi.followDailyCompare({ login })
+  if (res.code === Code.StatusOK) {
+    ChartSetDate.value = res.data ?? {}
+  } else {
+    uni.showToast({ title: res.msg, icon: 'none' })
+  }
+}
+
+const getDailyDeal = async (login) => {
+  const res = await documentaryApi.followDailyDeal({ login })
+  if (res.code === Code.StatusOK) {
+    dealDate.value = res.data ?? {}
+  } else {
+    uni.showToast({ title: res.msg, icon: 'none' })
+  }
+}
+
+const getDailySubscribeProfit = async (login) => {
+  const res = await documentaryApi.followDailySubscribeProfit({ login })
+  if (res.code === Code.StatusOK) {
+    SubscribeProfitDate.value = res.data?.data ?? []
+  } else {
+    uni.showToast({ title: res.msg, icon: 'none' })
+  }
+}
+watch(() => ChartSet.value.login, async (login) => {
+  await getDailyCompare(login)
+  if (isDealLogin.value) {
+    await getDailyDeal(login)
+  } else {
+    await getDailySubscribeProfit(login)
+  }
+})
+
+
+const toDocumentary1 = () => {
+  router.push({ path: '/pages/follow/trading-center' })
+}
+
+const dialogFllowApplyOpen = () => {
+  isApplySignalVisible.value = true
+}
+
+const isApplySignalVisible = ref(false)
+const onApplySignalConfirm = () => {
+  isApplySignalVisible.value = false
+}
+
+onMounted(async () => {
+  loading.value = true
+  await getCustomLoginDown()
+  loading.value = false
+})
 
 </script>
 
 <style lang="scss" scoped>
-  @import "@/uni.scss";
-
-  .demo-uni-row {
-    display: flex;
-    flex-wrap: wrap;
-    align-items: stretch;
-    margin: 0 auto!important;
-  }
-
-  .uni-col-left {
-    //display: flex;
-    //flex-direction: column;
-  }
-
-  .uni-col-right {
-    display: flex;
-    flex-direction: column;
-  }
-
-  .dashboard-container {
-    min-height: 10vh;
-    box-sizing: border-box;
-    display: flex;
-    flex-direction: column;
-    height: 100%;
-  }
-
-  .mam-card {
-    flex: 1;
-    display: flex;
-    flex-direction: column;
-  }
-
-  /* 卡片通用样式 */
-  .card {
-    background: var(--color-white);
-    color: #333;
-    padding: px2rpx(12) px2rpx(16);
-    border-radius: 4px;
-    margin-bottom: px2rpx(20);
-    box-shadow: 0 px2rpx(4) px2rpx(12) rgba(0, 0, 0, 0.2);
-  }
-
-  .custom-number, .custom-money {
-    background: #fff;
-    padding: 15px;
-    border-radius: 4px;
-    margin-bottom: 20px;
-    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
-    min-height: 100px;
-  }
-
-  .custom-number .title, .custom-money .left .tit, .custom-money .right .tit {
-    font-size: 14px;
-    color: #666;
-    margin-bottom: 10px;
-  }
-
-  .custom-number .title {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-  }
-
-  .custom-money {
-    display: flex;
-    flex-direction: column;
-  }
-
-  .custom-money .left, .custom-money .right {
-    flex: 1;
-  }
-
-  .custom-money .num {
-    font-size: 20px;
-    font-weight: bold;
-    color: #333;
-  }
-
-  .custom-money .num.red {
-    color: #eb3f57;
-  }
-
-  .el-dropdown-link {
-    display: flex;
-    align-items: center;
-    gap: 4px;
-    color: #6c8595;
-    font-size: 12px;
-  }
-
-  .account-info1 {
-    margin-bottom: 20px;
-  }
-
-  .custom-money-left .header,
-  .custom-money-right .header {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    margin-bottom: px2rpx(15);
-  }
-
-  .custom-money-left .tab,
-  .custom-money-right .tab {
-    font-size: px2rpx(16);
-    font-weight: 600;
-    color: #333;
-  }
-
-  .bottomCol {
+@import "@/uni.scss";
+
+.demo-uni-row {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: stretch;
+  margin: 0 auto !important;
+}
+
+.uni-col-left {
+  //display: flex;
+  //flex-direction: column;
+}
+
+.uni-col-right {
+  display: flex;
+  flex-direction: column;
+}
+
+.dashboard-container {
+  min-height: 10vh;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+}
+
+.mam-card {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+}
+
+/* 卡片通用样式 */
+.card {
+  background: var(--color-white);
+  color: var(--bs-heading-color);
+  padding: px2rpx(12) px2rpx(16);
+  border-radius: 4px;
+  margin-bottom: px2rpx(20);
+  box-shadow: 0 px2rpx(4) px2rpx(12) rgba(0, 0, 0, 0.2);
+}
+
+.custom-number,
+.custom-money {
+  background: #fff;
+  padding: 15px;
+  border-radius: 4px;
+  margin-bottom: 20px;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+  min-height: 100px;
+}
+
+.custom-number .title,
+.custom-money .left .tit,
+.custom-money .right .tit {
+  font-size: 14px;
+  color: var(--bs-heading-color);
+  margin-bottom: 10px;
+}
+
+.custom-number .title {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.custom-money {
+  display: flex;
+  flex-direction: column;
+}
+
+.custom-money .left,
+.custom-money .right {
+  flex: 1;
+}
+
+.custom-money .num {
+  font-size: 20px;
+  font-weight: bold;
+  color: var(--bs-heading-color);
+}
+
+.custom-money .num.red {
+  color: #eb3f57;
+}
+
+.el-dropdown-link {
+  display: flex;
+  align-items: center;
+  gap: 4px;
+  color: #6c8595;
+  font-size: 12px;
+}
+
+.account-info1 {
+  margin-bottom: 20px;
+}
+
+.custom-money-left .header,
+.custom-money-right .header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: px2rpx(15);
+}
+
+.custom-money-left .tab,
+.custom-money-right .tab {
+  font-size: px2rpx(16);
+  font-weight: 600;
+  color: var(--bs-heading-color);
+}
+
+.bottomCol {
+  font-size: 16px;
+  color: #868686;
+
+  .bo-left1 {
+    margin: 20px 0;
+    padding: 20px 0;
+    border-right: 1px dashed #989898;
+    text-align: center;
     font-size: 16px;
-    color: #868686;
-
-    .bo-left1 {
-      margin: 20px 0;
-      padding: 20px 0;
-      border-right: 1px dashed #989898;
-      text-align: center;
-      font-size: 16px;
-    }
-
-
-    .bo-right1 {
-      margin: 20px 0px;
-      padding: 20px 0;
-      text-align: center;
-      font-size: 16px;
-
-    }
-  }
-
-  .blue-font {
-    margin-top: px2rpx(15);
-    color: #007aff;
-    font-weight: 600;
-    font-size: px2rpx(24);
   }
 
-  .subscribe-table {
-    width: 100%;
-    border: 1px solid #ebeef5;
-    border-radius: 6px;
-    overflow: hidden;
-  }
-
-  .subscribe-row {
-    display: grid;
-    grid-template-columns: 1fr 1fr 1fr 1fr;
-    border-top: 1px solid #ebeef5;
-  }
 
-  .subscribe-head {
-    background: #f5f7fa;
-    border-top: none;
-  }
-
-  .subscribe-cell {
-    padding: 10px 8px;
-    font-size: 12px;
-    color: #333;
+  .bo-right1 {
+    margin: 20px 0px;
+    padding: 20px 0;
     text-align: center;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-  }
-
-  .custom-dialog-content {
-    padding: px2rpx(20);
-
-    .info-text {
-      color: #333;
-      font-size: px2rpx(14);
-      line-height: px2rpx(36);
-    }
-  }
-
-  .card-header {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-bottom: px2rpx(12);
-  }
+    font-size: 16px;
 
-  .header-left {
-    display: flex;
-    align-items: center;
-    gap: 12rpx;
   }
-
-  .header-title {
+}
+
+.blue-font {
+  margin-top: px2rpx(15);
+  color: #007aff;
+  font-weight: 600;
+  font-size: px2rpx(24);
+}
+
+.subscribe-table {
+  width: 100%;
+  border: 1px solid #ebeef5;
+  border-radius: 6px;
+  overflow: hidden;
+}
+
+.subscribe-row {
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr 1fr;
+  border-top: 1px solid #ebeef5;
+}
+
+.subscribe-head {
+  background: #f5f7fa;
+  border-top: none;
+}
+
+.subscribe-cell {
+  padding: 10px 8px;
+  font-size: 12px;
+  color: var(--bs-heading-color);
+  text-align: center;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.custom-dialog-content {
+  padding: px2rpx(20);
+
+  .info-text {
+    color: var(--bs-heading-color);
     font-size: px2rpx(14);
-    font-weight: 600;
-  }
-
-  .header-right {
-    display: flex;
-    align-items: center;
-  }
-
-  .action-btn {
-    background: #ffde02;
+    line-height: px2rpx(36);
+  }
+}
+
+.card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: px2rpx(12);
+}
+
+.header-left {
+  display: flex;
+  align-items: center;
+  gap: 12rpx;
+}
+
+.header-title {
+  font-size: px2rpx(14);
+  font-weight: 600;
+}
+
+.header-right {
+  display: flex;
+  align-items: center;
+}
+
+.action-btn {
+  background: #ffde02;
+  border: none;
+  border-radius: 50%;
+  width: px2rpx(32);
+  height: px2rpx(32);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 0;
+  margin: 0;
+
+  &:after {
     border: none;
-    border-radius: 50%;
-    width: px2rpx(32);
-    height: px2rpx(32);
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    padding: 0;
-    margin: 0;
-
-    &:after {
-      border: none;
-    }
   }
-
-  /* 余额区域 */
-  .balance-content {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    gap: 16rpx;
-  }
-
-  .balance-main {
-    display: flex;
-    align-items: baseline;
-    flex-wrap: wrap;
-  }
-
-  .balance-amount {
-    font-size: px2rpx(20);
-    font-weight: 700;
-    line-height: 1;
-  }
-
-  .balance-decimal {
-    font-size: px2rpx(16);
-    font-weight: 500;
-    line-height: 1;
-  }
-
-  .balance-currency {
+}
+
+/* 余额区域 */
+.balance-content {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 16rpx;
+}
+
+.balance-main {
+  display: flex;
+  align-items: baseline;
+  flex-wrap: wrap;
+}
+
+.balance-amount {
+  font-size: px2rpx(20);
+  font-weight: 700;
+  line-height: 1;
+}
+
+.balance-decimal {
+  font-size: px2rpx(16);
+  font-weight: 500;
+  line-height: 1;
+}
+
+.balance-currency {
+  font-size: px2rpx(16);
+  font-weight: 500;
+}
+
+.total-earnings {
+  display: flex;
+  align-items: center;
+  gap: 5px;
+  color: rgba(20, 29, 34, 0.6);
+  font-size: px2rpx(12);
+}
+
+.total-value {
+  align-self: flex-end;
+}
+
+/* 合作伙伴卡片 */
+.partner-content {
+  display: flex;
+  flex-direction: column;
+  gap: 12px;
+}
+
+.link-area {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-around;
+  align-items: center;
+  gap: 12px;
+}
+
+.link-btn {
+  height: px2rpx(32);
+  background-color: rgb(108, 133, 149);
+  line-height: px2rpx(32);
+  color: var(--color-white);
+  border-radius: px2rpx(16);
+  font-size: px2rpx(14);
+  margin: 0;
+}
+
+.code-content {
+  display: flex;
+  justify-content: center;
+}
+
+.code-input {
+  width: 50%;
+  max-width: px2rpx(178);
+  margin-right: px2rpx(20);
+}
+
+.custom-content {
+  display: flex;
+  justify-content: space-around;
+  flex-wrap: wrap;
+
+  .con {
+    cursor: pointer;
+    text-align: center;
     font-size: px2rpx(16);
-    font-weight: 500;
-  }
-
-  .total-earnings {
-    display: flex;
-    align-items: center;
-    gap: 5px;
-    color: rgba(20, 29, 34, 0.6);
-    font-size: px2rpx(12);
-  }
-
-  .total-value {
-    align-self: flex-end;
-  }
-
-  /* 合作伙伴卡片 */
-  .partner-content {
-    display: flex;
-    flex-direction: column;
-    gap: 12px;
+    margin: 5px;
   }
 
-  .link-area {
-    display: flex;
-    flex-wrap: wrap;
-    justify-content: space-around;
-    align-items: center;
-    gap: 12px;
-  }
-
-  .link-btn {
-    height: px2rpx(32);
-    background-color: rgb(108, 133, 149);
-    line-height: px2rpx(32);
-    color: var(--color-white);
-    border-radius: px2rpx(16);
-    font-size: px2rpx(14);
-    margin: 0;
+  .num {
+    font-weight: bold;
   }
 
-  .code-content {
-    display: flex;
-    justify-content: center;
-  }
+  .des {
+    margin-top: px2rpx(5);
 
-  .code-input {
-    width: 50%;
-    max-width: px2rpx(178);
-    margin-right: px2rpx(20);
   }
+}
 
-  .custom-content {
-    display: flex;
-    justify-content: space-around;
-    flex-wrap: wrap;
-
-    .con {
-      cursor: pointer;
-      text-align: center;
-      font-size: px2rpx(16);
-      margin: 5px;
-    }
-
-    .num {
-      font-weight: bold;
-    }
+.dia-content {
+  padding: 20rpx;
+}
 
-    .des {
-      margin-top: px2rpx(5);
+.content {
+  display: flex;
+  flex-direction: column;
+  gap: 20rpx;
+}
 
-    }
-  }
+.label {
+  font-weight: 500;
+  margin-bottom: 8rpx;
+}
 
-  .dia-content {
-    padding: 20rpx;
-  }
+.btn {
+  text-align: center;
+  background-color: #4497ff;
+  font-size: px2rpx(16);
+  color: #fff;
+  padding: px2rpx(10);
+  border-radius: px2rpx(4);
+}
 
-  .content {
-    display: flex;
-    flex-direction: column;
-    gap: 20rpx;
-  }
+.crm-cursor {
+  cursor: pointer;
+}
 
-  .label {
-    font-weight: 500;
-    margin-bottom: 8rpx;
-  }
+.link {
+  display: flex;
+  margin-top: 20rpx;
 
   .btn {
-    text-align: center;
-    background-color: #4497ff;
-    font-size: px2rpx(16);
-    color: #fff;
-    padding: px2rpx(10);
-    border-radius: px2rpx(4);
-  }
-
-  .crm-cursor {
-    cursor: pointer;
-  }
-
-  .link {
-    display: flex;
-    margin-top: 20rpx;
-
-    .btn {
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      height: px2rpx(35);
-      margin: 0 px2rpx(10);
-    }
-  }
-
-  .qrCode {
     display: flex;
-    flex-direction: column;
     align-items: center;
-    gap: 16rpx;
-  }
-
-  .mam-card {
-    .add-mam-btn {
-      display: flex;
-      background-color: var(--color-error);
-      align-items: center;
-      gap: 8rpx;
-      height: px2rpx(32);
-      line-height: px2rpx(32);
-      padding: 0 px2rpx(12);
-      margin: 0;
-    }
-  }
-
-  .mam-line {
-    display: flex;
     justify-content: center;
-    gap: 6rpx;
-    line-height: 1.5;
+    height: px2rpx(35);
+    margin: 0 px2rpx(10);
   }
+}
 
-  .mam-ops {
-    display: flex;
-    flex-wrap: wrap;
-    justify-content: center;
-    gap: 10rpx;
-  }
+.qrCode {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 16rpx;
+}
 
-  .mam-op {
-    color: #2b5aed;
-    font-size: px2rpx(12);
-    line-height: 1.4;
+.mam-card {
+  .add-mam-btn {
+    display: flex;
+    background-color: var(--color-error);
+    align-items: center;
+    gap: 8rpx;
+    height: px2rpx(32);
+    line-height: px2rpx(32);
+    padding: 0 px2rpx(12);
+    margin: 0;
   }
+}
+
+.mam-line {
+  display: flex;
+  justify-content: center;
+  gap: 6rpx;
+  line-height: 1.5;
+}
+
+.mam-ops {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: center;
+  gap: 10rpx;
+}
+
+.mam-op {
+  color: #2b5aed;
+  font-size: px2rpx(12);
+  line-height: 1.4;
+}
 </style>

+ 18 - 18
pages/follow/subscribe-list.vue

@@ -60,7 +60,7 @@
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.tradingCenter.item29') }}</text>
                                 <text class="delete-value">{{ numberDesensitization(dialogSubscribeDataCancel.dealLogin)
-                                    }}</text>
+                                }}</text>
                             </view>
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.console.item3') }}</text>
@@ -71,7 +71,7 @@
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.console.item7') }}</text>
                                 <text class="delete-value">{{ numberFormat(dialogSubscribeDataCancel.dealBalance || 0)
-                                    }}</text>
+                                }}</text>
                             </view>
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Label.AccountType') }}</text>
@@ -83,7 +83,7 @@
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.console.item6') }}</text>
                                 <text class="delete-value">{{ numberFormat(dialogSubscribeDataCancel.dealEquity || 0)
-                                    }}</text>
+                                }}</text>
                             </view>
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.tradingCenter.item30') }}</text>
@@ -98,12 +98,12 @@
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Label.Credit') }}</text>
                                 <text class="delete-value">{{ numberFormat(dialogSubscribeDataCancel.dealCredit || 0)
-                                    }}</text>
+                                }}</text>
                             </view>
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.tradingCenter.item31') }}</text>
                                 <text class="delete-value">{{ dialogSubscribeDataCancel.distributionRatio || '0'
-                                    }}%</text>
+                                }}%</text>
                             </view>
                         </view>
                         <view class="delete-row">
@@ -114,7 +114,7 @@
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.tradingCenter.item32') }}</text>
                                 <text class="delete-value">{{ dialogSubscribeDataCancel.settlementCycle || '--'
-                                    }}</text>
+                                }}</text>
                             </view>
                         </view>
                     </view>
@@ -132,7 +132,7 @@
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Label.Leverage') }}</text>
                                 <text class="delete-value">1:{{ dialogSubscribeDataCancel.followLeverage || '--'
-                                    }}</text>
+                                }}</text>
                             </view>
                         </view>
                         <view class="delete-row">
@@ -171,12 +171,12 @@
                             <view class="delete-item" v-if="dialogSubscribeDataCancel.protectType == 1">
                                 <text class="delete-label">{{ t('Documentary.tradingCenter.item39') }}</text>
                                 <text class="delete-value">{{ dialogSubscribeDataCancel.protectAmount || '--'
-                                    }}($)</text>
+                                }}($)</text>
                             </view>
                             <view class="delete-item" v-if="dialogSubscribeDataCancel.protectType == 2">
                                 <text class="delete-label">{{ t('Documentary.tradingCenter.item122') }}</text>
                                 <text class="delete-value">{{ dialogSubscribeDataCancel.protectRatio || '--'
-                                    }}(%)</text>
+                                }}(%)</text>
                             </view>
                         </view>
                     </view>
@@ -207,7 +207,7 @@
             <template #footer>
                 <button @click="ToUnSubscribeCancel">{{ t('Btn.Cancel') }}</button>
                 <button type="primary" @click="dialogSubscribeCancelTipOpen" :disabled="flag">{{ t('Btn.Confirm')
-                    }}</button>
+                }}</button>
             </template>
         </cwg-popup>
 
@@ -226,7 +226,7 @@
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.tradingCenter.item29') }}</text>
                                 <text class="delete-value">{{ numberDesensitization(dialogSubscribeFllowData.dealLogin)
-                                    }}</text>
+                                }}</text>
                             </view>
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.console.item3') }}</text>
@@ -237,19 +237,19 @@
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.console.item7') }}</text>
                                 <text class="delete-value">{{ numberFormat(dialogSubscribeFllowData.dealBalance)
-                                    }}</text>
+                                }}</text>
                             </view>
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Label.AccountType') }}</text>
                                 <text class="delete-value">{{ accountTypeName(dialogSubscribeFllowData.dealLoginType)
-                                    }}</text>
+                                }}</text>
                             </view>
                         </view>
                         <view class="delete-row">
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.console.item6') }}</text>
                                 <text class="delete-value">{{ numberFormat(dialogSubscribeFllowData.dealEquity)
-                                    }}</text>
+                                }}</text>
                             </view>
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.tradingCenter.item30') }}</text>
@@ -264,12 +264,12 @@
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Label.Credit') }}</text>
                                 <text class="delete-value">{{ numberFormat(dialogSubscribeFllowData.dealCredit)
-                                    }}</text>
+                                }}</text>
                             </view>
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Documentary.tradingCenter.item31') }}</text>
                                 <text class="delete-value">{{ dialogSubscribeFllowData.distributionRatio || '0'
-                                    }}%</text>
+                                }}%</text>
                             </view>
                         </view>
                         <view class="delete-row">
@@ -297,7 +297,7 @@
                             <view class="delete-item">
                                 <text class="delete-label">{{ t('Label.Leverage') }}</text>
                                 <text class="delete-value">1:{{ dialogSubscribeFllowData.followLeverage || '--'
-                                    }}</text>
+                                }}</text>
                             </view>
                         </view>
                     </view>
@@ -1037,7 +1037,7 @@ onMounted(() => {
 
         .title {
             font-weight: bold;
-            color: #333;
+            color: var(--bs-heading-color);
             padding-left: 8px;
             border-left: 4px solid #eb3f57;
             font-size: 16px;

+ 291 - 272
pages/follow/trading-center-single.vue

@@ -9,10 +9,10 @@
         </view>
       </template>
     </cwg-header>
-    
+
     <view class="info-card">
       <cwg-asset-tabs :tabs="tabs" v-model="activeTab" />
-      
+
       <!-- Tab 1: 个人指标 -->
       <view v-if="activeTab === '1'" class="tab-content">
         <!-- 个人名片和品种摘要 -->
@@ -24,7 +24,8 @@
             <view class="fllow-info-list">
               <cwg-label-line-value :label="t('TradingCenter.item13')" :value="DailyIndex1.nickname || '--'" />
               <cwg-label-line-value :label="t('TradingCenter.item14')" :value="DailyIndex1.personalSignature || '--'" />
-              <cwg-label-line-value :label="t('TradingCenter.item11')" :value="getAccountTypeText(DailyIndex.groupType)" />
+              <cwg-label-line-value :label="t('TradingCenter.item11')"
+                :value="getAccountTypeText(DailyIndex.groupType)" />
               <cwg-label-line-value :label="t('TradingCenter.item15')" :value="DailyIndex1.addTime || '--'" />
             </view>
           </view>
@@ -37,7 +38,7 @@
             </view>
           </view>
         </view>
-        
+
         <!-- 数据指标部分 -->
         <view class="section-row">
           <!-- 历史表现 -->
@@ -46,11 +47,14 @@
               <view class="title"><text>{{ t('TradingCenter.item17') }}</text></view>
             </view>
             <view class="fllow-info-grid">
-              <cwg-label-line-value :label="t('TradingCenter.item18')" :value="formatCurrency(DailyIndex.pl, DailyIndex.currency, DailyIndex.groupType)" />
-              <cwg-label-line-value :label="t('TradingCenter.item21')" :value="formatCurrency(DailyIndex.loss, DailyIndex.currency, DailyIndex.groupType)" />
+              <cwg-label-line-value :label="t('TradingCenter.item18')"
+                :value="formatCurrency(DailyIndex.pl, DailyIndex.currency, DailyIndex.groupType)" />
+              <cwg-label-line-value :label="t('TradingCenter.item21')"
+                :value="formatCurrency(DailyIndex.loss, DailyIndex.currency, DailyIndex.groupType)" />
               <cwg-label-line-value :label="t('TradingCenter.item19')" :value="DailyIndex.plRate || '0'" />
               <cwg-label-line-value :label="t('TradingCenter.item7')" :value="DailyIndex.maxDdRate || '0'" />
-              <cwg-label-line-value :label="t('TradingCenter.item20')" :value="formatCurrency(DailyIndex.profit, DailyIndex.currency, DailyIndex.groupType)" />
+              <cwg-label-line-value :label="t('TradingCenter.item20')"
+                :value="formatCurrency(DailyIndex.profit, DailyIndex.currency, DailyIndex.groupType)" />
             </view>
           </view>
           <!-- 交易规模与效率 -->
@@ -74,7 +78,7 @@
             </view>
           </view>
         </view>
-        
+
         <view class="section-row">
           <!-- 资金流向 -->
           <view class="section-col">
@@ -82,9 +86,12 @@
               <view class="title"><text>{{ t('TradingCenter.item33') }}</text></view>
             </view>
             <view class="fllow-info-grid">
-              <cwg-label-line-value :label="t('TradingCenter.item34')" :value="formatCurrency(DailyIndex.deposit, DailyIndex.currency, DailyIndex.groupType)" />
-              <cwg-label-line-value :label="t('TradingCenter.item36')" :value="formatCurrency(DailyIndex.credit, DailyIndex.currency, DailyIndex.groupType)" />
-              <cwg-label-line-value :label="t('TradingCenter.item35')" :value="formatCurrency(DailyIndex.withdraw, DailyIndex.currency, DailyIndex.groupType)" />
+              <cwg-label-line-value :label="t('TradingCenter.item34')"
+                :value="formatCurrency(DailyIndex.deposit, DailyIndex.currency, DailyIndex.groupType)" />
+              <cwg-label-line-value :label="t('TradingCenter.item36')"
+                :value="formatCurrency(DailyIndex.credit, DailyIndex.currency, DailyIndex.groupType)" />
+              <cwg-label-line-value :label="t('TradingCenter.item35')"
+                :value="formatCurrency(DailyIndex.withdraw, DailyIndex.currency, DailyIndex.groupType)" />
             </view>
           </view>
           <!-- 订阅与跟单 -->
@@ -94,11 +101,12 @@
             </view>
             <view class="fllow-info-grid">
               <cwg-label-line-value :label="t('TradingCenter.item37')" :value="DailyIndex.follows || '0'" />
-              <cwg-label-line-value :label="t('TradingCenter.item38')" :value="formatCurrency(DailyIndex.followsPl, DailyIndex.currency, DailyIndex.groupType)" />
+              <cwg-label-line-value :label="t('TradingCenter.item38')"
+                :value="formatCurrency(DailyIndex.followsPl, DailyIndex.currency, DailyIndex.groupType)" />
             </view>
           </view>
         </view>
-        
+
         <!-- 排名曲线和净值曲线 -->
         <view class="section-row">
           <!-- 排名曲线 -->
@@ -121,11 +129,13 @@
           </view>
         </view>
       </view>
-      
+
       <!-- Tab 2: 交易订单 -->
       <view v-if="activeTab === '2'" class="tab-content">
-        <cwg-complex-search :fields="tab2FilterFields" v-model="tab2SearchParams" @search="handleTab2Search" @reset="handleTab2Reset" />
-        <cwg-tabel ref="table2Ref" :columns="tab2Columns" :immediate="true" :queryParams="tab2QueryParams" :api="tab2Api" :show-operation="false" :showSummary="true" :summaryMethod="getSummaries1">
+        <cwg-complex-search :fields="tab2FilterFields" v-model="tab2SearchParams" @search="handleTab2Search"
+          @reset="handleTab2Reset" />
+        <cwg-tabel ref="table2Ref" :columns="tab2Columns" :immediate="true" :queryParams="tab2QueryParams"
+          :api="tab2Api" :show-operation="false" :showSummary="true" :summaryMethod="getSummaries1">
           <template #openClosePrice="{ row }">
             <view class="sp-div-tab">{{ formatNumber(row.openPrice) }}</view>
             <view class="sp-div-tab-b">{{ formatNumber(row.closePrice) }}</view>
@@ -140,7 +150,7 @@
           </template>
         </cwg-tabel>
       </view>
-      
+
       <!-- Tab 3: 订阅总览 -->
       <view v-if="activeTab === '3'" class="tab-content">
         <view class="summary-top">
@@ -151,10 +161,12 @@
             <text>{{ t('Documentary.tradingCenter.item124') }}</text>: {{ tableSumData.volume || '0' }}
           </view>
         </view>
-        <cwg-complex-search :fields="tab3FilterFields" v-model="tab3SearchParams" @search="handleTab3Search" @reset="handleTab3Reset" />
-        <cwg-tabel ref="table3Ref" :columns="tab3Columns" :immediate="true" :queryParams="tab3QueryParams" :api="tab3Api" :show-operation="false" />
+        <cwg-complex-search :fields="tab3FilterFields" v-model="tab3SearchParams" @search="handleTab3Search"
+          @reset="handleTab3Reset" />
+        <cwg-tabel ref="table3Ref" :columns="tab3Columns" :immediate="true" :queryParams="tab3QueryParams"
+          :api="tab3Api" :show-operation="false" />
       </view>
-      
+
     </view>
   </cwg-page-wrapper>
 </template>
@@ -173,53 +185,53 @@ const myRanking = ref('');
 const myId = ref('');
 
 onLoad((options: any) => {
-    myLogin.value = options.dealLogin || options.login || '';
-    myRanking.value = options.ranking || '';
-    myId.value = options.id || '';
-    
-    activeTab.value = '1';
-    getDate();
-    getPersonalIndicators();
+  myLogin.value = options.dealLogin || options.login || '';
+  myRanking.value = options.ranking || '';
+  myId.value = options.id || '';
+
+  activeTab.value = '1';
+  getDate();
+  getPersonalIndicators();
 });
 
 // --- Time fetching ---
 const time = ref('');
 
 const getLocalTime = () => {
-    let timezone = 2; 
-    let offset_GMT = new Date().getTimezoneOffset(); 
-    let nowDate = new Date().getTime(); 
-    let now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000);
-    let year = now.getFullYear();
-    let month = String(now.getMonth() + 1).padStart(2, '0');
-    let day = String(now.getDate()).padStart(2, '0');
-    let hh = String(now.getHours()).padStart(2, '0');
-    let mm = String(now.getMinutes()).padStart(2, '0');
-    time.value = `${year}/${month}/${day}  ${hh}:${mm}`;
+  let timezone = 2;
+  let offset_GMT = new Date().getTimezoneOffset();
+  let nowDate = new Date().getTime();
+  let now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000);
+  let year = now.getFullYear();
+  let month = String(now.getMonth() + 1).padStart(2, '0');
+  let day = String(now.getDate()).padStart(2, '0');
+  let hh = String(now.getHours()).padStart(2, '0');
+  let mm = String(now.getMinutes()).padStart(2, '0');
+  time.value = `${year}/${month}/${day}  ${hh}:${mm}`;
 };
 
 const getDate = async () => {
-    try {
-        let res = await documentaryApi.followDealSignalRefreshDate();
-        if (res.code === 200 && res.data) {
-            time.value = res.data;
-        } else {
-            getLocalTime();
-        }
-    } catch (error) {
-        getLocalTime();
+  try {
+    let res = await documentaryApi.followDealSignalRefreshDate();
+    if (res.code === 200 && res.data) {
+      time.value = res.data;
+    } else {
+      getLocalTime();
     }
+  } catch (error) {
+    getLocalTime();
+  }
 };
 
 const toReload = () => {
-    getDate();
-    if (activeTab.value === '1') {
-        getPersonalIndicators();
-    } else if (activeTab.value === '2') {
-        table2Ref.value?.refreshTable();
-    } else if (activeTab.value === '3') {
-        table3Ref.value?.refreshTable();
-    }
+  getDate();
+  if (activeTab.value === '1') {
+    getPersonalIndicators();
+  } else if (activeTab.value === '2') {
+    table2Ref.value?.refreshTable();
+  } else if (activeTab.value === '3') {
+    table3Ref.value?.refreshTable();
+  }
 };
 
 onMounted(() => {
@@ -231,9 +243,9 @@ onUnmounted(() => {
 // --- Tabs ---
 const activeTab = ref('1');
 const tabs = computed(() => [
-    { text: t('Documentary.tradingCenter.item60'), value: '1' },
-    { text: t('Documentary.tradingCenter.item58'), value: '2' },
-    { text: t('Documentary.tradingCenter.item59'), value: '3' }
+  { text: t('Documentary.tradingCenter.item60'), value: '1' },
+  { text: t('Documentary.tradingCenter.item58'), value: '2' },
+  { text: t('Documentary.tradingCenter.item59'), value: '3' }
 ]);
 
 // --- Tab 1 Data ---
@@ -242,239 +254,243 @@ const DailyIndex1 = ref<any>({});
 
 const symbolSummaryData = ref<any>({ series: [] });
 const pieOpts = ref({
-    color: ["#5470C6", "#91CC75", "#EE6666", "#FAC858", "#73C0DE", "#3BA272"],
-    padding: [5, 5, 5, 5],
-    legend: {
-        show: true,
-        position: "left"
-    }
+  color: ["#5470C6", "#91CC75", "#EE6666", "#FAC858", "#73C0DE", "#3BA272"],
+  padding: [5, 5, 5, 5],
+  legend: {
+    show: true,
+    position: "left"
+  }
 });
 
 const rankingChartData = ref<any>({ categories: [], series: [] });
 const rankingChartOpts = ref({
-    yAxis: {
-        data: [{
-            axisLine: false,
-            inverse: false
-        }]
-    }
+  yAxis: {
+    data: [{
+      axisLine: false,
+      inverse: false
+    }]
+  }
 });
 const equityChartData = ref<any>({ categories: [], series: [] });
 
 const getAccountTypeText = (type: number) => {
-    const map: Record<number, string> = {
-        1: 'AccountType.ClassicAccount',
-        2: 'AccountType.SeniorAccount',
-        5: 'AccountType.SpeedAccount',
-        6: 'AccountType.SpeedAccount',
-        7: 'AccountType.StandardAccount',
-        8: 'AccountType.CentAccount'
-    };
-    return type && map[type] ? t(map[type]) : '--';
+  const map: Record<number, string> = {
+    1: 'AccountType.ClassicAccount',
+    2: 'AccountType.SeniorAccount',
+    5: 'AccountType.SpeedAccount',
+    6: 'AccountType.SpeedAccount',
+    7: 'AccountType.StandardAccount',
+    8: 'AccountType.CentAccount'
+  };
+  return type && map[type] ? t(map[type]) : '--';
 };
 
 const formatCurrency = (val: any, currency?: string, groupType?: number) => {
-    if (!val) return '0';
-    let symbol = '$';
-    if (currency === 'GBP') symbol = '£';
-    else if (currency === 'EUR') symbol = '€';
-    else if (currency === 'USC' || groupType == 8) symbol = '¢';
-    return `${symbol}${val}`;
+  if (!val) return '0';
+  let symbol = '$';
+  if (currency === 'GBP') symbol = '£';
+  else if (currency === 'EUR') symbol = '€';
+  else if (currency === 'USC' || groupType == 8) symbol = '¢';
+  return `${symbol}${val}`;
 };
 
 const getPersonalIndicators = async () => {
-    if (myId.value) {
-        let res = await documentaryApi.followDealSignalSearchSingle({ id: myId.value });
-        if (res.code === 200 && res.data) {
-            DailyIndex.value = res.data;
-            DailyIndex1.value = res.data;
-            if (res.data.login) {
-                myLogin.value = res.data.login;
-            }
-            if (res.data.symbolSummary) {
-                drawSymbolSummary(res.data.symbolSummary);
-            }
-            getChart4();
-            getChart5();
-        }
-    } else {
-        // Fallback
-        documentaryApi.followDailyIndex({ login: myLogin.value }).then(res => {
-            if (res.code === 200) DailyIndex.value = res.data || {};
-        });
-        documentaryApi.followDealCard({ login: myLogin.value }).then(res => {
-            if (res.code === 200) DailyIndex1.value = res.data || {};
-        });
-        documentaryApi.followDailyChartSymbol({ login: myLogin.value }).then(res => {
-            if (res.code === 200 && res.data && res.data[0] && res.data[0].volumes) {
-                drawSymbolSummary(res.data[0].volumes);
-            }
-        });
-        getChart4();
-        getChart5();
+  if (myId.value) {
+    let res = await documentaryApi.followDealSignalSearchSingle({ id: myId.value });
+    if (res.code === 200 && res.data) {
+      DailyIndex.value = res.data;
+      DailyIndex1.value = res.data;
+      if (res.data.login) {
+        myLogin.value = res.data.login;
+      }
+      if (res.data.symbolSummary) {
+        drawSymbolSummary(res.data.symbolSummary);
+      }
+      getChart4();
+      getChart5();
     }
+  } else {
+    // Fallback
+    documentaryApi.followDailyIndex({ login: myLogin.value }).then(res => {
+      if (res.code === 200) DailyIndex.value = res.data || {};
+    });
+    documentaryApi.followDealCard({ login: myLogin.value }).then(res => {
+      if (res.code === 200) DailyIndex1.value = res.data || {};
+    });
+    documentaryApi.followDailyChartSymbol({ login: myLogin.value }).then(res => {
+      if (res.code === 200 && res.data && res.data[0] && res.data[0].volumes) {
+        drawSymbolSummary(res.data[0].volumes);
+      }
+    });
+    getChart4();
+    getChart5();
+  }
 };
 
 const drawSymbolSummary = (data: any[]) => {
-    let pieData = data.map(item => {
-        let name = item.symbol || item.name || '';
-        if (!name && item.symbolType) {
-            const types = ['', t('Documentary.Report.item11'), t('Documentary.Report.item12'), t('Documentary.Report.item13'), t('Documentary.Report.item14'), t('Documentary.Report.item15'), t('Documentary.Report.item16')];
-            name = types[item.symbolType] || '';
-        }
-        let value = item.volume !== undefined ? item.volume : (item.value !== undefined ? item.value : (item.amount || 0));
-        return { name, value };
-    });
-    symbolSummaryData.value = {
-        series: [{ data: pieData }]
-    };
+  let pieData = data.map(item => {
+    let name = item.symbol || item.name || '';
+    if (!name && item.symbolType) {
+      const types = ['', t('Documentary.Report.item11'), t('Documentary.Report.item12'), t('Documentary.Report.item13'), t('Documentary.Report.item14'), t('Documentary.Report.item15'), t('Documentary.Report.item16')];
+      name = types[item.symbolType] || '';
+    }
+    let value = item.volume !== undefined ? item.volume : (item.value !== undefined ? item.value : (item.amount || 0));
+    return { name, value };
+  });
+  symbolSummaryData.value = {
+    series: [{ data: pieData }]
+  };
 };
 
 const getChart4 = async () => {
-    let res = await documentaryApi.getEquityChart({ login: myLogin.value });
-    if (res.code === 200 && res.data) {
-        let categories = [];
-        let seriesData = [];
-        res.data.forEach((item: any) => {
-            categories.push(item.date.split(' ')[0]);
-            seriesData.push(item.amount !== null ? item.amount : item.doubleAmount);
-        });
-        equityChartData.value = {
-            categories,
-            series: [{ name: t('Documentary.tradingCenter.item140'), data: seriesData }]
-        };
-    }
+  let res = await documentaryApi.getEquityChart({ login: myLogin.value });
+  if (res.code === 200 && res.data) {
+    let categories = [];
+    let seriesData = [];
+    res.data.forEach((item: any) => {
+      categories.push(item.date.split(' ')[0]);
+      seriesData.push(item.amount !== null ? item.amount : item.doubleAmount);
+    });
+    equityChartData.value = {
+      categories,
+      series: [{ name: t('Documentary.tradingCenter.item140'), data: seriesData }]
+    };
+  }
 };
 
 const getChart5 = async () => {
-    let res = await documentaryApi.getRankingChart({ login: myLogin.value });
-    if (res.code === 200 && res.data) {
-        let categories = [];
-        let seriesData = [];
-        res.data.forEach((item: any) => {
-            categories.push(item.date.split(' ')[0]);
-            seriesData.push(item.amount !== null ? item.amount : item.doubleAmount);
-        });
-        rankingChartData.value = {
-            categories,
-            series: [{ name: t('TradingCenter.item41'), data: seriesData }]
-        };
-    }
+  let res = await documentaryApi.getRankingChart({ login: myLogin.value });
+  if (res.code === 200 && res.data) {
+    let categories = [];
+    let seriesData = [];
+    res.data.forEach((item: any) => {
+      categories.push(item.date.split(' ')[0]);
+      seriesData.push(item.amount !== null ? item.amount : item.doubleAmount);
+    });
+    rankingChartData.value = {
+      categories,
+      series: [{ name: t('TradingCenter.item41'), data: seriesData }]
+    };
+  }
 };
 
 // --- Formatters ---
 const formatNumber = (value: any) => {
-    if (value == "***") return "***";
-    if (isNaN(value)) return "0";
-    let valStr = String(value);
-    const parts = valStr.split('.');
-    parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
-    return parts.join('.');
+  if (value == "***") return "***";
+  if (isNaN(value)) return "0";
+  let valStr = String(value);
+  const parts = valStr.split('.');
+  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
+  return parts.join('.');
 };
 
 // --- Tab 2 ---
 const table2Ref = ref(null);
 const combined = ref<any>({});
 const tab2SearchParams = ref({
-    tab4Type: 1,
-    date: []
+  tab4Type: 1,
+  date: []
 });
 const tab2FilterFields = computed(() => [
-    { key: 'tab4Type', type: 'select', label: t('Documentary.tradingCenter.item114'), options: [
-        { value: 1, text: t('Documentary.tradingCenter.item114') },
-        // { value: 2, text: t('Documentary.tradingCenter.item115') }
-    ]},
-    { key: 'date', type: 'daterange', label: t('placeholder.choose') }
+  {
+    key: 'tab4Type', type: 'select', label: t('Documentary.tradingCenter.item114'), options: [
+      { value: 1, text: t('Documentary.tradingCenter.item114') },
+      // { value: 2, text: t('Documentary.tradingCenter.item115') }
+    ]
+  },
+  { key: 'date', type: 'daterange', label: t('placeholder.choose') }
 ]);
 const tab2QueryParams = computed(() => {
-    return { ...tab2SearchParams.value, login: myLogin.value };
+  return { ...tab2SearchParams.value, login: myLogin.value };
 });
 const tab2Columns = computed(() => [
-    { prop: 'order', label: t('Label.OrderNumber'), align: 'center' },
-    { prop: 'platform', label: t('Label.Platform'), align: 'center' },
-    { prop: 'cmd', label: t('Label.Type'), align: 'center' },
-    { prop: 'symbol', label: t('Label.Varieties'), align: 'center' },
-    { prop: 'openClosePrice', label: t('Label.OpenPrice') + '/' + t('Label.ClosePrice'), align: 'center', slot: 'openClosePrice' },
-    { prop: 'openCloseTime', label: t('Label.OpenTime') + '/' + t('Label.CloseTime'), align: 'center', slot: 'openCloseTime' },
-    { prop: 'tpSl', label: t('Label.EP') + '/' + t('Label.EL'), align: 'center', slot: 'tpSl' },
-    { prop: 'volume', label: t('Documentary.tradingCenter.item99'), align: 'center', formatter: ({row}:any) => formatNumber(row.volume || '0') },
-    { prop: 'storage', label: t('Label.StorageFee'), align: 'center', formatter: ({row}:any) => formatNumber(row.storage || '0') },
-    { prop: 'profit', label: t('Label.ProfitLoss'), align: 'center', formatter: ({row}:any) => formatNumber(row.profit || '0') },
-    { prop: 'totalProfit', label: t('Label.TotalProfitLoss'), align: 'center', formatter: ({row}:any) => formatNumber(row.totalProfit || '0') }
+  { prop: 'order', label: t('Label.OrderNumber'), align: 'center' },
+  { prop: 'platform', label: t('Label.Platform'), align: 'center' },
+  { prop: 'cmd', label: t('Label.Type'), align: 'center' },
+  { prop: 'symbol', label: t('Label.Varieties'), align: 'center' },
+  { prop: 'openClosePrice', label: t('Label.OpenPrice') + '/' + t('Label.ClosePrice'), align: 'center', slot: 'openClosePrice' },
+  { prop: 'openCloseTime', label: t('Label.OpenTime') + '/' + t('Label.CloseTime'), align: 'center', slot: 'openCloseTime' },
+  { prop: 'tpSl', label: t('Label.EP') + '/' + t('Label.EL'), align: 'center', slot: 'tpSl' },
+  { prop: 'volume', label: t('Documentary.tradingCenter.item99'), align: 'center', formatter: ({ row }: any) => formatNumber(row.volume || '0') },
+  { prop: 'storage', label: t('Label.StorageFee'), align: 'center', formatter: ({ row }: any) => formatNumber(row.storage || '0') },
+  { prop: 'profit', label: t('Label.ProfitLoss'), align: 'center', formatter: ({ row }: any) => formatNumber(row.profit || '0') },
+  { prop: 'totalProfit', label: t('Label.TotalProfitLoss'), align: 'center', formatter: ({ row }: any) => formatNumber(row.totalProfit || '0') }
 ]);
 
 const tab2Api = async (params: any) => {
-    let res = await documentaryApi.followOrderRecordList(params);
-    if (res.code === 200 || res.code === 0 || res.code === 10000) {
-        combined.value = res.sum || {};
-    }
-    return res;
+  let res = await documentaryApi.followOrderRecordList(params);
+  if (res.code === 200 || res.code === 0 || res.code === 10000) {
+    combined.value = res.sum || {};
+  }
+  return res;
 };
 
 const getSummaries1 = ({ columns }: any) => {
-    let sums = Array(columns.length).fill('');
-    if (Object.keys(combined.value).length > 0) {
-        sums[0] = t('Label.Total');
-        const volIdx = columns.findIndex((c:any) => c.prop === 'volume');
-        const proIdx = columns.findIndex((c:any) => c.prop === 'profit');
-        const totIdx = columns.findIndex((c:any) => c.prop === 'totalProfit');
-        if (volIdx > -1) sums[volIdx] = combined.value.volume ? formatNumber(combined.value.volume) : 0;
-        if (proIdx > -1) sums[proIdx] = combined.value.profit ? formatNumber(combined.value.profit) : 0;
-        if (totIdx > -1) sums[totIdx] = combined.value.totalProfit ? formatNumber(combined.value.totalProfit) : 0;
-    }
-    return sums;
+  let sums = Array(columns.length).fill('');
+  if (Object.keys(combined.value).length > 0) {
+    sums[0] = t('Label.Total');
+    const volIdx = columns.findIndex((c: any) => c.prop === 'volume');
+    const proIdx = columns.findIndex((c: any) => c.prop === 'profit');
+    const totIdx = columns.findIndex((c: any) => c.prop === 'totalProfit');
+    if (volIdx > -1) sums[volIdx] = combined.value.volume ? formatNumber(combined.value.volume) : 0;
+    if (proIdx > -1) sums[proIdx] = combined.value.profit ? formatNumber(combined.value.profit) : 0;
+    if (totIdx > -1) sums[totIdx] = combined.value.totalProfit ? formatNumber(combined.value.totalProfit) : 0;
+  }
+  return sums;
 };
 
 const handleTab2Search = (params: any) => {
-    tab2SearchParams.value = params;
-    nextTick(() => { table2Ref.value?.refreshTable(); });
+  tab2SearchParams.value = params;
+  nextTick(() => { table2Ref.value?.refreshTable(); });
 };
 const handleTab2Reset = (params: any) => {
-    tab2SearchParams.value = params;
-    nextTick(() => { table2Ref.value?.refreshTable(); });
+  tab2SearchParams.value = params;
+  nextTick(() => { table2Ref.value?.refreshTable(); });
 };
 
 // --- Tab 3 ---
 const table3Ref = ref(null);
 const tableSumData = ref<any>({});
 const tab3SearchParams = ref({
-    platform: 'MT4',
-    date: []
+  platform: 'MT4',
+  date: []
 });
 const tab3FilterFields = computed(() => [
-    { key: 'platform', type: 'select', label: t('Label.Platform'), options: [
-        { value: 'MT4', text: 'MT4' },
-        { value: 'MT5', text: 'MT5' }
-    ]},
-    { key: 'date', type: 'daterange', label: t('placeholder.choose') }
+  {
+    key: 'platform', type: 'select', label: t('Label.Platform'), options: [
+      { value: 'MT4', text: 'MT4' },
+      { value: 'MT5', text: 'MT5' }
+    ]
+  },
+  { key: 'date', type: 'daterange', label: t('placeholder.choose') }
 ]);
 const tab3QueryParams = computed(() => {
-    return { ...tab3SearchParams.value, login: myLogin.value };
+  return { ...tab3SearchParams.value, login: myLogin.value };
 });
 const tab3Columns = computed(() => [
-    { prop: 'followLogin', label: t('Documentary.tradingCenter.item102'), align: 'center' },
-    { prop: 'platform', label: t('Label.Platform'), align: 'center' },
-    { prop: 'startTime', label: t('Documentary.tradingCenter.item103'), align: 'center' },
-    { prop: 'endTime', label: t('Documentary.tradingCenter.item104'), align: 'center' },
-    { prop: 'profit', label: t('Documentary.tradingCenter.item105'), align: 'center', formatter: ({row}:any) => formatNumber(row.profit || '0') },
-    { prop: 'volume', label: t('Documentary.tradingCenter.item99'), align: 'center', formatter: ({row}:any) => formatNumber(row.volume || '0') }
+  { prop: 'followLogin', label: t('Documentary.tradingCenter.item102'), align: 'center' },
+  { prop: 'platform', label: t('Label.Platform'), align: 'center' },
+  { prop: 'startTime', label: t('Documentary.tradingCenter.item103'), align: 'center' },
+  { prop: 'endTime', label: t('Documentary.tradingCenter.item104'), align: 'center' },
+  { prop: 'profit', label: t('Documentary.tradingCenter.item105'), align: 'center', formatter: ({ row }: any) => formatNumber(row.profit || '0') },
+  { prop: 'volume', label: t('Documentary.tradingCenter.item99'), align: 'center', formatter: ({ row }: any) => formatNumber(row.volume || '0') }
 ]);
 
 const tab3Api = async (params: any) => {
-    let res = await documentaryApi.followDealSubscribeSummary(params);
-    if (res.code === 200 || res.code === 0 || res.code === 10000) {
-        tableSumData.value = res.sum || {};
-    }
-    return res;
+  let res = await documentaryApi.followDealSubscribeSummary(params);
+  if (res.code === 200 || res.code === 0 || res.code === 10000) {
+    tableSumData.value = res.sum || {};
+  }
+  return res;
 };
 
 const handleTab3Search = (params: any) => {
-    tab3SearchParams.value = params;
-    nextTick(() => { table3Ref.value?.refreshTable(); });
+  tab3SearchParams.value = params;
+  nextTick(() => { table3Ref.value?.refreshTable(); });
 };
 const handleTab3Reset = (params: any) => {
-    tab3SearchParams.value = params;
-    nextTick(() => { table3Ref.value?.refreshTable(); });
+  tab3SearchParams.value = params;
+  nextTick(() => { table3Ref.value?.refreshTable(); });
 };
 
 </script>
@@ -483,90 +499,93 @@ const handleTab3Reset = (params: any) => {
 @import "@/uni.scss";
 
 .time-header {
-    display: flex;
-    align-items: center;
-    font-size: 14px;
-    font-weight: 500;
-    color: #333;
-    .time-value {
-        margin-left: 6px;
-        color: #666;
-    }
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  font-weight: 500;
+  color: var(--bs-heading-color);
+
+  .time-value {
+    margin-left: 6px;
+    color: var(--bs-heading-color);
+  }
 }
 
 .info-card {
-    padding: 16px;
-    background: #fff;
-    border-radius: 8px;
+  padding: 16px;
+  background: #fff;
+  border-radius: 8px;
 }
 
 .tab-content {
-    margin-top: 16px;
+  margin-top: 16px;
 }
 
 .section-row {
-    display: flex;
-    flex-wrap: wrap;
-    gap: 20px;
-    margin-bottom: 20px;
+  display: flex;
+  flex-wrap: wrap;
+  gap: 20px;
+  margin-bottom: 20px;
 }
 
 .section-col {
-    flex: 1;
-    min-width: 300px;
-    border: 1px solid #f0f0f0;
-    border-radius: 8px;
-    padding: 16px;
-    box-sizing: border-box;
+  flex: 1;
+  min-width: 300px;
+  border: 1px solid #f0f0f0;
+  border-radius: 8px;
+  padding: 16px;
+  box-sizing: border-box;
 }
 
 .fllow-title {
-    display: flex;
-    justify-content: space-between;
-    border-bottom: 1px solid #eee;
-    padding-bottom: 10px;
-    margin-bottom: 10px;
-    .title {
-        font-weight: bold;
-        color: #333;
-        padding-left: 8px;
-        border-left: 4px solid #eb3f57;
-        font-size: 16px;
-    }
+  display: flex;
+  justify-content: space-between;
+  border-bottom: 1px solid #eee;
+  padding-bottom: 10px;
+  margin-bottom: 10px;
+
+  .title {
+    font-weight: bold;
+    color: var(--bs-heading-color);
+    padding-left: 8px;
+    border-left: 4px solid #eb3f57;
+    font-size: 16px;
+  }
 }
 
 .fllow-info-list {
-    display: flex;
-    flex-direction: column;
-    gap: 8px;
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
 }
 
 .fllow-info-grid {
-    display: grid;
-    grid-template-columns: 1fr 1fr;
-    gap: 8px 20px;
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  gap: 8px 20px;
 }
 
 .chart-container {
-    width: 100%;
-    height: 250px;
+  width: 100%;
+  height: 250px;
 }
 
 .sp-div-tab {
-    border-bottom: 1px dashed #eee;
-    padding-bottom: 4px;
-    margin-bottom: 4px;
+  border-bottom: 1px dashed #eee;
+  padding-bottom: 4px;
+  margin-bottom: 4px;
 }
+
 .sp-div-tab-b {
-    padding-top: 4px;
+  padding-top: 4px;
 }
 
 .summary-top {
-    display: flex;
-    gap: 20px;
-    margin-bottom: 16px;
-    font-size: 14px;
-    font-weight: bold;
-    color: #4497ff;
+  display: flex;
+  gap: 20px;
+  margin-bottom: 16px;
+  font-size: 14px;
+  font-weight: bold;
+  color: #4497ff;
 }
 </style>

+ 489 - 488
pages/follow/trading-center.vue

@@ -2,14 +2,13 @@
   <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
     <cwg-header :title="t('Documentary.page_doc.item2')" />
     <view class="info-card">
-<!--      <view class="time-header">-->
-<!--        <text>{{ t('Documentary.console.item2') }}:</text>-->
-<!--        <text class="time-value">{{ time }}</text>-->
-<!--      </view>-->
-      <cwg-complex-search :fields="filterFields" v-model="searchParams" @search="handleSearch"
-                          @reset="handleReset" />
-      <cwg-tabel ref="tableRef" :columns="currentColumns" :mobilePrimaryFields="mobilePrimaryFields" :immediate="true" :queryParams="queryParams" :api="listApi"
-                 :show-operation="false" @sort-change="handleSortChange">
+      <!--      <view class="time-header">-->
+      <!--        <text>{{ t('Documentary.console.item2') }}:</text>-->
+      <!--        <text class="time-value">{{ time }}</text>-->
+      <!--      </view>-->
+      <cwg-complex-search :fields="filterFields" v-model="searchParams" @search="handleSearch" @reset="handleReset" />
+      <cwg-tabel ref="tableRef" :columns="currentColumns" :mobilePrimaryFields="mobilePrimaryFields" :immediate="true"
+        :queryParams="queryParams" :api="listApi" :show-operation="false" @sort-change="handleSortChange">
 
         <!-- TOP/推荐 -->
         <template #recommend="{ row }">
@@ -51,7 +50,7 @@
 
     <!-- 自动跟随设置弹窗 -->
     <cwg-popup v-model:visible="dialogFllow" type="center" :title="t('Documentary.tradingCenter.item27')"
-               :showFooters="true">
+      :showFooters="true">
       <scroll-view scroll-y class="dia-content" style="max-height: 60vh;">
         <view class="fllow-title">
           <text class="title">{{ t('Documentary.tradingCenter.item27') }}-{{ dialogFllowData1.nickname || '--' }}</text>
@@ -111,24 +110,24 @@
           <view class="form-grid">
             <uni-forms-item :label="t('Documentary.console.item4')" name="followLogin">
               <uni-data-select v-model="dialogFllowData.followLogin" :localdata="followLoginOptions"
-                               @change="selectLogin"></uni-data-select>
+                @change="selectLogin"></uni-data-select>
             </uni-forms-item>
             <uni-forms-item :label="t('Documentary.tradingCenter.item34')" name="leverage">
               <uni-easyinput v-model="dialogFllowData.leverage" disabled />
             </uni-forms-item>
             <uni-forms-item :label="t('Documentary.tradingCenter.item35')" name="followType">
               <uni-data-select v-model="dialogFllowData.followType" :localdata="[
-                                { value: 3, text: t('Documentary.tradingCenter.item118') },
-                                { value: 2, text: t('Documentary.tradingCenter.item117') },
-                                { value: 1, text: t('Documentary.tradingCenter.item116') }
-                            ]"></uni-data-select>
+                { value: 3, text: t('Documentary.tradingCenter.item118') },
+                { value: 2, text: t('Documentary.tradingCenter.item117') },
+                { value: 1, text: t('Documentary.tradingCenter.item116') }
+              ]"></uni-data-select>
             </uni-forms-item>
             <uni-forms-item v-if="dialogFllowData.followType == 1" :label="t('Documentary.tradingCenter.item119')"
-                            name="volume">
+              name="volume">
               <uni-easyinput v-model="dialogFllowData.volume" />
             </uni-forms-item>
             <uni-forms-item v-if="dialogFllowData.followType == 2"
-                            :label="t('Documentary.tradingCenter.item122') + ' (%)'" name="ratio">
+              :label="t('Documentary.tradingCenter.item122') + ' (%)'" name="ratio">
               <uni-easyinput v-model="dialogFllowData.ratio" />
             </uni-forms-item>
           </view>
@@ -136,21 +135,22 @@
           <view class="fllow-title section-title">
             <text class="title">{{ t('Documentary.tradingCenter.item37') }}</text>
             <switch :checked="dialogFllowData.protect === 1"
-                    @change="e => dialogFllowData.protect = e.detail.value ? 1 : 0" color="#368FEC" style="transform: scale(0.7)"/>
+              @change="e => dialogFllowData.protect = e.detail.value ? 1 : 0" color="#368FEC"
+              style="transform: scale(0.7)" />
           </view>
 
           <view class="form-grid" v-if="dialogFllowData.protect === 1">
             <uni-forms-item :label="t('Documentary.tradingCenter.item38')" name="protectType">
               <uni-data-select v-model="dialogFllowData.protectType" :localdata="[
-                                { value: 1, text: t('Documentary.tradingCenter.item120') }
-                            ]"></uni-data-select>
+                { value: 1, text: t('Documentary.tradingCenter.item120') }
+              ]"></uni-data-select>
             </uni-forms-item>
             <uni-forms-item v-if="dialogFllowData.protectType == 1"
-                            :label="t('Documentary.tradingCenter.item39') + '($)'" name="protectAmount">
+              :label="t('Documentary.tradingCenter.item39') + '($)'" name="protectAmount">
               <uni-easyinput v-model="dialogFllowData.protectAmount" />
             </uni-forms-item>
             <uni-forms-item v-if="dialogFllowData.protectType == 2"
-                            :label="t('Documentary.tradingCenter.item122') + '(%)'" name="protectRatio">
+              :label="t('Documentary.tradingCenter.item122') + '(%)'" name="protectRatio">
               <uni-easyinput v-model="dialogFllowData.protectRatio" />
             </uni-forms-item>
           </view>
@@ -162,7 +162,7 @@
           <uni-forms-item name="agree">
             <label class="agree-label">
               <checkbox :checked="dialogFllowData.agree" @click="dialogFllowData.agree = !dialogFllowData.agree"
-                        style="transform:scale(0.7)" />
+                style="transform:scale(0.7)" />
               <text>{{ t('Documentary.tradingCenter.item40') }} -</text>
               <text class="link" @click="openAgreement">{{ t('Documentary.tradingCenter.item41') }}</text>
             </label>
@@ -178,530 +178,531 @@
 </template>
 
 <script setup lang="ts">
-  import { computed, ref, nextTick, onMounted, onUnmounted } from 'vue'
-  import { useI18n } from 'vue-i18n'
-  import { documentaryApi } from '@/service/documentary'
-  import useUserStore from '@/stores/use-user-store'
-
-  const { t, locale } = useI18n()
-  const userStore = useUserStore()
-  const userInfo = computed(() => userStore.userInfo)
-
-  // --- Time fetching ---
-  const time = ref('')
-  let timer: any = null
-
-  const getLocalTime = () => {
-    let timezone = 2
-    let offset_GMT = new Date().getTimezoneOffset()
-    let nowDate = new Date().getTime()
-    let now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000)
-    let year = now.getFullYear()
-    let month = String(now.getMonth() + 1).padStart(2, '0')
-    let day = String(now.getDate()).padStart(2, '0')
-    let hh = String(now.getHours()).padStart(2, '0')
-    let mm = String(now.getMinutes()).padStart(2, '0')
-    time.value = `${year}/${month}/${day}  ${hh}:${mm}`
-  }
-
-  const getDate = async () => {
-    try {
-      let res = await documentaryApi.followDealSignalRefreshDate()
-      if (res.code === 200 && res.data) {
-        time.value = res.data
-      } else {
-        getLocalTime()
-      }
-    } catch (error) {
+import { computed, ref, nextTick, onMounted, onUnmounted } from 'vue'
+import { useI18n } from 'vue-i18n'
+import { documentaryApi } from '@/service/documentary'
+import useUserStore from '@/stores/use-user-store'
+
+const { t, locale } = useI18n()
+const userStore = useUserStore()
+const userInfo = computed(() => userStore.userInfo)
+
+// --- Time fetching ---
+const time = ref('')
+let timer: any = null
+
+const getLocalTime = () => {
+  let timezone = 2
+  let offset_GMT = new Date().getTimezoneOffset()
+  let nowDate = new Date().getTime()
+  let now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000)
+  let year = now.getFullYear()
+  let month = String(now.getMonth() + 1).padStart(2, '0')
+  let day = String(now.getDate()).padStart(2, '0')
+  let hh = String(now.getHours()).padStart(2, '0')
+  let mm = String(now.getMinutes()).padStart(2, '0')
+  time.value = `${year}/${month}/${day}  ${hh}:${mm}`
+}
+
+const getDate = async () => {
+  try {
+    let res = await documentaryApi.followDealSignalRefreshDate()
+    if (res.code === 200 && res.data) {
+      time.value = res.data
+    } else {
       getLocalTime()
     }
+  } catch (error) {
+    getLocalTime()
   }
+}
+
+onMounted(() => {
+  getDate()
+})
+
+onUnmounted(() => {
+})
+
+// --- Table Config ---
+const searchParams = ref({
+  nickname: '',
+  plStart: '', plEnd: '',
+  plRateStart: '', plRateEnd: '',
+  volumeStart: '', volumeEnd: '',
+  winRateStart: '', winRateEnd: '',
+  maxDdRateStart: '', maxDdRateEnd: '',
+  activityRange: '',
+  followsStart: '', followsEnd: '',
+})
+
+const filterFields = computed(() => [
+  { key: 'nickname', type: 'input', label: t('TradingCenter.item13'), placeholder: t('TradingCenter.item13') },
+  {
+    key: 'plStart',
+    type: 'number',
+    label: t('TradingCenter.item3') + ' (' + t('TradingCenter.item1') + ')',
+    placeholder: t('TradingCenter.item3') + ' (' + t('TradingCenter.item1') + ')',
+  },
+  {
+    key: 'plEnd',
+    type: 'number',
+    label: t('TradingCenter.item3') + ' (' + t('TradingCenter.item2') + ')',
+    placeholder: t('TradingCenter.item3') + ' (' + t('TradingCenter.item2') + ')',
+  },
+  {
+    key: 'plRateStart',
+    type: 'number',
+    label: t('TradingCenter.item4') + ' (' + t('TradingCenter.item1') + ')',
+    placeholder: t('TradingCenter.item4') + ' (' + t('TradingCenter.item1') + ')',
+  },
+  {
+    key: 'plRateEnd',
+    type: 'number',
+    label: t('TradingCenter.item4') + ' (' + t('TradingCenter.item2') + ')',
+    placeholder: t('TradingCenter.item4') + ' (' + t('TradingCenter.item2') + ')',
+  },
+  {
+    key: 'volumeStart',
+    type: 'number',
+    label: t('TradingCenter.item5') + ' (' + t('TradingCenter.item1') + ')',
+    placeholder: t('TradingCenter.item5') + ' (' + t('TradingCenter.item1') + ')',
+  },
+  {
+    key: 'volumeEnd',
+    type: 'number',
+    label: t('TradingCenter.item5') + ' (' + t('TradingCenter.item2') + ')',
+    placeholder: t('TradingCenter.item5') + ' (' + t('TradingCenter.item2') + ')',
+  },
+  {
+    key: 'winRateStart',
+    type: 'number',
+    label: t('TradingCenter.item6') + ' (' + t('TradingCenter.item1') + ')',
+    placeholder: t('TradingCenter.item6') + ' (' + t('TradingCenter.item1') + ')',
+  },
+  {
+    key: 'winRateEnd',
+    type: 'number',
+    label: t('TradingCenter.item6') + ' (' + t('TradingCenter.item2') + ')',
+    placeholder: t('TradingCenter.item6') + ' (' + t('TradingCenter.item2') + ')',
+  },
+  {
+    key: 'maxDdRateStart',
+    type: 'number',
+    label: t('TradingCenter.item7') + ' (' + t('TradingCenter.item1') + ')',
+    placeholder: t('TradingCenter.item7') + ' (' + t('TradingCenter.item1') + ')',
+  },
+  {
+    key: 'maxDdRateEnd',
+    type: 'number',
+    label: t('TradingCenter.item7') + ' (' + t('TradingCenter.item2') + ')',
+    placeholder: t('TradingCenter.item7') + ' (' + t('TradingCenter.item2') + ')',
+  },
+  {
+    key: 'activityRange',
+    type: 'select',
+    label: t('TradingCenter.item8'),
+    placeholder: t('TradingCenter.item8'),
+    options: [
+      { value: 'inactive', text: t('activeState.item1') },
+      { value: 'active', text: t('activeState.item2') },
+      { value: 'very_active', text: t('activeState.item3') },
+    ],
+  },
+  {
+    key: 'followsStart',
+    type: 'number',
+    label: t('TradingCenter.item9') + ' (' + t('TradingCenter.item1') + ')',
+    placeholder: t('TradingCenter.item9') + ' (' + t('TradingCenter.item1') + ')',
+  },
+  {
+    key: 'followsEnd',
+    type: 'number',
+    label: t('TradingCenter.item9') + ' (' + t('TradingCenter.item2') + ')',
+    placeholder: t('TradingCenter.item9') + ' (' + t('TradingCenter.item2') + ')',
+  },
+])
+
+const sortState = ref({
+  orderColumn: 1, // 1:plRate, 2:pl, 3:volume, 4:winRate, 5:maxDdRate, 6:activity, 7:follows
+  orderType: 1,    // 1:asc, 2:desc
+})
+
+const queryParams = computed(() => {
+  const act = searchParams.value.activityRange
+  return {
+    ...searchParams.value,
+    activityStart: act === 'inactive' ? 0 : act === 'active' ? 0.33 : act === 'very_active' ? 0.66 : null,
+    activityEnd: act === 'inactive' ? 0.33 : act === 'active' ? 0.66 : act === 'very_active' ? 1 : null,
+    orderColumn: sortState.value.orderColumn,
+    orderType: sortState.value.orderType,
+  }
+})
 
-  onMounted(() => {
-    getDate()
-  })
-
-  onUnmounted(() => {
-  })
+const tableRef = ref(null)
+const listApi = ref(documentaryApi.followDealSearchList)
 
-  // --- Table Config ---
-  const searchParams = ref({
-    nickname: '',
-    plStart: '', plEnd: '',
-    plRateStart: '', plRateEnd: '',
-    volumeStart: '', volumeEnd: '',
-    winRateStart: '', winRateEnd: '',
-    maxDdRateStart: '', maxDdRateEnd: '',
-    activityRange: '',
-    followsStart: '', followsEnd: '',
+const handleSearch = (params: any) => {
+  searchParams.value = params
+  nextTick(() => {
+    tableRef.value?.refreshTable()
   })
+}
 
-  const filterFields = computed(() => [
-    { key: 'nickname', type: 'input', label: t('TradingCenter.item13'), placeholder: t('TradingCenter.item13') },
-    {
-      key: 'plStart',
-      type: 'number',
-      label: t('TradingCenter.item3') + ' (' + t('TradingCenter.item1') + ')',
-      placeholder: t('TradingCenter.item3') + ' (' + t('TradingCenter.item1') + ')',
-    },
-    {
-      key: 'plEnd',
-      type: 'number',
-      label: t('TradingCenter.item3') + ' (' + t('TradingCenter.item2') + ')',
-      placeholder: t('TradingCenter.item3') + ' (' + t('TradingCenter.item2') + ')',
-    },
-    {
-      key: 'plRateStart',
-      type: 'number',
-      label: t('TradingCenter.item4') + ' (' + t('TradingCenter.item1') + ')',
-      placeholder: t('TradingCenter.item4') + ' (' + t('TradingCenter.item1') + ')',
-    },
-    {
-      key: 'plRateEnd',
-      type: 'number',
-      label: t('TradingCenter.item4') + ' (' + t('TradingCenter.item2') + ')',
-      placeholder: t('TradingCenter.item4') + ' (' + t('TradingCenter.item2') + ')',
-    },
-    {
-      key: 'volumeStart',
-      type: 'number',
-      label: t('TradingCenter.item5') + ' (' + t('TradingCenter.item1') + ')',
-      placeholder: t('TradingCenter.item5') + ' (' + t('TradingCenter.item1') + ')',
-    },
-    {
-      key: 'volumeEnd',
-      type: 'number',
-      label: t('TradingCenter.item5') + ' (' + t('TradingCenter.item2') + ')',
-      placeholder: t('TradingCenter.item5') + ' (' + t('TradingCenter.item2') + ')',
-    },
-    {
-      key: 'winRateStart',
-      type: 'number',
-      label: t('TradingCenter.item6') + ' (' + t('TradingCenter.item1') + ')',
-      placeholder: t('TradingCenter.item6') + ' (' + t('TradingCenter.item1') + ')',
-    },
-    {
-      key: 'winRateEnd',
-      type: 'number',
-      label: t('TradingCenter.item6') + ' (' + t('TradingCenter.item2') + ')',
-      placeholder: t('TradingCenter.item6') + ' (' + t('TradingCenter.item2') + ')',
-    },
-    {
-      key: 'maxDdRateStart',
-      type: 'number',
-      label: t('TradingCenter.item7') + ' (' + t('TradingCenter.item1') + ')',
-      placeholder: t('TradingCenter.item7') + ' (' + t('TradingCenter.item1') + ')',
-    },
-    {
-      key: 'maxDdRateEnd',
-      type: 'number',
-      label: t('TradingCenter.item7') + ' (' + t('TradingCenter.item2') + ')',
-      placeholder: t('TradingCenter.item7') + ' (' + t('TradingCenter.item2') + ')',
-    },
-    {
-      key: 'activityRange',
-      type: 'select',
-      label: t('TradingCenter.item8'),
-      placeholder: t('TradingCenter.item8'),
-      options: [
-        { value: 'inactive', text: t('activeState.item1') },
-        { value: 'active', text: t('activeState.item2') },
-        { value: 'very_active', text: t('activeState.item3') },
-      ],
-    },
-    {
-      key: 'followsStart',
-      type: 'number',
-      label: t('TradingCenter.item9') + ' (' + t('TradingCenter.item1') + ')',
-      placeholder: t('TradingCenter.item9') + ' (' + t('TradingCenter.item1') + ')',
-    },
-    {
-      key: 'followsEnd',
-      type: 'number',
-      label: t('TradingCenter.item9') + ' (' + t('TradingCenter.item2') + ')',
-      placeholder: t('TradingCenter.item9') + ' (' + t('TradingCenter.item2') + ')',
-    },
-  ])
-
-  const sortState = ref({
-    orderColumn: 1, // 1:plRate, 2:pl, 3:volume, 4:winRate, 5:maxDdRate, 6:activity, 7:follows
-    orderType: 1,    // 1:asc, 2:desc
-  })
-
-  const queryParams = computed(() => {
-    const act = searchParams.value.activityRange
-    return {
-      ...searchParams.value,
-      activityStart: act === 'inactive' ? 0 : act === 'active' ? 0.33 : act === 'very_active' ? 0.66 : null,
-      activityEnd: act === 'inactive' ? 0.33 : act === 'active' ? 0.66 : act === 'very_active' ? 1 : null,
-      orderColumn: sortState.value.orderColumn,
-      orderType: sortState.value.orderType,
-    }
+const handleReset = (params: any) => {
+  searchParams.value = params
+  nextTick(() => {
+    tableRef.value?.refreshTable()
   })
+}
 
-  const tableRef = ref(null)
-  const listApi = ref(documentaryApi.followDealSearchList)
-
-  const handleSearch = (params: any) => {
-    searchParams.value = params
-    nextTick(() => {
-      tableRef.value?.refreshTable()
-    })
+const handleSortChange = ({ prop, order }: any) => {
+  const propToColumn: Record<string, number> = {
+    'plRate': 1, 'pl': 2, 'volume': 3, 'winRate': 4, 'maxDdRate': 5, 'activity': 6, 'follows': 7,
   }
-
-  const handleReset = (params: any) => {
-    searchParams.value = params
-    nextTick(() => {
-      tableRef.value?.refreshTable()
-    })
+  sortState.value.orderColumn = propToColumn[prop] || 1
+  sortState.value.orderType = order === 'desc' ? 2 : 1
+  nextTick(() => {
+    tableRef.value?.refreshTable()
+  })
+}
+
+const currentColumns = computed(() => [
+  { prop: 'recommend', label: '', slot: 'recommend', align: 'center', width: 60 },
+  { prop: 'nickname', label: t('Documentary.tradingCenter.item1'), align: 'center' },
+  { prop: 'maskLogin', label: t('newLoop.item11'), align: 'center' },
+  { prop: 'pl', label: t('TradingCenter.item3'), align: 'center', sortable: true },
+  { prop: 'volume', label: t('TradingCenter.item5'), align: 'center', sortable: true },
+  { prop: 'follows', label: t('TradingCenter.item9'), align: 'center', sortable: true },
+  { prop: 'groupType', label: t('Label.AccountType'), slot: 'groupType', align: 'center' },
+  { prop: 'plRate', label: t('TradingCenter.item4'), align: 'center', sortable: true },
+  { prop: 'winRate', label: t('TradingCenter.item6'), align: 'center', sortable: true },
+  { prop: 'maxDdRate', label: t('TradingCenter.item7'), align: 'center', sortable: true },
+  { prop: 'activity', label: t('TradingCenter.item8'), slot: 'activity', align: 'center', sortable: true },
+  { prop: 'view', label: t('Documentary.tradingCenter.item23'), slot: 'view', align: 'center', width: 80 },
+  { prop: 'recommendReason', label: t('Documentary.tradingCenter.item142'), align: 'center', width: 100 },
+  { prop: 'subscribe', label: t('Documentary.tradingCenter.item24'), slot: 'subscribe', align: 'center', width: 100 },
+])
+const mobilePrimaryFields = computed(() => [
+  { prop: 'nickname', label: t('Documentary.tradingCenter.item1'), align: 'center' },
+  { prop: 'maskLogin', label: t('newLoop.item11'), align: 'center' },
+  { prop: 'groupType', label: t('Label.AccountType'), slot: 'groupType', align: 'center' },
+  {
+    prop: 'more',
+    type: 'more',
+    width: 20,
+    align: 'right',
+  },
+])
+
+const getAccountTypeText = (type: number) => {
+  const accountTypeMap: Record<number, string> = {
+    1: 'AccountType.ClassicAccount',
+    2: 'AccountType.SeniorAccount',
+    3: 'AccountType.AgencyAccount',
+    5: 'AccountType.SpeedAccount',
+    6: 'AccountType.SpeedAccount',
+    7: 'AccountType.StandardAccount',
+    8: 'AccountType.CentAccount',
   }
-
-  const handleSortChange = ({ prop, order }: any) => {
-    const propToColumn: Record<string, number> = {
-      'plRate': 1, 'pl': 2, 'volume': 3, 'winRate': 4, 'maxDdRate': 5, 'activity': 6, 'follows': 7,
-    }
-    sortState.value.orderColumn = propToColumn[prop] || 1
-    sortState.value.orderType = order === 'desc' ? 2 : 1
-    nextTick(() => {
-      tableRef.value?.refreshTable()
-    })
+  return type && accountTypeMap[type] ? t(accountTypeMap[type]) : '--'
+}
+
+const getActivityText = (activity: number) => {
+  if (!activity) return '--'
+  switch (activity) {
+    case 1:
+      return t('activeState.item1')
+    case 2:
+      return t('activeState.item2')
+    case 3:
+      return t('activeState.item3')
+    default:
+      return activity
   }
+}
 
-  const currentColumns = computed(() => [
-    { prop: 'recommend', label: '', slot: 'recommend', align: 'center', width: 60 },
-    { prop: 'nickname', label: t('Documentary.tradingCenter.item1'), align: 'center' },
-    { prop: 'maskLogin', label: t('newLoop.item11'), align: 'center' },
-    { prop: 'pl', label: t('TradingCenter.item3'), align: 'center', sortable: true },
-    { prop: 'volume', label: t('TradingCenter.item5'), align: 'center', sortable: true },
-    { prop: 'follows', label: t('TradingCenter.item9'), align: 'center', sortable: true },
-    { prop: 'groupType', label: t('Label.AccountType'), slot: 'groupType', align: 'center' },
-    { prop: 'plRate', label: t('TradingCenter.item4'), align: 'center', sortable: true },
-    { prop: 'winRate', label: t('TradingCenter.item6'), align: 'center', sortable: true },
-    { prop: 'maxDdRate', label: t('TradingCenter.item7'), align: 'center', sortable: true },
-    { prop: 'activity', label: t('TradingCenter.item8'), slot: 'activity', align: 'center', sortable: true },
-    { prop: 'view', label: t('Documentary.tradingCenter.item23'), slot: 'view', align: 'center', width: 80 },
-    { prop: 'recommendReason', label: t('Documentary.tradingCenter.item142'), align: 'center', width: 100 },
-    { prop: 'subscribe', label: t('Documentary.tradingCenter.item24'), slot: 'subscribe', align: 'center', width: 100 },
-  ])
-  const mobilePrimaryFields = computed(() => [
-    { prop: 'nickname', label: t('Documentary.tradingCenter.item1'), align: 'center' },
-    { prop: 'maskLogin', label: t('newLoop.item11'), align: 'center' },
-    { prop: 'groupType', label: t('Label.AccountType'), slot: 'groupType', align: 'center' },
-    {
-      prop: 'more',
-      type: 'more',
-      width: 20,
-      align: 'right',
-    },
-  ])
-
-  const getAccountTypeText = (type: number) => {
-    const accountTypeMap: Record<number, string> = {
-      1: 'AccountType.ClassicAccount',
-      2: 'AccountType.SeniorAccount',
-      3: 'AccountType.AgencyAccount',
-      5: 'AccountType.SpeedAccount',
-      6: 'AccountType.SpeedAccount',
-      7: 'AccountType.StandardAccount',
-      8: 'AccountType.CentAccount',
+const toView = (row: any) => {
+  uni.navigateTo({
+    url: `/pages/follow/trading-center-single?dealLogin=${row.dealLogin}&id=${row.id}&login=${row.login}`,
+  })
+}
+
+// --- Follow Subscription ---
+const dialogFllow = ref(false)
+const dialogFllowData1 = ref<any>({})
+const dialogFllowLoginData = ref<any[]>([])
+const dialogFllowData = ref({
+  followLogin: '',
+  protect: 0,
+  protectType: 1,
+  protectAmount: '',
+  protectRatio: '',
+  followType: 1,
+  volume: '',
+  ratio: '',
+  leverage: '',
+  agree: false,
+})
+
+const formRef = ref<any>(null)
+
+const rules = {
+  protectAmount: { rules: [{ required: true, errorMessage: t('vaildate.input.empty') }] },
+  protectRatio: { rules: [{ required: true, errorMessage: t('vaildate.input.empty') }] },
+  volume: { rules: [{ required: true, errorMessage: t('vaildate.input.empty') }] },
+  ratio: { rules: [{ required: true, errorMessage: t('vaildate.input.empty') }] },
+  followLogin: { rules: [{ required: true, errorMessage: t('vaildate.select.empty') }] },
+  followType: { rules: [{ required: true, errorMessage: t('vaildate.select.empty') }] },
+  agree: { rules: [{ required: true, errorMessage: t('vaildate.agree.empty') }] },
+}
+
+const followLoginOptions = computed(() => {
+  return dialogFllowLoginData.value.map(item => ({
+    value: item.login,
+    text: `${item.login} - ${getAccountTypeText(item.loginType)} - ${t('Custom.Deposit.AvailableBalance')}: $${item.balance || 0}`,
+  }))
+})
+
+const toSubscribe = async (row: any) => {
+  uni.showLoading({ title: t('State.InTheProcessing') })
+  try {
+    let res = await documentaryApi.followDealSubscribeInfo({ dealId: row.dealId })
+    if (res.code === 200) {
+      dialogFllowData1.value = row
+      dialogFllowData.value.protect = 0
+      dialogFllowLoginData.value = res.data || []
+      dialogFllow.value = true
+    } else {
+      uni.showToast({ title: res.msg, icon: 'none' })
     }
-    return type && accountTypeMap[type] ? t(accountTypeMap[type]) : '--'
+  } finally {
+    uni.hideLoading()
   }
+}
 
-  const getActivityText = (activity: number) => {
-    if (!activity) return '--'
-    switch (activity) {
-      case 1:
-        return t('activeState.item1')
-      case 2:
-        return t('activeState.item2')
-      case 3:
-        return t('activeState.item3')
-      default:
-        return activity
-    }
+const selectLogin = (val: string) => {
+  const target = dialogFllowLoginData.value.find(item => item.login === val)
+  if (target) {
+    dialogFllowData.value.leverage = `1:${target.leverage}`
   }
-
-  const toView = (row: any) => {
-    uni.navigateTo({
-      url: `/pages/follow/trading-center-single?dealLogin=${row.dealLogin}&id=${row.id}&login=${row.login}`,
-    })
+}
+
+const openAgreement = () => {
+  const lang = locale.value
+  const url = ['cn', 'zhHant'].includes(lang) ? 'pdf/CopyTradeUserAgreementcn.pdf' : 'pdf/CopyTradeUserAgreement.pdf'
+  // Use plus.runtime.openURL or window.open depending on platform
+  // #ifdef H5
+  window.open(url, '_blank')
+  // #endif
+  // #ifndef H5
+  uni.showToast({ title: 'Not supported on this platform', icon: 'none' })
+  // #endif
+}
+
+let submitting = false
+const applyFllow = async () => {
+  if (submitting) return
+  if (!dialogFllowData.value.agree) {
+    uni.showToast({ title: t('vaildate.agree.empty'), icon: 'none' })
+    return
   }
 
-  // --- Follow Subscription ---
-  const dialogFllow = ref(false)
-  const dialogFllowData1 = ref<any>({})
-  const dialogFllowLoginData = ref<any[]>([])
-  const dialogFllowData = ref({
-    followLogin: '',
-    protect: 0,
-    protectType: 1,
-    protectAmount: '',
-    protectRatio: '',
-    followType: 1,
-    volume: '',
-    ratio: '',
-    leverage: '',
-    agree: false,
-  })
-
-  const formRef = ref<any>(null)
-
-  const rules = {
-    protectAmount: { rules: [{ required: true, errorMessage: t('vaildate.input.empty') }] },
-    protectRatio: { rules: [{ required: true, errorMessage: t('vaildate.input.empty') }] },
-    volume: { rules: [{ required: true, errorMessage: t('vaildate.input.empty') }] },
-    ratio: { rules: [{ required: true, errorMessage: t('vaildate.input.empty') }] },
-    followLogin: { rules: [{ required: true, errorMessage: t('vaildate.select.empty') }] },
-    followType: { rules: [{ required: true, errorMessage: t('vaildate.select.empty') }] },
-    agree: { rules: [{ required: true, errorMessage: t('vaildate.agree.empty') }] },
+  try {
+    await formRef.value?.validate()
+  } catch (e) {
+    return
   }
 
-  const followLoginOptions = computed(() => {
-    return dialogFllowLoginData.value.map(item => ({
-      value: item.login,
-      text: `${item.login} - ${getAccountTypeText(item.loginType)} - ${t('Custom.Deposit.AvailableBalance')}: $${item.balance || 0}`,
-    }))
-  })
-
-  const toSubscribe = async (row: any) => {
-    uni.showLoading({ title: t('State.InTheProcessing') })
-    try {
-      let res = await documentaryApi.followDealSubscribeInfo({ dealId: row.dealId })
-      if (res.code === 200) {
-        dialogFllowData1.value = row
-        dialogFllowData.value.protect = 0
-        dialogFllowLoginData.value = res.data || []
-        dialogFllow.value = true
-      } else {
-        uni.showToast({ title: res.msg, icon: 'none' })
-      }
-    } finally {
-      uni.hideLoading()
+  submitting = true
+  uni.showLoading({ title: t('State.InTheProcessing') })
+
+  try {
+    const payload = {
+      dealId: dialogFllowData1.value.id,
+      followLogin: dialogFllowData.value.followLogin,
+      protect: dialogFllowData.value.protect,
+      protectType: dialogFllowData.value.protect ? dialogFllowData.value.protectType : null,
+      protectAmount: dialogFllowData.value.protect ? dialogFllowData.value.protectAmount : null,
+      protectRatio: dialogFllowData.value.protect ? dialogFllowData.value.protectRatio : null,
+      followType: dialogFllowData.value.followType,
+      volume: dialogFllowData.value.followType == 1 ? Number(dialogFllowData.value.volume) * 100 : null,
+      ratio: dialogFllowData.value.followType == 2 ? dialogFllowData.value.ratio : null,
     }
-  }
 
-  const selectLogin = (val: string) => {
-    const target = dialogFllowLoginData.value.find(item => item.login === val)
-    if (target) {
-      dialogFllowData.value.leverage = `1:${target.leverage}`
+    let res = await documentaryApi.followDealSubscriSubscribe(payload)
+    if (res.code === 200) {
+      uni.showToast({ title: t('Msg.Success'), icon: 'success' })
+      applyFllowCancel()
+    } else {
+      const msg = res.msg == 'EMPTY_POSITION_BEFORE_SUBSCRIBE' ? t('Documentary.tradingCenter.item134') : res.msg
+      uni.showToast({ title: msg, icon: 'none' })
     }
+  } finally {
+    submitting = false
+    uni.hideLoading()
   }
+}
 
-  const openAgreement = () => {
-    const lang = locale.value
-    const url = ['cn', 'zhHant'].includes(lang) ? 'pdf/CopyTradeUserAgreementcn.pdf' : 'pdf/CopyTradeUserAgreement.pdf'
-    // Use plus.runtime.openURL or window.open depending on platform
-    // #ifdef H5
-    window.open(url, '_blank')
-    // #endif
-    // #ifndef H5
-    uni.showToast({ title: 'Not supported on this platform', icon: 'none' })
-    // #endif
+const applyFllowCancel = () => {
+  dialogFllow.value = false
+  dialogFllowData.value = {
+    followLogin: '', protect: 0, protectType: 1, protectAmount: '', protectRatio: '',
+    followType: 1, volume: '', ratio: '', leverage: '', agree: false,
   }
+}
 
-  let submitting = false
-  const applyFllow = async () => {
-    if (submitting) return
-    if (!dialogFllowData.value.agree) {
-      uni.showToast({ title: t('vaildate.agree.empty'), icon: 'none' })
-      return
-    }
+</script>
 
-    try {
-      await formRef.value?.validate()
-    } catch (e) {
-      return
-    }
+<style scoped lang="scss">
+@import "@/uni.scss";
+
+.time-header {
+  display: flex;
+  justify-content: flex-end;
+  font-size: 14px;
+  margin-bottom: 10px;
+  font-weight: 500;
+  color: var(--bs-heading-color);
+
+  .time-value {
+    margin-left: 6px;
+    color: var(--bs-heading-color);
+  }
+}
 
-    submitting = true
-    uni.showLoading({ title: t('State.InTheProcessing') })
-
-    try {
-      const payload = {
-        dealId: dialogFllowData1.value.id,
-        followLogin: dialogFllowData.value.followLogin,
-        protect: dialogFllowData.value.protect,
-        protectType: dialogFllowData.value.protect ? dialogFllowData.value.protectType : null,
-        protectAmount: dialogFllowData.value.protect ? dialogFllowData.value.protectAmount : null,
-        protectRatio: dialogFllowData.value.protect ? dialogFllowData.value.protectRatio : null,
-        followType: dialogFllowData.value.followType,
-        volume: dialogFllowData.value.followType == 1 ? Number(dialogFllowData.value.volume) * 100 : null,
-        ratio: dialogFllowData.value.followType == 2 ? dialogFllowData.value.ratio : null,
-      }
+.recommend-tag {
+  font-size: 12px;
+  color: #fff;
+  padding: 2px 6px;
+  border-radius: 4px;
+  display: inline-block;
 
-      let res = await documentaryApi.followDealSubscriSubscribe(payload)
-      if (res.code === 200) {
-        uni.showToast({ title: t('Msg.Success'), icon: 'success' })
-        applyFllowCancel()
-      } else {
-        const msg = res.msg == 'EMPTY_POSITION_BEFORE_SUBSCRIBE' ? t('Documentary.tradingCenter.item134') : res.msg
-        uni.showToast({ title: msg , icon: 'none' })
-      }
-    } finally {
-      submitting = false
-      uni.hideLoading()
-    }
+  &.top {
+    background-color: #eb3f57;
   }
 
-  const applyFllowCancel = () => {
-    dialogFllow.value = false
-    dialogFllowData.value = {
-      followLogin: '', protect: 0, protectType: 1, protectAmount: '', protectRatio: '',
-      followType: 1, volume: '', ratio: '', leverage: '', agree: false,
-    }
+  &.green {
+    background-color: #89be30;
   }
-
-</script>
-
-<style scoped lang="scss">
-  @import "@/uni.scss";
-
-  .time-header {
+}
+
+.action-icon {
+  display: inline-flex;
+  cursor: pointer;
+}
+
+.btn-primary {
+  background-color: #4497ff;
+  color: white;
+  padding: 0 px2rpx(12);
+  border: none;
+  font-size: px2rpx(12);
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  gap: px2rpx(4);
+  height: 28px;
+  line-height: 28px;
+  border-radius: 4px;
+}
+
+.dia-content {
+  padding: 10px;
+
+  .fllow-title {
     display: flex;
-    justify-content: flex-end;
-    font-size: 14px;
+    justify-content: space-between;
+    align-items: center;
+    border-bottom: 1px solid #eee;
+    padding-bottom: 10px;
     margin-bottom: 10px;
-    font-weight: 500;
-    color: #333;
-
-    .time-value {
-      margin-left: 6px;
-      color: #666;
-    }
-  }
-
-  .recommend-tag {
-    font-size: 12px;
-    color: #fff;
-    padding: 2px 6px;
-    border-radius: 4px;
-    display: inline-block;
 
-    &.top {
-      background-color: #eb3f57;
+    .title {
+      font-weight: bold;
+      color: var(--bs-heading-color);
+      padding-left: 8px;
+      border-left: 4px solid #eb3f57;
+      font-size: 16px;
     }
 
-    &.green {
-      background-color: #89be30;
+    .time {
+      font-size: 12px;
+      color: #888;
     }
   }
 
-  .action-icon {
-    display: inline-flex;
-    cursor: pointer;
-  }
+  .section-title {
+    margin-top: 20px;
 
-  .btn-primary {
-    background-color: #4497ff;
-    color: white;
-    padding: 0 px2rpx(12);
-    border: none;
-    font-size: px2rpx(12);
-    display: inline-flex;
-    align-items: center;
-    justify-content: center;
-    gap: px2rpx(4);
-    height: 28px;
-    line-height: 28px;
-    border-radius: 4px;
+    .title {
+      border-left-color: #4497ff;
+    }
   }
 
-  .dia-content {
-    padding: 10px;
+  .fllow-info-grid {
+    display: grid;
+    grid-template-columns: 1fr 1fr;
+    gap: 10px 20px;
 
-    .fllow-title {
+    .fllow-content {
       display: flex;
       justify-content: space-between;
-      align-items: center;
-      border-bottom: 1px solid #eee;
-      padding-bottom: 10px;
-      margin-bottom: 10px;
-
-      .title {
-        font-weight: bold;
-        color: #333;
-        padding-left: 8px;
-        border-left: 4px solid #eb3f57;
-        font-size: 16px;
-      }
-
-      .time {
-        font-size: 12px;
-        color: #888;
-      }
-    }
-
-    .section-title {
-      margin-top: 20px;
-
-      .title {
-        border-left-color: #4497ff;
-      }
-    }
+      font-size: 14px;
+      border-bottom: 1px dashed #eee;
+      padding-bottom: 4px;
 
-    .fllow-info-grid {
-      display: grid;
-      grid-template-columns: 1fr 1fr;
-      gap: 10px 20px;
-
-      .fllow-content {
-        display: flex;
-        justify-content: space-between;
-        font-size: 14px;
-        border-bottom: 1px dashed #eee;
-        padding-bottom: 4px;
-
-        .tit {
-          color: #666;
-        }
-
-        .con {
-          font-weight: 500;
-          color: #333;
-        }
+      .tit {
+        color: var(--bs-heading-color);
       }
-    }
-
-    .form-grid {
-      display: grid;
-      grid-template-columns: 1fr 1fr;
-      gap: 10px 20px;
-      margin-top: 10px;
-    }
-
-    .terms-desc {
-      font-size: 12px;
-      color: #888;
-      margin: 10px 0;
-    }
 
-    .agree-label {
-      display: flex;
-      align-items: center;
-      font-size: 14px;
-      color: #333;
-
-      .link {
-        color: #4497ff;
-        cursor: pointer;
+      .con {
+        font-weight: 500;
+        color: var(--bs-heading-color);
       }
     }
   }
 
-  .cancel-btn, .confirm-btn {
-    flex: 1;
-    margin: 0 10px;
-    border-radius: 4px;
+  .form-grid {
+    display: grid;
+    grid-template-columns: 1fr 1fr;
+    gap: 10px 20px;
+    margin-top: 10px;
   }
 
-  .cancel-btn {
-    background-color: #f5f5f5;
-    color: #333;
+  .terms-desc {
+    font-size: 12px;
+    color: #888;
+    margin: 10px 0;
   }
 
-  .confirm-btn {
-    background-color: #4497ff;
-    color: #fff;
+  .agree-label {
+    display: flex;
+    align-items: center;
+    font-size: 14px;
+    color: var(--bs-heading-color);
+
+    .link {
+      color: #4497ff;
+      cursor: pointer;
+    }
   }
+}
+
+.cancel-btn,
+.confirm-btn {
+  flex: 1;
+  margin: 0 10px;
+  border-radius: 4px;
+}
+
+.cancel-btn {
+  background-color: #f5f5f5;
+  color: var(--bs-heading-color);
+}
+
+.confirm-btn {
+  background-color: #4497ff;
+  color: #fff;
+}
 </style>

+ 2 - 1
pages/follow/trading-management.vue

@@ -1301,7 +1301,7 @@ onMounted(() => {
 
         .title {
             font-weight: bold;
-            color: #333;
+            color: var(--bs-heading-color);
             padding-left: 8px;
             border-left: 4px solid #eb3f57;
             font-size: 16px;
@@ -1416,6 +1416,7 @@ onMounted(() => {
         grid-template-columns: 1fr 1fr;
         gap: px2rpx(20);
         margin-top: px2rpx(16);
+
         @media screen and (max-width: 768px) {
             grid-template-columns: 1fr;
         }

+ 230 - 241
pages/ib/agentList.vue

@@ -5,41 +5,29 @@
     <view class="account-content">
       <view class="search-content">
         <view class="search-bar">
-          <cwg-complex-search :fields="filterFields" v-model="searchParams" @search="handleSearch" @reset="handleReset" />
+          <cwg-complex-search :fields="filterFields" v-model="searchParams" @search="handleSearch"
+            @reset="handleReset" />
         </view>
       </view>
-      <cwg-tabel
-        class="table-container"
-        ref="tableRef"
-        :columns="columns"
-        :mobilePrimaryFields="mobilePrimaryFields"
-        :queryParams="search"
-        :api="listApi"
-        :show-operation="true"
-        :showPagination="true"
-      >
+      <cwg-tabel class="table-container" ref="tableRef" :columns="columns" :mobilePrimaryFields="mobilePrimaryFields"
+        :queryParams="search" :api="listApi" :show-operation="true" :showPagination="true">
       </cwg-tabel>
     </view>
 
     <!-- 专属手续费分配/展示设置确认弹窗 -->
-    <cwg-popup
-      :visible="dialogInfoTradingAddTc"
-      :title="t('Ib.Custom.Btn')"
-      :cancelText="t('Btn.Cancel')"
-      :confirmText="t('Btn.Confirm')"
-      @close="dialogInfoTradingAddCanle"
-      @confirm="dialogInfoTradingAddOpen"
-    >
+    <cwg-popup :visible="dialogInfoTradingAddTc" :title="t('Ib.Custom.Btn')" :cancelText="t('Btn.Cancel')"
+      :confirmText="t('Btn.Confirm')" @close="dialogInfoTradingAddCanle" @confirm="dialogInfoTradingAddOpen">
       <view class="dia-content custom-dialog-content">
         <view class="desc-text">
           <view class="desc-p">{{ t('news_add_field1.CustomerManagement.item1') }}</view>
           <view class="desc-p">{{ t('news_add_field1.CustomerManagement.item2') }}</view>
         </view>
-        
+
         <view class="agree-box">
           <checkbox-group @change="onAgreeChange">
             <label class="agree-label">
-              <checkbox :value="1" :checked="dialogInfoTradingAddTcAgree" color="#2b5aed" style="transform:scale(0.8)" />
+              <checkbox :value="1" :checked="dialogInfoTradingAddTcAgree" color="#2b5aed"
+                style="transform:scale(0.8)" />
               <view class="agree-des">
                 <text>{{ t('news_add_field1.CustomerManagement.item3') }}</text>
               </view>
@@ -53,254 +41,255 @@
 </template>
 
 <script setup lang="ts">
-  // 信号源管理
-  import { ref, reactive, computed, onMounted, onUnmounted,nextTick } from 'vue'
-  import { onLoad } from '@dcloudio/uni-app'
-  import { useI18n } from 'vue-i18n' // uni-app 中已集成,但需配置
-  import Config from '@/config/index'
-  import { lang } from '@/composables/config'
-  import { ibApi } from '@/service/ib'
-  import { useFilters } from '@/composables/useFilters'
+// 信号源管理
+import { ref, reactive, computed, onMounted, onUnmounted, nextTick } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { useI18n } from 'vue-i18n' // uni-app 中已集成,但需配置
+import Config from '@/config/index'
+import { lang } from '@/composables/config'
+import { ibApi } from '@/service/ib'
+import { useFilters } from '@/composables/useFilters'
 
-  const { numberFormat, numberDecimal } = useFilters()
+const { numberFormat, numberDecimal } = useFilters()
 
-  const searchParams = ref({})
-  const search = ref({
-    name:''
-  })
+const searchParams = ref({})
+const search = ref({
+  name: ''
+})
 
-  const filterFields = computed(() => [
-    { key: 'name', type: 'input', label: t('Ib.Custom.NameLabel'), placeholder: t('Ib.Custom.NameLabel'), defaultValue: '' },
-  ])
-  const tableRef = ref<any>(null)
+const filterFields = computed(() => [
+  { key: 'name', type: 'input', label: t('Ib.Custom.NameLabel'), placeholder: t('Ib.Custom.NameLabel'), defaultValue: '' },
+])
+const tableRef = ref<any>(null)
 
-  const handleSearch = (params: any) => {
-    search.value = { ...params }
-    nextTick(() => {
-      tableRef.value?.refreshTable?.()
-    })
-  }
+const handleSearch = (params: any) => {
+  search.value = { ...params }
+  nextTick(() => {
+    tableRef.value?.refreshTable?.()
+  })
+}
 
-  const handleReset = (params: any) => {
-    search.value = {
-      ...params,
-    }
-    nextTick(() => {
-      tableRef.value?.refreshTable?.()
-    })
+const handleReset = (params: any) => {
+  search.value = {
+    ...params,
   }
+  nextTick(() => {
+    tableRef.value?.refreshTable?.()
+  })
+}
 
-  const formInfo = ref({})
-  const dialogInfoTradingAddTc = ref(false)
-  const dialogInfoTradingAddTcAgree = ref(false)
-  const dialogInfoTradingAdd = ref(false)
-  const { t, locale } = useI18n()
-  // 表格列配置
-  const columns = ref([
-    {
-      prop: 'dealCId',
-      label: t('Label.CidAccount'),
-      align: 'center',
+const formInfo = ref({})
+const dialogInfoTradingAddTc = ref(false)
+const dialogInfoTradingAddTcAgree = ref(false)
+const dialogInfoTradingAdd = ref(false)
+const { t, locale } = useI18n()
+// 表格列配置
+const columns = ref([
+  {
+    prop: 'dealCId',
+    label: t('Label.CidAccount'),
+    align: 'center',
+  },
+  {
+    prop: 'pIbNo',
+    label: t('Label.AgentNumber'),
+    align: 'center',
+  },
+  {
+    prop: 'nickname',
+    label: t('Documentary.console.item20'),
+    align: 'center',
+  },
+  {
+    prop: 'dealLogin',
+    label: t('Documentary.tradingCenter.item18'),
+    align: 'center',
+  },
+  {
+    prop: 'dealPlatform',
+    label: t('Label.Platform'),
+    align: 'center',
+  },
+  {
+    prop: 'dealLeverage',
+    label: t('Label.Leverage'),
+    align: 'center',
+  },
+  {
+    prop: 'dealLoginType',
+    type: 'tag',
+    label: t('Label.AccountType'),
+    align: 'center',
+    tagMap: {
+      1: t('AccountType.ClassicAccount'),
+      2: t('AccountType.SeniorAccount'),
+      5: t('AccountType.SpeedAccount'),
+      6: t('AccountType.SpeedAccount'),
+      7: t('AccountType.StandardAccount'),
+      8: t('AccountType.CentAccount'),
     },
-    {
-      prop: 'pIbNo',
-      label: t('Label.AgentNumber'),
-      align: 'center',
+  },
+  {
+    prop: 'distributionType',
+    label: t('Documentary.AgentBackground.item11'),
+    align: 'center',
+    formatter: ({ row }) => row.distributionType === 1 ? t('Documentary.TundManagement.item59') : '--',
+  },
+  {
+    prop: 'distributionRatio',
+    label: t('Documentary.Report.item5'),
+    align: 'center',
+  },
+  {
+    prop: 'settlementCycle',
+    label: t('Documentary.AgentBackground.item13'),
+    align: 'center',
+  },
+  {
+    prop: 'approveTime',
+    label: t('Label.ApplyTime'),
+    align: 'center',
+  },
+  {
+    prop: 'permissionDisplay',
+    type: 'tag',
+    label: t('Documentary.AgentBackground.item14'),
+    align: 'center',
+    tagMap: {
+      1: t('Documentary.AgentBackground.item16'),
+      2: t('Documentary.AgentBackground.item15'),
     },
-    {
-      prop: 'nickname',
-      label: t('Documentary.console.item20'),
-      align: 'center',
-    },
-    {
-      prop: 'dealLogin',
-      label: t('Documentary.tradingCenter.item18'),
-      align: 'center',
-    },
-    {
-      prop: 'dealPlatform',
-      label: t('Label.Platform'),
-      align: 'center',
-    },
-    {
-      prop: 'dealLeverage',
-      label: t('Label.Leverage'),
-      align: 'center',
-    },
-    {
-      prop: 'dealLoginType',
-      type: 'tag',
-      label: t('Label.AccountType'),
-      align: 'center',
-      tagMap: {
-        1: t('AccountType.ClassicAccount'),
-        2: t('AccountType.SeniorAccount'),
-        5: t('AccountType.SpeedAccount'),
-        6: t('AccountType.SpeedAccount'),
-        7: t('AccountType.StandardAccount'),
-        8: t('AccountType.CentAccount'),
+  },
+  {
+    prop: 'action',
+    label: t('Label.Action'),
+    type: 'action',
+    align: 'center',
+    menuList: [
+      {
+        label: t('Ib.Custom.Btn'),
+        type: 'DisplaySettings',
+        btnClick: (row) => handleMenuClick({ type: 'DisplaySettings', row }),
+        show: (row) => row.agentUpdatePurview == '1',
       },
-    },
-    {
-      prop: 'distributionType',
-      label: t('Documentary.AgentBackground.item11'),
-      align: 'center',
-      formatter: ({ row }) => row.distributionType === 1 ? t('Documentary.TundManagement.item59') : '--',
-    },
-    {
-      prop: 'distributionRatio',
-      label: t('Documentary.Report.item5'),
-      align: 'center',
-    },
-    {
-      prop: 'settlementCycle',
-      label: t('Documentary.AgentBackground.item13'),
-      align: 'center',
-    },
-    {
-      prop: 'approveTime',
-      label: t('Label.ApplyTime'),
-      align: 'center',
-    },
-    {
-      prop: 'permissionDisplay',
-      type: 'tag',
-      label: t('Documentary.AgentBackground.item14'),
-      align: 'center',
-      tagMap: {
-        1: t('Documentary.AgentBackground.item16'),
-        2: t('Documentary.AgentBackground.item15'),
-      },
-    },
-    {
-      prop: 'action',
-      label: t('Label.Action'),
-      type: 'action',
-      align: 'center',
-      menuList: [
-        {
-          label: t('Ib.Custom.Btn'),
-          type: 'DisplaySettings',
-          btnClick: (row) => handleMenuClick({ type: 'DisplaySettings', row }),
-          show: (row) => row.agentUpdatePurview == '1',
-        },
-      ]
-    },
-  ])
+    ]
+  },
+])
 
-  const mobilePrimaryFields = ref([
-    {
-      prop: 'cId',
-      label: t('Label.CidAccount'),
-      align: 'center',
-    },
-    {
-      prop: 'ibNo',
-      label: t('Label.IbAccount'),
-      align: 'center',
-    },
-    {
-      prop: 'name',
-      label: t('Ib.Custom.NameLabel'),
-      align: 'center',
-    },
-    {
-      prop: 'more',
-      type: 'more',
-      width: 20,
-      align: 'right',
-    },
-  ])
+const mobilePrimaryFields = ref([
+  {
+    prop: 'cId',
+    label: t('Label.CidAccount'),
+    align: 'center',
+  },
+  {
+    prop: 'ibNo',
+    label: t('Label.IbAccount'),
+    align: 'center',
+  },
+  {
+    prop: 'name',
+    label: t('Ib.Custom.NameLabel'),
+    align: 'center',
+  },
+  {
+    prop: 'more',
+    type: 'more',
+    width: 20,
+    align: 'right',
+  },
+])
 
 
-  const listApi = ref(ibApi.followDealAgentSearchList)
-  const handleDateChange = (val) => {
-    search.value.startDate = val[0]
-    search.value.endDate = val[1]
-  }
+const listApi = ref(ibApi.followDealAgentSearchList)
+const handleDateChange = (val) => {
+  search.value.startDate = val[0]
+  search.value.endDate = val[1]
+}
 
-  const handleMenuClick = (item) => {
-    if (item.type == 'DisplaySettings') {
-      const { dealLogin, id,permissionDisplay,pIbNo,agentDistributionRatio} = item.row
-      formInfo.value = {
-        dealLogin, id,permissionDisplay,
-        ibNo: pIbNo,
-        agentDistributionRatio: agentDistributionRatio== null? '': agentDistributionRatio.toString()
-      }
-      dialogInfoTradingAddTcAgree.value = false
-      dialogInfoTradingAddTc.value = true
+const handleMenuClick = (item) => {
+  if (item.type == 'DisplaySettings') {
+    const { dealLogin, id, permissionDisplay, pIbNo, agentDistributionRatio } = item.row
+    formInfo.value = {
+      dealLogin, id, permissionDisplay,
+      ibNo: pIbNo,
+      agentDistributionRatio: agentDistributionRatio == null ? '' : agentDistributionRatio.toString()
     }
+    dialogInfoTradingAddTcAgree.value = false
+    dialogInfoTradingAddTc.value = true
   }
+}
 
-  const onAgreeChange = (e: any) => {
-    dialogInfoTradingAddTcAgree.value = e.detail.value.length > 0
-  }
+const onAgreeChange = (e: any) => {
+  dialogInfoTradingAddTcAgree.value = e.detail.value.length > 0
+}
 
-  const dialogInfoTradingAddCanle = () => {
-    dialogInfoTradingAddTc.value = false
-    dialogInfoTradingAddTcAgree.value = false
-  }
+const dialogInfoTradingAddCanle = () => {
+  dialogInfoTradingAddTc.value = false
+  dialogInfoTradingAddTcAgree.value = false
+}
 
-  const dialogInfoTradingAddOpen = () => {
-    if (!dialogInfoTradingAddTcAgree.value) {
-      uni.showToast({ title: t('Msg.Read'), icon: 'none' })
-      return
-    }
-    dialogInfoTradingAddTc.value = false
-    dialogInfoTradingAdd.value = true
-    dialogInfoTradingAddTcAgree.value = false
+const dialogInfoTradingAddOpen = () => {
+  if (!dialogInfoTradingAddTcAgree.value) {
+    uni.showToast({ title: t('Msg.Read'), icon: 'none' })
+    return
   }
+  dialogInfoTradingAddTc.value = false
+  dialogInfoTradingAdd.value = true
+  dialogInfoTradingAddTcAgree.value = false
+}
 
-  onMounted(()=>{
-    // dialogInfoTradingAddTc.value = true
-  })
+onMounted(() => {
+  // dialogInfoTradingAddTc.value = true
+})
 </script>
 <style lang="scss" scoped>
-  @import "@/uni.scss";
+@import "@/uni.scss";
 
-  .search-content {
-    display: flex;
-    justify-content: space-between;
-  }
-  .search-button{
-    display: flex;
-    align-items: center;
-    height: px2rpx(36);
-    line-height: px2rpx(36);
-  }
+.search-content {
+  display: flex;
+  justify-content: space-between;
+}
+
+.search-button {
+  display: flex;
+  align-items: center;
+  height: px2rpx(36);
+  line-height: px2rpx(36);
+}
 
-  .custom-dialog-content {
-    padding: px2rpx(20);
+.custom-dialog-content {
+  padding: px2rpx(20);
+}
+
+.desc-text {
+  text-align: initial;
+  line-height: 1.5;
+  margin-bottom: px2rpx(20);
+  color: var(--bs-heading-color);
+  font-size: px2rpx(14);
+
+  .desc-p {
+    margin-bottom: px2rpx(10);
   }
+}
 
-  .desc-text {
-    text-align: initial;
-    line-height: 1.5;
-    margin-bottom: px2rpx(20);
-    color: #333;
-    font-size: px2rpx(14);
-    
-    .desc-p {
-      margin-bottom: px2rpx(10);
-    }
+.agree-box {
+  margin-top: px2rpx(15);
+
+  .agree-label {
+    display: flex;
+    align-items: flex-start;
+    cursor: pointer;
   }
 
-  .agree-box {
-    margin-top: px2rpx(15);
-    
-    .agree-label {
-      display: flex;
-      align-items: flex-start;
-      cursor: pointer;
-    }
-    
-    .agree-des {
-      flex: 1;
-      font-size: px2rpx(14);
-      color: #606266;
-      line-height: 1.5;
-      margin-left: px2rpx(5);
-      margin-top: px2rpx(3);
-    }
+  .agree-des {
+    flex: 1;
+    font-size: px2rpx(14);
+    color: #606266;
+    line-height: 1.5;
+    margin-left: px2rpx(5);
+    margin-top: px2rpx(3);
   }
+}
 </style>

+ 832 - 919
pages/ib/index.vue

@@ -93,14 +93,14 @@
                                 {{ t('Tips.tips') }}
                               </view>
                             </template>
-                          </uni-tooltip>
-                        </view>
-                      </view>
-                      <view class="code-content">
-                        <uni-easyinput class="code-input" :disabled="true" v-model="getInfoId" :clearable="false"></uni-easyinput>
-                        <button class="link-btn">{{ t('Ib.Index.Copy') }}</button>
-                      </view>
-                    </view>-->
+</uni-tooltip>
+</view>
+</view>
+<view class="code-content">
+  <uni-easyinput class="code-input" :disabled="true" v-model="getInfoId" :clearable="false"></uni-easyinput>
+  <button class="link-btn">{{ t('Ib.Index.Copy') }}</button>
+</view>
+</view>-->
         </view>
       </uni-col>
       <uni-col :xs="24" :sm="24" :md="16" :lg="16" :xl="16" class="uni-col-right">
@@ -120,15 +120,8 @@
               </view>
             </view>
 
-            <cwg-tabel
-              ref="mamTableRef"
-              :columns="mamColumns"
-              :mobilePrimaryFields="mamMobilePrimaryFields"
-              :queryParams="mamSearch"
-              :api="mamListApi"
-              :show-operation="false"
-              :showPagination="true"
-            >
+            <cwg-tabel ref="mamTableRef" :columns="mamColumns" :mobilePrimaryFields="mamMobilePrimaryFields"
+              :queryParams="mamSearch" :api="mamListApi" :show-operation="false" :showPagination="true">
               <template #mamAccount="{ row }">
                 <view v-if="row.type == 1 || row.type == 2">
                   <text>{{ row.login || '-' }}</text>
@@ -196,35 +189,22 @@
       <view class="dia-content">
         <view class="content" style="font-size: 14px; text-align: left">
           <view class="label">{{ t('Ib.Index.Spread5') }} :</view>
-          <cwg-combox
-            v-model="excludeShowLoginTypes"
-            :multiple="true"
-            :options="excludeList"
-            :placeholder="t('placeholder.choose')"
-            @change="handleChange"
-          />
+          <cwg-combox v-model="excludeShowLoginTypes" :multiple="true" :options="excludeList"
+            :placeholder="t('placeholder.choose')" @change="handleChange" />
 
           <view class="label">{{ t('Ib.Index.Spread4') }} :</view>
-          <cwg-combox
-            v-model:value="selectedSpreadId"
-            :options="spreadList.map(item => ({
-          value: item.id,
-          text: t('Ib.Index.Commission') + ':' + item.comPoint +
-            (levelNum === 1 ? '-' + t('Ib.Index.Hide') + ':' + item.hide :
-            (fixedHide === 1 ? '' : '-' + t('Ib.Index.Hide') + ':' + item.hide))
-        }))"
-            :placeholder="t('placeholder.choose')"
-          />
+          <cwg-combox v-model:value="selectedSpreadId" :options="spreadList.map(item => ({
+            value: item.id,
+            text: t('Ib.Index.Commission') + ':' + item.comPoint +
+              (levelNum === 1 ? '-' + t('Ib.Index.Hide') + ':' + item.hide :
+                (fixedHide === 1 ? '' : '-' + t('Ib.Index.Hide') + ':' + item.hide))
+          }))" :placeholder="t('placeholder.choose')" />
 
           <view class="label">{{ t('Ib.Index.IbInvalid') }}</view>
-          <cwg-combox
-            v-model:value="ibInvalid"
-            :options="[
-          { value: 'B0', text: t('Ib.Custom.Allow') },
-          { value: 'B1', text: t('Ib.Custom.NotAllow') }
-        ]"
-            :placeholder="t('placeholder.choose')"
-          />
+          <cwg-combox v-model:value="ibInvalid" :options="[
+            { value: 'B0', text: t('Ib.Custom.Allow') },
+            { value: 'B1', text: t('Ib.Custom.NotAllow') }
+          ]" :placeholder="t('placeholder.choose')" />
 
           <view>
             <text style="line-height: 1.5">{{ t('ApplicationDialog.item1') }}</text>
@@ -232,46 +212,28 @@
 
           <view>
             <text style="line-height: 1.5">{{ t('ApplicationDialog.item2') }}</text>
-            <a
-              :href="country == 'NG' || country == 'TH' || country == 'LA'
-            ? `pdf/pdf6/all/Account Type Allocation Table - ${lang}.pdf`
-            : `pdf/pdf6/no/Account Type Allocation Table-${lang}.pdf`"
-              target="_blank"
-            >
+            <a :href="country == 'NG' || country == 'TH' || country == 'LA'
+              ? `pdf/pdf6/all/Account Type Allocation Table - ${lang}.pdf`
+              : `pdf/pdf6/no/Account Type Allocation Table-${lang}.pdf`" target="_blank">
               {{ t('ApplicationDialog.item3') }}
             </a>
           </view>
 
           <view class="btn">
-            <button
-              class="crm-cursor"
-              @click="CreateLink"
-            >{{ t('Ib.Index.CreateLink') }}
+            <button class="crm-cursor" @click="CreateLink">{{ t('Ib.Index.CreateLink') }}
             </button>
           </view>
 
           <view class="link qrCode" v-if="link">
-            <QrCode
-              ref="qrCode"
-              :text="link"
-              :width="200"
-              :height="200"
-            />
+            <QrCode ref="qrCode" :text="link" :width="200" :height="200" />
             <view class="btn">
-              <button
-                class="crm-cursor"
-                style="height: 16px"
-                @click="downloadQrCode()"
-              >{{ t('Btn.item9') }}
+              <button class="crm-cursor" style="height: 16px" @click="downloadQrCode()">{{ t('Btn.item9') }}
               </button>
             </view>
           </view>
 
           <view class="link">
-            <uni-easyinput
-              disabled
-              v-model="link"
-            />
+            <uni-easyinput disabled v-model="link" />
             <button class="btn" @click="CopyShareLink(link)">
               {{ t('Ib.Index.Copy') }}
             </button>
@@ -281,46 +243,31 @@
     </cwg-popup>
     <!-- 活动链接弹窗 -->
     <cwg-popup ref="linkActivityPopup" type="center" :title="t('Ib.Index.CreateLinkActiv')" :showFooters="false"
-               showFooterLine>
+      showFooterLine>
       <view class="dia-content">
         <view class="content" style="font-size: 14px; text-align: left">
           <view class="label">{{ t('Ib.Index.ChooseActiv') }}</view>
-          <cwg-combox
-            v-model:value="activityLing"
+          <cwg-combox v-model:value="activityLing"
             :options="agentLinkList.map(item => ({ value: item.link, text: item.name }))"
-            :placeholder="t('Ib.Index.ChooseActiv')"
-          />
+            :placeholder="t('Ib.Index.ChooseActiv')" />
 
           <view class="label">{{ t('Ib.Index.Spread5') }} :</view>
-          <cwg-combox
-            v-model:value="excludeShowLoginTypes"
-            :multiple="true"
-            :options="excludeList"
-            :placeholder="t('placeholder.choose')"
-            @change="handleChange"
-          />
+          <cwg-combox v-model:value="excludeShowLoginTypes" :multiple="true" :options="excludeList"
+            :placeholder="t('placeholder.choose')" @change="handleChange" />
 
           <view class="label">{{ t('Ib.Index.Spread4') }} :</view>
-          <cwg-combox
-            v-model:value="selectedSpreadId"
-            :options="spreadList.map(item => ({
-          value: item.id,
-          text: t('Ib.Index.Commission') + ':' + item.comPoint +
-            (levelNum === 1 ? '-' + t('Ib.Index.Hide') + ':' + item.hide :
-            (fixedHide === 1 ? '' : '-' + t('Ib.Index.Hide') + ':' + item.hide))
-        }))"
-            :placeholder="t('placeholder.choose')"
-          />
+          <cwg-combox v-model:value="selectedSpreadId" :options="spreadList.map(item => ({
+            value: item.id,
+            text: t('Ib.Index.Commission') + ':' + item.comPoint +
+              (levelNum === 1 ? '-' + t('Ib.Index.Hide') + ':' + item.hide :
+                (fixedHide === 1 ? '' : '-' + t('Ib.Index.Hide') + ':' + item.hide))
+          }))" :placeholder="t('placeholder.choose')" />
 
           <view class="label">{{ t('Ib.Index.IbInvalid') }}</view>
-          <cwg-combox
-            v-model:value="ibInvalid"
-            :options="[
-          { value: 'B0', text: t('Ib.Custom.Allow') },
-          { value: 'B1', text: t('Ib.Custom.NotAllow') }
-        ]"
-            :placeholder="t('placeholder.choose')"
-          />
+          <cwg-combox v-model:value="ibInvalid" :options="[
+            { value: 'B0', text: t('Ib.Custom.Allow') },
+            { value: 'B1', text: t('Ib.Custom.NotAllow') }
+          ]" :placeholder="t('placeholder.choose')" />
 
           <view>
             <text style="line-height: 1.5">{{ t('ApplicationDialog.item1') }}</text>
@@ -328,36 +275,22 @@
 
           <view>
             <text style="line-height: 1.5">{{ t('ApplicationDialog.item2') }}</text>
-            <a
-              :href="country == 'NG' || country == 'TH' || country == 'LA' || isAfterJuly7()
-            ? `pdf/pdf6/all/Account Type Allocation Table - ${lang}.pdf`
-            : `pdf/pdf6/no/Account Type Allocation Table-${lang}.pdf`"
-              target="_blank"
-            >
+            <a :href="country == 'NG' || country == 'TH' || country == 'LA' || isAfterJuly7()
+              ? `pdf/pdf6/all/Account Type Allocation Table - ${lang}.pdf`
+              : `pdf/pdf6/no/Account Type Allocation Table-${lang}.pdf`" target="_blank">
               {{ t('ApplicationDialog.item3') }}
             </a>
           </view>
 
           <view class="btn">
-            <button
-              class="crm-cursor"
-              @click="CreateActivityLink"
-            >{{ t('Ib.Index.CreateLinkActivity') }}
+            <button class="crm-cursor" @click="CreateActivityLink">{{ t('Ib.Index.CreateLinkActivity') }}
             </button>
           </view>
 
           <view class="link qrCode" v-if="linkActivity">
-            <QrCode
-              ref="qrCode1"
-              :text="linkActivity"
-              :width="200"
-              :height="200"
-            />
+            <QrCode ref="qrCode1" :text="linkActivity" :width="200" :height="200" />
             <view class="btn">
-              <button
-                class="crm-cursor"
-                @click="downloadQrCode(1)"
-              >{{ t('Btn.item9') }}
+              <button class="crm-cursor" @click="downloadQrCode(1)">{{ t('Btn.item9') }}
               </button>
             </view>
           </view>
@@ -365,12 +298,8 @@
       </view>
     </cwg-popup>
     <!-- 调整收益分成弹窗 -->
-    <cwg-popup
-      :visible="dialogPercent"
-      :title="t('Ib.PammManager.percent')"
-      @close="closeDialogPercent"
-      @confirm="applyPercent"
-    >
+    <cwg-popup :visible="dialogPercent" :title="t('Ib.PammManager.percent')" @close="closeDialogPercent"
+      @confirm="applyPercent">
       <view class="dia-content custom-dialog-content">
         <uni-forms :model="dialogPercentData" label-width="150" label-position="left">
           <uni-forms-item :label="t('Ib.PammManager.ownerId') + ':'">
@@ -383,35 +312,20 @@
             <text class="info-text">{{ dialogPercentData.oldPercent }}%</text>
           </uni-forms-item>
           <uni-forms-item :label="t('Ib.PammManager.percentNew') + ':'" name="percent" required>
-            <uni-easyinput
-              v-model="dialogPercentData.percent"
-              :placeholder="t('placeholder.input')"
-            />
+            <uni-easyinput v-model="dialogPercentData.percent" :placeholder="t('placeholder.input')" />
           </uni-forms-item>
         </uni-forms>
       </view>
     </cwg-popup>
 
     <!-- 子账户数量弹窗 -->
-    <cwg-popup 
-      v-model:visible="isSubsDialogVisible" 
-      type="center" 
-      :title="t('blockchain.item1')" 
-      :showFooters="true"
-      @close="isSubsDialogVisible = false"
-      @confirm="isSubsDialogVisible = false"
-    >
+    <cwg-popup v-model:visible="isSubsDialogVisible" type="center" :title="t('blockchain.item1')" :showFooters="true"
+      @close="isSubsDialogVisible = false" @confirm="isSubsDialogVisible = false">
       <view class="dia-content custom-dialog-content" style="padding: 10px 0; max-height: 50vh; overflow-y: auto;">
-        <cwg-tabel
-          :data="agentId_level"
-          :columns="[
-            { label: t('Ib.Index.TradingAccount'), prop: 'login', align: 'center' },
-            { label: t('Ib.Index.Balance'), prop: 'balance', align: 'center' }
-          ]"
-          :showPagination="false"
-          :showOperation="false"
-          style="margin-bottom: 20px"
-        />
+        <cwg-tabel :data="agentId_level" :columns="[
+          { label: t('Ib.Index.TradingAccount'), prop: 'login', align: 'center' },
+          { label: t('Ib.Index.Balance'), prop: 'balance', align: 'center' }
+        ]" :showPagination="false" :showOperation="false" style="margin-bottom: 20px" />
       </view>
     </cwg-popup>
 
@@ -419,847 +333,846 @@
 </template>
 
 <script setup>
-  import { ref, computed, watch, onMounted, nextTick } from 'vue'
-  import { useI18n } from 'vue-i18n'
-  import useRouter from '@/hooks/useRouter'
-  import { ibApi } from '@/service/ib'
-  import config from '@/config/index'
-  import useUserStore from '@/stores/use-user-store'
-  import { useStorage } from '@/hooks/useStorage'
-  import QrCode from '@/components/QrCode.vue'
-  import { useFilters } from '@/composables/useFilters'
-  import { isAfterJuly28 } from '@/utils/dateUtils'
-
-  const { t } = useI18n()
-  const loading = ref(false)
-  const router = useRouter()
-  const { Code } = config
-  const { userInfo } = useUserStore()
-  const { numberFormat } = useFilters()
-  // 数据
-  const totalEarnings = ref(0.00)
-  const partnerLink = ref('https://one.exnessonelink.com/a/plokue4yj3')
-  const partnerCode = ref('PLOKUE4YJ3')
-  const activeTab = ref('link') // 'link' 或 'code'
-
-  const ibData = ref({
-      customAmount: 0,
-      ibAmount: 0,
-    },
+import { ref, computed, watch, onMounted, nextTick } from 'vue'
+import { useI18n } from 'vue-i18n'
+import useRouter from '@/hooks/useRouter'
+import { ibApi } from '@/service/ib'
+import config from '@/config/index'
+import useUserStore from '@/stores/use-user-store'
+import { useStorage } from '@/hooks/useStorage'
+import QrCode from '@/components/QrCode.vue'
+import { useFilters } from '@/composables/useFilters'
+import { isAfterJuly28 } from '@/utils/dateUtils'
+
+const { t } = useI18n()
+const loading = ref(false)
+const router = useRouter()
+const { Code } = config
+const { userInfo } = useUserStore()
+const { numberFormat } = useFilters()
+// 数据
+const totalEarnings = ref(0.00)
+const partnerLink = ref('https://one.exnessonelink.com/a/plokue4yj3')
+const partnerCode = ref('PLOKUE4YJ3')
+const activeTab = ref('link') // 'link' 或 'code'
+
+const ibData = ref({
+  customAmount: 0,
+  ibAmount: 0,
+},
+)
+const selectedSpreadId = ref('')
+const spreadList = ref([])
+const excludeShowLoginTypes = ref([])
+const pammManagerValid = ref()
+const dialogPercent = ref(false)
+const dialogPercentData = ref({
+  oldPercent: '',
+  mamListId: '',
+  oldOwnerId: '',
+  oldAccountId: '',
+  percent: '',
+})
+const isActionLoading = ref(false)
+const menuList = computed(() => [
+  { label: t('Custom.Index.Withdrawals'), type: 1 },
+  { label: t('Home.page_ib.item4'), type: 2 },
+  { label: t('Ib.Transfer.CommissionIssue'), type: 3 },
+])
+const excludeList = ref([])
+const excludeLists = ref([
+  { text: t('AccountType.SeniorAccount'), value: '2' },
+  // {text: t('AccountType.SeniorAccount'),value: '3'},
+  { text: t('AccountType.StandardAccount'), value: '7' },
+  { text: t('AccountType.CentAccount'), value: '8' },
+])
+const link = ref('')
+const loginTypes = ref('')
+const ibInvalid = ref('B0')
+const qrCode = ref(null)
+const qrCode1 = ref(null)
+
+// 语言
+const lang = useStorage('lang')
+const flag = ref(false)
+const agentLinkList = ref([])
+const activityLing = ref('')
+const linkActivity = ref('')
+const commission = ref('')
+const linkActivityPopup = ref(null)
+
+// 开户链接
+const linkPopup = ref(null)
+const qrSize = ref(200)
+
+const levelNum = computed(() => {
+  return userInfo.ibInfo.levelNum
+})
+const fixedHide = computed(() => {
+  return userInfo.ibInfo.fixedHide
+})
+const getInfoId = computed(() => {
+  return userInfo.ibInfo.id
+})
+
+const balanceInt = computed(() => {
+  return numberFormat(ibData.value?.balance || 0, true)[0]
+})
+const balanceDecimal = computed(() => {
+  return numberFormat(ibData.value?.balance || 0, true)[1] || '00'
+})
+
+// 国家
+const country = computed(() => {
+  console.log(userInfo.customInfo.country, '2')
+  return userInfo.customInfo.country
+})
+// 修改多选
+const handleChange = (val) => {
+  excludeShowLoginTypes.value = val
+}
+const isAfterJuly7 = () => {
+  const currentDate = new Date()
+  const july7 = new Date(currentDate.getFullYear(), 6, 7) // 月份从0开始,6表示7月
+  return currentDate >= july7
+}
+
+const getValidAccountTypes = (selectedExcludeValues, selectedSpreadId) => {
+  const spread = spreadList.value.find(
+    (item) => item.id === selectedSpreadId,
+  )
+  let data = {
+    hide: '',
+    commission: '',
+    excludeShowLoginTypes: [],
+  }
+  if (!spread) return data
+  const validValues = selectedExcludeValues.filter((value) =>
+    spread.loginTypes.includes(value),
+  )
+  const invalidValues = selectedExcludeValues.filter(
+    (value) => !spread.loginTypes.includes(value),
   )
-  const selectedSpreadId = ref('')
-  const spreadList = ref([])
-  const excludeShowLoginTypes = ref([])
-  const pammManagerValid = ref()
-  const dialogPercent = ref(false)
-  const dialogPercentData = ref({
-    oldPercent: '',
-    mamListId: '',
-    oldOwnerId: '',
-    oldAccountId: '',
-    percent: '',
-  })
-  const isActionLoading = ref(false)
-  const menuList = computed(() => [
-    { label: t('Custom.Index.Withdrawals'), type: 1 },
-    { label: t('Home.page_ib.item4'), type: 2 },
-    { label: t('Ib.Transfer.CommissionIssue'), type: 3 },
-  ])
-  const excludeList = ref([])
-  const excludeLists = ref([
-    { text: t('AccountType.SeniorAccount'), value: '2' },
-    // {text: t('AccountType.SeniorAccount'),value: '3'},
-    { text: t('AccountType.StandardAccount'), value: '7' },
-    { text: t('AccountType.CentAccount'), value: '8' },
-  ])
-  const link = ref('')
-  const loginTypes = ref('')
-  const ibInvalid = ref('B0')
-  const qrCode = ref(null)
-  const qrCode1 = ref(null)
-
-  // 语言
-  const lang = useStorage('lang')
-  const flag = ref(false)
-  const agentLinkList = ref([])
-  const activityLing = ref('')
-  const linkActivity = ref('')
-  const commission = ref('')
-  const linkActivityPopup = ref(null)
-
-  // 开户链接
-  const linkPopup = ref(null)
-  const qrSize = ref(200)
-
-  const levelNum = computed(() => {
-    return userInfo.ibInfo.levelNum
-  })
-  const fixedHide = computed(() => {
-    return userInfo.ibInfo.fixedHide
-  })
-  const getInfoId = computed(() => {
-    return userInfo.ibInfo.id
-  })
-
-  const balanceInt = computed(() => {
-    return numberFormat(ibData.value?.balance || 0, true)[0]
-  })
-  const balanceDecimal = computed(() => {
-    return numberFormat(ibData.value?.balance || 0, true)[1] || '00'
-  })
-
-  // 国家
-  const country = computed(() => {
-    console.log(userInfo.customInfo.country, '2')
-    return userInfo.customInfo.country
-  })
-  // 修改多选
-  const handleChange = (val) => {
-    excludeShowLoginTypes.value = val
-  }
-  const isAfterJuly7 = () => {
-    const currentDate = new Date()
-    const july7 = new Date(currentDate.getFullYear(), 6, 7) // 月份从0开始,6表示7月
-    return currentDate >= july7
-  }
-
-  const getValidAccountTypes = (selectedExcludeValues, selectedSpreadId) => {
-    const spread = spreadList.value.find(
-      (item) => item.id === selectedSpreadId,
-    )
-    let data = {
-      hide: '',
-      commission: '',
-      excludeShowLoginTypes: [],
-    }
-    if (!spread) return data
-    const validValues = selectedExcludeValues.filter((value) =>
-      spread.loginTypes.includes(value),
-    )
-    const invalidValues = selectedExcludeValues.filter(
-      (value) => !spread.loginTypes.includes(value),
-    )
-
-    const invalidLabels = excludeList.value
-      .filter((item) => invalidValues.includes(item.value))
-      .map((item) => item.label)
-
-    const excludeTypes = excludeLists.value
-      .filter((item) => !validValues.includes(item.value))
-      .map((item) => item.value)
-
-    loginTypes.value = invalidLabels.join('、')
-
-    return {
-      hide: spread.hide,
-      commission: spread.comPoint,
-      excludeShowLoginTypes: excludeTypes,
-      invalidLabels,
-      invalidValues,
-    }
-  }
 
-  const downloadQrCode = (type = 0) => {
-    if (type === 1) {
-      qrCode1.value.download()
-    } else {
-      qrCode.value.download()
-    }
+  const invalidLabels = excludeList.value
+    .filter((item) => invalidValues.includes(item.value))
+    .map((item) => item.label)
+
+  const excludeTypes = excludeLists.value
+    .filter((item) => !validValues.includes(item.value))
+    .map((item) => item.value)
+
+  loginTypes.value = invalidLabels.join('、')
+
+  return {
+    hide: spread.hide,
+    commission: spread.comPoint,
+    excludeShowLoginTypes: excludeTypes,
+    invalidLabels,
+    invalidValues,
+  }
+}
+
+const downloadQrCode = (type = 0) => {
+  if (type === 1) {
+    qrCode1.value.download()
+  } else {
+    qrCode.value.download()
+  }
+}
+// 复制
+const CopyShareLink = (value) => {
+  uni.setClipboardData({ data: value })
+}
+
+const getLink1 = async () => {
+  console.log(excludeShowLoginTypes.value, 2)
+  if (excludeShowLoginTypes.value.length == 0) {
+    uni.showToast({
+      title: t('Ib.Index.Spread5'), icon: 'none',
+    })
+    link.value = ''
+    return
   }
-  // 复制
-  const CopyShareLink = (value) => {
-    uni.setClipboardData({ data: value })
+  if (!selectedSpreadId.value.length) {
+    uni.showToast({
+      title: t('Ib.Index.Spread4'), icon: 'none',
+    })
+    link.value = ''
+    return
   }
-
-  const getLink1 = async () => {
-    console.log(excludeShowLoginTypes.value, 2)
-    if (excludeShowLoginTypes.value.length == 0) {
-      uni.showToast({
-        title: t('Ib.Index.Spread5'), icon: 'none',
-      })
-      link.value = ''
-      return
-    }
-    if (!selectedSpreadId.value.length) {
-      uni.showToast({
-        title: t('Ib.Index.Spread4'), icon: 'none',
-      })
-      link.value = ''
-      return
-    }
-    const validList = getValidAccountTypes(
-      excludeShowLoginTypes.value,
-      selectedSpreadId.value,
-    )
-    if (validList.invalidLabels.length > 0) {
-      return new Promise((resolve) => {
-        uni.showModal({
-          title: t('Msg.SystemPrompt'),
-          content: `${t('Ib.Index.Spread1')}${
-            loginTypes.value
+  const validList = getValidAccountTypes(
+    excludeShowLoginTypes.value,
+    selectedSpreadId.value,
+  )
+  if (validList.invalidLabels.length > 0) {
+    return new Promise((resolve) => {
+      uni.showModal({
+        title: t('Msg.SystemPrompt'),
+        content: `${t('Ib.Index.Spread1')}${loginTypes.value
           }${t('')}`,
-          confirmText: t('Btn.Confirm'),
-          cancelText: t('Btn.Cancel'),
-          success: async (res) => {
-            if (res.confirm) {
-              const res = await ibApi.customLink(validList)
-              if (res.code === Code.StatusOK) {
-                uni.showToast({
-                  title: res.msg,
-                  icon: 'none',
-                })
-                resolve(res.data)
-              } else {
-                uni.showToast({
-                  title: res.msg,
-                  icon: 'none',
-                })
-                resolve('')
-              }
+        confirmText: t('Btn.Confirm'),
+        cancelText: t('Btn.Cancel'),
+        success: async (res) => {
+          if (res.confirm) {
+            const res = await ibApi.customLink(validList)
+            if (res.code === Code.StatusOK) {
+              uni.showToast({
+                title: res.msg,
+                icon: 'none',
+              })
+              resolve(res.data)
+            } else {
+              uni.showToast({
+                title: res.msg,
+                icon: 'none',
+              })
+              resolve('')
             }
-          },
-          fail: () => resolve(''),
-        })
+          }
+        },
+        fail: () => resolve(''),
       })
+    })
+  } else {
+    const res = await ibApi.customLink(validList)
+    if (res.code === Code.StatusOK) {
+      uni.showToast({
+        title: res.msg,
+        icon: 'none',
+      })
+      return res.data
     } else {
-      const res = await ibApi.customLink(validList)
-      if (res.code === Code.StatusOK) {
-        uni.showToast({
-          title: res.msg,
-          icon: 'none',
-        })
-        return res.data
-      } else {
-        uni.showToast({
-          title: res.msg,
-          icon: 'none',
-        })
-        return ''
-      }
+      uni.showToast({
+        title: res.msg,
+        icon: 'none',
+      })
+      return ''
     }
-
-  }
-  const CreateLink = async () => {
-    const linkValue = await getLink1()
-    if (!linkValue) return
-    link.value = `${Host80}/#/signup/${getInfoId.value}/${linkValue}/${ibInvalid.value}`
   }
 
-  const loginTypeList = async () => {
-    const res = await ibApi.loginTypeList(
-      {
-        page: {
-          current: 1,
-          row: 100,
-        },
+}
+const CreateLink = async () => {
+  const linkValue = await getLink1()
+  if (!linkValue) return
+  link.value = `${Host80}/#/signup/${getInfoId.value}/${linkValue}/${ibInvalid.value}`
+}
+
+const loginTypeList = async () => {
+  const res = await ibApi.loginTypeList(
+    {
+      page: {
+        current: 1,
+        row: 100,
       },
-    )
-    if (res.code === Code.StatusOK) {
-      spreadList.value = res.data
-    } else {
-      uni.showToast({ title: res.msg, icon: 'none' })
-    }
-  }
-  const getAgentAccountSetting = async () => {
-    const { agentAccountSetting = '' } = userInfo.ibInfo ?? {}
-    if (agentAccountSetting === 0) {
-      const excludeValues = userInfo.customInfo.excludeShowLoginTypes
-      try {
-        excludeList.value = excludeLists.value.filter(
-          (item) => !excludeValues.includes(item.value),
-        )
-        excludeShowLoginTypes.value = []
-      } catch (e) {
-        excludeShowLoginTypes.value = []
-        excludeList.value = excludeLists.value
-      }
-    } else {
+    },
+  )
+  if (res.code === Code.StatusOK) {
+    spreadList.value = res.data
+  } else {
+    uni.showToast({ title: res.msg, icon: 'none' })
+  }
+}
+const getAgentAccountSetting = async () => {
+  const { agentAccountSetting = '' } = userInfo.ibInfo ?? {}
+  if (agentAccountSetting === 0) {
+    const excludeValues = userInfo.customInfo.excludeShowLoginTypes
+    try {
+      excludeList.value = excludeLists.value.filter(
+        (item) => !excludeValues.includes(item.value),
+      )
+      excludeShowLoginTypes.value = []
+    } catch (e) {
       excludeShowLoginTypes.value = []
       excludeList.value = excludeLists.value
     }
-  }
-  // 生成开户链接
-  const LinkActivity1 = async () => {
-    // 跳转到开户链接页面
-    uni.navigateTo({
-      url: '/pages/ib/linkList',
-    })
-  }
-  // 生成活动分享链接
-  const LinkActivity = async () => {
-    if (flag.value) {
-
+  } else {
+    excludeShowLoginTypes.value = []
+    excludeList.value = excludeLists.value
+  }
+}
+// 生成开户链接
+const LinkActivity1 = async () => {
+  // 跳转到开户链接页面
+  uni.navigateTo({
+    url: '/pages/ib/linkList',
+  })
+}
+// 生成活动分享链接
+const LinkActivity = async () => {
+  if (flag.value) {
+
+  } else {
+    flag.value = true
+  }
+  let res = await ibApi.marketAgentLinkList({})
+  if (res.code === Code.StatusOK) {
+    agentLinkList.value = res.data ?? []
+    loginTypeList()
+    getAgentAccountSetting()
+    activityLing.value = ''
+    linkActivity.value = ''
+    commission.value = 0
+    ibInvalid.value = 'B0'
+    linkActivityPopup.value.open()
+    flag.value = false
+  }
+}
+
+const CreateActivityLink = async () => {
+  if (!activityLing.value) {
+    uni.showToast({ title: t('Ib.Index.ChooseActiv'), icon: 'error' })
+    return
+  }
+  const linkValue = await getLink1()
+  if (!linkValue) return
+  if (activityLing.value.indexOf('http') > -1) {
+    if (activityLing.value.indexOf('?') > -1) {
+      linkActivity.value =
+        activityLing.value +
+        '&mmdi=' +
+        getInfoId.value +
+        '&mmF=' +
+        linkValue +
+        '&mmB=' +
+        ibInvalid.value
     } else {
-      flag.value = true
-    }
-    let res = await ibApi.marketAgentLinkList({})
-    if (res.code === Code.StatusOK) {
-      agentLinkList.value = res.data ?? []
-      loginTypeList()
-      getAgentAccountSetting()
-      activityLing.value = ''
-      linkActivity.value = ''
-      commission.value = 0
-      ibInvalid.value = 'B0'
-      linkActivityPopup.value.open()
-      flag.value = false
-    }
-  }
-
-  const CreateActivityLink = async () => {
-    if (!activityLing.value) {
-      uni.showToast({ title: t('Ib.Index.ChooseActiv'), icon: 'error' })
-      return
+      linkActivity.value =
+        activityLing.value +
+        '?mmdi=' +
+        getInfoId.value +
+        '&mmF=' +
+        linkValue +
+        '&mmB=' +
+        ibInvalid.value
     }
-    const linkValue = await getLink1()
-    if (!linkValue) return
-    if (activityLing.value.indexOf('http') > -1) {
-      if (activityLing.value.indexOf('?') > -1) {
-        linkActivity.value =
-          activityLing.value +
-          '&mmdi=' +
-          getInfoId.value +
-          '&mmF=' +
-          linkValue +
-          '&mmB=' +
-          ibInvalid.value
-      } else {
-        linkActivity.value =
-          activityLing.value +
-          '?mmdi=' +
-          getInfoId.value +
-          '&mmF=' +
-          linkValue +
-          '&mmB=' +
-          ibInvalid.value
-      }
+  } else {
+    if (activityLing.value.indexOf('?') > -1) {
+      linkActivity.value =
+        Host80 +
+        '/' +
+        activityLing.value +
+        '&mmdi=' +
+        getInfoId.value +
+        '&mmF=' +
+        linkValue +
+        '&mmB=' +
+        ibInvalid.value
     } else {
-      if (activityLing.value.indexOf('?') > -1) {
-        linkActivity.value =
-          Host80 +
-          '/' +
-          activityLing.value +
-          '&mmdi=' +
-          getInfoId.value +
-          '&mmF=' +
-          linkValue +
-          '&mmB=' +
-          ibInvalid.value
-      } else {
-        linkActivity.value =
-          Host80 +
-          '/' +
-          activityLing.value +
-          '?mmdi=' +
-          getInfoId.value +
-          '&mmF=' +
-          linkValue +
-          '&mmB=' +
-          ibInvalid.value
-      }
+      linkActivity.value =
+        Host80 +
+        '/' +
+        activityLing.value +
+        '?mmdi=' +
+        getInfoId.value +
+        '&mmF=' +
+        linkValue +
+        '&mmB=' +
+        ibInvalid.value
     }
   }
-  const handleMenuClick = ({ value }) => {
-    console.log(value.type)
-    if (value.type === 1) {
-      toWithdraw()
-    } else if (value.type === 2) {
-      toTransfer()
-    } else {
-      toTransfer(2)
-    }
+}
+const handleMenuClick = ({ value }) => {
+  console.log(value.type)
+  if (value.type === 1) {
+    toWithdraw()
+  } else if (value.type === 2) {
+    toTransfer()
+  } else {
+    toTransfer(2)
+  }
+}
+
+const toWithdraw = () => {
+  router.push({
+    path: '/pages/ib/withdraw-select',
+  },
+  )
+}
+const toTransfer = (tab = 1) => {
+  router.push({
+    path: '/pages/ib/transfer',
+    query: { tab },
+  },
+  )
+}
+const toCustomManagement = () => {
+  router.push({
+    path: '/pages/ib/customer',
+    query: { type: 3 },
+  },
+  )
+}
+const toIbManagement = () => {
+  router.push({
+    path: '/pages/ib/subsList',
+    query: { type: 2 },
+  },
+  )
+}
+const getIbData = async () => {
+  const res = await ibApi.IbData()
+  if (res.code === Code.StatusOK) {
+    if (res.data != null)
+      ibData.value = res.data
+  } else {
+    uni.showToast({ title: res.msg, icon: 'none' })
+  }
+}
+const getPammManagerValid = async () => {
+  // 没有ib状态不调用
+  if (!userInfo.ibInfo) {
+    return
+  }
+  const res = await ibApi.mamApplyPammManagerValid()
+  if (res.code === Code.StatusOK) {
+    if (res.data != null)
+      pammManagerValid.value = res.data
+  } else {
+    uni.showToast({ title: res.msg, icon: 'none' })
+  }
+}
+
+const mamTableRef = ref(null)
+const mamSearch = ref({})
+const mamListApi = computed(() => {
+  // 模拟,没有ib不调用接口
+  if (!userInfo.ibInfo) {
+    return (params) => new Promise(resolve => {
+      resolve({
+        code: 200,
+        data: [],
+      })
+    })
   }
+  return (params) => ibApi.MamList(params)
+})
 
-  const toWithdraw = () => {
-    router.push({
-        path: '/pages/ib/withdraw-select',
-      },
-    )
-  }
-  const toTransfer = (tab = 1) => {
-    router.push({
-        path: '/pages/ib/transfer',
-        query: { tab },
-      },
-    )
-  }
-  const toCustomManagement = () => {
+const showAddMamAccount = computed(() => {
+  return !!(
+    pammManagerValid.value?.mamValid ||
+    pammManagerValid.value?.pammValid ||
+    pammManagerValid.value?.pammManagerValid
+  )
+})
+
+const addMamAccountMenus = computed(() => {
+  const list = []
+  if (pammManagerValid.value?.mamValid) list.push({ label: 'MAM', type: 1 })
+  if (pammManagerValid.value?.pammValid) list.push({ label: 'Money Manager', type: 2 })
+  if (pammManagerValid.value?.pammManagerValid) list.push({ label: t('Ib.PammManager.title'), type: 3 })
+  return list
+})
+
+const handleAddMamAccountMenuClick = ({ value }) => {
+  toNewAccount(value.type)
+}
+
+const formatMamType = (type) => {
+  if (type == 1) return 'MAM'
+  if (type == 2) return 'Money Manager'
+  if (type == 3) return t('Ib.PammManager.title1')
+  return '--'
+}
+
+const formatAccountType = (accountType) => {
+  if (accountType == 1) return t('AccountType.ClassicAccount')
+  if (accountType == 2) return t('AccountType.SeniorAccount')
+  if (accountType == 3 && !isAfterJuly28()) return t('AccountType.AgencyAccount')
+  if (accountType == 5) return t('AccountType.SpeedAccount')
+  if (accountType == 6) return t('AccountType.SpeedAccount')
+  if (accountType == 7) return t('AccountType.StandardAccount')
+  if (accountType == 8) return t('AccountType.CentAccount')
+  return '--'
+}
+
+const mamColumns = computed(() => [
+  { prop: 'mamAccount', label: t('Ib.Index.MAMAccount'), align: 'center', slot: 'mamAccount' },
+  { prop: 'type', label: t('Label.Type'), align: 'center', slot: 'mamType' },
+  { prop: 'accountType', label: t('Ib.Index.LoginType'), align: 'center', slot: 'loginType' },
+  { prop: 'platform', label: t('Ib.Index.Platform'), align: 'center' },
+  { prop: 'currency', label: t('Ib.Index.Currency'), align: 'center' },
+  { prop: 'leverage', label: t('Ib.Index.Leverage'), align: 'center', slot: 'leverage' },
+  { prop: 'balance', label: t('Ib.Index.Balance'), align: 'center', slot: 'balance' },
+  { prop: 'equity', label: t('Ib.Index.Equity'), align: 'center', slot: 'equity' },
+  { prop: 'commission', label: t('Ib.Index.Commission'), align: 'center' },
+  { prop: 'operation', label: t('Ib.Index.Operation'), align: 'center', slot: 'operation' },
+])
+
+const mamMobilePrimaryFields = computed(() => [
+  { prop: 'mamAccount', label: t('Ib.Index.MAMAccount'), align: 'center', slot: 'mamAccount' },
+  { prop: 'type', label: t('Label.Type'), align: 'center', slot: 'mamType' },
+  { prop: 'platform', label: t('Ib.Index.Platform'), align: 'center' },
+  { prop: 'more', type: 'more', width: 20, align: 'right' },
+])
+
+const toNewAccount = (type) => {
+  if (type == 3) {
     router.push({
-        path: '/pages/ib/customer',
-        query: { type: 3 },
+      path: '/pages/ib/openPammManager',
+      query: {
+        type: type,
       },
-    )
-  }
-  const toIbManagement = () => {
+    })
+  } else {
     router.push({
-        path: '/pages/ib/subsList',
-        query: { type: 2 },
+      path: '/pages/ib/openAccount',
+      query: {
+        type: type,
       },
-    )
-  }
-  const getIbData = async () => {
-    const res = await ibApi.IbData()
-    if (res.code === Code.StatusOK) {
-      if (res.data != null)
-        ibData.value = res.data
-    } else {
-      uni.showToast({ title: res.msg, icon: 'none' })
-    }
+    })
   }
-  const getPammManagerValid = async () => {
-    // 没有ib状态不调用
-    if (!userInfo.ibInfo) {
-      return
-    }
-    const res = await ibApi.mamApplyPammManagerValid()
+}
+
+const toSettings = (row) => {
+  router.push({
+    path: '/pages/ib/settingPammManager',
+    query: { login: row.accountId, id: row.id },
+  })
+}
+
+const toDialogPercent = (row) => {
+  dialogPercentData.value.oldPercent = row.percent
+  dialogPercentData.value.mamListId = row.id
+  dialogPercentData.value.oldOwnerId = row.ownerId
+  dialogPercentData.value.oldAccountId = row.accountId
+  dialogPercentData.value.percent = ''
+  dialogPercent.value = true
+}
+
+const closeDialogPercent = () => {
+  dialogPercent.value = false
+}
+
+const applyPercent = async () => {
+  if (isActionLoading.value) return
+
+  if (!dialogPercentData.value.percent) {
+    uni.showToast({ title: t('placeholder.input'), icon: 'none' })
+    return
+  }
+
+  isActionLoading.value = true
+  try {
+    const res = await ibApi.applyPercent({
+      mamListId: dialogPercentData.value.mamListId,
+      percent: dialogPercentData.value.percent,
+    })
     if (res.code === Code.StatusOK) {
-      if (res.data != null)
-        pammManagerValid.value = res.data
+      uni.showToast({ title: res.msg, icon: 'success' })
+      dialogPercent.value = false
+      // Refresh MAM list
+      mamTableRef.value?.refreshTable()
     } else {
       uni.showToast({ title: res.msg, icon: 'none' })
     }
+  } catch (error) {
+    uni.showToast({ title: t('Msg.Fail'), icon: 'none' })
+  } finally {
+    isActionLoading.value = false
   }
+}
 
-  const mamTableRef = ref(null)
-  const mamSearch = ref({})
-  const mamListApi = computed(() => {
-    // 模拟,没有ib不调用接口
-    if (!userInfo.ibInfo) {
-      return (params) => new Promise(resolve => {
-        resolve({
-          code: 200,
-          data: [],
-        })
-      })
-    }
-    return (params) => ibApi.MamList(params)
-  })
+const isSubsDialogVisible = ref(false)
+const agentId_level = ref([])
 
-  const showAddMamAccount = computed(() => {
-    return !!(
-      pammManagerValid.value?.mamValid ||
-      pammManagerValid.value?.pammValid ||
-      pammManagerValid.value?.pammManagerValid
-    )
-  })
-
-  const addMamAccountMenus = computed(() => {
-    const list = []
-    if (pammManagerValid.value?.mamValid) list.push({ label: 'MAM', type: 1 })
-    if (pammManagerValid.value?.pammValid) list.push({ label: 'Money Manager', type: 2 })
-    if (pammManagerValid.value?.pammManagerValid) list.push({ label: t('Ib.PammManager.title'), type: 3 })
-    return list
-  })
-
-  const handleAddMamAccountMenuClick = ({ value }) => {
-    toNewAccount(value.type)
-  }
-
-  const formatMamType = (type) => {
-    if (type == 1) return 'MAM'
-    if (type == 2) return 'Money Manager'
-    if (type == 3) return t('Ib.PammManager.title1')
-    return '--'
-  }
+const toDialogSubs = async (row) => {
 
-  const formatAccountType = (accountType) => {
-    if (accountType == 1) return t('AccountType.ClassicAccount')
-    if (accountType == 2) return t('AccountType.SeniorAccount')
-    if (accountType == 3 && !isAfterJuly28()) return t('AccountType.AgencyAccount')
-    if (accountType == 5) return t('AccountType.SpeedAccount')
-    if (accountType == 6) return t('AccountType.SpeedAccount')
-    if (accountType == 7) return t('AccountType.StandardAccount')
-    if (accountType == 8) return t('AccountType.CentAccount')
-    return '--'
-  }
-
-  const mamColumns = computed(() => [
-    { prop: 'mamAccount', label: t('Ib.Index.MAMAccount'), align: 'center', slot: 'mamAccount' },
-    { prop: 'type', label: t('Label.Type'), align: 'center', slot: 'mamType' },
-    { prop: 'accountType', label: t('Ib.Index.LoginType'), align: 'center', slot: 'loginType' },
-    { prop: 'platform', label: t('Ib.Index.Platform'), align: 'center' },
-    { prop: 'currency', label: t('Ib.Index.Currency'), align: 'center' },
-    { prop: 'leverage', label: t('Ib.Index.Leverage'), align: 'center', slot: 'leverage' },
-    { prop: 'balance', label: t('Ib.Index.Balance'), align: 'center', slot: 'balance' },
-    { prop: 'equity', label: t('Ib.Index.Equity'), align: 'center', slot: 'equity' },
-    { prop: 'commission', label: t('Ib.Index.Commission'), align: 'center' },
-    { prop: 'operation', label: t('Ib.Index.Operation'), align: 'center', slot: 'operation' },
-  ])
-
-  const mamMobilePrimaryFields = computed(() => [
-    { prop: 'mamAccount', label: t('Ib.Index.MAMAccount'), align: 'center', slot: 'mamAccount' },
-    { prop: 'type', label: t('Label.Type'), align: 'center', slot: 'mamType' },
-    { prop: 'platform', label: t('Ib.Index.Platform'), align: 'center' },
-    { prop: 'more', type: 'more', width: 20, align: 'right' },
-  ])
-
-  const toNewAccount = (type) => {
-    if (type == 3) {
-      router.push({
-        path: '/pages/ib/openPammManager',
-        query: {
-          type: type,
-        },
-      })
+  agentId_level.value = []
+  try {
+    const res = await ibApi.pammListSubs({ id: row.id })
+    if (res.code === Code.StatusOK) {
+      agentId_level.value = res.data || []
     } else {
-      router.push({
-        path: '/pages/ib/openAccount',
-        query: {
-          type: type,
-        },
-      })
-    }
-  }
-
-  const toSettings = (row) => {
-    router.push({
-      path: '/pages/ib/settingPammManager',
-      query: { login: row.accountId, id: row.id },
-    })
-  }
-
-  const toDialogPercent = (row) => {
-    dialogPercentData.value.oldPercent = row.percent
-    dialogPercentData.value.mamListId = row.id
-    dialogPercentData.value.oldOwnerId = row.ownerId
-    dialogPercentData.value.oldAccountId = row.accountId
-    dialogPercentData.value.percent = ''
-    dialogPercent.value = true
-  }
-
-  const closeDialogPercent = () => {
-    dialogPercent.value = false
-  }
-
-  const applyPercent = async () => {
-    if (isActionLoading.value) return
-
-    if (!dialogPercentData.value.percent) {
-      uni.showToast({ title: t('placeholder.input'), icon: 'none' })
-      return
-    }
-
-    isActionLoading.value = true
-    try {
-      const res = await ibApi.applyPercent({
-        mamListId: dialogPercentData.value.mamListId,
-        percent: dialogPercentData.value.percent,
-      })
-      if (res.code === Code.StatusOK) {
-        uni.showToast({ title: res.msg, icon: 'success' })
-        dialogPercent.value = false
-        // Refresh MAM list
-        mamTableRef.value?.refreshTable()
-      } else {
-        uni.showToast({ title: res.msg, icon: 'none' })
-      }
-    } catch (error) {
-      uni.showToast({ title: t('Msg.Fail'), icon: 'none' })
-    } finally {
-      isActionLoading.value = false
-    }
-  }
-
-  const isSubsDialogVisible = ref(false)
-  const agentId_level = ref([])
-
-  const toDialogSubs = async (row) => {
-
-    agentId_level.value = []
-    try {
-      const res = await ibApi.pammListSubs({ id: row.id })
-      if (res.code === Code.StatusOK) {
-        agentId_level.value = res.data || []
-      } else {
-        uni.showToast({ title: res.msg, icon: 'none' })
-      }
-    } catch (e) {
-      // uni.showToast({ title: t('Msg.Fail'), icon: 'none' })
+      uni.showToast({ title: res.msg, icon: 'none' })
     }
-    nextTick(()=>{
-      isSubsDialogVisible.value = true
-    })
+  } catch (e) {
+    // uni.showToast({ title: t('Msg.Fail'), icon: 'none' })
   }
-
-  onMounted(async () => {
-    loading.value = true
-    // 初始化数据
-    await getIbData()
-    await getPammManagerValid()
-    loading.value = false
+  nextTick(() => {
+    isSubsDialogVisible.value = true
   })
+}
+
+onMounted(async () => {
+  loading.value = true
+  // 初始化数据
+  await getIbData()
+  await getPammManagerValid()
+  loading.value = false
+})
 
 </script>
 
 <style lang="scss" scoped>
-  @import "@/uni.scss";
-
-  .demo-uni-row {
-    display: flex;
-    flex-wrap: wrap;
-    align-items: stretch;
-    margin: 0 auto!important;
+@import "@/uni.scss";
+
+.demo-uni-row {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: stretch;
+  margin: 0 auto !important;
+}
+
+.uni-col-left {
+  display: flex;
+  flex-direction: column;
+}
+
+.uni-col-right {
+  display: flex;
+  flex-direction: column;
+}
+
+.dashboard-container {
+  min-height: 10vh;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+}
+
+.mam-card {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+}
+
+/* 卡片通用样式 */
+.card {
+  background: var(--color-white);
+  color: var(--bs-heading-color);
+  padding: px2rpx(12) px2rpx(16);
+  border-radius: 4px;
+  margin-bottom: px2rpx(20);
+  box-shadow: 0 px2rpx(4) px2rpx(12) rgba(0, 0, 0, 0.2);
+}
+
+.custom-dialog-content {
+  padding: px2rpx(20);
+
+  .info-text {
+    color: var(--bs-heading-color);
+    font-size: px2rpx(14);
+    line-height: px2rpx(36);
+  }
+}
+
+.card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: px2rpx(12);
+}
+
+.header-left {
+  display: flex;
+  align-items: center;
+  gap: 12rpx;
+}
+
+.header-title {
+  font-size: px2rpx(14);
+  font-weight: 600;
+}
+
+.header-right {
+  display: flex;
+  align-items: center;
+}
+
+.action-btn {
+  background: #ffde02;
+  border: none;
+  border-radius: 50%;
+  width: px2rpx(32);
+  height: px2rpx(32);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 0;
+  margin: 0;
+
+  &:after {
+    border: none;
   }
-
-  .uni-col-left {
-    display: flex;
-    flex-direction: column;
+}
+
+/* 余额区域 */
+.balance-content {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 16rpx;
+}
+
+.balance-main {
+  display: flex;
+  align-items: baseline;
+  flex-wrap: wrap;
+}
+
+.balance-amount {
+  font-size: px2rpx(20);
+  font-weight: 700;
+  line-height: 1;
+}
+
+.balance-decimal {
+  font-size: px2rpx(16);
+  font-weight: 500;
+  line-height: 1;
+}
+
+.balance-currency {
+  font-size: px2rpx(16);
+  font-weight: 500;
+}
+
+.total-earnings {
+  display: flex;
+  align-items: center;
+  gap: 5px;
+  color: rgba(20, 29, 34, 0.6);
+  font-size: px2rpx(12);
+}
+
+.total-value {
+  align-self: flex-end;
+}
+
+/* 合作伙伴卡片 */
+.partner-content {
+  display: flex;
+  flex-direction: column;
+  gap: 12px;
+}
+
+.link-area {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-around;
+  align-items: center;
+  gap: 12px;
+}
+
+.link-btn {
+  height: px2rpx(32);
+  background-color: rgb(108, 133, 149);
+  line-height: px2rpx(32);
+  color: var(--color-white);
+  border-radius: px2rpx(16);
+  font-size: px2rpx(14);
+  margin: 0;
+}
+
+.code-content {
+  display: flex;
+  justify-content: center;
+}
+
+.code-input {
+  width: 50%;
+  max-width: px2rpx(178);
+  margin-right: px2rpx(20);
+}
+
+.custom-content {
+  display: flex;
+  justify-content: space-around;
+  flex-wrap: wrap;
+
+  .con {
+    cursor: pointer;
+    text-align: center;
+    font-size: px2rpx(16);
+    margin: 5px;
   }
 
-  .uni-col-right {
-    display: flex;
-    flex-direction: column;
+  .num {
+    font-weight: bold;
   }
 
-  .dashboard-container {
-    min-height: 10vh;
-    box-sizing: border-box;
-    display: flex;
-    flex-direction: column;
-    height: 100%;
-  }
+  .des {
+    margin-top: px2rpx(5);
 
-  .mam-card {
-    flex: 1;
-    display: flex;
-    flex-direction: column;
   }
+}
 
-  /* 卡片通用样式 */
-  .card {
-    background: var(--color-white);
-    color: #333;
-    padding: px2rpx(12) px2rpx(16);
-    border-radius: 4px;
-    margin-bottom: px2rpx(20);
-    box-shadow: 0 px2rpx(4) px2rpx(12) rgba(0, 0, 0, 0.2);
-  }
+.dia-content {
+  padding: 20rpx;
+}
 
-  .custom-dialog-content {
-    padding: px2rpx(20);
+.content {
+  display: flex;
+  flex-direction: column;
+  gap: 20rpx;
+}
 
-    .info-text {
-      color: #333;
-      font-size: px2rpx(14);
-      line-height: px2rpx(36);
-    }
-  }
+.label {
+  font-weight: 500;
+  margin-bottom: 8rpx;
+}
 
-  .card-header {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-bottom: px2rpx(12);
-  }
+.btn {
+  margin-top: 16rpx;
+  text-align: center;
+}
 
-  .header-left {
-    display: flex;
-    align-items: center;
-    gap: 12rpx;
-  }
-
-  .header-title {
-    font-size: px2rpx(14);
-    font-weight: 600;
-  }
+.crm-cursor {
+  cursor: pointer;
+}
 
-  .header-right {
-    display: flex;
-    align-items: center;
-  }
+.link {
+  display: flex;
+  margin-top: 20rpx;
 
-  .action-btn {
-    background: #ffde02;
-    border: none;
-    border-radius: 50%;
-    width: px2rpx(32);
-    height: px2rpx(32);
+  .btn {
     display: flex;
     align-items: center;
     justify-content: center;
-    padding: 0;
-    margin: 0;
-
-    &:after {
-      border: none;
-    }
-  }
-
-  /* 余额区域 */
-  .balance-content {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    gap: 16rpx;
-  }
-
-  .balance-main {
-    display: flex;
-    align-items: baseline;
-    flex-wrap: wrap;
+    height: px2rpx(35);
+    margin: 0 px2rpx(10);
   }
+}
 
-  .balance-amount {
-    font-size: px2rpx(20);
-    font-weight: 700;
-    line-height: 1;
-  }
+.qrCode {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 16rpx;
+}
 
-  .balance-decimal {
-    font-size: px2rpx(16);
-    font-weight: 500;
-    line-height: 1;
-  }
-
-  .balance-currency {
-    font-size: px2rpx(16);
-    font-weight: 500;
-  }
-
-  .total-earnings {
+.mam-card {
+  .add-mam-btn {
     display: flex;
+    background-color: var(--color-error);
     align-items: center;
-    gap: 5px;
-    color: rgba(20, 29, 34, 0.6);
-    font-size: px2rpx(12);
-  }
-
-  .total-value {
-    align-self: flex-end;
-  }
-
-  /* 合作伙伴卡片 */
-  .partner-content {
-    display: flex;
-    flex-direction: column;
-    gap: 12px;
-  }
-
-  .link-area {
-    display: flex;
-    flex-wrap: wrap;
-    justify-content: space-around;
-    align-items: center;
-    gap: 12px;
-  }
-
-  .link-btn {
+    gap: 8rpx;
     height: px2rpx(32);
-    background-color: rgb(108, 133, 149);
     line-height: px2rpx(32);
-    color: var(--color-white);
-    border-radius: px2rpx(16);
-    font-size: px2rpx(14);
+    padding: 0 px2rpx(12);
     margin: 0;
   }
-
-  .code-content {
-    display: flex;
-    justify-content: center;
-  }
-
-  .code-input {
-    width: 50%;
-    max-width: px2rpx(178);
-    margin-right: px2rpx(20);
-  }
-
-  .custom-content {
-    display: flex;
-    justify-content: space-around;
-    flex-wrap: wrap;
-
-    .con {
-      cursor: pointer;
-      text-align: center;
-      font-size: px2rpx(16);
-      margin: 5px;
-    }
-
-    .num {
-      font-weight: bold;
-    }
-
-    .des {
-      margin-top: px2rpx(5);
-
-    }
-  }
-
-  .dia-content {
-    padding: 20rpx;
-  }
-
-  .content {
-    display: flex;
-    flex-direction: column;
-    gap: 20rpx;
-  }
-
-  .label {
-    font-weight: 500;
-    margin-bottom: 8rpx;
-  }
-
-  .btn {
-    margin-top: 16rpx;
-    text-align: center;
-  }
-
-  .crm-cursor {
-    cursor: pointer;
-  }
-
-  .link {
-    display: flex;
-    margin-top: 20rpx;
-
-    .btn {
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      height: px2rpx(35);
-      margin: 0 px2rpx(10);
-    }
-  }
-
-  .qrCode {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    gap: 16rpx;
-  }
-
-  .mam-card {
-    .add-mam-btn {
-      display: flex;
-      background-color: var(--color-error);
-      align-items: center;
-      gap: 8rpx;
-      height: px2rpx(32);
-      line-height: px2rpx(32);
-      padding: 0 px2rpx(12);
-      margin: 0;
-    }
-  }
-
-  .mam-line {
-    display: flex;
-    justify-content: center;
-    gap: 6rpx;
-    line-height: 1.5;
-  }
-
-  .mam-ops {
-    display: flex;
-    flex-wrap: wrap;
-    justify-content: center;
-    gap: 10rpx;
-  }
-
-  .mam-op {
-    color: #2b5aed;
-    font-size: px2rpx(12);
-    line-height: 1.4;
-  }
+}
+
+.mam-line {
+  display: flex;
+  justify-content: center;
+  gap: 6rpx;
+  line-height: 1.5;
+}
+
+.mam-ops {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: center;
+  gap: 10rpx;
+}
+
+.mam-op {
+  color: #2b5aed;
+  font-size: px2rpx(12);
+  line-height: 1.4;
+}
 </style>

+ 31 - 57
pages/ib/openAccount.vue

@@ -21,54 +21,38 @@
           <text>{{ t('Ib.NewAccount.Title1') }}</text>
         </view>
         <view class="des">{{ t('Ib.NewAccount.Des1') }}</view>
-        
+
         <view class="b-card">
           <uni-forms ref="formRef" :model="params" :rules="rules" label-position="top">
             <uni-row :gutter="20">
               <uni-col :xs="24" :sm="12" :md="8">
                 <uni-forms-item :label="t('Ib.NewAccount.Platform')" name="platform" required>
-                  <cwg-combox 
-                    v-model:value="params.platform" 
-                    :options="[{ text: 'MT4', value: 'MT4' }]" 
-                    :placeholder="t('placeholder.choose')" 
-                  />
+                  <cwg-combox v-model:value="params.platform" :options="[{ text: 'MT4', value: 'MT4' }]"
+                    :placeholder="t('placeholder.choose')" />
                 </uni-forms-item>
               </uni-col>
               <uni-col :xs="24" :sm="12" :md="8">
                 <uni-forms-item :label="t('Ib.NewAccount.LoginType')" name="accountType" required>
-                  <cwg-combox 
-                    v-model:value="params.accountType" 
-                    :options="accountTypeOptions" 
-                    :placeholder="t('placeholder.choose')" 
-                    @change="onAccountTypeChange"
-                  />
+                  <cwg-combox v-model:value="params.accountType" :options="accountTypeOptions"
+                    :placeholder="t('placeholder.choose')" @change="onAccountTypeChange" />
                 </uni-forms-item>
               </uni-col>
               <uni-col :xs="24" :sm="12" :md="8">
                 <uni-forms-item :label="t('Ib.NewAccount.Lever')" name="leverage" required>
-                  <cwg-combox 
-                    v-model:value="params.leverage" 
-                    :options="formatOptions(optionsLev)" 
-                    :placeholder="t('placeholder.choose')" 
-                  />
+                  <cwg-combox v-model:value="params.leverage" :options="formatOptions(optionsLev)"
+                    :placeholder="t('placeholder.choose')" />
                 </uni-forms-item>
               </uni-col>
               <uni-col :xs="24" :sm="12" :md="8">
                 <uni-forms-item :label="t('Ib.NewAccount.Currency')" name="currency" required>
-                  <cwg-combox 
-                    v-model:value="params.currency" 
-                    :options="formatOptions(optionsCur)" 
-                    :placeholder="t('placeholder.choose')" 
-                  />
+                  <cwg-combox v-model:value="params.currency" :options="formatOptions(optionsCur)"
+                    :placeholder="t('placeholder.choose')" />
                 </uni-forms-item>
               </uni-col>
               <uni-col :xs="24" :sm="12" :md="8">
                 <uni-forms-item :label="t('Ib.NewAccount.Commission')" name="commission" required>
-                  <cwg-combox 
-                    v-model:value="params.commission" 
-                    :options="formatOptions(optionsCom)" 
-                    :placeholder="t('placeholder.choose')" 
-                  />
+                  <cwg-combox v-model:value="params.commission" :options="formatOptions(optionsCom)"
+                    :placeholder="t('placeholder.choose')" />
                 </uni-forms-item>
               </uni-col>
               <uni-col :span="24">
@@ -96,11 +80,8 @@
         <view style="margin: 20px 0; font-size: 14px; line-height: 1.7;">
           <view>
             <text>{{ t('Ib.NewAccount.Dec5') }}</text>
-            <text 
-              class="crm-cursor" 
-              style="color: #368FEC;" 
-              @click="openLeverageMargin"
-            >{{ t('Ib.NewAccount.Dec6') }}</text>
+            <text class="crm-cursor" style="color: #368FEC;" @click="openLeverageMargin">{{ t('Ib.NewAccount.Dec6')
+            }}</text>
             <text>{{ t('Ib.NewAccount.Dec7') }}</text>
           </view>
         </view>
@@ -108,15 +89,8 @@
     </view>
 
     <!-- 提交结果弹窗 -->
-    <cwg-popup 
-      :visible="dialogCheck" 
-      :showClose="false" 
-      :showFooters="true"
-      :confirmText="t('Btn.Confirm')"
-      :cancelText="t('Btn.Cancel')"
-      @confirm="closeDia"
-      @close="closeDia"
-    >
+    <cwg-popup :visible="dialogCheck" :showClose="false" :showFooters="true" :confirmText="t('Btn.Confirm')"
+      :cancelText="t('Btn.Cancel')" @confirm="closeDia" @close="closeDia">
       <view class="result-dialog">
         <view v-if="dialogVisible" class="icon-wrap">
           <cwg-icon name="icon_success" :size="50" color="#67C23A" />
@@ -180,8 +154,8 @@ const rules = {
 // 是否全部类型被隐藏
 const isAllLoginTypesHidden = computed(() => {
   const hiddenStr = showLogin.value.join(',')
-  return hiddenStr.includes('1') && hiddenStr.includes('2') && hiddenStr.includes('3') && 
-         hiddenStr.includes('6') && hiddenStr.includes('7') && hiddenStr.includes('8')
+  return hiddenStr.includes('1') && hiddenStr.includes('2') && hiddenStr.includes('3') &&
+    hiddenStr.includes('6') && hiddenStr.includes('7') && hiddenStr.includes('8')
 })
 
 // 动态计算下拉类型选项
@@ -206,7 +180,7 @@ const onAccountTypeChange = (type: number) => {
   params.leverage = ''
   params.currency = ''
   params.commission = ''
-  
+
   const target = showData.value.find(item => item.type == type)
   if (target) {
     optionsLev.value = target.leverage || []
@@ -286,7 +260,7 @@ const backIndex = () => {
 
 const openLeverageMargin = () => {
   const url = ['cn', 'zhHant'].includes(local.value)
-    ? 'https://www.cwgvu.com/cn/leveragemargin' 
+    ? 'https://www.cwgvu.com/cn/leveragemargin'
     : 'https://www.cwgvu.com/en/leveragemargin'
   // #ifdef H5
   window.open(url, '_blank')
@@ -314,9 +288,9 @@ onLoad((options: any) => {
   display: flex;
   align-items: center;
   font-size: px2rpx(14);
-  color: #333;
+  color: var(--bs-heading-color);
   cursor: pointer;
-  
+
   text {
     margin-left: px2rpx(5);
   }
@@ -332,25 +306,25 @@ onLoad((options: any) => {
   background-color: #fff;
   border-radius: px2rpx(4);
   margin-bottom: px2rpx(20);
-  
+
   .tit {
     display: flex;
     align-items: center;
     font-size: px2rpx(16);
     font-weight: bold;
     margin-bottom: px2rpx(10);
-    
+
     text {
       margin-left: px2rpx(5);
     }
   }
-  
+
   .des {
     font-size: px2rpx(14);
     font-weight: bold;
     line-height: 1.5;
     margin-bottom: px2rpx(20);
-    color: #333;
+    color: var(--bs-heading-color);
   }
 }
 
@@ -371,30 +345,30 @@ onLoad((options: any) => {
 .result-dialog {
   text-align: center;
   padding: px2rpx(20);
-  
+
   .icon-wrap {
     margin-bottom: px2rpx(20);
   }
-  
+
   .result-text {
     font-size: px2rpx(16);
     font-weight: bold;
     margin-top: px2rpx(20);
     margin-bottom: px2rpx(10);
   }
-  
+
   .result-sub-text {
     font-size: px2rpx(12);
-    color: #666;
+    color: var(--bs-heading-color);
     margin-bottom: px2rpx(20);
   }
-  
+
   .dialog-footer {
     display: flex;
     justify-content: center;
     gap: px2rpx(15);
     margin-top: px2rpx(30);
-    
+
     button {
       min-width: px2rpx(100);
       margin: 0;

+ 20 - 36
pages/ib/openPammManager.vue

@@ -13,34 +13,25 @@
       <view class="box">
         <view class="tit"></view>
         <view class="des">{{ t('Ib.PammManager.tips4') }}</view>
-        
+
         <view class="b-card">
           <uni-forms ref="formRef" label-width="120" :model="params" :rules="rules" label-position="top">
             <uni-row :gutter="20">
               <uni-col :xs="24" :sm="12">
                 <uni-forms-item :label="t('Ib.PammManager.accountId')" name="accountId" required>
-                  <cwg-combox 
-                    v-model:value="params.accountId" 
-                    :options="accountIdOptions" 
-                    :placeholder="t('placeholder.choose')" 
-                  />
+                  <cwg-combox v-model:value="params.accountId" :options="accountIdOptions"
+                    :placeholder="t('placeholder.choose')" />
                 </uni-forms-item>
               </uni-col>
               <uni-col :xs="24" :sm="12">
                 <uni-forms-item :label="t('Ib.PammManager.ownerId')" name="ownerId" required>
-                  <cwg-combox 
-                    v-model:value="params.ownerId" 
-                    :options="ownerIdOptions" 
-                    :placeholder="t('placeholder.choose')" 
-                  />
+                  <cwg-combox v-model:value="params.ownerId" :options="ownerIdOptions"
+                    :placeholder="t('placeholder.choose')" />
                 </uni-forms-item>
               </uni-col>
               <uni-col :xs="24" :sm="12">
                 <uni-forms-item :label="t('Ib.PammManager.percent')" name="percent" required>
-                  <uni-easyinput 
-                    v-model.trim="params.percent" 
-                    :placeholder="t('placeholder.input')" 
-                  />
+                  <uni-easyinput v-model.trim="params.percent" :placeholder="t('placeholder.input')" />
                 </uni-forms-item>
               </uni-col>
               <uni-col :span="24">
@@ -59,15 +50,8 @@
     </view>
 
     <!-- 提交结果弹窗 -->
-    <cwg-popup 
-      :visible="dialogCheck" 
-      :showClose="false" 
-      :showFooters="true"
-      :confirmText="t('Btn.Confirm')"
-      :cancelText="t('Btn.Cancel')"
-      @confirm="handleDialogAction"
-      @close="handleDialogAction"
-    >
+    <cwg-popup :visible="dialogCheck" :showClose="false" :showFooters="true" :confirmText="t('Btn.Confirm')"
+      :cancelText="t('Btn.Cancel')" @confirm="handleDialogAction" @close="handleDialogAction">
       <view class="result-dialog">
         <view v-if="dialogVisible" class="icon-wrap">
           <cwg-icon name="icon_success" :size="50" color="#67C23A" />
@@ -246,9 +230,9 @@ onLoad((options: any) => {
   display: flex;
   align-items: center;
   font-size: px2rpx(14);
-  color: #333;
+  color: var(--bs-heading-color);
   cursor: pointer;
-  
+
   text {
     margin-left: px2rpx(5);
   }
@@ -264,25 +248,25 @@ onLoad((options: any) => {
   background-color: #fff;
   border-radius: px2rpx(4);
   margin-bottom: px2rpx(20);
-  
+
   .tit {
     display: flex;
     align-items: center;
     font-size: px2rpx(16);
     font-weight: bold;
     margin-bottom: px2rpx(10);
-    
+
     text {
       margin-left: px2rpx(5);
     }
   }
-  
+
   .des {
     font-size: px2rpx(14);
     font-weight: bold;
     line-height: 1.5;
     margin-bottom: px2rpx(20);
-    color: #333;
+    color: var(--bs-heading-color);
   }
 }
 
@@ -298,30 +282,30 @@ onLoad((options: any) => {
 .result-dialog {
   text-align: center;
   padding: px2rpx(20);
-  
+
   .icon-wrap {
     margin-bottom: px2rpx(20);
   }
-  
+
   .result-text {
     font-size: px2rpx(16);
     font-weight: bold;
     margin-top: px2rpx(20);
     margin-bottom: px2rpx(10);
   }
-  
+
   .result-sub-text {
     font-size: px2rpx(12);
-    color: #666;
+    color: var(--bs-heading-color);
     margin-bottom: px2rpx(20);
   }
-  
+
   .dialog-footer {
     display: flex;
     justify-content: center;
     gap: px2rpx(15);
     margin-top: px2rpx(30);
-    
+
     button {
       min-width: px2rpx(100);
       margin: 0;

+ 8 - 8
pages/ib/promotion.vue

@@ -205,7 +205,7 @@ const logoList = ref([
     padding: px2rpx(8) px2rpx(16);
     border-radius: px2rpx(4);
     font-size: px2rpx(14);
-    color: #333;
+    color: var(--bs-heading-color);
   }
 
   .sort-group {
@@ -218,7 +218,7 @@ const logoList = ref([
     .sort-item {
       padding: px2rpx(8) px2rpx(16);
       font-size: px2rpx(14);
-      color: #666;
+      color: var(--bs-heading-color);
       border-right: 1px solid #e4e7ed;
       cursor: pointer;
 
@@ -229,7 +229,7 @@ const logoList = ref([
       &.active {
         background-color: #f5f5f5;
         font-weight: 500;
-        color: #333;
+        color: var(--bs-heading-color);
       }
     }
   }
@@ -309,13 +309,13 @@ const logoList = ref([
     .info-title {
       font-size: px2rpx(16);
       font-weight: bold;
-      color: #333;
+      color: var(--bs-heading-color);
       margin-bottom: px2rpx(8);
     }
 
     .info-desc {
       font-size: px2rpx(13);
-      color: #666;
+      color: var(--bs-heading-color);
       line-height: 1.5;
       margin-bottom: px2rpx(12);
     }
@@ -338,11 +338,11 @@ const logoList = ref([
       }
 
       .label {
-        color: #999;
+        color: var(--bs-heading-color);
       }
 
       .value {
-        color: #333;
+        color: var(--bs-heading-color);
         font-weight: 500;
         text-align: right;
 
@@ -378,7 +378,7 @@ const logoList = ref([
       margin: 0;
       border-radius: px2rpx(4);
       background-color: #f5f5f5;
-      color: #333;
+      color: var(--bs-heading-color);
       border: none;
 
       &::after {

+ 1 - 1
pages/ib/settingPammManager.vue

@@ -278,7 +278,7 @@ onLoad((options: any) => {
   display: flex;
   align-items: center;
   font-size: px2rpx(14);
-  color: #333;
+  color: var(--bs-heading-color);
   cursor: pointer;
 
   text {

+ 3 - 3
pages/login/index.vue

@@ -1215,7 +1215,7 @@ button {
   text-align: center;
   border-bottom: 0.1rem solid transparent;
   font-weight: 500;
-  color: #333;
+  color: var(--bs-heading-color);
   cursor: pointer;
   transition: all 0.3s ease;
 
@@ -1245,7 +1245,7 @@ button {
 
   li {
     font-size: px2rpx(12);
-    color: #999;
+    color: var(--bs-heading-color);
     line-height: px2rpx(20);
     position: relative;
     padding-left: px2rpx(16);
@@ -1259,7 +1259,7 @@ button {
       width: px2rpx(6);
       height: px2rpx(6);
       border-radius: 50%;
-      background-color: #999;
+      background-color: var(--bs-heading-color);
     }
 
     &.fit {

+ 3 - 3
pages/login/regist.vue

@@ -628,7 +628,7 @@ onMounted(() => {
 
   li {
     font-size: px2rpx(12);
-    color: #999;
+    color: var(--bs-heading-color);
     line-height: px2rpx(20);
     position: relative;
     padding-left: px2rpx(16);
@@ -642,7 +642,7 @@ onMounted(() => {
       width: px2rpx(6);
       height: px2rpx(6);
       border-radius: 50%;
-      background-color: #999;
+      background-color: var(--bs-heading-color);
     }
 
     &.fit {
@@ -1111,7 +1111,7 @@ onMounted(() => {
 .or-title {
   font-size: px2rpx(16);
   line-height: 1.5;
-  color: #333;
+  color: var(--bs-heading-color);
   font-weight: 500;
   text-align: center;
   margin: px2rpx(20) 0 px2rpx(18) 0;

+ 2 - 2
pages/login/reset.vue

@@ -218,7 +218,7 @@ function handleLogin() {
 
 .form-label {
   font-size: px2rpx(14);
-  color: #333;
+  color: var(--bs-heading-color);
   margin-bottom: px2rpx(8);
 }
 
@@ -267,7 +267,7 @@ function handleLogin() {
     border-radius: px2rpx(22);
     background-color: var(--color-white);
     border: 1px solid #e4e4e4;
-    color: #333;
+    color: var(--bs-heading-color);
     font-size: px2rpx(16);
     font-weight: 500;
     margin: 0;

+ 33 - 31
pages/mine/components/BankInfoTab.vue

@@ -24,30 +24,30 @@
                                         </view>
                                     </uni-col>
                                     <uni-col :xs="24" :sm="24" :md="16" :lg="16" :xl="16">
-                                      <view class="actions">
-                                        <view class="bank-actions">
-                                          <view class="action-btn bg-secondary" v-if="item.authStatus == 0"
-                                                type="primary" v-t="'State.ToCertified'"
-                                                @click="doReady(item.id, item)" />
-                                          <view class="action-btn bg-secondary" v-if="item.authStatus == 0"
-                                                type="primary" @click="openCardDialog(item.id, item)"
-                                                v-t="'PersonalManagement.CardVerify.Title'" />
+                                        <view class="actions">
+                                            <view class="bank-actions">
+                                                <view class="action-btn bg-secondary" v-if="item.authStatus == 0"
+                                                    type="primary" v-t="'State.ToCertified'"
+                                                    @click="doReady(item.id, item)" />
+                                                <view class="action-btn bg-secondary" v-if="item.authStatus == 0"
+                                                    type="primary" @click="openCardDialog(item.id, item)"
+                                                    v-t="'PersonalManagement.CardVerify.Title'" />
 
+                                            </view>
+                                            <view class="bank-actions">
+                                                <view class="action-btn bg-secondary"
+                                                    v-if="!editingId && item.authStatus !== 1" @tap="startEdit(item)"
+                                                    v-t="'Btn.Editor'" />
+                                                <template v-if="editingId === item.id">
+                                                    <view class="action-btn bg-secondary" @tap="saveBank(item)"
+                                                        v-t="'Btn.Save'" />
+                                                    <view class="action-btn bg-secondary" @tap="cancelEdit()"
+                                                        v-t="'Btn.Cancel'" />
+                                                </template>
+                                                <view class="action-btn delete" @tap="confirmDelete(item)"
+                                                    v-t="'Btn.Delete'" />
+                                            </view>
                                         </view>
-                                        <view class="bank-actions">
-                                          <view class="action-btn bg-secondary"
-                                                v-if="!editingId && item.authStatus !== 1" @tap="startEdit(item)"
-                                                v-t="'Btn.Editor'" />
-                                          <template v-if="editingId === item.id">
-                                            <view class="action-btn bg-secondary" @tap="saveBank(item)"
-                                                  v-t="'Btn.Save'" />
-                                            <view class="action-btn bg-secondary" @tap="cancelEdit()"
-                                                  v-t="'Btn.Cancel'" />
-                                          </template>
-                                          <view class="action-btn delete" @tap="confirmDelete(item)"
-                                                v-t="'Btn.Delete'" />
-                                        </view>
-                                      </view>
 
                                     </uni-col>
                                 </uni-row>
@@ -128,10 +128,11 @@
                             <uni-row class="demo-uni-row">
                                 <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
                                     <uni-forms-item>
-                                        <cwg-file-picker-wrapper v-model="item.bankFront" :editable="editingId === item.id"
-                                            :limit="1" uploadUrl="/custom/bank/upload" :baseUrl="updateUrl"
-                                            :imageWidth="150" :imageHeight="150" uploadText="点击上传" replaceText="点击替换"
-                                            noImageText="暂无图片" :showPreviewDelete="editingId === item.id"
+                                        <cwg-file-picker-wrapper v-model="item.bankFront"
+                                            :editable="editingId === item.id" :limit="1" uploadUrl="/custom/bank/upload"
+                                            :baseUrl="updateUrl" :imageWidth="150" :imageHeight="150" uploadText="点击上传"
+                                            replaceText="点击替换" noImageText="暂无图片"
+                                            :showPreviewDelete="editingId === item.id"
                                             @update:modelValue="(val) => handleFileUpdate(val, item, 'bankFront')" />
                                     </uni-forms-item>
                                 </uni-col>
@@ -839,10 +840,11 @@ onMounted(() => {
                 color: #1f2937;
                 margin-bottom: px2rpx(20);
             }
-          .actions{
-            display: flex;
-            flex-direction: column;
-          }
+
+            .actions {
+                display: flex;
+                flex-direction: column;
+            }
 
             .bank-actions {
                 display: flex;
@@ -1053,7 +1055,7 @@ onMounted(() => {
                 justify-content: center;
                 background: #f5f5f5;
                 border-radius: px2rpx(8);
-                color: #999;
+                color: var(--bs-heading-color);
                 font-size: px2rpx(24);
                 border: 1px solid #e5e7eb;
             }

+ 4 - 4
pages/mine/improveImmediately.vue

@@ -1704,7 +1704,7 @@ onUnmounted(() => {
 .des {
   margin: px2rpx(5) 0;
   font-size: px2rpx(14);
-  color: #666;
+  color: var(--bs-heading-color);
 }
 
 .dian1 {
@@ -1804,7 +1804,7 @@ onUnmounted(() => {
 
   .des2 {
     font-size: px2rpx(14);
-    color: #666;
+    color: var(--bs-heading-color);
     margin-bottom: px2rpx(30);
   }
 
@@ -1841,7 +1841,7 @@ onUnmounted(() => {
   cwg-icon {
     font-size: px2rpx(40);
     margin-bottom: px2rpx(10);
-    color: #999;
+    color: var(--bs-heading-color);
   }
 
   .name {
@@ -1851,7 +1851,7 @@ onUnmounted(() => {
 
   .back {
     font-size: px2rpx(12);
-    color: #999;
+    color: var(--bs-heading-color);
   }
 }
 </style>

+ 128 - 61
static/scss/global/global.scss

@@ -143,60 +143,127 @@
 
 
     // 新的
-    color-scheme: dark;
-    --bs-body-color: #8c96a9;
-    --bs-body-color-rgb: 140, 150, 169;
-    --bs-body-bg: #282b44;
-    --bs-body: #282b44;
-    --bs-body-bg-rgb: 40, 43, 68;
-    --bs-emphasis-color: #ffffff;
-    --bs-emphasis-color-rgb: 255, 255, 255;
-    --bs-secondary-color: rgba(140, 150, 169, 0.75);
-    --bs-secondary-color-rgb: 140, 150, 169;
-    --bs-secondary-bg: #26283e;
-    --bs-secondary-bg-rgb: 38, 40, 62;
-    --bs-tertiary-color: rgba(140, 150, 169, 0.5);
-    --bs-tertiary-color-rgb: 140, 150, 169;
-    --bs-tertiary-bg: #26283e;
-    --bs-tertiary-bg-rgb: 38, 40, 62;
-    --bs-secondary-text-emphasis: #83a6ff;
-    --bs-secondary-text-emphasis: #ffb370;
-    --bs-success-text-emphasis: #7ad0b2;
-    --bs-info-text-emphasis: #67d2fc;
-    --bs-warning-text-emphasis: #fed679;
-    --bs-danger-text-emphasis: #ff8c77;
-    --bs-light-text-emphasis: #888bb2;
-    --bs-dark-text-emphasis: #999999;
-    --bs-secondary-bg-subtle: #0a1533;
-    --bs-secondary-bg-subtle: #331a03;
-    --bs-success-bg-subtle: #072319;
-    --bs-info-bg-subtle: #002432;
-    --bs-warning-bg-subtle: #332506;
-    --bs-danger-bg-subtle: #330d06;
-    --bs-light-bg-subtle: #1a1c31;
-    --bs-dark-bg-subtle: #10101d;
-    --bs-secondary-border-subtle: #1d4099;
-    --bs-secondary-border-subtle: #994d0a;
-    --bs-success-border-subtle: #146a4c;
-    --bs-info-border-subtle: #016c96;
-    --bs-warning-border-subtle: #987013;
-    --bs-danger-border-subtle: #992611;
-    --bs-light-border-subtle: #484c83;
-    --bs-dark-border-subtle: #494949;
-    --bs-heading-color: #fff;
-    --bs-link-color: #83a6ff;
-    --bs-link-hover-color: #9cb8ff;
-    --bs-link-color-rgb: 131, 166, 255;
-    --bs-link-hover-color-rgb: 156, 184, 255;
-    --bs-code-color: #e685b5;
-    --bs-highlight-color: #8c96a9;
-    --bs-highlight-bg: #664d03;
-    --bs-border-color: #3a3b4d;
-    --bs-border-color-translucent: rgba(255, 255, 255, 0.15);
-    --bs-form-valid-color: #75b798;
-    --bs-form-valid-border-color: #75b798;
-    --bs-form-invalid-color: #ea868f;
-    --bs-form-invalid-border-color: #ea868f;
+    --bs-blue: #0d6efd;
+    --bs-indigo: #6610f2;
+    --bs-purple: #6f42c1;
+    --bs-pink: #d63384;
+    --bs-red: #dc3545;
+    --bs-orange: #fd7e14;
+    --bs-yellow: #ffc107;
+    --bs-green: #198754;
+    --bs-teal: #20c997;
+    --bs-cyan: #0dcaf0;
+    --bs-black: #000;
+    --bs-white: #ffffff;
+    --bs-gray: #6c757d;
+    --bs-gray-dark: #343a40;
+    --bs-gray-100: #f8f9fa;
+    --bs-gray-200: #e9ecef;
+    --bs-gray-300: #dee2e6;
+    --bs-gray-400: #ced4da;
+    --bs-gray-500: #adb5bd;
+    --bs-gray-600: #6c757d;
+    --bs-gray-700: #495057;
+    --bs-gray-800: #343a40;
+    --bs-gray-900: #212529;
+    --bs-secondary: #316AFF;
+    --bs-secondary: #FF8110;
+    --bs-success: #22B07E;
+    --bs-info: #02B4FA;
+    --bs-warning: #FDBB1F;
+    --bs-danger: #FF401C;
+    --bs-light: #ECF2FD;
+    --bs-dark: #0C243C;
+    --bs-white: #ffffff;
+    --bs-gray: #97A1C0;
+    --bs-secondary-rgb: 49, 106, 255;
+    --bs-secondary-rgb: 255, 129, 16;
+    --bs-success-rgb: 34, 176, 126;
+    --bs-info-rgb: 2, 180, 250;
+    --bs-warning-rgb: 253, 187, 31;
+    --bs-danger-rgb: 255, 64, 28;
+    --bs-light-rgb: 236, 242, 253;
+    --bs-dark-rgb: 12, 36, 60;
+    --bs-white-rgb: 255, 255, 255;
+    --bs-gray-rgb: 151, 161, 192;
+    --bs-secondary-text-emphasis: #142a66;
+    --bs-secondary-text-emphasis: #663406;
+    --bs-success-text-emphasis: #0e4632;
+    --bs-info-text-emphasis: #014864;
+    --bs-warning-text-emphasis: #654b0c;
+    --bs-danger-text-emphasis: #661a0b;
+    --bs-light-text-emphasis: #495057;
+    --bs-dark-text-emphasis: #495057;
+    --bs-secondary-bg-subtle: #eaf0ff;
+    --bs-secondary-bg-subtle: #fff2e7;
+    --bs-success-bg-subtle: #e9f7f2;
+    --bs-info-bg-subtle: #e6f8ff;
+    --bs-warning-bg-subtle: #fff8e9;
+    --bs-danger-bg-subtle: #ffece8;
+    --bs-light-bg-subtle: #fcfcfd;
+    --bs-dark-bg-subtle: #ced4da;
+    --bs-secondary-border-subtle: #ccdaff;
+    --bs-secondary-border-subtle: #ffe0c3;
+    --bs-success-border-subtle: #c8ebdf;
+    --bs-info-border-subtle: #c0ecfe;
+    --bs-warning-border-subtle: #ffeec7;
+    --bs-danger-border-subtle: #ffcfc6;
+    --bs-light-border-subtle: #e9ecef;
+    --bs-dark-border-subtle: #adb5bd;
+    --bs-white-rgb: 255, 255, 255;
+    --bs-black-rgb: 0, 0, 0;
+    --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+    --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+    --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
+    --bs-body-font-family: "Plus Jakarta Sans", sans-serif;
+    --bs-body-font-size: 0.875rem;
+    --bs-body-font-weight: 500;
+    --bs-body-line-height: 1.6;
+    --bs-body-color: #97A1C0;
+    --bs-body-color-rgb: 151, 161, 192;
+    --bs-body-bg: #fff;
+    --bs-body-bg-rgb: 255, 255, 255;
+    --bs-emphasis-color: #000;
+    --bs-emphasis-color-rgb: 0, 0, 0;
+    --bs-secondary-color: rgba(151, 161, 192, 0.75);
+    --bs-secondary-color-rgb: 151, 161, 192;
+    --bs-secondary-bg: #f9f9f9;
+    --bs-secondary-bg-rgb: 249, 249, 249;
+    --bs-tertiary-color: rgba(151, 161, 192, 0.5);
+    --bs-tertiary-color-rgb: 151, 161, 192;
+    --bs-tertiary-bg: #f8f9fa;
+    --bs-tertiary-bg-rgb: 248, 249, 250;
+    --bs-heading-color: #0C243C;
+    --bs-link-color: #316AFF;
+    --bs-link-color-rgb: 49, 106, 255;
+    --bs-link-decoration: none;
+    --bs-link-hover-color: #2755cc;
+    --bs-link-hover-color-rgb: 39, 85, 204;
+    --bs-code-color: #d63384;
+    --bs-highlight-color: #97A1C0;
+    --bs-highlight-bg: #fff3cd;
+    --bs-border-width: 1px;
+    --bs-border-style: solid;
+    --bs-border-color: #E8EBF1;
+    --bs-border-color-translucent: rgba(0, 0, 0, 0.1);
+    --bs-border-radius: 0.375rem;
+    --bs-border-radius-sm: 0.25rem;
+    --bs-border-radius-lg: 0.625rem;
+    --bs-border-radius-xl: 1rem;
+    --bs-border-radius-xxl: 2rem;
+    --bs-border-radius-2xl: var(--bs-border-radius-xxl);
+    --bs-border-radius-pill: 50rem;
+    --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+    --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
+    --bs-box-shadow-lg: 0 0.26rem 1.126rem 0 rgba(45, 42, 60, 0.15);
+    --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
+    --bs-focus-ring-width: 0.1rem;
+    --bs-focus-ring-opacity: 0.25;
+    --bs-focus-ring-color: rgba(49, 106, 255, 0.25);
+    --bs-form-valid-color: #22B07E;
+    --bs-form-valid-border-color: #22B07E;
+    --bs-form-invalid-color: #FF401C;
+    --bs-form-invalid-border-color: #FF401C;
 }
 
 .dark {
@@ -522,11 +589,11 @@ body {
     overflow: visible;
 }
 
-uni-left-window,
-uni-top-window {
-    --bs-bg-opacity: 1;
-    background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;
-}
+// uni-left-window,
+// uni-top-window {
+//     --bs-bg-opacity: 1;
+//     background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;
+// }
 
 uni-left-window {
     position: fixed;
@@ -1659,7 +1726,7 @@ uni-content.collapsed {
 
     .cancel-btn {
         background-color: #f5f5f5;
-        color: #666;
+        color: var(--bs-heading-color);
 
         &:active {
             background-color: #e8e8e8;
@@ -1701,7 +1768,7 @@ uni-content.collapsed {
 
         &.default {
             background-color: #f5f5f5;
-            color: #666;
+            color: var(--bs-heading-color);
         }
     }
 }

+ 2 - 2
uni.scss

@@ -28,7 +28,7 @@ $uni-color-warning: #f0ad4e;
 $uni-color-error: #dd524d;
 
 /* 文字基本颜色 */
-$uni-text-color: #333; //基本色
+$uni-text-color: var(--bs-heading-color); //基本色
 $uni-text-color-inverse: #fff; //反色
 $uni-text-color-grey: #999; //辅助灰色,如加载更多的提示信息
 $uni-text-color-placeholder: #808080;
@@ -80,4 +80,4 @@ $uni-font-size-title: 20px;
 $uni-color-subtitle: #555555; // 二级标题颜色
 $uni-font-size-subtitle: 26px;
 $uni-color-paragraph: #3F536E; // 文章段落颜色
-$uni-font-size-paragraph: 15px;
+$uni-font-size-paragraph: 15px;

+ 2 - 2
uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue

@@ -18,7 +18,7 @@
 				</view>
 				<picker mode="date" :value="date" fields="month" @change="bindDateChange">
 					<text class="uni-calendar__header-text">{{ (nowDate.year || '') + ' / ' + (nowDate.month || '')
-						}}</text>
+					}}</text>
 				</picker>
 				<view class="uni-calendar__header-btn-box" @click.stop="next">
 					<view class="uni-calendar__header-btn uni-calendar--right"></view>
@@ -373,7 +373,7 @@ export default {
 <style lang="scss" scoped>
 $uni-bg-color-mask: rgba($color: #000000, $alpha: 0.4);
 $uni-border-color: #EDEDED;
-$uni-text-color: #333;
+$uni-text-color: var(--bs-heading-color);
 $uni-bg-color-hover: #f1f1f1;
 $uni-font-size-base: 14px;
 $uni-text-color-placeholder: #808080;

+ 1 - 1
uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue

@@ -296,7 +296,7 @@ export default {
 			/* #endif */
 			&.is-disabled {
 				.uni-collapse-item__title-text {
-					color: #999;
+					color: var(--bs-heading-color);
 				}
 			}
 

+ 1 - 1
uni_modules/uni-combox/components/uni-combox/uni-combox.vue

@@ -201,7 +201,7 @@ export default {
 
 .uni-combox__input-plac {
 	font-size: 14px;
-	color: #999;
+	color: var(--bs-heading-color);
 }
 
 .uni-combox__selector {

+ 245 - 243
uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue

@@ -1,278 +1,280 @@
 <template>
 	<view class="uni-countdown">
 		<text v-if="showDay" :style="[timeStyle]" class="uni-countdown__number">{{ d }}</text>
-		<text v-if="showDay" :style="[splitorStyle]" class="uni-countdown__splitor">{{dayText}}</text>
+		<text v-if="showDay" :style="[splitorStyle]" class="uni-countdown__splitor">{{ dayText }}</text>
 		<text v-if="showHour" :style="[timeStyle]" class="uni-countdown__number">{{ h }}</text>
-		<text v-if="showHour" :style="[splitorStyle]" class="uni-countdown__splitor">{{ showColon ? ':' : hourText }}</text>
+		<text v-if="showHour" :style="[splitorStyle]" class="uni-countdown__splitor">{{ showColon ? ':' : hourText
+			}}</text>
 		<text v-if="showMinute" :style="[timeStyle]" class="uni-countdown__number">{{ i }}</text>
-		<text v-if="showMinute" :style="[splitorStyle]" class="uni-countdown__splitor">{{ showColon ? ':' : minuteText }}</text>
+		<text v-if="showMinute" :style="[splitorStyle]" class="uni-countdown__splitor">{{ showColon ? ':' : minuteText
+			}}</text>
 		<text :style="[timeStyle]" class="uni-countdown__number">{{ s }}</text>
-		<text v-if="!showColon" :style="[splitorStyle]" class="uni-countdown__splitor">{{secondText}}</text>
+		<text v-if="!showColon" :style="[splitorStyle]" class="uni-countdown__splitor">{{ secondText }}</text>
 	</view>
 </template>
 <script>
-	import {
-		initVueI18n
-	} from '@dcloudio/uni-i18n'
-	import messages from './i18n/index.js'
-	const {
-		t
-	} = initVueI18n(messages)
-	/**
-	 * Countdown 倒计时
-	 * @description 倒计时组件
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=25
-	 * @property {String} backgroundColor 背景色
-	 * @property {String} color 文字颜色
-	 * @property {Number} day 天数
-	 * @property {Number} hour 小时
-	 * @property {Number} minute 分钟
-	 * @property {Number} second 秒
-	 * @property {Number} timestamp 时间戳
-	 * @property {Boolean} showDay = [true|false] 是否显示天数
-	 * @property {Boolean} showHour = [true|false] 是否显示小时
-	 * @property {Boolean} showMinute = [true|false] 是否显示分钟
-	 * @property {Boolean} show-colon = [true|false] 是否以冒号为分隔符
-	 * @property {String} splitorColor 分割符号颜色
-	 * @event {Function} timeup 倒计时时间到触发事件
-	 * @example <uni-countdown :day="1" :hour="1" :minute="12" :second="40"></uni-countdown>
-	 */
-	export default {
-		name: 'UniCountdown',
-		emits: ['timeup'],
-		props: {
-			showDay: {
-				type: Boolean,
-				default: true
-			},
-			showHour: {
-				type: Boolean,
-				default: true
-			},
-			showMinute: {
-				type: Boolean,
-				default: true
-			},
-			showColon: {
-				type: Boolean,
-				default: true
-			},
-			start: {
-				type: Boolean,
-				default: true
-			},
-			backgroundColor: {
-				type: String,
-				default: ''
-			},
-			color: {
-				type: String,
-				default: '#333'
-			},
-			fontSize: {
-				type: Number,
-				default: 14
-			},
-			splitorColor: {
-				type: String,
-				default: '#333'
-			},
-			day: {
-				type: Number,
-				default: 0
-			},
-			hour: {
-				type: Number,
-				default: 0
-			},
-			minute: {
-				type: Number,
-				default: 0
-			},
-			second: {
-				type: Number,
-				default: 0
-			},
-			timestamp: {
-				type: Number,
-				default: 0
-			},
-			filterShow : {
-				type:Object,
-				default () {
-					return {}
-				}
+import {
+	initVueI18n
+} from '@dcloudio/uni-i18n'
+import messages from './i18n/index.js'
+const {
+	t
+} = initVueI18n(messages)
+/**
+ * Countdown 倒计时
+ * @description 倒计时组件
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=25
+ * @property {String} backgroundColor 背景色
+ * @property {String} color 文字颜色
+ * @property {Number} day 天数
+ * @property {Number} hour 小时
+ * @property {Number} minute 分钟
+ * @property {Number} second 秒
+ * @property {Number} timestamp 时间戳
+ * @property {Boolean} showDay = [true|false] 是否显示天数
+ * @property {Boolean} showHour = [true|false] 是否显示小时
+ * @property {Boolean} showMinute = [true|false] 是否显示分钟
+ * @property {Boolean} show-colon = [true|false] 是否以冒号为分隔符
+ * @property {String} splitorColor 分割符号颜色
+ * @event {Function} timeup 倒计时时间到触发事件
+ * @example <uni-countdown :day="1" :hour="1" :minute="12" :second="40"></uni-countdown>
+ */
+export default {
+	name: 'UniCountdown',
+	emits: ['timeup'],
+	props: {
+		showDay: {
+			type: Boolean,
+			default: true
+		},
+		showHour: {
+			type: Boolean,
+			default: true
+		},
+		showMinute: {
+			type: Boolean,
+			default: true
+		},
+		showColon: {
+			type: Boolean,
+			default: true
+		},
+		start: {
+			type: Boolean,
+			default: true
+		},
+		backgroundColor: {
+			type: String,
+			default: ''
+		},
+		color: {
+			type: String,
+			default: '#333'
+		},
+		fontSize: {
+			type: Number,
+			default: 14
+		},
+		splitorColor: {
+			type: String,
+			default: '#333'
+		},
+		day: {
+			type: Number,
+			default: 0
+		},
+		hour: {
+			type: Number,
+			default: 0
+		},
+		minute: {
+			type: Number,
+			default: 0
+		},
+		second: {
+			type: Number,
+			default: 0
+		},
+		timestamp: {
+			type: Number,
+			default: 0
+		},
+		filterShow: {
+			type: Object,
+			default() {
+				return {}
 			}
+		}
+	},
+	data() {
+		return {
+			timer: null,
+			syncFlag: false,
+			d: '00',
+			h: '00',
+			i: '00',
+			s: '00',
+			leftTime: 0,
+			seconds: 0
+		}
+	},
+	computed: {
+		dayText() {
+			return t("uni-countdown.day")
+		},
+		hourText(val) {
+			return t("uni-countdown.h")
+		},
+		minuteText(val) {
+			return t("uni-countdown.m")
 		},
-		data() {
+		secondText(val) {
+			return t("uni-countdown.s")
+		},
+		timeStyle() {
+			const {
+				color,
+				backgroundColor,
+				fontSize
+			} = this
 			return {
-				timer: null,
-				syncFlag: false,
-				d: '00',
-				h: '00',
-				i: '00',
-				s: '00',
-				leftTime: 0,
-				seconds: 0
+				color,
+				backgroundColor,
+				fontSize: `${fontSize}px`,
+				width: `${fontSize * 22 / 14}px`, // 按字体大小为 14px 时的比例缩放
+				lineHeight: `${fontSize * 20 / 14}px`,
+				borderRadius: `${fontSize * 3 / 14}px`,
 			}
 		},
-		computed: {
-			dayText() {
-				return t("uni-countdown.day")
-			},
-			hourText(val) {
-				return t("uni-countdown.h")
-			},
-			minuteText(val) {
-				return t("uni-countdown.m")
-			},
-			secondText(val) {
-				return t("uni-countdown.s")
-			},
-			timeStyle() {
-				const {
-					color,
-					backgroundColor,
-					fontSize
-				} = this
-				return {
-					color,
-					backgroundColor,
-					fontSize: `${fontSize}px`,
-					width: `${fontSize * 22 / 14}px`, // 按字体大小为 14px 时的比例缩放
- 					lineHeight: `${fontSize * 20 / 14}px`,
-					borderRadius: `${fontSize * 3 / 14}px`,
-				}
-			},
-			splitorStyle() {
-				const { splitorColor, fontSize, backgroundColor } = this
-				return {
-					color: splitorColor,
-					fontSize: `${fontSize * 12 / 14}px`,
-					margin: backgroundColor ? `${fontSize * 4 / 14}px` : ''
-				}
+		splitorStyle() {
+			const { splitorColor, fontSize, backgroundColor } = this
+			return {
+				color: splitorColor,
+				fontSize: `${fontSize * 12 / 14}px`,
+				margin: backgroundColor ? `${fontSize * 4 / 14}px` : ''
 			}
+		}
+	},
+	watch: {
+		day(val) {
+			this.changeFlag()
+		},
+		hour(val) {
+			this.changeFlag()
 		},
-		watch: {
-			day(val) {
-				this.changeFlag()
-			},
-			hour(val) {
-				this.changeFlag()
-			},
-			minute(val) {
-				this.changeFlag()
-			},
-			second(val) {
-				this.changeFlag()
-			},
-			start: {
-				immediate: true,
-				handler(newVal, oldVal) {
-					if (newVal) {
-						this.startData();
-					} else {
-						if (!oldVal) return
-						clearInterval(this.timer)
-					}
+		minute(val) {
+			this.changeFlag()
+		},
+		second(val) {
+			this.changeFlag()
+		},
+		start: {
+			immediate: true,
+			handler(newVal, oldVal) {
+				if (newVal) {
+					this.startData();
+				} else {
+					if (!oldVal) return
+					clearInterval(this.timer)
 				}
+			}
 
+		}
+	},
+	created: function (e) {
+		this.seconds = this.toSeconds(this.timestamp, this.day, this.hour, this.minute, this.second)
+		this.countDown()
+	},
+	// #ifndef VUE3
+	destroyed() {
+		clearInterval(this.timer)
+	},
+	// #endif
+	// #ifdef VUE3
+	unmounted() {
+		clearInterval(this.timer)
+	},
+	// #endif
+	methods: {
+		toSeconds(timestamp, day, hours, minutes, seconds) {
+			if (timestamp) {
+				return timestamp - parseInt(new Date().getTime() / 1000, 10)
 			}
+			return day * 60 * 60 * 24 + hours * 60 * 60 + minutes * 60 + seconds
 		},
-		created: function(e) {
-			this.seconds = this.toSeconds(this.timestamp, this.day, this.hour, this.minute, this.second)
-			this.countDown()
-		},
-		// #ifndef VUE3
-		destroyed() {
+		timeUp() {
 			clearInterval(this.timer)
+			this.$emit('timeup')
 		},
-		// #endif
-		// #ifdef VUE3
-		unmounted() {
-			clearInterval(this.timer)
+		countDown() {
+			let seconds = this.seconds
+			let [day, hour, minute, second] = [0, 0, 0, 0]
+			if (seconds > 0) {
+				day = Math.floor(seconds / (60 * 60 * 24))
+				hour = Math.floor(seconds / (60 * 60)) - (day * 24)
+				minute = Math.floor(seconds / 60) - (day * 24 * 60) - (hour * 60)
+				second = Math.floor(seconds) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60)
+			} else {
+				this.timeUp()
+			}
+			this.d = String(day).padStart(this.validFilterShow(this.filterShow.d), '0')
+			this.h = String(hour).padStart(this.validFilterShow(this.filterShow.h), '0')
+			this.i = String(minute).padStart(this.validFilterShow(this.filterShow.m), '0')
+			this.s = String(second).padStart(this.validFilterShow(this.filterShow.s), '0')
 		},
-		// #endif
-		methods: {
-			toSeconds(timestamp, day, hours, minutes, seconds) {
-				if (timestamp) {
-					return timestamp - parseInt(new Date().getTime() / 1000, 10)
-				}
-				return day * 60 * 60 * 24 + hours * 60 * 60 + minutes * 60 + seconds
-			},
-			timeUp() {
-				clearInterval(this.timer)
-				this.$emit('timeup')
-			},
-			countDown() {
-				let seconds = this.seconds
-				let [day, hour, minute, second] = [0, 0, 0, 0]
-				if (seconds > 0) {
-					day = Math.floor(seconds / (60 * 60 * 24))
-					hour = Math.floor(seconds / (60 * 60)) - (day * 24)
-					minute = Math.floor(seconds / 60) - (day * 24 * 60) - (hour * 60)
-					second = Math.floor(seconds) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60)
-				} else {
+		validFilterShow(filter) {
+			return (filter && filter > 0) ? filter : 2;
+		},
+		startData() {
+			this.seconds = this.toSeconds(this.timestamp, this.day, this.hour, this.minute, this.second)
+			if (this.seconds <= 0) {
+				this.seconds = this.toSeconds(0, 0, 0, 0, 0)
+				this.countDown()
+				return
+			}
+			clearInterval(this.timer)
+			this.countDown()
+			this.timer = setInterval(() => {
+				this.seconds--
+				if (this.seconds < 0) {
 					this.timeUp()
-				}
-				this.d  = String(day).padStart(this.validFilterShow(this.filterShow.d), '0')
-				this.h = String(hour).padStart(this.validFilterShow(this.filterShow.h), '0')
-				this.i = String(minute).padStart(this.validFilterShow(this.filterShow.m), '0')
-				this.s = String(second).padStart(this.validFilterShow(this.filterShow.s), '0')
-			},
-			validFilterShow(filter){
-				return (filter && filter > 0) ? filter : 2;
-			},
-			startData() {
-				this.seconds = this.toSeconds(this.timestamp, this.day, this.hour, this.minute, this.second)
-				if (this.seconds <= 0) {
-					this.seconds = this.toSeconds(0, 0, 0, 0, 0)
-					this.countDown()
 					return
-				}
-				clearInterval(this.timer)
-				this.countDown()
-				this.timer = setInterval(() => {
-					this.seconds--
-					if (this.seconds < 0) {
-						this.timeUp()
-						return
-					}
-					this.countDown()
-				}, 1000)
-			},
-			update(){
-				this.startData();
-			},
-			changeFlag() {
-				if (!this.syncFlag) {
-					this.seconds = this.toSeconds(this.timestamp, this.day, this.hour, this.minute, this.second)
-					this.startData();
-					this.syncFlag = true;
 				}
+				this.countDown()
+			}, 1000)
+		},
+		update() {
+			this.startData();
+		},
+		changeFlag() {
+			if (!this.syncFlag) {
+				this.seconds = this.toSeconds(this.timestamp, this.day, this.hour, this.minute, this.second)
+				this.startData();
+				this.syncFlag = true;
 			}
 		}
 	}
+}
 </script>
 <style lang="scss" scoped>
-	$font-size: 14px;
+$font-size: 14px;
 
-	.uni-countdown {
-		display: flex;
-		flex-direction: row;
-		justify-content: flex-start;
-		align-items: center;
+.uni-countdown {
+	display: flex;
+	flex-direction: row;
+	justify-content: flex-start;
+	align-items: center;
 
-		&__splitor {
-			margin: 0 2px;
-			font-size: $font-size;
-			color: #333;
-		}
+	&__splitor {
+		margin: 0 2px;
+		font-size: $font-size;
+		color: var(--bs-heading-color);
+	}
 
-		&__number {
-			border-radius: 3px;
-			text-align: center;
-			font-size: $font-size;
-		}
+	&__number {
+		border-radius: 3px;
+		text-align: center;
+		font-size: $font-size;
 	}
-</style>
+}
+</style>

+ 6 - 6
uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue

@@ -482,7 +482,7 @@ $disable: 0.4;
 	align-items: center;
 	height: 36px;
 	padding-left: 10px;
-	color: #999;
+	color: var(--bs-heading-color);
 }
 
 .uni-data-checklist {
@@ -523,7 +523,7 @@ $disable: 0.4;
 
 				.checklist-text {
 					font-size: 14px;
-					color: #666;
+					color: var(--bs-heading-color);
 					margin-left: 5px;
 					line-height: 14px;
 				}
@@ -629,7 +629,7 @@ $disable: 0.4;
 					}
 
 					.checklist-text {
-						color: #999;
+						color: var(--bs-heading-color);
 					}
 				}
 
@@ -708,7 +708,7 @@ $disable: 0.4;
 					}
 
 					.checklist-text {
-						color: #999;
+						color: var(--bs-heading-color);
 					}
 				}
 
@@ -755,7 +755,7 @@ $disable: 0.4;
 
 				.checklist-text {
 					margin: 0;
-					color: #666;
+					color: var(--bs-heading-color);
 				}
 
 				// 禁用
@@ -804,7 +804,7 @@ $disable: 0.4;
 					}
 
 					.checklist-text {
-						color: #999;
+						color: var(--bs-heading-color);
 					}
 				}
 

+ 2 - 2
uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue

@@ -251,7 +251,7 @@
 
   .text-color {
     font-size: 14px;
-    color: #333;
+    color: var(--bs-heading-color);
   }
 
   .placeholder {
@@ -334,7 +334,7 @@
   .dialog-close-plus {
     width: 16px;
     height: 2px;
-    background-color: #666;
+    background-color: var(--bs-heading-color);
     border-radius: 2px;
     transform: rotate(45deg);
   }

+ 2 - 2
uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue

@@ -364,7 +364,7 @@ export default {
 }
 
 .text-color {
-  color: #333;
+  color: var(--bs-heading-color);
 }
 
 .placeholder {
@@ -476,7 +476,7 @@ export default {
 .dialog-close-plus {
   width: 16px;
   height: 2px;
-  background-color: #666;
+  background-color: var(--bs-heading-color);
   border-radius: 2px;
   transform: rotate(45deg);
 }

+ 160 - 159
uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue

@@ -1,177 +1,178 @@
 <template>
 	<view class="uni-calendar-item__weeks-box" :class="{
-		'uni-calendar-item--disable':weeks.disable,
-		'uni-calendar-item--before-checked-x':weeks.beforeMultiple,
+		'uni-calendar-item--disable': weeks.disable,
+		'uni-calendar-item--before-checked-x': weeks.beforeMultiple,
 		'uni-calendar-item--multiple': weeks.multiple,
-		'uni-calendar-item--after-checked-x':weeks.afterMultiple,
-		}" @click="choiceDate(weeks)" @mouseenter="handleMousemove(weeks)">
+		'uni-calendar-item--after-checked-x': weeks.afterMultiple,
+	}" @click="choiceDate(weeks)" @mouseenter="handleMousemove(weeks)">
 		<view class="uni-calendar-item__weeks-box-item" :class="{
-				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && (calendar.userChecked || !checkHover),
-				'uni-calendar-item--checked-range-text': checkHover,
-				'uni-calendar-item--before-checked':weeks.beforeMultiple,
-				'uni-calendar-item--multiple': weeks.multiple,
-				'uni-calendar-item--after-checked':weeks.afterMultiple,
-				'uni-calendar-item--disable':weeks.disable,
-				}">
+			'uni-calendar-item--checked': calendar.fullDate === weeks.fullDate && (calendar.userChecked || !checkHover),
+			'uni-calendar-item--checked-range-text': checkHover,
+			'uni-calendar-item--before-checked': weeks.beforeMultiple,
+			'uni-calendar-item--multiple': weeks.multiple,
+			'uni-calendar-item--after-checked': weeks.afterMultiple,
+			'uni-calendar-item--disable': weeks.disable,
+		}">
 			<text v-if="selected && weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text>
-			<text class="uni-calendar-item__weeks-box-text uni-calendar-item__weeks-box-text-disable uni-calendar-item--checked-text">{{weeks.date}}</text>
+			<text
+				class="uni-calendar-item__weeks-box-text uni-calendar-item__weeks-box-text-disable uni-calendar-item--checked-text">{{ weeks.date }}</text>
 		</view>
-		<view :class="{'uni-calendar-item--today': weeks.isToday}"></view>
+		<view :class="{ 'uni-calendar-item--today': weeks.isToday }"></view>
 	</view>
 </template>
 
 <script>
-	export default {
-		props: {
-			weeks: {
-				type: Object,
-				default () {
-					return {}
-				}
-			},
-			calendar: {
-				type: Object,
-				default: () => {
-					return {}
-				}
-			},
-			selected: {
-				type: Array,
-				default: () => {
-					return []
-				}
-			},
-			checkHover: {
-				type: Boolean,
-				default: false
+export default {
+	props: {
+		weeks: {
+			type: Object,
+			default() {
+				return {}
 			}
 		},
-		methods: {
-			choiceDate(weeks) {
-				this.$emit('change', weeks)
-			},
-			handleMousemove(weeks) {
-				this.$emit('handleMouse', weeks)
+		calendar: {
+			type: Object,
+			default: () => {
+				return {}
 			}
+		},
+		selected: {
+			type: Array,
+			default: () => {
+				return []
+			}
+		},
+		checkHover: {
+			type: Boolean,
+			default: false
+		}
+	},
+	methods: {
+		choiceDate(weeks) {
+			this.$emit('change', weeks)
+		},
+		handleMousemove(weeks) {
+			this.$emit('handleMouse', weeks)
 		}
 	}
+}
 </script>
 
-<style lang="scss" >
-	$uni-primary: #007aff !default;
-
-	.uni-calendar-item__weeks-box {
-		flex: 1;
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: column;
-		justify-content: center;
-		align-items: center;
-		margin: 1px 0;
-		position: relative;
-	}
-
-	.uni-calendar-item__weeks-box-text {
-		font-size: 14px;
-		// font-family: Lato-Bold, Lato;
-		font-weight: bold;
-		color: darken($color: $uni-primary, $amount: 40%);
-	}
-
-	.uni-calendar-item__weeks-box-item {
-		position: relative;
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: column;
-		justify-content: center;
-		align-items: center;
-		width: 40px;
-		height: 40px;
-		/* #ifdef H5 */
-		cursor: pointer;
-		/* #endif */
-	}
-
-
-	.uni-calendar-item__weeks-box-circle {
-		position: absolute;
-		top: 5px;
-		right: 5px;
-		width: 8px;
-		height: 8px;
-		border-radius: 8px;
-		background-color: #dd524d;
-
-	}
-
-	.uni-calendar-item__weeks-box .uni-calendar-item--disable {
-		cursor: default;
-	}
-
-	.uni-calendar-item--disable .uni-calendar-item__weeks-box-text-disable {
-		color: #D1D1D1;
-	}
-
-	.uni-calendar-item--today {
-		position: absolute;
-		top: 10px;
-		right: 17%;
-		background-color: #dd524d;
-		width:6px;
-		height: 6px;
-		border-radius: 50%;
-	}
-
-	.uni-calendar-item--extra {
-		color: #dd524d;
-		opacity: 0.8;
-	}
-
-	.uni-calendar-item__weeks-box .uni-calendar-item--checked {
-		background-color: $uni-primary;
-		border-radius: 50%;
-		box-sizing: border-box;
-		border: 3px solid #fff;
-	}
-
-	.uni-calendar-item--checked .uni-calendar-item--checked-text {
-		color: #fff;
-	}
-
-	.uni-calendar-item--multiple .uni-calendar-item--checked-range-text {
-		color: #333;
-	}
-
-	.uni-calendar-item--multiple {
-		background-color:  #F6F7FC;
-		// color: #fff;
-	}
-
-	.uni-calendar-item--multiple .uni-calendar-item--before-checked,
-	.uni-calendar-item--multiple .uni-calendar-item--after-checked {
-		background-color: $uni-primary;
-		border-radius: 50%;
-		box-sizing: border-box;
-		border: 3px solid #F6F7FC;
-	}
-
-	.uni-calendar-item--before-checked .uni-calendar-item--checked-text,
-	.uni-calendar-item--after-checked .uni-calendar-item--checked-text {
-		color: #fff;
-	}
-
-	.uni-calendar-item--before-checked-x {
-		border-top-left-radius: 50px;
-		border-bottom-left-radius: 50px;
-		box-sizing: border-box;
-		background-color: #F6F7FC;
-	}
-
-	.uni-calendar-item--after-checked-x {
-		border-top-right-radius: 50px;
-		border-bottom-right-radius: 50px;
-		background-color: #F6F7FC;
-	}
+<style lang="scss">
+$uni-primary: #007aff !default;
+
+.uni-calendar-item__weeks-box {
+	flex: 1;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+	margin: 1px 0;
+	position: relative;
+}
+
+.uni-calendar-item__weeks-box-text {
+	font-size: 14px;
+	// font-family: Lato-Bold, Lato;
+	font-weight: bold;
+	color: darken($color: $uni-primary, $amount: 40%);
+}
+
+.uni-calendar-item__weeks-box-item {
+	position: relative;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+	width: 40px;
+	height: 40px;
+	/* #ifdef H5 */
+	cursor: pointer;
+	/* #endif */
+}
+
+
+.uni-calendar-item__weeks-box-circle {
+	position: absolute;
+	top: 5px;
+	right: 5px;
+	width: 8px;
+	height: 8px;
+	border-radius: 8px;
+	background-color: #dd524d;
+
+}
+
+.uni-calendar-item__weeks-box .uni-calendar-item--disable {
+	cursor: default;
+}
+
+.uni-calendar-item--disable .uni-calendar-item__weeks-box-text-disable {
+	color: #D1D1D1;
+}
+
+.uni-calendar-item--today {
+	position: absolute;
+	top: 10px;
+	right: 17%;
+	background-color: #dd524d;
+	width: 6px;
+	height: 6px;
+	border-radius: 50%;
+}
+
+.uni-calendar-item--extra {
+	color: #dd524d;
+	opacity: 0.8;
+}
+
+.uni-calendar-item__weeks-box .uni-calendar-item--checked {
+	background-color: $uni-primary;
+	border-radius: 50%;
+	box-sizing: border-box;
+	border: 3px solid #fff;
+}
+
+.uni-calendar-item--checked .uni-calendar-item--checked-text {
+	color: #fff;
+}
+
+.uni-calendar-item--multiple .uni-calendar-item--checked-range-text {
+	color: var(--bs-heading-color);
+}
+
+.uni-calendar-item--multiple {
+	background-color: #F6F7FC;
+	// color: #fff;
+}
+
+.uni-calendar-item--multiple .uni-calendar-item--before-checked,
+.uni-calendar-item--multiple .uni-calendar-item--after-checked {
+	background-color: $uni-primary;
+	border-radius: 50%;
+	box-sizing: border-box;
+	border: 3px solid #F6F7FC;
+}
+
+.uni-calendar-item--before-checked .uni-calendar-item--checked-text,
+.uni-calendar-item--after-checked .uni-calendar-item--checked-text {
+	color: #fff;
+}
+
+.uni-calendar-item--before-checked-x {
+	border-top-left-radius: 50px;
+	border-bottom-left-radius: 50px;
+	box-sizing: border-box;
+	background-color: #F6F7FC;
+}
+
+.uni-calendar-item--after-checked-x {
+	border-top-right-radius: 50px;
+	border-bottom-right-radius: 50px;
+	background-color: #F6F7FC;
+}
 </style>

+ 4 - 4
uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue

@@ -744,7 +744,7 @@ $uni-primary: #007aff !default;
 	text-align: center;
 	width: 100px;
 	font-size: 15px;
-	color: #666;
+	color: var(--bs-heading-color);
 }
 
 .uni-calendar__button-text {
@@ -841,7 +841,7 @@ $uni-primary: #007aff !default;
 .uni-calendar__box-bg-text {
 	font-size: 200px;
 	font-weight: bold;
-	color: #999;
+	color: var(--bs-heading-color);
 	opacity: 0.1;
 	text-align: center;
 	/* #ifndef APP-NVUE */
@@ -853,7 +853,7 @@ $uni-primary: #007aff !default;
 	padding: 0 10px;
 	// line-height: 50px;
 	text-align: center;
-	color: #333;
+	color: var(--bs-heading-color);
 	border-top-color: #DCDCDC;
 	;
 	border-top-style: solid;
@@ -880,7 +880,7 @@ $uni-primary: #007aff !default;
 }
 
 .uni-date-changed--time-date {
-	color: #999;
+	color: var(--bs-heading-color);
 	line-height: 50px;
 	/* #ifdef MP-TOUTIAO */
 	font-size: 16px;

+ 1 - 1
uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue

@@ -908,7 +908,7 @@ $uni-primary: #007aff !default;
 	position: absolute;
 	top: 53px;
 	/* 减掉 10px 的元素高度,兼容nvue */
-	color: #999;
+	color: var(--bs-heading-color);
 	/* #ifdef APP-NVUE */
 	font-size: 16px;
 	/* #endif */

+ 4 - 4
uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue

@@ -872,7 +872,7 @@ $uni-primary: #007aff !default;
 	justify-content: center;
 	border-radius: 4px;
 	background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;
-	color: #666;
+	color: var(--bs-heading-color);
 	font-size: 14px;
 	flex: 1;
 
@@ -1012,7 +1012,7 @@ $uni-primary: #007aff !default;
 	border-top-width: 1px;
 	line-height: 40px;
 	text-align: right;
-	color: #666;
+	color: var(--bs-heading-color);
 }
 
 .popup-x-footer text:hover {
@@ -1028,7 +1028,7 @@ $uni-primary: #007aff !default;
 
 .uni-date-changed {
 	text-align: center;
-	color: #333;
+	color: var(--bs-heading-color);
 	border-bottom-color: #F1F1F1;
 	border-bottom-style: solid;
 	border-bottom-width: 1px;
@@ -1039,7 +1039,7 @@ $uni-primary: #007aff !default;
 }
 
 .uni-date-changed--time-date {
-	color: #333;
+	color: var(--bs-heading-color);
 	opacity: 0.6;
 }
 

+ 630 - 601
uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue

@@ -1,27 +1,57 @@
 <template>
 	<view class="uni-easyinput" :class="{ 'uni-easyinput-error': msg }" :style="boxStyle">
 		<view class="uni-easyinput__content" :class="inputContentClass" :style="inputContentStyle">
-			<uni-icons v-if="prefixIcon" class="content-clear-icon" :type="prefixIcon" color="#c0c4cc" @click="onClickIcon('prefix')" size="22"></uni-icons>
+			<uni-icons v-if="prefixIcon" class="content-clear-icon" :type="prefixIcon" color="#c0c4cc"
+				@click="onClickIcon('prefix')" size="22"></uni-icons>
 			<slot name="left">
 			</slot>
 			<!-- #ifdef MP-ALIPAY -->
-			<textarea :enableNative="enableNative" v-if="type === 'textarea'" class="uni-easyinput__content-textarea" :class="{ 'input-padding': inputBorder }" :name="name" :value="val" :placeholder="placeholder" :placeholderStyle="placeholderStyle" :disabled="disabled" placeholder-class="uni-easyinput__placeholder-class" :maxlength="inputMaxlength" :focus="focused" :autoHeight="autoHeight" :cursor-spacing="cursorSpacing" :adjust-position="adjustPosition" @input="onInput" @blur="_Blur" @focus="_Focus" @confirm="onConfirm" @keyboardheightchange="onkeyboardheightchange" @wheel.prevent></textarea>
-			<input :enableNative="enableNative" v-else :type="type === 'password' ? 'text' : type" class="uni-easyinput__content-input" :style="inputStyle" :name="name" :value="val" :password="!showPassword && type === 'password'" :placeholder="placeholder" :placeholderStyle="placeholderStyle" placeholder-class="uni-easyinput__placeholder-class" :disabled="disabled" :maxlength="inputMaxlength" :focus="focused" :confirmType="confirmType" :cursor-spacing="cursorSpacing" :adjust-position="adjustPosition" @focus="_Focus" @blur="_Blur" @input="onInput" @confirm="onConfirm" @keyboardheightchange="onkeyboardheightchange" @wheel.prevent />
+			<textarea :enableNative="enableNative" v-if="type === 'textarea'" class="uni-easyinput__content-textarea"
+				:class="{ 'input-padding': inputBorder }" :name="name" :value="val" :placeholder="placeholder"
+				:placeholderStyle="placeholderStyle" :disabled="disabled"
+				placeholder-class="uni-easyinput__placeholder-class" :maxlength="inputMaxlength" :focus="focused"
+				:autoHeight="autoHeight" :cursor-spacing="cursorSpacing" :adjust-position="adjustPosition"
+				@input="onInput" @blur="_Blur" @focus="_Focus" @confirm="onConfirm"
+				@keyboardheightchange="onkeyboardheightchange" @wheel.prevent></textarea>
+			<input :enableNative="enableNative" v-else :type="type === 'password' ? 'text' : type"
+				class="uni-easyinput__content-input" :style="inputStyle" :name="name" :value="val"
+				:password="!showPassword && type === 'password'" :placeholder="placeholder"
+				:placeholderStyle="placeholderStyle" placeholder-class="uni-easyinput__placeholder-class"
+				:disabled="disabled" :maxlength="inputMaxlength" :focus="focused" :confirmType="confirmType"
+				:cursor-spacing="cursorSpacing" :adjust-position="adjustPosition" @focus="_Focus" @blur="_Blur"
+				@input="onInput" @confirm="onConfirm" @keyboardheightchange="onkeyboardheightchange" @wheel.prevent />
 			<!-- #endif -->
 			<!-- #ifndef MP-ALIPAY -->
-			<textarea v-if="type === 'textarea'" class="uni-easyinput__content-textarea" :class="{ 'input-padding': inputBorder }" :name="name" :value="val" :placeholder="placeholder" :placeholderStyle="placeholderStyle" :disabled="disabled" placeholder-class="uni-easyinput__placeholder-class" :maxlength="inputMaxlength" :focus="focused" :autoHeight="autoHeight" :cursor-spacing="cursorSpacing" :adjust-position="adjustPosition" @input="onInput" @blur="_Blur" @focus="_Focus" @confirm="onConfirm" @keyboardheightchange="onkeyboardheightchange" @wheel.prevent></textarea>
-			<input v-else :type="type === 'password' ? 'text' : type" class="uni-easyinput__content-input" :style="inputStyle" :name="name" :value="val" :password="!showPassword && type === 'password'" :placeholder="placeholder" :placeholderStyle="placeholderStyle" placeholder-class="uni-easyinput__placeholder-class" :disabled="disabled" :maxlength="inputMaxlength" :focus="focused" :confirmType="confirmType" :cursor-spacing="cursorSpacing" :adjust-position="adjustPosition" @focus="_Focus" @blur="_Blur" @input="onInput" @confirm="onConfirm" @keyboardheightchange="onkeyboardheightchange" @wheel.prevent />
+			<textarea v-if="type === 'textarea'" class="uni-easyinput__content-textarea"
+				:class="{ 'input-padding': inputBorder }" :name="name" :value="val" :placeholder="placeholder"
+				:placeholderStyle="placeholderStyle" :disabled="disabled"
+				placeholder-class="uni-easyinput__placeholder-class" :maxlength="inputMaxlength" :focus="focused"
+				:autoHeight="autoHeight" :cursor-spacing="cursorSpacing" :adjust-position="adjustPosition"
+				@input="onInput" @blur="_Blur" @focus="_Focus" @confirm="onConfirm"
+				@keyboardheightchange="onkeyboardheightchange" @wheel.prevent></textarea>
+			<input v-else :type="type === 'password' ? 'text' : type" class="uni-easyinput__content-input"
+				:style="inputStyle" :name="name" :value="val" :password="!showPassword && type === 'password'"
+				:placeholder="placeholder" :placeholderStyle="placeholderStyle"
+				placeholder-class="uni-easyinput__placeholder-class" :disabled="disabled" :maxlength="inputMaxlength"
+				:focus="focused" :confirmType="confirmType" :cursor-spacing="cursorSpacing"
+				:adjust-position="adjustPosition" @focus="_Focus" @blur="_Blur" @input="onInput" @confirm="onConfirm"
+				@keyboardheightchange="onkeyboardheightchange" @wheel.prevent />
 			<!-- #endif -->
 
 			<template v-if="type === 'password' && passwordIcon">
 				<!-- 开启密码时显示小眼睛 -->
-				<uni-icons v-if="isVal" class="content-clear-icon" :class="{ 'is-textarea-icon': type === 'textarea' }" :type="showPassword ? 'eye-slash-filled' : 'eye-filled'" :size="22" :color="focusShow ? primaryColor : '#c0c4cc'" @click="onEyes"></uni-icons>
+				<uni-icons v-if="isVal" class="content-clear-icon" :class="{ 'is-textarea-icon': type === 'textarea' }"
+					:type="showPassword ? 'eye-slash-filled' : 'eye-filled'" :size="22"
+					:color="focusShow ? primaryColor : '#c0c4cc'" @click="onEyes"></uni-icons>
 			</template>
 			<template v-if="suffixIcon">
-				<uni-icons v-if="suffixIcon" class="content-clear-icon" :type="suffixIcon" color="#c0c4cc" @click="onClickIcon('suffix')" size="22"></uni-icons>
+				<uni-icons v-if="suffixIcon" class="content-clear-icon" :type="suffixIcon" color="#c0c4cc"
+					@click="onClickIcon('suffix')" size="22"></uni-icons>
 			</template>
 			<template v-else>
-				<uni-icons v-if="clearable && isVal && !disabled && type !== 'textarea'" class="content-clear-icon" :class="{ 'is-textarea-icon': type === 'textarea' }" type="clear" :size="clearSize" :color="msg ? '#dd524d' : focusShow ? primaryColor : '#c0c4cc'" @click="onClear"></uni-icons>
+				<uni-icons v-if="clearable && isVal && !disabled && type !== 'textarea'" class="content-clear-icon"
+					:class="{ 'is-textarea-icon': type === 'textarea' }" type="clear" :size="clearSize"
+					:color="msg ? '#dd524d' : focusShow ? primaryColor : '#c0c4cc'" @click="onClear"></uni-icons>
 			</template>
 			<slot name="right"></slot>
 		</view>
@@ -29,634 +59,633 @@
 </template>
 
 <script>
-	/**
-	 * Easyinput 输入框
-	 * @description 此组件可以实现表单的输入与校验,包括 "text" 和 "textarea" 类型。
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=3455
-	 * @property {String}	value	输入内容
-	 * @property {String }	type	输入框的类型(默认text) password/text/textarea/..
-	 * 	@value text			文本输入键盘
-	 * 	@value textarea	多行文本输入键盘
-	 * 	@value password	密码输入键盘
-	 * 	@value number		数字输入键盘,注意iOS上app-vue弹出的数字键盘并非9宫格方式
-	 * 	@value idcard		身份证输入键盘,信、支付宝、百度、QQ小程序
-	 * 	@value digit		带小数点的数字键盘	,App的nvue页面、微信、支付宝、百度、头条、QQ小程序支持
-	 * @property {Boolean}	clearable	是否显示右侧清空内容的图标控件,点击可清空输入框内容(默认true)
-	 * @property {Boolean}	autoHeight	是否自动增高输入区域,type为textarea时有效(默认true)
-	 * @property {String }	placeholder	输入框的提示文字
-	 * @property {String }	placeholderStyle	placeholder的样式(内联样式,字符串),如"color: #ddd"
-	 * @property {Boolean}	focus	是否自动获得焦点(默认false)
-	 * @property {Boolean}	disabled	是否禁用(默认false)
-	 * @property {Number }	maxlength	最大输入长度,设置为 -1 的时候不限制最大长度(默认140)
-	 * @property {String }	confirmType	设置键盘右下角按钮的文字,仅在type="text"时生效(默认done)
-	 * @property {Number }	clearSize	清除图标的大小,单位px(默认15)
-	 * @property {String}	prefixIcon	输入框头部图标
-	 * @property {String}	suffixIcon	输入框尾部图标
-	 * @property {String}	primaryColor	设置主题色(默认#2979ff)
-	 * @property {Boolean}	trim	是否自动去除两端的空格
-	 * @property {Boolean}	cursorSpacing	指定光标与键盘的距离,单位 px
-	 * @property {Boolean}  ajust-position 当键盘弹起时,是否上推内容,默认值:true
-	 * @value both	去除两端空格
-	 * @value left	去除左侧空格
-	 * @value right	去除右侧空格
-	 * @value start	去除左侧空格
-	 * @value end		去除右侧空格
-	 * @value all		去除全部空格
-	 * @value none	不去除空格
-	 * @property {Boolean}	inputBorder	是否显示input输入框的边框(默认true)
-	 * @property {Boolean}	passwordIcon	type=password时是否显示小眼睛图标
-	 * @property {Object}	styles	自定义颜色
-	 * @event {Function}	input	输入框内容发生变化时触发
-	 * @event {Function}	focus	输入框获得焦点时触发
-	 * @event {Function}	blur	输入框失去焦点时触发
-	 * @event {Function}	confirm	点击完成按钮时触发
-	 * @event {Function}	iconClick	点击图标时触发
-	 * @example <uni-easyinput v-model="mobile"></uni-easyinput>
-	 */
-	function obj2strClass(obj) {
-		let classess = '';
-		for (let key in obj) {
-			const val = obj[key];
-			if (val) {
-				classess += `${key} `;
-			}
+/**
+ * Easyinput 输入框
+ * @description 此组件可以实现表单的输入与校验,包括 "text" 和 "textarea" 类型。
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=3455
+ * @property {String}	value	输入内容
+ * @property {String }	type	输入框的类型(默认text) password/text/textarea/..
+ * 	@value text			文本输入键盘
+ * 	@value textarea	多行文本输入键盘
+ * 	@value password	密码输入键盘
+ * 	@value number		数字输入键盘,注意iOS上app-vue弹出的数字键盘并非9宫格方式
+ * 	@value idcard		身份证输入键盘,信、支付宝、百度、QQ小程序
+ * 	@value digit		带小数点的数字键盘	,App的nvue页面、微信、支付宝、百度、头条、QQ小程序支持
+ * @property {Boolean}	clearable	是否显示右侧清空内容的图标控件,点击可清空输入框内容(默认true)
+ * @property {Boolean}	autoHeight	是否自动增高输入区域,type为textarea时有效(默认true)
+ * @property {String }	placeholder	输入框的提示文字
+ * @property {String }	placeholderStyle	placeholder的样式(内联样式,字符串),如"color: #ddd"
+ * @property {Boolean}	focus	是否自动获得焦点(默认false)
+ * @property {Boolean}	disabled	是否禁用(默认false)
+ * @property {Number }	maxlength	最大输入长度,设置为 -1 的时候不限制最大长度(默认140)
+ * @property {String }	confirmType	设置键盘右下角按钮的文字,仅在type="text"时生效(默认done)
+ * @property {Number }	clearSize	清除图标的大小,单位px(默认15)
+ * @property {String}	prefixIcon	输入框头部图标
+ * @property {String}	suffixIcon	输入框尾部图标
+ * @property {String}	primaryColor	设置主题色(默认#2979ff)
+ * @property {Boolean}	trim	是否自动去除两端的空格
+ * @property {Boolean}	cursorSpacing	指定光标与键盘的距离,单位 px
+ * @property {Boolean}  ajust-position 当键盘弹起时,是否上推内容,默认值:true
+ * @value both	去除两端空格
+ * @value left	去除左侧空格
+ * @value right	去除右侧空格
+ * @value start	去除左侧空格
+ * @value end		去除右侧空格
+ * @value all		去除全部空格
+ * @value none	不去除空格
+ * @property {Boolean}	inputBorder	是否显示input输入框的边框(默认true)
+ * @property {Boolean}	passwordIcon	type=password时是否显示小眼睛图标
+ * @property {Object}	styles	自定义颜色
+ * @event {Function}	input	输入框内容发生变化时触发
+ * @event {Function}	focus	输入框获得焦点时触发
+ * @event {Function}	blur	输入框失去焦点时触发
+ * @event {Function}	confirm	点击完成按钮时触发
+ * @event {Function}	iconClick	点击图标时触发
+ * @example <uni-easyinput v-model="mobile"></uni-easyinput>
+ */
+function obj2strClass(obj) {
+	let classess = '';
+	for (let key in obj) {
+		const val = obj[key];
+		if (val) {
+			classess += `${key} `;
 		}
-		return classess;
 	}
-
-	function obj2strStyle(obj) {
-		let style = '';
-		for (let key in obj) {
-			const val = obj[key];
-			style += `${key}:${val};`;
-		}
-		return style;
+	return classess;
+}
+
+function obj2strStyle(obj) {
+	let style = '';
+	for (let key in obj) {
+		const val = obj[key];
+		style += `${key}:${val};`;
 	}
-	export default {
-		name: 'uni-easyinput',
-		emits: [
-			'click',
-			'iconClick',
-			'update:modelValue',
-			'input',
-			'focus',
-			'blur',
-			'confirm',
-			'clear',
-			'eyes',
-			'change',
-			'keyboardheightchange'
-		],
-		model: {
-			prop: 'modelValue',
-			event: 'update:modelValue'
-		},
-		options: {
-			// #ifdef MP-TOUTIAO
-			virtualHost: false,
-			// #endif
-			// #ifndef MP-TOUTIAO
-			virtualHost: true
-			// #endif
-		},
-		inject: {
-			form: {
-				from: 'uniForm',
-				default: null
-			},
-			formItem: {
-				from: 'uniFormItem',
-				default: null
+	return style;
+}
+export default {
+	name: 'uni-easyinput',
+	emits: [
+		'click',
+		'iconClick',
+		'update:modelValue',
+		'input',
+		'focus',
+		'blur',
+		'confirm',
+		'clear',
+		'eyes',
+		'change',
+		'keyboardheightchange'
+	],
+	model: {
+		prop: 'modelValue',
+		event: 'update:modelValue'
+	},
+	options: {
+		// #ifdef MP-TOUTIAO
+		virtualHost: false,
+		// #endif
+		// #ifndef MP-TOUTIAO
+		virtualHost: true
+		// #endif
+	},
+	inject: {
+		form: {
+			from: 'uniForm',
+			default: null
+		},
+		formItem: {
+			from: 'uniFormItem',
+			default: null
+		}
+	},
+	props: {
+		name: String,
+		value: [Number, String],
+		modelValue: [Number, String],
+		type: {
+			type: String,
+			default: 'text'
+		},
+		clearable: {
+			type: Boolean,
+			default: true
+		},
+		autoHeight: {
+			type: Boolean,
+			default: false
+		},
+		placeholder: {
+			type: String,
+			default: ' '
+		},
+		placeholderStyle: String,
+		focus: {
+			type: Boolean,
+			default: false
+		},
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		maxlength: {
+			type: [Number, String],
+			default: 140
+		},
+		confirmType: {
+			type: String,
+			default: 'done'
+		},
+		clearSize: {
+			type: [Number, String],
+			default: 24
+		},
+		inputBorder: {
+			type: Boolean,
+			default: true
+		},
+		prefixIcon: {
+			type: String,
+			default: ''
+		},
+		suffixIcon: {
+			type: String,
+			default: ''
+		},
+		trim: {
+			type: [Boolean, String],
+			default: false
+		},
+		cursorSpacing: {
+			type: Number,
+			default: 0
+		},
+		passwordIcon: {
+			type: Boolean,
+			default: true
+		},
+		adjustPosition: {
+			type: Boolean,
+			default: true
+		},
+		primaryColor: {
+			type: String,
+			default: '#2979ff'
+		},
+		styles: {
+			type: Object,
+			default() {
+				return {
+					color: '#333',
+					backgroundColor: '#fff',
+					disableColor: '#F7F6F6',
+					borderColor: '#e5e5e5'
+				};
 			}
 		},
-		props: {
-			name: String,
-			value: [Number, String],
-			modelValue: [Number, String],
-			type: {
-				type: String,
-				default: 'text'
-			},
-			clearable: {
-				type: Boolean,
-				default: true
-			},
-			autoHeight: {
-				type: Boolean,
-				default: false
-			},
-			placeholder: {
-				type: String,
-				default: ' '
-			},
-			placeholderStyle: String,
-			focus: {
-				type: Boolean,
-				default: false
-			},
-			disabled: {
-				type: Boolean,
-				default: false
-			},
-			maxlength: {
-				type: [Number, String],
-				default: 140
-			},
-			confirmType: {
-				type: String,
-				default: 'done'
-			},
-			clearSize: {
-				type: [Number, String],
-				default: 24
-			},
-			inputBorder: {
-				type: Boolean,
-				default: true
-			},
-			prefixIcon: {
-				type: String,
-				default: ''
-			},
-			suffixIcon: {
-				type: String,
-				default: ''
-			},
-			trim: {
-				type: [Boolean, String],
-				default: false
-			},
-			cursorSpacing: {
-				type: Number,
-				default: 0
-			},
-			passwordIcon: {
-				type: Boolean,
-				default: true
-			},
-			adjustPosition: {
-				type: Boolean,
-				default: true
-			},
-			primaryColor: {
-				type: String,
-				default: '#2979ff'
-			},
-			styles: {
-				type: Object,
-				default () {
-					return {
-						color: '#333',
-						backgroundColor: '#fff',
-						disableColor: '#F7F6F6',
-						borderColor: '#e5e5e5'
-					};
-				}
-			},
-			errorMessage: {
-				type: [String, Boolean],
-				default: ''
-			},
-			// #ifdef MP-ALIPAY
-			enableNative: {
-				type: Boolean,
-				default: false
+		errorMessage: {
+			type: [String, Boolean],
+			default: ''
+		},
+		// #ifdef MP-ALIPAY
+		enableNative: {
+			type: Boolean,
+			default: false
+		}
+		// #endif
+	},
+	data() {
+		return {
+			focused: false,
+			val: '',
+			showMsg: '',
+			border: false,
+			isFirstBorder: false,
+			showClearIcon: false,
+			showPassword: false,
+			focusShow: false,
+			localMsg: '',
+			isEnter: false // 用于判断当前是否是使用回车操作
+		};
+	},
+	computed: {
+		// 输入框内是否有值
+		isVal() {
+			const val = this.val;
+			// fixed by mehaotian 处理值为0的情况,字符串0不在处理范围
+			if (val || val === 0) {
+				return true;
 			}
-			// #endif
-		},
-		data() {
-			return {
-				focused: false,
-				val: '',
-				showMsg: '',
-				border: false,
-				isFirstBorder: false,
-				showClearIcon: false,
-				showPassword: false,
-				focusShow: false,
-				localMsg: '',
-				isEnter: false // 用于判断当前是否是使用回车操作
-			};
-		},
-		computed: {
-			// 输入框内是否有值
-			isVal() {
-				const val = this.val;
-				// fixed by mehaotian 处理值为0的情况,字符串0不在处理范围
-				if (val || val === 0) {
-					return true;
-				}
-				return false;
-			},
-
-			msg() {
-				// console.log('computed', this.form, this.formItem);
-				// if (this.form) {
-				// 	return this.errorMessage || this.formItem.errMsg;
-				// }
-				// TODO 处理头条 formItem 中 errMsg 不更新的问题
-				return this.localMsg || this.errorMessage;
-			},
-			// 因为uniapp的input组件的maxlength组件必须要数值,这里转为数值,用户可以传入字符串数值
-			inputMaxlength() {
-				return Number(this.maxlength);
-			},
-
-			// 处理外层样式的style
-			boxStyle() {
-				return `color:${
-					this.inputBorder && this.msg ? '#e43d33' : this.styles.color
+			return false;
+		},
+
+		msg() {
+			// console.log('computed', this.form, this.formItem);
+			// if (this.form) {
+			// 	return this.errorMessage || this.formItem.errMsg;
+			// }
+			// TODO 处理头条 formItem 中 errMsg 不更新的问题
+			return this.localMsg || this.errorMessage;
+		},
+		// 因为uniapp的input组件的maxlength组件必须要数值,这里转为数值,用户可以传入字符串数值
+		inputMaxlength() {
+			return Number(this.maxlength);
+		},
+
+		// 处理外层样式的style
+		boxStyle() {
+			return `color:${this.inputBorder && this.msg ? '#e43d33' : this.styles.color
 				};`;
-			},
-			// input 内容的类和样式处理
-			inputContentClass() {
-				return obj2strClass({
-					'is-input-border': this.inputBorder,
-					'is-input-error-border': this.inputBorder && this.msg,
-					'is-textarea': this.type === 'textarea',
-					'is-disabled': this.disabled,
-					'is-focused': this.focusShow
-				});
-			},
-			inputContentStyle() {
-				const focusColor = this.focusShow ?
-					this.primaryColor :
-					this.styles.borderColor;
-				const borderColor =
-					this.inputBorder && this.msg ? '#dd524d' : focusColor;
-				return obj2strStyle({
-					'border-color': borderColor || '#e5e5e5',
-					'background-color': this.disabled ?
-						this.styles.disableColor : this.styles.backgroundColor
-				});
-			},
-			// input右侧样式
-			inputStyle() {
-				const paddingRight =
-					this.type === 'password' || this.clearable || this.prefixIcon ?
+		},
+		// input 内容的类和样式处理
+		inputContentClass() {
+			return obj2strClass({
+				'is-input-border': this.inputBorder,
+				'is-input-error-border': this.inputBorder && this.msg,
+				'is-textarea': this.type === 'textarea',
+				'is-disabled': this.disabled,
+				'is-focused': this.focusShow
+			});
+		},
+		inputContentStyle() {
+			const focusColor = this.focusShow ?
+				this.primaryColor :
+				this.styles.borderColor;
+			const borderColor =
+				this.inputBorder && this.msg ? '#dd524d' : focusColor;
+			return obj2strStyle({
+				'border-color': borderColor || '#e5e5e5',
+				'background-color': this.disabled ?
+					this.styles.disableColor : this.styles.backgroundColor
+			});
+		},
+		// input右侧样式
+		inputStyle() {
+			const paddingRight =
+				this.type === 'password' || this.clearable || this.prefixIcon ?
 					'' :
 					'10px';
-				return obj2strStyle({
-					'padding-right': paddingRight,
-					'padding-left': this.prefixIcon ? '' : '10px'
-				});
-			}
-		},
-		watch: {
-			value(newVal) {
-				// fix by mehaotian 解决 值为null的情况下,input报错的bug
-				if (newVal === null) {
-					this.val = '';
-					return
-				}
-				this.val = newVal;
-			},
-			modelValue(newVal) {
-				if (newVal === null) {
-					this.val = '';
-					return
-				}
-				this.val = newVal;
-			},
-			focus(newVal) {
-				this.$nextTick(() => {
-					this.focused = this.focus;
-					this.focusShow = this.focus;
-				});
+			return obj2strStyle({
+				'padding-right': paddingRight,
+				'padding-left': this.prefixIcon ? '' : '10px'
+			});
+		}
+	},
+	watch: {
+		value(newVal) {
+			// fix by mehaotian 解决 值为null的情况下,input报错的bug
+			if (newVal === null) {
+				this.val = '';
+				return
 			}
+			this.val = newVal;
 		},
-		created() {
-			this.init();
-			// TODO 处理头条vue3 computed 不监听 inject 更改的问题(formItem.errMsg)
-			if (this.form && this.formItem) {
-				this.$watch('formItem.errMsg', newVal => {
-					this.localMsg = newVal;
-				});
+		modelValue(newVal) {
+			if (newVal === null) {
+				this.val = '';
+				return
 			}
+			this.val = newVal;
 		},
-		mounted() {
+		focus(newVal) {
 			this.$nextTick(() => {
 				this.focused = this.focus;
 				this.focusShow = this.focus;
 			});
-		},
-		methods: {
-			/**
-			 * 初始化变量值
-			 */
-			init() {
-				if (this.value || this.value === 0) {
-					this.val = this.value;
-				} else if (
-					this.modelValue ||
-					this.modelValue === 0 ||
-					this.modelValue === ''
-				) {
-					this.val = this.modelValue;
-				} else {
-					// fix by ht 如果初始值为null,则input报错,待框架修复
-					this.val = '';
-				}
-			},
-
-			/**
-			 * 点击图标时触发
-			 * @param {Object} type
-			 */
-			onClickIcon(type) {
-				this.$emit('iconClick', type);
-			},
-
-			/**
-			 * 显示隐藏内容,密码框时生效
-			 */
-			onEyes() {
-				this.showPassword = !this.showPassword;
-				this.$emit('eyes', this.showPassword);
-			},
-
-			/**
-			 * 输入时触发
-			 * @param {Object} event
-			 */
-			onInput(event) {
-				let value = event.detail.value;
-				// 判断是否去除空格
-				if (this.trim) {
-					if (typeof this.trim === 'boolean' && this.trim) {
-						value = this.trimStr(value);
-					}
-					if (typeof this.trim === 'string') {
-						value = this.trimStr(value, this.trim);
-					}
-				}
-				if (this.errMsg) this.errMsg = '';
-				this.val = value;
-				// TODO 兼容 vue3
-				this.$emit('update:modelValue', value);
-
-				// fix by ht input 修改一定要放在 update:modelvalue 后面,避免在input中修改值,导致 v-model 不生效
-				// TODO 兼容 vue2
-				this.$emit('input', value);
-			},
-
-			/**
-			 * 外部调用方法
-			 * 获取焦点时触发
-			 * @param {Object} event
-			 */
-			onFocus() {
-				this.$nextTick(() => {
-					this.focused = true;
-				});
-				this.$emit('focus', null);
-			},
-
-			_Focus(event) {
-				this.focusShow = true;
-				this.$emit('focus', event);
-			},
-
-			/**
-			 * 外部调用方法
-			 * 失去焦点时触发
-			 * @param {Object} event
-			 */
-			onBlur() {
-				this.focused = false;
-				this.$emit('blur', null);
-			},
-			_Blur(event) {
-				let value = event.detail.value;
-				this.focusShow = false;
-				this.$emit('blur', event);
-				// 根据类型返回值,在event中获取的值理论上讲都是string
-				if (this.isEnter === false) {
-					this.$emit('change', this.val);
-				}
-				// 失去焦点时参与表单校验
-				if (this.form && this.formItem) {
-					const { validateTrigger } = this.form;
-					if (validateTrigger === 'blur') {
-						this.formItem.onFieldChange();
-					}
-				}
-			},
-
-			/**
-			 * 按下键盘的发送键
-			 * @param {Object} e
-			 */
-			onConfirm(e) {
-				this.$emit('confirm', this.val);
-				this.isEnter = true;
-				this.$emit('change', this.val);
-				this.$nextTick(() => {
-					this.isEnter = false;
-				});
-			},
-
-			/**
-			 * 清理内容
-			 * @param {Object} event
-			 */
-			onClear(event) {
+		}
+	},
+	created() {
+		this.init();
+		// TODO 处理头条vue3 computed 不监听 inject 更改的问题(formItem.errMsg)
+		if (this.form && this.formItem) {
+			this.$watch('formItem.errMsg', newVal => {
+				this.localMsg = newVal;
+			});
+		}
+	},
+	mounted() {
+		this.$nextTick(() => {
+			this.focused = this.focus;
+			this.focusShow = this.focus;
+		});
+	},
+	methods: {
+		/**
+		 * 初始化变量值
+		 */
+		init() {
+			if (this.value || this.value === 0) {
+				this.val = this.value;
+			} else if (
+				this.modelValue ||
+				this.modelValue === 0 ||
+				this.modelValue === ''
+			) {
+				this.val = this.modelValue;
+			} else {
+				// fix by ht 如果初始值为null,则input报错,待框架修复
 				this.val = '';
-				// TODO 兼容 vue2
-				this.$emit('input', '');
-				// TODO 兼容 vue2
-				// TODO 兼容 vue3
-				this.$emit('update:modelValue', '');
-				// 点击叉号触发
-				this.$emit('clear');
-			},
-
-			/**
-			 * 键盘高度发生变化的时候触发此事件
-			 * 兼容性:微信小程序2.7.0+、App 3.1.0+
-			 * @param {Object} event
-			 */
-			onkeyboardheightchange(event) {
-				this.$emit('keyboardheightchange', event);
-			},
-
-			/**
-			 * 去除空格
-			 */
-			trimStr(str, pos = 'both') {
-				if (pos === 'both') {
-					return str.trim();
-				} else if (pos === 'left') {
-					return str.trimLeft();
-				} else if (pos === 'right') {
-					return str.trimRight();
-				} else if (pos === 'start') {
-					return str.trimStart();
-				} else if (pos === 'end') {
-					return str.trimEnd();
-				} else if (pos === 'all') {
-					return str.replace(/\s+/g, '');
-				} else if (pos === 'none') {
-					return str;
-				}
-				return str;
 			}
-		}
-	};
-</script>
-
-<style lang="scss">
-	$uni-error: #e43d33;
-	$uni-border-1: #dcdfe6 !default;
-
-	.uni-easyinput {
-		/* #ifndef APP-NVUE */
-		width: 100%;
-		/* #endif */
-		flex: 1;
-		position: relative;
-		text-align: left;
-		color: #333;
-		font-size: 14px;
-	}
-
-	.uni-easyinput__content {
-		flex: 1;
-		/* #ifndef APP-NVUE */
-		width: 100%;
-		display: flex;
-		box-sizing: border-box;
-		// min-height: 36px;
-		/* #endif */
-		flex-direction: row;
-		align-items: center;
-		// 处理border动画刚开始显示黑色的问题
-		border-color: #fff;
-		transition-property: border-color;
-		transition-duration: 0.3s;
-	}
-
-	.uni-easyinput__content-input {
-		/* #ifndef APP-NVUE */
-		width: auto;
-		/* #endif */
-		position: relative;
-		overflow: hidden;
-		flex: 1;
-		line-height: 1;
-		font-size: 14px;
-		height: 35px;
-	}
-
-	.uni-easyinput__placeholder-class {
-		color: #999;
-		font-size: 12px;
-		// font-weight: 200;
-	}
-
-	.is-textarea {
-		align-items: flex-start;
-	}
+		},
 
-	.is-textarea-icon {
-		margin-top: 5px;
-	}
+		/**
+		 * 点击图标时触发
+		 * @param {Object} type
+		 */
+		onClickIcon(type) {
+			this.$emit('iconClick', type);
+		},
 
-	.uni-easyinput__content-textarea {
-		position: relative;
-		overflow: hidden;
-		flex: 1;
-		line-height: 1.5;
-		font-size: 14px;
-		margin: 6px;
-		margin-left: 0;
-		height: 80px;
-		min-height: 80px;
-		/* #ifndef APP-NVUE */
-		min-height: 80px;
-		width: auto;
-		/* #endif */
-	}
+		/**
+		 * 显示隐藏内容,密码框时生效
+		 */
+		onEyes() {
+			this.showPassword = !this.showPassword;
+			this.$emit('eyes', this.showPassword);
+		},
 
-	.input-padding {
-		padding-left: 10px;
-	}
+		/**
+		 * 输入时触发
+		 * @param {Object} event
+		 */
+		onInput(event) {
+			let value = event.detail.value;
+			// 判断是否去除空格
+			if (this.trim) {
+				if (typeof this.trim === 'boolean' && this.trim) {
+					value = this.trimStr(value);
+				}
+				if (typeof this.trim === 'string') {
+					value = this.trimStr(value, this.trim);
+				}
+			}
+			if (this.errMsg) this.errMsg = '';
+			this.val = value;
+			// TODO 兼容 vue3
+			this.$emit('update:modelValue', value);
+
+			// fix by ht input 修改一定要放在 update:modelvalue 后面,避免在input中修改值,导致 v-model 不生效
+			// TODO 兼容 vue2
+			this.$emit('input', value);
+		},
 
-	.content-clear-icon {
-		padding: 0 5px;
-	}
+		/**
+		 * 外部调用方法
+		 * 获取焦点时触发
+		 * @param {Object} event
+		 */
+		onFocus() {
+			this.$nextTick(() => {
+				this.focused = true;
+			});
+			this.$emit('focus', null);
+		},
 
-	.label-icon {
-		margin-right: 5px;
-		margin-top: -1px;
-	}
+		_Focus(event) {
+			this.focusShow = true;
+			this.$emit('focus', event);
+		},
 
-	// 显示边框
-	.is-input-border {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		box-sizing: border-box;
-		/* #endif */
-		flex-direction: row;
-		align-items: center;
-		border: 1px solid $uni-border-1;
-		border-radius: 4px;
-		/* #ifdef MP-ALIPAY */
-		overflow: hidden;
-		/* #endif */
-	}
+		/**
+		 * 外部调用方法
+		 * 失去焦点时触发
+		 * @param {Object} event
+		 */
+		onBlur() {
+			this.focused = false;
+			this.$emit('blur', null);
+		},
+		_Blur(event) {
+			let value = event.detail.value;
+			this.focusShow = false;
+			this.$emit('blur', event);
+			// 根据类型返回值,在event中获取的值理论上讲都是string
+			if (this.isEnter === false) {
+				this.$emit('change', this.val);
+			}
+			// 失去焦点时参与表单校验
+			if (this.form && this.formItem) {
+				const { validateTrigger } = this.form;
+				if (validateTrigger === 'blur') {
+					this.formItem.onFieldChange();
+				}
+			}
+		},
 
-	.uni-error-message {
-		position: absolute;
-		bottom: -17px;
-		left: 0;
-		line-height: 12px;
-		color: $uni-error;
-		font-size: 12px;
-		text-align: left;
-	}
+		/**
+		 * 按下键盘的发送键
+		 * @param {Object} e
+		 */
+		onConfirm(e) {
+			this.$emit('confirm', this.val);
+			this.isEnter = true;
+			this.$emit('change', this.val);
+			this.$nextTick(() => {
+				this.isEnter = false;
+			});
+		},
 
-	.uni-error-msg--boeder {
-		position: relative;
-		bottom: 0;
-		line-height: 22px;
-	}
+		/**
+		 * 清理内容
+		 * @param {Object} event
+		 */
+		onClear(event) {
+			this.val = '';
+			// TODO 兼容 vue2
+			this.$emit('input', '');
+			// TODO 兼容 vue2
+			// TODO 兼容 vue3
+			this.$emit('update:modelValue', '');
+			// 点击叉号触发
+			this.$emit('clear');
+		},
 
-	.is-input-error-border {
-		border-color: $uni-error;
+		/**
+		 * 键盘高度发生变化的时候触发此事件
+		 * 兼容性:微信小程序2.7.0+、App 3.1.0+
+		 * @param {Object} event
+		 */
+		onkeyboardheightchange(event) {
+			this.$emit('keyboardheightchange', event);
+		},
 
-		.uni-easyinput__placeholder-class {
-			color: mix(#fff, $uni-error, 50%);
+		/**
+		 * 去除空格
+		 */
+		trimStr(str, pos = 'both') {
+			if (pos === 'both') {
+				return str.trim();
+			} else if (pos === 'left') {
+				return str.trimLeft();
+			} else if (pos === 'right') {
+				return str.trimRight();
+			} else if (pos === 'start') {
+				return str.trimStart();
+			} else if (pos === 'end') {
+				return str.trimEnd();
+			} else if (pos === 'all') {
+				return str.replace(/\s+/g, '');
+			} else if (pos === 'none') {
+				return str;
+			}
+			return str;
 		}
 	}
+};
+</script>
 
-	.uni-easyinput--border {
-		margin-bottom: 0;
-		padding: 10px 15px;
-		// padding-bottom: 0;
-		border-top: 1px #eee solid;
-	}
-
-	.uni-easyinput-error {
-		padding-bottom: 0;
-	}
+<style lang="scss">
+$uni-error: #e43d33;
+$uni-border-1: #dcdfe6 !default;
+
+.uni-easyinput {
+	/* #ifndef APP-NVUE */
+	width: 100%;
+	/* #endif */
+	flex: 1;
+	position: relative;
+	text-align: left;
+	color: var(--bs-heading-color);
+	font-size: 14px;
+}
+
+.uni-easyinput__content {
+	flex: 1;
+	/* #ifndef APP-NVUE */
+	width: 100%;
+	display: flex;
+	box-sizing: border-box;
+	// min-height: 36px;
+	/* #endif */
+	flex-direction: row;
+	align-items: center;
+	// 处理border动画刚开始显示黑色的问题
+	border-color: #fff;
+	transition-property: border-color;
+	transition-duration: 0.3s;
+}
+
+.uni-easyinput__content-input {
+	/* #ifndef APP-NVUE */
+	width: auto;
+	/* #endif */
+	position: relative;
+	overflow: hidden;
+	flex: 1;
+	line-height: 1;
+	font-size: 14px;
+	height: 35px;
+}
+
+.uni-easyinput__placeholder-class {
+	color: var(--bs-heading-color);
+	font-size: 12px;
+	// font-weight: 200;
+}
+
+.is-textarea {
+	align-items: flex-start;
+}
+
+.is-textarea-icon {
+	margin-top: 5px;
+}
+
+.uni-easyinput__content-textarea {
+	position: relative;
+	overflow: hidden;
+	flex: 1;
+	line-height: 1.5;
+	font-size: 14px;
+	margin: 6px;
+	margin-left: 0;
+	height: 80px;
+	min-height: 80px;
+	/* #ifndef APP-NVUE */
+	min-height: 80px;
+	width: auto;
+	/* #endif */
+}
+
+.input-padding {
+	padding-left: 10px;
+}
+
+.content-clear-icon {
+	padding: 0 5px;
+}
+
+.label-icon {
+	margin-right: 5px;
+	margin-top: -1px;
+}
+
+// 显示边框
+.is-input-border {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	box-sizing: border-box;
+	/* #endif */
+	flex-direction: row;
+	align-items: center;
+	border: 1px solid $uni-border-1;
+	border-radius: 4px;
+	/* #ifdef MP-ALIPAY */
+	overflow: hidden;
+	/* #endif */
+}
+
+.uni-error-message {
+	position: absolute;
+	bottom: -17px;
+	left: 0;
+	line-height: 12px;
+	color: $uni-error;
+	font-size: 12px;
+	text-align: left;
+}
+
+.uni-error-msg--boeder {
+	position: relative;
+	bottom: 0;
+	line-height: 22px;
+}
+
+.is-input-error-border {
+	border-color: $uni-error;
 
-	.is-first-border {
-		/* #ifndef APP-NVUE */
-		border: none;
-		/* #endif */
-		/* #ifdef APP-NVUE */
-		border-width: 0;
-		/* #endif */
+	.uni-easyinput__placeholder-class {
+		color: mix(#fff, $uni-error, 50%);
 	}
+}
+
+.uni-easyinput--border {
+	margin-bottom: 0;
+	padding: 10px 15px;
+	// padding-bottom: 0;
+	border-top: 1px #eee solid;
+}
+
+.uni-easyinput-error {
+	padding-bottom: 0;
+}
+
+.is-first-border {
+	/* #ifndef APP-NVUE */
+	border: none;
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	border-width: 0;
+	/* #endif */
+}
+
+.is-disabled {
+	background-color: #f7f6f6;
+	color: #d5d5d5;
 
-	.is-disabled {
-		background-color: #f7f6f6;
+	.uni-easyinput__placeholder-class {
 		color: #d5d5d5;
-
-		.uni-easyinput__placeholder-class {
-			color: #d5d5d5;
-			font-size: 12px;
-		}
+		font-size: 12px;
 	}
+}
 </style>

+ 609 - 605
uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue

@@ -4,679 +4,683 @@
 			<text class="file-title">{{ title }}</text>
 			<text class="file-count">{{ filesList.length }}/{{ limitLength }}</text>
 		</view>
-		<upload-image v-if="fileMediatype === 'image' && showType === 'grid'" :readonly="readonly" :image-styles="imageStyles" :files-list="filesList" :limit="limitLength" :disablePreview="disablePreview" :delIcon="delIcon" @uploadFiles="uploadFiles" @choose="choose" @delFile="delFile">
+		<upload-image v-if="fileMediatype === 'image' && showType === 'grid'" :readonly="readonly"
+			:image-styles="imageStyles" :files-list="filesList" :limit="limitLength" :disablePreview="disablePreview"
+			:delIcon="delIcon" @uploadFiles="uploadFiles" @choose="choose" @delFile="delFile">
 			<slot>
 				<view class="icon-add"></view>
 				<view class="icon-add rotate"></view>
 			</slot>
 		</upload-image>
-		<upload-file v-if="fileMediatype !== 'image' || showType !== 'grid'" :readonly="readonly" :list-styles="listStyles" :files-list="filesList" :showType="showType" :delIcon="delIcon" @uploadFiles="uploadFiles" @choose="choose" @delFile="delFile">
+		<upload-file v-if="fileMediatype !== 'image' || showType !== 'grid'" :readonly="readonly"
+			:list-styles="listStyles" :files-list="filesList" :showType="showType" :delIcon="delIcon"
+			@uploadFiles="uploadFiles" @choose="choose" @delFile="delFile">
 			<slot><button type="primary" size="mini">选择文件</button></slot>
 		</upload-file>
 	</view>
 </template>
 
 <script>
-	import {
-		chooseAndUploadFile,
-		uploadCloudFiles
-	} from './choose-and-upload-file.js'
-	import {
-		get_file_ext,
-		get_extname,
-		get_files_and_is_max,
-		get_file_info,
-		get_file_data
-	} from './utils.js'
-	import uploadImage from './upload-image.vue'
-	import uploadFile from './upload-file.vue'
-	let fileInput = null
-	/**
-	 * FilePicker 文件选择上传
-	 * @description 文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=4079
-	 * @property {Object|Array}	value	组件数据,通常用来回显 ,类型由return-type属性决定
-	 * @property {Boolean}	disabled = [true|false]	组件禁用
-	 * 	@value true 	禁用
-	 * 	@value false 	取消禁用
-	 * @property {Boolean}	readonly = [true|false]	组件只读,不可选择,不显示进度,不显示删除按钮
-	 * 	@value true 	只读
-	 * 	@value false 	取消只读
-	 * @property {String}	return-type = [array|object]	限制 value 格式,当为 object 时 ,组件只能单选,且会覆盖
-	 * 	@value array	规定 value 属性的类型为数组
-	 * 	@value object	规定 value 属性的类型为对象
-	 * @property {Boolean}	disable-preview = [true|false]	禁用图片预览,仅 mode:grid 时生效
-	 * 	@value true 	禁用图片预览
-	 * 	@value false 	取消禁用图片预览
-	 * @property {Boolean}	del-icon = [true|false]	是否显示删除按钮
-	 * 	@value true 	显示删除按钮
-	 * 	@value false 	不显示删除按钮
-	 * @property {Boolean}	auto-upload = [true|false]	是否自动上传,值为true则只触发@select,可自行上传
-	 * 	@value true 	自动上传
-	 * 	@value false 	取消自动上传
-	 * @property {Number|String}	limit	最大选择个数 ,h5 会自动忽略多选的部分
-	 * @property {String}	title	组件标题,右侧显示上传计数
-	 * @property {String}	mode = [list|grid]	选择文件后的文件列表样式
-	 * 	@value list 	列表显示
-	 * 	@value grid 	宫格显示
-	 * @property {String}	file-mediatype = [image|video|all]	选择文件类型
-	 * 	@value image	只选择图片
-	 * 	@value video	只选择视频
-	 * 	@value all		选择所有文件
-	 * @property {Array}	file-extname	选择文件后缀,根据 file-mediatype 属性而不同
-	 * @property {Object}	list-style	mode:list 时的样式
-	 * @property {Object}	image-styles	选择文件后缀,根据 file-mediatype 属性而不同
-	 * @event {Function} select 	选择文件后触发
-	 * @event {Function} progress 文件上传时触发
-	 * @event {Function} success 	上传成功触发
-	 * @event {Function} fail 		上传失败触发
-	 * @event {Function} delete 	文件从列表移除时触发
-	 */
-	export default {
-		name: 'uniFilePicker',
-		components: {
-			uploadImage,
-			uploadFile
-		},
-		options: {
-			virtualHost: true
-		},
-		emits: ['select', 'success', 'fail', 'progress', 'delete', 'update:modelValue', 'input'],
-		props: {
-			modelValue: {
-				type: [Array, Object],
-				default () {
-					return []
-				}
-			},
-			value: {
-				type: [Array, Object],
-				default () {
-					return []
-				}
-			},
-			disabled: {
-				type: Boolean,
-				default: false
-			},
-			disablePreview: {
-				type: Boolean,
-				default: false
-			},
-			delIcon: {
-				type: Boolean,
-				default: true
-			},
-			// 自动上传
-			autoUpload: {
-				type: Boolean,
-				default: true
-			},
-			// 最大选择个数 ,h5只能限制单选或是多选
-			limit: {
-				type: [Number, String],
-				default: 9
-			},
-			// 列表样式 grid | list | list-card
-			mode: {
-				type: String,
-				default: 'grid'
-			},
-			// 选择文件类型  image/video/all
-			fileMediatype: {
-				type: String,
-				default: 'image'
-			},
-			// 文件类型筛选
-			fileExtname: {
-				type: [Array, String],
-				default () {
-					return []
-				}
-			},
-			title: {
-				type: String,
-				default: ''
-			},
-			listStyles: {
-				type: Object,
-				default () {
-					return {
-						// 是否显示边框
-						border: true,
-						// 是否显示分隔线
-						dividline: true,
-						// 线条样式
-						borderStyle: {}
-					}
-				}
-			},
-			imageStyles: {
-				type: Object,
-				default () {
-					return {
-						width: 'auto',
-						height: 'auto'
-					}
-				}
-			},
-			readonly: {
-				type: Boolean,
-				default: false
-			},
-			returnType: {
-				type: String,
-				default: 'array'
-			},
-			sizeType: {
-				type: Array,
-				default () {
-					return ['original', 'compressed']
+import {
+	chooseAndUploadFile,
+	uploadCloudFiles
+} from './choose-and-upload-file.js'
+import {
+	get_file_ext,
+	get_extname,
+	get_files_and_is_max,
+	get_file_info,
+	get_file_data
+} from './utils.js'
+import uploadImage from './upload-image.vue'
+import uploadFile from './upload-file.vue'
+let fileInput = null
+/**
+ * FilePicker 文件选择上传
+ * @description 文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=4079
+ * @property {Object|Array}	value	组件数据,通常用来回显 ,类型由return-type属性决定
+ * @property {Boolean}	disabled = [true|false]	组件禁用
+ * 	@value true 	禁用
+ * 	@value false 	取消禁用
+ * @property {Boolean}	readonly = [true|false]	组件只读,不可选择,不显示进度,不显示删除按钮
+ * 	@value true 	只读
+ * 	@value false 	取消只读
+ * @property {String}	return-type = [array|object]	限制 value 格式,当为 object 时 ,组件只能单选,且会覆盖
+ * 	@value array	规定 value 属性的类型为数组
+ * 	@value object	规定 value 属性的类型为对象
+ * @property {Boolean}	disable-preview = [true|false]	禁用图片预览,仅 mode:grid 时生效
+ * 	@value true 	禁用图片预览
+ * 	@value false 	取消禁用图片预览
+ * @property {Boolean}	del-icon = [true|false]	是否显示删除按钮
+ * 	@value true 	显示删除按钮
+ * 	@value false 	不显示删除按钮
+ * @property {Boolean}	auto-upload = [true|false]	是否自动上传,值为true则只触发@select,可自行上传
+ * 	@value true 	自动上传
+ * 	@value false 	取消自动上传
+ * @property {Number|String}	limit	最大选择个数 ,h5 会自动忽略多选的部分
+ * @property {String}	title	组件标题,右侧显示上传计数
+ * @property {String}	mode = [list|grid]	选择文件后的文件列表样式
+ * 	@value list 	列表显示
+ * 	@value grid 	宫格显示
+ * @property {String}	file-mediatype = [image|video|all]	选择文件类型
+ * 	@value image	只选择图片
+ * 	@value video	只选择视频
+ * 	@value all		选择所有文件
+ * @property {Array}	file-extname	选择文件后缀,根据 file-mediatype 属性而不同
+ * @property {Object}	list-style	mode:list 时的样式
+ * @property {Object}	image-styles	选择文件后缀,根据 file-mediatype 属性而不同
+ * @event {Function} select 	选择文件后触发
+ * @event {Function} progress 文件上传时触发
+ * @event {Function} success 	上传成功触发
+ * @event {Function} fail 		上传失败触发
+ * @event {Function} delete 	文件从列表移除时触发
+ */
+export default {
+	name: 'uniFilePicker',
+	components: {
+		uploadImage,
+		uploadFile
+	},
+	options: {
+		virtualHost: true
+	},
+	emits: ['select', 'success', 'fail', 'progress', 'delete', 'update:modelValue', 'input'],
+	props: {
+		modelValue: {
+			type: [Array, Object],
+			default() {
+				return []
+			}
+		},
+		value: {
+			type: [Array, Object],
+			default() {
+				return []
+			}
+		},
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		disablePreview: {
+			type: Boolean,
+			default: false
+		},
+		delIcon: {
+			type: Boolean,
+			default: true
+		},
+		// 自动上传
+		autoUpload: {
+			type: Boolean,
+			default: true
+		},
+		// 最大选择个数 ,h5只能限制单选或是多选
+		limit: {
+			type: [Number, String],
+			default: 9
+		},
+		// 列表样式 grid | list | list-card
+		mode: {
+			type: String,
+			default: 'grid'
+		},
+		// 选择文件类型  image/video/all
+		fileMediatype: {
+			type: String,
+			default: 'image'
+		},
+		// 文件类型筛选
+		fileExtname: {
+			type: [Array, String],
+			default() {
+				return []
+			}
+		},
+		title: {
+			type: String,
+			default: ''
+		},
+		listStyles: {
+			type: Object,
+			default() {
+				return {
+					// 是否显示边框
+					border: true,
+					// 是否显示分隔线
+					dividline: true,
+					// 线条样式
+					borderStyle: {}
 				}
-			},
-			sourceType: {
-				type: Array,
-				default () {
-					return ['album', 'camera']
+			}
+		},
+		imageStyles: {
+			type: Object,
+			default() {
+				return {
+					width: 'auto',
+					height: 'auto'
 				}
-			},
-			provider: {
-				type: String,
-				default: '' // 默认上传到 unicloud 内置存储 extStorage 扩展存储
-			},
-			dir: {
-				type: String,
-				default: ''
 			}
 		},
-		data() {
-			return {
-				files: [],
-				localValue: [],
-				dirPath: ''
+		readonly: {
+			type: Boolean,
+			default: false
+		},
+		returnType: {
+			type: String,
+			default: 'array'
+		},
+		sizeType: {
+			type: Array,
+			default() {
+				return ['original', 'compressed']
 			}
 		},
-		watch: {
-			value: {
-				handler(newVal, oldVal) {
-					this.setValue(newVal, oldVal)
-				},
-				immediate: true
-			},
-			modelValue: {
-				handler(newVal, oldVal) {
-					this.setValue(newVal, oldVal)
-				},
-				immediate: true
-			},
-			dir: {
-				handler(newVal) {
-					this.dirPath = newVal
-				},
-				immediate: true
+		sourceType: {
+			type: Array,
+			default() {
+				return ['album', 'camera']
+			}
+		},
+		provider: {
+			type: String,
+			default: '' // 默认上传到 unicloud 内置存储 extStorage 扩展存储
+		},
+		dir: {
+			type: String,
+			default: ''
+		}
+	},
+	data() {
+		return {
+			files: [],
+			localValue: [],
+			dirPath: ''
+		}
+	},
+	watch: {
+		value: {
+			handler(newVal, oldVal) {
+				this.setValue(newVal, oldVal)
 			},
+			immediate: true
 		},
-		computed: {
-			filesList() {
-				let files = []
-				this.files.forEach(v => {
-					files.push(v)
-				})
-				return files
+		modelValue: {
+			handler(newVal, oldVal) {
+				this.setValue(newVal, oldVal)
 			},
-			showType() {
-				if (this.fileMediatype === 'image') {
-					return this.mode
-				}
-				return 'list'
+			immediate: true
+		},
+		dir: {
+			handler(newVal) {
+				this.dirPath = newVal
 			},
-			limitLength() {
-				if (this.returnType === 'object') {
-					return 1
-				}
-				if (!this.limit) {
-					return 1
-				}
-				if (this.limit >= 9) {
-					return 9
-				}
-				return this.limit
+			immediate: true
+		},
+	},
+	computed: {
+		filesList() {
+			let files = []
+			this.files.forEach(v => {
+				files.push(v)
+			})
+			return files
+		},
+		showType() {
+			if (this.fileMediatype === 'image') {
+				return this.mode
 			}
+			return 'list'
 		},
-		created() {
-			// TODO 兼容不开通服务空间的情况
-			if (!(uniCloud.config && uniCloud.config.provider)) {
-				this.noSpace = true
-				uniCloud.chooseAndUploadFile = chooseAndUploadFile
+		limitLength() {
+			if (this.returnType === 'object') {
+				return 1
 			}
-			this.form = this.getForm('uniForms')
-			this.formItem = this.getForm('uniFormsItem')
-			if (this.form && this.formItem) {
-				if (this.formItem.name) {
-					this.rename = this.formItem.name
-					this.form.inputChildrens.push(this)
-				}
+			if (!this.limit) {
+				return 1
 			}
-		},
-		methods: {
-			/**
-			 * 公开用户使用,清空文件
-			 * @param {Object} index
-			 */
-			clearFiles(index) {
-				if (index !== 0 && !index) {
-					this.files = []
-					this.$nextTick(() => {
-						this.setEmit()
-					})
-				} else {
-					this.files.splice(index, 1)
-				}
+			if (this.limit >= 9) {
+				return 9
+			}
+			return this.limit
+		}
+	},
+	created() {
+		// TODO 兼容不开通服务空间的情况
+		if (!(uniCloud.config && uniCloud.config.provider)) {
+			this.noSpace = true
+			uniCloud.chooseAndUploadFile = chooseAndUploadFile
+		}
+		this.form = this.getForm('uniForms')
+		this.formItem = this.getForm('uniFormsItem')
+		if (this.form && this.formItem) {
+			if (this.formItem.name) {
+				this.rename = this.formItem.name
+				this.form.inputChildrens.push(this)
+			}
+		}
+	},
+	methods: {
+		/**
+		 * 公开用户使用,清空文件
+		 * @param {Object} index
+		 */
+		clearFiles(index) {
+			if (index !== 0 && !index) {
+				this.files = []
 				this.$nextTick(() => {
 					this.setEmit()
 				})
-			},
-			/**
-			 * 公开用户使用,继续上传
-			 */
-			upload() {
-				let files = []
-				this.files.forEach((v, index) => {
-					if (v.status === 'ready' || v.status === 'error') {
-						files.push(Object.assign({}, v))
-					}
-				})
-				return this.uploadFiles(files)
-			},
-			async setValue(newVal, oldVal) {
-				const newData = async (v) => {
-					const reg = /cloud:\/\/([\w.]+\/?)\S*/
-					let url = ''
-					if (v.fileID) {
-						url = v.fileID
-					} else {
-						url = v.url
-					}
-					if (reg.test(url)) {
-						v.fileID = url
-						v.url = await this.getTempFileURL(url)
-					}
-					if (v.url) v.path = v.url
-					return v
+			} else {
+				this.files.splice(index, 1)
+			}
+			this.$nextTick(() => {
+				this.setEmit()
+			})
+		},
+		/**
+		 * 公开用户使用,继续上传
+		 */
+		upload() {
+			let files = []
+			this.files.forEach((v, index) => {
+				if (v.status === 'ready' || v.status === 'error') {
+					files.push(Object.assign({}, v))
 				}
-				if (this.returnType === 'object') {
-					if (newVal) {
-						await newData(newVal)
-					} else {
-						newVal = {}
-					}
+			})
+			return this.uploadFiles(files)
+		},
+		async setValue(newVal, oldVal) {
+			const newData = async (v) => {
+				const reg = /cloud:\/\/([\w.]+\/?)\S*/
+				let url = ''
+				if (v.fileID) {
+					url = v.fileID
 				} else {
-					if (!newVal) newVal = []
-					for (let i = 0; i < newVal.length; i++) {
-						let v = newVal[i]
-						await newData(v)
-					}
+					url = v.url
 				}
-				this.localValue = newVal
-				if (this.form && this.formItem && !this.is_reset) {
-					this.is_reset = false
-					this.formItem.setValue(this.localValue)
+				if (reg.test(url)) {
+					v.fileID = url
+					v.url = await this.getTempFileURL(url)
 				}
-				let filesData = Object.keys(newVal).length > 0 ? newVal : [];
-				this.files = [].concat(filesData)
-			},
-
-			/**
-			 * 选择文件
-			 */
-			choose() {
-				if (this.disabled) return
-				if (this.files.length >= Number(this.limitLength) && this.showType !== 'grid' && this.returnType ===
-					'array') {
-					uni.showToast({
-						title: `您最多选择 ${this.limitLength} 个文件`,
-						icon: 'none'
-					})
-					return
+				if (v.url) v.path = v.url
+				return v
+			}
+			if (this.returnType === 'object') {
+				if (newVal) {
+					await newData(newVal)
+				} else {
+					newVal = {}
 				}
-				this.chooseFiles()
-			},
-
-			/**
-			 * 选择文件并上传
-			 */
-			chooseFiles() {
-				const _extname = get_extname(this.fileExtname)
-				// 获取后缀
-				uniCloud
-					.chooseAndUploadFile({
-						type: this.fileMediatype,
-						compressed: false,
-						sizeType: this.sizeType,
-						sourceType: this.sourceType,
-						// TODO 如果为空,video 有问题
-						extension: _extname.length > 0 ? _extname : undefined,
-						count: this.limitLength - this.files.length, //默认9
-						onChooseFile: this.chooseFileCallback,
-						onUploadProgress: progressEvent => {
-							this.setProgress(progressEvent, progressEvent.index)
-						}
-					})
-					.then(result => {
-						this.setSuccessAndError(result.tempFiles)
-					})
-					.catch(err => {
-						console.log('选择失败', err)
-					})
-			},
-
-			/**
-			 * 选择文件回调
-			 * @param {Object} res
-			 */
-			async chooseFileCallback(res) {
-
-				const _extname = get_extname(this.fileExtname)
-
-				const is_one = (Number(this.limitLength) === 1 &&
-						this.disablePreview &&
-						!this.disabled) ||
-					this.returnType === 'object'
-				// 如果这有一个文件 ,需要清空本地缓存数据
-				if (is_one) {
-					this.files = []
+			} else {
+				if (!newVal) newVal = []
+				for (let i = 0; i < newVal.length; i++) {
+					let v = newVal[i]
+					await newData(v)
 				}
+			}
+			this.localValue = newVal
+			if (this.form && this.formItem && !this.is_reset) {
+				this.is_reset = false
+				this.formItem.setValue(this.localValue)
+			}
+			let filesData = Object.keys(newVal).length > 0 ? newVal : [];
+			this.files = [].concat(filesData)
+		},
 
-				let {
-					filePaths,
-					files
-				} = get_files_and_is_max(res, _extname)
-				if (!(_extname && _extname.length > 0)) {
-					filePaths = res.tempFilePaths
-					files = res.tempFiles
-				}
+		/**
+		 * 选择文件
+		 */
+		choose() {
+			if (this.disabled) return
+			if (this.files.length >= Number(this.limitLength) && this.showType !== 'grid' && this.returnType ===
+				'array') {
+				uni.showToast({
+					title: `您最多选择 ${this.limitLength} 个文件`,
+					icon: 'none'
+				})
+				return
+			}
+			this.chooseFiles()
+		},
 
-				let currentData = []
-				for (let i = 0; i < files.length; i++) {
-					if (this.limitLength - this.files.length <= 0) break
-					files[i].uuid = Date.now()
-					let filedata = await get_file_data(files[i], this.fileMediatype)
-					filedata.progress = 0
-					filedata.status = 'ready'
-					// fix by mehaotian ,统一返回,删除也包含file对象
-					let fileTempData = {
-						...filedata,
-						file: files[i]
+		/**
+		 * 选择文件并上传
+		 */
+		chooseFiles() {
+			const _extname = get_extname(this.fileExtname)
+			// 获取后缀
+			uniCloud
+				.chooseAndUploadFile({
+					type: this.fileMediatype,
+					compressed: false,
+					sizeType: this.sizeType,
+					sourceType: this.sourceType,
+					// TODO 如果为空,video 有问题
+					extension: _extname.length > 0 ? _extname : undefined,
+					count: this.limitLength - this.files.length, //默认9
+					onChooseFile: this.chooseFileCallback,
+					onUploadProgress: progressEvent => {
+						this.setProgress(progressEvent, progressEvent.index)
 					}
-					this.files.push(fileTempData)
-					currentData.push(fileTempData)
-				}
-				this.$emit('select', {
-					tempFiles: currentData,
-					tempFilePaths: filePaths
 				})
-				res.tempFiles = files
-				// 停止自动上传
-				if (!this.autoUpload || this.noSpace) {
-					res.tempFiles = []
-				}
-				console.log(123123123,'zidong');
-				
-				res.tempFiles.map((fileItem, index) => {
-					this.provider && (fileItem.provider = this.provider);
-					const fileNameSplit = fileItem.name.split('.')
-					const ext = fileNameSplit.pop()
-					const fileName = fileNameSplit.join('.').replace(/[\s\/\?<>\\:\*\|":]/g, '_')
-					// 选择文件目录上传
-					let dir = this.dirPath || ''; // 防止用户传入的 dir 不正常
-					// 检查最后一个字符是否为 '/'(同时处理空字符串情况)
-					if (dir && dir[dir.length - 1] !== '/') {
-						dir += '/';
-					}
-
-					fileItem.cloudPath = dir + fileName + '_' + Date.now() + '_' + index + '.' + ext
-					fileItem.cloudPathAsRealPath = true
-
-					return fileItem
+				.then(result => {
+					this.setSuccessAndError(result.tempFiles)
 				})
-				return res
-			},
+				.catch(err => {
+					console.log('选择失败', err)
+				})
+		},
 
-			/**
-			 * 批传
-			 * @param {Object} e
-			 */
-			uploadFiles(files) {
-				files = [].concat(files)
-				return uploadCloudFiles.call(this, files, 5, res => {
-						this.setProgress(res, res.index, true)
-					})
-					.then(result => {
-						this.setSuccessAndError(result)
-						return result;
-					})
-					.catch(err => {
-						console.log(err)
-					})
-			},
+		/**
+		 * 选择文件回调
+		 * @param {Object} res
+		 */
+		async chooseFileCallback(res) {
 
-			/**
-			 * 成功或失败
-			 */
-			async setSuccessAndError(res, fn) {
-				let successData = []
-				let errorData = []
-				let tempFilePath = []
-				let errorTempFilePath = []
-				for (let i = 0; i < res.length; i++) {
-					const item = res[i]
-					const index = item.uuid ? this.files.findIndex(p => p.uuid === item.uuid) : item.index
+			const _extname = get_extname(this.fileExtname)
 
-					if (index === -1 || !this.files) break
-					if (item.errMsg === 'request:fail') {
-						this.files[index].url = item.path
-						this.files[index].status = 'error'
-						this.files[index].errMsg = item.errMsg
-						// this.files[index].progress = -1
-						errorData.push(this.files[index])
-						errorTempFilePath.push(this.files[index].url)
-					} else {
-						this.files[index].errMsg = ''
-						this.files[index].fileID = item.url
-						const reg = /cloud:\/\/([\w.]+\/?)\S*/
-						if (reg.test(item.url)) {
-							this.files[index].url = await this.getTempFileURL(item.url)
-						} else {
-							this.files[index].url = item.url
-						}
+			const is_one = (Number(this.limitLength) === 1 &&
+				this.disablePreview &&
+				!this.disabled) ||
+				this.returnType === 'object'
+			// 如果这有一个文件 ,需要清空本地缓存数据
+			if (is_one) {
+				this.files = []
+			}
 
-						this.files[index].status = 'success'
-						this.files[index].progress += 1
-						successData.push(this.files[index])
-						tempFilePath.push(this.files[index].fileID)
-					}
-				}
+			let {
+				filePaths,
+				files
+			} = get_files_and_is_max(res, _extname)
+			if (!(_extname && _extname.length > 0)) {
+				filePaths = res.tempFilePaths
+				files = res.tempFiles
+			}
 
-				if (successData.length > 0) {
-					this.setEmit()
-					// 状态改变返回
-					this.$emit('success', {
-						tempFiles: this.backObject(successData),
-						tempFilePaths: tempFilePath
-					})
+			let currentData = []
+			for (let i = 0; i < files.length; i++) {
+				if (this.limitLength - this.files.length <= 0) break
+				files[i].uuid = Date.now()
+				let filedata = await get_file_data(files[i], this.fileMediatype)
+				filedata.progress = 0
+				filedata.status = 'ready'
+				// fix by mehaotian ,统一返回,删除也包含file对象
+				let fileTempData = {
+					...filedata,
+					file: files[i]
 				}
+				this.files.push(fileTempData)
+				currentData.push(fileTempData)
+			}
+			this.$emit('select', {
+				tempFiles: currentData,
+				tempFilePaths: filePaths
+			})
+			res.tempFiles = files
+			// 停止自动上传
+			if (!this.autoUpload || this.noSpace) {
+				res.tempFiles = []
+			}
+			console.log(123123123, 'zidong');
 
-				if (errorData.length > 0) {
-					this.$emit('fail', {
-						tempFiles: this.backObject(errorData),
-						tempFilePaths: errorTempFilePath
-					})
+			res.tempFiles.map((fileItem, index) => {
+				this.provider && (fileItem.provider = this.provider);
+				const fileNameSplit = fileItem.name.split('.')
+				const ext = fileNameSplit.pop()
+				const fileName = fileNameSplit.join('.').replace(/[\s\/\?<>\\:\*\|":]/g, '_')
+				// 选择文件目录上传
+				let dir = this.dirPath || ''; // 防止用户传入的 dir 不正常
+				// 检查最后一个字符是否为 '/'(同时处理空字符串情况)
+				if (dir && dir[dir.length - 1] !== '/') {
+					dir += '/';
 				}
-			},
 
-			/**
-			 * 获取进度
-			 * @param {Object} progressEvent
-			 * @param {Object} index
-			 * @param {Object} type
-			 */
-			setProgress(progressEvent, index, type) {
-				const fileLenth = this.files.length
-				const percentNum = (index / fileLenth) * 100
-				const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total)
-				let idx = index
-				if (!type) {
-					idx = this.files.findIndex(p => p.uuid === progressEvent.tempFile.uuid)
-				}
-				if (idx === -1 || !this.files[idx]) return
-				// fix by mehaotian 100 就会消失,-1 是为了让进度条消失
-				this.files[idx].progress = percentCompleted - 1
-				// 上传中
-				this.$emit('progress', {
-					index: idx,
-					progress: parseInt(percentCompleted),
-					tempFile: this.files[idx]
-				})
-			},
+				fileItem.cloudPath = dir + fileName + '_' + Date.now() + '_' + index + '.' + ext
+				fileItem.cloudPathAsRealPath = true
+
+				return fileItem
+			})
+			return res
+		},
 
-			/**
-			 * 删除文件
-			 * @param {Object} index
-			 */
-			delFile(index) {
-				this.$emit('delete', {
-					index,
-					tempFile: this.files[index],
-					tempFilePath: this.files[index].url
+		/**
+		 * 批传
+		 * @param {Object} e
+		 */
+		uploadFiles(files) {
+			files = [].concat(files)
+			return uploadCloudFiles.call(this, files, 5, res => {
+				this.setProgress(res, res.index, true)
+			})
+				.then(result => {
+					this.setSuccessAndError(result)
+					return result;
 				})
-				this.files.splice(index, 1)
-				this.$nextTick(() => {
-					this.setEmit()
+				.catch(err => {
+					console.log(err)
 				})
-			},
+		},
 
-			/**
-			 * 获取文件名和后缀
-			 * @param {Object} name
-			 */
-			getFileExt(name) {
-				const last_len = name.lastIndexOf('.')
-				const len = name.length
-				return {
-					name: name.substring(0, last_len),
-					ext: name.substring(last_len + 1, len)
-				}
-			},
+		/**
+		 * 成功或失败
+		 */
+		async setSuccessAndError(res, fn) {
+			let successData = []
+			let errorData = []
+			let tempFilePath = []
+			let errorTempFilePath = []
+			for (let i = 0; i < res.length; i++) {
+				const item = res[i]
+				const index = item.uuid ? this.files.findIndex(p => p.uuid === item.uuid) : item.index
 
-			/**
-			 * 处理返回事件
-			 */
-			setEmit() {
-				let data = []
-				if (this.returnType === 'object') {
-					data = this.backObject(this.files)[0]
-					this.localValue = data ? data : null
+				if (index === -1 || !this.files) break
+				if (item.errMsg === 'request:fail') {
+					this.files[index].url = item.path
+					this.files[index].status = 'error'
+					this.files[index].errMsg = item.errMsg
+					// this.files[index].progress = -1
+					errorData.push(this.files[index])
+					errorTempFilePath.push(this.files[index].url)
 				} else {
-					data = this.backObject(this.files)
-					if (!this.localValue) {
-						this.localValue = []
+					this.files[index].errMsg = ''
+					this.files[index].fileID = item.url
+					const reg = /cloud:\/\/([\w.]+\/?)\S*/
+					if (reg.test(item.url)) {
+						this.files[index].url = await this.getTempFileURL(item.url)
+					} else {
+						this.files[index].url = item.url
 					}
-					this.localValue = [...data]
+
+					this.files[index].status = 'success'
+					this.files[index].progress += 1
+					successData.push(this.files[index])
+					tempFilePath.push(this.files[index].fileID)
 				}
-				// #ifdef VUE3
-				this.$emit('update:modelValue', this.localValue)
-				// #endif
-				// #ifndef VUE3
-				this.$emit('input', this.localValue)
-				// #endif
-			},
+			}
 
-			/**
-			 * 处理返回参数
-			 * @param {Object} files
-			 */
-			backObject(files) {
-				let newFilesData = []
-				files.forEach(v => {
-					newFilesData.push({
-						extname: v.extname,
-						fileType: v.fileType,
-						image: v.image,
-						name: v.name,
-						path: v.path,
-						size: v.size,
-						fileID: v.fileID,
-						url: v.url,
-						// 修改删除一个文件后不能再上传的bug, #694
-						uuid: v.uuid,
-						status: v.status,
-						cloudPath: v.cloudPath
-					})
+			if (successData.length > 0) {
+				this.setEmit()
+				// 状态改变返回
+				this.$emit('success', {
+					tempFiles: this.backObject(successData),
+					tempFilePaths: tempFilePath
 				})
-				return newFilesData
-			},
-			async getTempFileURL(fileList) {
-				fileList = {
-					fileList: [].concat(fileList)
-				}
-				const urls = await uniCloud.getTempFileURL(fileList)
-				return urls.fileList[0].tempFileURL || ''
-			},
-			/**
-			 * 获取父元素实例
-			 */
-			getForm(name = 'uniForms') {
-				let parent = this.$parent;
-				let parentName = parent.$options.name;
-				while (parentName !== name) {
-					parent = parent.$parent;
-					if (!parent) return false;
-					parentName = parent.$options.name;
+			}
+
+			if (errorData.length > 0) {
+				this.$emit('fail', {
+					tempFiles: this.backObject(errorData),
+					tempFilePaths: errorTempFilePath
+				})
+			}
+		},
+
+		/**
+		 * 获取进度
+		 * @param {Object} progressEvent
+		 * @param {Object} index
+		 * @param {Object} type
+		 */
+		setProgress(progressEvent, index, type) {
+			const fileLenth = this.files.length
+			const percentNum = (index / fileLenth) * 100
+			const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total)
+			let idx = index
+			if (!type) {
+				idx = this.files.findIndex(p => p.uuid === progressEvent.tempFile.uuid)
+			}
+			if (idx === -1 || !this.files[idx]) return
+			// fix by mehaotian 100 就会消失,-1 是为了让进度条消失
+			this.files[idx].progress = percentCompleted - 1
+			// 上传中
+			this.$emit('progress', {
+				index: idx,
+				progress: parseInt(percentCompleted),
+				tempFile: this.files[idx]
+			})
+		},
+
+		/**
+		 * 删除文件
+		 * @param {Object} index
+		 */
+		delFile(index) {
+			this.$emit('delete', {
+				index,
+				tempFile: this.files[index],
+				tempFilePath: this.files[index].url
+			})
+			this.files.splice(index, 1)
+			this.$nextTick(() => {
+				this.setEmit()
+			})
+		},
+
+		/**
+		 * 获取文件名和后缀
+		 * @param {Object} name
+		 */
+		getFileExt(name) {
+			const last_len = name.lastIndexOf('.')
+			const len = name.length
+			return {
+				name: name.substring(0, last_len),
+				ext: name.substring(last_len + 1, len)
+			}
+		},
+
+		/**
+		 * 处理返回事件
+		 */
+		setEmit() {
+			let data = []
+			if (this.returnType === 'object') {
+				data = this.backObject(this.files)[0]
+				this.localValue = data ? data : null
+			} else {
+				data = this.backObject(this.files)
+				if (!this.localValue) {
+					this.localValue = []
 				}
-				return parent;
+				this.localValue = [...data]
 			}
+			// #ifdef VUE3
+			this.$emit('update:modelValue', this.localValue)
+			// #endif
+			// #ifndef VUE3
+			this.$emit('input', this.localValue)
+			// #endif
+		},
+
+		/**
+		 * 处理返回参数
+		 * @param {Object} files
+		 */
+		backObject(files) {
+			let newFilesData = []
+			files.forEach(v => {
+				newFilesData.push({
+					extname: v.extname,
+					fileType: v.fileType,
+					image: v.image,
+					name: v.name,
+					path: v.path,
+					size: v.size,
+					fileID: v.fileID,
+					url: v.url,
+					// 修改删除一个文件后不能再上传的bug, #694
+					uuid: v.uuid,
+					status: v.status,
+					cloudPath: v.cloudPath
+				})
+			})
+			return newFilesData
+		},
+		async getTempFileURL(fileList) {
+			fileList = {
+				fileList: [].concat(fileList)
+			}
+			const urls = await uniCloud.getTempFileURL(fileList)
+			return urls.fileList[0].tempFileURL || ''
+		},
+		/**
+		 * 获取父元素实例
+		 */
+		getForm(name = 'uniForms') {
+			let parent = this.$parent;
+			let parentName = parent.$options.name;
+			while (parentName !== name) {
+				parent = parent.$parent;
+				if (!parent) return false;
+				parentName = parent.$options.name;
+			}
+			return parent;
 		}
 	}
+}
 </script>
 
 <style>
-	.uni-file-picker {
-		/* #ifndef APP-NVUE */
-		box-sizing: border-box;
-		overflow: hidden;
-		width: 100%;
-		/* #endif */
-		flex: 1;
-	}
+.uni-file-picker {
+	/* #ifndef APP-NVUE */
+	box-sizing: border-box;
+	overflow: hidden;
+	width: 100%;
+	/* #endif */
+	flex: 1;
+}
 
-	.uni-file-picker__header {
-		padding-top: 5px;
-		padding-bottom: 10px;
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		justify-content: space-between;
-	}
+.uni-file-picker__header {
+	padding-top: 5px;
+	padding-bottom: 10px;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	justify-content: space-between;
+}
 
-	.file-title {
-		font-size: 14px;
-		color: #333;
-	}
+.file-title {
+	font-size: 14px;
+	color: var(--bs-heading-color);
+}
 
-	.file-count {
-		font-size: 14px;
-		color: #999;
-	}
+.file-count {
+	font-size: 14px;
+	color: var(--bs-heading-color);
+}
 
-	.icon-add {
-		width: 50px;
-		height: 5px;
-		background-color: #f1f1f1;
-		border-radius: 2px;
-	}
+.icon-add {
+	width: 50px;
+	height: 5px;
+	background-color: #f1f1f1;
+	border-radius: 2px;
+}
 
-	.rotate {
-		position: absolute;
-		transform: rotate(90deg);
-	}
+.rotate {
+	position: absolute;
+	transform: rotate(90deg);
+}
 </style>

+ 259 - 256
uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue

@@ -7,23 +7,26 @@
 		<view v-if="list.length > 0" class="uni-file-picker__lists is-text-box" :style="borderStyle">
 			<!-- ,'is-list-card':showType === 'list-card' -->
 
-			<view class="uni-file-picker__lists-box" v-for="(item ,index) in list" :key="index" :class="{
-				'files-border':index !== 0 && styles.dividline}" :style="index !== 0 && styles.dividline &&borderLineStyle">
+			<view class="uni-file-picker__lists-box" v-for="(item, index) in list" :key="index" :class="{
+				'files-border': index !== 0 && styles.dividline
+			}" :style="index !== 0 && styles.dividline && borderLineStyle">
 				<view class="uni-file-picker__item">
 					<!-- :class="{'is-text-image':showType === 'list'}" -->
 					<!-- 	<view class="files__image is-text-image">
 						<image class="header-image" :src="item.logo" mode="aspectFit"></image>
 					</view> -->
-					<view class="files__name">{{item.name}}</view>
-					<view v-if="delIcon&&!readonly" class="icon-del-box icon-files" @click="delFile(index)">
+					<view class="files__name">{{ item.name }}</view>
+					<view v-if="delIcon && !readonly" class="icon-del-box icon-files" @click="delFile(index)">
 						<view class="icon-del icon-files"></view>
 						<view class="icon-del rotate"></view>
 					</view>
 				</view>
-				<view v-if="(item.progress && item.progress !== 100) ||item.progress===0 " class="file-picker__progress">
-					<progress class="file-picker__progress-item" :percent="item.progress === -1?0:item.progress" stroke-width="4" :backgroundColor="item.errMsg?'#ff5a5f':'#EBEBEB'" />
+				<view v-if="(item.progress && item.progress !== 100) || item.progress === 0"
+					class="file-picker__progress">
+					<progress class="file-picker__progress-item" :percent="item.progress === -1 ? 0 : item.progress"
+						stroke-width="4" :backgroundColor="item.errMsg ? '#ff5a5f' : '#EBEBEB'" />
 				</view>
-				<view v-if="item.status === 'error'" class="file-picker__mask" @click.stop="uploadFiles(item,index)">
+				<view v-if="item.status === 'error'" class="file-picker__mask" @click.stop="uploadFiles(item, index)">
 					点击重试
 				</view>
 			</view>
@@ -33,291 +36,291 @@
 </template>
 
 <script>
-	export default {
-		name: "uploadFile",
-		emits: ['uploadFiles', 'choose', 'delFile'],
-		props: {
-			filesList: {
-				type: Array,
-				default () {
-					return []
-				}
-			},
-			delIcon: {
-				type: Boolean,
-				default: true
-			},
-			limit: {
-				type: [Number, String],
-				default: 9
-			},
-			showType: {
-				type: String,
-				default: ''
-			},
-			listStyles: {
-				type: Object,
-				default () {
-					return {
-						// 是否显示边框
-						border: true,
-						// 是否显示分隔线
-						dividline: true,
-						// 线条样式
-						borderStyle: {}
-					}
-				}
-			},
-			readonly: {
-				type: Boolean,
-				default: false
+export default {
+	name: "uploadFile",
+	emits: ['uploadFiles', 'choose', 'delFile'],
+	props: {
+		filesList: {
+			type: Array,
+			default() {
+				return []
 			}
 		},
-		computed: {
-			list() {
-				let files = []
-				this.filesList.forEach(v => {
-					files.push(v)
-				})
-				return files
-			},
-			styles() {
-				let styles = {
+		delIcon: {
+			type: Boolean,
+			default: true
+		},
+		limit: {
+			type: [Number, String],
+			default: 9
+		},
+		showType: {
+			type: String,
+			default: ''
+		},
+		listStyles: {
+			type: Object,
+			default() {
+				return {
+					// 是否显示边框
 					border: true,
+					// 是否显示分隔线
 					dividline: true,
-					'border-style': {}
-				}
-				return Object.assign(styles, this.listStyles)
-			},
-			borderStyle() {
-				let {
-					borderStyle,
-					border
-				} = this.styles
-				let obj = {}
-				if (!border) {
-					obj.border = 'none'
-				} else {
-					let width = (borderStyle && borderStyle.width) || 1
-					width = this.value2px(width)
-					let radius = (borderStyle && borderStyle.radius) || 5
-					radius = this.value2px(radius)
-					obj = {
-						'border-width': width,
-						'border-style': (borderStyle && borderStyle.style) || 'solid',
-						'border-color': (borderStyle && borderStyle.color) || '#eee',
-						'border-radius': radius
-					}
+					// 线条样式
+					borderStyle: {}
 				}
-				let classles = ''
-				for (let i in obj) {
-					classles += `${i}:${obj[i]};`
-				}
-				return classles
-			},
-			borderLineStyle() {
-				let obj = {}
-				let {
-					borderStyle
-				} = this.styles
-				if (borderStyle && borderStyle.color) {
-					obj['border-color'] = borderStyle.color
-				}
-				if (borderStyle && borderStyle.width) {
-					let width = borderStyle && borderStyle.width || 1
-					let style = borderStyle && borderStyle.style || 0
-					if (typeof width === 'number') {
-						width += 'px'
-					} else {
-						width = width.indexOf('px') ? width : width + 'px'
-					}
-					obj['border-width'] = width
-
-					if (typeof style === 'number') {
-						style += 'px'
-					} else {
-						style = style.indexOf('px') ? style : style + 'px'
-					}
-					obj['border-top-style'] = style
-				}
-				let classles = ''
-				for (let i in obj) {
-					classles += `${i}:${obj[i]};`
+			}
+		},
+		readonly: {
+			type: Boolean,
+			default: false
+		}
+	},
+	computed: {
+		list() {
+			let files = []
+			this.filesList.forEach(v => {
+				files.push(v)
+			})
+			return files
+		},
+		styles() {
+			let styles = {
+				border: true,
+				dividline: true,
+				'border-style': {}
+			}
+			return Object.assign(styles, this.listStyles)
+		},
+		borderStyle() {
+			let {
+				borderStyle,
+				border
+			} = this.styles
+			let obj = {}
+			if (!border) {
+				obj.border = 'none'
+			} else {
+				let width = (borderStyle && borderStyle.width) || 1
+				width = this.value2px(width)
+				let radius = (borderStyle && borderStyle.radius) || 5
+				radius = this.value2px(radius)
+				obj = {
+					'border-width': width,
+					'border-style': (borderStyle && borderStyle.style) || 'solid',
+					'border-color': (borderStyle && borderStyle.color) || '#eee',
+					'border-radius': radius
 				}
-				return classles
 			}
+			let classles = ''
+			for (let i in obj) {
+				classles += `${i}:${obj[i]};`
+			}
+			return classles
 		},
+		borderLineStyle() {
+			let obj = {}
+			let {
+				borderStyle
+			} = this.styles
+			if (borderStyle && borderStyle.color) {
+				obj['border-color'] = borderStyle.color
+			}
+			if (borderStyle && borderStyle.width) {
+				let width = borderStyle && borderStyle.width || 1
+				let style = borderStyle && borderStyle.style || 0
+				if (typeof width === 'number') {
+					width += 'px'
+				} else {
+					width = width.indexOf('px') ? width : width + 'px'
+				}
+				obj['border-width'] = width
 
-		methods: {
-			uploadFiles(item, index) {
-				this.$emit("uploadFiles", {
-					item,
-					index
-				})
-			},
-			choose() {
-				this.$emit("choose")
-			},
-			delFile(index) {
-				this.$emit('delFile', index)
-			},
-			value2px(value) {
-				if (typeof value === 'number') {
-					value += 'px'
+				if (typeof style === 'number') {
+					style += 'px'
 				} else {
-					value = value.indexOf('px') !== -1 ? value : value + 'px'
+					style = style.indexOf('px') ? style : style + 'px'
 				}
-				return value
+				obj['border-top-style'] = style
+			}
+			let classles = ''
+			for (let i in obj) {
+				classles += `${i}:${obj[i]};`
+			}
+			return classles
+		}
+	},
+
+	methods: {
+		uploadFiles(item, index) {
+			this.$emit("uploadFiles", {
+				item,
+				index
+			})
+		},
+		choose() {
+			this.$emit("choose")
+		},
+		delFile(index) {
+			this.$emit('delFile', index)
+		},
+		value2px(value) {
+			if (typeof value === 'number') {
+				value += 'px'
+			} else {
+				value = value.indexOf('px') !== -1 ? value : value + 'px'
 			}
+			return value
 		}
 	}
+}
 </script>
 
 <style lang="scss">
-	.uni-file-picker__files {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: column;
-		justify-content: flex-start;
-	}
+.uni-file-picker__files {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: column;
+	justify-content: flex-start;
+}
 
-	.files-button {
-		// border: 1px red solid;
-	}
+.files-button {
+	// border: 1px red solid;
+}
 
-	.uni-file-picker__lists {
-		position: relative;
-		margin-top: 5px;
-		overflow: hidden;
-	}
+.uni-file-picker__lists {
+	position: relative;
+	margin-top: 5px;
+	overflow: hidden;
+}
 
-	.file-picker__mask {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		justify-content: center;
-		align-items: center;
-		position: absolute;
-		right: 0;
-		top: 0;
-		bottom: 0;
-		left: 0;
-		color: #fff;
-		font-size: 14px;
-		background-color: rgba(0, 0, 0, 0.4);
-	}
+.file-picker__mask {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	justify-content: center;
+	align-items: center;
+	position: absolute;
+	right: 0;
+	top: 0;
+	bottom: 0;
+	left: 0;
+	color: #fff;
+	font-size: 14px;
+	background-color: rgba(0, 0, 0, 0.4);
+}
 
-	.uni-file-picker__lists-box {
-		position: relative;
-	}
+.uni-file-picker__lists-box {
+	position: relative;
+}
 
-	.uni-file-picker__item {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		align-items: center;
-		padding: 8px 10px;
-		padding-right: 5px;
-		padding-left: 10px;
-	}
+.uni-file-picker__item {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	align-items: center;
+	padding: 8px 10px;
+	padding-right: 5px;
+	padding-left: 10px;
+}
 
-	.files-border {
-		border-top: 1px #eee solid;
-	}
+.files-border {
+	border-top: 1px #eee solid;
+}
 
-	.files__name {
-		flex: 1;
-		font-size: 14px;
-		color: #666;
-		margin-right: 25px;
-		/* #ifndef APP-NVUE */
-		word-break: break-all;
-		word-wrap: break-word;
-		/* #endif */
-	}
+.files__name {
+	flex: 1;
+	font-size: 14px;
+	color: var(--bs-heading-color);
+	margin-right: 25px;
+	/* #ifndef APP-NVUE */
+	word-break: break-all;
+	word-wrap: break-word;
+	/* #endif */
+}
 
-	.icon-files {
-		/* #ifndef APP-NVUE */
-		position: static;
-		background-color: initial;
-		/* #endif */
-	}
+.icon-files {
+	/* #ifndef APP-NVUE */
+	position: static;
+	background-color: initial;
+	/* #endif */
+}
 
-	// .icon-files .icon-del {
-	// 	background-color: #333;
-	// 	width: 12px;
-	// 	height: 1px;
-	// }
+// .icon-files .icon-del {
+// 	background-color: var(--bs-heading-color);
+// 	width: 12px;
+// 	height: 1px;
+// }
 
 
-	.is-list-card {
-		border: 1px #eee solid;
-		margin-bottom: 5px;
-		border-radius: 5px;
-		box-shadow: 0 0 2px 0px rgba(0, 0, 0, 0.1);
-		padding: 5px;
-	}
+.is-list-card {
+	border: 1px #eee solid;
+	margin-bottom: 5px;
+	border-radius: 5px;
+	box-shadow: 0 0 2px 0px rgba(0, 0, 0, 0.1);
+	padding: 5px;
+}
 
-	.files__image {
-		width: 40px;
-		height: 40px;
-		margin-right: 10px;
-	}
+.files__image {
+	width: 40px;
+	height: 40px;
+	margin-right: 10px;
+}
 
-	.header-image {
-		width: 100%;
-		height: 100%;
-	}
+.header-image {
+	width: 100%;
+	height: 100%;
+}
 
-	.is-text-box {
-		border: 1px #eee solid;
-		border-radius: 5px;
-	}
+.is-text-box {
+	border: 1px #eee solid;
+	border-radius: 5px;
+}
 
-	.is-text-image {
-		width: 25px;
-		height: 25px;
-		margin-left: 5px;
-	}
+.is-text-image {
+	width: 25px;
+	height: 25px;
+	margin-left: 5px;
+}
 
-	.rotate {
-		position: absolute;
-		transform: rotate(90deg);
-	}
+.rotate {
+	position: absolute;
+	transform: rotate(90deg);
+}
 
-	.icon-del-box {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		margin: auto 0;
-		/* #endif */
-		align-items: center;
-		justify-content: center;
-		position: absolute;
-		top: 0px;
-		bottom: 0;
-		right: 5px;
-		height: 26px;
-		width: 26px;
-		// border-radius: 50%;
-		// background-color: rgba(0, 0, 0, 0.5);
-		z-index: 2;
-		transform: rotate(-45deg);
-	}
+.icon-del-box {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	margin: auto 0;
+	/* #endif */
+	align-items: center;
+	justify-content: center;
+	position: absolute;
+	top: 0px;
+	bottom: 0;
+	right: 5px;
+	height: 26px;
+	width: 26px;
+	// border-radius: 50%;
+	// background-color: rgba(0, 0, 0, 0.5);
+	z-index: 2;
+	transform: rotate(-45deg);
+}
 
-	.icon-del {
-		width: 15px;
-		height: 1px;
-		background-color: #333;
-		// border-radius: 1px;
-	}
+.icon-del {
+	width: 15px;
+	height: 1px;
+	background-color: var(--bs-heading-color);
+	// border-radius: 1px;
+}
 
-	/* #ifdef H5 */
-	@media all and (min-width: 768px) {
-		.uni-file-picker__files {
-			max-width: 375px;
-		}
+/* #ifdef H5 */
+@media all and (min-width: 768px) {
+	.uni-file-picker__files {
+		max-width: 375px;
 	}
+}
 
-	/* #endif */
+/* #endif */
 </style>

+ 2 - 2
uni_modules/uni-group/components/uni-group/uni-group.vue

@@ -103,7 +103,7 @@ export default {
 	height: 40px;
 	background-color: #eee;
 	font-weight: normal;
-	color: #666;
+	color: var(--bs-heading-color);
 }
 
 .uni-group__content {
@@ -118,7 +118,7 @@ export default {
 
 .uni-group__title-text {
 	font-size: 14px;
-	color: #666;
+	color: var(--bs-heading-color);
 }
 
 .distraction {

+ 8 - 8
uni_modules/uni-icons/components/uni-icons/uni-icons.uvue

@@ -49,12 +49,12 @@
 				return ''
 			},
 			iconSize() : string {
-				const size = this.size
-				if (typeof size == 'string') {
-				  const reg = /^[0-9]*$/g
-				  return reg.test(size as string) ? '' + size + 'px' : '' + size;
-				  // return '' + this.size
-				}
+				const size = this.size
+				if (typeof size == 'string') {
+				  const reg = /^[0-9]*$/g
+				  return reg.test(size as string) ? '' + size + 'px' : '' + size;
+				  // return '' + this.size
+				}
 				return this.getFontSize(size as number)
 			},
 			styleObj() : UTSJSONObject {
@@ -86,6 +86,6 @@
 		font-family: UniIconsFontFamily;
 		font-size: 18px;
 		font-style: normal;
-		color: #333;
+		color: var(--bs-heading-color);
 	}
-</style>
+</style>

+ 3 - 3
uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue

@@ -39,7 +39,7 @@
 						<view style="flex-direction: row;">
 							<text class="draft" v-if="isDraft">[草稿]</text>
 							<text class="uni-list-chat__content-note uni-ellipsis">{{ isDraft ? note.slice(14) : note
-								}}</text>
+							}}</text>
 						</view>
 					</view>
 					<view class="uni-list-chat__content-extra">
@@ -288,10 +288,10 @@ $title-size: 16px;
 $title-color: #3b4144;
 $title-weight: normal;
 $note-size: 12px;
-$note-color: #999;
+$note-color: var(--bs-heading-color);
 $note-weight: normal;
 $right-text-size: 12px;
-$right-text-color: #999;
+$right-text-color: var(--bs-heading-color);
 $right-text-weight: normal;
 $badge-left: 0px;
 $badge-top: 0px;

+ 197 - 197
uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue

@@ -1,232 +1,232 @@
 <template>
 	<view class="uni-numbox">
-		<view @click="_calcValue('minus')" class="uni-numbox__minus uni-numbox-btns" :style="{background}">
+		<view @click="_calcValue('minus')" class="uni-numbox__minus uni-numbox-btns" :style="{ background }">
 			<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': inputValue <= min || disabled }"
-				:style="{color}">-</text>
+				:style="{ color }">-</text>
 		</view>
 		<input :disabled="disabled" @focus="_onFocus" @blur="_onBlur" class="uni-numbox__value"
-			:type="step<1?'digit':'number'" v-model="inputValue" :style="{background, color, width:widthWithPx}" />
-		<view @click="_calcValue('plus')" class="uni-numbox__plus uni-numbox-btns" :style="{background}">
+			:type="step < 1 ? 'digit' : 'number'" v-model="inputValue" :style="{ background, color, width: widthWithPx }" />
+		<view @click="_calcValue('plus')" class="uni-numbox__plus uni-numbox-btns" :style="{ background }">
 			<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': inputValue >= max || disabled }"
-				:style="{color}">+</text>
+				:style="{ color }">+</text>
 		</view>
 	</view>
 </template>
 <script>
-	/**
-	 * NumberBox 数字输入框
-	 * @description 带加减按钮的数字输入框
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=31
-	 * @property {Number} value 输入框当前值
-	 * @property {Number} min 最小值
-	 * @property {Number} max 最大值
-	 * @property {Number} step 每次点击改变的间隔大小
-	 * @property {String} background 背景色
-	 * @property {String} color 字体颜色(前景色)
-	 * @property {Number} width 输入框宽度(单位:px)
-	 * @property {Boolean} disabled = [true|false] 是否为禁用状态
-	 * @event {Function} change 输入框值改变时触发的事件,参数为输入框当前的 value
-	 * @event {Function} focus 输入框聚焦时触发的事件,参数为 event 对象
-	 * @event {Function} blur 输入框失焦时触发的事件,参数为 event 对象
-	 */
+/**
+ * NumberBox 数字输入框
+ * @description 带加减按钮的数字输入框
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=31
+ * @property {Number} value 输入框当前值
+ * @property {Number} min 最小值
+ * @property {Number} max 最大值
+ * @property {Number} step 每次点击改变的间隔大小
+ * @property {String} background 背景色
+ * @property {String} color 字体颜色(前景色)
+ * @property {Number} width 输入框宽度(单位:px)
+ * @property {Boolean} disabled = [true|false] 是否为禁用状态
+ * @event {Function} change 输入框值改变时触发的事件,参数为输入框当前的 value
+ * @event {Function} focus 输入框聚焦时触发的事件,参数为 event 对象
+ * @event {Function} blur 输入框失焦时触发的事件,参数为 event 对象
+ */
 
-	export default {
-		name: "UniNumberBox",
-		emits: ['change', 'input', 'update:modelValue', 'blur', 'focus'],
-		props: {
-			value: {
-				type: [Number, String],
-				default: 1
-			},
-			modelValue: {
-				type: [Number, String],
-				default: 1
-			},
-			min: {
-				type: Number,
-				default: 0
-			},
-			max: {
-				type: Number,
-				default: 100
-			},
-			step: {
-				type: Number,
-				default: 1
-			},
-			background: {
-				type: String,
-				default: '#f5f5f5'
-			},
-			color: {
-				type: String,
-				default: '#333'
-			},
-			disabled: {
-				type: Boolean,
-				default: false
-			},
-			width: {
-				type: Number,
-				default: 40,
-			}
+export default {
+	name: "UniNumberBox",
+	emits: ['change', 'input', 'update:modelValue', 'blur', 'focus'],
+	props: {
+		value: {
+			type: [Number, String],
+			default: 1
 		},
-		data() {
-			return {
-				inputValue: 0
-			};
+		modelValue: {
+			type: [Number, String],
+			default: 1
 		},
-		watch: {
-			value(val) {
-				this.inputValue = +val;
-			},
-			modelValue(val) {
-				this.inputValue = +val;
-			}
+		min: {
+			type: Number,
+			default: 0
 		},
-		computed: {
-			widthWithPx() {
-				return this.width + 'px';
-			}
+		max: {
+			type: Number,
+			default: 100
 		},
-		created() {
-			if (this.value === 1) {
-				this.inputValue = +this.modelValue;
-			}
-			if (this.modelValue === 1) {
-				this.inputValue = +this.value;
-			}
+		step: {
+			type: Number,
+			default: 1
+		},
+		background: {
+			type: String,
+			default: '#f5f5f5'
+		},
+		color: {
+			type: String,
+			default: '#333'
+		},
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		width: {
+			type: Number,
+			default: 40,
+		}
+	},
+	data() {
+		return {
+			inputValue: 0
+		};
+	},
+	watch: {
+		value(val) {
+			this.inputValue = +val;
 		},
-		methods: {
-			_calcValue(type) {
-				if (this.disabled) {
+		modelValue(val) {
+			this.inputValue = +val;
+		}
+	},
+	computed: {
+		widthWithPx() {
+			return this.width + 'px';
+		}
+	},
+	created() {
+		if (this.value === 1) {
+			this.inputValue = +this.modelValue;
+		}
+		if (this.modelValue === 1) {
+			this.inputValue = +this.value;
+		}
+	},
+	methods: {
+		_calcValue(type) {
+			if (this.disabled) {
+				return;
+			}
+			const scale = this._getDecimalScale();
+			let value = this.inputValue * scale;
+			let step = this.step * scale;
+			if (type === "minus") {
+				value -= step;
+				if (value < (this.min * scale)) {
 					return;
 				}
-				const scale = this._getDecimalScale();
-				let value = this.inputValue * scale;
-				let step = this.step * scale;
-				if (type === "minus") {
-					value -= step;
-					if (value < (this.min * scale)) {
-						return;
-					}
-					if (value > (this.max * scale)) {
-						value = this.max * scale
-					}
-				}
-
-				if (type === "plus") {
-					value += step;
-					if (value > (this.max * scale)) {
-						return;
-					}
-					if (value < (this.min * scale)) {
-						value = this.min * scale
-					}
+				if (value > (this.max * scale)) {
+					value = this.max * scale
 				}
+			}
 
-				this.inputValue = (value / scale).toFixed(String(scale).length - 1);
-				// TODO vue2 兼容
-				this.$emit("input", +this.inputValue);
-				// TODO vue3 兼容
-				this.$emit("update:modelValue", +this.inputValue);
-				this.$emit("change", +this.inputValue);
-			},
-			_getDecimalScale() {
-
-				let scale = 1;
-				// 浮点型
-				if (~~this.step !== this.step) {
-					scale = Math.pow(10, String(this.step).split(".")[1].length);
-				}
-				return scale;
-			},
-			_onBlur(event) {
-				this.$emit('blur', event)
-				let value = event.detail.value;
-				if (isNaN(value)) {
-					this.inputValue = this.value;
+			if (type === "plus") {
+				value += step;
+				if (value > (this.max * scale)) {
 					return;
 				}
-				value = +value;
-				if (value > this.max) {
-					value = this.max;
-				} else if (value < this.min) {
-					value = this.min;
+				if (value < (this.min * scale)) {
+					value = this.min * scale
 				}
-				const scale = this._getDecimalScale();
-				this.inputValue = value.toFixed(String(scale).length - 1);
-				this.$emit("input", +this.inputValue);
-				this.$emit("update:modelValue", +this.inputValue);
-				this.$emit("change", +this.inputValue);
-			},
-			_onFocus(event) {
-				this.$emit('focus', event)
 			}
+
+			this.inputValue = (value / scale).toFixed(String(scale).length - 1);
+			// TODO vue2 兼容
+			this.$emit("input", +this.inputValue);
+			// TODO vue3 兼容
+			this.$emit("update:modelValue", +this.inputValue);
+			this.$emit("change", +this.inputValue);
+		},
+		_getDecimalScale() {
+
+			let scale = 1;
+			// 浮点型
+			if (~~this.step !== this.step) {
+				scale = Math.pow(10, String(this.step).split(".")[1].length);
+			}
+			return scale;
+		},
+		_onBlur(event) {
+			this.$emit('blur', event)
+			let value = event.detail.value;
+			if (isNaN(value)) {
+				this.inputValue = this.value;
+				return;
+			}
+			value = +value;
+			if (value > this.max) {
+				value = this.max;
+			} else if (value < this.min) {
+				value = this.min;
+			}
+			const scale = this._getDecimalScale();
+			this.inputValue = value.toFixed(String(scale).length - 1);
+			this.$emit("input", +this.inputValue);
+			this.$emit("update:modelValue", +this.inputValue);
+			this.$emit("change", +this.inputValue);
+		},
+		_onFocus(event) {
+			this.$emit('focus', event)
 		}
-	};
+	}
+};
 </script>
 <style lang="scss">
-	$box-height: 26px;
-	$bg: #f5f5f5;
-	$br: 2px;
-	$color: #333;
+$box-height: 26px;
+$bg: #f5f5f5;
+$br: 2px;
+$color: var(--bs-heading-color);
 
-	.uni-numbox {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-	}
+.uni-numbox {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+}
 
-	.uni-numbox-btns {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		align-items: center;
-		justify-content: center;
-		padding: 0 8px;
-		background-color: $bg;
-		/* #ifdef H5 */
-		cursor: pointer;
-		/* #endif */
-	}
+.uni-numbox-btns {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+	align-items: center;
+	justify-content: center;
+	padding: 0 8px;
+	background-color: $bg;
+	/* #ifdef H5 */
+	cursor: pointer;
+	/* #endif */
+}
 
-	.uni-numbox__value {
-		margin: 0 2px;
-		background-color: $bg;
-		width: 40px;
-		height: $box-height;
-		text-align: center;
-		font-size: 14px;
-		border-width: 0;
-		color: $color;
-	}
+.uni-numbox__value {
+	margin: 0 2px;
+	background-color: $bg;
+	width: 40px;
+	height: $box-height;
+	text-align: center;
+	font-size: 14px;
+	border-width: 0;
+	color: $color;
+}
 
-	.uni-numbox__minus {
-		border-top-left-radius: $br;
-		border-bottom-left-radius: $br;
-	}
+.uni-numbox__minus {
+	border-top-left-radius: $br;
+	border-bottom-left-radius: $br;
+}
 
-	.uni-numbox__plus {
-		border-top-right-radius: $br;
-		border-bottom-right-radius: $br;
-	}
+.uni-numbox__plus {
+	border-top-right-radius: $br;
+	border-bottom-right-radius: $br;
+}
 
-	.uni-numbox--text {
-		// fix nvue
-		line-height: 20px;
-		margin-bottom: 2px;
-		font-size: 20px;
-		font-weight: 300;
-		color: $color;
-	}
+.uni-numbox--text {
+	// fix nvue
+	line-height: 20px;
+	margin-bottom: 2px;
+	font-size: 20px;
+	font-weight: 300;
+	color: $color;
+}
 
-	.uni-numbox .uni-numbox--disabled {
-		color: #c0c0c0 !important;
-		/* #ifdef H5 */
-		cursor: not-allowed;
-		/* #endif */
-	}
+.uni-numbox .uni-numbox--disabled {
+	color: #c0c0c0 !important;
+	/* #ifdef H5 */
+	cursor: not-allowed;
+	/* #endif */
+}
 </style>

+ 364 - 363
uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue

@@ -5,7 +5,7 @@
 			:value="pageSizeIndex" :range="pageSizeRange" @change="pickerChange" @cancel="pickerClick"
 			@click.native="pickerClick">
 			<button type="default" size="mini" :plain="true">
-				<text>{{pageSizeRange[pageSizeIndex]}} {{piecePerPage}}</text>
+				<text>{{ pageSizeRange[pageSizeIndex] }} {{ piecePerPage }}</text>
 				<uni-icons class="select-picker-icon" type="arrowdown" size="12" color="#999"></uni-icons>
 			</button>
 		</picker>
@@ -52,414 +52,415 @@
 </template>
 
 <script>
-	/**
-	 * Pagination 分页器
-	 * @description 分页器组件,用于展示页码、请求数据等
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=32
-	 * @property {String} prevText 左侧按钮文字
-	 * @property {String} nextText 右侧按钮文字
-	 * @property {String} piecePerPageText 条/页文字
-	 * @property {Number} current 当前页
-	 * @property {Number} total 数据总量
-	 * @property {Number} pageSize 每页数据量
-	 * @property {Boolean} showIcon = [true|false] 是否以 icon 形式展示按钮
-	 * @property {Boolean} showPageSize = [true|false] 是否展示每页条数
-	 * @property {Array} pageSizeRange = [20, 50, 100, 500] 每页条数选框
-	 * @event {Function} change 点击页码按钮时触发 ,e={type,current} current为当前页,type值为:next/prev,表示点击的是上一页还是下一个
-	 * * @event {Function} pageSizeChange 当前每页条数改变时触发 ,e={pageSize} pageSize 为当前所选的每页条数
-	 */
+/**
+ * Pagination 分页器
+ * @description 分页器组件,用于展示页码、请求数据等
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=32
+ * @property {String} prevText 左侧按钮文字
+ * @property {String} nextText 右侧按钮文字
+ * @property {String} piecePerPageText 条/页文字
+ * @property {Number} current 当前页
+ * @property {Number} total 数据总量
+ * @property {Number} pageSize 每页数据量
+ * @property {Boolean} showIcon = [true|false] 是否以 icon 形式展示按钮
+ * @property {Boolean} showPageSize = [true|false] 是否展示每页条数
+ * @property {Array} pageSizeRange = [20, 50, 100, 500] 每页条数选框
+ * @event {Function} change 点击页码按钮时触发 ,e={type,current} current为当前页,type值为:next/prev,表示点击的是上一页还是下一个
+ * * @event {Function} pageSizeChange 当前每页条数改变时触发 ,e={pageSize} pageSize 为当前所选的每页条数
+ */
 
-	import {
-		initVueI18n
-	} from '@dcloudio/uni-i18n'
-	import messages from './i18n/index.js'
-	const {
-		t
-	} = initVueI18n(messages)
-	export default {
-		name: 'UniPagination',
-		emits: ['update:modelValue', 'input', 'change', 'pageSizeChange'],
-		props: {
-			value: {
-				type: [Number, String],
-				default: 1
-			},
-			modelValue: {
-				type: [Number, String],
-				default: 1
-			},
-			prevText: {
-				type: String,
-			},
-			nextText: {
-				type: String,
-			},
-			piecePerPageText: {
-				type: String
-			},
-			current: {
-				type: [Number, String],
-				default: 1
-			},
-			total: {
-				// 数据总量
-				type: [Number, String],
-				default: 0
-			},
-			pageSize: {
-				// 每页数据量
-				type: [Number, String],
-				default: 10
-			},
-			showIcon: {
-				// 是否以 icon 形式展示按钮
-				type: [Boolean, String],
-				default: false
-			},
-			showPageSize: {
-				// 是否以 icon 形式展示按钮
-				type: [Boolean, String],
-				default: false
-			},
-			pagerCount: {
-				type: Number,
-				default: 7
-			},
-			pageSizeRange: {
-				type: Array,
-				default: () => [20, 50, 100, 500]
-			}
+import {
+	initVueI18n
+} from '@dcloudio/uni-i18n'
+import messages from './i18n/index.js'
+const {
+	t
+} = initVueI18n(messages)
+export default {
+	name: 'UniPagination',
+	emits: ['update:modelValue', 'input', 'change', 'pageSizeChange'],
+	props: {
+		value: {
+			type: [Number, String],
+			default: 1
+		},
+		modelValue: {
+			type: [Number, String],
+			default: 1
+		},
+		prevText: {
+			type: String,
+		},
+		nextText: {
+			type: String,
+		},
+		piecePerPageText: {
+			type: String
+		},
+		current: {
+			type: [Number, String],
+			default: 1
+		},
+		total: {
+			// 数据总量
+			type: [Number, String],
+			default: 0
 		},
-		data() {
-			return {
-				pageSizeIndex: 0,
-				currentIndex: 1,
-				paperData: [],
-				pickerShow: false
+		pageSize: {
+			// 每页数据量
+			type: [Number, String],
+			default: 10
+		},
+		showIcon: {
+			// 是否以 icon 形式展示按钮
+			type: [Boolean, String],
+			default: false
+		},
+		showPageSize: {
+			// 是否以 icon 形式展示按钮
+			type: [Boolean, String],
+			default: false
+		},
+		pagerCount: {
+			type: Number,
+			default: 7
+		},
+		pageSizeRange: {
+			type: Array,
+			default: () => [20, 50, 100, 500]
+		}
+	},
+	data() {
+		return {
+			pageSizeIndex: 0,
+			currentIndex: 1,
+			paperData: [],
+			pickerShow: false
+		}
+	},
+	computed: {
+		piecePerPage() {
+			return this.piecePerPageText || t('uni-pagination.piecePerPage')
+		},
+		prevPageText() {
+			return this.prevText || t('uni-pagination.prevText')
+		},
+		nextPageText() {
+			return this.nextText || t('uni-pagination.nextText')
+		},
+		maxPage() {
+			let maxPage = 1
+			let total = Number(this.total)
+			let pageSize = Number(this.pageSize)
+			if (total && pageSize) {
+				maxPage = Math.ceil(total / pageSize)
 			}
+			return maxPage
 		},
-		computed: {
-			piecePerPage() {
-				return this.piecePerPageText || t('uni-pagination.piecePerPage')
-			},
-			prevPageText() {
-				return this.prevText || t('uni-pagination.prevText')
-			},
-			nextPageText() {
-				return this.nextText || t('uni-pagination.nextText')
-			},
-			maxPage() {
-				let maxPage = 1
-				let total = Number(this.total)
-				let pageSize = Number(this.pageSize)
-				if (total && pageSize) {
-					maxPage = Math.ceil(total / pageSize)
-				}
-				return maxPage
-			},
-			paper() {
-				const num = this.currentIndex
-				// TODO 最大页数
-				const pagerCount = this.pagerCount
-				// const total = 181
-				const total = this.total
-				const pageSize = this.pageSize
-				let totalArr = []
-				let showPagerArr = []
-				let pagerNum = Math.ceil(total / pageSize)
-				for (let i = 0; i < pagerNum; i++) {
-					totalArr.push(i + 1)
-				}
-				showPagerArr.push(1)
-				const totalNum = totalArr[totalArr.length - (pagerCount + 1) / 2]
-				totalArr.forEach((item, index) => {
-					if ((pagerCount + 1) / 2 >= num) {
-						if (item < pagerCount + 1 && item > 1) {
-							showPagerArr.push(item)
-						}
-					} else if (num + 2 <= totalNum) {
-						if (item > num - (pagerCount + 1) / 2 && item < num + (pagerCount + 1) / 2) {
-							showPagerArr.push(item)
-						}
-					} else {
-						if ((item > num - (pagerCount + 1) / 2 || pagerNum - pagerCount < item) && item < totalArr[
-								totalArr.length - 1]) {
-							showPagerArr.push(item)
-						}
+		paper() {
+			const num = this.currentIndex
+			// TODO 最大页数
+			const pagerCount = this.pagerCount
+			// const total = 181
+			const total = this.total
+			const pageSize = this.pageSize
+			let totalArr = []
+			let showPagerArr = []
+			let pagerNum = Math.ceil(total / pageSize)
+			for (let i = 0; i < pagerNum; i++) {
+				totalArr.push(i + 1)
+			}
+			showPagerArr.push(1)
+			const totalNum = totalArr[totalArr.length - (pagerCount + 1) / 2]
+			totalArr.forEach((item, index) => {
+				if ((pagerCount + 1) / 2 >= num) {
+					if (item < pagerCount + 1 && item > 1) {
+						showPagerArr.push(item)
 					}
-				})
-				if (pagerNum > pagerCount) {
-					if ((pagerCount + 1) / 2 >= num) {
-						showPagerArr[showPagerArr.length - 1] = '...'
-					} else if (num + 2 <= totalNum) {
-						showPagerArr[1] = '...'
-						showPagerArr[showPagerArr.length - 1] = '...'
-					} else {
-						showPagerArr[1] = '...'
+				} else if (num + 2 <= totalNum) {
+					if (item > num - (pagerCount + 1) / 2 && item < num + (pagerCount + 1) / 2) {
+						showPagerArr.push(item)
 					}
-					showPagerArr.push(totalArr[totalArr.length - 1])
 				} else {
-					if ((pagerCount + 1) / 2 >= num) {} else if (num + 2 <= totalNum) {} else {
-						showPagerArr.shift()
-						showPagerArr.push(totalArr[totalArr.length - 1])
+					if ((item > num - (pagerCount + 1) / 2 || pagerNum - pagerCount < item) && item < totalArr[
+						totalArr.length - 1]) {
+						showPagerArr.push(item)
 					}
 				}
+			})
+			if (pagerNum > pagerCount) {
+				if ((pagerCount + 1) / 2 >= num) {
+					showPagerArr[showPagerArr.length - 1] = '...'
+				} else if (num + 2 <= totalNum) {
+					showPagerArr[1] = '...'
+					showPagerArr[showPagerArr.length - 1] = '...'
+				} else {
+					showPagerArr[1] = '...'
+				}
+				showPagerArr.push(totalArr[totalArr.length - 1])
+			} else {
+				if ((pagerCount + 1) / 2 >= num) { } else if (num + 2 <= totalNum) { } else {
+					showPagerArr.shift()
+					showPagerArr.push(totalArr[totalArr.length - 1])
+				}
+			}
 
-				return showPagerArr
+			return showPagerArr
+		}
+	},
+	watch: {
+		current: {
+			immediate: true,
+			handler(val, old) {
+				if (val < 1) {
+					this.currentIndex = 1
+				} else {
+					this.currentIndex = val
+				}
 			}
 		},
-		watch: {
-			current: {
-				immediate: true,
-				handler(val, old) {
-					if (val < 1) {
-						this.currentIndex = 1
-					} else {
-						this.currentIndex = val
-					}
-				}
-			},
-			value: {
-				immediate: true,
-				handler(val) {
-					if (Number(this.current) !== 1) return
-					if (val < 1) {
-						this.currentIndex = 1
-					} else {
-						this.currentIndex = val
-					}
+		value: {
+			immediate: true,
+			handler(val) {
+				if (Number(this.current) !== 1) return
+				if (val < 1) {
+					this.currentIndex = 1
+				} else {
+					this.currentIndex = val
 				}
-			},
-			pageSizeIndex(val) {
-				this.$emit('pageSizeChange', this.pageSizeRange[val])
 			}
 		},
-		methods: {
-			pickerChange(e) {
-				this.pageSizeIndex = e.detail.value
-				this.pickerClick()
-			},
-			pickerClick() {
-				// #ifdef H5
-				const body = document.querySelector('body')
-				if (!body) return
+		pageSizeIndex(val) {
+			this.$emit('pageSizeChange', this.pageSizeRange[val])
+		}
+	},
+	methods: {
+		pickerChange(e) {
+			this.pageSizeIndex = e.detail.value
+			this.pickerClick()
+		},
+		pickerClick() {
+			// #ifdef H5
+			const body = document.querySelector('body')
+			if (!body) return
 
-				const className = 'uni-pagination-picker-show'
-				this.pickerShow = !this.pickerShow
+			const className = 'uni-pagination-picker-show'
+			this.pickerShow = !this.pickerShow
 
-				if (this.pickerShow) {
-					body.classList.add(className)
-				} else {
-					setTimeout(() => body.classList.remove(className), 300)
-				}
-				// #endif
-			},
-			// 选择标签
-			selectPage(e, index) {
-				if (parseInt(e)) {
-					this.currentIndex = e
-					this.change('current')
-				} else {
-					let pagerNum = Math.ceil(this.total / this.pageSize)
-					// let pagerNum = Math.ceil(181 / this.pageSize)
-					// 上一页
-					if (index <= 1) {
-						if (this.currentIndex - 5 > 1) {
-							this.currentIndex -= 5
-						} else {
-							this.currentIndex = 1
-						}
-						return
-					}
-					// 下一页
-					if (index >= 6) {
-						if (this.currentIndex + 5 > pagerNum) {
-							this.currentIndex = pagerNum
-						} else {
-							this.currentIndex += 5
-						}
-						return
+			if (this.pickerShow) {
+				body.classList.add(className)
+			} else {
+				setTimeout(() => body.classList.remove(className), 300)
+			}
+			// #endif
+		},
+		// 选择标签
+		selectPage(e, index) {
+			if (parseInt(e)) {
+				this.currentIndex = e
+				this.change('current')
+			} else {
+				let pagerNum = Math.ceil(this.total / this.pageSize)
+				// let pagerNum = Math.ceil(181 / this.pageSize)
+				// 上一页
+				if (index <= 1) {
+					if (this.currentIndex - 5 > 1) {
+						this.currentIndex -= 5
+					} else {
+						this.currentIndex = 1
 					}
-				}
-			},
-			clickLeft() {
-				if (Number(this.currentIndex) === 1) {
 					return
 				}
-				this.currentIndex -= 1
-				this.change('prev')
-			},
-			clickRight() {
-				if (Number(this.currentIndex) >= this.maxPage) {
+				// 下一页
+				if (index >= 6) {
+					if (this.currentIndex + 5 > pagerNum) {
+						this.currentIndex = pagerNum
+					} else {
+						this.currentIndex += 5
+					}
 					return
 				}
-				this.currentIndex += 1
-				this.change('next')
-			},
-			change(e) {
-				this.$emit('input', this.currentIndex)
-				this.$emit('update:modelValue', this.currentIndex)
-				this.$emit('change', {
-					type: e,
-					current: this.currentIndex
-				})
 			}
+		},
+		clickLeft() {
+			if (Number(this.currentIndex) === 1) {
+				return
+			}
+			this.currentIndex -= 1
+			this.change('prev')
+		},
+		clickRight() {
+			if (Number(this.currentIndex) >= this.maxPage) {
+				return
+			}
+			this.currentIndex += 1
+			this.change('next')
+		},
+		change(e) {
+			this.$emit('input', this.currentIndex)
+			this.$emit('update:modelValue', this.currentIndex)
+			this.$emit('change', {
+				type: e,
+				current: this.currentIndex
+			})
 		}
 	}
+}
 </script>
 
-<style lang="scss" scoped>
-	$uni-primary: #2979ff !default;
-	.uni-pagination {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		position: relative;
-		overflow: hidden;
-		flex-direction: row;
-		justify-content: center;
-		align-items: center;
-	}
+<style lang="scss" scoped>
+$uni-primary: #2979ff !default;
 
-	.uni-pagination__total {
-		font-size: 14px;
-		color: #999;
-		margin-right: 15px;
-	}
+.uni-pagination {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	position: relative;
+	overflow: hidden;
+	flex-direction: row;
+	justify-content: center;
+	align-items: center;
+}
 
-	.uni-pagination__btn {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		cursor: pointer;
-		/* #endif */
-		padding: 0 8px;
-		line-height: 30px;
-		font-size: 12px;
-		position: relative;
-		background-color: #F0F0F0;
-		flex-direction: row;
-		justify-content: center;
-		align-items: center;
-		text-align: center;
-		border-radius: 5px;
-		// border-width: 1px;
-		// border-style: solid;
-		// border-color: $uni-border-color;
-	}
+.uni-pagination__total {
+	font-size: 14px;
+	color: var(--bs-heading-color);
+	margin-right: 15px;
+}
 
-	.uni-pagination__child-btn {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		font-size: 12px;
-		position: relative;
-		flex-direction: row;
-		justify-content: center;
-		align-items: center;
-		text-align: center;
-		color: #666;
-		font-size: 12px;
-	}
+.uni-pagination__btn {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	cursor: pointer;
+	/* #endif */
+	padding: 0 8px;
+	line-height: 30px;
+	font-size: 12px;
+	position: relative;
+	background-color: #F0F0F0;
+	flex-direction: row;
+	justify-content: center;
+	align-items: center;
+	text-align: center;
+	border-radius: 5px;
+	// border-width: 1px;
+	// border-style: solid;
+	// border-color: $uni-border-color;
+}
 
-	.uni-pagination__num {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex: 1;
-		flex-direction: row;
-		justify-content: center;
-		align-items: center;
-		height: 30px;
-		line-height: 30px;
-		font-size: 12px;
-		color: #666;
-		margin: 0 5px;
-	}
+.uni-pagination__child-btn {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	font-size: 12px;
+	position: relative;
+	flex-direction: row;
+	justify-content: center;
+	align-items: center;
+	text-align: center;
+	color: var(--bs-heading-color);
+	font-size: 12px;
+}
 
-	.uni-pagination__num-tag {
-		/* #ifdef H5 */
-		cursor: pointer;
-		min-width: 30px;
-		/* #endif */
-		margin: 0 5px;
-		height: 30px;
-		text-align: center;
-		line-height: 30px;
-		// border: 1px red solid;
-		color: #999;
-		border-radius: 4px;
-		// border-width: 1px;
-		// border-style: solid;
-		// border-color: $uni-border-color;
-	}
+.uni-pagination__num {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex: 1;
+	flex-direction: row;
+	justify-content: center;
+	align-items: center;
+	height: 30px;
+	line-height: 30px;
+	font-size: 12px;
+	color: var(--bs-heading-color);
+	margin: 0 5px;
+}
 
-	.uni-pagination__num-current {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-	}
+.uni-pagination__num-tag {
+	/* #ifdef H5 */
+	cursor: pointer;
+	min-width: 30px;
+	/* #endif */
+	margin: 0 5px;
+	height: 30px;
+	text-align: center;
+	line-height: 30px;
+	// border: 1px red solid;
+	color: var(--bs-heading-color);
+	border-radius: 4px;
+	// border-width: 1px;
+	// border-style: solid;
+	// border-color: $uni-border-color;
+}
 
-	.uni-pagination__num-current-text {
-		font-size: 15px;
-	}
-
-	.current-index-text{
-		color: $uni-primary;
-	}
+.uni-pagination__num-current {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+}
 
-	.uni-pagination--enabled {
-		color: #333333;
-		opacity: 1;
-	}
+.uni-pagination__num-current-text {
+	font-size: 15px;
+}
 
-	.uni-pagination--disabled {
-		opacity: 0.5;
-		/* #ifdef H5 */
-		cursor: default;
-		/* #endif */
-	}
+.current-index-text {
+	color: $uni-primary;
+}
 
-	.uni-pagination--hover {
-		color: rgba(0, 0, 0, 0.6);
-		background-color: #eee;
-	}
+.uni-pagination--enabled {
+	color: #333333;
+	opacity: 1;
+}
 
-	.tag--active:hover {
-		color: $uni-primary;
-	}
+.uni-pagination--disabled {
+	opacity: 0.5;
+	/* #ifdef H5 */
+	cursor: default;
+	/* #endif */
+}
 
-	.page--active {
-		color: #fff;
-		background-color: $uni-primary;
-	}
+.uni-pagination--hover {
+	color: rgba(0, 0, 0, 0.6);
+	background-color: #eee;
+}
 
-	.page--active:hover {
-		color: #fff;
-	}
+.tag--active:hover {
+	color: $uni-primary;
+}
 
-	/* #ifndef APP-NVUE */
+.page--active {
+	color: #fff;
+	background-color: $uni-primary;
+}
+
+.page--active:hover {
+	color: #fff;
+}
+
+/* #ifndef APP-NVUE */
+.is-pc-hide {
+	display: block;
+}
+
+.is-phone-hide {
+	display: none;
+}
+
+@media screen and (min-width: 450px) {
 	.is-pc-hide {
-		display: block;
+		display: none;
 	}
 
 	.is-phone-hide {
-		display: none;
+		display: block;
 	}
 
-	@media screen and (min-width: 450px) {
-		.is-pc-hide {
-			display: none;
-		}
-
-		.is-phone-hide {
-			display: block;
-		}
-
-		.uni-pagination__num-flex-none {
-			flex: none;
-		}
+	.uni-pagination__num-flex-none {
+		flex: none;
 	}
+}
 
-	/* #endif */
-</style>
+/* #endif */
+</style>

+ 1 - 1
uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue

@@ -295,7 +295,7 @@ export default {
 
 .uni-dialog-button-text {
 	font-size: 16px;
-	color: #333;
+	color: var(--bs-heading-color);
 }
 
 .uni-button-color {

+ 2 - 2
uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue

@@ -124,7 +124,7 @@ export default {
 
 .uni-share-title-text {
 	font-size: 14px;
-	color: #666;
+	color: var(--bs-heading-color);
 }
 
 .uni-share-content {
@@ -182,7 +182,7 @@ export default {
 .uni-share-button {
 	flex: 1;
 	border-radius: 50px;
-	color: #666;
+	color: var(--bs-heading-color);
 	font-size: 16px;
 }
 

+ 1 - 1
uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue

@@ -273,7 +273,7 @@ $uni-searchbar-height: 36px;
 .uni-searchbar__box-search-input {
 	flex: 1;
 	font-size: 14px;
-	color: #333;
+	color: var(--bs-heading-color);
 	margin-left: 5px;
 	margin-top: 1px;
 	/* #ifndef APP-NVUE */

+ 1 - 1
uni_modules/uni-section/components/uni-section/uni-section.vue

@@ -148,7 +148,7 @@ $uni-primary: #2979ff !default;
       /* #endif */
       flex-direction: column;
       flex: 1;
-      color: #333;
+      color: var(--bs-heading-color);
 
       .distraction {
         flex-direction: row;

+ 1 - 1
uni_modules/uni-table/components/uni-table/uni-table.vue

@@ -392,7 +392,7 @@ $border-color: #ebeef5;
 	left: 0;
 	text-align: center;
 	font-size: 14px;
-	color: #999;
+	color: var(--bs-heading-color);
 }
 
 .uni-table-mask {

+ 98 - 98
uni_modules/uni-table/components/uni-thead/uni-thead.vue

@@ -18,120 +18,120 @@
 </template>
 
 <script>
-	import tableCheckbox from '../uni-tr/table-checkbox.vue'
-	export default {
-		name: 'uniThead',
-		components: {
-			tableCheckbox
-		},
-		options: {
-			// #ifdef MP-TOUTIAO
-			virtualHost: false,
-			// #endif
-			// #ifndef MP-TOUTIAO
-			virtualHost: true
-			// #endif
+import tableCheckbox from '../uni-tr/table-checkbox.vue'
+export default {
+	name: 'uniThead',
+	components: {
+		tableCheckbox
+	},
+	options: {
+		// #ifdef MP-TOUTIAO
+		virtualHost: false,
+		// #endif
+		// #ifndef MP-TOUTIAO
+		virtualHost: true
+		// #endif
+	},
+	data() {
+		return {
+			border: false,
+			selection: false,
+			rowspan: 1,
+			indeterminate: false,
+			checked: false
+		}
+	},
+	created() {
+		this.root = this.getTable()
+		// #ifdef H5
+		this.root.theadChildren = this
+		// #endif
+		this.border = this.root.border
+		this.selection = this.root.type
+	},
+	methods: {
+		init(self) {
+			this.rowspan++
 		},
-		data() {
-			return {
-				border: false,
-				selection: false,
-				rowspan: 1,
-				indeterminate: false,
-				checked: false
+		checkboxSelected(e) {
+			this.indeterminate = false
+			const backIndexData = this.root.backIndexData
+			const data = this.root.trChildren.filter(v => !v.disabled && v.keyValue)
+			if (backIndexData.length === data.length) {
+				this.checked = false
+				this.root.clearSelection()
+			} else {
+				this.checked = true
+				this.root.selectionAll()
 			}
 		},
-		created() {
-			this.root = this.getTable()
-			// #ifdef H5
-			this.root.theadChildren = this
-			// #endif
-			this.border = this.root.border
-			this.selection = this.root.type
-		},
-		methods: {
-			init(self) {
-				this.rowspan++
-			},
-			checkboxSelected(e) {
-				this.indeterminate = false
-				const backIndexData = this.root.backIndexData
-				const data = this.root.trChildren.filter(v => !v.disabled && v.keyValue)
-				if (backIndexData.length === data.length) {
-					this.checked = false
-					this.root.clearSelection()
-				} else {
-					this.checked = true
-					this.root.selectionAll()
-				}
-			},
-			/**
-			 * 获取父元素实例
-			 */
-			getTable(name = 'uniTable') {
-				let parent = this.$parent
-				let parentName = parent.$options.name
-				while (parentName !== name) {
-					parent = parent.$parent
-					if (!parent) return false
-					parentName = parent.$options.name
-				}
-				return parent
+		/**
+		 * 获取父元素实例
+		 */
+		getTable(name = 'uniTable') {
+			let parent = this.$parent
+			let parentName = parent.$options.name
+			while (parentName !== name) {
+				parent = parent.$parent
+				if (!parent) return false
+				parentName = parent.$options.name
 			}
+			return parent
 		}
 	}
+}
 </script>
 
 <style lang="scss">
-	$border-color: #ebeef5;
+$border-color: #ebeef5;
 
-	.uni-table-thead {
-		display: table-header-group;
-	}
+.uni-table-thead {
+	display: table-header-group;
+}
 
-	.uni-table-tr {
-		/* #ifndef APP-NVUE */
-		display: table-row;
-		transition: all 0.3s;
-		box-sizing: border-box;
-		/* #endif */
-		border: 1px red solid;
-		background-color: #fafafa;
-	}
+.uni-table-tr {
+	/* #ifndef APP-NVUE */
+	display: table-row;
+	transition: all 0.3s;
+	box-sizing: border-box;
+	/* #endif */
+	border: 1px red solid;
+	background-color: #fafafa;
+}
 
-	.checkbox {
-		padding: 0 8px;
-		width: 26px;
-		padding-left: 12px;
-		/* #ifndef APP-NVUE */
-		display: table-cell;
-		vertical-align: middle;
-		/* #endif */
-		color: #333;
-		font-weight: 500;
-		border-bottom: 1px $border-color solid;
-		font-size: 14px;
-		// text-align: center;
-	}
+.checkbox {
+	padding: 0 8px;
+	width: 26px;
+	padding-left: 12px;
+	/* #ifndef APP-NVUE */
+	display: table-cell;
+	vertical-align: middle;
+	/* #endif */
+	color: var(--bs-heading-color);
+	font-weight: 500;
+	border-bottom: 1px $border-color solid;
+	font-size: 14px;
+	// text-align: center;
+}
 
-	.tr-table--border {
-		border-right: 1px $border-color solid;
-	}
+.tr-table--border {
+	border-right: 1px $border-color solid;
+}
 
-	/* #ifndef APP-NVUE */
-	.uni-table-tr {
-		::v-deep .uni-table-th {
-			&.table--border:last-child {
-				// border-right: none;
-			}
+/* #ifndef APP-NVUE */
+.uni-table-tr {
+	::v-deep .uni-table-th {
+		&.table--border:last-child {
+			// border-right: none;
 		}
+	}
 
-		::v-deep .uni-table-td {
-			&.table--border:last-child {
-				// border-right: none;
-			}
+	::v-deep .uni-table-td {
+		&.table--border:last-child {
+			// border-right: none;
 		}
 	}
+}
 
-	/* #endif */
-</style>
+/* #endif */
+</style>

+ 140 - 140
uni_modules/uni-table/components/uni-tr/uni-tr.vue

@@ -11,7 +11,7 @@
 	<!-- #endif -->
 	<!-- #ifndef H5 -->
 	<view class="uni-table-tr">
-		<view v-if="selection === 'selection' " class="checkbox" :class="{ 'tr-table--border': border }">
+		<view v-if="selection === 'selection'" class="checkbox" :class="{ 'tr-table--border': border }">
 			<table-checkbox :checked="checked" :indeterminate="indeterminate" :disabled="disabled"
 				@checkboxSelected="checkboxSelected"></table-checkbox>
 		</view>
@@ -21,164 +21,164 @@
 </template>
 
 <script>
-	import tableCheckbox from './table-checkbox.vue'
-	/**
-	 * Tr 表格行组件
-	 * @description 表格行组件 仅包含 th,td 组件
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=
-	 */
-	export default {
-		name: 'uniTr',
-		components: {
-			tableCheckbox
+import tableCheckbox from './table-checkbox.vue'
+/**
+ * Tr 表格行组件
+ * @description 表格行组件 仅包含 th,td 组件
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=
+ */
+export default {
+	name: 'uniTr',
+	components: {
+		tableCheckbox
+	},
+	props: {
+		disabled: {
+			type: Boolean,
+			default: false
 		},
-		props: {
-			disabled: {
-				type: Boolean,
-				default: false
-			},
-			keyValue: {
-				type: [String, Number],
-				default: ''
-			}
-		},
-		options: {
-			// #ifdef MP-TOUTIAO
-			virtualHost: false,
-			// #endif
-			// #ifndef MP-TOUTIAO
-			virtualHost: true
-			// #endif
-		},
-		data() {
-			return {
-				value: false,
-				border: false,
-				selection: false,
-				widthThArr: [],
-				ishead: true,
-				checked: false,
-				indeterminate: false
-			}
-		},
-		created() {
-			this.root = this.getTable()
-			this.head = this.getTable('uniThead')
-			if (this.head) {
-				this.ishead = false
-				this.head.init(this)
-			}
-			this.border = this.root.border
-			this.selection = this.root.type
-			this.root.trChildren.push(this)
-			const rowData = this.root.data.find(v => v[this.root.rowKey] === this.keyValue)
-			if (rowData) {
-				this.rowData = rowData
-			}
-			this.root.isNodata()
-		},
-		mounted() {
+		keyValue: {
+			type: [String, Number],
+			default: ''
+		}
+	},
+	options: {
+		// #ifdef MP-TOUTIAO
+		virtualHost: false,
+		// #endif
+		// #ifndef MP-TOUTIAO
+		virtualHost: true
+		// #endif
+	},
+	data() {
+		return {
+			value: false,
+			border: false,
+			selection: false,
+			widthThArr: [],
+			ishead: true,
+			checked: false,
+			indeterminate: false
+		}
+	},
+	created() {
+		this.root = this.getTable()
+		this.head = this.getTable('uniThead')
+		if (this.head) {
+			this.ishead = false
+			this.head.init(this)
+		}
+		this.border = this.root.border
+		this.selection = this.root.type
+		this.root.trChildren.push(this)
+		const rowData = this.root.data.find(v => v[this.root.rowKey] === this.keyValue)
+		if (rowData) {
+			this.rowData = rowData
+		}
+		this.root.isNodata()
+	},
+	mounted() {
+		if (this.widthThArr.length > 0) {
+			const selectionWidth = this.selection === 'selection' ? 50 : 0
+			this.root.minWidth = Number(this.widthThArr.reduce((a, b) => Number(a) + Number(b))) + selectionWidth;
+		}
+	},
+	// #ifndef VUE3
+	destroyed() {
+		const index = this.root.trChildren.findIndex(i => i === this)
+		this.root.trChildren.splice(index, 1)
+		this.root.isNodata()
+	},
+	// #endif
+	// #ifdef VUE3
+	unmounted() {
+		const index = this.root.trChildren.findIndex(i => i === this)
+		this.root.trChildren.splice(index, 1)
+		this.root.isNodata()
+	},
+	// #endif
+	methods: {
+		minWidthUpdate(width) {
+			this.widthThArr.push(width)
 			if (this.widthThArr.length > 0) {
-				const selectionWidth = this.selection === 'selection' ? 50 : 0
+				const selectionWidth = this.selection === 'selection' ? 50 : 0;
 				this.root.minWidth = Number(this.widthThArr.reduce((a, b) => Number(a) + Number(b))) + selectionWidth;
 			}
 		},
-		// #ifndef VUE3
-		destroyed() {
-			const index = this.root.trChildren.findIndex(i => i === this)
-			this.root.trChildren.splice(index, 1)
-			this.root.isNodata()
-		},
-		// #endif
-		// #ifdef VUE3
-		unmounted() {
-			const index = this.root.trChildren.findIndex(i => i === this)
-			this.root.trChildren.splice(index, 1)
-			this.root.isNodata()
+		// 选中
+		checkboxSelected(e) {
+			let rootData = this.root.data.find(v => v[this.root.rowKey] === this.keyValue)
+			this.checked = e.checked
+			this.root.check(rootData || this, e.checked, rootData ? this.keyValue : null)
 		},
-		// #endif
-		methods: {
-			minWidthUpdate(width) {
-				this.widthThArr.push(width)
-				if (this.widthThArr.length > 0) {
-					const selectionWidth = this.selection === 'selection' ? 50 : 0;
-					this.root.minWidth = Number(this.widthThArr.reduce((a, b) => Number(a) + Number(b))) + selectionWidth;
+		change(e) {
+			this.root.trChildren.forEach(item => {
+				if (item === this) {
+					this.root.check(this, e.detail.value.length > 0 ? true : false)
 				}
-			},
-			// 选中
-			checkboxSelected(e) {
-				let rootData = this.root.data.find(v => v[this.root.rowKey] === this.keyValue)
-				this.checked = e.checked
-				this.root.check(rootData || this, e.checked, rootData ? this.keyValue : null)
-			},
-			change(e) {
-				this.root.trChildren.forEach(item => {
-					if (item === this) {
-						this.root.check(this, e.detail.value.length > 0 ? true : false)
-					}
-				})
-			},
-			/**
-			 * 获取父元素实例
-			 */
-			getTable(name = 'uniTable') {
-				let parent = this.$parent
-				let parentName = parent.$options.name
-				while (parentName !== name) {
-					parent = parent.$parent
-					if (!parent) return false
-					parentName = parent.$options.name
-				}
-				return parent
+			})
+		},
+		/**
+		 * 获取父元素实例
+		 */
+		getTable(name = 'uniTable') {
+			let parent = this.$parent
+			let parentName = parent.$options.name
+			while (parentName !== name) {
+				parent = parent.$parent
+				if (!parent) return false
+				parentName = parent.$options.name
 			}
+			return parent
 		}
 	}
+}
 </script>
 
 <style lang="scss">
-	$border-color: #ebeef5;
+$border-color: #ebeef5;
 
-	.uni-table-tr {
-		/* #ifndef APP-NVUE */
-		display: table-row;
-		transition: all 0.3s;
-		box-sizing: border-box;
-		/* #endif */
-	}
+.uni-table-tr {
+	/* #ifndef APP-NVUE */
+	display: table-row;
+	transition: all 0.3s;
+	box-sizing: border-box;
+	/* #endif */
+}
 
-	.checkbox {
-		padding: 0 8px;
-		width: 26px;
-		padding-left: 12px;
-		/* #ifndef APP-NVUE */
-		display: table-cell;
-		vertical-align: middle;
-		/* #endif */
-		color: #333;
-		font-weight: 500;
-		border-bottom: 1px $border-color solid;
-		font-size: 14px;
-		// text-align: center;
-	}
+.checkbox {
+	padding: 0 8px;
+	width: 26px;
+	padding-left: 12px;
+	/* #ifndef APP-NVUE */
+	display: table-cell;
+	vertical-align: middle;
+	/* #endif */
+	color: var(--bs-heading-color);
+	font-weight: 500;
+	border-bottom: 1px $border-color solid;
+	font-size: 14px;
+	// text-align: center;
+}
 
-	.tr-table--border {
-		border-right: 1px $border-color solid;
-	}
+.tr-table--border {
+	border-right: 1px $border-color solid;
+}
 
-	/* #ifndef APP-NVUE */
-	.uni-table-tr {
-		::v-deep .uni-table-th {
-			&.table--border:last-child {
-				// border-right: none;
-			}
+/* #ifndef APP-NVUE */
+.uni-table-tr {
+	::v-deep .uni-table-th {
+		&.table--border:last-child {
+			// border-right: none;
 		}
+	}
 
-		::v-deep .uni-table-td {
-			&.table--border:last-child {
-				// border-right: none;
-			}
+	::v-deep .uni-table-td {
+		&.table--border:last-child {
+			// border-right: none;
 		}
 	}
+}
 
-	/* #endif */
-</style>
+/* #endif */
+</style>

+ 1 - 1
uni_modules/uni-tabs/components/uni-tabs/uni-tabs.vue

@@ -250,7 +250,7 @@ export default {
 
       &.disabled {
         opacity: 0.5;
-        color: #999;
+        color: var(--bs-heading-color);
       }
     }
 

+ 139 - 139
uni_modules/uni-title/components/uni-title/uni-title.vue

@@ -1,171 +1,171 @@
 <template>
-	<view class="uni-title__box" :style="{'align-items':textAlign}">
-		<text class="uni-title__base" :class="['uni-'+type]" :style="{'color':color}">{{title}}</text>
+	<view class="uni-title__box" :style="{ 'align-items': textAlign }">
+		<text class="uni-title__base" :class="['uni-' + type]" :style="{ 'color': color }">{{ title }}</text>
 	</view>
 </template>
 
-<script>
-	/**
-	 * Title 标题
-	 * @description 标题,通常用于记录页面标题,使用当前组件,uni-app 如果开启统计,将会自动统计页面标题
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=1066
-	 * @property {String} type = [h1|h2|h3|h4|h5] 标题类型
-	 * 	@value h1 一级标题
-	 * 	@value h2 二级标题
-	 * 	@value h3 三级标题
-	 * 	@value h4 四级标题
-	 * 	@value h5 五级标题
-	 * @property {String} title 标题内容
-	 * @property {String} align = [left|center|right] 对齐方式
-	 * 	@value left 做对齐
-	 * 	@value center 居中对齐
-	 * 	@value right 右对齐
-	 * @property {String} color 字体颜色
-	 * @property {Boolean} stat = [true|false] 是否开启统计功能呢,如不填写type值,默认为开启,填写 type 属性,默认为关闭
-	 */
-	export default {
-		name:"UniTitle",
-		props: {
-			type: {
-				type: String,
-				default: ''
-			},
-			title: {
-				type: String,
-				default: ''
-			},
-			align: {
-				type: String,
-				default: 'left'
-			},
-			color: {
-				type: String,
-				default: '#333333'
-			},
-			stat: {
-				type: [Boolean, String],
-				default: ''
-			}
+<script>
+/**
+ * Title 标题
+ * @description 标题,通常用于记录页面标题,使用当前组件,uni-app 如果开启统计,将会自动统计页面标题
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=1066
+ * @property {String} type = [h1|h2|h3|h4|h5] 标题类型
+ * 	@value h1 一级标题
+ * 	@value h2 二级标题
+ * 	@value h3 三级标题
+ * 	@value h4 四级标题
+ * 	@value h5 五级标题
+ * @property {String} title 标题内容
+ * @property {String} align = [left|center|right] 对齐方式
+ * 	@value left 做对齐
+ * 	@value center 居中对齐
+ * 	@value right 右对齐
+ * @property {String} color 字体颜色
+ * @property {Boolean} stat = [true|false] 是否开启统计功能呢,如不填写type值,默认为开启,填写 type 属性,默认为关闭
+ */
+export default {
+	name: "UniTitle",
+	props: {
+		type: {
+			type: String,
+			default: ''
 		},
-		data() {
-			return {
-
-			};
+		title: {
+			type: String,
+			default: ''
 		},
-		computed: {
-			textAlign() {
-				let align = 'center';
-				switch (this.align) {
-					case 'left':
-						align = 'flex-start'
-						break;
-					case 'center':
-						align = 'center'
-						break;
-					case 'right':
-						align = 'flex-end'
-						break;
-				}
-				return align
-			}
+		align: {
+			type: String,
+			default: 'left'
 		},
-		watch: {
-			title(newVal) {
-				if (this.isOpenStat()) {
-					// 上报数据
-					if (uni.report) {
-						uni.report('title', this.title)
-					}
-				}
-			}
+		color: {
+			type: String,
+			default: '#333333'
 		},
-		mounted() {
+		stat: {
+			type: [Boolean, String],
+			default: ''
+		}
+	},
+	data() {
+		return {
+
+		};
+	},
+	computed: {
+		textAlign() {
+			let align = 'center';
+			switch (this.align) {
+				case 'left':
+					align = 'flex-start'
+					break;
+				case 'center':
+					align = 'center'
+					break;
+				case 'right':
+					align = 'flex-end'
+					break;
+			}
+			return align
+		}
+	},
+	watch: {
+		title(newVal) {
 			if (this.isOpenStat()) {
 				// 上报数据
-				if (uni.report) {
+				if (uni.report) {
 					uni.report('title', this.title)
 				}
 			}
-		},
-		methods: {
-			isOpenStat() {
-				if (this.stat === '') {
+		}
+	},
+	mounted() {
+		if (this.isOpenStat()) {
+			// 上报数据
+			if (uni.report) {
+				uni.report('title', this.title)
+			}
+		}
+	},
+	methods: {
+		isOpenStat() {
+			if (this.stat === '') {
+				this.isStat = false
+			}
+			let stat_type = (typeof (this.stat) === 'boolean' && this.stat) || (typeof (this.stat) === 'string' && this.stat !==
+				'')
+			if (this.type === "") {
+				this.isStat = true
+				if (this.stat.toString() === 'false') {
 					this.isStat = false
 				}
-				let stat_type = (typeof(this.stat) === 'boolean' && this.stat) || (typeof(this.stat) === 'string' && this.stat !==
-					'')
-				if (this.type === "") {
-					this.isStat = true
-					if (this.stat.toString() === 'false') {
-						this.isStat = false
-					}
-				}
+			}
 
-				if (this.type !== '') {
+			if (this.type !== '') {
+				this.isStat = true
+				if (stat_type) {
 					this.isStat = true
-					if (stat_type) {
-						this.isStat = true
-					} else {
-						this.isStat = false
-					}
+				} else {
+					this.isStat = false
 				}
-				return this.isStat
 			}
+			return this.isStat
 		}
 	}
+}
 </script>
 
 <style>
-	/* .uni-title {
+/* .uni-title {
 
 	} */
-	.uni-title__box {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: column;
-		align-items: flex-start;
-		justify-content: center;
-		padding: 8px 0;
-		flex: 1;
-	}
+.uni-title__box {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: column;
+	align-items: flex-start;
+	justify-content: center;
+	padding: 8px 0;
+	flex: 1;
+}
 
-	.uni-title__base {
-		font-size: 15px;
-		color: #333;
-		font-weight: 500;
-	}
+.uni-title__base {
+	font-size: 15px;
+	color: var(--bs-heading-color);
+	font-weight: 500;
+}
 
-	.uni-h1 {
-		font-size: 20px;
-		color: #333;
-		font-weight: bold;
-	}
+.uni-h1 {
+	font-size: 20px;
+	color: var(--bs-heading-color);
+	font-weight: bold;
+}
 
-	.uni-h2 {
-		font-size: 18px;
-		color: #333;
-		font-weight: bold;
-	}
+.uni-h2 {
+	font-size: 18px;
+	color: var(--bs-heading-color);
+	font-weight: bold;
+}
 
-	.uni-h3 {
-		font-size: 16px;
-		color: #333;
-		font-weight: bold;
-		/* font-weight: 400; */
-	}
+.uni-h3 {
+	font-size: 16px;
+	color: var(--bs-heading-color);
+	font-weight: bold;
+	/* font-weight: 400; */
+}
 
-	.uni-h4 {
-		font-size: 14px;
-		color: #333;
-		font-weight: bold;
-		/* font-weight: 300; */
-	}
+.uni-h4 {
+	font-size: 14px;
+	color: var(--bs-heading-color);
+	font-weight: bold;
+	/* font-weight: 300; */
+}
 
-	.uni-h5 {
-		font-size: 12px;
-		color: #333;
-		font-weight: bold;
-		/* font-weight: 200; */
-	}
-</style>
+.uni-h5 {
+	font-size: 12px;
+	color: var(--bs-heading-color);
+	font-weight: bold;
+	/* font-weight: 200; */
+}
+</style>

+ 85 - 85
uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue

@@ -3,7 +3,7 @@
 		<slot></slot>
 		<view v-if="content || $slots.content" class="uni-tooltip-popup" :style="initPlacement">
 			<slot name="content">
-				{{content}}
+				{{ content }}
 			</slot>
 		</view>
 	</view>
@@ -11,99 +11,99 @@
 
 
 <script>
-	/**
-	 * Tooltip 提示文字
-	 * @description 常用于展示鼠标 hover 时的提示信息。
-	 * @tutorial https://uniapp.dcloud.io/component/uniui/uni-tooltip
-	 * @property {String} content   弹出层显示的内容
-	 * @property {String}  placement出现位置, 目前支持:left right top bottom
-	 */
-	export default {
-		name: "uni-tooltip",
-		data() {
-			return {
+/**
+ * Tooltip 提示文字
+ * @description 常用于展示鼠标 hover 时的提示信息。
+ * @tutorial https://uniapp.dcloud.io/component/uniui/uni-tooltip
+ * @property {String} content   弹出层显示的内容
+ * @property {String}  placement出现位置, 目前支持:left right top bottom
+ */
+export default {
+	name: "uni-tooltip",
+	data() {
+		return {
 
-			};
-		},
-		methods: {},
-		computed: {
-			initPlacement() {
-				let style = {};
-				switch (this.placement) {
-					case 'left':
-						style = {
-							top: '50%',
-							transform: 'translateY(-50%)',
-							right: '100%',
-							"margin-right": '10rpx',
-						}
-						break;
-					case 'right':
-						style = {
-							top: '50%',
-							transform: 'translateY(-50%)',
-							left: '100%',
-							"margin-left": '10rpx',
-						}
-						break;
-					case 'top':
-						style = {
-							bottom: '100%',
-							transform: 'translateX(-50%)',
-							left: '50%',
-							"margin-bottom": '10rpx',
-						}
-						break;
-					case 'bottom':
-						style = {
-							top: '100%',
-							transform: 'translateX(-50%)',
-							left: '50%',
-							"margin-top": '10rpx',
-						}
-						break;
-				}
-				return style;
+		};
+	},
+	methods: {},
+	computed: {
+		initPlacement() {
+			let style = {};
+			switch (this.placement) {
+				case 'left':
+					style = {
+						top: '50%',
+						transform: 'translateY(-50%)',
+						right: '100%',
+						"margin-right": '10rpx',
+					}
+					break;
+				case 'right':
+					style = {
+						top: '50%',
+						transform: 'translateY(-50%)',
+						left: '100%',
+						"margin-left": '10rpx',
+					}
+					break;
+				case 'top':
+					style = {
+						bottom: '100%',
+						transform: 'translateX(-50%)',
+						left: '50%',
+						"margin-bottom": '10rpx',
+					}
+					break;
+				case 'bottom':
+					style = {
+						top: '100%',
+						transform: 'translateX(-50%)',
+						left: '50%',
+						"margin-top": '10rpx',
+					}
+					break;
 			}
+			return style;
+		}
+	},
+	props: {
+		content: {
+			type: String,
+			default: ''
 		},
-		props: {
-			content: {
-				type: String,
-				default: ''
-			},
 
-			placement: {
-				type: String,
-				default: 'bottom'
-			},
-		}
+		placement: {
+			type: String,
+			default: 'bottom'
+		},
 	}
+}
 </script>
 
 <style>
-	.uni-tooltip {
-		position: relative;
-		cursor: pointer;
-		display: inline-block;
-	}
+.uni-tooltip {
+	position: relative;
+	cursor: pointer;
+	display: inline-block;
+}
 
-	.uni-tooltip-popup {
-		z-index: 1;
-		display: none;
-		position: absolute;
-		background-color: #333;
-		border-radius: 8px;
-		color: #fff;
-		font-size: 12px;
-		text-align: left;
-		line-height: 16px;
-		padding: 12px;
-		overflow: auto;
-		width: 200rpx;
-	}
+.uni-tooltip-popup {
+	z-index: 1;
+	display: none;
+	position: absolute;
+	background-color: var(--bs-heading-color);
+	border-radius: 8px;
+	color: #fff;
+	font-size: 12px;
+	text-align: left;
+	line-height: 16px;
+	padding: 12px;
+	overflow: auto;
+	width: 200rpx;
+}
 
 
-	.uni-tooltip:hover .uni-tooltip-popup {
-		display: block;
-	}
+.uni-tooltip:hover .uni-tooltip-popup {
+	display: block;
+}
 </style>

+ 10 - 10
uni_modules/x-dropdown/readme.md

@@ -163,7 +163,7 @@ export default {
   padding: 12px 16px;
   background: #f8f8f8;
   font-size: 14px;
-  color: #666;
+  color: var(--bs-heading-color);
   border-bottom: 1px solid #eee;
 }
 
@@ -185,7 +185,7 @@ export default {
 
 .menu-text {
   font-size: 16px;
-  color: #333;
+  color: var(--bs-heading-color);
 }
 </style>
 ```
@@ -406,7 +406,7 @@ export default {
   font-size: 18px;
   font-weight: bold;
   margin-bottom: 16px;
-  color: #333;
+  color: var(--bs-heading-color);
 }
 
 .basic-trigger {
@@ -422,7 +422,7 @@ export default {
 
 .dropdown-arrow {
   font-size: 12px;
-  color: #666;
+  color: var(--bs-heading-color);
   transition: transform 0.3s;
 }
 
@@ -465,7 +465,7 @@ export default {
   display: flex;
   align-items: center;
   padding: 12px 16px;
-  border-bottom: 1px solid #f0f0f0;
+  border-bottom: 1px solid var(--bs-border-color);
 }
 
 .action-item:last-child {
@@ -484,7 +484,7 @@ export default {
 
 .action-text {
   font-size: 16px;
-  color: #333;
+  color: var(--bs-heading-color);
 }
 </style>
 ```
@@ -496,7 +496,7 @@ export default {
 3. **点击关闭**:点击遮罩层会自动关闭菜单
 4. **自定义菜单**:使用插槽时需要手动调用 `close()` 方法关闭菜单
 5. **样式优先级**:`menuStyle` 属性只对默认菜单生效,插槽菜单需要自定义样式
-
-
-
-### 插件如果对你有帮助给个好评吧~
+
+
+
+### 插件如果对你有帮助给个好评吧~

+ 1 - 1
windows/left-window.vue

@@ -1,5 +1,5 @@
 <template>
-  <view class="cwg-sidebar bg-body " :class="{ 'sidebar-collapsed': isCollapsed }">
+  <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)">

+ 14 - 5
windows/top-window.vue

@@ -1,7 +1,10 @@
 <template>
-  <header class="cwg-pc-header">
+  <header class="cwg-pc-header bg-body" :class="{ 'dark': isDark }">
     <div class="left">
-      <image class="left-img" src="/static/images/logo-full.svg" mode="widthFix" alt="logo" @click="openLeftDrawer" />
+      <image class="left-img" src="/static/images/vu/logo.png" mode="widthFix" alt="logo" @click="openLeftDrawer" />
+      <image class="left-img1" v-if="!isDark" src="/static/images/vu/logo-text-dark.png" mode="widthFix" alt="logo" @click="openLeftDrawer" />
+      <image class="left-img1" v-else src="/static/images/vu/logo-text-white.png" mode="widthFix" alt="logo" @click="openLeftDrawer" />
+
     </div>
     <div class="right" v-if="visible">
       <cwg-payment />
@@ -17,10 +20,11 @@
 import { ref, computed, watch } from 'vue'
 import { storeToRefs } from 'pinia'
 import useUserStore from '@/stores/use-user-store'
-
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
-
+import useGlobalStore from '@/stores/use-global-store'
+const globalStore = useGlobalStore()
+const isDark = computed(() => globalStore.theme === 'dark')
 const visible = ref(true)
 
 watch(() => userInfo.value, (val) => {
@@ -75,7 +79,12 @@ const props = defineProps({
 }
 
 .left-img {
-  width: px2rpx(120);
+  width: px2rpx(40);
+}
+.left-img1 {
+  display: block;
+  margin-left: 12px;
+  width: px2rpx(80);
 }
 
 .avatar .img {