jxg/jinxiangguo-home-master/components/popup-signin/popup-signin.vue

510 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view>
<touch-popup @close="close" ref="popup" background="transparent">
<view class="tabbar">
<view class="top-icon">
<view class="icon-item">
<image src="https://6a69-jinxiangguo-7g6kqddnb0a8aa47-1326817332.tcb.qcloud.la/img/touch-close-white.png" mode="heightFix"></image>
</view>
<view class="icon-item"></view>
</view>
<view class="top-left">
<view class="top-left-item" >
<view style="padding-top: 15px;">签到中心</view>
<view class="mybalance">
<text>我的橡果</text>
<text>{{user.amount}}</text>
</view>
</view>
</view>
<view class="top-right">
<view class="top-right-item">
<image src="https://6a69-jinxiangguo-7g6kqddnb0a8aa47-1326817332.tcb.qcloud.la/img/index/logo.png" mode="heightFix"></image>
<view class="sign-hint">
<view class="">
记得签到
</view>
</view>
</view>
</view>
</view>
<scroll-view class="list" scroll-y>
<!-- 签到 -->
<view class="pd-15">
<view class="bck-group">
<view class="sign-title">
<text>已连续签到{{signUser.continuity_days}}</text>
<text>再连续签到{{dayCount}}共获得{{dayAmount}}橡果</text>
</view>
<view class="sign-content">
<view class="sign-item" v-for="(item,index) in signConfig" key="sign">
<view class="sign-item-top">
<view style="flex: 1;padding: 2px;">
<view class="sign-item-icon" :class="{ 'sign-check': item.day <= signUser.continuity_days }">
<view>
<image style="width: 18px;" src="https://6a69-jinxiangguo-7g6kqddnb0a8aa47-1326817332.tcb.qcloud.la/img/game/signin/icon-松果.png" mode="widthFix"></image>
</view>
<view style="height: 12px;">
<image v-if="item.day <= signUser.continuity_days" style="width: 12px;" src="https://6a69-jinxiangguo-7g6kqddnb0a8aa47-1326817332.tcb.qcloud.la/img/game/signin/signin-ok.png" mode="widthFix"></image>
<text v-else style="font-size: 8px;">+{{item.number}}</text>
</view>
</view>
</view>
</view>
<view class="sign-item-bottom">
<view class="" style="display: flex;width: 100%;">
<view class="signline" :class="{ 'bck-black' : item.day > 1 && item.day <= signUser.continuity_days }"></view>
<view class="signcircle" :class="{ 'bck-black': item.day <= signUser.continuity_days }"></view>
<view class="signline":class="{ 'bck-black': item.day < signConfig.length && item.day <= signUser.continuity_days }"></view>
</view>
<view class="signtext">
<text v-if="item.day <= signUser.continuity_days">{{signUser.is_sign && item.day === signUser.continuity_days ? '今日': ''}}已签</text>
<text v-else>{{item.day}}天</text>
</view>
</view>
</view>
</view>
<view class="sign-btn">
<view class="sign-btn-item" @click="signDo">
<text>{{signUser.is_sign ? '今日已签到' : '签到领取橡果'}}</text>
</view>
</view>
</view>
</view>
<!-- 活动 -->
<view class="pd-15">
<view class="bck-group">
<view class="task-title">
今日活动
</view>
<view class="task-content">
<view class="task-item">
<view class="task-item-left">
<image style="width: 30px;" src="https://6a69-jinxiangguo-7g6kqddnb0a8aa47-1326817332.tcb.qcloud.la/img/game/signin/icon-星星.png" mode="widthFix"></image>
</view>
<view class="task-item-center">
<view class="">
橡果大转盘
</view>
<view>
今日首次免费
</view>
</view>
<view class="task-item-right">
<view class="task-btn" @click="openLottery">
<text>打开</text>
</view>
</view>
</view>
</view>
</view>
</view>
</scroll-view>
</touch-popup>
<popup-lottery ref="pLottery"></popup-lottery>
</view>
</template>
<script setup>
const app = getApp()
import { ref, defineExpose, getCurrentInstance, computed } from 'vue'
import touchPopup from '@/components/touch-popup/touch-popup'
const popup = ref() // ref组件
const pLottery = ref()
const {proxy} = getCurrentInstance()
const signConfig = ref([]) // 签到公共信息
const signUser = ref({}) // 用户的签到信息
const user = ref({}) // 用户信息,展示橡果数量
/* 计算属性 */
const dayCount = computed(() => {
return signConfig.value.length - signUser.value.continuity_days
})
const dayAmount = computed(() => {
let amount = 0
for (let i = signUser.value.continuity_days;i < signConfig.value.length;i++) {
amount += signConfig.value[i].number
}
return amount
})
/* 方法 */
const openLottery = () => {
pLottery.value.open()
}
const signDo = () => {
if (signUser.value.is_sign) {
uni.showToast({
title: '今日已签到~',
icon: 'none'
})
return
}
// 签到
uni.showLoading({
title: '正在签到'
})
uni.request({
url: app.globalData.requestUrl + '/api/user/sign',
header: {
'Authorization': 'Bearer ' + app.globalData.token
},
method: 'POST',
success: (res) => {
if (res.data.code === 200) {
// 更改本地余额
uni.request({
url: app.globalData.requestUrl + '/api/user',
header: {
'Authorization': 'Bearer ' + app.globalData.token
},
success: (res) => {
app.globalData.userinfo = res.data.data
getUserSignInfo(false) // 再次请求用户签到信息
},
complete() {
uni.hideLoading()
uni.showToast({
title: '签到成功',
icon: 'success'
})
}
})
} else {
uni.showToast({
title: res.data.msg,
icon: 'none'
})
}
}
})
}
const open = () => {
user.value = app.globalData.userinfo
if (JSON.stringify(signUser.value) !== '{}'){
popup.value.open()
return
}
uni.showLoading()
uni.request({
url: app.globalData.requestUrl + '/api/sign/config',
header: {
'Authorization': 'Bearer ' + app.globalData.token
},
success: (res) => {
console.log(res.data)
signConfig.value = res.data.data
getUserSignInfo()
},
fail() {
uni.showToast({
title: '获取签到信息失败',
icon: 'none'
})
},
complete() {
uni.hideLoading()
}
})
}
/**
* 请求用户签到信息
*/
const getUserSignInfo = (first = true) => {
uni.request({
url: app.globalData.requestUrl + '/api/user/sign/info',
header: {
'Authorization': 'Bearer ' + app.globalData.token
},
success(res2) {
console.log(res2.data)
if (!res2.data.data.hasOwnProperty('continuity_days')) {
res2.data.data.continuity_days = 0
res2.data.data.is_sign = false
res2.data.data.last_sign = '1970-01-01 03:00:00'
}
signUser.value = res2.data.data
},
complete() {
if (first) {
popup.value.open()
} else {
user.value = app.globalData.userinfo
}
}
})
}
const close = () => {
proxy.$emit('close')
}
defineExpose({
open
}) // 暴露方法
</script>
<style scoped>
.signtext {
padding-top: 5px;
font-family: Noto Sans S Chinese;
font-size: 8px;
font-weight: 400;
line-height: 12px;
color: #717171;
}
.mybalance text:first-child {
font-family: Noto Sans S Chinese;
font-size: 12px;
font-weight: 400;
line-height: 18px;
}
.mybalance text:last-child {
font-family: Noto Sans S Chinese;
font-size: 26px;
font-weight: 700;
line-height: 39px;
margin-left: 5px;
}
.task-btn {
border: 1px solid #70EB3D;
border-radius: 6px;
font-size: 14px;
font-weight: 700;
padding: 5px 15px;
display: flex;
align-items: center;
justify-content: center;
}
.task-item-right {
display: flex;
align-items: center;
}
.task-item-center view:first-child {
font-size: 14px;
font-weight: bold;
}
.task-item-center view:last-child {
font-size: 12px;
color: #717171;
}
.task-item-center {
flex: 1;
display: flex;
flex-direction: column;
padding: 2px 5px;
}
.task-item-left {
display: flex;
align-items: center;
padding-left: 5px;
}
.task-item {
display: flex;
padding: 10px 0;
}
.task-content {
display: flex;
flex-direction: column;
}
.task-title {
display: flex;
font-weight: 700;
}
.sign-btn {
display: flex;
align-items: center;
padding: 5px;
justify-content: center;
}
.sign-btn-item text {
background: linear-gradient(90deg, #BFFF90 0%, #26FFB3 100%);
color: transparent;
-webkit-background-clip: text;
font-family: Noto Sans S Chinese;
font-size: 14px;
font-weight: 700;
line-height: 21px;
}
.sign-btn-item {
background-color: #000;
width: 200px;
border-radius: 20px;
height: 44px;
display: flex;
align-items: center;
justify-content: center;
}
.bck-black {
background-color: #000 !important;
}
.bck-white {
background-color: #FFF !important;
}
.signline {
flex: 1;
height: 3px;
width: 100%;
background-color: transparent;
}
.signcircle {
height: 7px;
width: 7px;
border-radius: 3px;
background-color: transparent;
}
.sign-item-bottom {
flex-direction: column;
width: 100%;
padding-top: 2px;
}
.sign-check {
border: 2px solid #70EB3D !important;
}
.sign-item-icon {
padding: 4px 7px;
flex-direction: column;
border-radius: 6px;
border: 2px solid transparent;
box-sizing: border-box;
background-color: #fff;
}
.sign-item-top {
flex: 1;
display: flex;
}
.sign-content {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
padding: 10px 0;
}
.sign-item {
display: flex;
flex-direction: column;
}
.sign-item view {
display: flex;
align-items: center;
justify-content: center;
}
.sign-title {
display: flex;
flex-direction: column;
}
.sign-title text:first-child {
font-family: Noto Sans S Chinese;
font-size: 12px;
font-weight: 700;
line-height: 18px;
}
.sign-title text:last-child {
font-family: Noto Sans S Chinese;
font-size: 9px;
font-weight: 400;
line-height: 13.5px;
color: #717171;
}
.bck-group {
background: #F5F5F5CC;
border-radius: 15px;
padding: 10px;
}
.pd-15 {
padding: 8px 15px;
}
.list {
background: linear-gradient(#acf393, #11ffb7);
height: calc(100% - 66px);
position: absolute;
z-index: 2;
}
.list .item {
background: #F5F5F5CC;
border-radius: 15px;
display: flex;
padding: 25px 15px;
margin: 15px;
flex-direction: column;
}
.tabbar {
display: flex;
}
.top-left {
flex: 1;
background-color: #fff;
}
.top-right {
flex: 1;
background: linear-gradient(#c1fe8e, #acf393); /* 绿色 */
}
.top-left-item, .top-right-item {
flex: 1;
display: flex;
padding: 0 15px;
height: 78px;
}
.top-left-item {
flex-direction: column;
border-top-right-radius: 15px;
background: linear-gradient(#c1fe8e, #acf393); /* 绿色 */
font-family: Noto Sans S Chinese;
font-size: 18px;
font-weight: 700;
line-height: 27px;
}
.top-right-item {
background-color: #fff;
justify-content: center;
border-bottom-left-radius: 15px;
}
.top-right-item image {
height: 150px;
width: auto;
position: absolute;
z-index: 1;
top: -55px;
}
.sign-hint {
position: absolute;
top: -60px;
width: 325rpx;
font-size: 14px;
font-weight: bold;
}
.sign-hint view {
width: 100px;
display: flex;
margin-left: -50px;
align-items: center;
justify-content: center;
background-color: #fff;
border-radius: 16px;
height: 48px;
}
.top-icon {
display: flex;
align-items: center;
position: absolute;
width: 100%;
padding: 6px 0;
}
.top-icon image {
height: 6px;
}
.icon-item {
display: flex;
align-items: center;
justify-content: center;
flex: 1;
}
</style>