php签到
<?php
namespace Member\Controller;
use Member\Controller\MController;
class IndexController extends MController {
/**
* 用户中心
* @param
*/
public function index(){
$pre = C('DB_PREFIX');
// 日历列表
$monthSign = $this->getMonthSign();
$dayList = $this->showDays($monthSign);
// 今天签到
$data = $this->todayData();
if($data['is_sign'] == 1){
$this->assign('isSign',true);
}
$this->display();
}
/**
* 执行当天签到
* @return json 签到成功返回 {status:1,info:'已签到'}
*/
public function sign(){
$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($id or $save){
$score = $this->getTodayScores($data['days']);
// 为该用户添加积分
addScore($this->uid,$score);
$this->successMsg('已签到',array('score' => $score,'days'=>$data['days']));
}else{
$this->errorMsg('签到失败,请刷新后重试!');
}
}
}
/**
* 返回每次签到要插入的数据
*
* @param int $uid 用户id
* @return array(
* 'days' => '天数',
* 'is_sign' => '是否签到,用1表示已经签到',
* 'stime' => '签到时间',
* );
*/
protected function getInsertData($uid){
// 昨天的连续签到天数
$start_time = strtotime(date('Y-m-d 0:0:0',time()-86400))-1;
$end_time = strtotime(date('Y-m-d 23:59:59',time()-86400))+1;
$days = M('members_sign')->where("uid = $uid and atime > $start_time and atime < $end_time")->getField('days');
if($days){
$days++;
if($days > 30){
$days = 1;
}
}else{
$days = 1;
}
return array(
'days' => $days,
'is_sign' => 1,
'stime' => time()
);
}
/**
* 用户当天签到的数据
* @return array 签到信息 is_sign,stime 等
*/
protected function todayData(){
$time = time();
$start_stime = strtotime(date('Y-m-d 0:0:0',$time))-1;
$end_stime = strtotime(date('Y-m-d 23:59:59',$time))+1;
return M('members_sign')->field('atime',true)->where("uid = {$this->uid} and atime > $start_stime and atime < $end_stime")->find();
}
/**
* 积分规则,返回连续签到的天数对应的积分
*
* @param int $days 当天应该得的分数
* @return int 积分
*/
protected function getTodayScores($days){
if($days == 30){
return 50;
}else if($days > 19){
return 8;
}else if($days > 9){
return 5;
}else{
return 3;
}
}
/**
* 显示签到列表
*
* @param array $signDays 某月签到的日期 array(1,2,3,4,5,12,13)
* @param int $year 可选,年份
* @param int $month 可选,月份
* @return string 日期列表<li>1</li>....
*/
protected function showDays($signDays,$year,$month){
$time = time();
$year = $year ? $year : date('Y',$time);
$month = $month ? $month : date('m',$time);
$daysTotal = date('t', mktime(0, 0, 0, $month, 1, $year));
$now = date('Y-m-d',$time);
$str = '';
for ($j = 1; $j <= $daysTotal; $j++) {
$i++;
$someDay = date('Y-m-d',strtotime("$year-$month-$j"));
// 小于今天的日期样式
if ($someDay <= $now){
// 当天日期样式 tdc = todayColor
if($someDay == $now){
// 当天签到过的
if(in_array($j,$signDays)){
$str .= '<li class="current fw tdc">'.$j.'</li>';
}else{
$str .= '<li class="today fw tdc">'.$j.'</li>';
}
}else{
// 签到过的日期样式 current bfc = beforeColor , fw = font-weight
if(in_array($j,$signDays)){
$str .= '<li class="current fw bfc">'.$j.'</li>';
}else{
$str .= '<li class="fw bfc">'.$j.'</li>';
}
}
}else{
$str .= '<li>'.$j.'</li>';
}
}
return $str;
}
/**
* 获取当月签到的天数,与 $this->showDays() 配合使用
* @return 当月签到日期 array(1,2,3,4,5,12,13)
*/
protected function getMonthSign(){
$time = time();
$year = date('Y',$time);
$month = date('m',$time);
$day = date("t",strtotime("$year-$month"));
$start_stime = strtotime("$year-$month-1 0:0:0")-1;
$end_stime = strtotime("$year-$month-$day 23:59:59")+1;
$list = M('members_sign')->where("uid = {$this->uid} and stime > $start_stime and stime < $end_stime")->order('stime asc')->getField('stime',true);
foreach ($list as $key => $value){
$list[$key] = date('j',$value);
}
return $list;
}
}
CREATE TABLE `members_sign` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(11) unsigned NOT NULL COMMENT '用户id',
`days` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '连续签到的天数',
`is_share` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否分享过',
`is_sign` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否签到过',
`stime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '签到的时间',
`atime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
PRIMARY KEY (`id`),
KEY `index_uid` (`uid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=162 DEFAULT CHARSET=utf8 COMMENT='签到分享表';
php签到的更多相关文章
- C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能
随着微信开逐步开放更多JSSDK的接口,我们可以利用自定义网页的方式来调用更多微信的接口,实现我们更加丰富的界面功能和效果,例如我们可以在页面中调用各种手机的硬件来获取信息,如摄像头拍照,GPS信息. ...
- 用NSCalendar和UICollectionView自定义日历,并实现签到显示
前一段时间因为工作需要实现了一个可以签到的日历,来记录一下实现的思路 效果如图: 这里的基本需求是: 1,显示用户某个月的签到情况,已经签到的日子打个圈,没有签到且在某个时间范围内的可以签到,其他 ...
- 【原创】自己动手写工具----签到器[Beta 2.0]
一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程 ...
- jquery制作论坛或社交网站的每天打卡签到特效
效果:http://hovertree.com/texiao/jquery/50/ 现在许多社区,购物等网站都设置签到功能,打开可以收获经验.虚拟币等,提高用户粘性,增加浏览量,是一个不错的功能.本文 ...
- 使用 UICollectionView 实现日历签到功能
概述 在 App 中,日历通常与签到功能结合使用.是提高用户活跃度的一种方式,同时,签到数据中蕴含了丰富的极其有价值的信息.下面我们就来看看如何在 App 中实现日历签到功能. 效果图 ..... 思 ...
- 【原创】自己动手写工具----签到器[Beta 1.0]
一.写在前面 最近公司没有什么项目,想通过项目练练手的机会也没有,只能自己学习了,因此空下来的时间也挺多的,就打开网页看看吧,哎,一打开就让签到(像什么百度知道啊.百度云盘啊之类的),我签到的目的是获 ...
- 利用web工具splinter模拟登陆做自动签到
首先,我需要的工具和组件有: Chrome浏览器 浏览器驱动ChromeDriver Python 3.5 Web应用测试工具Splinter 代码部分: from splinter import B ...
- 安卓基于WifiScanner的签到APP
没图说个JB?首先上图: 友情提醒:后台数据库使用的是Bmob后端云 主要设计思路:首先选一个附近的wifi,输入签到码,进行签到. 签到之后会启动一个后台线程每隔一段时间扫描附近wifi, ...
- 【原】js 签到用日历
最近做的一个项目中,需要用到一个日历来记录你的签到,网上找了一些,感觉挺庞大的,所以就自己写了一个,记录一下自己写这个日历的经过 html代码: <table cellspacing=" ...
- NYOJ题目874签到
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAswAAAIzCAIAAACbd9iBAAAgAElEQVR4nO3dPXLjSNou0G8T8rUQ2V
随机推荐
- PHP学习3——数组
主要内容: 简介 常用的方法 循环遍历数组 PHP预定义数组 数组的处理函数 数组 PHP由于是弱类型的语言,他的变量类型是可以自由变换的,他的数组很自由,长度是可以动态增加的. 他的索引默认为数字0 ...
- sql创建表变量,转百分数
declare @tab table( ID nt identity(1,1) primary key, --从1开始,每次自增1 ,Name nvarchar(200) ) declare a fl ...
- ajax返回整个页面
- 2013 Warm up 3 -- Skill --- dp
题意:求n位数字,满足非递减的个数. dp[ i ] [ j ] = sum( dp[i -1] [ k ] ); k =>( j , 9); #include<iostream> ...
- react-native一些好的组件
一.移动端路由 react-navigator 二.移动端本地储存 react-native-storage(https://github.com/sunnylqm/react-native-stor ...
- asp.net 日期转换为大写汉字
//年份转换为大写汉字 public static string numtoUpper(int num) { return "零壹贰叁肆伍陆柒捌玖"[num].ToString() ...
- #!/bin/sh & #!/bin/bash区别
在shell脚本的开头往往有一句话来定义使用哪种sh解释器来解释脚本.目前研发送测的shell脚本中主要有以下两种方式:(1) #!/bin/sh(2) #!/bin/bash以上两种方式有什么区别? ...
- 工作中常用的sql语句以及知识整理
一.常用的sql语句 1.建表语句 create table tabname(colname1 type1 [not null][primary key], colname2 type2,...) 根 ...
- Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(人人网)(下)
Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(下) 自动使用cookie的方法,告别手动拷贝cookie http模块包含一些关于cookie的模块,通过他们我们可以自动的使用co ...
- css 三角形的制作
参考网页: http://www.jb51.net/article/42513.htm 1 .设置宽高为0 2 .设置4条边框 3 .设置边框颜色border-color如下: border-colo ...