刮刮前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1003 lines
25 KiB

<template>
<view class="homePage">
<view class="nav_area dis-flex-between-center">
<view class="left-btn" v-html="(userType!=='background')?valueType:''"
:class="{'haveIcon':userType!=='background','select':showValueType}" @click="selectType"></view>
<view class="" style="font-size: 18px;color: #101010;" v-html="userType!=='background'?'顶呱刮':'顶呱刮-总平台'"></view>
<view class="right-btn" @click="changeAudio" v-html="userType!=='background'?'音乐':''"
:class="(userType!=='background'&&!isPlay)?'playIcon':(userType!=='background'&&isPlay)?'pauseIcon':''">
<!-- <audio src="../../static/audio/pd-5b7671cee8051387.mp3" poster="" name="" author="" action="" controls></audio> -->
</view>
</view>
<view class="home_1" v-if="userType!=='background'">
<view class="banner_area">
<swiper v-if="bannerList.length!=0" :indicator-dots="true" :autoplay="true" :interval="3000" :duration="1000">
<swiper-item v-for="(item, index) in bannerList" :key="index">
<!-- <image :src="item.image" mode=""></image> -->
<img v-lazy="item.image" />
</swiper-item>
</swiper>
<view v-else class="loader_image">
<view class="loader"></view>
</view>
</view>
<view class="notice" @click="toUrl('notice')" v-if="notice.title">
<text class="notice_t">公告:</text>
{{notice.title}}
</view>
<view class="dis-flex goods_area new" v-if="showValueType">
<view v-for="(item,index) in goodsList" :key="index" class="type_item">
<view class="" @click="selectValueType(item)">
{{item.title}}
</view>
</view>
</view>
<view class="dis-flex goods_area" v-if="0">
<view v-for="(item,index) in goodsList" :key="index" class="goods_item">
<view class="" @click="selectValueType(item)">
{{item.title}}
</view>
</view>
</view>
<view class="">
<view v-for="(item,index) in typeGoodsList" :key="index" class="dis-flex-between-center goods-item ">
<view v-if="showimg==true" class="loader-cover_image">
<view class="loader"></view>
</view>
<view class="" v-else>
<!-- <image :src="item.cover_image" mode="aspectFill"></image> -->
<img v-lazy="item.cover_image" />
</view>
<view class="goods-info">
<view class="skeleton-rect" style="color: #333;font-size: 16px;margin-bottom: 3px;">{{item.title}}</view>
<view style="margin-bottom: 3px;">面值{{item.price}}元</view>
<view class="">最高中奖金额{{item.max_awards_amount}}</view>
</view>
<view class="goods-btn" @click="toDetailUrl(item)">刮奖</view>
</view>
</view>
<view class="list_area" v-if="0">
<view class="list_title">中奖记录</view>
<view class="dis-flex-between-center t-h">
<view class="" style="flex: 0.4;">ID</view>
<view class="" style="flex: 0.3;">手机号码</view>
<view class="" style="flex: 0.3;text-align: right;">中奖金额</view>
</view>
<view v-for="(item,index) in recordsList" :key="index" class="t-d dis-flex-between-center">
<view class="" style="flex: 0.4;">{{item.user_id}}</view>
<view class="" style="flex: 0.3;">{{item.phone}}</view>
<view class="black" style="flex: 0.3;text-align: right;"><text class="red">{{item.awards_amount}}</text>元</view>
</view>
</view>
</view>
<view class="home_2" v-if="userType=='background'">
<view class="">
<view class="title">
待办<text style="color: #999;font-size: 12px;">(更新于:{{needInfo.update_time}})</text>
</view>
<view class="card">
<view class="">{{needInfo.down_scores_quota.title}}</view>
<view class="t2">{{needInfo.down_scores_quota.quota}}</view>
</view>
</view>
<view class="">
<view class="title">
用户统计
</view>
<view class="pie_area">
<!-- #ifdef H5 -->
<view class="pie_box" id="piechart"></view>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<view class="pie_box" ref="piechart"></view>
<!-- #endif -->
<view class="sum">
{{userStatistics.sum.num}}
</view>
<view class="right">
<view class="right1">
<view class="">
<view class="label" style="font-size: 12px;">代理人数</view>
<view class="" style="font-weight: bold;padding-left: 20px;">{{userStatistics.agent.num}}</view>
</view>
<view class="" style="font-weight: bold;">{{userStatistics.agent.rate}}</view>
</view>
<view class="right1">
<view class="">
<view class="label" style="font-size: 12px;">用户人数</view>
<view class="" style="font-weight: bold;padding-left: 20px;">{{userStatistics.user.num}}</view>
</view>
<view class="" style="font-weight: bold;">{{userStatistics.user.rate}}</view>
</view>
</view>
</view>
</view>
<view class="">
<view class="title">
上下分数据
</view>
<view class="chart_tab">
<view class="item" @click="changeChartIndex(1)" :class="chartIndex==1?'active':''">上分统计</view>
<view class="item" @click="changeChartIndex(2)" :class="chartIndex==2?'active':''">下分数据</view>
</view>
<view class="chart_area">
<view class="chart">
<view class="" style="color: #999;font-size: 14px;">
{{ chartIndex==1?'上分总数':'下分总数' }}:<text style="color: #101010;">{{ UpDownSta.sum_value }}</text>
</view>
<!-- #ifdef H5 -->
<view class="" id="mychart" style="width: 670rpx;height: 250px;"></view>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<view class="" ref="mychart" style="width: 670rpx;height: 250px;">
<echarts1 :option="optionData" id="myChart1" style="height: 110vw;margin-left: 2vw;width: 100%;padding: 4vw 0 0 0;"></echarts1>
</view>
<!-- #endif -->
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import API from '@/common/js/api.js'
import updateTabBar from '@/common/js/updateTabBar.js'
// #ifdef H5
import * as echarts from 'echarts';//引入的是npm下载的
// #endif
import echarts1 from './echarts.vue';
export default {
data(){
return {
userType: 'background',//user|agent|background
bannerList: [],
goodsList: [],
showValueType: false,
valueType: '面值',
valueId: '',
typeGoodsList: [],
recordsList: [],
chartIndex: 1,//1上分2下分
myChart: null,
pieChart: null,
innerAudioContext: null,
isPlay: false,
nomore: false,
page: 1,
intervalId: null,
needInfo: {
update_time: '2023/08/30 19:00',
down_scores_quota: {
title: '待下分额度',
quota: ''
}
},
userStatistics: {
agent: {
num: '0',
rate: '0%'
},
user: {
num: '0',
rate: '0%'
},
sum: {
num: "0人" //总人数
}
},
UpDownSta: {
"histogram": [
{"date": "09", //月份
"value": "20.00" //数据
},
], //柱状图
"sum_value": "20.00" ,//总数据,
xData: ['1月', '2月', '3月', '4月', '5月'],
data: [155, 250, 360, 100, 180, 204]
},
notice: {
title: ''
},
// 1#ifdef APP-PLUS
optionData: {
color: ['#5087EC','#74C0C8'],
grid: {
top: '12%',
bottom: '5%',
left: '2%',
right: '4%',
containLabel: true//防止标签溢出
},
tooltip: {
trigger: 'axis',
triggerOn: 'mousemove|click'
},
xAxis: {
data: this.UpDownSta&&this.UpDownSta.xData || ['1月', '2月', '3月', '4月', '5月'],
axisLine: {
lineStyle: {
color: "#aaa",
width: 2
}
},
axisTick: {
lineStyle: {
color: "#aaa",
width: 2
}
},
axisLabel: {
color: '#444'
},
},
yAxis: {
type: 'value',
min: 0,
max: this.interval*5,
interval: this.interval,
axisLine: {
show: false,
lineStyle: {
color: "#ddd"
}
},
axisLabel: {
color: '#444'
},
splitLine: {
lineStyle: {
color: "#ddd"
}
}
},
series: [
{
name: '',
type: 'bar',
barMaxWidth: 30,
data: this.UpDownSta&&this.UpDownSta.data || [155, 250, 360, 100, 180, 204]
}
]
},
// 1#endif
showSkeleton: true,
showimg:true
}
},
components: {
echarts1
},
computed: {
isLogin(){
return uni.getStorageSync('user_token');
},
interval(){
let yMax = ([...this.UpDownSta.data].sort())[this.UpDownSta.data.length-1];
if(!yMax){
yMax = 200;
}
let interval = yMax / 5;
if((interval+'-').indexOf('.')!=-1){
interval = Math.ceil(interval);
}
return interval;
}
},
methods: {
changeAudio(){
if(this.userType!=='user' && this.userType!=='agent') return;
if(this.isPlay){
this.isPlay = false;
this.innerAudioContext.pause();
}else{
this.isPlay = true;
this.innerAudioContext.play();
}
},
toUrl(item){
if(item=='login'){
uni.navigateTo({
url: '/pages/login/login'
// url: '/uni_modules/uni-id-pages/pages/login/login-withpwd'
})
}else if(item=='notice'){
uni.navigateTo({
url: '/pages/NoticeDetails/NoticeDetails?id='+this.notice.id
})
}else if(item=='login'){
}else{
uni.navigateTo({
url:'/pages/goodslist/goodslist?type='+item.title+'&id='+item.id
})
}
},
/* 选择面值 */
selectType(){
this.showValueType = !this.showValueType;
},
selectValueType(item){
this.valueId = item.id;
if(item.title=='全部面值'){
this.valueType = '面值';
}else{
this.valueType = item.title;
}
this.getGoodsList();
this.showValueType = false;
},
/* 某一面值的列表 */
getGoodsList(){
let data = {zone_id: this.valueId};
if(this.valueType=="面值"){
data = {};
}
if(this.typeGoodsList.length==0){
this.showimg = true
}
API.getGoodsList(data, res=>{
// console.log(res);
this.typeGoodsList = res.data;
setTimeout(()=>{
this.showimg = false
},100)
})
},
/* */
toDetailUrl(item){
uni.navigateTo({
url:'/pages/scratchCard/scratchCard?id='+item.id+'&type='+this.valueType
})
},
changeChartIndex(type){
this.chartIndex = type;
this.getUpDownSta(type);
// setTimeout(()=>{
// this.myChart.clear();
// this.renderChart();
// }, 200)
},
renderChart(){
let option = {
color: ['#5087EC','#74C0C8'],
grid: {
top: '12%',
bottom: '5%',
left: '2%',
right: '4%',
containLabel: true//防止标签溢出
},
tooltip: {
trigger: 'axis',
triggerOn: 'mousemove|click'
},
xAxis: {
data: this.UpDownSta.xData,
axisLine: {
lineStyle: {
color: "#aaa",
width: 2
}
},
axisTick: {
lineStyle: {
color: "#aaa",
width: 2
}
},
axisLabel: {
color: '#444'
},
},
yAxis: {
type: 'value',
min: 0,
max: this.interval*5,
interval: this.interval,
axisLine: {
show: false,
lineStyle: {
color: "#ddd"
}
},
axisLabel: {
color: '#444'
},
splitLine: {
lineStyle: {
color: "#ddd"
}
}
},
series: [
{
name: '',
type: 'bar',
barMaxWidth: 30,
data: this.UpDownSta.data
}
]
};
this.myChart.setOption(option);
},
renderPie(){
let option = {
color: ['#22c18b','#678CFD'],
series: [
{
name: '',
type: 'pie',
radius: ['68%', '98%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 4,
borderColor: '#fff',
borderWidth: 0
},
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: 40,
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{ value: this.userStatistics.agent.num, name: 'Search Engine' },
{ value: this.userStatistics.user.num, name: 'Direct' }
]
}
]
};
this.pieChart.setOption(option);
},
/*轮播图*/
getRotationChart(){
API.getRotationChart({
page:1, limit: 10
}, res=>{
this.bannerList = res.data.list;
// console.log(res.data,11111);
})
},
/*专区*/
getZoneList(){
API.getZoneList({}, res=>{
this.goodsList = res.data;
this.goodsList.push({
id: '',
title: '全部面值'
})
// this.valueType = this.goodsList[0].title;
// this.valueId = this.goodsList[0].id;
// this.getGoodsList();
})
},
/*记录*/
getAwardRecords(page=1, limit=20){
API.getAwardRecords({
page:page, limit: limit
}, res=>{
if(res.data.list.length<10){
this.nomore = true;
}
if(page>1){
this.recordsList = this.recordsList.concat(res.data.list);
}else{
this.recordsList = res.data.list;
}
})
},
/*总后台待办*/
getNeedSta(){
API.request('/adminStatistics/needStatistics', {}, res=>{
this.needInfo = res.data;
})
},
/*总后台用户统计*/
getUserSta(){
API.request('/adminStatistics/userStatistics', {}, res=>{
this.userStatistics = res.data;
this.renderPie(); // 数据更新后立即重新渲染图表
})
},
/*总后台上下分统计数据*/
getUpDownSta(type=1){
API.request('/adminStatistics/upAndDownStatistics', {type: type}, res=>{
this.UpDownSta = {...res.data, xData: [], data: []};
this.UpDownSta.xData = this.UpDownSta.histogram.map(item=>{
return +item.date+'月';
})
this.UpDownSta.data = this.UpDownSta.histogram.map(item=>{
return item.value;
})
// 在数据请求返回后进行图表的渲染
this.$nextTick(() => {
this.myChart.clear();
this.renderChart();
});
})
},
/**/
getNotice(){
API.request('/index/getNotice', {}, res=>{
this.notice = res.data;
}, fail=>{}, true)
},
},
mounted() {
if(this.userType!=='background'){
this.innerAudioContext = uni.createInnerAudioContext();
// this.innerAudioContext.autoplay = false;
this.innerAudioContext.loop = true;
this.innerAudioContext.src = '../../static/audio/bgm.mp3';
this.innerAudioContext.autoplay = true;//H5端部分浏览器不支持
this.innerAudioContext.onPlay(() => {
console.log('开始播放');
});
this.innerAudioContext.onPause(() => {
console.log('暂停播放');
});
this.innerAudioContext.onError((res) => {
console.log(res.errMsg);
console.log(res.errCode);
});
if(!this.isPlay){
this.isPlay = true;
this.innerAudioContext.play();//报错原因是chrome新特性,内容大致意思是开发者不能利用手中权限去给用户造成噪音干扰,首次加载页面需要用户和audio/video进行交互
}
}
// this.userType='background';
if(this.userType=='background'){
this.intervalId = setInterval(() => {
this.getUserSta();
}, 2000);
// console.log(this.$refs, 'this.$refs----');
// console.log(this.$refs.piechart, 'this.$refs.piechart----');
}
},
onShow() {
setTimeout(()=>{
// debugger;
if(this.userType!=='background'){
if(this.userType=='user'){
updateTabBar.changeUser();
}else if(this.userType=='agent'){
updateTabBar.changeAgent();
}
this.getZoneList();// 面值列表
this.getGoodsList();// 彩票列表
this.getRotationChart();
this.getAwardRecords();
this.getNotice();
}else if(this.userType=='background'){
this.chartIndex = 1;
updateTabBar.changebackground();
this.getNeedSta();
this.getUserSta();
this.getUpDownSta();
// #ifdef H5
this.pieChart = echarts.init(document.getElementById('piechart'));
this.myChart = echarts.init(document.getElementById('mychart'));
// #endif
// #ifdef APP-PLUS
// this.pieChart = echarts.init(this.$refs.piechart);
// this.myChart = echarts.init(this.$refs.mychart);
// #endif
setTimeout(()=>{
this.renderPie();
this.renderChart();
}, 200)
}
}, 500)
},
onHide() {
clearInterval(this.intervalId);
},
created() {
this.userType = uni.getStorageSync('userType');
// if(this.userType=='background'){
// this.getUpDownSta();
// }
},
onReachBottom() {
if(this.userType!=='background' && !this.nomore){
this.page++;
this.getAwardRecords(this.page, 10);
}
},
onUnload(){
if(this.userType!=='background' && this.isPlay){
this.isPlay = false;
this.innerAudioContext.pause();
}
}
}
</script>
<style lang="scss" scoped>
.loader {
width: 50px;
--b: 8px;
aspect-ratio: 1;
border-radius: 50%;
padding: 1px;
background: conic-gradient(#0000 10%,#000000) content-box;
-webkit-mask:
repeating-conic-gradient(#0000 0deg,#000 1deg 20deg,#0000 21deg 36deg),
radial-gradient(farthest-side,#0000 calc(100% - var(--b) - 1px),#000 calc(100% - var(--b)));
-webkit-mask-composite: destination-in;
mask-composite: intersect;
animation:l4 1s infinite steps(10);
}
@keyframes l4 {to{transform: rotate(1turn)}
}
.loader-cover_image{
width: 138px;height: 88px;border-radius: 10px;display: flex;justify-content: center;align-items: center;
}
.loader_image{
width: 700rpx;height: 300rpx;display: flex;justify-content: center;align-items: center;
}
.dis-flex{
display: flex;
}
.dis-flex-between-center{
display: flex;
justify-content: space-between;
align-items: center;
}
.homePage{
padding: 90rpx 12.5px 50px;
/* #ifdef APP-PLUS */
padding-top: calc(90rpx + var(--status-bar-height));
/* #endif */
}
.nav_area {
position: fixed;
top: 0px;
left: 0px;
z-index: 99;
background-color: #fff;
box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.05);
width: 700rpx;
height: 88rpx;
padding: 0px 25rpx;
padding-top: var(--status-bar-height);
box-sizing: content-box;
color: #b0b0b0;
font-size: 14px;
.left-btn{
flex: 0.3;
height: 48rpx;
line-height: 48rpx;
color: #E33837;
&.haveIcon::after{
content: '';
width: 48rpx;
height: 48rpx;
display: inline-block;
// background-image: url("../../static/home/iconPark-me@2x.png");
background-image: url("../../static/home/fas fa-caret-down@2x.png");
background-size: contain;
vertical-align: middle;
margin-right: 10rpx;
margin-top: -2px;
}
&.haveIcon.select::after{
content: '';
width: 48rpx;
height: 48rpx;
display: inline-block;
// background-image: url("../../static/home/iconPark-me@2x.png");
background-image: url("../../static/home/fas fa-caret-down@2x.png");
background-size: contain;
vertical-align: middle;
margin-right: 10rpx;
margin-top: -2px;
transform: rotate(-180deg);
}
}
.right-btn{
flex: 0.3;
text-align: right;
height: 48rpx;
line-height: 48rpx;
&.playIcon::after{
content: '';
width: 48rpx;
height: 48rpx;
display: inline-block;
background-image: url("../../static/home/md-volume_off@2x.png");
background-size: contain;
vertical-align: middle;
margin-left: 10rpx;
margin-top: -2px;
}
&.pauseIcon::after{
content: '';
width: 48rpx;
height: 48rpx;
display: inline-block;
background-image: url("../../static/home/md-volume_up@2x.png");
background-size: contain;
vertical-align: middle;
margin-left: 10rpx;
margin-top: -2px;
}
}
}
.home_1{
.banner_area{
padding: 20px 0px;
swiper{
border-radius: 10px;
overflow: hidden;
}
// image{
// width: 700rpx;
// height: 300rpx;
// border-radius: 10px;
// overflow: hidden;
// }
img{
width: 700rpx;
height: 300rpx;
border-radius: 10px;
overflow: hidden;
}
}
.notice{
color: #f00;
font-size: 14px;line-height: 14px;margin-bottom: 30rpx;
display: -webkit-box;//将盒子转换为弹性盒子
-webkit-box-orient: vertical;//文本显示方式,默认水平
-webkit-line-clamp: 1;//设置显示多少行
overflow: hidden;
.notice_t{
// color: #b0b0b0;
color: #f00;
}
}
.goods_area{
flex-wrap: wrap;
justify-content: space-between;
width: 700rpx;
position: fixed;
top: 88rpx;
left: 0px;
z-index: 2;
background: #fff;
padding: 20px 12.5px 0px 12.5px;
box-shadow: 0px 0px 2px 2px rgba(0, 0, 0, 0.05);
&.new{
width: 16vw;
padding: 10px 12.5px 10px 12.5px;
}
.type_item{
color: #E33837;
font-size: 14px;
line-height: 34px;
}
.goods_item{
width: 107px;
height: 54px;
border: 1px solid #FAAB0E;
border-radius: 10px;
margin-bottom: 20px;
color: #FAAB0E;
font-size: 14px;
line-height: 54px;
text-align: center;
}
}
.goods-item{
height: 88px;
// padding: 10px 13px;
padding: 10px 0px;
color: #999;
font-size: 14px;
>view{
height: 88px;
}
image{
width: 138px;
height: 88px;
border-radius: 10px;
}
img{
width: 138px;
height: 88px;
border-radius: 10px;
}
.goods-info{
display: flex;
flex-direction: column;
// justify-content: space-between;
margin: 0px 5px;
flex: 1;
}
.goods-btn{
width: 50px;
height: 30px;
background-color: #e33838;
border-radius: 5px;
font-size: 11px;
color: #fff;
line-height: 30px;
text-align: center;
}
}
.list_area{
font-size: 14px;
.list_title{
font-size: 16px;
color: #101010;
font-weight: bold;
height: 30px;
}
.t-h{
color: #cecece;
height: 30px;
}
.t-d{
color: #999;
height: 30px;
}
.red{
color: #e50000;
}
.black{
color: #101010;
}
}
}
.home_2{
padding: 20px 7.5px;
.title{
display: flex;
align-items: center;
font-size: 18px;
color: #101010;
font-weight: bold;
}
.card{
width: 670rpx;
height: 160rpx;
border-radius: 10px;
background-image: linear-gradient(to right, #B2E6FF, #57ACFF);
margin: 10px auto 20px;
color: #fff;
font-size: 12px;
box-sizing: border-box;
padding: 30rpx 20rpx;
.t2{
font-size: 20px;
font-weight: bold;
margin-top: 20rpx;
}
}
.pie_area{
display: flex;
position: relative;
.pie_box{
width: 332rpx;height: 332rpx;
margin: 0px 20rpx 20rpx -20rpx;
box-sizing: border-box;
border: 10px solid #fff;
}
.sum{
position: absolute;top:0px;left:0px;
width: 332rpx;height: 332rpx;
line-height: 332rpx;
margin: 0px 20rpx 20rpx -20rpx;
text-align: center;
font-size: 18px;
font-weight: bold;
}
.right{
padding-top: 40rpx;
}
.right1{
width: 304rpx;
height: 86rpx;
border-radius: 5px;
background-color: #fafaff;
display: flex;
justify-content: space-between;
align-items: center;
padding: 10rpx 20rpx;
margin-bottom: 20rpx;
font-size: 14px;
}
.label{
padding-left: 20px;
position: relative;
margin-bottom: 3px;
}
.right1:nth-of-type(1) .label::before{
content: '';
display: inline-block;
width: 24rpx;height: 24rpx;
border-radius: 2px;
background-color: #22c18b;
position: absolute;
top: 3px;
left: 0px;
}
.right1:nth-of-type(2) .label::before{
content: '';
display: inline-block;
width: 24rpx;height: 24rpx;
border-radius: 2px;
background-color: #678CFD;
position: absolute;
top: 3px;
left: 0px;
}
}
.chart_tab{
width: 380rpx;
height: 160rpx;
border-radius: 10px;
text-align: center;
background-color: #fafaff;
display: flex;
align-items: center;
justify-content: space-around;
margin-top: 20rpx;
margin-bottom: 30rpx;
.item{
width: 160rpx;
height: 120rpx;
text-align: center;
line-height: 120rpx;
color: #101010;
font-size: 14px;
background-color: #fff;
border-radius: 10px;
}
.item.active{
color: #678CFD;
font-weight: bold;
}
}
.chart_area{
}
}
</style>