溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在微信小程序中實現(xiàn)打卡日歷功能

發(fā)布時間:2021-05-22 17:27:28 來源:億速云 閱讀:435 作者:Leah 欄目:web開發(fā)

怎么在微信小程序中實現(xiàn)打卡日歷功能?針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

Calendar.wxml 頁面文件

頁面上顯示出來的東西,布局上主要是一個年月欄、上一個月和下一個月的按鈕;然后是星期欄,就是日一二三四五六,然后就是每個月的日期,注意每個月的前面可能有空的地方。這里面用wx:if標(biāo)簽來區(qū)分當(dāng)前日期有無打卡的情況。

<!--pages/Calendar/Calendar.wxml-->
<!-- 打卡日歷頁面 -->
<view class='all'>
 <view class="bar">
  <!-- 上一個月 -->
  <view class="previous" bindtap="handleCalendar" data-handle="prev">
   <image src='../../images/pre.png'></image>
  </view>
  <!-- 顯示年月 -->
  <view class="date">{{cur_year || "--"}} 年 {{cur_month || "--"}} 月</view>
  <!-- 下一個月 -->
  <view class="next" bindtap="handleCalendar" data-handle="next">
   <image src='../../images/next.png'></image>
  </view>
 </view>
 <!-- 顯示星期 -->
 <view class="week">
  <view wx:for="{{weeks_ch}}" wx:key="{{index}}" data-idx="{{index}}">{{item}}</view>
 </view>
 <view class='days'>
  <!-- 列 -->
  <view class="columns" wx:for="{{days.length/7}}" wx:for-index="i" wx:key="i">
   <view wx:for="{{days}}" wx:for-index="j" wx:key="j">
    <!-- 行 -->
    <view class="rows" wx:if="{{j/7 == i}}">
     <view class="rows" wx:for="{{7}}" wx:for-index="k" wx:key="k">
      <!-- 每個月份的空的單元格 -->
      <view class='cell' wx:if="{{days[j+k].date == null}}">
       <text decode="{{true}}">&nbsp;&nbsp;</text>
      </view>
      <!-- 每個月份的有數(shù)字的單元格 -->
      <view class='cell' wx:else>
       <!-- 當(dāng)前日期已簽到 -->
       <view wx:if="{{days[j+k].isSign == true}}" style='background-color:#83C75D' class='cell'>
        <text>{{days[j+k].date}}</text>
       </view>
       <!-- 當(dāng)前日期未簽到 -->
       <view wx:else>
        <text>{{days[j+k].date}}</text>
       </view>
      </view>
     </view>
    </view>
   </view>
  </view>
 </view>
 <!-- 堅持打卡天數(shù) -->
 <view class='count'>
  <text>截至目前,你已堅持打卡</text>
  <view class='daynumber'>
  <text class='number'>{{count}}</text>
  <text class='day'>天</text>
  </view>  
  <text>請再接再厲,繼續(xù)努力</text>
 </view>
</view>

Calendar.wxss 樣式文件

這個就是讓頁面顯示得更好看一點了,里面有些屬性更改之后可能會導(dǎo)致整個頁面的格式變得很亂,說明自己的功夫還是不到家。

/* pages/Calendar/Calendar.wxss */
/* 打卡日歷 */
.all{
 margin-top: 20rpx;
}

.all .bar{
 display: flex;
 flex-direction: row;
 justify-content: space-between;
 margin: 30rpx 20rpx;
 padding: 10rpx;
}

.all .bar image{
 width: 50rpx;
 height: 50rpx;
}

.all .week{
 display: flex;
 flex-direction: row;
 justify-content: space-between;
 padding: 20rpx;
 padding-left: 40rpx;
 padding-right: 40rpx;
 margin: 20rpx;
 border-radius: 10px;
 background-color: #acd;
}

.all .days{
 margin: 20rpx;
 padding: 10rpx;
 border-radius: 10px;
 background-color: #acd;

}

.all .columns{
 display: flex;
 flex-direction: column;
 justify-content: space-between; 
}

.all .columns .rows{
 display: flex;
 flex-direction: row;
 justify-content: space-between;
}

.all .columns .rows .cell{
 width: 84rpx;
 height: 88rpx;
 margin: 3rpx;
 text-align: center;
 border-radius: 50%;
 display: flex;
 flex-direction: column;
 justify-content: center;
}

.count .daynumber{
 display: flex;
 flex-direction: row;
 justify-content: center;
}

.count .daynumber .day{
 margin-top: 50rpx;
}

.count{
 margin: 20rpx;
 padding: 30rpx;
 display: flex;
 text-align: center;
 border-radius: 10px;
 flex-direction: column;
 justify-content: center;
 background-color: #acd;
 align-items: center;
}

.count .number{
 color: red;
 font-size: 60rpx;
 background-color: #fff;
 width: 100rpx;
 height: 100rpx;
 border-radius: 50%;
 display: flex;
 flex-direction: column;
 justify-content: center;
 margin: 20rpx;
}

.count text{
 margin: 10rpx;
}

Calendar.js JavaScript文件

js文件里面涉及到Bmob的操作,這里就不多說Bmob的操作了,感興趣的同學(xué)可以去參考它的官方文檔。
然后里面主要是對上一個月、下一個月的點擊函數(shù)進行處理,以及對某年某月的每個日期進行初始化(尤其是每個月前的可能有的幾個空格進行了處理),然后就是判斷某個日期在后臺數(shù)據(jù)中是否有打卡。

