PHP 基于ThinkPHP实现每日签到及奖励功能
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实现每日签到及奖励功能相关推荐
- html5 签到系统功能,项目实战之基于JavaScript实现每日签到打卡轨迹功能
今天扣丁学堂HTML5培训老师给大家介绍一下关于js实现每日签到打卡轨迹功能的具体代码,希望对同学们学习HTML5开发有所帮助,下面我们一起来看一下吧. 1.核心文件calendar.js var c ...
- php 微信分享功能_基于thinkPHP实现的微信自定义分享功能
这篇文章主要介绍了基于thinkPHP实现的微信自定义分享功能,结合实例形式分析了thinkPHP调用微信接口实现自定义分享功能的相关操作技巧,需要的朋友可以参考下 本文实例讲述了基于thinkPHP ...
- 前端捕捉轨迹_基于JavaScript实现每日签到打卡轨迹功能
本文实例为大家分享了js实现每日签到打卡轨迹功能的具体代码,供大家参考,具体内容如下 1. 核心文件 calendar.js var calUtil = { //当前日历显示的年份 showYear: ...
- thinkphp mysql 日志_基于thinkphp实现异常日志详细统计功能
后端的代码基于thinkphp框架开发,随着业务的增加,代码复杂度不断增多,而且有好几份代码,可能部署在不同的服务器上.即使在测试服务器上经过严格测试,正式环境有时也很难避免出现bug,所以需要较为详 ...
- 基于jQuery的日历+每日签到功能
公司要开发一个h5页面,里边有一个每日签到抽奖的功能,本以为这样的插件应该会有很多,结果找到的全都是仅生成日历的插件,于是乎就出现了下面这个东西.(前端菜鸟,请大神嘴下留情,也请小伙伴们多提宝贵意见) ...
- 基于微信小程序的每日签到打卡
社会的发展和科学技术的进步,互联网技术越来越受欢迎.手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用.手机具有便利性,速度快,效率高,成本低等优点. 因此,构建符合自己要求的操作系统是非常 ...
- php基于thinkphp、smarty\CodeIgniter构建的开源的淘宝客cms程序下载
现在有很多开源的淘宝客软件cms,很多人不知道,所以,提供该服务,完全开源,比市面上的加密的好很多, 这些开源的淘宝客程序代码写的都非常简约,适合学习观摩,所以,收集了一些优秀的开源源码,整理成下载地 ...
- html实现日历签到页面,jquery每日签到日历插件
这是一款使用jquery来实现的每日签到日历插件源代码.该每日签到插件可以实现签到功能,查看签到次数等,非常实用. 使用方法 在页面中引入样式文件style.css,jquery.min.js和签到j ...
- 基于ThinkPHP+Element的低代码后台开发框架,开箱即用无需配置
========================================================= 开发文档 社区地址 官网地址 演示地址 立即下载 ========= ...
最新文章
- datagrid表头与数据列宽度不对齐_easyui datagrid标题列宽度自适应
- eclipse Maven项目发布到Tomcat下classes文件夹却没有子模块的编译类
- CVPR | BASNet:边缘感知的显著性物体检测
- MongoDB入门示例及介绍
- 17.立体匹配——更好的效果与挑战,总结_5
- 一步一步写算法(之 回数)
- python学生信息管理
- 【web前端开发】vs code插件推荐
- Java关于周跨年的周数计算,编写一个JAVA类,用于计算两个日期之间的周数。
- Sentaurus 入门之一安装教程
- 公司官网建站笔记(四):从阿里云将域名转出,并将域名转入腾讯云
- python 数据填充
- 字符设备、块设备、网络设备详解
- eclipse 是用来写客户端的,MyEclipse 是用来写服务器端的,谐音记忆法,My 买,买服务器这样就好记了。
- CentOS8 编译安装tsar nagios + nagios-plugins + nsca
- C++程序运算时间计算
- Glib学习(17) Key-value文件解析器 Key-value file parser
- No fallbackFactory instance of type class com.chongyou.system.api.factory.RemoteUserFallbackFactory
- 图书管理系统java+Oracle
- Go语言 数据库编程