You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
299 lines
8.7 KiB
Vue
299 lines
8.7 KiB
Vue
<template>
|
|
<view class="content pt-[44px]">
|
|
<kevyloading v-if="loading" type="bsm-loader" color="#618af8" transparent></kevyloading>
|
|
|
|
<view class="w-full">
|
|
<wd-navbar fixed safeAreaInsetTop :leftText="user_info?.info?.name || '商城首页'">
|
|
<template #right>
|
|
<wd-icon @click="utils.toUrl('/mall/setup/index')" name="setting" size="22px"></wd-icon>
|
|
</template>
|
|
</wd-navbar>
|
|
</view>
|
|
|
|
<view bg-color="#f7f8fa" class="w-full grid grid-cols-3 gap-3 px-3 my-4">
|
|
|
|
|
|
<view @click="utils.toUrl('/mall/cat/index')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
|
|
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
|
|
<view class="font-bold">分类管理</view>
|
|
<view class="h-0.5 w-5 mt-0.5 bg-white"></view>
|
|
|
|
<view class="flex justify-end">
|
|
<div class="rotate-[-28deg] translate-y-3 translate-x-5">
|
|
<wd-icon name="chat opacity-80" class="opacity-80" size="42px"></wd-icon>
|
|
</div>
|
|
</view>
|
|
</view>
|
|
|
|
<view @click="utils.toUrl('/mall/goods/index')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
|
|
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
|
|
<view class="font-bold">商品管理</view>
|
|
<view class="h-0.5 w-5 mt-0.5 bg-white"></view>
|
|
|
|
<view class="flex justify-end">
|
|
<div class="rotate-[-28deg] translate-y-3 translate-x-5">
|
|
<wd-icon name="goods opacity-80" class="opacity-80" size="42px"></wd-icon>
|
|
</div>
|
|
</view>
|
|
</view>
|
|
|
|
<view @click="utils.toUrl('/mall/order/index')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
|
|
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
|
|
<view class="font-bold">订单管理</view>
|
|
<view class="h-0.5 w-5 mt-0.5 bg-white"></view>
|
|
|
|
<view class="flex justify-end">
|
|
<div class="rotate-[-28deg] translate-y-3 translate-x-5">
|
|
<wd-icon name="gift opacity-80" class="opacity-80" size="42px"></wd-icon>
|
|
</div>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- <view @click="utils.toUrl('/mall/check/list')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
|
|
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
|
|
<view class="font-bold">核销记录</view>
|
|
<view class="h-0.5 w-5 mt-0.5 bg-white"></view>
|
|
|
|
<view class="flex justify-end">
|
|
<div class="rotate-[-28deg] translate-y-3 translate-x-5">
|
|
<wd-icon name="phone" class="opacity-80" size="42px"></wd-icon>
|
|
</div>
|
|
</view>
|
|
</view> -->
|
|
|
|
|
|
|
|
|
|
<!-- <view @click="utils.toUrl('/mall/order/index')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
|
|
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
|
|
<view class="font-bold">订单管理</view>
|
|
<view class="h-0.5 w-5 mt-0.5 bg-white"></view>
|
|
|
|
<view class="flex justify-end">
|
|
<div class="rotate-[-28deg] translate-y-3 translate-x-5">
|
|
<wd-icon name="gift opacity-80" size="42px"></wd-icon>
|
|
</div>
|
|
</view>
|
|
</view> -->
|
|
|
|
|
|
|
|
</view>
|
|
|
|
<view style="transition: 1s;" class="w-full h-full bg-white pt-4 rounded-tr-3xl rounded-tl-3xl shadow-lg oh">
|
|
<view class="order mb-2">
|
|
<wd-grid v-show="oneLine.ok">
|
|
<wd-grid-item @click="utils.toUrl('/mall/user/list')" icon="round" :text="`用户 (${oneLine.user_count})`" />
|
|
<wd-grid-item @click="utils.toUrl('/mall/goods/index')" icon="round" :text="`商品 (${oneLine.goods_count})`" />
|
|
<wd-grid-item @click="utils.toUrl('/mall/goods/index')" icon="round"
|
|
:text="`售罄 (${oneLine.empty_stock_count})`" />
|
|
<wd-grid-item @click="utils.toUrl('/mall/order/index')" icon="round" :text="`订单 (${oneLine.order_count})`" />
|
|
</wd-grid>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="flex-1 bg-white p-2 pb-4">
|
|
<!-- <div class="name mb-2">订单数据</div> -->
|
|
<view class=" p-2 rounded-md">
|
|
<div class="rounded-md overflow-hidden">
|
|
<wd-tabs @change="getOrderProfit">
|
|
<wd-tab :title="`今天`" :name="1"></wd-tab>
|
|
<wd-tab :title="`本周`" :name="2"></wd-tab>
|
|
<wd-tab :title="`本月`" :name="3"></wd-tab>
|
|
<wd-tab :title="`本年`" :name="4"></wd-tab>
|
|
</wd-tabs>
|
|
</div>
|
|
|
|
<div class="grid grid-cols-2 gap-2 my-4">
|
|
<div @click="utils.toUrl('/mall/order/index?s=' + (index + 1))"
|
|
class="item rounded-1xl bg-slate-50 p-2 flex justify-between" style="font-size: 24rpx;"
|
|
v-for="(item, index) of orderProfit.categories">
|
|
{{ item }}
|
|
|
|
<text>{{ orderProfit.series[0].data[index] }}</text>
|
|
</div>
|
|
|
|
<div @click="utils.toUrl('/mall/afterSale/index')"
|
|
class="item rounded-1xl bg-slate-50 p-2 flex justify-between" style="font-size: 24rpx;">
|
|
售后订单
|
|
<text>∞</text>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
<bar :barData="orderProfit"></bar>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="flex-1 bg-white p-2 pb-4 ">
|
|
<view class=" p-2 rounded-md">
|
|
<div class="rounded-md overflow-hidden">
|
|
<wd-tabs @change="getOrderGood">
|
|
<wd-tab :title="`今天`" :name="1"></wd-tab>
|
|
<wd-tab :title="`本周`" :name="2"></wd-tab>
|
|
<wd-tab :title="`本月`" :name="3"></wd-tab>
|
|
<wd-tab :title="`本年`" :name="4"></wd-tab>
|
|
</wd-tabs>
|
|
</div>
|
|
|
|
<div class="grid grid-cols-2 gap-2 my-4">
|
|
<div class="item rounded-1xl bg-slate-50 p-2 flex justify-between" style="font-size: 24rpx;"
|
|
v-for="(item, index) of orderGood.categories">
|
|
{{ item }}
|
|
|
|
<text>{{ orderGood.series[0].data[index] }}</text>
|
|
</div>
|
|
</div>
|
|
|
|
<bar :barData="orderGood"></bar>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="bg-white h-[80px]"></view>
|
|
|
|
<view class="fixed left-2 right-2 bottom-4 z-50">
|
|
<myTabbar></myTabbar>
|
|
</view>
|
|
|
|
</view>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { ref } from 'vue';
|
|
import utils from '@/utils/utils.js';
|
|
import index from '@/api/mall/index.js';
|
|
import myTabbar from "../components/myTabbar/index.vue";
|
|
import bar from "../components/bar/bar.vue";
|
|
import kevyloading from "@/components/kevy-loading/kevy-loading";
|
|
|
|
/**
|
|
* @type {Ref<boolean>}
|
|
* 控制页面加载状态的 Ref
|
|
*/
|
|
const loading = ref(false);
|
|
|
|
/**
|
|
* 从本地存储中获取用户信息
|
|
*/
|
|
const user_info = uni.getStorageSync("user_info");
|
|
|
|
/**
|
|
* @type {Ref<Object>}
|
|
* 存储一行数据的 Ref
|
|
*/
|
|
const oneLine = ref({});
|
|
|
|
/**
|
|
* 获取一行数据的函数
|
|
*/
|
|
const getOneLine = () => {
|
|
index.dataCount.oneLine().then(res => {
|
|
oneLine.value = res.data;
|
|
oneLine.value.ok = true;
|
|
});
|
|
};
|
|
|
|
// 初始化调用获取一行数据
|
|
getOneLine();
|
|
|
|
/**
|
|
* @type {Ref<Object>}
|
|
* 存储订单利润数据的 Ref
|
|
*/
|
|
const orderProfit = ref({});
|
|
|
|
/**
|
|
* 获取订单利润数据的函数
|
|
* @param {Object} e - 包含索引的对象
|
|
*/
|
|
const getOrderProfit = (e) => {
|
|
loading.value = true;
|
|
index.dataCount.orderProfit({
|
|
date: e.index + 1
|
|
}).then(res => {
|
|
if (res.code === 0) {
|
|
const statusData = res.data.reduce((obj, cur) => {
|
|
obj[cur.status] = cur;
|
|
return obj;
|
|
}, {});
|
|
|
|
const arr = [
|
|
{ name: "未付款订单", data: statusData[0]?.count || 0 },
|
|
{ name: "待发货订单", data: statusData[1]?.count || 0 },
|
|
{ name: "已发货订单", data: statusData[2]?.count || 0 },
|
|
{ name: "已完成订单", data: statusData[3]?.count || 0 },
|
|
{ name: "已取消订单", data: statusData[4]?.count || 0 }
|
|
];
|
|
|
|
orderProfit.value.categories = arr.map(item => item.name);
|
|
orderProfit.value.series = [
|
|
{ name: "订单数据", data: arr.map(item => item.data) }
|
|
];
|
|
|
|
loading.value = false;
|
|
console.log(orderProfit.value);
|
|
}
|
|
});
|
|
};
|
|
|
|
// 初始化调用获取订单利润数据
|
|
getOrderProfit({ index: 0 });
|
|
|
|
/**
|
|
* @type {Ref<Object>}
|
|
* 存储订单商品数据的 Ref
|
|
*/
|
|
const orderGood = ref({});
|
|
|
|
/**
|
|
* 获取订单商品数据的函数
|
|
* @param {Object} e - 包含索引的对象
|
|
*/
|
|
const getOrderGood = (e) => {
|
|
loading.value = true;
|
|
index.dataCount.orderGood({
|
|
date: e.index + 1
|
|
}).then(res => {
|
|
if (res.code === 0) {
|
|
const payTypeData = res.data.reduce((obj, cur) => {
|
|
obj[cur.pay_type] = cur;
|
|
return obj;
|
|
}, {});
|
|
|
|
const totalPrice = (
|
|
(Number(payTypeData[1]?.pay_price) || 0) +
|
|
(Number(payTypeData[2]?.pay_price) || 0) +
|
|
(Number(payTypeData[3]?.pay_price) || 0)
|
|
);
|
|
|
|
const arr = [
|
|
{ name: "总成交金额", data: totalPrice || 0 },
|
|
{ name: "支付宝支付", data: payTypeData[1]?.pay_price || 0 },
|
|
{ name: "微信支付", data: payTypeData[2]?.pay_price || 0 },
|
|
{ name: "余额支付", data: payTypeData[3]?.pay_price || 0 },
|
|
];
|
|
|
|
orderGood.value.categories = arr.map(item => item.name);
|
|
orderGood.value.series = [
|
|
{ name: "交易数据", data: arr.map(item => item.data) }
|
|
];
|
|
|
|
loading.value = false;
|
|
console.log(orderGood.value);
|
|
}
|
|
});
|
|
};
|
|
|
|
// 初始化调用获取订单商品数据
|
|
getOrderGood({ index: 0 });
|
|
|
|
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.content {
|
|
padding-top: 44px;
|
|
}
|
|
</style>
|