PHP 基于ThinkPHP实现每日签到及奖励功能

  • 数据库设计
  • 代码实现

数据库设计

要求:

每个用户可以签到7天,连续签到7天或者中途断签都重新开始计算签到天数,签到会获取对应奖励

分析:

1、连续签到
2、签到7天或者断签重新开始计算天数
3、签到获取奖励

设计:

1、每个用户可以连续签到,这就需要一个字段来记录连续签到天数
2、因为有连续签到7天或者断签重新开始计算的需求,所以需要一个字段来记录签到时间,来判断是否是连续签到从而改变连续签到天数,签到时判断表里的签到时间与现在的时间差是否为1天,为1天则连续签到,天数+1,反之则为断签,天数重置为1
3、签到获取奖励,需要记录签到天数对应的奖励(签到奖励表)

实现:
1、创建签到表(sign_in)

CREATE TABLE `sign_in`  (`id` int(11) NOT NULL COMMENT '主键',`userId` int(11) NULL DEFAULT NULL COMMENT '用户id',`num` int(11) NULL DEFAULT NULL COMMENT '签到天数',`signTime` datetime(0) NULL DEFAULT NULL COMMENT '签到时间',PRIMARY KEY (`id`)
);

2、创建奖励表(sign_in_reward)

CREATE TABLE `sign_in_reward`  (`id` int(11) NOT NULL COMMENT '主键',`coin` int(11) NOT NULL COMMENT '金币',PRIMARY KEY (`id`)
);

3、用户表

CREATE TABLE `user`  (`id` int(11) NOT NULL COMMENT '主键',`userId` int(11) NOT NULL COMMENT '用户id',`coin` int(11) NOT NULL COMMENT '金币',PRIMARY KEY (`id`)
);

代码实现

签到:

