从零开始制作一款打卡类小程序

很久以前自学过一点html/css/javascript,刚巧微信小程序开发的主要知识储备也在这,这段日子有个在团学会的同学问我能不能给学院做一款小程序,主要是学院论坛和早起打卡这两个部分,我当时就答应了一句可以尝试着去做,没想到一发不可收拾,熬了一周的夜,终于把小程序的雏形做出来了,下面是小程序的界面效果图,源代码已开源至我的github,在这里只贴出主要的代码

一个类似论坛的社区,可发帖、评论、回复。    
打卡可换算积分,一天只能打卡一次,且有今日打卡排行榜实时展示。   
跑步也可换算积分,换算的规则男女有别。   
在这里插入图片描述
在这里插入图片描述

image

这个小程序的上线成本比较高,需要营业执照,还有因为论坛的存在,上线之后还需要工信部的备案资质,否则不予更新代码,所以我已经停止对它的维护了。开源这个项目的代码: github地址,欢迎star、fork!!!

今天我主要讲述其中的早起打卡部分的制作,为了后期维护,我已经单独把这部分做成一个小程序,小程序名叫“一见打卡”,现已上线,欢迎体验。

核心代码

talk is cheap,show the code.

核心代码

punch.js

var app = getApp();
var date;
var allowlog = 1;
var Bmob = require('../../utils/bmob.js');
Page({
 
  /**
   * 页面的初始数据
   */
  data: {
   newList: [],
  },

  btn_click: function(e){
    if (allowlog == 1){
      allowlog = 0;
      wx.getStorage({
        key: 'user_id',
        success: function (res) {
          var user_id = new Bmob.User();
          user_id.id = res.data;
          wx.getStorage({
            key: 'my_nick',
            success: function (ress) {
              var mydate = new Date();
              var year = mydate.getFullYear();
              var month = mydate.getMonth() + 1;
              var day = mydate.getDate();
              var date = year + "年" + month + "月" + day + "日";
              var hour = mydate.getHours(); //获取当前小时数(0-23)
              var minute = mydate.getMinutes(); //获取当前分钟数(0-59)
              var second = mydate.getSeconds(); //获取当前秒数(0-59)
              var time = hour + "时" + minute + "分" + second + "秒";
              var avatar = wx.getStorageSync("my_avatar");
              var Punch = Bmob.Object.extend("punch");
              var punch = new Punch();
              var me = ress.data;
              var query = new Bmob.Query(Punch);
              query.equalTo("nickname", me);
              query.equalTo("date", date);
              // 查询所有数据
              query.find({
                success: function (results) {
                  console.log("共查询到 " + results.length + " 条记录");
                  if (results.length == 0) {
                    if (hour >= 6) {
                      if (hour < 8) {
                        var intger;
                        if (hour < 7) {
                          if (minute <= 20) {
                            intger = 3;
                          }
                          else if (minute <= 40) {
                            intger = 2.5;
                          }
                          else {
                            intger = 2;
                          }
                        }
                        else if (hour < 8) {
                          if (minute <= 20) {
                            intger = 1.5;
                          }
                          else if (minute <= 40) {
                            intger = 1;
                          }
                          else {
                            intger = 0.5;
                          }
                        }
                        wx.showToast({
                          title: '打卡成功+' + intger + "分",
                          icon: 'success'
                        })
                        wx.getStorage({
                          key: 'my_username',
                          success: function (ress) {
                            if (ress.data) {
                              var my_username = ress.data;
                              wx.getStorage({
                                key: 'user_openid',
                                success: function (openid) {
                                  var openid = openid.data;
                                  var user = Bmob.User.logIn(my_username, openid, {
                                    success: function (users) {
                                      var score = users.get('score');
                                      score = score + intger;
                                      users.set('score', score);
                                      users.save(null, {
                                        success: function (user) {
                                        },
                                        error: function (error) {
                                          console.log(error)
                                        }
                                      });
                                    }
                                  });
                                }, function(error) {
                                  console.log(error);
                                }
                              })
                            }

                          }
                        })
                        punch.set('nickname', me);
                        punch.set('user_id', user_id);
                        punch.set('date', date);
                        punch.set('avatar', avatar)
                        punch.set('time', time);
                        console.log(me, user_id);
                        punch.save(null, {
                          success: function (result) {
                            console.log('success');
                            allowlog = 1;

                          },
                          error: function (result, error) {
                            console.log(result, error, "failure")
                          }
                        })
                      }
                      else {
                        wx.showToast({
                          title: '已过打卡时间',
                          icon: 'loading'
                        })
                      }
                    }
                    else {
                      wx.showToast({
                        title: '还没到打卡时间',
                        icon: 'loading'
                      })
                    }


                  }
                  else {
                    allowlog = 1;
                    wx.showToast({
                      title: '重复打卡',
                      icon: 'loading'
                    })
                  }
                },
                error: function (error) {
                  console.log("查询失败");
                }
              });
            }
          })

        },
      })
    }
    else{
      wx.showToast({
        title: '点的太快了',
        icon: 'loading'
      })
    }
    
  },
  tempData: function () {
    var that = this;
    var Punch = Bmob.Object.extend("punch");
    var query = new Bmob.Query(Punch);
    var mydate = new Date();
    var year = mydate.getFullYear();
    var month = mydate.getMonth() + 1;
    var day = mydate.getDate();
    var date = year + "年" + month + "月" + day + "日";
    query.equalTo("date", date);
    query.limit(100);
    var results = [];
    query.find({
      success: function (result) {
        for (var i = 0; i < result.length; i++) {
          console.log('共有打卡记录:', result.length)
          var object = result[i];
          object.set('time', object.createdAt.substring(11, 19));
          object.set('rank', i + 1);
          results[i] = object;
        }
        console.log(results);
        that.setData({
          list: results
        });
      }
    })

  },
  onLoad: function () {
    this.tempData();
  },
 
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
 
  },
 
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
 
  },
 
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
 
  },
 

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
    this.tempData();
    wx.stopPullDownRefresh();
  },

  onShareAppMessage: function () {
    return {
      title: '快来打卡赢积分',
      imageUrl: '../../static/images/tao.png'
    }
  },
 
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
 
  }
})

