思路:
- 获取当前时间,根据当前时间获取前一天时间
- 在签到表中判断前天是否打卡
- 在前一天表中找到信息,则为每天连续打卡;若未找到信息,则可能是断签或者是第一天打卡
- 使用事务更新所需要的表
使用的表:
1.签到表:用户id 签到时间 获得积分
2.用户表:连续签到天数 总积分
代码直接上
工具方法 放在工具类中
//验证数组是否存在
public static function havedata($array)
{
if (isset($array) && !empty($array)) {
return true;
} else {
return false;
}
}
//获取指定时间间隔的是时间戳
public static function getLastTime($day,$type="before"){
$data = array();
if($type == "before"){
$str = date("Y-m-d",strtotime("-{$day} day"))." 0:0:0";
$data["start"] = strtotime($str);
$str = date("Y-m-d",strtotime("-{$day} day"))." 24:00:00";
$data["end"] = strtotime($str);
}else{
$str = date("Y-m-d",strtotime("+{$day} day"))." 0:0:0";
$data["start"] = strtotime($str);
$str = date("Y-m-d",strtotime("+{$day} day"))." 24:00:00";
$data["end"] = strtotime($str);
}
return $data;
}
签到控制器
$now_time = strtotime(date("Y-m-d 0:0:0",time()));//获取当前时间
$info = $signOn->Exist($now_time,$userId);//在签到表中判断时候存在签到
$integral = 0;
$userInfo = $user->getInfoById("integral,continuity_day",$userId);//查询用户积分和签到天数
if (Util::havedata($info)){//
dumpJson(REPERROR,"您今天已经签到过了");
}else{
$yestaday = Util::getLastTime(1,'before');//获取前一天时间
$existYestasySignOn = $signOn->checkSignOn($yestaday['start'],$yestaday['end'],$userId);//检查是否连续签到
if ($existYestasySignOn){//连续签到
//连续签到操作
}
}else{//断签和第一次签到
//断签和一次签到操作
}
//准备需要修改的数据
//开始事务
Db::startTrans();
try{
//执行操作
if (//判断操作是否成功){
//操作成功,提交sql
Db::commit();
}else{
//操作失败,回滚数据
Db::rollback();
}
}catch (\Exception $e){
//操作失败,回滚数据
Db::rollback();
}
}
思路仅供参考,有好的操作,请大家提出,谢谢