zhb hace 1 mes
padre
commit
d68bee99e2

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

@@ -310,11 +310,6 @@ const resetForm = () => {
 }
 // 触发查询
 const handleSearch = () => {
-    console.log(formData.value, 1212);
-
-    // if (formData.value.login) {
-    //     formData.value.login = Number(formData.value.login)
-    // }
     emit('search', { ...formData.value })
 }
 

+ 4 - 0
components/cwg-dropdown.vue

@@ -131,6 +131,10 @@ onMounted(() => {
     getSystemInfo()
     innerInterspace.value = str2px(props.interspace)
 })
+// 暴露方法
+defineExpose({
+    close
+})
 </script>
 
 <style lang="scss" scoped>

+ 2 - 3
components/cwg-empty-state.vue

@@ -19,7 +19,7 @@ const props = defineProps({
 
 .empty-state {
   display: flex;
-  padding: px2rpx(31) px2rpx(24);
+  padding: px2rpx(31) px2rpx(20);
   justify-content: center;
   align-items: center;
   border-radius: 12px;
@@ -32,10 +32,9 @@ const props = defineProps({
   }
 
   .title {
-
     color: #1a1a1a;
     font-family: Roboto;
-    font-size: px2rpx(31);
+    font-size: px2rpx(26);
     font-style: normal;
     font-weight: 600;
     line-height: px2rpx(44);

+ 1 - 5
components/LanguageDropdown.vue → components/cwg-language.vue

@@ -13,11 +13,6 @@ import { localesList, LANG_MAP } from '@/locale/index'
 import { lang } from '@/composables/config'
 
 const { t, locale } = useI18n()
-
-const currentLang = computed(() => lang.value || locale.value)
-const currentLabel = computed(() => t(`language.${currentLang.value}`))
-const currentFlag = computed(() => getFlagSrc(currentLang.value))
-
 const customMenuList = computed(() =>
   localesList.map((code) => ({
     label: t(`language.${code}`),
@@ -52,6 +47,7 @@ function getFlagSrc(code: string) {
 
 <style scoped lang="scss">
 @import "@/uni.scss";
+
 :deep(.cwg-dropdown-menu-container .menu .menu-item) {
   min-height: px2rpx(36);
 }

+ 166 - 19
components/cwg-notice.vue

@@ -1,18 +1,78 @@
 <template>
-    <view class="pc-header-btn" :class="{ 'has-dot': isRed }">
-        <cwg-icon name="xxtz" color="#141d22" @click="openNotice" />
+    <view class="notice-container">
+        <cwg-dropdown ref="dropdownRef" :menu-list="[]">
+            <view class="pc-header-btn" :class="{ 'has-dot': isRed }">
+                <cwg-icon name="xxtz" color="#141d22" @click="openNotice" />
+            </view>
+            <template #btn>
+                <view class="right-drawer">
+                    <view class="notification-list" v-if="list.length">
+                        <view v-for="item in list" :key="item.id" class="notification-item" @click="goPages(item)">
+                            <view class="item-content">
+                                <view class="item-title">{{ item.subject }}</view>
+                                <view class="item-time">{{ item.addTime }}</view>
+                            </view>
+                            <view class="item-badge" v-if="item.read == 0">
+                                <view class="dot"></view>
+                            </view>
+                        </view>
+                    </view>
+                    <view class="notification-list">
+                        <cwg-empty-state />
+                    </view>
+
+                    <view class="logout-wrap">
+                        <view class="logout-btn" @click="goMore">
+                            <cwg-icon name="crm-mb" :size="16" color="#ff9800" />
+                            <text v-t="'News.More'" />
+                        </view>
+                    </view>
+                </view>
+            </template>
+        </cwg-dropdown>
     </view>
 </template>
 
 <script setup lang="ts">
-import { ref, onMounted } from 'vue'
+import { computed, ref, onMounted } from 'vue'
+import { newsApi } from '@/service/news'
+import useRouter from "@/hooks/useRouter";
 import { useI18n } from 'vue-i18n'
 const { t, locale } = useI18n()
-import { newsApi } from '@/service/news'
 import { userToken } from "@/composables/config";
 const isRed = ref(false)
-function openNotice() {
-    uni.$emit('open-notice-drawer')
+const dropdownRef = ref(null)
+const close = () => {
+    dropdownRef.value.close()
+}
+const router = useRouter();
+const list = ref([])
+const getList = async () => {
+    const res = await newsApi.newsNoticeList({
+        page: { current: 1, row: 6 },
+        lang: locale.value
+    })
+    if (res.data && res.code == 200) {
+        list.value = res.data
+    } else {
+        list.value = []
+    }
+}
+const goPages = (e) => {
+    router.push({
+        path: '/pages/analytics/detail',
+        query: {
+            id: e.id,
+            type: 7
+        }
+    })
+    close()
+}
+const goMore = () => {
+    router.push({
+        path: '/pages/common/notice'
+    })
+    close()
 }
 const getData = async () => {
     const res = await newsApi.newsNoticeRead({
@@ -27,28 +87,115 @@ const getData = async () => {
 onMounted(() => {
     if (!userToken.value) return
     getData()
+    getList()
 })
 </script>
 
 <style scoped lang="scss">
 @import "@/uni.scss";
 
-.pc-header-btn {
-    position: relative;
+.notice-container {
+    :deep(.cwg-dropdown-menu-container) {
+        left: px2rpx(-280) !important;
+        right: px2rpx(0) !important;
+    }
+
+    @media screen and (max-width: 991px) {
+        :deep(.cwg-dropdown-menu-container) {
+            left: px2rpx(-270) !important;
+            max-width: px2rpx(400);
+        }
+    }
+
+    .pc-header-btn {
+        position: relative;
+
+        &::after {
+            content: '';
+            position: absolute;
+            top: px2rpx(4);
+            right: px2rpx(4);
+            width: px2rpx(8);
+            height: px2rpx(8);
+            background-color: #f56c6c;
+            border-radius: 50%;
+        }
+
+        &.has-dot::after {
+            display: block;
+        }
+    }
+
+    .right-drawer {
+        width: px2rpx(300);
+        background-color: var(--color-white);
+        display: flex;
+        flex-direction: column;
+        padding: 20px 16px;
+        box-sizing: border-box;
+    }
+
+    .notification-list {
+        width: 100%;
+    }
+
+    .notification-item {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: px2rpx(12) px2rpx(16);
+        border-bottom: 1px solid #f0f0f0;
+        cursor: pointer;
+        transition: all 0.3s;
+
+        &:hover {
+            background-color: rgba(0, 0, 0, 0.05);
+        }
+
+        .item-content {
+            flex: 1;
+
+            .item-title {
+                font-size: px2rpx(14);
+                color: #333;
+                line-height: 1.4;
+                margin-bottom: px2rpx(4);
+            }
+
+            .item-time {
+                font-size: px2rpx(12);
+                color: #999;
+            }
+        }
+
+        .item-badge {
+            margin-left: px2rpx(12);
+
+            .dot {
+                width: px2rpx(8);
+                height: px2rpx(8);
+                background-color: #f56c6c;
+                border-radius: 50%;
+            }
+        }
+    }
 
-    &::after {
-        content: '';
-        position: absolute;
-        top: px2rpx(4);
-        right: px2rpx(4);
-        width: px2rpx(8);
-        height: px2rpx(8);
-        background-color: #f56c6c;
-        border-radius: 50%;
+    .logout-wrap {
+        margin-top: auto;
+        padding: 20px 16px;
+        margin-bottom: 20px;
     }
 
-    &.has-dot::after {
-        display: block;
+    .logout-btn {
+        height: 44px;
+        background: #f4eadf;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        gap: 8px;
+        color: #ff9800;
+        font-weight: 600;
+        cursor: pointer;
     }
 }
 </style>

+ 72 - 15
components/cwg-page-wrapper.vue

@@ -3,11 +3,13 @@
     <cwg-match-media :max-width="991" v-if="!isLoginPage">
       <cwg-pc-header @open-right-drawer="openRightDrawer" @open-left-drawer="openLeftDrawer" class="header-box"
         :sidebarVisible="sidebarVisible" />
-      <!--      占位-->
+      <view class="sidebar-mask mask-visible" v-if="sidebarVisible" @click="openLeftDrawer">
+
+      </view>
       <view class="fixed"></view>
       <cwg-header v-if=pageTitle class="custom-header" :title="pageTitle" />
     </cwg-match-media>
-    <LanguageDropdown style="width: 0;display: none;" />
+    <cwg-language style="width: 0;display: none;" />
     <cwg-progress />
     <cwg-confirm-popup />
 
@@ -17,8 +19,8 @@
           <cwg-sidebar />
         </view>
         <view class="sidebar-mask" v-if="sidebarVisible" @click="openLeftDrawer" :style="{
-          opacity: sidebarVisible ? 1 : 0,
-          transition: 'opacity 281ms cubic-bezier(0.4, 0, 0.2, 1)'
+          opacity: maskVisible ? 1 : 0,
+          transition: 'opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1)'
         }">
 
         </view>
@@ -31,9 +33,11 @@
 
         <view class="content-wrapper" :class="{ 'content-wrapper-padding': isContentPadding }">
           <!-- <cwg-header /> -->
-          <view>
-            <slot />
-          </view>
+          <transition name="fade" mode="out-in">
+            <view :key="$route.path">
+              <slot />
+            </view>
+          </transition>
           <cwg-custom-footer />
         </view>
       </view>
@@ -41,8 +45,6 @@
     </view>
     <cwg-right-drawer v-if="!isLoginPage" ref="rightDrawerRef" @navigate="handleDrawerNavigate"
       @logout="handleDrawerLogout" />
-    <cwg-notice-drawer v-if="!isLoginPage" ref="noticeDrawerRef" @navigate="handleDrawerNavigate"
-      @logout="handleDrawerLogout" />
   </view>
 </template>
 
@@ -54,7 +56,6 @@ import useRouter from '@/hooks/useRouter'
 import useUserStore from '@/stores/use-user-store'
 import { userApi } from '@/api/user'
 import useGlobalStore from '@/stores/use-global-store'
-import LanguageDropdown from './LanguageDropdown.vue'
 import PrefectInfo from '@/components/PrefectInfo.vue'
 import IbInfo from '@/components/IbInfo.vue'
 
@@ -91,8 +92,6 @@ const props = defineProps({
 })
 const isDark = computed(() => globalStore.theme === 'dark')
 const isTabBarPage = ref(false)
-
-
 const rightDrawerRef = ref<any>(null)
 const noticeDrawerRef = ref<any>(null)
 const ibRef = ref<any>(null)
@@ -129,9 +128,24 @@ function openRightDrawer() {
 }
 
 const sidebarVisible = ref(false)
+const maskVisible = ref(false)
 
 function openLeftDrawer() {
-  sidebarVisible.value = !sidebarVisible.value
+  if (sidebarVisible.value) {
+    // 关闭时先隐藏遮罩层
+    maskVisible.value = false
+    // 等待遮罩层动画结束后再隐藏侧边栏
+    setTimeout(() => {
+      sidebarVisible.value = false
+    }, 200)
+  } else {
+    // 打开时先显示侧边栏
+    sidebarVisible.value = true
+    // 等待侧边栏动画结束后再显示遮罩层
+    setTimeout(() => {
+      maskVisible.value = true
+    }, 200)
+  }
 }
 
 function handleDrawerNavigate(path: string) {
@@ -197,7 +211,7 @@ onShow(() => {
   top: 0;
   z-index: 1000;
   background-color: #fff;
-  transition: width 281ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: width 81ms cubic-bezier(0.4, 0, 0.2, 1);
 
 }
 
@@ -208,7 +222,13 @@ onShow(() => {
   width: 100vw;
   height: calc(100vh - 56px);
   background-color: rgba(0, 0, 0, 0.2);
-  z-index: 999;
+  z-index: 101;
+}
+
+.mask-visible {
+  background-color: rgba(0, 0, 0, 0);
+  width: 100vw;
+  height: 56px;
 }
 
 .sidebar-visible {
@@ -268,4 +288,41 @@ onShow(() => {
   align-items: center;
   justify-content: center;
 }
+
+/* 页面切换动画 */
+.fade-enter-active,
+.fade-leave-active {
+  transition: opacity 0.3s ease;
+}
+
+.fade-enter-from,
+.fade-leave-to {
+  opacity: 0;
+}
+
+/* 侧边栏动画优化 */
+.left-sidebar {
+  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.sidebar-mask {
+  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* 内容区域动画 */
+.content-wrapper {
+  animation: slideIn 0.3s ease-out;
+}
+
+@keyframes slideIn {
+  from {
+    transform: translateY(20px);
+    opacity: 0;
+  }
+
+  to {
+    transform: translateY(0);
+    opacity: 1;
+  }
+}
 </style>

+ 2 - 17
components/cwg-pc-header.vue

@@ -9,16 +9,12 @@
 		</div>
 		<div class="right">
 			<cwg-notice />
-			<view class="pc-header-btn" @click="openRightDrawer">
-				<cwg-icon name="icon_my" color="#141d22" />
-			</view>
+			<cwg-right-drawer />
 		</div>
 	</header>
 </template>
 
 <script setup lang="ts">
-import useRouter from "@/hooks/useRouter";
-const router = useRouter();
 const props = defineProps({
 	sidebarVisible: {
 		type: Boolean,
@@ -30,17 +26,6 @@ const emit = defineEmits<{
 	(e: 'open-left-drawer'): void
 }>()
 
-function toggleTheme() {
-	// globalStore.setGlobalTheme(globalStore.theme === 'light' ? 'dark' : 'light');
-}
-
-function openRightDrawer() {
-	emit('open-right-drawer');
-}
-function openNotice() {
-	uni.$emit('open-notice-drawer')
-}
-
 function openLeftDrawer() {
 	emit('open-left-drawer');
 }
@@ -60,7 +45,7 @@ function openLeftDrawer() {
 	position: fixed;
 	top: 0;
 	left: 0;
-	z-index: 10;
+	z-index: 101;
 }
 
 .left {

+ 140 - 103
components/cwg-right-drawer.vue

@@ -1,45 +1,53 @@
 <template>
-    <uni-popup ref="popupRef" type="right" background-color="#f5f5f5">
-        <view class="right-drawer">
-            <view class="drawer-header">
-                <image class="avatar" src="/static/logo.png" mode="aspectFill" />
-                <view class="user-info">
-                    <text class="name">{{ displayName }}</text>
-                    <text class="cid">CID: {{ displayCid }}</text>
-                </view>
+    <view class="notice-container">
+        <cwg-dropdown ref="dropdownRef" :menu-list="[]">
+            <view class="pc-header-btn">
+                <cwg-icon name="icon_my" color="#141d22" @click="openNotice" />
             </view>
-
-            <view class="menu-list">
-                <view v-for="item in menuList" :key="item.key" class="menu-item"
-                    :class="{ active: activePath === item.path }" @click="handleNavigate(item.path)">
-                    <cwg-icon :name="item.icon" :size="16" :color="activePath === item.path ? '#fff' : '#0f172b'" />
-                    <text>{{ item.name }}</text>
+            <template #btn>
+                <view class="right-drawer">
+                    <view class="drawer-header">
+                        <image class="avatar" src="/static/images/avatars.png" mode="aspectFill" />
+                        <view class="user-info">
+                            <text class="name">{{ displayName }}</text>
+                            <text class="cid">CID: {{ displayCid }}</text>
+                        </view>
+                    </view>
+
+                    <view class="menu-list">
+                        <view v-for="item in menuList" :key="item.key" class="menu-item"
+                            :class="{ active: activePath === item.path }" @click="handleNavigate(item.path)">
+                            <cwg-icon :name="item.icon" :size="16"
+                                :color="activePath === item.path ? '#0f172b' : '#0f172b'" />
+                            <text>{{ item.name }}</text>
+                        </view>
+                    </view>
+                    <view class="logout-wrap">
+                        <view class="logout-btn" @click="handleLogout">
+                            <cwg-icon name="logout" :size="16" color="#ff9800" />
+                            <text>Logout</text>
+                        </view>
+                    </view>
                 </view>
-            </view>
-            <view class="logout-wrap">
-                <view class="logout-btn" @click="handleLogout">
-                    <cwg-icon name="logout" :size="16" color="#ff9800" />
-                    <text>Logout</text>
-                </view>
-            </view>
-        </view>
-    </uni-popup>
+            </template>
+        </cwg-dropdown>
+    </view>
 </template>
 
 <script setup lang="ts">
 import { computed, ref } from 'vue'
 import useRoute from '@/hooks/useRoute'
 import useUserStore from '@/stores/use-user-store'
+import { userApi } from '@/api/user'
 import { useI18n } from "vue-i18n";
 const { t } = useI18n();
-const emit = defineEmits<{
-    (e: 'navigate', path: string): void
-    (e: 'logout'): void
-}>()
-
-const popupRef = ref<any>(null)
+import useRouter from "@/hooks/useRouter";
+const router = useRouter();
+const dropdownRef = ref(null)
 const userStore = useUserStore()
-const userInfo = computed<any>(() => userStore.userInfo || {})
+const userInfo = computed<any>(() => userStore.userInfo?.customInfo || {})
+
+
 const route = useRoute()
 const menuList = computed(() => [
     {
@@ -64,21 +72,28 @@ const displayName = computed(() => {
 const displayCid = computed(() => userInfo.value?.cId || userInfo.value?.id || '--')
 const activePath = computed(() => route.path + (route.query?.type ? `?type=${route.query.type}` : '') || '')
 
-function open() {
-    popupRef.value?.open()
-}
 
 function close() {
-    popupRef.value?.close()
+    dropdownRef.value?.close()
+    console.log(userInfo, 1212);
 }
 
 function handleNavigate(path: string) {
-    emit('navigate', path)
+    router.push({ path })
     close()
 }
 
-function handleLogout() {
-    emit('logout')
+async function handleLogout() {
+    try {
+        const res = await userApi.logout()
+        if (res.code === 200) {
+            userStore.clearUserInfo()
+            router.push('/pages/login/index')
+        }
+    } catch (error) {
+        userStore.clearUserInfo()
+        router.push('/pages/login/index')
+    }
     close()
 }
 
@@ -91,81 +106,103 @@ defineExpose({
 <style scoped lang="scss">
 @import "@/uni.scss";
 
-.right-drawer {
-    width: 300px;
-    height: 100vh;
-    background: #f5f5f5;
-    display: flex;
-    flex-direction: column;
-    padding: 20px 16px;
-}
+.notice-container {
+    :deep(.cwg-dropdown-menu-container) {
+        left: px2rpx(-280) !important;
+        right: px2rpx(0) !important;
+    }
 
-.drawer-header {
-    display: flex;
-    align-items: center;
-    gap: 12px;
-    padding: 20px 16px;
-    border-bottom: 1px solid #d9dde5;
-}
+    @media screen and (max-width: 991px) {
+        :deep(.cwg-dropdown-menu-container) {
+            left: px2rpx(-270) !important;
+            max-width: px2rpx(400);
+        }
+    }
 
-.avatar {
-    width: 76px;
-    height: 76px;
-    border-radius: 12px;
-    background: #fff;
-}
+    .pc-header-btn {
+        position: relative;
+    }
 
-.user-info {
-    display: flex;
-    flex-direction: column;
-    gap: 6px;
-}
+    .right-drawer {
+        width: px2rpx(300);
+        background-color: var(--color-white);
+        display: flex;
+        flex-direction: column;
+        padding: 20px 16px;
+        box-sizing: border-box;
+    }
 
-.name {
-    font-size: 20px;
-    font-weight: 600;
-    color: #334155;
-}
+    .drawer-header {
+        display: flex;
+        align-items: center;
+        gap: 12px;
+        padding: 20px 16px;
+        border-bottom: 1px solid #d9dde5;
+    }
 
-.cid {
-    font-size: 14px;
-    color: #ef4444;
-}
+    .avatar {
+        width: 76px;
+        height: 76px;
+        border-radius: 12px;
+        background: #fff;
+    }
 
-.menu-list {
-    padding: 12px 0;
-}
+    .user-info {
+        display: flex;
+        flex-direction: column;
+        gap: 6px;
+    }
 
-.menu-item {
-    height: 48px;
-    display: flex;
-    align-items: center;
-    gap: 10px;
-    padding: 0 16px;
-    color: #0f172b;
-    font-size: 16px;
-    font-weight: 600;
-}
+    .name {
+        font-size: 20px;
+        font-weight: 600;
+        color: #334155;
+    }
 
-.menu-item.active {
-    background: #ea2027;
-    color: #fff;
-}
+    .cid {
+        font-size: 14px;
+        color: #ef4444;
+    }
 
-.logout-wrap {
-    margin-top: auto;
-    padding: 20px 16px;
-    margin-bottom: 20px;
-}
+    .menu-list {
+        padding: 12px 0;
+    }
 
-.logout-btn {
-    height: 44px;
-    background: #f4eadf;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    gap: 8px;
-    color: #ff9800;
-    font-weight: 600;
+    .menu-item {
+        height: 48px;
+        display: flex;
+        align-items: center;
+        gap: 10px;
+        padding: 0 16px;
+        color: #0f172b;
+        font-size: 16px;
+        font-weight: 600;
+
+        &:hover {
+            background-color: rgba(0, 0, 0, 0.05);
+        }
+    }
+
+    .menu-item.active {
+        background: rgba(108, 133, 149, 0.12) !important;
+        border-radius: 0.125rem;
+    }
+
+    .logout-wrap {
+        margin-top: auto;
+        padding: 20px 16px;
+        margin-bottom: 20px;
+    }
+
+    .logout-btn {
+        height: 44px;
+        background: #f4eadf;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        gap: 8px;
+        color: #ff9800;
+        font-weight: 600;
+    }
 }
 </style>

+ 37 - 15
composables/useAccountOptions.js

@@ -6,48 +6,70 @@ import useUserStore from '@/stores/use-user-store'
 
 export function useAccountOptions() {
     const { loginOptions, saveLoginOptions } = useUserStore()
-    // 响应式数据
-    const isLoaded = ref(false)
-    // 获取账户列表(核心方法)
+
+    // 响应式状态
+    const isLoaded = ref(false)    // 是否已完成请求(成功/失败都算完成)
+    const isSuccess = ref(false)   // 是否请求成功(成功才有数据)
+    const loading = ref(false)     // 补全缺失的 loading
+
+    // 获取账户列表
     const getDateList = async () => {
         try {
+            loading.value = true
             isLoaded.value = false
+            isSuccess.value = false
+
             const res = await customApi.CustomDropdown({ platform: '' })
+
             if (res.code === Code.StatusOK) {
-                // 格式化下拉选项
-                const loginOptions = res.data.map(item => ({
-                    ...item,
-                    value: item.login,
-                    text: item.login
-                }))
-                saveLoginOptions(loginOptions)
+                if (res.data.length === 0) {
+                    saveLoginOptions([])
+                    return
+                } else {
+                    const options = res.data?.map(item => ({
+                        ...item,
+                        value: item.login,
+                        text: item.login
+                    })) || []
+                    console.log(options, 1212);
+                    saveLoginOptions(options)
+                }
+
+                isSuccess.value = true   // 标记成功
             } else {
                 uni.showToast({
                     title: res.msg || '获取账户失败',
                     icon: 'none'
                 })
-                loading.value = false
             }
         } catch (err) {
             uni.showToast({
                 title: err.msg || '网络异常,请重试',
                 icon: 'none'
             })
-            loading.value = false
-            console.error(err)
+            console.error('获取账户异常:', err)
         } finally {
-            isLoaded.value = true
+            loading.value = false
+            isLoaded.value = true // 无论如何都标记请求结束
         }
     }
-    // ✨ 自动执行(页面挂载后自动调用)
+
     onMounted(() => {
+        // 缓存没有 → 才请求
         if (!loginOptions || loginOptions.length === 0) {
             getDateList()
+        } else {
+            // 有缓存 → 直接标记加载完成
+            isLoaded.value = true
+            isSuccess.value = true
         }
     })
+
     return {
         loginOptions,
         isLoaded,
+        isSuccess,
+        loading,
         getDateList
     }
 }

+ 1 - 1
index.html

@@ -9,7 +9,7 @@
         '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
         (coverSupport ? ', viewport-fit=cover' : '') + '" />')
     </script>
-    <script type="text/javascript" src="/static/js/jsvm_all.js"></script>
+    <!-- <script type="text/javascript" src="/static/js/jsvm_all.js"></script> -->
     <title></title>
     <!--preload-links-->
     <!--app-context-->

+ 4 - 0
pages/customer/components/CheckPopup.vue

@@ -162,6 +162,10 @@ const CopyShareLink = (link) => {
         color: #303133;
         word-break: break-all;
         line-height: 1.4;
+        overflow: hidden;
+        display: -webkit-box;
+        -webkit-line-clamp: 2;
+        -webkit-box-orient: vertical;
       }
 
       .btn {

+ 2 - 2
pages/customer/payment-history.vue

@@ -123,7 +123,7 @@ const { t, locale } = useI18n();
 import { financialApi } from '@/service/financial';
 import { useConfirm } from '@/hooks/useConfirm'
 import { useAccountOptions } from '@/composables/useAccountOptions'
-const { loginOptions } = useAccountOptions()
+const { loginOptions, isLoaded, isSuccess } = useAccountOptions()
 const search = reactive({
     login: null,
     type: null,
@@ -242,7 +242,7 @@ const filterFields = computed(() => [
     {
         key: 'orderStatus', type: 'select', label: t('Custom.PaymentHistory.Status'), placeholder: t('placeholder.choose'), options: orderStatusMap.value, defaultValue: null
     },
-    { key: 'login', type: 'select', label: t('Custom.PaymentHistory.TradingAccount'), placeholder: t('placeholder.login'), options: loginOptions || [], defaultValue: search.login || undefined },
+    isLoaded.value && isSuccess.value && { key: 'login', type: 'select', label: t('Custom.PaymentHistory.TradingAccount'), placeholder: t('placeholder.login'), options: loginOptions || [], defaultValue: search.login || undefined },
     { key: 'date', label: t('placeholder.Start') + ' - ' + t('placeholder.End'), type: 'daterange' }
 ])
 

+ 2 - 2
pages/customer/trade-history.vue

@@ -33,7 +33,7 @@ import { onLoad } from '@dcloudio/uni-app'
 const { t, locale } = useI18n();
 import { customApi } from '@/service/custom';
 import { useAccountOptions } from '@/composables/useAccountOptions'
-const { loginOptions } = useAccountOptions()
+const { loginOptions, isLoaded, isSuccess } = useAccountOptions()
 const search = reactive({
     login: null,
     type: null,
@@ -127,7 +127,7 @@ const mobilePrimaryFields = computed(() => [
 
 // 动态传入筛选字段配置
 const filterFields = computed(() => [
-    { key: 'login', type: 'select', label: t('Custom.PaymentHistory.TradingAccount'), placeholder: t('placeholder.login'), options: loginOptions || [], defaultValue: search?.login || undefined },
+    isLoaded.value && isSuccess.value && { key: 'login', type: 'select', label: t('Custom.PaymentHistory.TradingAccount'), placeholder: t('placeholder.login'), options: loginOptions || [], defaultValue: search?.login || undefined },
     { key: 'date', label: t('placeholder.Start') + ' - ' + t('placeholder.End'), type: 'daterange' }
 ])
 const searchParams = ref({})

+ 2 - 2
pages/customer/trade-position.vue

@@ -33,7 +33,7 @@ const { t, locale } = useI18n();
 import { onLoad } from '@dcloudio/uni-app'
 import { customApi } from '@/service/custom';
 import { useAccountOptions } from '@/composables/useAccountOptions'
-const { loginOptions } = useAccountOptions()
+const { loginOptions, isLoaded, isSuccess } = useAccountOptions()
 const search = reactive({
     login: null
 })
@@ -133,7 +133,7 @@ const mobilePrimaryFields = computed(() => [
 
 // 动态传入筛选字段配置
 const filterFields = computed(() => [
-    { key: 'login', type: 'select', label: t('Custom.PaymentHistory.TradingAccount'), placeholder: t('placeholder.login'), options: loginOptions || [], defaultValue: search.login || undefined },
+    isLoaded.value && isSuccess.value && { key: 'login', type: 'select', label: t('Custom.PaymentHistory.TradingAccount'), placeholder: t('placeholder.login'), options: loginOptions || [], defaultValue: search.login || undefined },
     { key: 'date', label: t('placeholder.Start') + ' - ' + t('placeholder.End'), type: 'daterange' }
 ])
 const searchParams = ref({})

+ 8 - 1
pages/customer/withdrawal.vue

@@ -68,10 +68,17 @@
                   </uni-forms-item>
                 </uni-col>
 
+                <!-- 电子钱包地址输入 -->
+                <uni-col :span="24"
+                  v-if="['CHANNEL_TYPE_WALLET', 'CHANNEL_TYPE_ALI_WALLET'].includes(channelData.type)">
+                  <view class="tit">
+                    <text>{{ getWalletLabel }}</text>
+                  </view>
+                </uni-col>
                 <!-- 电子钱包地址输入 -->
                 <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
                   v-if="['CHANNEL_TYPE_WALLET', 'CHANNEL_TYPE_ALI_WALLET'].includes(channelData.type)">
-                  <uni-forms-item :label="getWalletLabel" name="address">
+                  <uni-forms-item name="address">
                     <uni-easyinput :clearable="false" v-model="form.address" :placeholder="t('placeholder.input')" />
                   </uni-forms-item>
                 </uni-col>

+ 2 - 14
windows/top-window.vue

@@ -4,21 +4,14 @@
 			<image class="left-img" src="/static/images/logo.png" mode="widthFix" alt="logo" @click="openLeftDrawer" />
 		</div>
 		<div class="right">
-			<LanguageDropdown />
+			<cwg-language.vue />
 			<cwg-notice />
-			<view class="pc-header-btn">
-				<cwg-icon name="icon_my" color="#141d22" @click="openRightDrawer" />
-			</view>
+			<cwg-right-drawer />
 		</div>
 	</header>
 </template>
 
 <script setup lang="ts">
-// import useGlobalStore from '@/stores/use-global-store'
-// const globalStore = useGlobalStore()
-import useRouter from "@/hooks/useRouter";
-import LanguageDropdown from "@/components/LanguageDropdown.vue";
-const router = useRouter();
 const props = defineProps({
 	sidebarVisible: {
 		type: Boolean,
@@ -26,11 +19,6 @@ const props = defineProps({
 	},
 })
 
-function openRightDrawer() {
-	uni.$emit('open-right-drawer')
-}
-
-
 </script>
 
 <style scoped lang="scss">