123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511 |
- <template>
- <view class="pagebox">
- <!-- #ifdef MP || APP-PLUS -->
- <NavBar titleText="数据统计" :iconColor="iconColor" :textColor="iconColor" :isScrolling="isScrolling" showBack></NavBar>
- <!-- #endif -->
- <view class="headerBg">
- <view :style="{ height: `${getHeight.barTop}px` }"></view>
- <view :style="{ height: `${getHeight.barHeight}px` }"></view>
- <view class="inner"></view>
- </view>
- <view class="order-index" ref="container">
- <view class="header">
- <view class="">销售额(元)</view>
- <view class="money">{{ after_price }}</view>
- <view class="info">
- 较昨日同比增长:{{ increase_time_status == 1 ? '' : '-' }}{{ growth_rate }}%
- <text :class="['iconfont', increase_time_status == 1 ? 'icon-ic_up2' : 'icon-ic_down2']"></text>
- </view>
- <view class="picker">
- <picker mode="selector" :range="array" @change="bindPickerChange">
- <view>{{ array[index] }}<text class="iconfont icon-ic_downarrow"></text></view>
- </picker>
- </view>
- </view>
- <view class="wrapper">
- <view class="list acea-row">
- <view class="item">
- <view class="num">{{ after_number }}</view>
- <view>订单数</view>
- </view>
- <view class="item">
- <view class="num">{{ after_pay_number }}</view>
- <view>支付人数</view>
- </view>
- <view class="item">
- <view class="num">{{ today_visits }}</view>
- <view>浏览量</view>
- </view>
- </view>
- </view>
- <div class="chart">
- <view class="title">
- 销售订单趋势图
- </view>
- <canvas canvas-id="canvasMix" id="canvasMix" class="charts" disable-scroll @touchstart="touchMix" @touchmove="moveMix" @touchend="touchEndMix">
- <!-- <cover-view class="cover-view"></cover-view> -->
- </canvas>
- </div>
- <view class="public-wrapper">
- <view class="title">
- 详细数据
- </view>
- <view class="nav acea-row row-between-wrapper">
- <view class="data">日期</view>
- <view class="browse">订单数</view>
- <view class="turnover">成交额</view>
- <view class="visit">浏览量</view>
- </view>
- <view class="conter">
- <view class="item acea-row row-between-wrapper" v-for="(item, index) in list" :key="index">
- <view class="data">{{ item.time }}</view>
- <view class="browse">{{ item.count }}</view>
- <view class="turnover">¥ {{ item.price }}</view>
- <view class="visit">{{ item.visit }}</view>
- </view>
- </view>
- </view>
- <Loading :loaded="loaded" :loading="loading"></Loading>
- </view>
- <view class="safe-area-inset-bottom"></view>
- </view>
- </template>
- <script>
- let _self;
- let canvaMix = null;
- import {
- getStatisticsInfo,
- getStatisticsMonth,
- getOrderTime,
- getOrderChart,
- } from "@/api/admin";
- import Loading from '@/components/Loading/index.vue'
- import uCharts from '../components/ucharts/ucharts'
- // #ifdef MP || APP-PLUS
- import NavBar from '@/components/NavBar.vue';
- // #endif
- export default {
- name: 'adminOrder',
- components: {
- Loading,
- // #ifdef MP ||APP-PLUS
- NavBar,
- // #endif
- },
- data() {
- return {
- iconColor: '#FFFFFF',
- isScrolling: false,
- getHeight: this.$util.getWXStatusHeight(),
- census: {},
- list: [],
- where: {
- page: 1,
- limit: 15
- },
- loaded: false,
- loading: false,
- after_price: 0, // 销售额
- after_number: 0, // 订单数
- after_pay_number: 0, // 支付人数
- today_visits: 0, // 浏览量
- growth_rate: 0, // 增长率
- increase_time: 0, // 较昨日同比增长
- increase_time_status: 1, // 1 增长 2 减少
- cWidth: '',
- cHeight: '',
- pixelRatio: 1,
- textarea: '',
- index: 0,
- array: ['今天', '近7天', '近30天'],
- arrays: [1, 7, 30],
- }
- },
- onShow() {
- _self = this;
- this.cWidth = uni.upx2px(710);
- this.cHeight = uni.upx2px(500);
- this.getOrderTime();
- this.getOrderChart();
- this.getIndex();
- this.getList();
- // this.$scroll(this.$refs.container, () => {
- // !this.loading && this.getList();
- // });
- },
- onPageScroll(e) {
- // #ifdef MP
- if (e.scrollTop > 50) {
- this.isScrolling = true;
- this.iconColor = '#333333';
- } else if (e.scrollTop < 50) {
- this.isScrolling = false;
- this.iconColor = '#FFFFFF';
- }
- // #endif
- },
- beforeMount() {
- canvaMix = null
- },
- methods: {
- bindPickerChange: function(e) {
- console.log('picker发送选择改变,携带值为', e.detail.value)
- this.index = e.detail.value
- this.getOrderTime();
- this.getOrderChart();
- },
- getOrderTime() {
- getOrderTime({
- type: this.arrays[this.index],
- }).then(res => {
- const {
- after_number,
- after_pay_number,
- after_price,
- today_visits,
- growth_rate,
- increase_time,
- increase_time_status,
- } = res.data;
- this.after_number = after_number;
- this.after_pay_number = after_pay_number;
- this.after_price = after_price;
- this.today_visits = today_visits;
- this.growth_rate = growth_rate;
- this.increase_time = increase_time;
- this.increase_time_status = increase_time_status;
- });
- },
- getOrderChart() {
- getOrderChart({
- type: this.arrays[this.index],
- }).then(res => {
- const data = res.data;
- let Mix = {
- categories: [],
- series: []
- };
- let series = [{
- "name": '销售额',
- "type": "line",
- "data": [],
- }];
- data.forEach(({
- num,
- price,
- time
- }) => {
- series[0].data.push(price);
- Mix.categories.push(time);
- });
- Mix.series = series;
- this.chartData = data;
- if (canvaMix) {
- canvaMix.updateData(Mix);
- } else {
- this.showLineA("canvasMix", Mix);
- }
- });
- },
- // 创建charts
- showLineA(canvasId, chartData) {
- let _self = this
- canvaMix = new uCharts({
- $this: _self,
- canvasId: canvasId,
- type: 'line',
- fontSize: 11,
- padding: [5, 5, 0, 5],
- legend: {
- show: true,
- position: 'bottom',
- float: 'center',
- padding: 5,
- lineHeight: 11,
- margin: 6,
- },
- background: '#FFFFFF',
- pixelRatio: _self.pixelRatio,
- categories: chartData.categories,
- series: chartData.series,
- animation: true,
- enableScroll: true, //开启图表拖拽功能
- xAxis: {
- disableGrid: false,
- type: 'grid',
- gridType: 'dash',
- itemCount: 6,
- scrollShow: true,
- scrollAlign: 'left',
- },
- yAxis: {
- data: [{
- calibration: true,
- position: 'left',
- title: '销售额(元)',
- titleFontSize: 12,
- format: (val) => {
- return val.toFixed(0)
- }
- }, ],
- showTitle: true,
- gridType: 'dash',
- dashLength: 4,
- splitNumber: 7,
- },
- width: _self.cWidth * _self.pixelRatio,
- height: _self.cHeight * _self.pixelRatio,
- dataLabel: true,
- dataPointShape: true,
- });
- },
- touchMix(e) {
- canvaMix.scrollStart(e);
- },
- moveMix(e) {
- canvaMix.scroll(e);
- },
- touchEndMix(e) {
- var index = canvaMix.getCurrentDataIndex(e);
- canvaMix.scrollEnd(e);
- //下面是toolTip事件,如果滚动后不需要显示,可不填写
- canvaMix.touchLegend(e);
- canvaMix.showToolTip(e, {
- textList: [{
- text: this.chartData[index].time,
- color: null
- },
- {
- text: "销售额:" + this.chartData[index].price,
- color: "#1890FF"
- },
- {
- text: "订单量:" + this.chartData[index].num,
- color: "#91CB74"
- }
- ]
- });
- },
- getIndex: function() {
- var that = this;
- getStatisticsInfo().then(
- res => {
- that.census = res.data;
- },
- err => {
- that.$util.Tips({
- title: err
- })
- }
- );
- },
- getList: function() {
- var that = this;
- if (that.loading || that.loaded) return;
- that.loading = true;
- getStatisticsMonth(that.where).then(
- res => {
- that.loading = false;
- that.loaded = res.data.length < that.where.limit;
- that.list.push.apply(that.list, res.data);
- that.where.page = that.where.page + 1;
- },
- error => {
- that.$util.Tips({
- title: error
- })
- },
- 300
- );
- }
- },
- onReachBottom() {
- this.getList()
- }
- }
- </script>
- <style lang="scss" scoped>
- .pagebox {
- position: relative;
- overflow: hidden;
- }
- .safe-area-inset-bottom {
- height: 0;
- height: constant(safe-area-inset-bottom);
- height: env(safe-area-inset-bottom);
- }
- .headerBg {
- position: absolute;
- top: 0;
- left: -25%;
- width: 150%;
- border-bottom-right-radius: 100%;
- border-bottom-left-radius: 100%;
- background: linear-gradient(270deg, #01ABF8 0%, #2A7EFB 100%);
- .inner {
- height: 356rpx;
- }
- }
- /*订单首页*/
- .order-index {
- position: relative;
- padding: 0 20rpx;
- }
- .order-index .header {
- position: relative;
- padding: 24rpx 0 40rpx 20rpx;
- font-size: 28rpx;
- line-height: 40rpx;
- color: #FFFFFF;
- .picker {
- position: absolute;
- top: 24rpx;
- right: 0;
- height: 48rpx;
- padding: 0 20rpx;
- border-radius: 24rpx;
- background: rgba(255, 255, 255, 0.3);
- text-align: center;
- font-size: 24rpx;
- line-height: 48rpx;
- color: #FFFFFF;
- .iconfont {
- margin-left: 10rpx;
- font-size: 24rpx;
- }
- }
- }
- .order-index .header .money {
- margin-top: 26rpx;
- font-family: SemiBold;
- font-size: 80rpx;
- line-height: 80rpx;
- }
- .order-index .header .info {
- margin-top: 30rpx;
- .iconfont {
- margin-left: 6rpx;
- font-size: 28rpx;
- }
- }
- .order-index .wrapper {
- background-color: #fff;
- border-radius: 24rpx;
- }
- .order-index .wrapper .list .item {
- flex: 1;
- padding: 36rpx 0 26rpx;
- text-align: center;
- font-size: 24rpx;
- line-height: 34rpx;
- color: #999;
- }
- .order-index .wrapper .list .item .num {
- margin-bottom: 8rpx;
- font-family: SemiBold;
- font-size: 36rpx;
- color: #333;
- }
- .public-wrapper .title {
- font-weight: 500;
- font-size: 30rpx;
- line-height: 42rpx;
- color: #333333;
- padding: 32rpx 0 40rpx 24rpx;
- }
- .public-wrapper {
- background-color: #fff;
- border-radius: 24rpx;
- margin-top: 20rpx;
- margin-bottom: 20rpx;
- }
- .public-wrapper .nav {
- padding: 0 40rpx;
- line-height: 34rpx;
- font-size: 24rpx;
- color: #999;
- }
- .public-wrapper .data {
- flex: 1;
- text-align: left;
- }
- .public-wrapper .browse {
- flex: 1;
- // text-align: center;
- }
- .public-wrapper .turnover {
- flex: 1;
- // text-align: center;
- }
- .public-wrapper .visit {
- flex: 1;
- text-align: right;
- }
- .public-wrapper .conter {
- padding: 0 40rpx;
- }
- .public-wrapper .conter .item {
- border-bottom: 1px solid #F1F1F1;
- height: 74rpx;
- font-size: 24rpx;
- }
- .chart {
- border-radius: 24rpx;
- margin-top: 20rpx;
- background: #FFFFFF;
- .title {
- padding: 32rpx 0 16rpx 24rpx;
- font-weight: 500;
- font-size: 30rpx;
- line-height: 42rpx;
- color: #333333;
- }
- .chart-title {
- padding: 40rpx 0 6rpx 42rpx;
- font-size: 22rpx;
- line-height: 26rpx;
- color: #999999;
- }
- .charts {
- width: 100%;
- height: 514rpx;
- }
- }
- .cover-view {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- }
- </style>
|