Parcourir la source

feat: 仪表盘

ljc il y a 1 mois
Parent
commit
2d8c915946

+ 1 - 0
components/cwg-header.vue

@@ -41,6 +41,7 @@ const showBackIcon = computed(() => {
   const noBackIconPages = [
     '/',
     '/pages/customer/index',
+    '/pages/customer/dashboard',
     '/pages/customer/trade-history',
     '/pages/customer/trade-position',
     '/pages/customer/recording-history',

+ 8 - 0
composables/useMenuSplit.ts

@@ -54,6 +54,7 @@ export function useMenuSplit(handleClick1: (item: MenuItem) => void) {
                 router.reLaunch('/pages/ib/index')
                 break
             case 'customer':
+                // router.reLaunch('/pages/customer/dashboard')
                 router.reLaunch('/pages/customer/index')
                 break
             default:
@@ -135,6 +136,13 @@ export function useMenuSplit(handleClick1: (item: MenuItem) => void) {
     }))
 
     const customerBaseMenus = computed<MenuItem[]>(() => [
+      // {
+      //   isOpenMenu: false,
+      //   path: '/pages/customer/dashboard',
+      //   label: 'Documentary.console.item1',
+      //   icon: 'crm-mb',
+      //   submenuHeight: 0,
+      // },
         {
             isOpenMenu: false,
             submenuHeight: 4 * ((40 + 8)) + 8,

+ 8 - 0
pages.json

@@ -133,6 +133,14 @@
         "navigationStyle": "custom"
       }
     },
+    {
+      "path": "pages/customer/dashboard",
+      "style": {
+        "navigationBarTitleText": "",
+        "backgroundColor": "transparent",
+        "navigationStyle": "custom"
+      }
+    },
     {
       "path": "pages/customer/index",
       "style": {

+ 713 - 0
pages/customer/dashboard.vue

@@ -0,0 +1,713 @@
+<template>
+  <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+    <view class="header">
+      <view class="title">
+        <view class="mb-3">{{t('Home.msg.Custom')}}</view>
+        <view class="">{{dateWeek}}</view>
+      </view>
+
+      <button type="button" class="btn  btn-secondary  btn-shadow waves-effect"
+              @click="createAccount">
+        <view class="d-flex align-items-center">
+          <cwg-icon name="crm-plus" :size="14" color="#fff" />
+          <text v-t="'Custom.Index.AddAccount'" />
+        </view>
+      </button>
+    </view>
+    <uni-loading v-if="loading" />
+    <uni-row v-else class="demo-uni-row uni-row1" :gutter="20">
+      <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="uni-col-left">
+        <uni-row :gutter="10">
+          <uni-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+            <view class="card position-relative">
+              <view class="card-body d-flex align-items-center gap-3">
+                <view class="icon-placeholder">
+                  <cwg-icon name="crm-wallet" :size="28" color="red" />
+                </view>
+                <view class="flex-1">
+                  <view class="d-flex justify-between items-start mb-1">
+                    <text class="text-muted text-sm">Total Balance</text>
+                    <text :class="['growth-rate', compareData.totalBalanceGrowthRate >= 0 ? 'rate-up' : 'rate-down']">
+                      {{ compareData.totalBalanceGrowthRate >= 0 ? '+' : '' }}{{ compareData.totalBalanceGrowthRate }}%
+                    </text>
+                  </view>
+                  <view class="fw-bold text-lg">${{ numberFormat(compareData.totalBalance || '0') }}</view>
+                </view>
+              </view>
+            </view>
+          </uni-col>
+          <uni-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+            <view class="card position-relative">
+              <view class="card-body d-flex align-items-center gap-3">
+                <view class="icon-placeholder">
+                  <cwg-icon name="crm-money-up" :size="28" color="red" />
+                </view>
+                <view class="flex-1">
+                  <view class="d-flex justify-between items-start mb-1">
+                    <text class="text-muted text-sm">Equity</text>
+                    <text :class="['growth-rate', compareData.totalEquityGrowthRate >= 0 ? 'rate-up' : 'rate-down']">
+                      {{ compareData.totalEquityGrowthRate >= 0 ? '+' : '' }}{{ compareData.totalEquityGrowthRate }}%
+                    </text>
+                  </view>
+                  <view class="fw-bold text-lg">${{ numberFormat(compareData.totalEquity || '0') }}</view>
+                </view>
+              </view>
+            </view>
+          </uni-col>
+          <uni-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+            <view class="card position-relative">
+              <view class="card-body d-flex align-items-center gap-3">
+                <view class="icon-placeholder">
+                  <cwg-icon name="icon_withdraw" :size="28" color="red" />
+                </view>
+                <view class="flex-1">
+                  <view class="d-flex justify-between items-start mb-1">
+                    <text class="text-muted text-sm">Total deposit</text>
+                    <text :class="['growth-rate', compareData.totalDepositAmountGrowthRate >= 0 ? 'rate-up' : 'rate-down']">
+                      {{ compareData.totalDepositAmountGrowthRate >= 0 ? '+' : '' }}{{ compareData.totalDepositAmountGrowthRate }}%
+                    </text>
+                  </view>
+                  <view class="fw-bold text-lg">${{ numberFormat(compareData.totalDepositAmount || '0') }}</view>
+                </view>
+              </view>
+            </view>
+          </uni-col>
+          <uni-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+            <view class="card position-relative">
+              <view class="card-body d-flex align-items-center gap-3">
+                <view class="icon-placeholder">
+                  <cwg-icon name="crm-money-bill-transfer" :size="28" color="red" />
+                </view>
+                <view class="flex-1">
+                  <view class="d-flex justify-between items-start mb-1">
+                    <text class="text-muted text-sm">Total withdrawal</text>
+                    <text :class="['growth-rate', compareData.totalWithdrawalAmountGrowthRate >= 0 ? 'rate-up' : 'rate-down']">
+                      {{ compareData.totalWithdrawalAmountGrowthRate >= 0 ? '+' : '' }}{{ compareData.totalWithdrawalAmountGrowthRate }}%
+                    </text>
+                  </view>
+                  <view class="fw-bold text-lg">${{ numberFormat(compareData.totalWithdrawalAmount || '0') }}</view>
+                </view>
+              </view>
+            </view>
+          </uni-col>
+        </uni-row>
+      </uni-col>
+      <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="uni-col-right">
+        <view class="dashboard-container">
+          <view class="account-info1" v-if="isDealLogin">
+            <uni-row>
+              <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                <view class="custom-money custom-money-left">
+                  <view class="header">
+                    <view class="tit">
+                      <text class="tab">{{ t('Documentary.console.item23') }}</text>
+                    </view>
+                    <view class="num" @click="toDocumentary1">
+                      <cwg-icon name="crm-sz" :size="18" color="#6c8595" />
+                    </view>
+                  </view>
+                  <view class="bottomCol">
+                    <uni-row>
+                      <uni-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
+                        <view class="bo-left1">
+                          <view>
+                            <text>{{ t('Documentary.console.item26') }}</text>
+                          </view>
+                          <view class="blue-font">
+                            <text>{{ numberFormat(dealDate.followNum || '0') }}</text>
+                          </view>
+                        </view>
+                      </uni-col>
+                      <uni-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
+                        <view class="bo-left1">
+                          <view>
+                            <text>{{ t('Documentary.console.item9') }}</text>
+                          </view>
+                          <view class="blue-font">
+                            <text>{{ numberFormat(dealDate.followNumIncrement || '0') }}</text>
+                          </view>
+                        </view>
+                      </uni-col>
+                      <uni-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
+                        <view class="bo-left1">
+                          <view>
+                            <text>{{ t('Documentary.console.item29') }}</text>
+                          </view>
+                          <view class="blue-font">
+                            <text>{{ numberFormat(dealDate.position || '0') }}</text>
+                          </view>
+                        </view>
+                      </uni-col>
+                      <uni-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
+                        <view class="bo-right1">
+                          <view>
+                            <text>{{ t('Documentary.console.item30') }}</text>
+                          </view>
+                          <view class="blue-font">
+                            <text>{{ numberFormat(dealDate.closed || '0') }}</text>
+                          </view>
+                        </view>
+                      </uni-col>
+                    </uni-row>
+                  </view>
+                </view>
+              </uni-col>
+            </uni-row>
+          </view>
+
+          <view class="account-info1" v-else>
+            <uni-row>
+              <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                <view class="custom-money custom-money-right">
+                  <view class="header">
+                    <view class="tit">
+                      <text class="tab">{{ t('Documentary.console.item27') }}</text>
+                    </view>
+                    <view class="num">
+                    </view>
+                  </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">
+                        <template #nickname="{ row }">
+                          <text>{{ row.nickname || '--' }}</text>
+                        </template>
+                        <template #nickname2="{ row }">
+                          <text>{{ row.nickname || '--' }}</text>
+                        </template>
+                        <template #startTime="{ row }">
+                          <text>{{ row.startTime || '--' }}</text>
+                        </template>
+                        <template #endTime="{ row }">
+                          <text>{{ row.endTime || '--' }}</text>
+                        </template>
+                      </cwg-tabel>
+                    </view>
+                  </view>
+                </view>
+              </uni-col>
+            </uni-row>
+          </view>
+        </view>
+      </uni-col>
+    </uni-row>
+    <cwg-improve-popup v-model:visible="dialogCheck" @confirm="confirm" />
+  </cwg-page-wrapper>
+</template>
+
+<script setup>
+import { ref, computed, watch, onMounted, nextTick } from 'vue'
+import { useI18n } from 'vue-i18n'
+import dayjs from 'dayjs'
+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'
+import { documentaryApi } from '@/service/documentary'
+import { customApi } from '@/service/custom'
+import { userApi } from '@/api/user'
+
+const { t, locale } = useI18n()
+const loading = ref(false)
+const router = useRouter()
+const { Code } = config
+const userStore = useUserStore();
+const { numberFormat } = useFilters()
+const listApi = ref(documentaryApi.followDailySubscribeProfit)
+
+
+const loginOptions = ref([])
+const ChartSet = ref({})
+const ChartSetDate = ref({})
+const isDealLogin = ref(false)
+const dealDate = ref({})
+const SubscribeProfitDate = ref([])
+const compareData = 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 dateWeek = computed(() => {
+  const now = dayjs()
+  const isChinese = locale.value === 'cn' || locale.value === 'zhHant'
+  
+  if (isChinese) {
+    const weekDays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
+    const months = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
+    return `${weekDays[now.day()]}, ${months[now.month()]}${now.date()}日, ${now.year()}`
+  } else {
+    return now.format('ddd, MMMD, YYYY')
+  }
+})
+
+
+const createAccount = () => {
+  getCustomLoginInfo()
+}
+// 获取客户登录信息
+const dialogCheck = ref(false)
+async function getCustomLoginInfo() {
+  try {
+    const res = await userApi.getUserInfo();
+    userStore.saveUserInfo(res.data);
+    if (res.code === 200) {
+      if (
+        res.data.customInfo.status == 2 &&
+        res.data.customInfo.applyRealStatus == 2
+      ) {
+        router.push(`/pages/customer/account-select?server=${cativeIndex.value}`)
+      } else {
+        dialogCheck.value = true;
+      }
+    }
+  } catch (error) {
+    //  console.log(error, 111);
+  }
+}
+const confirm = () => {
+  dialogCheck.value = false;
+  router.push(`/pages/mine/improveImmediately`)
+}
+
+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 isApplySignalVisible = ref(false)
+const onApplySignalConfirm = () => {
+  isApplySignalVisible.value = false
+}
+
+const getData = async () => {
+  try{
+    const res = await customApi.customDailyCompare()
+    if (res.code === Code.StatusOK) {
+      compareData.value = res.data
+    }
+  }catch (e) {
+    console.log(e)
+  }
+}
+
+onMounted(async () => {
+  loading.value = true
+  await getData()
+  loading.value = false
+})
+
+</script>
+
+<style lang="scss" scoped>
+@import "@/uni.scss";
+
+.header{
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: px2rpx(20);
+  .title{
+    font-size: px2rpx(24);
+    font-weight: bold;
+  }
+}
+
+.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;
+}
+
+.dashboard-container {
+  min-height: 10vh;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+}
+
+/* 卡片通用样式 */
+.card {
+  background: var(--color-white);
+  color: var(--bs-heading-color);
+  border-radius: 4px;
+  margin-bottom: px2rpx(20);
+  box-shadow: 0 px2rpx(4) px2rpx(12) rgba(0, 0, 0, 0.2);
+}
+
+.card-body {
+  padding: px2rpx(16);
+}
+
+.icon-placeholder {
+  width: px2rpx(48);
+  height: px2rpx(48);
+  border-radius: px2rpx(24);
+  background: linear-gradient(135deg, #f5f7fa 0%, #e4e8ec 100%);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-shrink: 0;
+}
+
+.icon-text {
+  font-size: px2rpx(20);
+  font-weight: bold;
+  color: #6c757d;
+}
+
+.growth-rate {
+  font-size: px2rpx(12);
+  font-weight: 500;
+  padding: px2rpx(2) px2rpx(8);
+  border-radius: px2rpx(2);
+}
+
+.growth-rate.rate-up {
+  color: #10b981;
+  background: rgba(16, 185, 129, 0.1);
+}
+
+.growth-rate.rate-down {
+  color: #ef4444;
+  background: rgba(239, 68, 68, 0.1);
+}
+
+.custom-number,
+.custom-money {
+  background: var(--bs-body-bg);
+  border: 1px solid var(--bs-border-color);
+  padding: 15px;
+
+  border-radius: 4px;
+  margin-bottom: 20px;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+  min-height: px2rpx(125);
+}
+
+.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;
+  }
+
+
+  .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: 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);
+    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;
+  }
+}
+
+.dia-content {
+  padding: 20rpx;
+}
+
+.content {
+  display: flex;
+  flex-direction: column;
+  gap: 20rpx;
+}
+
+.label {
+  font-weight: 500;
+  margin-bottom: 8rpx;
+}
+
+.btn {
+  text-align: center;
+  background-color: rgb(var(--bs-danger-rgb));
+  font-size: px2rpx(16);
+  color: #fff;
+  padding: px2rpx(10) px2rpx(20);
+  border-radius: px2rpx(24);
+  margin: 0;
+}
+
+.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;
+}
+</style>

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

