初始化代码
This commit is contained in:
424
uniapp/uni-app/shop/pages/sign.vue
Normal file
424
uniapp/uni-app/shop/pages/sign.vue
Normal file
@@ -0,0 +1,424 @@
|
||||
<template>
|
||||
<view class="pages-mine" v-if="detail.id">
|
||||
<uni-nav-bar :fixed="true" :shadow="false" :statusBar="true" color="#fff"
|
||||
:backgroundColor="color == '#ffffff' ?``:primaryColor" leftIcon="icon-left" title="签到">
|
||||
</uni-nav-bar>
|
||||
<view class="sign-info abs">
|
||||
<image mode="aspectFill" lazy-load class="common-bg sign abs" :src="cover"></image>
|
||||
<view @tap="$util.goUrl({url:`/shop/pages/integral/list`})"
|
||||
class="exchange-btn abs flex-center f-caption c-base">兑换好礼
|
||||
</view>
|
||||
<view class="integral-info abs flex-center flex-column c-base">
|
||||
<view class="integral-num">{{detail.integral}}</view>
|
||||
<image lazy-load class="integral-icon mt-sm" src="/static/image/shop/integral.png"></image>
|
||||
<view class="f-icontext">我的积分</view>
|
||||
</view>
|
||||
<view class="count-info abs flex-center ml-md mr-md fill-base radius-24">
|
||||
<view class="flex-center flex-column">
|
||||
<view class="f-lg-title c-title text-bold">{{detail.sign_num}}</view>
|
||||
<view class="f-caption c-caption">连续签到(天)</view>
|
||||
</view>
|
||||
<view class="flex-center flex-column">
|
||||
<view class="f-lg-title c-title text-bold">{{detail.total_sign_num}}</view>
|
||||
<view class="f-caption c-caption">累计签到(天)</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="space-sign rel"></view>
|
||||
<view class="sign-date-info fill-base mt-md ml-md mr-md radius-24">
|
||||
<view class="flex-center pt-lg pb-lg">
|
||||
<view class="flex-y-center f-paragraph">
|
||||
<i @tap.stop="toChangeDate(-1)" class="iconfont icon-sanjiao pl-lg pr-lg rotate-180"></i>
|
||||
<view class="month-text flex-center f-sm-title c-title text-bold"> {{detail.month}} </view>
|
||||
<i @tap.stop="toChangeDate(1)" class="iconfont icon-sanjiao pl-lg pr-lg"></i>
|
||||
</view>
|
||||
</view>
|
||||
<view class="day-info flex-warp">
|
||||
<view class="day-item flex-center flex-column" v-for="(item,index) in weekList">
|
||||
{{item}}
|
||||
</view>
|
||||
<view class="day-item flex-center flex-column" v-for="(item,index) in timeList">
|
||||
</view>
|
||||
<!-- status 0可签到;1已签到;2未在签到时间内 -->
|
||||
<view @tap.stop="toChangeItem('dayInd',index)"
|
||||
class="day-item flex-center flex-column f-title c-title radius"
|
||||
:class="[{'sign':item.status == 1 },{'today':item.day_str == today || dayInd == index},{'register':item.day_str == detail.create_time}]"
|
||||
:style="{color:item.day_str == today || item.day_str == detail.create_time || dayInd == index ? '#fff' : ''}"
|
||||
v-for="(item,index) in detail.list" :key="index">
|
||||
{{item.day_str == detail.create_time ? '注册' : item.day}}
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex-between pl-lg pr-lg pb-md f-paragraph c-title">
|
||||
<view @tap="$refs.show_rule_item.open()" class="flex-center c-caption"><i
|
||||
class="iconfont icon-wenhao mr-sm"></i>签到规则</view>
|
||||
<view @tap="toChangeItem('is_sign', !is_sign)" class="flex-center">签到提醒<i class="iconfont ml-sm"
|
||||
:class="[{'icon-switch c-caption':!is_sign},{'icon-switch-on':is_sign}]"
|
||||
:style="{color:is_sign?primaryColor:''}"></i></view>
|
||||
</view>
|
||||
<view @tap="toSign" class="sign-btn flex-center f-title c-base radius">立即签到</view>
|
||||
<view class="space-lg"></view>
|
||||
</view>
|
||||
<view class="mt-md ml-md mr-md pd-lg fill-base radius-24">
|
||||
<view class="f-title c-title text-bold">积分纪录</view>
|
||||
<block v-for="(item,index) in list.data" :key="index">
|
||||
<view @tap.stop="goDetail(index)" class="integral-item flex-center mt-md radius-16">
|
||||
<image lazy-load class="integral-img radius-16" src="/static/image/shop/integral.png"></image>
|
||||
<view class="flex-1 ml-lg">
|
||||
<view class="flex-1 flex-between">
|
||||
<view>
|
||||
<view class="f-paragraph c-title mt-sm mb-sm">{{item.create_date}} 签到赠送</view>
|
||||
<view class="f-caption" style="color: #C7C7C7;">{{item.create_time_text}}</view>
|
||||
</view>
|
||||
<view class="flex-y-baseline f-caption" :style="{color:primaryColor}">+<view
|
||||
class="f-lg-title">
|
||||
{{item.integral}}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
<load-more :noMore="list.current_page>=list.last_page&&list.data.length>0" :loading="loading" v-if="loading">
|
||||
</load-more>
|
||||
<abnor v-if="!loading&&list.data.length<=0&&list.current_page==1"></abnor>
|
||||
<view class="space-footer"></view>
|
||||
|
||||
|
||||
<uni-popup ref="show_rule_item">
|
||||
<view class="popup-rule">
|
||||
<view class="rule-info pd-lg fill-base radius-24">
|
||||
<view class="flex-center f-title c-title text-bold">签到规则</view>
|
||||
<view class="rule-text mt-lg f-paragraph">
|
||||
<text decode="emsp" style="word-break:break-all;">{{detail.integral_text}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<i @tap="$refs.show_rule_item.close()" class="flex-center mt-lg iconfont icon-close c-base"></i>
|
||||
</view>
|
||||
</uni-popup>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
mapState,
|
||||
mapActions,
|
||||
} from "vuex"
|
||||
export default {
|
||||
components: {},
|
||||
data() {
|
||||
return {
|
||||
options: {},
|
||||
color: '#ffffff',
|
||||
cover: 'https://lbqny.migugu.com/admin/farm/default_sign.png',
|
||||
weekList: ['日', '一', '二', '三', '四', '五', '六'],
|
||||
timeList: [],
|
||||
today: '',
|
||||
dayInd: -1,
|
||||
is_sign: true,
|
||||
detail: {},
|
||||
param: {
|
||||
page: 1,
|
||||
},
|
||||
list: {
|
||||
data: []
|
||||
},
|
||||
loading: true,
|
||||
lockTap: false
|
||||
}
|
||||
},
|
||||
computed: mapState({
|
||||
primaryColor: state => state.config.configInfo.primaryColor,
|
||||
subColor: state => state.config.configInfo.subColor,
|
||||
configInfo: state => state.config.configInfo,
|
||||
userInfo: state => state.user.userInfo,
|
||||
mineInfo: state => state.user.mineInfo,
|
||||
}),
|
||||
onLoad() {
|
||||
this.$util.showLoading()
|
||||
this.initIndex()
|
||||
},
|
||||
onPullDownRefresh() {
|
||||
// #ifndef APP-PLUS
|
||||
uni.showNavigationBarLoading()
|
||||
// #endif
|
||||
this.initRefresh()
|
||||
uni.stopPullDownRefresh()
|
||||
},
|
||||
onReachBottom() {
|
||||
if (this.list.current_page >= this.list.last_page || this.loading) return
|
||||
this.param.page = this.param.page + 1
|
||||
this.loading = true
|
||||
this.getList()
|
||||
},
|
||||
onPageScroll(e) {
|
||||
let color = e.scrollTop < 20 ? '#ffffff' : '#000000'
|
||||
if (this.color == color) return
|
||||
this.color = color
|
||||
},
|
||||
methods: {
|
||||
...mapActions(['getConfigInfo', 'getUserInfo', 'getMineInfo', 'getAuthUserProfile']),
|
||||
async initIndex(day = '') {
|
||||
let today = this.$util.DateToUnix(this.$util.formatTime(new Date().getTime(),
|
||||
'YY-M-D'))
|
||||
this.today = today
|
||||
day = day || this.$util.formatTime(today * 1000, 'YY-M-D')
|
||||
let [detail] = await Promise.all([this.$api.shop.signinIndex({
|
||||
day
|
||||
}), this.getList()])
|
||||
detail.id = 1
|
||||
let {
|
||||
list,
|
||||
sign_notice,
|
||||
create_time
|
||||
} = detail
|
||||
detail.create_time = this.$util.DateToUnix(this.$util.formatTime(create_time * 1000, 'YY-M-D'))
|
||||
this.dayInd = list.findIndex(item => {
|
||||
return item.day_str == today
|
||||
})
|
||||
let {
|
||||
week,
|
||||
day_str
|
||||
} = list[0]
|
||||
detail.month = this.$util.formatTime(day_str * 1000, 'YY年M月')
|
||||
let timeList = []
|
||||
if (week !== 0) {
|
||||
for (let i = 0; i < week; i++) {
|
||||
timeList.push({
|
||||
id: 0
|
||||
})
|
||||
}
|
||||
}
|
||||
this.timeList = timeList
|
||||
this.is_sign = sign_notice === 1
|
||||
this.detail = detail
|
||||
this.$util.hideAll()
|
||||
},
|
||||
initRefresh() {
|
||||
this.param.page = 1
|
||||
this.initIndex()
|
||||
},
|
||||
async getList() {
|
||||
let {
|
||||
list: oldList,
|
||||
param,
|
||||
} = this
|
||||
let newList = await this.$api.shop.signinRecordList(param);
|
||||
if (this.param.page == 1) {
|
||||
this.list = newList
|
||||
} else {
|
||||
newList.data = oldList.data.concat(newList.data)
|
||||
this.list = newList
|
||||
}
|
||||
this.loading = false
|
||||
this.$util.hideAll()
|
||||
},
|
||||
toChangeDate(type) {
|
||||
let {
|
||||
list
|
||||
} = this.detail
|
||||
let one = 24 * 3600
|
||||
let index = type === 1 ? list.length - 1 : 0
|
||||
let {
|
||||
day_str
|
||||
} = list[index]
|
||||
let day = this.$util.formatTime((day_str + one * type) * 1000, 'YY-M-D')
|
||||
this.initIndex(day)
|
||||
},
|
||||
toChangeItem(key, val) {
|
||||
if (key === 'dayInd') {
|
||||
let {
|
||||
status,
|
||||
day_str
|
||||
} = this.detail.list[val]
|
||||
if (status) {
|
||||
let {
|
||||
create_time
|
||||
} = this.detail
|
||||
let msg = day_str < create_time ? `注册时间后才可签到` : `签到未开始`
|
||||
this.$util.showToast({
|
||||
title: status == 1 ? `已签到` : msg
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
this[key] = val
|
||||
if (key === 'is_sign') {
|
||||
this.$api.user.userUpdate({
|
||||
sign_notice: val ? 1 : 0
|
||||
})
|
||||
}
|
||||
},
|
||||
async toSign() {
|
||||
let {
|
||||
dayInd,
|
||||
} = this
|
||||
let {
|
||||
day_str: day
|
||||
} = this.detail.list[dayInd]
|
||||
if (this.lockTap) return;
|
||||
this.lockTap = true;
|
||||
this.$util.showLoading()
|
||||
try {
|
||||
await this.$api.shop.signin({
|
||||
day
|
||||
})
|
||||
this.$util.showToast({
|
||||
title: `签到成功`
|
||||
})
|
||||
this.lockTap = false
|
||||
await this.initRefresh()
|
||||
} catch (e) {
|
||||
setTimeout(() => {
|
||||
this.lockTap = false
|
||||
this.$util.hideAll()
|
||||
}, 2000)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.pages-mine {
|
||||
.sign-info {
|
||||
width: 100%;
|
||||
height: 579rpx;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 1;
|
||||
|
||||
.exchange-btn {
|
||||
top: 167rpx;
|
||||
right: 0;
|
||||
width: 146rpx;
|
||||
height: 53rpx;
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-radius: 100rpx 0 0 100rpx;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.integral-info {
|
||||
width: 100%;
|
||||
height: 217rpx;
|
||||
top: 167rpx;
|
||||
left: 0;
|
||||
|
||||
.integral-num {
|
||||
font-size: 50rpx;
|
||||
}
|
||||
|
||||
.integral-icon {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.count-info {
|
||||
width: calc(100% - 40rpx);
|
||||
height: 162rpx;
|
||||
bottom: 0;
|
||||
|
||||
.flex-center {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
.space-sign {
|
||||
width: 100%;
|
||||
height: 579rpx;
|
||||
top: 0;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.sign-date-info {
|
||||
.month-text {
|
||||
width: 300rpx;
|
||||
}
|
||||
|
||||
.day-info {
|
||||
margin: 0 5rpx;
|
||||
|
||||
.day-item {
|
||||
width: 62rpx;
|
||||
height: 62rpx;
|
||||
margin: 10rpx 19rpx;
|
||||
|
||||
.f-title {
|
||||
height: 36rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.sign {
|
||||
background: #EFEFEF;
|
||||
}
|
||||
|
||||
.today {
|
||||
background: linear-gradient(4deg, #39b54a 0%, #69D275 100%);
|
||||
box-shadow: 0px 3px 11px 0px rgba(13, 143, 57, 0.34);
|
||||
}
|
||||
|
||||
.register {
|
||||
background: linear-gradient(4deg, #F3A664 0%, #FBE945 100%);
|
||||
box-shadow: 0px 3px 11px 0px rgba(243,166,100, 0.34);
|
||||
font-size: 24rpx;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
.icon-wenhao {
|
||||
font-size: 26rpx;
|
||||
}
|
||||
|
||||
.icon-switch,
|
||||
.icon-switch-on {
|
||||
font-size: 70rpx;
|
||||
}
|
||||
|
||||
.sign-btn {
|
||||
width: 540rpx;
|
||||
height: 72rpx;
|
||||
margin: 0 auto;
|
||||
background: linear-gradient(360deg, #39b54a 0%, #69D275 100%);
|
||||
box-shadow: 0px 6rpx 17rpx 0px rgba(13, 143, 47, 0.3500);
|
||||
}
|
||||
}
|
||||
|
||||
.integral-item {
|
||||
|
||||
.integral-img {
|
||||
width: 47rpx;
|
||||
height: 47rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.popup-rule {
|
||||
width: 596rpx;
|
||||
margin: 0 auto;
|
||||
|
||||
.rule-info {
|
||||
margin-top: 10vh;
|
||||
|
||||
.rule-text {
|
||||
color: #4A4A4A;
|
||||
line-height: 1.4;
|
||||
min-height: 100rpx;
|
||||
max-height: 60vh;
|
||||
overflow: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.icon-close {
|
||||
font-size: 70rpx;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user