PHP实现签到功能

479 阅读1分钟

                                                            PHP实现签到功能
1、表设计
1)、主表

CREATE TABLE `sign` (
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增',
    `uid` varchar(50) NOT NULL DEFAULT '0' COMMENT '用户ID 唯一',
    `username` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名',
    `sign_count` int(11) NOT NULL DEFAULT '0' COMMENT '连续签到次数',
    `last_time` int(11) NOT NULL DEFAULT '0' COMMENT '最近一次签到时间',
    `create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='签到主表';

    2)、详情表

CREATE TABLE `sign_detail` (
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增',
    `sign_id` int(11) NOT NULL DEFAULT '0' COMMENT '签到表 wechat_sign表ID',
    `sign_time` int(11) NOT NULL DEFAULT '0' COMMENT '签到时间',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='签到详情表';

 2、model.php文件

    1)、主表model [ Sign.php ]

<?php
/**
* @todo 签到主表
* @author admin
*/
class SignModel extends Model
{          

}

    2)、详情表model [ SignDetail.php ]

<?php
/**
 * @todo 签到详情表
 * @author admin
 */
class SignDetailModel extends Model
{

}

3、控制器方法  [ Test.php ]

<?php
class TestController extends Rest{
    /**
     * @todo 签到功能
     */
    public function signAction(){
        ini_set('date.timezone','Asia/Shanghai');
        $uid = isset($_GET['uid']) ? $_GET['uid'] : '';
        $username = isset($_GET['username']) ? $_GET['username'] : '';
        if(!$uid || !$username ){
            die('参数缺失!');
        }
        $time = time();
        $mSign = new SignModel();
        $mSignDetail = new SignDetailModel();
        $signInfo = $mSign->getOne(['uid'=>$uid]);
        if($signInfo){
            $sign_id = $signInfo['id'];
            $last_time = date( 'Y-m-d', $signInfo['last_time'] );
            $sign_count = $signInfo['sign_count'];
            $yesterday = date('Y-m-d',strtotime('-1 day'));    //昨天的日期格式 2018-07-02

            if( $last_time == date('Y-m-d') ){    //如果等于今天,$sign_count不变
                die('您今天已经签到过了!');
            }else if( $last_time == $yesterday ){    //如果用户昨天打了卡,连续签到次数加1;否则重置为1
                $sign_count += 1;
            }else{
                $sign_count = 1;
            }

            $where = [ 'uid'=>$uid ];
            $editData = ['sign_count'=>$sign_count, 'last_time'=>$time];
            $result = $mSign->edit($editData, $where);        //编辑详情表
        }else{    //主表数据为空,是新用户登录
            $data = [
                'uid'=>$uid,
                'username'=>$username,
                'sign_count'=>1,
                'last_time'=>$time,
                'create_time'=>$time
            ];
            $sign_id = $mSign->add($data);
            $result = $sign_id;
        }

        if($result){    //获取主表的主键ID,统一操作详情变
            $detailData = [
                'sign_id'=>$sign_id,
                'sign_time'=>$time
            ];
            $detailRet = $mSignDetail->add($detailData);    //添加数据到详情表
            if($detailRet){
                die('签到成功!');
            }else{
                die('签到失败!');
            }
        }else{
            die('操作主表异常!');
        }
    }
}