mirror of
https://github.com/crmeb/CRMEB.git
synced 2025-12-26 04:50:16 +00:00
小程序添加签到功能
This commit is contained in:
parent
ca23e0e6ec
commit
163426ed78
@ -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
131
view/crmebN/pages/sign/sign.js
Executable 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 () {
|
||||
|
||||
}
|
||||
})
|
||||
3
view/crmebN/pages/sign/sign.json
Executable file
3
view/crmebN/pages/sign/sign.json
Executable file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"navigationBarTitleText": "签到"
|
||||
}
|
||||
45
view/crmebN/pages/sign/sign.wxml
Executable file
45
view/crmebN/pages/sign/sign.wxml
Executable 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>
|
||||
34
view/crmebN/pages/sign/sign.wxss
Executable file
34
view/crmebN/pages/sign/sign.wxss
Executable file
File diff suppressed because one or more lines are too long
@ -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
|
||||
})
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 生命周期函数--我的砍价
|
||||
*/
|
||||
|
||||
@ -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'>
|
||||
|
||||
@ -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";
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user