亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

微信小程序實現打卡日歷功能

2020-03-21 16:06:10
字體:
來源:轉載
供稿:網友

生活中有各種可以打卡的app,例如背單詞打卡什么的,本人覺得很有意思,于是本人在大二時做了一款誠信狀打卡的微信小程序,這里講述一下編寫的過程。

先說一下開發環境:用的是微信web開發工具開發的,后臺采用了Bmob后臺,比較方便。

先展示一下成果:

微信小程序,打卡,日歷

微信小程序,打卡,日歷

話不多說,直接上代碼,里面也有挺多的注釋,以防自己忘記,當然各位如果直接復制過去肯定不能有當前的效果,注意后臺數據的交互,不過做一個界面還是沒有問題的。

Calendar.wxml 頁面文件 

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

<!--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}}">  </text>      </view>      <!-- 每個月份的有數字的單元格 -->      <view class='cell' wx:else>       <!-- 當前日期已簽到 -->       <view wx:if="{{days[j+k].isSign == true}}" style='background-color:#83C75D' class='cell'>        <text>{{days[j+k].date}}</text>       </view>       <!-- 當前日期未簽到 -->       <view wx:else>        <text>{{days[j+k].date}}</text>       </view>      </view>     </view>    </view>   </view>  </view> </view> <!-- 堅持打卡天數 --> <view class='count'>  <text>截至目前,你已堅持打卡</text>  <view class='daynumber'>  <text class='number'>{{count}}</text>  <text class='day'>天</text>  </view>    <text>請再接再厲,繼續努力</text> </view></view>

Calendar.wxss 樣式文件 

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

 

