头一次做这种带评论带积分的公众号,记录一下,如果有大神看出漏洞了求指教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