@@ -406,7 +406,7 @@ import { useFilters } from '@/composables/useFilters'
 const { numberFormat, numberDesensitization, numberDecimal } = useFilters()
 const search = ref({
     status: 1,
-    followLogin: '',
+    login: '',
     endTime: '',
     startTime: ''
 })
@@ -416,7 +416,7 @@ const typeMap = [
 // 动态传入筛选字段配置
 const filterFields = computed(() => [
     { key: 'followPlatform', type: 'select', label: t('Label.Platform'), placeholder: t('placeholder.choose'), options: typeMap },
-    !isSubscribeLoading.value && { key: 'followLogin', type: 'select', label: t('Documentary.console.item28'), placeholder: t('placeholder.choose'), options: SubscribeDownData.value },
+    !isSubscribeLoading.value && { key: 'login', type: 'select', label: t('Documentary.console.item28'), placeholder: t('placeholder.choose'), options: SubscribeDownData.value },
     { key: 'date', label: t('placeholder.Start') + ' - ' + t('placeholder.End'), type: 'daterange' }
 ])
 

+ 2 - 0
service/custom.ts

@@ -110,4 +110,6 @@ export const customApi = {
   tradeShardingHistory: (params = {}) => post('/trade/sharding/history', params, 'Host80'),
   // 交易历史导出
   tradeShardingHistoryExport: (params = {}) => post('/trade/sharding/history/export', params, 'Host80'),
+  // 个人中心仪表盘数据
+  customDailyCompare: (params = {}) => post('/index/chart/custom/asset/daily/compare', params,'Host80'),
 };

+ 1 - 0
static/icons/crm-money-up.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path d="M544 72C544 58.7 533.3 48 520 48L418.2 48C404.9 48 394.2 58.7 394.2 72C394.2 85.3 404.9 96 418.2 96L462.1 96L350.8 207.3L255.7 125.8C246.7 118.1 233.5 118.1 224.5 125.8L112.5 221.8C102.4 230.4 101.3 245.6 109.9 255.6C118.5 265.6 133.7 266.8 143.7 258.2L240.1 175.6L336.5 258.2C346 266.4 360.2 265.8 369.1 256.9L496.1 129.9L496.1 173.8C496.1 187.1 506.8 197.8 520.1 197.8C533.4 197.8 544.1 187.1 544.1 173.8L544 72zM112 320C85.5 320 64 341.5 64 368L64 528C64 554.5 85.5 576 112 576L528 576C554.5 576 576 554.5 576 528L576 368C576 341.5 554.5 320 528 320L112 320zM159.3 376C155.9 396.1 140.1 412 119.9 415.4C115.5 416.1 111.9 412.5 111.9 408.1L111.9 376.1C111.9 371.7 115.5 368.1 119.9 368.1L151.9 368.1C156.3 368.1 160 371.7 159.2 376.1zM159.3 520.1C160 524.5 156.4 528.1 152 528.1L120 528.1C115.6 528.1 112 524.5 112 520.1L112 488.1C112 483.7 115.6 480 120 480.8C140.1 484.2 156 500 159.4 520.2zM520 480.7C524.4 480 528 483.6 528 488L528 520C528 524.4 524.4 528 520 528L488 528C483.6 528 479.9 524.4 480.7 520C484.1 499.9 499.9 484 520.1 480.6zM480.7 376C480 371.6 483.6 368 488 368L520 368C524.4 368 528 371.6 528 376L528 408C528 412.4 524.4 416.1 520 415.3C499.9 411.9 484 396.1 480.6 375.9zM256 448C256 412.7 284.7 384 320 384C355.3 384 384 412.7 384 448C384 483.3 355.3 512 320 512C284.7 512 256 483.3 256 448z"/></svg>

+ 7 - 0
static/scss/global/global.scss

@@ -1969,4 +1969,11 @@ uni-content.collapsed {
 .add-btn {
     font-weight: 600;
     text-decoration: underline;
+}
+
+.flex-1{
+  flex: 1;
+}
+.justify-between{
+  justify-content: space-between;
 }