/*** @api {post} /minwx/sign/signIn 签到* @apiName signIn* @apiParam {string} userId 用户id* @apiGroup 签到*/public function signIn(){try {$userId = $this->request->param('userId');$signIn = new ModelSignIn();$res = $signIn->get(['userId' => $userId]);// 判断用户是否签到过if ($res) {// 更新用户数据if ($this->diffBetweenTwoDays(date('Y-m-d', time()), substr($res['signTime'], 0, 10)) == 1) {// 连续签到,更新签到时间,签到天数+1$num = $res['num'] + 1;} else {// 没有连续签到,更新签到时间,签到次数初始化为1$num = 1;}$signIn->where(['userId' => $userId])->update(['signTime' => date('Y-m-d H:i:s', time()), 'num' => $num]);} else {// 添加用户数据$signIn->data(['userId' => $this->request->param('userId'),'num' => 1,'signTime' => date('Y-m-d H:i:s', time())]);$signIn->save();}// 获取签到奖励$reward = Db::table('sign_in_reward')->where(['id'=> $num % 7 == 0 ? 7 : $num % 7])->find();// 给予用户奖励$user = new User();$userInfo = $user->where(['userId' => $userId])->setInc('coin', $reward['coin']);return json(['code'=>1,'msg'=>'签到成功','data'=>'']);} catch (Exception $e) {return json(['code'=>-1,'msg'=>'系统错误','err'=>$e->getMessage()]);}}//两个日期之间相差的天数public function diffBetweenTwoDays($day1, $day2){$second1 = strtotime($day1);$second2 = strtotime($day2);if ($second1 < $second2) {$tmp = $second2;$second2 = $second1;$second1 = $tmp;}return ($second1 - $second2) / 86400;}

获取签到:

/*** @api {post} /minwx/sign/getSignIn 获取签到* @apiName getSignIn* @apiParam {string} userId 用户id* @apiGroup 签到*/public function getSignIn(){Db::startTrans();try {$userId= $this->request->param('userId');// 获取用户信息$user = new User();$userInfo = $user->get(['userId' => $userId]);// 获取签到日期$signIn = new ModelSignIn();$arr = $signIn->get(['userId' => $userId]);// 判断是否签到过if ($arr) {// 计算天数$differDay = $this->diffBetweenTwoDays(date('Y-m-d', time()), substr($arr['signTime'], 0, 10));// 0今日签到,1昨日已签到if ($differDay == 0 || $differDay == 1) {// 这里不对数据库的签到天数做处理,可以一直记录连续签到的天数,方便后面需求的拓展// 而在逻辑上连续签到7天需重置签到天数,所以对签到天数做7求余(具体天数看实际项目需求更改求余),得出逻辑需求里的连续签到天数$num = $arr['num'] % 7 == 0 ? 7 : $arr['num'] % 7;} else {// 断签,重置签到天数,因为是获取签到而不是签到,所以num重置为0$num = 0;$signIn->where(['userId' => $userId])->update(['num' => $num]);}// 判断今日是否签到if ($differDay == 0) {// 今天已签到$today = 1;} else {// 今日未签到$today = 0;}} else {// 未签到,插入数据,签到天数为0$num = 0;$today = 0;$signIn->where(['userId' => $userId])->update(['num' => $num]);}// 获取签到奖励$reward = Db::table('sign_in_reward')->order('id')->select();$res = ['coin' => $userInfo['coin'],    // 用户金币'signIn' => $num,  // 签到天数'reward' => $reward,   // 签到奖励'today' => $today  // 今天是否签到(0没有、1有)];Db::commit();return json(['code'=>1,'msg'=>'获取成功','data'=>$res]);} catch (Exception $e) {Db::rollback();return json(['code'=>-1,'msg'=>'系统错误','err'=>$e->getMessage()]);}}

PHP 基于ThinkPHP实现每日签到及奖励功能相关推荐

  1. html5 签到系统功能,项目实战之基于JavaScript实现每日签到打卡轨迹功能

    今天扣丁学堂HTML5培训老师给大家介绍一下关于js实现每日签到打卡轨迹功能的具体代码,希望对同学们学习HTML5开发有所帮助,下面我们一起来看一下吧. 1.核心文件calendar.js var c ...

  2. php 微信分享功能_基于thinkPHP实现的微信自定义分享功能

    这篇文章主要介绍了基于thinkPHP实现的微信自定义分享功能,结合实例形式分析了thinkPHP调用微信接口实现自定义分享功能的相关操作技巧,需要的朋友可以参考下 本文实例讲述了基于thinkPHP ...

  3. 前端捕捉轨迹_基于JavaScript实现每日签到打卡轨迹功能

    本文实例为大家分享了js实现每日签到打卡轨迹功能的具体代码,供大家参考,具体内容如下 1. 核心文件 calendar.js var calUtil = { //当前日历显示的年份 showYear: ...

  4. thinkphp mysql 日志_基于thinkphp实现异常日志详细统计功能

    后端的代码基于thinkphp框架开发,随着业务的增加,代码复杂度不断增多,而且有好几份代码,可能部署在不同的服务器上.即使在测试服务器上经过严格测试,正式环境有时也很难避免出现bug,所以需要较为详 ...

  5. 基于jQuery的日历+每日签到功能

    公司要开发一个h5页面,里边有一个每日签到抽奖的功能,本以为这样的插件应该会有很多,结果找到的全都是仅生成日历的插件,于是乎就出现了下面这个东西.(前端菜鸟,请大神嘴下留情,也请小伙伴们多提宝贵意见) ...

  6. 基于微信小程序的每日签到打卡

    社会的发展和科学技术的进步,互联网技术越来越受欢迎.手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用.手机具有便利性,速度快,效率高,成本低等优点. 因此,构建符合自己要求的操作系统是非常 ...

  7. php基于thinkphp、smarty\CodeIgniter构建的开源的淘宝客cms程序下载

    现在有很多开源的淘宝客软件cms,很多人不知道,所以,提供该服务,完全开源,比市面上的加密的好很多, 这些开源的淘宝客程序代码写的都非常简约,适合学习观摩,所以,收集了一些优秀的开源源码,整理成下载地 ...

  8. html实现日历签到页面,jquery每日签到日历插件

    这是一款使用jquery来实现的每日签到日历插件源代码.该每日签到插件可以实现签到功能,查看签到次数等,非常实用. 使用方法 在页面中引入样式文件style.css,jquery.min.js和签到j ...

  9. 基于ThinkPHP+Element的低代码后台开发框架,开箱即用无需配置

    ========================================================= 开发文档   社区地址   官网地址   演示地址   立即下载 ========= ...

最新文章

  1. datagrid表头与数据列宽度不对齐_easyui datagrid标题列宽度自适应
  2. eclipse Maven项目发布到Tomcat下classes文件夹却没有子模块的编译类
  3. CVPR | BASNet:边缘感知的显著性物体检测
  4. MongoDB入门示例及介绍
  5. 17.立体匹配——更好的效果与挑战,总结_5
  6. 一步一步写算法(之 回数)
  7. python学生信息管理
  8. 【web前端开发】vs code插件推荐
  9. Java关于周跨年的周数计算,编写一个JAVA类,用于计算两个日期之间的周数。
  10. Sentaurus 入门之一安装教程
  11. 公司官网建站笔记(四):从阿里云将域名转出,并将域名转入腾讯云
  12. python 数据填充
  13. 字符设备、块设备、网络设备详解
  14. eclipse 是用来写客户端的,MyEclipse 是用来写服务器端的,谐音记忆法,My 买,买服务器这样就好记了。
  15. CentOS8 编译安装tsar nagios + nagios-plugins + nsca
  16. C++程序运算时间计算
  17. Glib学习(17) Key-value文件解析器 Key-value file parser
  18. No fallbackFactory instance of type class com.chongyou.system.api.factory.RemoteUserFallbackFactory
  19. 图书管理系统java+Oracle
  20. Go语言 数据库编程

热门文章

  1. mysql多字段设置为text问题
  2. ES6读书笔记--对js对象爱的深沉
  3. 不靠坑蒙拐骗和运气,就不能致富吗?
  4. word文档转excel表格
  5. Vue-nginx反向代理
  6. long型转换为int型
  7. 【MFC】SetWindowPos函数使用详解
  8. 基于Android的手机通讯录设计
  9. moto z android7.1,联想新Moto Z曝光:骁龙835+安卓7.1.1,下月发?
  10. 小程序授权之支付宝(证书模式)