pun.wxml

<view class="title">今日打卡榜</view>
<view class="item-box">
  <view class="items">
    <view wx:for="{{list}}"  wx:key="{{index}}"  class="item">
     
      <view data-index="{{index}}" class="inner txt">
      <i>{{item.rank}}</i>
      <image class="item-icon" mode="widthFix" src="{{item.avatar}}"></image>
       <i> {{item.nickname}}</i>
      <span class="item-data">
    
       <i class="rankpace"> 打卡时间:{{item.time}}</i>
        <!-- <span class="rankxin">{{item.xin}}</span> -->
      </span>
      
      </view>
     
    </view>
  </view>
</view><!--pages/ranking/ranking.wxml-->

<button  class="circle" bindtap="btn_click">开始打卡</button>

punch.css

page {
  background: #fff;
  padding: 0 0rpx 0;
  width: 100%;
  height: 100%;
  box-sizing: border-box;
  background-size: cover;
  background-image: url(http://bmob-cdn-21956.b0.upaiyun.com/2018/11/08/e16028434063466d80d9d79f281ce145.jpg);
}
/* pages/leftSwiperDel/index.wxss */
view{
    box-sizing: border-box;
}
.item-box{
    width: 700rpx;
    height: 10rpx;
    margin: 0 auto;
    padding:40rpx 0;
}
.title{
  margin-top: 12px;
  font-size: 20px;
  height: 12px;
  text-align: center;  
}
.items{
    width: 100%;
}
.item{
    position: relative;
    border-top: 2rpx solid #eee;
    height: 120rpx;
    line-height: 120rpx;
    overflow: hidden;
     
}
 
 
.item:last-child{
    border-bottom: 2rpx solid #eee;
}
.inner{
    position: absolute;
    top:0;
}
.inner.txt{
    background-color: #fff;
    width: 100%;
    z-index: 5;
    padding:0 10rpx;
    transition: left 0.2s ease-in-out;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
}

.item-icon{
    width: 64rpx;
    height: 64rpx;
    vertical-align: middle;
    margin-right: 16rpx;
    margin-left:13px;
    border-radius:50%;
 
}
 
.item-data{
  float: right;
  margin-right:5%;}
 
.rankpace{
  color: #87CEFA;
}
.circle{
    right: 35px;
    bottom: 35px;         
    width: 110px;
    background-color: #87CEFA;
    height: 110px;
    padding-top: 28px;
    color: white;
    background-size: cover;
    position: fixed;
    z-index: 9999;
    font-size: 20px;
    text-align: center;
    border: 0 solid #ffffff;
    border-radius: 500px;
    box-shadow: 4px 1px 1px #cccccc;
}

效果图

小程序界面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

上面的积分规则可以通过修改punch.js来实现自定义。

分享界面

在这里插入图片描述

云后台

在这里插入图片描述

如果你也想开发一款这样的小程序,从代码到上线,欢迎联系2391527690@qq.com

coding不易,赞赏一下呗。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352