php签到获积分,PHP TP5 文章评论+积分+签到

头一次做这种带评论带积分的公众号,记录一下,如果有大神看出漏洞了求指教23333

1.操作积分方法函数:

public function makeIntegral($openid,$cate,$num,$remark,$a_id=‘‘){$uid = $this->getUserId($openid);$oldScore = Db::name(‘member‘)->where([‘id‘=>$uid])->value(‘integral‘);

Db::startTrans();try{$map =[‘u_id‘ =>$uid, #用户id

‘openid‘ =>$openid, #用户openid

‘cate‘ =>$cate, #1+ 2-

‘num‘ =>$num, #分值

‘remark‘ =>$remark, #文字记录

‘ctime‘ =>time(), #积分操作时间

‘status‘ =>1, #数据状态

‘a_id‘ =>$a_id];if($cate==1){$newScore = $oldScore+$num;

}else{$newScore = $oldScore-$num;#新的积分不能为负数 否则返回扣分失败

if($newScore<0){Log::write(‘积分扣除失败,您没有足够的积分。时间:‘.date(‘Y-m-d H:i:s‘).‘,openid:‘.$openid,‘info‘);return [‘code‘=>500,‘msg‘=>‘积分扣除失败,您没有足够的积分。‘];

}

}$add = Db::name(‘integral‘)->insert($map);$Add = Db::name(‘member‘)->where([‘openid‘=>$openid])->update([‘integral‘=>$newScore]);

Db::commit();if($add && $Add){return [‘code‘=>200,‘msg‘=>‘积分操作成功‘];

}else{return [‘code‘=>500,‘msg‘=>‘积分操作失败‘];

}

}catch(\Exception $e){

Db::rollback();return [‘code‘=>500,‘msg‘=>‘错误‘];

}

}

这个方法中要操作两张表,一张是积分表,新增数据,一张是用户表,修改用户的积分值,所以用了tp5的事务,操作错误的时候方便回滚。cate是分数操作类别,1是加分操作,2是减分操作。

2.签到方法

/**

* 签到方法

* @return \think\response\Json*/

public functionsign_in(){$pub=newPublicModel();$openid = session(‘userInfo.openid‘);$u_id = $pub->getUserId($openid);$today = date(‘Y-m-d‘); #今天的年月日

$signList = $pub->getSignRecored($u_id); #之前签到的时间戳

$continueDay = Db::name(‘member‘)->where([‘openid‘=>$openid,‘status‘=>1])->value(‘day‘); #连续多少天

if(($continueDay+1)%7==0 && ($continueDay+1)<=7){#满一周

$today_sign_integral=10;

}else if(($continueDay+1)%15==0 && ($continueDay+1)/15==1){#第一次满15天

$today_sign_integral=20;

}else if(($continueDay+1)%30==0 && ($continueDay+1)/30==1){#第一次满30天

$today_sign_integral=50;

}else{$today_sign_integral=($continueDay%7)+1;

}if(!empty($signList)){#如果签到列表不为空,则查询今天是否完成签到

foreach ($signList as $k=>$v){$date = date(‘Y-m-d‘,$v[‘ctime‘]);if($date==$today){#今天签到过

$arr = [‘code‘=>300,‘msg‘=>‘您今天已经完成签到‘];return json($arr);

}

}

}

Db::startTrans();try{$data =[‘u_id‘=>$u_id,

‘ctime‘=>time(),

‘integral‘=>$today_sign_integral];$signIn = Db::name(‘sign_in‘)->insert($data);#签到表添加

$addScore = $pub->makeIntegral($openid,1,$today_sign_integral,‘签到加分‘,‘‘);#积分记录修改

$addContinueDay = Db::name(‘member‘)->where([‘status‘=>1,‘openid‘=>$openid])->update([‘day‘=>($continueDay+1)]);

Db::commit();if($signIn&&$addScore&&$addContinueDay){return json([‘code‘=>200,‘msg‘=>‘签到成功‘,‘num‘=>$today_sign_integral]);

}else{return json([‘code‘=>500,‘msg‘=>‘操作异常‘]);

}

}catch (\Exception $e){

Db::rollback();return json([‘code‘=>‘500‘,‘msg‘=>‘false‘]);

}

}

甲方粑粑要求签到积分,一周一轮,第一天签到+1分,连续第二天签到+2分,连续第三天签到+3分 以此类推,第一次满连续七天签到的当天可获得10分,第一次满连续签到15天的当天可获得20分,第一次满连续签到30天的当天可获得50分。所以我在用户表里给了个字段记录签到天数,有个检查是否断签的方法,断签就把字段清零。签到在签到表里记录,然后加分。

3.检查是否断签

/**

* 检查是否断签

* @return array

* @throws \think\Exception

* @throws \think\exception\PDOException*/

public function checkContinueSign($openid){$pub = newPublicModel();$u_id = $pub->getUserId($openid);try{#判断上一次的签到是否在昨天之内

$signList = Db::name(‘sign_in‘)->where([‘u_id‘=>$u_id,‘status‘=>1])->order([‘ctime‘=>‘desc‘])->select();if(!$signList){$arr = [‘code‘=>400,‘msg‘=>‘第一天签到‘];return $arr;

}$last_sign = Db::name(‘sign_in‘)->where([‘u_id‘=>$u_id,‘status‘=>1])->order([‘ctime‘=>‘desc‘])->limit(0,1)->value(‘ctime‘);/**昨天的时间戳时间范围*/

$t = time();$last_start_time = mktime(0,0,0,date("m",$t),date("d",$t)-1,date("Y",$t));$last_end_time = mktime(23,59,59,date("m",$t),date("d",$t)-1,date("Y",$t));/**今天的时间戳时间范围*/

$now_start_time = mktime(0,0,0,date("m",$t),date("d",$t),date("Y",$t));$now_end_time = mktime(23,59,59,date("m",$t),date("d",$t),date("Y",$t));if($last_sign>$last_start_time && $last_sign < $last_end_time){#昨天签到了

$arr = [‘code‘=>200,‘msg‘=>‘连续签到‘];

}elseif($last_sign>$now_start_time && $last_sign < $now_end_time){#今天的签到已完成

$arr = [‘code‘=>300,‘msg‘=>‘您今天已经完成签到‘];

}else{#今天没签到,断签

Db::name(‘member‘)->where([‘id‘=>$u_id,‘status‘=>1])->update([‘day‘=>0]);$arr = [‘code‘=>500,‘msg‘=>‘检测为断签‘];

}return $arr;

}catch (Exception $e){return [‘code‘=>$e->getCode(),‘msg‘=>$e->getMessage()];

}

}

原文:https://www.cnblogs.com/gushengyan/p/10439048.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值