소스 검색

小程序添加签到功能

sugar1569 6 년 전
부모
커밋
163426ed78

+ 120 - 1
application/routine/model/user/UserSign.php

@@ -40,7 +40,7 @@ class UserSign
         $max = SystemConfigService::get('sx_sign_max_int')?:5;
         $integral = rand($min,$max);
         ModelBasic::beginTrans();
-        $res1 = UserBill::income('用户签到',$uid,'integral','sign',$integral,0,$userInfo['integral'],'签到获得'.floatval($integral).'积分');
+        $res1 = UserBill::income('用户签到',$uid,'integral','sign',$integral,0,bcadd($userInfo['integral'],$integral,2),'签到获得'.floatval($integral).'积分');
         $res2 = User::bcInc($uid,'integral',$integral,'uid');
         $res = $res1 && $res2;
         ModelBasic::checkTrans($res);
@@ -49,4 +49,123 @@ class UserSign
         else
             return false;
     }
+    public static function signFoodie($uid,$sign_list){
+        ModelBasic::beginTrans();
+        $user=User::where(['uid'=>$uid,'status'=>1])->field(['integral','sign_num','sign_time','sign_count'])->find();
+        if(!$user) return false;
+        $sign_num=0;
+        //检测昨天是否签到
+        if(User::where(['uid'=>$uid,'status'=>1])->whereTime('sign_time','yesterday')->count()){
+            if($user->sign_num > (count($sign_list) -1)) $user->sign_num=0;
+        }else{
+            //如果昨天没签到,回退到第一天
+            $user->sign_num=0;
+        }
+        foreach ($sign_list as $key=>$item){
+            if($key==$user->sign_num){
+                $sign_num=$item['sign_num'];
+                break;
+            }
+        }
+        $user->sign_time=time();
+        $user->sign_num+=1;
+        $user->sign_count+=1;
+        if($user->sign_num == count($sign_list)){
+            $res1 = UserBill::income('连续签到奖励',$uid,'integral','sign',$sign_num,0,bcadd($user->integral,$sign_num),'签到获得'.floatval($sign_num).'积分');
+        }else{
+            $res1 = UserBill::income('用户累计签到第'.$user->sign_count.'天',$uid,'integral','sign',$sign_num,0,bcadd($user->integral,$sign_num),'签到获得'.floatval($sign_num).'积分');
+        }
+        $res2= User::bcInc($uid,'integral',$sign_num,'uid');
+        $res3=$user->save();
+        $res = $res1 && $res2 && $res3;
+        ModelBasic::checkTrans($res);
+        if($res)
+            return $sign_num;
+        else
+            return false;
+    }
+
+    public static function getSignLog($where,$gruop = false){
+        $userbill = UserBill::where(['uid'=>$where['uid'],'category'=>'integral'])->order('add_time desc');
+        $userinfo = [];
+        if($gruop == false){
+            $list = $userbill->where('type','sign')->page((int)$where['page'],(int)$where['limit'])->select();
+            count($list) && $list=$list->toArray();
+            $page=$where['page']+1;
+            foreach ($list as &$item) $item['add_time']=date('Y-m-d H:i:s',$item['add_time']);
+        }else{
+            $list=$userbill->where('type','in','sign,clear,recommend')->field(['FROM_UNIXTIME(add_time,"%Y-%m") as time','group_concat(id SEPARATOR ",") ids'])
+                ->group('time')
+                ->order('time asc')
+                ->page((int)$where['page'],(int)$where['limit'])
+                ->select();
+            count($list) && $list=$list->toArray();
+            $sign_list = [];
+            foreach ($list as $item){
+                $value['month']=self::getUtf8Month($item['time']);
+                $value['list']=($val=UserBill::where('id','in',$item['ids'])->order('add_time desc')
+                    ->field(['FROM_UNIXTIME(add_time,"%Y/%m/%d %H:%i:%s") as time','title','number'])
+                    ->select()) && count($val) ? $val->toArray() : [];
+                $sign_list[]=$value;
+            }
+            $list = $sign_list;
+            if($where['page']==1){
+                //总共积分
+                $userinfo['integral'] = User::where(['uid' => $where['uid']])->value('integral');
+                //昨日积分
+                $userinfo['yesterday_integral'] = UserBill::where(['uid' => $where['uid'], 'category' => 'integral'])->where('type','in',['sign','clear','recommend'])->value('number');
+                //本周积分
+                $userinfo['week_integral'] = UserBill::where(['uid' => $where['uid'], 'category' => 'integral'])->where('type','in',['sign','clear','recommend'])->whereTime('add_time', 'week')->value('number');
+                //排名
+                $userinfo['ranking'] = User::where('integral', '>', $userinfo['integral'])->count();
+                $userinfo['ranking'] += 1;
+            }
+            $page=$where['page']+1;
+        }
+        return compact('list','page','userinfo');
+    }
+
+    public static function getUtf8Month($time){
+        $num=['01'=>'一', '02'=>'二', '03'=>'三', '04'=>'四', '05'=>'五',
+            '06'=>'六', '07'=>'七', '08'=>'八', '09'=>'九','10'=>'十','11'=>'十一','12'=>'十二'];
+        list($year,$month)=explode('-',$time);
+        return isset($num[$month]) ? $num[$month].'月' : '';
+    }
+
+    /*
+     * 等级计算 返回当前等级
+     * */
+    public static function getdiscount(array $sign_deploy,$integral){
+        $grade_name='';
+        $discount=0;
+        $sign_grade=0;
+        $pic='';
+        $site_url=SystemConfigService::get('site_url');
+        foreach ($sign_deploy as $item){
+            list($min,$max)=strstr($item['sign_num'],'-') ? explode('-',$item['sign_num']) : [$item['sign_num'],''];
+            if($integral <= $min && $max==''){
+                $grade_name=$item['sign_name'];
+                $discount=bcdiv($item['discount'],10,1);
+                $sign_grade=$item['sign_grade'];
+                $pic=$site_url.$item['pic'];
+                break;
+            }else if($integral >= $min && $integral <= $max) {
+                $grade_name = $item['sign_name'];
+                $discount = bcdiv($item['discount'], 10, 1);
+                $sign_grade = $item['sign_grade'];
+                $pic = $site_url . $item['pic'];
+                break;
+            }else if($integral > $max && $integral > $min && $max!=''){
+                $count=count($sign_deploy);
+                $grade_name=$sign_deploy[$count-1]['sign_name'];
+                $discount=bcdiv($sign_deploy[$count-1]['discount'],10,1);
+                $sign_grade=$sign_deploy[$count-1]['sign_grade'];
+                $pic=$site_url.$sign_deploy[$count-1]['pic'];
+                break;
+            }
+        }
+        $pic=strstr($pic,'s_') ? str_replace('s_','',$pic) : $pic;
+        return [$grade_name,$discount,$sign_grade,$pic];
+    }
+
 }

