<template> <doc-alert title="商城手册(功能开启)" url="https://doc.iocoder.cn/mall/build/" /> <div class="flex flex-col"> <!-- 数据对照 --> <el-row :gutter="16" class="row"> <el-col :md="6" :sm="12" :xs="24" :loading="loading"> <ComparisonCard tag="今日" title="销售额" prefix="¥" :decimals="2" :value="fenToYuan(orderComparison?.value?.orderPayPrice || 0)" :reference="fenToYuan(orderComparison?.reference?.orderPayPrice || 0)" /> </el-col> <el-col :md="6" :sm="12" :xs="24" :loading="loading"> <ComparisonCard tag="今日" title="用户访问量" :value="userComparison?.value?.visitUserCount || 0" :reference="userComparison?.reference?.visitUserCount || 0" /> </el-col> <el-col :md="6" :sm="12" :xs="24" :loading="loading"> <ComparisonCard tag="今日" title="订单量" :value="orderComparison?.value?.orderPayCount || 0" :reference="orderComparison?.reference?.orderPayCount || 0" /> </el-col> <el-col :md="6" :sm="12" :xs="24" :loading="loading"> <ComparisonCard tag="今日" title="新增用户" :value="userComparison?.value?.registerUserCount || 0" :reference="userComparison?.reference?.registerUserCount || 0" /> </el-col> </el-row> <el-row :gutter="16" class="row"> <el-col :md="12"> <!-- 快捷入口 --> <ShortcutCard /> </el-col> <el-col :md="12"> <!-- 运营数据 --> <OperationDataCard /> </el-col> </el-row> <el-row :gutter="16" class="mb-4"> <el-col :md="18" :sm="24"> <!-- 会员概览 --> <MemberFunnelCard /> </el-col> <el-col :md="6" :sm="24"> <!-- 会员终端 --> <MemberTerminalCard /> </el-col> </el-row> <!-- 交易量趋势 --> <TradeTrendCard class="mb-4" /> <!-- 会员统计 --> <MemberStatisticsCard /> </div> </template> <script lang="ts" setup> import * as TradeStatisticsApi from '@/api/mall/statistics/trade' import * as MemberStatisticsApi from '@/api/mall/statistics/member' import { DataComparisonRespVO } from '@/api/mall/statistics/common' import { TradeOrderSummaryRespVO } from '@/api/mall/statistics/trade' import { MemberCountRespVO } from '@/api/mall/statistics/member' import { fenToYuan } from '@/utils' import ComparisonCard from './components/ComparisonCard.vue' import MemberStatisticsCard from './components/MemberStatisticsCard.vue' import OperationDataCard from './components/OperationDataCard.vue' import ShortcutCard from './components/ShortcutCard.vue' import TradeTrendCard from './components/TradeTrendCard.vue' import MemberTerminalCard from '@/views/mall/statistics/member/components/MemberTerminalCard.vue' import MemberFunnelCard from '@/views/mall/statistics/member/components/MemberFunnelCard.vue' /** 商城首页 */ defineOptions({ name: 'MallHome' }) const loading = ref(true) // 加载中 const orderComparison = ref<DataComparisonRespVO<TradeOrderSummaryRespVO>>() // 交易对照数据 const userComparison = ref<DataComparisonRespVO<MemberCountRespVO>>() // 用户对照数据 /** 查询交易对照卡片数据 */ const getOrderComparison = async () => { orderComparison.value = await TradeStatisticsApi.getOrderComparison() } /** 查询会员用户数量对照卡片数据 */ const getUserCountComparison = async () => { userComparison.value = await MemberStatisticsApi.getUserCountComparison() } /** 初始化 **/ onMounted(async () => { loading.value = true await Promise.all([getOrderComparison(), getUserCountComparison()]) loading.value = false }) </script> <style lang="scss" scoped> .row { .el-col { margin-bottom: 1rem; } } </style>