搜索
系统检测到您的用户名不符合规范:

[新版]自用thinkphp签到送积分方法

浏览:6944 发布日期:2016年10月21日 分类:功能实现 关键字: thinkphp 积分 签到
自用thinkphp签到送积分方法,更新了下代码
今天才发现还有挺多人看的, 所以更新了下代码

文章发布于我的博客,
新版链表: https://www.xstnet.com/article-133.html
旧版连接: https://www.xstnet.com/article-79.html<?php
namespace Home\Controller;

use Think\Controller;

/**
* Class SignInController
* 用户签到类, 签到送积分
* 表结构如下:
CREATE TABLE `tbl_user_sign_in` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` int(10) NOT NULL DEFAULT '0' COMMENT '用户ID',
`username` varchar(30) NOT NULL DEFAULT '' COMMENT '用户名称',
`continuous_days` smallint(5) NOT NULL DEFAULT '0' COMMENT '连续签到天数',
`integral` smallint(5) NOT NULL DEFAULT '0' COMMENT '本次签到获取积分数',
`sign_in_at` int(10) NOT NULL DEFAULT '0' COMMENT '签到时间, 时间戳',
`created_at` int(10) NOT NULL DEFAULT '0' COMMENT '记录创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='用户签到表';
*
*/
class SignInController extends Controller {

/**
* Ajax 返回状态标识
*/
const CODE_SUCCESS = 0;
const CODE_FAILURE = 1;

/**
* 签到方法
* 1.验证是否登录
* 2.验证今日是否已签到
* 3.签到
*/
public function index()
{
$result = array(
'code' => self::CODE_SUCCESS,
'message' => '签到成功',
);

try {
// 1.验证是否登录
if (!$this->checkLogin()) {
throw new \Exception('请先登录');
}

// 获取用户信息
$userInfo = $this->getUserInfo();

/**
* 2.验证今日是否已签到
* 获取今日凌晨时间戳, 通过查询 sign_in_at 字段来判断
*/
$signIn = M('user_sign_in');
$todayAt = strtotime(date('Y-m-d'));
// 查询条件
$where = array(
'user_id' => $userInfo['user_id'],
'sign_in_at' => array('EGT', $todayAt)
);
// 查询今日是否已签到
$exist = $signIn->where($where)->count();
if ($exist > 0) {
throw new \Exception('今天已经签到过啦!');
}

/**
* 3.开始签到逻辑
* 先查询昨天的签到记录
* 如果查到, 则说明是连续签到, 连续签到天数加1
* 未查到, 连续签到天数为1
* 根据连续签到天数, 获取相应的积分
*/
$yesterdayAt = $todayAt - 86400;
$where['sign_in_at'] = array('EGT', $yesterdayAt);
// 昨天的签到记录
$yesterdayRecord = $signIn->where($where)->find();
// 连续签到天数
$continuousDays = 1;
if (!empty($yesterdayRecord)) {
// 更新连续签到天数
$continuousDays += $yesterdayRecord['continuous_days'];
}
$integral = 0; // 积分数
$config = $this->getConfig();
// 通过连续签到天数, 获取相应的积分
foreach ($config as $day => $integralItem) {
if ($day > $continuousDays) {
break;
}
$integral = $integralItem;
}
// 插入数据
$insertData = array(
'user_id' => $userInfo['user_id'],
'username' => $userInfo['username'],
'integral' => $integral,
'continuous_days' => $continuousDays,
'sign_in_at' => time(),
'created_at' => time(),
);
// 得到了连续签到天数, 和应得的积分, 此处可以添加 额外获取积分的逻辑

$insertRet = $signIn->add($insertData);
if (!$insertRet) {
throw new \Exception('签到失败');
}
// todo: 更新用户积分数

// 修改提示
$result['message'] = sprintf('签到成功, 连续签到%d天, 获得%d积分', $continuousDays, $integral);

} catch (\Exception $e) {
$result['code'] = self::CODE_FAILURE;
$result['message'] = $e->getMessage();
}

$this->ajaxReturn($result);
}

/**
* 检查是否登录, 替换成实际的代码
* @return bool
*/
private function checkLogin()
{
return true;
}

/**
* 获取用户信息, 替换成实际的代码
* @return array
*/
private function getUserInfo()
{
return array(
'user_id' => 1,
'username' => 'shantong',
);
}

/**
* 签到获取积分规则
* @return array
*/
private function getConfig()
{
/**
* 基础积分
* 如: 第一天5积分, 连续签到每天多5积分, n天及以上每天m积分, 此处n=8, m=40
*/
$config = array(
1 => 5, // 第一天5积分
2 => 10,
3 => 15,
4 => 20,
5 => 25,
6 => 30,
7 => 35,
8 => 40,
);

/**
* 还可以这样设置
*/
// $config = array(
// 1 => 5, // 每天都是5积分
// );

// $config = array(
// 1 => 5, // 一天以上5积分
// 3 => 10, // 三天以上10积分
// 5 => 20, // 五天以上20积分
// 10 => 50, // 10天以上50积分
// );

return $config;
}
}
评论() 相关
后面还有条评论,
评论支持使用[code][/code]标签添加代码
您需要登录后才可以评论 登录 | 立即注册
收藏
醉丶春风、
积分:537 等级:LV2
热点推荐
(追記) (追記ここまで)
最新更新

我们

合作

网站

信息

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

AltStyle によって変換されたページ (->オリジナル) /