+ 131 - 0
view/crmebN/pages/sign/sign.js

@@ -0,0 +1,131 @@
+// pages/sign/sign.js
+var app = getApp();
+Page({
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    userinfo:{},
+    sign_day_num: [],
+    sign_index:0,
+    sign_count:[],
+    day:'',
+    sign_list:[],
+    where:{
+      page:1,
+      limit:20,
+    },
+    title:'加载更多',
+    loaged:false,
+  },
+  get_sign_list:function(){
+    var that = this;
+    if (this.data.loaged==true) return ;
+    app.baseGet(app.U({ a: 'get_sign_log', q: this.data.where}), function (res) {
+      var sign_list = that.data.sign_list, leng = res.data.list.length;
+      for (var i = 0; i < leng;i++){
+        sign_list.push(res.data.list[i]);
+      }
+      that.setData({
+        sign_list: sign_list,
+        where: { page: res.data.page,limit:20}
+      })
+      if (res.data.list.length < that.data.where.limit){
+        that.setData({
+          loaged:true,
+          title:'没有更多了',
+        })
+      }
+    })
+  },
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    app.setUserInfo();
+    app.setBarColor();
+    var that = this;
+    app.baseGet(app.U({ a: 'get_user_info', q: { is_sign: 1, discount:1}}), function (res) {
+      var sign_count = res.data.sign_count;
+      that.setData({ 
+        userinfo: res.data, 
+        sign_index: res.data.sign_num, 
+        sign_count: that.prefixInteger(sign_count, 4).split('')
+        });
+    });
+    app.baseGet(app.U({ a: 'get_sign_list' }), function (res) {
+      that.setData({ 
+        sign_day_num: res.data,
+        day: app.rp(res.data.length)
+      });
+    });
+    this.get_sign_list();
+  },
+  prefixInteger:function(num,length) {
+    return (Array(length).join('0') + num).slice(-length);
+  },
+  sign:function(){
+    var that = this;
+    app.baseGet(app.U({ a: 'user_sign' }), function (res) {
+      var userinfo=that.data.userinfo;
+      userinfo.is_sign=true;
+      that.setData({
+        sign_index: (that.data.sign_index + 1) > that.data.sign_day_num.length ? 1 : that.data.sign_index + 1,
+        sign_count: that.prefixInteger(that.data.userinfo.sign_count+1, 4).split(''),
+        userinfo: userinfo
+      });
+      app.Tips({
+        title:res.msg,
+        icon:'success'
+      });
+    });
+  },
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+    
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+    this.get_sign_list();
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  }
+})

+ 3 - 0
view/crmebN/pages/sign/sign.json

@@ -0,0 +1,3 @@
+{
+  "navigationBarTitleText": "签到"
+}

+ 45 - 0
view/crmebN/pages/sign/sign.wxml

