头一次做这种带评论带积分的公众号, 记录一下, 如果有大神看出漏洞了求指教 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 function sign_in(){
- $pub=new PublicModel();
- $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 = new PublicModel();
- $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()];
- }
- }
来源: http://www.bubuko.com/infodetail-2968711.html