/* 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的操作了,感興趣的同學可以去參考它的官方文檔。 
然后里面主要是對上一個月、下一個月的點擊函數進行處理,以及對某年某月的每個日期進行初始化(尤其是每個月前的可能有的幾個空格進行了處理),然后就是判斷某個日期在后臺數據中是否有打卡。

 

// pages/Calendar/Calendar.js//打卡日歷頁面var util = require('../../utils/util.js');var Bmob = require('../../utils/bmob.js');Page({ /**  * 頁面的初始數據  */ data: {  objectId:'',  days:[],  signUp:[],  cur_year:0,  cur_month:0,  count:0 }, /**  * 生命周期函數--監聽頁面加載  */ onLoad: function (options) {  this.setData({objectId : options.objectId});   //獲取當前年月   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);  //獲取當前用戶當前任務的簽到狀態  this.onGetSignUp();  this.setData({   cur_year,   cur_month,   weeks_ch  }) }, /**  * 生命周期函數--監聽頁面初次渲染完成  */ onReady: function () { }, /**  * 生命周期函數--監聽頁面顯示  */ onShow: function () { }, /**  * 生命周期函數--監聽頁面隱藏  */ onHide: function () { }, /**  * 生命周期函數--監聽頁面卸載  */ onUnload: function () { }, /**  * 頁面相關事件處理函數--監聽用戶下拉動作  */ onPullDownRefresh: function () { }, /**  * 頁面上拉觸底事件的處理函數  */ onReachBottom: function () { }, /**  * 用戶點擊右上角分享  */ onShareAppMessage: function () { }, // 獲取當月共多少天 getThisMonthDays:function(year, month){   return new Date(year, month, 0).getDate() }, // 獲取當月第一天星期幾 getFirstDayOfWeek:function(year, month) {  return new Date(Date.UTC(year, month - 1, 1)).getDay(); }, // 計算當月1號前空了幾個格子,把它填充在days數組的前面 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: []   });  } }, // 繪制當月天數占的格子,并把它放到days數組中 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  }); }, //匹配判斷當月與當月哪些日子簽到打卡 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   })  } }, //獲取當前用戶該任務的簽到數組 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文件 

這里僅僅是改變了導航欄上的標題文字

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人午夜免费视在线看片| 久久久成人的性感天堂| 亚洲缚视频在线观看| 亚洲精品av在线播放| 91人人爽人人爽人人精88v| 亚洲欧美日韩国产精品| 久久免费视频网| 青青精品视频播放| 久久精品国产一区二区三区| 性欧美暴力猛交69hd| 精品一区二区亚洲| 欧美又大又硬又粗bbbbb| 精品一区二区亚洲| 国产精品成人观看视频国产奇米| 欧美日韩免费在线观看| 高清在线视频日韩欧美| 38少妇精品导航| 亚洲精品影视在线观看| 亚洲免费av电影| 一本大道香蕉久在线播放29| 国产999精品久久久| 这里只有精品视频| 热门国产精品亚洲第一区在线| 国产一区私人高清影院| 日韩精品极品在线观看| 日本19禁啪啪免费观看www| 欧美视频免费在线观看| 欧美性视频精品| 欧美成人午夜激情| 久久精品男人天堂| 欧美国产日韩在线| 亚洲国产精品国自产拍av秋霞| 夜夜嗨av一区二区三区四区| 国产亚洲精品美女久久久| 欧美人在线观看| 久久久久久成人| 乱亲女秽乱长久久久| 黑人巨大精品欧美一区二区免费| 国产精品香蕉在线观看| 亚洲国产天堂久久国产91| 精品久久久久久久久久久久久| 青青久久av北条麻妃黑人| 国产午夜精品视频免费不卡69堂| 亚洲人成电影在线观看天堂色| 中文字幕亚洲一区在线观看| 国产激情综合五月久久| 成人精品一区二区三区| 91黄色8090| 5566日本婷婷色中文字幕97| 国产va免费精品高清在线观看| 亚洲精品少妇网址| 精品久久中文字幕| 在线成人免费网站| 欧美精品亚州精品| 欧美日韩激情美女| 最近2019年手机中文字幕| 热99精品里视频精品| 大伊人狠狠躁夜夜躁av一区| 欧美性猛交xxxxx水多| 欧美第一淫aaasss性| 欧洲美女免费图片一区| 最近2019中文字幕mv免费看| 亚洲最大福利视频网站| 欧美在线视频免费| 久久偷看各类女兵18女厕嘘嘘| 亚洲精品99999| 久久久久久国产精品三级玉女聊斋| 亚洲欧美制服中文字幕| 欧美精品少妇videofree| 国产精品欧美日韩一区二区| 国产99视频在线观看| 国产一区二区三区在线播放免费观看| 欧美激情在线狂野欧美精品| 亚洲一级黄色av| 欧美裸体xxxx极品少妇| 亚洲成在人线av| 91网在线免费观看| 91精品免费视频| 一级做a爰片久久毛片美女图片| 精品爽片免费看久久| 成人午夜一级二级三级| 欧美国产日产韩国视频| 91九色单男在线观看| 亚洲男人天堂九九视频| 国产日韩欧美日韩| 亚洲日韩第一页| 欧美激情一区二区三级高清视频| 麻豆国产va免费精品高清在线| 国产欧美日韩中文| 欧美激情乱人伦一区| 中文字幕无线精品亚洲乱码一区| 欧美大尺度在线观看| 亚洲精品自拍第一页| 日本乱人伦a精品| 日韩av电影院| 国产精品视频免费在线| 在线播放精品一区二区三区| 欧美极品少妇xxxxⅹ免费视频| 日韩视频免费大全中文字幕| 国产精品美女久久久久av超清| 欧美日韩在线视频首页| 伊人青青综合网站| 亚洲成人激情小说| 国产精品福利无圣光在线一区| 亚洲人成自拍网站| 欧美日韩在线视频一区二区| 亚洲成人激情在线| 91久久精品国产91久久| 欧美中文字幕在线| 国产在线观看精品| 国产精品久久久久9999| 国产精品444| 亚洲一区二区三区视频| 久久久久国产精品免费网站| 亚洲乱码国产乱码精品精天堂| 欧美日韩中文字幕综合视频| 亚洲大胆人体av| 久久久久久久久久久久久久久久久久av| 中文字幕亚洲第一| 色中色综合影院手机版在线观看| 欧美日产国产成人免费图片| 欧美一级高清免费| 亚洲欧美精品一区二区| 96pao国产成视频永久免费| 亚洲精选一区二区| 日韩电影在线观看中文字幕| 日韩美女在线观看一区| 国产精品美女久久| 国产精品成人久久久久| 日韩中文理论片| 国产精品69精品一区二区三区| 九九视频这里只有精品| 国产精品黄视频| 日韩一区二区三区国产| 91久久精品日日躁夜夜躁国产| 久久九九热免费视频| 高跟丝袜一区二区三区| 97久久久免费福利网址| 久久国产精品久久久久久久久久| 久久精品99久久久久久久久| 色999日韩欧美国产| 欧美日韩一区二区三区在线免费观看| 日本sm极度另类视频| 日韩一区av在线| 97av在线播放| 久久99精品国产99久久6尤物| 中文字幕日韩精品在线观看| 日韩美女免费线视频| 91欧美精品午夜性色福利在线| 亚洲偷熟乱区亚洲香蕉av| 国产精品视频区1| 欧美精品成人91久久久久久久| 日韩在线视频观看正片免费网站| 福利视频一区二区| 日韩电视剧在线观看免费网站| 亚洲奶大毛多的老太婆| 国产性猛交xxxx免费看久久| 久久久久久久999精品视频| 亚洲图中文字幕| 国产网站欧美日韩免费精品在线观看| 久久国产精品影片| 国产男女猛烈无遮挡91| 亚洲aaa激情| 伊人久久久久久久久久|