From 7bdc6ed08de7ad0a3ca329e85b9f87b147ea9fa2 Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Sun, 24 Nov 2024 20:10:35 +0800 Subject: [PATCH] =?UTF-8?q?completepage:=20=F0=9F=8D=BB=20=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E5=86=85=E5=AE=B9=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/v1/system/system.ts | 5 + src/components/Analyse/char-line.vue | 38 +--- .../account-bill/expend/index.vue | 3 +- .../account-bill/income/index.vue | 3 +- src/views/welcome/components/ChartRound.vue | 121 ++++++------ src/views/welcome/components/chart-bar.vue | 110 +++++++++++ .../{ChartLine.vue => chart-line.vue} | 1 + .../welcome/components/charts/ChartBar.vue | 108 ----------- .../welcome/components/charts/ChartLine.vue | 62 ------ .../welcome/components/charts/ChartRound.vue | 73 -------- src/views/welcome/components/charts/index.ts | 3 - .../welcome/components/{table => }/empty.svg | 0 src/views/welcome/components/home-table.vue | 176 ++++++++++++++++++ .../welcome/components/table/columns.tsx | 99 ---------- src/views/welcome/components/table/index.vue | 60 ------ src/views/welcome/index.vue | 108 +++++------ src/views/welcome/utils/data.ts | 132 ------------- src/views/welcome/utils/hooks.tsx | 96 ++++++++++ src/views/welcome/utils/utils.ts | 6 - 19 files changed, 523 insertions(+), 681 deletions(-) create mode 100644 src/views/welcome/components/chart-bar.vue rename src/views/welcome/components/{ChartLine.vue => chart-line.vue} (99%) delete mode 100644 src/views/welcome/components/charts/ChartBar.vue delete mode 100644 src/views/welcome/components/charts/ChartLine.vue delete mode 100644 src/views/welcome/components/charts/ChartRound.vue delete mode 100644 src/views/welcome/components/charts/index.ts rename src/views/welcome/components/{table => }/empty.svg (100%) create mode 100644 src/views/welcome/components/home-table.vue delete mode 100644 src/views/welcome/components/table/columns.tsx delete mode 100644 src/views/welcome/components/table/index.vue delete mode 100644 src/views/welcome/utils/data.ts create mode 100644 src/views/welcome/utils/hooks.tsx delete mode 100644 src/views/welcome/utils/utils.ts diff --git a/src/api/v1/system/system.ts b/src/api/v1/system/system.ts index 58465a3..3c7009e 100644 --- a/src/api/v1/system/system.ts +++ b/src/api/v1/system/system.ts @@ -10,3 +10,8 @@ export const getRouterAsync = () => { export const fetchUploadFile = (data: any) => { return http.request>('post', '/files/upload', { data }, { headers: { 'Content-Type': 'multipart/form-data' } }); }; + +/** 账单信息---首页内容展示 */ +export const fetchHomeDatalist = (data: any) => { + return http.request>('get', 'noManage/homeDatalist', { params: data }); +}; diff --git a/src/components/Analyse/char-line.vue b/src/components/Analyse/char-line.vue index 6d4530b..084be0d 100644 --- a/src/components/Analyse/char-line.vue +++ b/src/components/Analyse/char-line.vue @@ -33,54 +33,34 @@ watch( await nextTick(); // 确保DOM更新完成后再执行 setOptions({ container: '.bar-card', - tooltip: { - trigger: 'axis', - axisPointer: { - type: 'none', - }, - }, - grid: { - top: '30px', - bottom: '30px', - left: '50px', - right: 0, - }, + tooltip: { trigger: 'axis', axisPointer: { type: 'none' } }, + grid: { top: '30px', bottom: '30px', left: '50px', right: 0 }, xAxis: [ { type: 'category', data: props.analyseXAxis, - axisLabel: { - fontSize: '0.875rem', - }, - axisPointer: { - type: 'shadow', - }, + axisLabel: { fontSize: '0.875rem' }, + axisPointer: { type: 'shadow' }, }, ], yAxis: [ { type: 'value', - axisLabel: { - padding: 0, - fontSize: '0.875rem', - }, - splitLine: { - show: true, // 去网格线 - }, + axisLabel: { padding: 0, fontSize: '0.875rem' }, + splitLine: { show: true }, position: 'left', name: $t('unitMoney'), }, ], series: [ { + name: $t('amount'), type: 'line', - itemStyle: { - color: props.color[0], - borderRadius: [10, 10, 0, 0], - }, + itemStyle: { color: props.color[0], borderRadius: [10, 10, 0, 0] }, data: props.analyseData, }, { + name: $t('amount'), type: 'bar', barWidth: 15, itemStyle: { diff --git a/src/views/financial-user/account-bill/expend/index.vue b/src/views/financial-user/account-bill/expend/index.vue index b9870df..3a4c91a 100644 --- a/src/views/financial-user/account-bill/expend/index.vue +++ b/src/views/financial-user/account-bill/expend/index.vue @@ -1,8 +1,7 @@ diff --git a/src/views/welcome/components/chart-bar.vue b/src/views/welcome/components/chart-bar.vue new file mode 100644 index 0000000..f987920 --- /dev/null +++ b/src/views/welcome/components/chart-bar.vue @@ -0,0 +1,110 @@ + + + diff --git a/src/views/welcome/components/ChartLine.vue b/src/views/welcome/components/chart-line.vue similarity index 99% rename from src/views/welcome/components/ChartLine.vue rename to src/views/welcome/components/chart-line.vue index ec6b054..99a00fa 100644 --- a/src/views/welcome/components/ChartLine.vue +++ b/src/views/welcome/components/chart-line.vue @@ -14,6 +14,7 @@ const props = defineProps({ }); const { isDark } = useDark(); + const theme = computed(() => (isDark.value ? 'dark' : 'light')); const chartRef = ref(); diff --git a/src/views/welcome/components/charts/ChartBar.vue b/src/views/welcome/components/charts/ChartBar.vue deleted file mode 100644 index 6d9af15..0000000 --- a/src/views/welcome/components/charts/ChartBar.vue +++ /dev/null @@ -1,108 +0,0 @@ - - - diff --git a/src/views/welcome/components/charts/ChartLine.vue b/src/views/welcome/components/charts/ChartLine.vue deleted file mode 100644 index fa72ec1..0000000 --- a/src/views/welcome/components/charts/ChartLine.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - diff --git a/src/views/welcome/components/charts/ChartRound.vue b/src/views/welcome/components/charts/ChartRound.vue deleted file mode 100644 index 769f2b2..0000000 --- a/src/views/welcome/components/charts/ChartRound.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - diff --git a/src/views/welcome/components/charts/index.ts b/src/views/welcome/components/charts/index.ts deleted file mode 100644 index fa55448..0000000 --- a/src/views/welcome/components/charts/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as ChartBar } from "./ChartBar.vue"; -export { default as ChartLine } from "./ChartLine.vue"; -export { default as ChartRound } from "./ChartRound.vue"; diff --git a/src/views/welcome/components/table/empty.svg b/src/views/welcome/components/empty.svg similarity index 100% rename from src/views/welcome/components/table/empty.svg rename to src/views/welcome/components/empty.svg diff --git a/src/views/welcome/components/home-table.vue b/src/views/welcome/components/home-table.vue new file mode 100644 index 0000000..b2c599e --- /dev/null +++ b/src/views/welcome/components/home-table.vue @@ -0,0 +1,176 @@ + + + + + + + diff --git a/src/views/welcome/components/table/columns.tsx b/src/views/welcome/components/table/columns.tsx deleted file mode 100644 index cd869a6..0000000 --- a/src/views/welcome/components/table/columns.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import { tableData } from '../../utils/data'; -import { delay } from '@pureadmin/utils'; -import { onMounted, reactive, ref } from 'vue'; -import type { PaginationProps } from '@pureadmin/table'; -import ThumbUp from '@iconify-icons/ri/thumb-up-line'; -import Hearts from '@iconify-icons/ri/hearts-line'; -import Empty from './empty.svg?component'; - -export function useColumns() { - const dataList = ref([]); - const loading = ref(true); - const columns: TableColumnList = [ - { - sortable: true, - label: '序号', - prop: 'id', - }, - { - sortable: true, - label: '需求人数', - prop: 'requiredNumber', - filterMultiple: false, - filterClassName: 'pure-table-filter', - filters: [ - { text: '≥16000', value: 'more' }, - { text: '<16000', value: 'less' }, - ], - filterMethod: (value, { requiredNumber }) => { - return value === 'more' ? requiredNumber >= 16000 : requiredNumber < 16000; - }, - }, - { - sortable: true, - label: '提问数量', - prop: 'questionNumber', - }, - { - sortable: true, - label: '解决数量', - prop: 'resolveNumber', - }, - { - sortable: true, - label: '用户满意度', - minWidth: 100, - prop: 'satisfaction', - cellRenderer: ({ row }) => ( -
- - {row.satisfaction}% - 98 ? Hearts : ThumbUp} color='#e85f33' /> - -
- ), - }, - { - sortable: true, - label: '统计日期', - prop: 'date', - }, - { - label: '操作', - fixed: 'right', - slot: 'operation', - }, - ]; - - /** 分页配置 */ - const pagination = reactive({ - pageSize: 10, - currentPage: 1, - layout: 'prev, pager, next', - total: 0, - align: 'center', - }); - - function onCurrentChange(page: number) { - console.log('onCurrentChange', page); - loading.value = true; - delay(300).then(() => { - loading.value = false; - }); - } - - onMounted(() => { - dataList.value = tableData; - pagination.total = dataList.value.length; - loading.value = false; - }); - - return { - Empty, - loading, - columns, - dataList, - pagination, - onCurrentChange, - }; -} diff --git a/src/views/welcome/components/table/index.vue b/src/views/welcome/components/table/index.vue deleted file mode 100644 index e9731fa..0000000 --- a/src/views/welcome/components/table/index.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - diff --git a/src/views/welcome/index.vue b/src/views/welcome/index.vue index cfb8742..7f7ea64 100644 --- a/src/views/welcome/index.vue +++ b/src/views/welcome/index.vue @@ -1,29 +1,20 @@ diff --git a/src/views/welcome/utils/data.ts b/src/views/welcome/utils/data.ts deleted file mode 100644 index 406785f..0000000 --- a/src/views/welcome/utils/data.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { cloneDeep, dayjs, getRandomIntBetween } from './utils'; -import GroupLine from '@iconify-icons/ri/group-line'; -import Question from '@iconify-icons/ri/question-answer-line'; -import CheckLine from '@iconify-icons/ri/chat-check-line'; -import Smile from '@iconify-icons/ri/star-smile-line'; - -const days = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; - -/** 需求人数、提问数量、解决数量、用户满意度 */ -const chartData = [ - { - icon: GroupLine, - bgColor: '#effaff', - color: '#41b6ff', - duration: 2200, - name: '需求人数', - value: 36000, - percent: '+88%', - data: [2101, 5288, 4239, 4962, 6752, 5208, 7450], // 平滑折线图数据 - }, - { - icon: Question, - bgColor: '#fff5f4', - color: '#e85f33', - duration: 1600, - name: '提问数量', - value: 16580, - percent: '+70%', - data: [2216, 1148, 1255, 788, 4821, 1973, 4379], - }, - { - icon: CheckLine, - bgColor: '#eff8f4', - color: '#26ce83', - duration: 1500, - name: '解决数量', - value: 16499, - percent: '+99%', - data: [861, 1002, 3195, 1715, 3666, 2415, 3645], - }, - { - icon: Smile, - bgColor: '#f6f4fe', - color: '#7846e5', - duration: 100, - name: '用户满意度', - value: 100, - percent: '+100%', - data: [100], - }, -]; - -/** 分析概览 */ -const barChartData = [ - { - requireData: [2101, 5288, 4239, 4962, 6752, 5208, 7450], - questionData: [2216, 1148, 1255, 1788, 4821, 1973, 4379], - }, - { - requireData: [2101, 3280, 4400, 4962, 5752, 6889, 7600], - questionData: [2116, 3148, 3255, 3788, 4821, 4970, 5390], - }, -]; - -/** 解决概率 */ -const progressData = [ - { - week: '周一', - percentage: 85, - duration: 110, - color: '#41b6ff', - }, - { - week: '周二', - percentage: 86, - duration: 105, - color: '#41b6ff', - }, - { - week: '周三', - percentage: 88, - duration: 100, - color: '#41b6ff', - }, - { - week: '周四', - percentage: 89, - duration: 95, - color: '#41b6ff', - }, - { - week: '周五', - percentage: 94, - duration: 90, - color: '#26ce83', - }, - { - week: '周六', - percentage: 96, - duration: 85, - color: '#26ce83', - }, - { - week: '周日', - percentage: 100, - duration: 80, - color: '#26ce83', - }, -].reverse(); - -/** 数据统计 */ -const tableData = Array.from({ length: 30 }).map((_, index) => { - return { - id: index + 1, - requiredNumber: getRandomIntBetween(13500, 19999), - questionNumber: getRandomIntBetween(12600, 16999), - resolveNumber: getRandomIntBetween(13500, 17999), - satisfaction: getRandomIntBetween(95, 100), - date: dayjs().subtract(index, 'day').format('YYYY-MM-DD'), - }; -}); - -/** 最新动态 */ -const latestNewsData = cloneDeep(tableData) - .slice(0, 26) - .map((item, index) => { - return Object.assign(item, { - date: `${dayjs().subtract(index, 'day').format('YYYY-MM-DD')} ${days[dayjs().subtract(index, 'day').day()]}`, - }); - }); - -export { chartData, barChartData, progressData, tableData, latestNewsData }; diff --git a/src/views/welcome/utils/hooks.tsx b/src/views/welcome/utils/hooks.tsx new file mode 100644 index 0000000..b9739c1 --- /dev/null +++ b/src/views/welcome/utils/hooks.tsx @@ -0,0 +1,96 @@ +import { ref } from 'vue'; +import { days } from '@/enums/dateEnums'; +import { fetchHomeDatalist } from '@/api/v1/system/system'; +import { default as dayjs } from 'dayjs'; + +// 支出百分比 +export const expendPercent = ref(0); +// 顶部图表数据 +export const chartData = ref([]); +// 收入支出排行榜 +export const homeRanks = ref([]); +// 分析概览x轴 +export const xAxis = ref([]); +// 分析概览收入 +export const incomeData = ref([]); +// 分析概览支出 +export const expendData = ref([]); + +export const onSearch = async () => { + const result = await fetchHomeDatalist(); + if (result.code !== 200) { + return; + } + chartData.value = []; + + // 顶部数据 + const homeCard = result.data?.homeCard; + const income = homeCard?.income?.amount; + const expend = homeCard?.expend?.amount; + const incomeCharts = homeCard?.income?.charts; + const expendCharts = homeCard?.expend?.charts; + console.log(expend); + /* 收入金额 */ + let data = { + icon: 'icon-park-outline:income', + bgColor: '#effaff', + color: '#67C23A', + duration: 2200, + name: '本月总收入', + value: income, + percent:

{`+ ${income} ¥`}

, + data: incomeCharts, + }; + chartData.value.push(data); + + /* 支出金额 */ + data = { + icon: 'icon-park-outline:expenses', + bgColor: '#fff5f4', + color: '#F56C6C', + duration: 2200, + name: '本月总支出', + value: expend, + percent:

{`- ${expend} ¥`}

, + data: expendCharts, + }; + chartData.value.push(data); + + /* 盈利金额 */ + const profit = incomeCharts.map((value, index) => { + const number = value - expendCharts[index]; + return isNaN(number) ? 0 : number; + }); + const profitValue = (income - expend).toFixed(2); + data = { + icon: 'hugeicons:profit', + bgColor: '#fff5f4', + color: '#409EFF', + duration: 2200, + name: '盈利金额', + value: Number(profitValue), + percent:

{`${profitValue} ¥`}

, + data: profit, + }; + chartData.value.push(data); + + /* 支出百分比 */ + expendPercent.value = Number((expend / (income + expend)).toFixed(2)) * 100; + + // 收入和支出排行榜 + homeRanks.value = result.data.homeRanks.map(item => { + const transactionDate = item.transactionDate; + const date = `${dayjs(transactionDate).format('YYYY-MM-DD')} ${days[dayjs(transactionDate).day()]}`; + return { date, amount: item.amount, name: item.categoryName, type: item.type }; + }); + + // 收入和支出分析概览 + xAxis.value = result.data.homeOverview + .filter(item => item.type === 1) + .map(item => { + const transactionDate = item.transactionDate; + return `${dayjs(transactionDate).format('DD')} ${days[dayjs(transactionDate).day()]}`; + }); + incomeData.value = result.data.homeOverview.filter(item => item.type === 1).map(item => item.amount); + expendData.value = result.data.homeOverview.filter(item => item.type === -1).map(item => item.amount); +}; diff --git a/src/views/welcome/utils/utils.ts b/src/views/welcome/utils/utils.ts deleted file mode 100644 index 0d769bd..0000000 --- a/src/views/welcome/utils/utils.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { default as dayjs } from 'dayjs'; -export { useDark, cloneDeep, randomGradient } from '@pureadmin/utils'; - -export function getRandomIntBetween(min: number, max: number) { - return Math.floor(Math.random() * (max - min + 1)) + min; -}