@@ -0,0 +1,45 @@
+<view class='sign'>      
+    <view class='header'>
+       <view class='top flex'>
+          <view class='left flex'>
+             <view class='pictrue'><image src='{{userinfo.avatar}}'></image></view>
+             <view class='text'>
+                 <view>{{userinfo.nickname}}</view>
+                 <view class='Paragraph'>{{userinfo.integral}}</view>
+             </view>
+          </view>
+          <navigator class='right flex' url='/pages/integral-con/integral-con'>
+             <view class='ico'><image src='/images/fenlei.png'></image></view>
+             <view>明细</view>
+          </navigator>
+       </view>
+   </view>
+   <view class='blocks'>
+      <view class="signbtn">
+        <button class='but color' hover-class='none' wx:if="{{userinfo.is_sign}}">已签到</button>
+        <button class='but' bindtap='sign' wx:else>立即签到</button>
+      </view>
+      <view class='lock'></view>
+   </view>
+   <view class='blocks blocks2'>
+      <view class='tip'>已累计签到</view>
+      <view class='list2 flex'>
+         <view class='item'>{{sign_count[0]}}</view>
+         <view class='item'>{{sign_count[1]}}</view>
+         <view class='item'>{{sign_count[2]}}</view>
+         <view class='item'>{{sign_count[3]}}</view>
+         <view class='data'>天</view>
+      </view>
+      <view class='tip2'>据说累计签到第{{day}}天可获得超额积分,一定要坚持签到哦~~~</view>
+      <view class='list3'>
+         <view class='item flex' wx:for="{{sign_list}}" wx:key="key">
+            <view>
+               <view class='name line1'>{{item.title}}</view>
+               <view class='data'>{{item.add_time}}</view>
+            </view>
+            <view class='num'>+{{item.number}}</view>
+         </view>
+         <view class='loading'>{{title}}<text hidden='{{loaged}}' class='iconfont icon-xiangyou'></text></view>
+      </view>
+   </view>
+</view>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 34 - 0
view/crmebN/pages/sign/sign.wxss


+ 42 - 0
view/crmebN/pages/user/user.js

@@ -124,6 +124,48 @@ Page({
       complete: function (res) { },
     })
   },
+  getPhoneNumber: function (res){
+    var that = this;
+    if (res.detail.errMsg == "getPhoneNumber:ok"){
+        var pdata = {};
+        pdata.iv = encodeURI(res.detail.iv);
+        pdata.encryptedData = res.detail.encryptedData;
+        pdata.session_key = wx.getStorageSync('session_key');//获取上一步获取的session_key
+        wx.request({
+          url: app.globalData.url + '/routine/auth_api/bind_mobile?uid=' + app.globalData.uid,
+          method: 'post',
+          dataType  : 'json',
+          data: {
+            info: pdata
+          },
+          success: function (res) {
+            if(res.data.code == 200){
+              wx.showToast({
+                title: '绑定成功',
+                icon: 'success',
+                duration: 2000
+              })
+              that.setData({
+                ['userinfo.phone'] : true
+              })
+
+            }else{
+              wx.showToast({
+                title: '绑定失败',
+                icon: 'none',
+                duration: 2000
+              })
+            }
+          },
+        })
+    } else {
+      wx.showToast({
+        title: '取消授权',
+        icon: 'none',
+        duration: 2000
+      })
+    }
+  }
    /**
    * 生命周期函数--我的砍价
    */

+ 9 - 2
view/crmebN/pages/user/user.wxml

@@ -3,6 +3,7 @@
   
   <image src='{{userinfo.avatar}}' class='avatar'></image>
   <view class='name'>{{userinfo.nickname}}</view>
+  <button class='getPhoneNumber' wx:if="{{!userinfo.phone}}"  open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">绑定手机号</button> 
   <!-- <text wx:if="{{userinfo.level==0}}">[普通用户]</text> -->
   <view class='notice'>
     <view class='iconfont '></view>
@@ -77,13 +78,13 @@
       <view class='item' bindtap='extension' wx:if="{{userinfo.is_promoter && userinfo.statu == 1}}">
         <navigator hover-class="none">
           <view class='iconfont icon-wodetuiguangren'></view>
-          <view class='text'>我推广人</view>
+          <view class='text'>我推广人</view>
         </navigator>
       </view>
       <view class='item' bindtap='extension' wx:elif="{{userinfo.statu == 2}}">
         <navigator hover-class="none">
           <view class='iconfont icon-wodetuiguangren'></view>
-          <view class='text'>我推广人</view>
+          <view class='text'>我推广人</view>
         </navigator>
       </view>
       <view class='item' bindtap='myextension' wx:if="{{userinfo.is_promoter && userinfo.statu == 1}}">
@@ -124,6 +125,12 @@
           <view class='text'>地址管理</view>
         </navigator>
       </view>
+      <view class='item'>
+        <navigator hover-class="none" url="/pages/sign/sign">
+          <view class='user-sign'></view>
+          <view class='text'>我要签到</view>
+        </navigator>
+      </view>
     </view>
   </view>
   <view class='item-box orders'>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 1
view/crmebN/pages/user/user.wxss