目录

  • 一、需求
    • 1、为什么要赠送积分
    • 2、怎么获取积分
    • 3、积分如何使用
      • 1)、兑换
      • 2)、抵扣
      • 3)、等等
  • 二、规则
    • 1、用户注册
    • 2、成功邀请新用户
    • 3、用户签到
    • 4、联想
  • 三、数据表
    • 1、用户表 user
    • 2、用户签到表 user_sign
    • 3、积分(获取)日志表 integral_log
  • 四、代码
    • 1、用户签到方法
    • 2、公共类 - 积分赠送日志方法

一、需求

1、为什么要赠送积分

用户(连续)签到赠送(额外)积分,可以增加用户的活跃度,少一些僵尸用户;邀请好友赠送积分,可以扩大平台的用户量。

2、怎么获取积分

这个范围就比较广了,给几个获取积分的例子

  • 用户注册获取积分
  • 成功邀请新用户获取积分
  • 完成首购获取积分
  • 用户消费获取积分
  • 用户签到获取积分
  • 完成新手任务获取积分
  • 完善基本信息获取积分

3、积分如何使用

1)、兑换

  • 可以弄个积分商城,直接用积分兑换商品

2)、抵扣

  • 购买商品时,除了可以使用优惠券抵扣、余额抵扣,还可以使用积分抵扣

3)、等等

二、规则

1、用户注册

  • 用户注册赠送积分

2、成功邀请新用户

  • 成功邀请新用户,新用户有注册积分,邀请人有邀请积分

3、用户签到

  • 用户每日签到可以获取固定的积分
  • 用户连续签到满n天,额外赠送积分
  • 如果用户同时满足多个连续签到任务,则取额外积分为最大签到天数的积分
    • 多个签到任务:比如用户连续5天赠送1积分,用户连续签到10天赠送2积分;用户连续签到了10天,则既满足连续签到5天,又满足连续签到10天,我们取连续签到10天的2积分作为额外积分。(也可以都取,则额外积分为1+2=3,这个要看规则怎么定了)

4、联想

  • 可以添加规则用户签到当天如果是用户生日,积分翻倍

    • Tips:如果生日可为公历,也可为农历,则要注意区分

三、数据表

1、用户表 user

`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
...
`integral` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '总积分',
`signDay` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '连续签到天数',
`createTime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`updateTime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',

2、用户签到表 user_sign

`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`userId` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
`integral` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '积分',
`dateTime` varchar(50) NOT NULL DEFAULT '' COMMENT '签到日期:格式为2090-01-01',
`remark` text COMMENT '备注',
`createTime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`updateTime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',

3、积分(获取)日志表 integral_log

