|
|
- <template>
- <view class="sigin-in bx">
- <navbar :leftClick="leftClick" :title="$t('page.signIn.title')"></navbar>
-
- <view class="sigin-in-content">
- <!-- <view class="title">{{ $t('page.signIn.title') }}</view> -->
- <view class="numberOfSays">{{ $t('page.signIn.sign',[numberOfSays]) }}</view>
-
- <view class="date-info">
- <view class="month-info">
- <view class="left-arrow">
- <image @click="changeMonth(0)" src="/static/signin/arrow.png" mode="widthFix"></image>
- </view>
-
- <view class="month">{{ $t(`page.signIn.${monthIndex}`) }}</view>
-
- <view class="right-arrow">
- <image @click="changeMonth(1)" src="/static/signin/arrow.png" mode="widthFix"></image>
- </view>
- </view>
-
- <view class="day-list">
- <view v-for="(item,index) in dayList" :key="index" class="day-item">
- <view v-if="item.sign" class="check-img">
- <image src="/static/signin/check.png" mode="widthFix"></image>
- </view>
- <view class="sort">{{ $t('page.signIn.day',[index + 1])}}</view>
- <view class="img-box">
- <image src="/static/signin/gift.png" mode="widthFix"></image>
- </view>
- <view class="day">{{ forMateDate(item) }}</view>
- </view>
- </view>
-
- <view class="tips">{{ tips[type[$i18n.locale]] }}</view>
-
- <view :class="{ signedIn : userInfo.sginState == 1 }" @click="submitSignin" class="submit">{{ $t('page.signIn.title') }}</view>
-
- </view>
-
- </view>
-
- </view>
- </template>
-
- <script>
- import navbar from '@/components/base/m-navbar.vue'
-
- export default {
- components: {
- navbar
- },
- data() {
- return {
- numberOfSays: 0, //签到天数
- dayList: [], //日期列表
- tips: '', //提示
- type: {
- en: 'keyEnglish',
- es: "keySpanish",
- "zh": "keyChinese"
- },
- monthIndex: 0, //当前月份(0-11)
- signinList : [], //签到列表
- userInfo : {}
- }
- },
- onShow() {
- this.initDate()
- this.getTips()
- this.getSigninList()
- this.getUserInfo()
- },
- methods: {
- leftClick() {
- uni.navigateTo({
- url: '/pages/home/home'
- })
- },
-
- //初始化日期列表
- initDate() {
- if(this.dayList.length >= 28) return
- //保存当前月份
- this.monthIndex = this.$dayjs().month();
- // 获取当前日期
- let now = this.$dayjs();
- // 获取当前月最后一天的日期
- let lastDayOfMonth = now.endOf('month');
- // 获取当前月的天数
- let daysInMonth = lastDayOfMonth.date();
- //获取当前月的第一天
- var firstDay = this.$dayjs().date(1)
- this.dayList.push(firstDay)
- //获取一个月的所有日期
- for (let i = 1; i < daysInMonth; i++) {
- this.dayList.push(this.$dayjs(firstDay).add(i, 'day'))
- }
- },
-
- //格式化时间
- forMateDate(day) {
- return this.$dayjs(day).format("MM-DD")
- },
-
- //获取已签到列表
- getSigninList() {
- this.request('getSignRecord').then(res => {
- if (res.code == 200) {
- this.signinList = res.result
- this.updateSigninState()
- }
- })
- },
-
- //获取提示签到说明
- getTips() {
- this.request('getTips').then(res => {
- if (res.code == 200) {
- this.tips = res.result
- }
- })
- },
-
- //签到
- submitSignin(day) {
- this.$play()
- if(this.userInfo.sginState == 1){
- return uni.$u.toast(this.$t('message.34'))
- }
- this.request('sign').then(res => {
- if (res.code == 200) {
- uni.$u.toast(this.$t('message.35'))
- this.getSigninList()
- }
- })
- },
-
- //修改当前月份
- changeMonth(type) {
- this.$play()
- if (!type) {
- if(this.monthIndex <= 0) return
- // 获取当前月份之前的月份
- this.monthIndex -= 1;
- this.getDays()
- } else {
- if(this.monthIndex >= 11) return
- //获取当前月份之后的月份
- this.monthIndex += 1
- this.getDays()
- }
- },
-
- //获取过去或者未来的月份所有天
- getDays(){
- // 使用当前年份和新的月份索引创建一个日期对象
- let firstDayOfMonth = this.$dayjs().year(this.$dayjs().year()).month(this.monthIndex).startOf('month');
-
- // 获取当前月之前月份的最后一天
- let lastDayOfMonth = firstDayOfMonth.endOf('month');
-
- // 获取当前月之前月份的天数
- let daysInMonth = lastDayOfMonth.date();
-
- // 初始化日期列表
- this.dayList = [];
-
- // 遍历这个月的每一天
- for (let i = 1; i <= daysInMonth; i++) {
- // 添加每一天到列表中
- this.dayList.push(firstDayOfMonth.add(i - 1, 'day'));
- }
-
- //更新签到状态
- this.updateSigninState()
- },
-
- //更新签到状态
- updateSigninState(){
- this.signinList.forEach(item => {
- let signDate = this.$dayjs(item.signTime).format("YYYY-MM-DD")
- this.dayList.forEach(day => {
- if (day.isSame(signDate, 'day')) {
- this.$set(day, 'sign', true)
- }
- })
- //统计用户选择的月份签到天数
- this.countSigninDayNum()
- })
- },
-
- //统计用户选择的月份签到天数
- countSigninDayNum(){
- this.numberOfSays = 0;
- let lastIndex = this.getLastDayIndex()
- //计算选择月份连续签到天数
- for(let j = lastIndex ; j >= 0 ; j--){
- if(this.dayList[j].sign){
- this.numberOfSays++
- }else{
- return
- }
- }
- },
-
- //获取用户选择月份最后一天签到的索引
- getLastDayIndex() {
- for (let i = this.dayList.length - 1; i >= 0; i--) {
- if (this.dayList[i].sign) {
- return i;
- }
- }
- },
-
- //获取用户信息(用户判断用户是否已签到)
- getUserInfo() {
- this.request('userInfo').then(res => {
- if (res.code == 200) {
- this.userInfo = res.result.userInfo
- }
- })
- },
- }
- }
- </script>
-
- <style lang="scss" scoped>
- .sigin-in {
- // background: black;
- padding-bottom: 80rpx;
-
- .sigin-in-content {
- width: 96%;
- margin: 0 auto;
-
- .numberOfSays {
- text-align: center;
- padding: 20rpx 0rpx;
- }
-
- .date-info {
- // background: $uni-bg-color-app;
- border-radius: 20rpx;
- box-sizing: border-box;
- padding: 20rpx;
-
- .month-info {
- display: flex;
- justify-content: center;
- align-items: center;
- margin-bottom: 20rpx;
-
- .month {
- background: $uni-bg-color-app;
- color: $uni-text-color-inverse;
- padding: 10rpx;
- border-radius: 10rpx;
- margin: 0rpx 15rpx;
- font-size: 30rpx;
- }
-
- image {
- width: 30rpx;
- }
-
- .right-arrow {
- image {
- transform: rotate(-180deg);
- }
- }
- }
-
- .day-list {
- display: flex;
- flex-wrap: wrap;
-
- .day-item {
- background: $uni-bg-color-app;
- color: $uni-text-color-inverse;
- position: relative;
- flex-shrink: 0;
- width: calc(20% - 7px);
- // background: #565656;
- border-radius: 20rpx;
- margin-bottom: 20rpx;
- margin-right: calc(35px / 4);
- box-sizing: border-box;
- padding: 10rpx;
-
- &:nth-child(5n) {
- margin-right: 0rpx;
- }
-
- .check-img {
- position: absolute;
- right: 4rpx;
- top: -4rpx;
-
- image {
- width: 30rpx;
- }
- }
-
- image {
- width: 40rpx;
- margin: 10rpx 0rpx;
- }
-
- .sort {
- font-size: 20rpx;
- }
-
- .day {
- font-size: 20rpx;
- border-radius: 20rpx;
- background: #66B53B;
- }
-
- view {
- display: flex;
- justify-content: center;
- }
- }
- }
-
- .tips {
- color: #888888;
- font-size: 20rpx;
- text-align: center;
- margin: 20rpx 0rpx;
- }
-
- .submit {
- display: flex;
- align-items: center;
- justify-content: center;
- height: 80rpx;
- background: $uni-bg-color-app;
- color: $uni-text-color-inverse;
- border-radius: 40rpx;
- margin-bottom: 20rpx;
- }
-
- .signedIn{
- background: #ccc;
- }
-
- }
-
- }
- }
- </style>
|