小程序添加签到功能

This commit is contained in:
sugar1569 2019-04-02 17:30:43 +08:00
parent ca23e0e6ec
commit 163426ed78
8 changed files with 387 additions and 4 deletions

View File

@ -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
view/crmebN/pages/sign/sign.js Executable file
View File

@ -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 () {
}
})

View File

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

View File

@ -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>

File diff suppressed because one or more lines are too long

View File

@ -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
})
}
}
/**
* 生命周期函数--我的砍价
*/

View File

@ -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'>

View File

@ -36,5 +36,7 @@ min-width:26rpx;height:26rpx;text-align:center;line-height:26rpx;}
.icon-er{color: #20b3ff;font-size:46rpx!important;}
.contact-but{background-color:#ffffff;line-height:normal!important;}
.contact-but::after{border:none;}
.item-span{min-width:26rpx;height:26rpx;border-radius:50rpx;background-color:#ff3d3d;color: #fff;display:block;font-size:20rpx;text-align:center;line-height:26rpx;position:absolute;right:46rpx;top:0;}
.item-span{min-width:26rpx;height:26rpx;border-radius:50rpx;background-color:#ff3d3d;color: #fff;display:block;font-size:20rpx;text-align:center;line-height:26rpx;position:absolute;right:46rpx;top:0;}
.list-wrapper .item .user-sign{background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEiklEQVR4Xu1bzXXbOBCeAd/quvJhQ9+iSAVEpgpYuYLYFUTuwK4gSQXxVhC5AjsVWFuAZLoAaZWblT1YPsZ5wOQBJhWSAkXCpKGfR15JzM+H+QFmhggFn+9eq0dAnwlgzoQ4fuVP/YIkVy7/3m60BWOXCFBHwLNXo3G/CD8ssliuvfNaA0T4W9Eh+uSOJh+L0ly1fuY1PwLihyd28O/+aNwtwq8CoAh6O2sB9+1G/afjvCOAIwKo60BinJ9Jf9e5wJ3XPAfEt0XBja0nut0fTU51LqDiguN81vFDgDkCXP3B+dc9fzpPfrPkAmFQA0St4iEBxvnhX/50oAcgEhdKQiH0dx0A/7cbXeE41ytZEc11QTMGQJR4ltxbB0CoUCJQLwDIhWIEla0FAABC2aU6CwBmndYVALzL2vmtdYG4Yl/d4fgoCQDlVT6a86PAEdHZ/mhyPvOa91kxxIjXU9Kfu6PJ3p3XPEXEMOApRUxcN+TrDsdq86MWYArAvCbEgSTyyFhPngQD5RcHFWMlsxYE/qtAAKjXhOj/BKgTY9emgBcHINgVBOgLIQbMceoCoIcAhU5mmRgADJjkyfmcMdYlgJ6p8pJHOQBkSbvB7ysACseADd7dPKJVFlBZQNE0mMfONvibygUqF6hcIOMobKG+ZytE6O4K2TGgAuDlK7yVBVhCoHKBSC8hfz2gigGbGQNkyf6Hw947XNzKqnQeL9oZF7hvNxqPjN0sCiA5rXQnAJA7/+iwawBsL3Y9qBNmWcFOADDrNG9iyj9VZh/c4WRlA0d+tfUAzLzmF0DsJXeaiP6R7bKdtoDUkjfRbU2Irq7flwRkay1A9SkRviztsIHyW+sC6a06ekAuuiaTKNYsQLXVARomwun8V7a705odyPmBKX0rAMw6rSMgksFKRuUrdzg+zgpOuvfqoMPYDSI2ku+R4OQ5M0FWALjzmv/FhCbqu6PJiQkI2lwfEAj7jib0wm+tADDrtJZ6i3nT1ELQTusSAFTXNvFcuMPxUhrMC4YVAGKTIhHJ8ppteq4vPglmBQB1TneYD4B/JncmOpCgDXolpbs0i7ACgGSuorfDBksgyPkcIQ510Ts11wM91Lho5DnoZLmCNQAUCOm7KecJ3kQVSk935rl+FQhWAZCCJKY4IrKRX+PiUIKwdLWNa3DsDsdyZKeUxzoA6vjZackZ3vcaDa5qnJ8sXW2DD/MGTRNk1gJAAIJ+8IporpvqME2beUFYGwDqYMPYIOfUaKFcv1ExICpMcLT1EfF1qpCGt7u8O784YK27KpyaHqWEL6y8csV1AyCF0F9vy013az8IZZlm/IxgR/mNsYAQHGUJjHXlkOOeP51mgVbG+41wgTIUeS6NCoBNCILP3b0y1lUWUFnA71/tQouqRmQyx+SI1J+geVvQZfjqS9AI0u5l8vK1bAFe0895aXkJOa3SjP5xuvhjJL00ZVU2K8yiNYf4b3OGP05ZkbZ8JrFrdwyAp8aEc55SySlfFPsUL2qcn0brktqfp4ObW4+Iuivv8fYVMOZIRN8QccA47+sC+i+y8GF9qni6FAAAAABJRU5ErkJggg=='); background-repeat: no-repeat; background-size: 100% 100%; width: 45rpx;height: 45rpx;text-align:conter;display: inline-block}
.getPhoneNumber{font-size: 20rpx;}
@import "/pages/home/home.wxss";