Files
lucky_shop/pages_tool/member/signin.vue

569 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<page-meta :page-style="themeColor"></page-meta>
<view class="signin">
<block v-if="signState">
<!-- #ifdef H5 -->
<view class="head-nav color-base-bg"></view>
<!-- #endif -->
<view class="sigin-box">
<view class="sigin-bg"></view>
<view class="signin-wrap">
<view class="member-info">
<view class="headimg">
<view class="headimg-img">
<image :src="headimg ? $util.img(headimg) : $util.getDefaultImage().head" mode="aspectFill" @error="headimg = $util.getDefaultImage().head"/>
</view>
<view class="signin-info">
<view>
已连续签到
<text>{{ signDaysSeries }}</text>
</view>
<view>{{ hasSign ? '明日' : '今日' }}签到可获得{{ pointTomorrow }}积分</view>
</view>
</view>
<view class="point-box" @click="sign()">
<image :src="$util.img(hasSign == 1 ? 'public/uniapp/signin/sign-btn-res.png' : 'public/uniapp/signin/sign-btn.png')" mode="widthFix"/>
</view>
</view>
<view class="signin-days-wrap">
<view class="signin-desc">连续签到领好礼</view>
<view class="signin-day-list">
<view class="signin-day-con">
<view class="signin-day-scroll">
<block v-for="(item, index) in showSignDays">
<view v-if="!item.is_last" :id="'id_' + item.day" class="signin-day-item"
:class="{
signed: item.day < signDaysSeries || (item.day == signDaysSeries && hasSign == 0) || (item.day == signDaysSeries && hasSign == 1)
}">
<view class="day">{{ item.day }}</view>
<image :src="$util.img('public/uniapp/signin/sign-icon.png')"></image>
<view class="point">{{ item.point }}积分</view>
</view>
<view v-else :id="'id_' + item.day" class="signin-day-item last" :class="{
signed: item.day < signDaysSeries || (item.day == signDaysSeries && hasSign == 0) || (item.day == signDaysSeries && hasSign == 1)
}">
<view>
<view class="day">{{ item.day }}</view>
<view class="point">{{ item.point }}积分</view>
</view>
<image :src="$util.img('public/uniapp/signin/sign-box.png')" mode="widthFix"/>
</view>
</block>
</view>
</view>
</view>
</view>
<view class="my-signin">
<view class="my-signin-title">我的签到</view>
<view class="my-signin-con">
<view class="my-signin-item">
<image :src="$util.img('public/uniapp/signin/sign-bg-yellow.png')"></image>
<view class="my-signin-item-num">积分{{ signPoint }}</view>
<view>累计获得积分</view>
</view>
<view class="my-signin-item">
<image :src="$util.img('public/uniapp/signin/sign-bg-pink.png')"></image>
<view class="my-signin-item-num">成长值{{ signGrowth }}</view>
<view>累计获得成长值</view>
</view>
</view>
</view>
<view class="signin-rule" v-if="rule && rule.length">
<view class="signin-rule-title">签到规则</view>
<view class="signin-rule-con">
<view class="rule-item" v-for="(item, index) in rule" :key="index">
<block v-if="index == 0">1. 每日签到奖励</block>
<block v-else>{{ index + 1 + '. 连续签到' + item.day + '天额外奖励' }}</block>
<text v-if="item.point">{{ item.point + '积分 ' }}</text>
<text v-if="item.growth">{{ item.growth + '成长值' }}</text>
</view>
<view class="rule-item">
{{ rule.length + 1 }}.连续签到{{ cycle }}天为一个周期连续签到天数签满一个周期或者签到中断将清空连签天数重新计算签到天数
</view>
<view class="rule-item">
{{ rule.length + 2 }}. 用户可在签到页每日签到一次签到后可获得每日签到奖励连续签到天数达到连签奖励的当天可额外获得连签奖励
</view>
</view>
</view>
</view>
</view>
<view @touchmove.prevent.stop>
<uni-popup ref="uniPopup" type="center" class="wap-floating" :maskClick="false">
<view class="popup-box" @click="close()">
<text class="iconfont icon-close" @click="$refs.uniPopup.close()"></text>
<image class="pic" :src="$util.img('public/uniapp/signin/bg1.png')"></image>
<view class="popup-content">
<view class="popup-content-wrap">
<view class="title" v-if="successTip.point || successTip.growth">
<text>恭喜您获得</text>
<text v-if="successTip.point">
<text class="num color-base-text">{{ successTip.point }}</text>
积分
</text>
<text v-if="successTip.growth">
<text class="num color-base-text">{{ successTip.growth }}</text>
成长值
</text>
</view>
<view class="desc">连续签到可获得更多奖励</view>
</view>
<view class="other-info color-base-bg" @click="$refs.uniPopup.close()">知道了</view>
</view>
</view>
</uni-popup>
</view>
<!-- 悬浮按钮 -->
<hover-nav :need="true"></hover-nav>
</block>
<block v-else><ns-empty text="暂未开启签到奖励" subText="请到营销中心开启签到奖励" :isIndex="false"></ns-empty></block>
<loading-cover ref="loadingCover"></loading-cover>
<ns-login ref="login"></ns-login>
<!-- #ifdef MP-WEIXIN -->
<!-- 小程序隐私协议 -->
<privacy-popup ref="privacyPopup"></privacy-popup>
<!-- #endif -->
</view>
</template>
<script>
import uniCalender from '@/pages_tool/components/uni-calendar/uni-calendar.vue';
import uniPopup from '@/components/uni-popup/uni-popup.vue';
import signIn from './public/js/signin.js';
export default {
components: {
uniPopup,
uniCalender
},
mixins: [signIn]
};
</script>
<style lang="scss">
uni-page-body,
uni-page-refresh {
height: 100%;
}
.signin {
position: relative;
height: 100%;
.head-nav {
width: 100%;
height: var(--status-bar-height);
}
.head-nav.active {
padding-top: 40rpx;
}
.sigin-box {
position: relative;
}
.sigin-bg {
width: 100%;
position: absolute;
top: 0;
z-index: 1;
background: linear-gradient(136deg, #fe7849 0%, #ff1959 100%);
height: 500rpx;
border-radius: 0 0 100% 100%/0 0 20% 20%;
image {
width: 100%;
}
}
.signin-wrap {
padding: 0 30rpx;
}
.member-info {
position: relative;
z-index: 9;
padding: 74rpx 0 55rpx;
display: flex;
align-items: center;
justify-content: space-between;
.headimg {
display: flex;
align-items: center;
.headimg-img {
width: 100rpx;
height: 100rpx;
background: #fff;
border: 0px solid #fff;
border-radius: 50%;
overflow: hidden;
margin-right: 20rpx;
image {
width: 100%;
height: 100%;
}
}
.signin-info {
view {
color: #ffffff;
font-size: 24rpx;
line-height: 1;
&:first-child {
margin-bottom: 18rpx;
font-size: 32rpx;
font-weight: bold;
text {
margin: 0 9rpx;
}
}
}
}
}
.point-box {
display: flex;
align-items: center;
height: 68rpx;
padding: 13rpx 0 13rpx 0;
box-sizing: border-box;
image {
width: 160rpx;
height: 68rpx;
max-height: 80rpx;
margin-bottom: -6rpx;
}
.point {
margin-left: 14rpx;
font-size: $font-size-toolbar;
color: #ffffff;
}
}
}
.signin-days-wrap {
position: relative;
z-index: 9;
background-color: #ffffff;
border-radius: 18rpx;
padding: 30rpx 0 30rpx;
height: 468rpx;
.signin-desc {
font-size: 32rpx;
font-weight: bold;
line-height: 1;
padding: 0 30rpx;
}
.signin-day-list {
margin-top: 30rpx;
display: flex;
justify-content: space-between;
padding: 0 30rpx;
.signin-day-con {
width: 100%;
}
.signin-day-scroll {
display: flex;
flex-wrap: wrap;
width: 100%;
flex-direction: row;
white-space: nowrap;
line-height: 1;
.signin-day-item {
flex-shrink: 0;
background: #f5f6fa;
margin-right: 30rpx;
width: calc((100% - 90rpx) / 4);
height: 155rpx;
border-radius: 18rpx;
margin-bottom: 24rpx;
&:last-child {
margin-right: 0;
width: calc((100% - 30rpx) / 2);
}
&:nth-child(4n) {
margin-right: 0;
}
image {
width: 60rpx;
height: 60rpx;
margin-top: 10rpx;
}
&.signed {
background: linear-gradient(136deg, #fe7849 0%, #ff1959 100%);
view {
color: #ffffff;
}
}
&.last {
display: flex;
flex-direction: row;
>view {
width: 50%;
.point {
margin: 15rpx;
}
}
image {
width: 40%;
margin-top: 20rpx;
max-width: 130rpx;
}
}
}
.reward {
image {
width: 100%;
height: 100%;
margin-top: 0;
}
}
}
.signin-day-item {
display: inline-block;
width: 85rpx;
height: 103rpx;
border-radius: 4rpx;
text-align: center;
background-color: #f6f6fb;
flex-shrink: 0;
.day {
font-size: 24rpx;
line-height: 1;
margin-top: 18rpx;
font-weight: bold;
}
.point {
font-size: 20rpx;
line-height: 1;
margin-top: -4rpx;
color: #abb0c1;
}
image {
width: 100%;
height: 100%;
}
}
}
.signin-btn {
position: absolute;
width: 100%;
height: 80rpx;
bottom: 40rpx;
text-align: center;
button {
display: inline-block;
width: 442rpx;
height: 100%;
color: #ffffff;
background-color: #ff4544;
}
.btn-active {
color: $color-title;
background-color: #e1e1e1;
}
}
}
.my-signin {
padding: 30rpx;
margin-top: 30rpx;
background-color: #ffffff;
border-radius: 18rpx;
.my-signin-title {
font-size: 32rpx;
line-height: 1;
font-weight: bold;
}
.my-signin-con {
display: flex;
justify-content: space-between;
margin-top: 30rpx;
}
.my-signin-item {
width: 300rpx;
height: 155rpx;
position: relative;
image {
width: 300rpx;
height: 155rpx;
position: absolute;
top: 0;
left: 0;
}
.my-signin-item-num {
position: relative;
z-index: 9;
padding: 44rpx 28rpx 0;
line-height: $font-size-toolbar;
font-weight: bold;
}
view:last-child {
position: relative;
z-index: 9;
color: #abb0c1;
padding-left: 28rpx;
font-size: $font-size-activity-tag;
line-height: 1;
margin-top: 16rpx;
}
}
}
.signin-rule {
margin-top: 30rpx;
background-color: #ffffff;
border-radius: 18rpx;
padding: 30rpx;
.signin-rule-title {
display: flex;
align-items: center;
justify-content: flex-start;
line-height: $font-size-toolbar;
font-size: 32rpx;
font-weight: bold;
text-align: left;
}
.signin-rule-con {
margin-top: 30rpx;
padding: 0 0;
.rule-item {
font-size: 26rpx;
color: $color-sub;
}
}
}
}
.popup-box {
position: relative;
top: 0;
display: flex;
flex-direction: column;
align-items: center;
.icon-close {
width: 42rpx;
height: 42rpx;
border: 1px solid #fff;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
color: #fff;
position: absolute;
top: 70rpx;
right: 0;
}
.pic {
width: 274rpx;
height: 200rpx;
position: relative;
margin-bottom: -30rpx;
}
.popup-content {
background: #ffffff;
width: 70vw;
margin-top: -100rpx;
border-radius: 20rpx;
padding: 0 60rpx;
padding-bottom: 40rpx;
box-sizing: border-box;
background-size: 100% 100rpx;
}
.popup-content-wrap {
display: flex;
flex-direction: column;
align-items: center;
.title {
font-size: $font-size-base;
margin-top: 160rpx;
color: #999;
.num {
font-size: 32rpx;
}
}
.desc {
color: #999;
font-size: $font-size-tag;
}
}
.other-info {
width: 300rpx;
height: 70rpx;
border-radius: 10rpx;
margin: 0 auto;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
margin-top: 40rpx;
}
}
</style>
<style scoped>
.wap-floating>>>.uni-popup__wrapper.uni-custom .uni-popup__wrapper-box {
background: none !important;
display: flex !important;
flex-direction: column !important;
align-items: center !important;
}
</style>