1. 程式人生 > >PHP TP5 文章評論+積分+簽到

PHP TP5 文章評論+積分+簽到

ddc arr open 天數 清零 session stat info 要求

頭一次做這種帶評論帶積分的公眾號,記錄一下,如果有大神看出漏洞了求指教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()];
        }
    }

PHP TP5 文章評論+積分+簽到