thinkPHP实现签到功能的方法
本文实例讲述了thinkPHP实现签到功能的方法。分享给大家供大家参考,具体如下:
数据表:
CREATETABLE`members_sign`( `id`int(11)unsignedNOTNULLAUTO_INCREMENT, `uid`int(11)unsignedNOTNULLCOMMENT'用户id', `days`tinyint(2)unsignedNOTNULLDEFAULT'0'COMMENT'连续签到的天数', `is_share`tinyint(1)unsignedNOTNULLDEFAULT'0'COMMENT'是否分享过', `is_sign`tinyint(1)unsignedNOTNULLDEFAULT'0'COMMENT'是否签到过', `stime`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'签到的时间', `atime`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'添加时间', PRIMARYKEY(`id`), KEY`index_uid`(`uid`)USINGBTREE )ENGINE=InnoDBAUTO_INCREMENT=162DEFAULTCHARSET=utf8COMMENT='签到分享表';
Controller:
getMonthSign();
$dayList=$this->showDays($monthSign);
//今天签到
$data=$this->todayData();
if($data['is_sign']==1){
$this->assign('isSign',true);
}
$this->display();
}
/**
*执行当天签到
*@returnjson签到成功返回{status:1,info:'已签到'}
*/
publicfunctionsign(){
$todayData=$this->todayData();
if($todayData['is_sign']==1){
$this->successMsg('已签到');
}else{
$data=$this->getInsertData($this->uid);
//无今天数据
if($todayData==NULL){
$data['uid']=$this->uid;
$data['atime']=time();
$id=M('members_sign')->add($data);
}else{
$save=M('members_sign')->where("id={$todayData['id']}")->save($data);
}
if($idor$save){
$score=$this->getTodayScores($data['days']);
//为该用户添加积分
addScore($this->uid,$score);
$this->successMsg('已签到',array('score'=>$score,'days'=>$data['days']));
}else{
$this->errorMsg('签到失败,请刷新后重试!');
}
}
}
/**
*返回每次签到要插入的数据
*
*@paramint$uid用户id
*@returnarray(
*'days'=>'天数',
*'is_sign'=>'是否签到,用1表示已经签到',
*'stime'=>'签到时间',
*);
*/
protectedfunctiongetInsertData($uid){
//昨天的连续签到天数
$start_time=strtotime(date('Y-m-d0:0:0',time()-86400))-1;
$end_time=strtotime(date('Y-m-d23:59:59',time()-86400))+1;
$days=M('members_sign')->where("uid=$uidandatime>$start_timeandatime<$end_time")->getField('days');
if($days){
$days++;
if($days>30){
$days=1;
}
}else{
$days=1;
}
returnarray(
'days'=>$days,
'is_sign'=>1,
'stime'=>time()
);
}
/**
*用户当天签到的数据
*@returnarray签到信息is_sign,stime等
*/
protectedfunctiontodayData(){
$time=time();
$start_stime=strtotime(date('Y-m-d0:0:0',$time))-1;
$end_stime=strtotime(date('Y-m-d23:59:59',$time))+1;
returnM('members_sign')->field('atime',true)->where("uid={$this->uid}andatime>$start_stimeandatime<$end_stime")->find();
}
/**
*积分规则,返回连续签到的天数对应的积分
*
*@paramint$days当天应该得的分数
*@returnint积分
*/
protectedfunctiongetTodayScores($days){
if($days==30){
return50;
}elseif($days>19){
return8;
}elseif($days>9){
return5;
}else{
return3;
}
}
/**
*显示签到列表
*
*@paramarray$signDays某月签到的日期array(1,2,3,4,5,12,13)
*@paramint$year可选,年份
*@paramint$month可选,月份
*@returnstring日期列表更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《ZendFrameWork框架入门教程》、《smarty模板入门基础教程》及《PHP模板技术总结》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。