`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`userId` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
`fkId` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '关联id',
`fkType` int(1) unsigned NOT NULL DEFAULT '0' COMMENT '关联类型:1:新用户注册;2用户签到;3用户消费;4邀请新用户;...',
`integral` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '积分',
`remark` text COMMENT '备注',
`createTime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`updateTime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',

四、代码

1、用户签到方法

/*** 用户签到* @return mixed* @throws Exception*/
public function sign() {$userInfo = self::loginInfo();  //缓存中根据Token获取用户的登录信息if (!$userInfo){exit('请先登录');}$userId = $userInfo['id'];$userDao = new UserDao();       //实例化用户表$signDao = new UserSignDao();   //实例化用户签到表//判断用户今天是否签到$dateTime = date('Y-m-d');$todayParam = ['userId' => $userId, 'dateTime' => $dateTime];$todayInfo = $signDao->single($todayParam);if ($todayInfo){exit('您今天已经签到过了');}//判断用户昨天是否签到$yesterday = date('Y-m-d', strtotime('-1 day'));    //昨天的日期格式:2090-01-01$yesterdayParam = ['userId' => $userId, 'dateTime' => $yesterday];$yesterdayInfo = $signDao->single($yesterdayParam);if ($yesterdayInfo){    //昨天签到了,签到天数自增1$userDao->setInc(['id' => $userId], 'signDay', 1);  //第三个参数默认为1,可以不传。}else{  //昨天断签,连续签到天数重置为1$userDao->updateByQuery(['signDay' => 1], ['id' => $userId]);  //更新该用户的签到天数为1天}list($integral, $remark) = IntegralService::insert($userId, 2);    //记录签到积分日志//添加签到数据$data = ['userId' => $userId,        //用户ID'dateTime' => $dateTime,    //签到日期'integral' => $integral,    //签到赠送的积分'remark' => $remark         //签到日志];$signDao->insert($data);        //添加数据,createTime,updateTime已在该方法中追加return 'success';
}

2、公共类 - 积分赠送日志方法

  • 这个表可以再加个type字段,区分积分类型:积分获取/积分消费
class IntegralService{/*** [积分赠送日志]公共方法* @param $userId 用户ID* @param $fkType 赠送类型:1:新用户注册;2用户签到;3用户消费;4邀请新用户;...* @param int $fkId 关联ID:如果类型为用户消费,则关联ID为订单的ID;如果类型为邀请新用户,则关联ID为新用户的ID...* @return array 返回[积分,备注]*/public static function insert($userId, $fkType, $fkId = 0){$remark = '';$integral = 0;$userDao = new UserDao();if ($fkType == 1){  //新用户注册$integral = 20; //新用户注册赠送积分:这个可以写到配置里$remark = '新用户赠送积分';}else if ($fkType == 2){    //每日签到赠送额外积分list($integral, $remark) = self::userSign($userId, $userDao);}else if ($fkType == 3){    //消费//...}else if ($fkType == 4){    //推荐新用户$userInfo = $userDao->info($fkId);  //新用户的IDif (empty($userInfo)){exit('被邀请用户不存在');}$integral = 10; //推荐新用户注册赠送积分:这个可以写到配置里$remark = '邀请新用户 [ ' . $userInfo['username'] . ' ] 赠送积分';}//积分日志记录$data = ['userId' => $userId,'fkId' => $fkId,'fkType' => $fkType,'integral' => $integral,'remark' => $remark];$integralDao = new IntegralLogDao();$integralDao->insert($data);    //添加数据,createTime,updateTime已在该方法中追加//用户积分自增$integral$userDao->setInc(['id' => $userId], 'integral', $integral);return [$integral, $remark];}/*** 获取会员签到获取的积分,备注* @param $userId* @param $userDao* @return array*/public static function userSign($userId, $userDao){$userInfo = $userDao->info($userId);if (empty($userInfo)){exit('用户不存在');}$signDay = $userInfo['signDay'];   //用户连续签到天数$remark = '';$integral = 3;  //用户每日签到积分:这个可以写到配置里if ($signDay != 0){ //如果签到日期不为0# 签到额外送积分:这个可以写到配置里/*** name:说明* desc:备注,这里表示连续签到天数* value:值,这里表示额外赠送积分数量*/$extraIntegral = [['name' => '连续签到7天额外赠送1积分', 'desc' => 7, 'value' => 1],['name' => '连续签到15天额外赠送2积分', 'desc' => 15, 'value' => 2],['name' => '连续签到30天额外赠送5积分', 'desc' => 30, 'value' => 5],];//二维数组排序:按照积分降序,如果同时满足多个连续签到任务,则取最大签到天数的积分。$values = array_column($extraIntegral, 'value');array_multisort($values, SORT_DESC, $extraIntegral);$isGiveExtra = false;                   //是否已经赠送了额外积分foreach ($extraIntegral as $value){$day = $value['desc'];              //配置的签到天数$giveIntegral = $value['value'];    //赠送额外积分if (($signDay % $day) == 0){        //如果:用户连续签到天数 % 配置的连续签到天数 = 0;我们认为该用户可以获取额外积分if ($isGiveExtra){              //如果:已经赠送了额外积分,则不再赠送,结束循环break;}$integral += $giveIntegral;     //积分 = 每日签到默认积分 + 连续签到额外赠送的积分$remark = "您已经连续签到了 [ {$day} ] 天,额外赠送您 [ {$giveIntegral} ] 积分"; //备注$isGiveExtra = true;            //设置为true,已经赠送了积分,不再重复赠送# 或者去除 $isGiveExtra 变量相关操作,直接在这里 break}}}$remark = $remark ? $remark : '签到赠送积分';return [$integral, $remark];}
}

PHP用户连续签到赠送额外积分相关推荐

  1. php会员签到送积分程序,PHP用户连续签到赠送额外积分

    class IntegralService{ /** * [积分赠送日志]公共方法 * @param $userId 用户ID * @param $fkType 赠送类型:1:新用户注册:2用户签到: ...

  2. HiveSQL面试题18--腾讯面试用户连续签到天数及历史最大连续签到天数问题

    目录 0 题目 1 数据准备 3 数据分析 4 小结 0 题目 有一张用户签到表[t_user_attendence],标记每天用户是否签到(说明:该表包含所有用户所有工作日的出勤记录) ,包含三个字 ...

  3. mysql怎么查出用户连续签到_连续签到奖励 数据库如何设计?

    -- 签到表设计 drop table if exists `t_user_sign`; create table `t_user_sign`( `sign_code` int(8) auto_inc ...

  4. CSDN是怎么实现用户签到,统计签到次数,连续签到天数等功能微服务的

    文章目录 需求分析 设计思路 用户签到和统计连续签到的次数 签到控制层 SignController 签到业务逻辑层 SignService 测试 按月统计用户签到的次数 签到控制层 SignCont ...

  5. 连续签到积分兑换试用流量主小程序开发

    每日签到积分兑换试用流量主小程序开发 打卡兑奖小程序.用户签到活得积分.积分可以兑换商品.观看激励视频广告可以积分翻倍. 用户可以参加试用商品活动参加试用需要提交信息.可以通过分享方式直接获取试用资格 ...

  6. mysql 连续签到天数_签到功能实现,没有你想的那么复杂(一)

    1 签到定义以及作用签到,指在规定的簿册上签名或写一"到"字,表示本人已经到达.在APP中使用此功能,可以增加用户粘性和活跃度.2 技术选型redis为主写入查询,mysql辅助查 ...

  7. java实现连续签到加分_java实现app签到功能

    本文实例为大家分享了java实现app签到功能的具体代码,供大家参考,具体内容如下 1.首先设计二张表,第一张表sign_calc记录用户连续签到次数,字段id,user_id,continue_da ...

  8. 连续签到数据表设计php,数据库,连续的签到系统怎么设计?

    背景:对连续签到的系统进行递级给积分,并且连续签到有一定的积分奖励,并且用户连续签到30天给比较多的积分. 要求:并不是按照自然月来签到. 怎么判断是不是连续签到呢? 然后就是数据库怎么设计好呢,因为 ...

  9. mysql5.7查询连续登录/连续签到天数

    1.DDL CREATE TABLE `user_sign_record` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键i ...

  10. java实现用户每日签到功能

    java用户每日签到 签到规则 签到周期以周为单位(最大连续签到天数为 7 天),周一为新的签到周期,所有连续签到天数重新开始计算. 表字段 以下为数据库所需的字段: 代码实现 非全部的代码: /** ...

最新文章

  1. 压缩和归档及vi的使用
  2. Hibernate:不容易理解的 lock 和 merge
  3. 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题
  4. C#教程8:面向对象编程【02】
  5. 计算机系职教周方案,琼软院软件〔2018〕14 号:关于印发《软件工程系2018年“职业教育 活动周”活动方案》的通知...
  6. 用Python处理图片九宫格
  7. centos7安装oracle12c 一
  8. 关于application title一直是untitled的问题
  9. C语言——机器平台对强制类型转换的影响
  10. 解决NetworkOnMainThreadException
  11. colmap 稀疏重建输出的cameras.txt, images.txt,points3D.txt含义
  12. 利用超级绘图王简化建筑识图课程的教学
  13. 什么是外汇EA?外汇EA有什么风险?
  14. Displayport 连接、握手时序
  15. 感知融合(六):运动补偿算法计算目标绝对速度
  16. ApkScan-PKID 查壳工具下载使用以及相关技术介绍
  17. 硕士毕业论文写多少字
  18. Cadence Allegro 17.4学习记录开始26-PCB Editor 17.4软件PCB中铺铜操作
  19. scala io实现 获取目下的所有子文件和子目录
  20. 多种计算机编程语言简介

热门文章

  1. 【数据结构】----将一个链表拆分为两个链表
  2. 法斗几个月长鼻筋_带锯罢工了,木工小哥检查问题出在哪里?分享带锯使用九个月感受...
  3. 100个人奇数枪毙Java,在JAVA中用for循环编写程序计算1~100之间的奇数之和
  4. 计算机专业 哪里的好,正规计算机专业哪里好
  5. 如何修改influxdb表结构_influxdb的基本使用
  6. php json替换,php解决json中中文部分被替换为unicode编码
  7. mysql Navicat for MySQL 安装和破解(完美)
  8. Android 微信分享与QQ分享功能
  9. 关于@Autowired的使用:推荐使用构造函数进行注入
  10. try...catch..finally..语句中,finally是否必须存在?作用是什么