首页 > 技术文章 > tp5.0 实现签到功能

gj210623 2021-09-28 19:35 原文

  • 先根据用户来查询签到数据 如果没有则说明第一次签到
  • 有则判断是否是重复签到
  • 比较上次签到时间和昨天的时间 如果属于昨天的时间表示是连续签到
  • 上次签到时间在今天的时间内 表示今天已经签到过了
  • 上次的签到时间在昨天之前 表示昨天没有签到 属于断签 重新开始
  • 代码如下
  •  1 public function sign()
     2     {
     3         //取出用户id
     4         $user_id = session('user.id');
     5         //根据用户id查询签到记录表
     6         $result = \app\home\model\Sign::where('user_id',$user_id)->find();
     7         //如果表里面没有数据 第一次签到
     8         if (!$result){
     9             $data['user_id'] = $user_id;
    10             $data['number'] = 1;
    11             $data['integral'] = 200;
    12             $data['sign_time'] = time();
    13             $res = \app\home\model\Sign::create($data);
    14             if ($res){
    15                 return getJsonData(200,'恭喜您完成首次签到 获得200积分',$res);
    16             }
    17         }else{
    18             //表里有数据  获取上次签到时间 和当前时间
    19             $sign_time = $result['sign_time'];//上次签到时间
    20             $atNow = date('y-m-d');//当天时间的0点
    21             //转化为时间戳
    22             $newNow = strtotime($atNow);
    23             //昨天的0点
    24             $prevDay = $newNow - 86400;
    25             //明天的0点
    26             $nextDay = $newNow + 86400;
    27             //现在签到的时间
    28             $NowDay = time();
    29             //当上次签到时间 在今天0点到明天0点之间  今天已经签到过
    30             if ($sign_time>$newNow && $sign_time<$nextDay){
    31                 return getJsonData(500,'您今天已经签到过了!!不能重复签到');
    32             }
    33             //当上次签到时间在 昨天0点到今天0点之间 表示昨天已经签到 今天在签到为连续签到
    34             if ($sign_time>$prevDay && $sign_time < $newNow){
    35                 //积分+50 签到天数+1
    36                 $data['integral'] = $result['integral'] + 50;
    37                 $data['number'] = $result['number'] + 1;
    38                 $data['sign_time'] = $NowDay;
    39                 $res = \app\home\model\Sign::update($data,['user_id'=>$user_id],false);
    40                 if ($res){
    41                     return getJsonData(200,'第'.$data['number'].'天签到,积分+50');
    42                 }
    43             }
    44             //上次签到时间 在昨天0点之前 表示昨天断签 积分变为200 连续签到天数为1
    45             if ($sign_time<$prevDay){
    46                 $data['number'] = 1;
    47                 $data['integral'] = 200;
    48                 $data['sign_time'] = $NowDay;
    49                 $res = \app\home\model\Sign::update($data,['user_id'=>$user_id],false);
    50                 if ($res){
    51                     return getJsonData(200,'中途断签,此次签到后积分为200');
    52                 }
    53             }
    55         }
    56     }

     

推荐阅读