2024-07-06 10:07:57 +08:00

273 lines
8.0 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- <template>
<div style="display: flex;flex-wrap: wrap;justify-content: space-between;">
<ProjectPayment></ProjectPayment>
<ProjectInvoice></ProjectInvoice>
<ProjectBid></ProjectBid>
<ProjectFund></ProjectFund>
</div>
</template>
<script setup>
import { reactive, ref } from "vue"
import ProjectPayment from "./components/ProjectPayment.vue"
import ProjectInvoice from "./components/ProjectInvoice.vue"
import ProjectBid from "./components/ProjectBid.vue"
import ProjectFund from "./components/ProjectFund.vue"
</script> -->
<template>
<div class="workbench">
<el-card shadow="never" class=" !border-none">
<div class="mb-6 flex justify-between items-center">
<span class="text-2xl">概况</span>
<div class="flex items-center text-sm">
<span class="mr-4">时间筛选: </span>
<el-date-picker v-model="startEndTime2" type="daterange" range-separator="至" start-placeholder="开始日期"
end-placeholder="结束日期" unlink-panels @change="getData2" />
<el-button type="primary" class="ml-4" @click="getData2">查询</el-button>
</div>
</div>
<div class="flex flex-wrap">
<div class="w-1/5 flex mb-6" v-for="(item, index) in basicList" :key="index">
<div class="mr-2">
<div class="rounded-full p-2" :style="{ 'background-color': colorList[index % 8] }">
<iconfont :iconName="item.icon" white className="text-6xl" />
</div>
</div>
<div>
<div class="text-info">{{ item.name }}</div>
<div class="text-6xl">{{ item.num }}</div>
<!-- <div class="text-info">环比增长: <span :class="item.percent > 0 ? 'text-success' : 'text-danger'">{{
item.percent }}%</span></div> -->
</div>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt-4 !border-none">
<div>
<div class="mb-6 flex justify-between items-center">
<span class="text-2xl">趋势</span>
<!-- <div class="flex items-center text-sm">
<span class="mr-4">时间筛选: </span>
<el-date-picker v-model="startEndTime2" type="daterange" range-separator="至"
start-placeholder="开始日期" end-placeholder="结束日期" unlink-panels @change="getData2" />
<el-button type="primary" class="ml-4" @click="getData2">查询</el-button>
</div> -->
</div>
<v-charts style="height: 400px" :option="visitorOption" :autoresize="true" />
</div>
</el-card>
</div>
</template>
<script lang="ts" setup name="statistics_user">
import { apistatisfinancialStatistics } from "@/api/statistics"
import moment from 'moment'
import vCharts from 'vue-echarts'
// 表单数据
const visitorOption: any = reactive({
xAxis: {
type: 'category',
data: [0],
axisLabel: {
rotate: 45,
color: '#333'
}
},
yAxis: {
type: 'value',
position: 'left',
axisLabel: {
formatter: '{value}'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
legend: {
data: ['访问量']
},
itemStyle: {
// 点的颜色。
color: 'red'
},
tooltip: {
trigger: 'axis'
},
series: [
{
name: '访问量',
data: [0],
type: 'line',
smooth: true
}
]
})
// 颜色
const colorList = ['#5DB1FF', '#4CD384', '#FFC46A', '#CAA5F1', '#FFC46A', '#4CD384', '#5DB1FF', '#CAA5F1']
// 商品浏览量, 商品访客数, 加购件数, 下单件数, 支付件数, 支付金额, 成本金额, 退款金额, 退款件数, 访客-支付转化率
const basicList = reactive([
// {
// name: '访客数',
// type: 'people',
// icon: 'RectangleCopy',
// num: 0,
// percent: 0
// },
// {
// name: '浏览量',
// type: 'browse',
// icon: 'RectangleCopy49',
// num: 0,
// percent: 0
// },
// {
// name: '新增用户数',
// type: 'newUser',
// icon: 'RectangleCopy53',
// num: 0,
// percent: 0
// },
// {
// name: '成交用户数',
// type: 'payPeople',
// icon: 'RectangleCopy5',
// num: 0,
// percent: 0
// },
// {
// name: '访客-支付转换率',
// type: 'payPercent',
// icon: 'RectangleCopy4',
// num: 0,
// percent: 0
// },
// {
// name: '激活付费会员数',
// type: 'payUser',
// icon: 'RectangleCopy7',
// num: 0,
// percent: 0
// },
// {
// name: '充值用户数',
// type: 'rechargePeople',
// icon: 'RectangleCopy59',
// num: 0,
// percent: 0
// },
// {
// name: '客单价',
// type: 'payPrice',
// icon: 'RectangleCopy15',
// num: 0,
// percent: 0
// },
// {
// name: '累计用户',
// type: 'cumulativeUser',
// icon: 'RectangleCopy54',
// num: 0,
// percent: 0
// },
// {
// name: '累计付费会员数',
// type: 'cumulativePayUser',
// icon: 'RectangleCopy7',
// num: 0,
// percent: 0
// },
// {
// name: '累计充值用户数',
// type: 'cumulativeRechargePeople',
// icon: 'RectangleCopy6',
// num: 0,
// percent: 0
// },
// {
// name: '累计成交用户数',
// type: 'cumulativePayPeople',
// icon: 'RectangleCopy9',
// num: 0,
// percent: 0
// }
])
function getLastMonthRange() {
// 获取今天的日期
let today = new Date();
// 获取上个月的日期
let lastMonth = new Date(today.getFullYear(), today.getMonth() - 1, today.getDate());
// 格式化日期为 "年-月-日"
let formatDateString = (date) => {
let year = date.getFullYear();
let month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始需要+1并且补0
let day = String(date.getDate()).padStart(2, '0'); // 补0
return `${year}-${month}-${day}`;
};
// 格式化上个月和今天的日期
let lastMonthFormatted = formatDateString(lastMonth);
let todayFormatted = formatDateString(today);
// 返回结果数组
return [lastMonthFormatted, todayFormatted];
}
const startEndTime = ref([new Date(), new Date()]);
const startEndTime2 = ref(getLastMonthRange());
const getData2 = () => {
let date = '';
if (startEndTime2.value[0] && startEndTime2.value[1]) date = moment(startEndTime2.value[0]).format('YYYY/MM/DD') + '-' + moment(startEndTime2.value[1]).format('YYYY/MM/DD');
apistatisfinancialStatistics({
date: date
}).then(res => {
// 清空echarts 数据
visitorOption.xAxis.data = []
visitorOption.series = []
console.log(res)
visitorOption.xAxis.data = Object.keys(res[0].value)
res.forEach((item, index) => {
visitorOption.series[index] = {
type: 'line',
smooth: true,
data: Object.values(item.value),
name: item.title
}
basicList[index] = {
name: item.title,
type: 'people',
icon: 'RectangleCopy',
num: item.total_money,
}
})
})
}
onMounted(() => {
getData2()
})
</script>
<style lang="scss" scoped></style>