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('操作主表异常!');
}
}
}