From 53dc2bac460d2ff210aa9523717753ae1fd2c159 Mon Sep 17 00:00:00 2001 From: Liuyi <candymxq888@outlook.com> Date: 星期二, 26 十一月 2024 17:27:44 +0800 Subject: [PATCH] 添加运维端首页 --- pages/index/index.vue | 637 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 491 insertions(+), 146 deletions(-) diff --git a/pages/index/index.vue b/pages/index/index.vue index 81f9166..53f59f5 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -1,7 +1,8 @@ <script setup> import { onMounted, ref } from "vue"; - import { getVipInfoApi,getUserInfo } from '../../api/index.js' - import { onShow } from '@dcloudio/uni-app' + import { BASE_URL } from '../../config/baseUrl'; + import { getVipInfoApi,getUserInfo,reportLossApi,removeCardApi,buyWaterApi } from '../../api/index.js' + import { onShow,getCurrentPages } from '@dcloudio/uni-app' //状态栏高度 const topHeight = ref(0) function getTopHeight(){ @@ -14,56 +15,89 @@ * 会员卡相关 */ const cardInfo = ref({ - userName:'', + id:'', + userName:'微信用户', headImg:'', + userPhone:'', + integral:'', waterCardNumber:'', balance:'', count:'', - userPhone:'', + state:'',//state:true:挂失,false:正常 + cardType:'',//卡类型01卡消费 02计次消费 03游客消费 04电子卡 + userCardType:'',//userCardType:true:共享卡,false:正常卡 }) + // const showHeadImg = ref(BASE_URL + '/upload' + cardInfo.value.headImg) + const isLoss = ref(false) const isVip = ref(false) + const isShareCard = ref(false) //获取会员卡信息 - async function getInfo(){ - let res = await getUserInfo() - console.log('res',res.data) - cardInfo.value.userName = res.data.userInfo.userName - cardInfo.value.headImg = res.data.userInfo.headImg - cardInfo.value.userPhone = res.data.userInfo.userPhone - if(res.data.userInfo.waterCardNumber){ - let res1 = await getVipInfoApi() - cardInfo.value.waterCardNumber = res1.data.cardNumber - if(res1.data.cardType == 1){ - cardInfo.value.balance = res1.data.balance - }else if(res1.data.cardType == 2){ - cardInfo.value.count = res1.data.count + async function getVipInfo(){ + await getVipInfoApi().then((res) =>{ + if(res.code == 200 && res.data.id){ + console.log('获取会员卡返回响应-首页',res) + cardInfo.value.waterCardNumber = res.data.cardNumber + cardInfo.value.cardType = res.data.cardType + //用户信息处理存储 + cardInfo.value.state = res.data.state == 2 ? true : false//state:2:挂失,1:正常 是否挂失 + cardInfo.value.userCardType = res.data.userCardType == 2 ? true : false //userCardType:2:共享卡,1:正常卡 + + isLoss.value = cardInfo.value.state + isShareCard.value = cardInfo.value.userCardType + if(res.data.cardType == 1){ + cardInfo.value.balance = res.data.balance + }else if(res.data.cardType == 2){ + cardInfo.value.count = res.data.count + } + isVip.value = true + console.log('cardInfo',cardInfo.value,'isShareCard.value',isShareCard.value) } - isVip.value = true - }else{ - isVip.value = false - } - uni.setStorageSync('userInfo',JSON.stringify(cardInfo.value)) + }) + } + //获取用户信息 + async function getInfo(){ + await getUserInfo().then(async(res) =>{ + if(res.code == 200){ + cardInfo.value.userName = res.data.userInfo.userName ? res.data.userInfo.userName : cardInfo.value.userName + cardInfo.value.headImg = res.data.userInfo.headImg + cardInfo.value.integral = res.data.userInfo.integral + // showHeadImg.value = BASE_URL + '/upload' + cardInfo.value.headImg + cardInfo.value.userPhone = res.data.userInfo.userPhone + cardInfo.value.id = res.data.userInfo.id + await getVipInfo() + console.log('00000',cardInfo.value) + uni.setStorageSync('userInfo',JSON.stringify(cardInfo.value)) + } + }) } /** * 扫码取水相关 */ function toScan(){ - uni.navigateTo({ - url:'/pages/scanWater/index' - }) + //调用二维码扫描接口 + uni.scanCode({ + scanType: ['qrCode'], + success: async function (res) { + console.log('条码内容:' + res.result); + uni.navigateTo({ + url:`/pages/scanWater/index?facilityCode=${res.result}` + }) + } + }); } /** * 功能列表相关 */ const functionList = ref([ - {text:'余额记录',icon:'../../static/images/index/icon31.png',url:'/pages/balanceRecord/index'}, - {text:'消费记录',icon:'../../static/images/index/icon32.png',url:''}, - {text:'充值记录',icon:'../../static/images/index/icon33.png',url:''}, - {text:'账户共享',icon:'../../static/images/index/icon34.png',url:''}, - {text:'优惠卷',icon:'../../static/images/index/icon35.png',url:''}, - {text:'电子发票',icon:'../../static/images/index/icon36.png',url:''}, - {text:'联系客服',icon:'../../static/images/index/icon37.png',url:''}, - {text:'推广分佣',icon:'../../static/images/index/icon38.png',url:''}, + {text:'余额记录',icon:'../../static/images/index/icon31.png',bgColor:'#16b387',url:'/pages/functionList/balanceRecord/index',isUrl:1}, + {text:'消费记录',icon:'../../static/images/index/icon32.png',bgColor:'#329ae8',url:'/pages/functionList/paymentRecord/index',isUrl:1}, + {text:'充值记录',icon:'../../static/images/index/icon33.png',bgColor:'#f0a50e',url:'/pages/functionList/rechargeRecord/index',isUrl:1}, + {text:'水卡共享',icon:'../../static/images/index/icon34.png',bgColor:'#55ca8c',url:'/pages/functionList/share/cardShare/index',isUrl:1}, + {text:'故障上报',icon:'../../static/images/index/icon35.png',bgColor:'#a88ff1',url:'/pages/infoBreakdown/index',isUrl:1}, + {text:'优惠卷',icon:'../../static/images/index/icon36.png',bgColor:'#18bfc4',url:'',isUrl:4}, + {text:'会员卡挂失',icon:'../../static/images/index/icon37.png',bgColor:'#4875f0',url:'',isUrl:2}, + {text:'会员卡解绑',icon:'../../static/images/index/icon38.png',bgColor:'#f45088',url:'',isUrl:3}, ]) function navTo(itemUrl){ if(itemUrl){ @@ -72,78 +106,247 @@ }) } } - //获取用户地理位置 - async function getUserLocation(){ - wx.getLocation({ - type: 'wgs84', - success(res){ - const latitude = res.latitude - const longitude = res.longitude - const speed = res.speed - const accuracy = res.accuracy - }, - fail(e){ - console.log('e',e) + //功能列表点击功能 + async function setEvent(isUrl,url){ + if(isUrl == 1){ + navTo(url) + }else if(isUrl == 2){ + if(cardInfo.value.waterCardNumber){ + //不是共享卡且未挂失 + if(!isShareCard.value && !cardInfo.value.state){ + uni.showModal({ + title: '会员卡挂失', + content: '确认挂失会员卡?', + success: async function(res) { + if (res.confirm) { + await reportLossApi(cardInfo.value.waterCardNumber).then(async(res) =>{ + if(res.code == 200){ + uni.showToast({ + title: '已挂失', + duration: 2000, + }); + await getVipInfoApi().then((res) =>{ + if(res.code == 200){ + if(res.data.state == 2){ + isLoss.value = true + } + } + }) + } + }) + } + } + }) + }else if(isShareCard.value){ + uni.showToast({ + title:'共享卡无权限', + icon:'none' + }) + }else if(cardInfo.value.state){ + uni.showToast({ + title:'已挂失', + icon:'none' + }) + } + }else{ + uni.showToast({ + title:'未绑定会员卡!', + icon:'none' + }) } + }else if(isUrl == 3){ + if(cardInfo.value.waterCardNumber){ + if(!isShareCard.value){ + uni.showModal({ + title: '会员卡注销', + content: '确认注销会员卡?', + success: async function(res) { + if (res.confirm) { + await removeCardApi(cardInfo.value.waterCardNumber).then(async(res) =>{ + if(res.code == 200){ + uni.showToast({ + title: '已注销', + duration: 2000, + icon:'none', + }); + await getVipInfoApi().then((res) =>{ + if(res.code == 200){ + if(!res.data.id){ + isVip.value = false + cardInfo.value.balance = '' + cardInfo.value.count = '' + cardInfo.value.waterCardNumber = '' + uni.setStorageSync('userInfo',JSON.stringify(cardInfo.value)) + } + } + }) + } + }) + } + } + }) + }else{ + uni.showToast({ + title:'共享卡无权限', + icon:'none' + }) + } + }else{ + uni.showToast({ + title:'未绑定会员卡!', + icon:'none' + }) + } + }else{ + upGrade() + } + } + function upGrade(){ + uni.showToast({ + title: '该功能正在升级中!', + duration: 1000, + icon:'none', + }); + } + //申请获取用户位置权限---------------------------------------------------- + let userLocation = { + lat:'', + lon:'', + } + function getUserLocation(){ + // 请求用户授权,第一次进入首页会有位置授权的提示 + uni.authorize({ + scope: 'scope.userLocation', + success() { + console.log("成功授权位置信息1") + storageLocation() + }, + fail() { + console.log("用户拒绝授权位置信息,再次提示用户授权") + showToast() + } }) - console.log('location') + //获取用户位置并存储 + function storageLocation(){ + uni.getLocation({ + type:'gcj02', + isHighAccuracy:true, + success:(res) =>{ + userLocation.lat = res.latitude + userLocation.lon = res.longitude + uni.setStorageSync('userLocation',JSON.stringify(userLocation)) + }, + fail:() =>{ + showToast() + } + }) + } + //用户拒绝授权 + function showToast(){ + uni.showModal({ + title: "请求授权当前位置", + content: "请求获取您的位置,加载附近饮水设备信息!", + confirmText: "前往设置", + success: (res) => { + if (res.confirm) { + uni.openSetting({ + success:(res1) =>{ //打开设置成功 + if (res1.authSetting['scope.userLocation']){ + console.log('用户二次授权成功') + setTimeout(() =>{ + storageLocation() + },1000) + }else{ + showToast() + console.log('用户拒绝授权') + } + }, + }) + }else{ + uni.showToast({ + title: '请先授权!', + duration: 2000, + icon:'none' + }); + showToast() + } + }, + }); + } } onMounted( async() =>{ getTopHeight() await getInfo() - // await getUserLocation() + await getUserLocation() + console.log('进入首页了') }) onShow(async() =>{ - await getInfo() + getTopHeight() + await getInfo() }) + uni.showShareMenu({ + withShareTicket: true, + menus: ['shareAppMessage', 'shareTimeline'], + success: function () { + console.log('分享菜单显示成功'); + }, + fail: function (err) { + console.error('分享菜单显示失败', err); + } + }); </script> <template> <view class="container"> <view class="content"> <view class="card-box" :style="{paddingTop:topHeight + 'rpx'}"> - <view class="user-info" @click="navTo('/pages/userInfo/index')"> - <image class="user-img" src='../../static/images/index/hend1.png' alt=''></image> - <text>{{cardInfo.userName}}</text> - <image class="user-more"src="../../static/images/index/back.png"></image> + <view class="user-info" > + <image v-if="cardInfo.headImg" class="user-img" :src= "BASE_URL + '/upload' + cardInfo.headImg" alt=''></image> + <image v-else class="user-img" src='../../static/images/index/head.png' alt=''></image> + <text @click="navTo('/pages/userInfo/index')">{{cardInfo.userName}}</text> + <image @click="navTo('/pages/userInfo/index')" class="user-more"src="../../static/images/index/back.png"></image> + <!-- <view class="user-add-card" @click="navTo('/pages/addCard/index')"> + <image src='../../static/images/index/vip-add.png' alt=''></image> + <text>添加会员卡</text> + </view> --> </view> <view class="card"> - <view class="card-content"> + <image class="card-bg" src="../../static/images/index/card11.png" alt=""></image> + <view v-if="isShareCard" class="share-card">共享卡号:{{cardInfo.waterCardNumber}}</view> + <view v-if="!isShareCard" class="card-content"> <view class="card-left"> <view class="left-top"> <view> - <image src="../../static/images/index/code1.png" alt=""></image> - <text>会员卡</text> + <image v-if="isVip" src="../../static/images/index/code1.png" alt=""></image> + <text v-if="isVip">会员卡 </text> + <text v-if="!isVip">未绑定 </text> + <text class="lossed" v-if="isLoss && isVip"> [已挂失]</text> </view> - <view>ID:{{cardInfo.waterCardNumber}}</view> + <view v-if="isVip">ID:{{cardInfo.waterCardNumber}}</view> </view> - <view class="left-bottom">电话:{{cardInfo.userPhone}}</view> </view> <view class="card-right"> - <view>金额卡</view> - <view> - <span>余额:</span> - <span class="card-balance">{{cardInfo.balance}}</span> - <span>元</span> + <view class="card-right-top"> + <text v-if="isVip">金额卡</text> + <text v-if="isVip">{{cardInfo.balance}}元</text> + <view v-if="!isVip" class="user-add-card" @click="navTo('/pages/addCard/index')"> + <image src='../../static/images/index/vip-add.png' alt=''></image> + <text>添加会员卡</text> + </view> </view> + <view v-if="isVip" class="card-right-bottom" @click="navTo('/pages/recharge/index')">充值</view> </view> </view> </view> </view> <view class="function-box1"> - <view class="box1-bg box1-one" @click="navTo('/pages/sendWater/index')"> + <view class="box1-bg box1-one" @click="upGrade"> <image src="../../static/images/index/home21.png" alt=""></image> <view>送水到家</view> </view> - <view class="box1-bg box1-two"> - <view>账户余额(元)</view> - <view class="recharge"> - <text>¥</text> - <text>120.00</text> - </view> - <view @click="navTo('/pages/recharge/index')"> - 充值 - </view> + <view @click="navTo('/pages/facilityList/index')" class="box1-bg box1-two"> + <image src="../../static/images/index/icon22.png" alt=""></image> + <view>附近设备</view> </view> <view class="box1-bg box1-three" @click="toScan()"> <image src="../../static/images/index/icon23.png" alt=""></image> @@ -154,29 +357,44 @@ <view class="box2-title"><text>功能列表</text></view> <view class="box2-content"> <block v-for="(item,index) in functionList" :key="index"> - <view class="box2-item" @click="navTo(item.url)"> - <image :src= "item.icon" alt=""></image> + <view class="box2-item" @click="setEvent(item.isUrl,item.url)"> + <view class="box2-item-img" :style="{background:item.bgColor}"><image :src= "item.icon" alt=""></image></view> <view class="box2-item-text">{{item.text}}</view> </view> </block> </view> </view> - <view class="advertisement-box"><image src="../../static/images/index/bg4.png" alt=""></image></view> + <!-- 积分商城 --> + <view class="advertisement-box" @click="navTo('/pagesPoints/pointsMall/index')"> + <view class="point-advert"> + <view class="advert-image"> + <image class="image-icon3" src="../../static/images/index/advert-icon3.svg"></image> + <image class="image-icon1" src="../../static/images/index/advert-icon1.svg"></image> + <image class="image-icon2" src="../../static/images/index/advert-icon2.svg"></image> + <image class="image-icon4" src="../../static/images/index/advert-icon4.svg"></image> + </view> + <view class="advert-title"> + <view class="advert-title1">积分商城</view> + <view class="advert-title2"><text>点击进入</text></view> + </view> + </view> + </view> <view class="service-box"> <view class="service-title"><text>服务指南</text></view> <view class="service-content"> - <view class="service-bg"> + <view class="service-bg" @click="navTo('/pages/station/index')"> <view> <image src="../../static/images/index/icon51.png" alt=""></image> <text>附近站点</text> </view> - <view class="service-info">蔡家供水服务中心正在营业中……</view> + <view class="service-info">服务中心正在营业中……</view> <view> <text>查看更多</text> <image src="../../static/images/index/more-info5.png" alt=""></image> </view> </view> - <view class="service-bg"> + <view class="service-bg" @click="upGrade"> + <!-- <view class="service-bg" @click="navTo('/pages/counterRecharge/index')"> --> <view> <image src="../../static/images/index/notice5.png" alt=""></image> <text>公示公告</text> @@ -190,24 +408,6 @@ </view> </view> </view> - - <!-- 微信授权弹窗 --> - <!-- <uni-popup ref="popupRef" background-color="#fff"> - <view class="popup-content"> - <text class="popup-title">微信登录</text> - <view class="hr"></view> - <view class="img-box"><img src="../../static/images/login/logo.png" alt="" class="img"/></view> - <view class="info-box"> - <view class="info-text1">青源直饮水平台申请获取以下权限:</view> - <view class="hr2"></view> - <view class="info-text2">· 获得你的公开信息(昵称、头像、地区及性别)</view> - <view class="button-box"> - <button class="button1" @click="popupRef.close('bottom')">取消</button> - <button class="button2" @click="wxLoginFn()">确定</button> - </view> - </view> - </view> - </uni-popup> --> </view> </template> <style lang="scss" scoped> @@ -228,15 +428,15 @@ .user-info{ width:100%; height:100rpx; - // background: #06BF5E; - display: flex; align-items: center; padding-left:15rpx; box-sizing: border-box; margin-bottom: 14rpx; + display:flex; .user-img{ width:90rpx; height:90rpx; + border-radius:50%; margin-right:20rpx; } text{ @@ -251,9 +451,23 @@ .card{ width: 100%; height: 290rpx; - background-image: url("../../static/images/index/card1.png"); - background-repeat: no-repeat; - background-size: 100% 100%; + position:relative; + .card-bg{ + height:290rpx; + width:100%; + top:0; + position: absolute; + z-index:1; + } + .share-card{ + position:absolute; + top:16rpx; + left:28rpx; + z-index:100; + font-weight:400; + font-size: 36rpx; + color: #FFFFFF; + } .card-content{ width: 100%; height: 100%; @@ -264,12 +478,14 @@ font-weight: 300; font-size: 30rpx; color: #FFFFFF; + z-index:100; .card-left{ height:100%; display: flex; justify-content:space-between; flex-direction:column; align-items:flex-start; + z-index:100; .left-top{ display: flex; flex-direction: column; @@ -277,17 +493,22 @@ display: flex; align-items: center; image{ - width:70rpx; - height:70rpx; + width:48rpx; + height:48rpx; } text{ - font-weight: 300; + font-weight:400; font-size: 36rpx; color: #FFFFFF; + } + .lossed{ + color:#fff; } } view:last-child{ margin-left:10rpx; + font-size: 26rpx; + font-weight:500; } } } @@ -297,8 +518,44 @@ align-items:flex-end; flex-direction: column; height:100%; - .card-balance{ - font-weight:600; + z-index:100; + .card-right-top{ + align-items:flex-end; + display: flex; + justify-content: space-between; + flex-direction: column; + font-size:34rpx; + .user-add-card{ + display:flex; + align-items:center; + height:52rpx; + font-size:28rpx; + background:linear-gradient(to right,#B1D9FD 0%,#65A7FD 70%,#65A7FD 100%); + border-radius:50rpx; + padding: 0 20rpx; + image{ + width:36rpx; + height:36rpx; + margin-right:6rpx; + opacity:0.8; + } + text{ + color:#FFF; + } + } + text:last-child{ + font-weight:500; + } + } + .card-right-bottom{ + width:137rpx; + height:56rpx; + background:linear-gradient(to right,#65A7FD ,#B1D9FD); + border-radius:50rpx; + text-align: center; + line-height: 56rpx; + color:#212DDE; + font-weight: 400; } } } @@ -336,45 +593,51 @@ } } .box1-two{ - box-sizing: border-box; - padding:25rpx 0 10rpx; + font-weight: 300; + font-size: 32rpx; + color: #000000; display: flex; flex-direction:column; align-items:center; - justify-content:space-around; - view:first-child{ - font-weight: 300; - font-size: 24rpx; - color: #464646; - text-align: center; - margin-bottom:10rpx; + justify-content:space-evenly; + image{ + width:96rpx; + height: 96rpx; + // margin-bottom:20rpx; } - .recharge{ - text:first-child{ - font-weight: 500; - font-size: 32rpx; - color: #000; - } - text:last-child{ - font-weight: 300; - font-size: 32rpx; - color: #2269E5; - } - } - view:last-child{ - width: 140rpx; - height: 80rpx; - font-weight:300; - font-size: 24rpx; - color: #000141; - background-image: url('../../static/images/index/icon22.png'); - background-repeat: no-repeat; - background-position: center; - background-size: 100% 100%; - text-align:center; - line-height:80rpx; - margin-top:10rpx; - } + // view:first-child{ + // font-weight: 300; + // font-size: 24rpx; + // color: #464646; + // text-align: center; + // margin-bottom:10rpx; + // } + // .recharge{ + // text:first-child{ + // font-weight: 500; + // font-size: 32rpx; + // color: #000; + // } + // text:last-child{ + // font-weight: 300; + // font-size: 32rpx; + // color: #2269E5; + // } + // } + // view:last-child{ + // width: 140rpx; + // height: 70rpx; + // font-weight:300; + // font-size: 24rpx; + // color: #000141; + // background-image: url('../../static/images/index/icon22.png'); + // background-repeat: no-repeat; + // background-position: center; + // background-size: 100% 100%; + // text-align:center; + // line-height:70rpx; + // margin-top:10rpx; + // } } .box1-three{ font-weight: 300; @@ -426,9 +689,18 @@ flex-direction:column; justify-content:space-between; align-items: center; - image{ + .box2-item-img{ width: 90rpx; height:90rpx; + display: flex; + justify-content: center; + align-items: center; + // background: #65A7FD; + border-radius:50%; + image{ + width: 48rpx; + height:48rpx; + } } .box2-item-text{ width:100%; @@ -443,13 +715,86 @@ } .advertisement-box{ width:100%; - height: 188rpx; + height: 160rpx; padding:0 32rpx 10rpx; box-sizing: border-box; - image{ - width:100%; - height: 178rpx; + display: flex; + justify-content: space-around; + .point-advert{ + width:640rpx; + height:136rpx; + border-radius:10rpx; + background:linear-gradient(140deg,#5c9dff 0%,#b5dcff 30%,#52aafc 70%,#b5dcff 90%,#5daffc 100%); + display: flex; + justify-content: space-around; + align-items: center; + box-shadow: 0 0 4rpx 2rpx #4978de; + .advert-title{ + display: flex; + flex-direction: column; + align-items: center; + color: #fff; + font-size:46rpx; + font-weight:800; + text-shadow:4rpx 2rpx #5EA1FA; + .advert-title2{ + margin-top:10rpx; + font-size:28rpx; + font-weight:500; + width:180rpx; + height:40rpx; + background: #5c9dff; + display: flex; + align-items: center; + justify-content: center; + border-radius:30rpx; + letter-spacing:2rpx; + } + } + .advert-image{ + width:200rpx; + height:100%; + // background: #76bfa1; + position: relative; + .image-icon1{ + position:absolute; + left: calc(50% - 65rpx); + top: calc(50% - 65rpx); + width:130rpx; + height:130rpx; + transform: rotate(20deg); + } + .image-icon2{ + position:absolute; + left:60%; + top: calc(50% - 30rpx); + width:90rpx; + height:90rpx; + transform: rotate(-10deg); + } + .image-icon3{ + position:absolute; + left: calc(50% - 100rpx); + top: 30%; + width:80rpx; + height:80rpx; + transform: rotate(-10deg); + } + .image-icon4{ + position:absolute; + left:140%; + top: 60%; + width:50rpx; + height:50rpx; + transform: rotate(5deg); + } + } } + // image{ + // width:320rpx; + // height:136rpx; + // border-radius:10rpx; + // } } .service-box{ width: 100%; -- Gitblit v1.9.3