<?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签到的更多相关文章

  1. C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能

    随着微信开逐步开放更多JSSDK的接口,我们可以利用自定义网页的方式来调用更多微信的接口,实现我们更加丰富的界面功能和效果,例如我们可以在页面中调用各种手机的硬件来获取信息,如摄像头拍照,GPS信息. ...

  2. 用NSCalendar和UICollectionView自定义日历,并实现签到显示

    前一段时间因为工作需要实现了一个可以签到的日历,来记录一下实现的思路 效果如图:   这里的基本需求是: 1,显示用户某个月的签到情况,已经签到的日子打个圈,没有签到且在某个时间范围内的可以签到,其他 ...

  3. 【原创】自己动手写工具----签到器[Beta 2.0]

    一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程 ...

  4. jquery制作论坛或社交网站的每天打卡签到特效

    效果:http://hovertree.com/texiao/jquery/50/ 现在许多社区,购物等网站都设置签到功能,打开可以收获经验.虚拟币等,提高用户粘性,增加浏览量,是一个不错的功能.本文 ...

  5. 使用 UICollectionView 实现日历签到功能

    概述 在 App 中,日历通常与签到功能结合使用.是提高用户活跃度的一种方式,同时,签到数据中蕴含了丰富的极其有价值的信息.下面我们就来看看如何在 App 中实现日历签到功能. 效果图 ..... 思 ...

  6. 【原创】自己动手写工具----签到器[Beta 1.0]

    一.写在前面 最近公司没有什么项目,想通过项目练练手的机会也没有,只能自己学习了,因此空下来的时间也挺多的,就打开网页看看吧,哎,一打开就让签到(像什么百度知道啊.百度云盘啊之类的),我签到的目的是获 ...

  7. 利用web工具splinter模拟登陆做自动签到

    首先,我需要的工具和组件有: Chrome浏览器 浏览器驱动ChromeDriver Python 3.5 Web应用测试工具Splinter 代码部分: from splinter import B ...

  8. 安卓基于WifiScanner的签到APP

    没图说个JB?首先上图:      友情提醒:后台数据库使用的是Bmob后端云 主要设计思路:首先选一个附近的wifi,输入签到码,进行签到. 签到之后会启动一个后台线程每隔一段时间扫描附近wifi, ...

  9. 【原】js 签到用日历

    最近做的一个项目中,需要用到一个日历来记录你的签到,网上找了一些,感觉挺庞大的,所以就自己写了一个,记录一下自己写这个日历的经过 html代码: <table cellspacing=" ...

  10. NYOJ题目874签到

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAswAAAIzCAIAAACbd9iBAAAgAElEQVR4nO3dPXLjSNou0G8T8rUQ2V

随机推荐

  1. Linux定时任务crontab使用指南

    crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查 ...

  2. unity 中 protobuff 的用法 一句话攻略

    (一)unity 添加 pb 的 dll 支持.1,从GitHub上下载protobuf源码 (源码链接:https://github.com/google/protobuf),找到 csharp 分 ...

  3. 在线课程笔记—.NET基础

    关于学习北京理工大学金旭亮老师在线课程的笔记. 介绍: 在线课程网址:http://mooc.study.163.com/university/BIT#/c 老师个人网站:http://jinxuli ...

  4. Hibernate 学习(三)

    一.关系映射 实体类之间的关联映射以及表之间的关系是 ORM 的灵魂之处.对象间的关系的子集可以用下列四种方式解释.关联映射可以是单向的也可以是双向的.  映射类型 描述 Many-to-One 使用 ...

  5. shell输入与输出功能

    一.shell输入功能 1. 2. 二.shell输出功能 1.字符界面前景颜色 2.字符界面背景颜色 3.其他输出命令 ①cat 输出文本,将文本的格式也输出 ②tee 既输出,也保存到文件里 ③m ...

  6. TCP基础知识(一)简介与数据包

    TCP详解(1):简介与数据包 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议 应用层向TCP层发送用于网间传输 ...

  7. Redis学习笔记1 -- 单机环境时分布式锁的使用

    使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKee ...

  8. BestCoder Round #92

    这里是逢比赛必挂的智障选手ysf…… 不知道是因为自己菜还是心态不好……也许是后者吧,毕竟每次打比赛的时候都会很着急.lrd说我打比赛的功利性太强,想想确实是这样. 昨天打完之后自觉身败名裂没敢写出来 ...

  9. 车厢调度(train.cpp)

    车厢调度(train.cpp) [问题描述]        有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合.假设从A方向驶来的火车有n节(n<=1000) ...

  10. 基础架构之Mongo

    项目需求中,有些需求的数据是不必长时间持久化或一些非结构化设计,这时可以考虑用Mongo作为存储,具体介绍介绍详见官方 https://www.mongodb.com,这篇文章主要介绍安装及启用身份认 ...