// pages/Calendar/Calendar.js
//打卡日歷頁面
var util = require('../../utils/util.js');
var Bmob = require('../../utils/bmob.js');
Page({

 /**
  * 頁面的初始數(shù)據(jù)
  */
 data: {
  objectId:'',
  days:[],
  signUp:[],
  cur_year:0,
  cur_month:0,
  count:0
 },

 /**
  * 生命周期函數(shù)--監(jiān)聽頁面加載
  */
 onLoad: function (options) {
  this.setData({objectId : options.objectId}); 
  //獲取當(dāng)前年月 
  const date = new Date();
  const cur_year = date.getFullYear();
  const cur_month = date.getMonth() + 1;
  const weeks_ch = ['日', '一', '二', '三', '四', '五', '六'];
  this.calculateEmptyGrids(cur_year, cur_month);
  this.calculateDays(cur_year, cur_month);
  //獲取當(dāng)前用戶當(dāng)前任務(wù)的簽到狀態(tài)
  this.onGetSignUp();
  this.setData({
   cur_year,
   cur_month,
   weeks_ch
  })

 },

 /**
  * 生命周期函數(shù)--監(jiān)聽頁面初次渲染完成
  */
 onReady: function () {

 },

 /**
  * 生命周期函數(shù)--監(jiān)聽頁面顯示
  */
 onShow: function () {

 },

 /**
  * 生命周期函數(shù)--監(jiān)聽頁面隱藏
  */
 onHide: function () {

 },

 /**
  * 生命周期函數(shù)--監(jiān)聽頁面卸載
  */
 onUnload: function () {

 },

 /**
  * 頁面相關(guān)事件處理函數(shù)--監(jiān)聽用戶下拉動作
  */
 onPullDownRefresh: function () {

 },

 /**
  * 頁面上拉觸底事件的處理函數(shù)
  */
 onReachBottom: function () {

 },

 /**
  * 用戶點擊右上角分享
  */
 onShareAppMessage: function () {

 },
 // 獲取當(dāng)月共多少天
 getThisMonthDays:function(year, month){
   return new Date(year, month, 0).getDate()
 },

 // 獲取當(dāng)月第一天星期幾
 getFirstDayOfWeek:function(year, month) {
  return new Date(Date.UTC(year, month - 1, 1)).getDay();
 },

 // 計算當(dāng)月1號前空了幾個格子,把它填充在days數(shù)組的前面
 calculateEmptyGrids:function(year, month) {
  var that = this;
  //計算每個月時要清零
  that.setData({days:[]});
  const firstDayOfWeek = this.getFirstDayOfWeek(year, month);  
  if (firstDayOfWeek > 0) {
   for (let i = 0; i < firstDayOfWeek; i++) {
    var obj = {
     date:null,
     isSign:false
    }
    that.data.days.push(obj);
   }
   this.setData({
    days:that.data.days
   });
  //清空
  } else {
   this.setData({
    days: []
   });
  }
 },

 // 繪制當(dāng)月天數(shù)占的格子,并把它放到days數(shù)組中
 calculateDays:function(year, month) {
  var that = this;
  const thisMonthDays = this.getThisMonthDays(year, month);
  for (let i = 1; i <= thisMonthDays; i++) {
   var obj = {
    date: i,
    isSign: false
   }
   that.data.days.push(obj);
  }
  this.setData({
   days:that.data.days
  });
 },

 //匹配判斷當(dāng)月與當(dāng)月哪些日子簽到打卡
 onJudgeSign:function(){
  var that = this;
  var signs = that.data.signUp;
  var daysArr = that.data.days;
  for (var i=0; i < signs.length;i++){
   var current = new Date(signs[i].date.replace(/-/g, "/"));
   var year = current.getFullYear();
   var month = current.getMonth()+1;
   var day = current.getDate();
   day = parseInt(day);
   for (var j = 0; j < daysArr.length;j++){
    //年月日相同并且已打卡
    if (year == that.data.cur_year && month == that.data.cur_month && daysArr[j].date == day && signs[i].isSign == "今日已打卡"){
     daysArr[j].isSign = true;
    }
   }
  }
  that.setData({days:daysArr});
 },

 // 切換控制年月,上一個月,下一個月
 handleCalendar:function(e) {
  const handle = e.currentTarget.dataset.handle;
  const cur_year = this.data.cur_year;
  const cur_month = this.data.cur_month;
  if (handle === 'prev') {
   let newMonth = cur_month - 1;
   let newYear = cur_year;
   if (newMonth < 1) {
    newYear = cur_year - 1;
    newMonth = 12;
   }
   this.calculateEmptyGrids(newYear, newMonth);
   this.calculateDays(newYear, newMonth);
   this.onGetSignUp();   
   this.setData({
    cur_year: newYear,
    cur_month: newMonth
   })
  } else {
   let newMonth = cur_month + 1;
   let newYear = cur_year;
   if (newMonth > 12) {
    newYear = cur_year + 1;
    newMonth = 1;
   }
   this.calculateEmptyGrids(newYear, newMonth);
   this.calculateDays(newYear, newMonth);
   this.onGetSignUp();   
   this.setData({
    cur_year: newYear,
    cur_month: newMonth
   })
  }
 },

 //獲取當(dāng)前用戶該任務(wù)的簽到數(shù)組
 onGetSignUp:function(){
  var that = this;
  var Task_User = Bmob.Object.extend("task_user");
  var q = new Bmob.Query(Task_User);
  q.get(that.data.objectId, {
   success: function (result) {
    that.setData({
     signUp : result.get("signUp"),
     count : result.get("score")
    });
    //獲取后就判斷簽到情況
    that.onJudgeSign();
   },
   error: function (object, error) {
   }
  });  
 }
})

Calendar.json json文件

這里僅僅是改變了導(dǎo)航欄上的標(biāo)題文字

{
 "navigationBarTitleText": "打卡日歷"
}

關(guān)于怎么在微信小程序中實現(xiàn)打卡日歷功能問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI