目录
一、需求1、为什么要赠送积分2、怎么获取积分3、积分如何使用1)、兑换2)、抵扣3)、等等
二、规则1、用户注册2、成功邀请新用户3、用户签到4、联想
三、数据表1、用户表 user2、用户签到表 user_sign3、积分(获取)日志表 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、用户签到方法
public function sign() {
$userInfo = self
::loginInfo();
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'));
$yesterdayParam = ['userId' => $userId, 'dateTime' => $yesterday];
$yesterdayInfo = $signDao->single($yesterdayParam);
if ($yesterdayInfo){
$userDao->setInc(['id' => $userId], 'signDay', 1);
}else{
$userDao->updateByQuery(['signDay' => 1], ['id' => $userId]);
}
list($integral, $remark) = IntegralService
::insert($userId, 2);
$data = [
'userId' => $userId,
'dateTime' => $dateTime,
'integral' => $integral,
'remark' => $remark
];
$signDao->insert($data);
return 'success';
}
2、公共类 - 积分赠送日志方法
这个表可以再加个type字段,区分积分类型:积分获取/积分消费
class IntegralService{
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);
if (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);
$userDao->setInc(['id' => $userId], 'integral', $integral);
return [$integral, $remark];
}
public static function userSign($userId, $userDao){
$userInfo = $userDao->info($userId);
if (empty($userInfo)){
exit('用户不存在');
}
$signDay = $userInfo['signDay'];
$remark = '';
$integral = 3;
if ($signDay != 0){
$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){
if ($isGiveExtra){
break;
}
$integral += $giveIntegral;
$remark = "您已经连续签到了 [ {$day} ] 天,额外赠送您 [ {$giveIntegral} ] 积分";
$isGiveExtra = true;
}
}
}
$remark = $remark ? $remark : '签到赠送积分';
return [$integral, $remark];
}
}