PointSignin.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <template><page-meta :root-font-size="fontSize+'px'"></page-meta>
  2. <member-base :show="false"><view class="div container">
  3. <view class="div common-header-wrap">
  4. <view :style="'height:'+navHeight+'px'"></view>
  5. <view class="common-header-holder"></view>
  6. <view class="common-header-fixed">
  7. <title-header />
  8. <uni-nav-bar title="签到送积分" class="common-header" left-icon="back" @clickLeft="goBack()">
  9. </uni-nav-bar>
  10. </view>
  11. </view>
  12. <view class="div point-signin-header">
  13. <view class="div btn-wrapper" :class="{active:!if_signin}">
  14. <view class="div btn">
  15. <view class="div" v-if="if_signin"><view class="div title">已签到</view><view class="div content" v-if="user.member_signin_days_cycle">连续{{user.member_signin_days_cycle}}天</view><view class="div content" v-else>进入新周期</view></view>
  16. <view class="div" v-else @click="goSign">签到</view>
  17. </view>
  18. </view>
  19. <view class="div notice">连续签到{{config.points_signin_cycle}}天为一周期,每周期可获得{{config.points_signin_reward}}积分额外奖励,每过一个周期连续签到天数清0</view>
  20. </view>
  21. <view class="div calendar-wrapper" v-if="day_list">
  22. <view class="div calendar-month"><text class="i iconfont" @click="goSearch(0)">&#xe64f;</text><text class="span">{{$moment(search_day).format('YYYY年MM月')}}</text><text class="i iconfont" @click="goSearch(1)">&#xe650;</text></view>
  23. <view class="div calendar-title">
  24. <view class="div item"><text class="span">日</text></view>
  25. <view class="div item"><text class="span">一</text></view>
  26. <view class="div item"><text class="span">二</text></view>
  27. <view class="div item"><text class="span">三</text></view>
  28. <view class="div item"><text class="span">四</text></view>
  29. <view class="div item"><text class="span">五</text></view>
  30. <view class="div item"><text class="span">六</text></view>
  31. </view>
  32. <view class="div calendar-content">
  33. <view class="div item" v-for="n in day_list[0].week" :key="n"></view>
  34. <view class="div item" v-for="(item,index) in day_list" :key="index" :class="{active:item.state,'pre-active':(item.day==$moment().format('YYYY-MM-DD')) && !item.state}"><text class="span">{{item.num}}</text></view>
  35. </view>
  36. </view>
  37. </view></member-base>
  38. </template>
  39. <script>
  40. import {getFontSize} from '@/util/common'
  41. import TitleHeader from '../../TitleHeader'
  42. import MemberBase from '../MemberBase'
  43. import { mapState, mapMutations, mapActions } from 'vuex'
  44. import { getPointSignin, addPointSignin } from '../../../api/memberPoint'
  45. import { getMemberInfo } from '../../../api/member'
  46. export default {
  47. name:'MemberPointSignin',
  48. data(){
  49. return {
  50. navHeight: 0,
  51. day_list: false,
  52. search_day: '',
  53. if_signin: false
  54. }
  55. },
  56. components:{
  57. TitleHeader,
  58. MemberBase,
  59. },
  60. created () {
  61. this.getPointSignin()
  62. this.fetchConfig({}).then(
  63. response => {
  64. },
  65. error => {
  66. uni.showToast({icon:'none',title: error.message})
  67. }
  68. )
  69. getMemberInfo().then(res => {
  70. this.memberUpdate({ info: res.result.member_info })
  71. }, error => {}
  72. )
  73. },
  74. computed:{
  75. fontSize(){
  76. return getFontSize()
  77. },
  78. ...mapState({
  79. user: state => state.member.info,
  80. config: state => state.config.config
  81. })
  82. },
  83. mounted(){
  84. // #ifdef MP-WEIXIN
  85. this.navHeight = uni.getMenuButtonBoundingClientRect().top
  86. // #endif
  87. },
  88. methods:{
  89. goBack(){uni.navigateBack({delta:1})},
  90. ...mapActions({
  91. fetchConfig: 'fetchConfig'
  92. }),
  93. ...mapMutations({
  94. memberUpdate: 'memberUpdate',
  95. memberEdit: 'memberEdit'
  96. }),
  97. goSign () {
  98. addPointSignin().then(res => {
  99. uni.showToast({icon:'none',title: res.message})
  100. this.memberEdit(res.result.member_signin_info)
  101. this.getPointSignin()
  102. this.if_signin=true
  103. }).catch(function (error) {
  104. uni.showToast({icon:'none',title: error.message})
  105. })
  106. },
  107. goSearch (type) {
  108. if (type) { // 后一个月
  109. this.search_day = this.$moment(this.search_day).add(1, 'months').format('YYYY-MM-DD')
  110. } else { // 前一个月
  111. this.search_day = this.$moment(this.search_day).subtract(1, 'months').format('YYYY-MM-DD')
  112. }
  113. this.getPointSignin()
  114. },
  115. getPointSignin () {
  116. getPointSignin(this.search_day).then(res => {
  117. uni.hideLoading()
  118. this.if_signin=res.result.if_signin
  119. this.day_list = res.result.day_list
  120. this.search_day = this.$moment.unix(res.result.time).format('YYYY-MM-DD')
  121. }).catch(function (error) {
  122. uni.hideLoading()
  123. uni.showToast({icon:'none',title: error.message})
  124. })
  125. }
  126. }
  127. }
  128. </script>
  129. <style scoped lang="scss">
  130. .common-header-wrap .common-header{border-bottom: 0;background: $primaryColor;color:#fff;box-shadow: unset}
  131. .point-signin-header{margin-bottom:1rem;background:$primaryColor;padding:.5rem;text-align: center;
  132. .btn-wrapper{height: 4rem;width:4rem;margin:1rem auto;border-radius:50%;background: $primaryColor;border:.3rem solid rgba(255,255,255,.5);overflow: hidden;
  133. &.active{
  134. .btn{
  135. >.div{background:$primaryColor;color:rgba(255,255,255,.8);line-height:3.4rem;}
  136. }
  137. }
  138. .btn{background:#fff;width:100%;height:100%;padding:.3rem;box-sizing:border-box;
  139. >.div{border-radius:50%;width:100%;height:100%;margin:0 auto;border:1px solid $primaryColor;box-sizing:border-box;
  140. .title{font-size:$h2;color:$primaryColor;margin-top: .7rem;}
  141. .content{font-size:$fontSize;color:$primaryColor}
  142. }
  143. }
  144. }
  145. .notice{font-size:$fontSize;color:#fff;opacity: .8}
  146. }
  147. .calendar-wrapper{background:#fff;
  148. .calendar-month{text-align:center;font-size:$subFontSize;line-height:2rem;border-bottom:1px solid #eee;margin-bottom:.5rem;
  149. >.span{margin: 0 1rem;}
  150. .i{font-size:$subFontSize;}
  151. }
  152. .item{float:left;width:14.28%;height:1.5rem;text-align: center;font-size:$fontSize;
  153. >.span{height:1rem;width:1rem;line-height: 1rem;border-radius: 50%;display: block;margin:0 auto;}
  154. &.pre-active{
  155. >.span{border:1px solid $primaryColor}
  156. }
  157. &.active{
  158. >.span{background:$primaryColor;color:#fff}
  159. }
  160. }
  161. .calendar-content,.calendar-title{overflow: hidden;padding:0 .5rem;}
  162. }
  163. </style>