thinkphp用户签到积分逻辑代码

namespace app\index\controller;

use think\Controller;
use think\facade\Session;

class SignIn extends Controller
{

    public function signIn()
    {
        // 1.验证是否登录
        if(!Session::has('student_id')){
            show([],0,'请先登录');
        }
        //获取用户信息
        $user_info=model('student')->where('id',$user_id)->find();
        /**
         * 2.验证今日是否已签到
         * 获取今日凌晨时间戳, 通过查询 sign_in_time 字段来判断
         */
        $signIn = model('student_sign');
        $today_time = strtotime(date('Y-m-d'));
        // 查询条件
        // 查询今日是否已签到
        $exist = $signIn
            ->where('user_id',$user_info['id'])
            ->where('sign_in_time','>=',$today_time)
            ->count();
        if ($exist > 0) {
            show([],0,'今天已经签到过啦!');
        }
        /**
         * 3.开始签到逻辑
         * 先查询昨天的签到记录
         *   如果查到, 则说明是连续签到, 连续签到天数加1
         *   未查到, 连续签到天数为1
         * 根据连续签到天数, 获取相应的积分
         */
        $yesterdayAt = $today_time - 86400;
        // 昨天的签到记录
        $yesterdayRecord = $signIn
            ->where('user_id',$user_info['id'])
            ->where('sign_in_time','EGT',$yesterdayAt)
            ->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' => $user_info['id'],
            'username' => $user_info['name'],
            'integral' => bcmul($integral,100),
            'continuous_days' => $continuousDays,
            'sign_in_time' => time(),
            'created_time' => time(),
        );
        // 得到了连续签到天数, 和应得的积分, 此处可以添加 额外获取积分的逻辑
        $insertRet = $signIn->insert($insertData);
        if (!$insertRet) {
            show([],0,'签到失败');
        }
        //更新用户积分数
        $res=model('student')->where('id',$user_info['id'])->setInc('score',bcmul($integral,100));
        $msg=sprintf('签到成功, 连续签到%d天, 获得%d积分', $continuousDays, $integral);
        if($res){
            show([],200,$msg);
        }
    }
    /**
     * 签到获取积分规则
     * @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,
//            9 => 45,
//            10 => 50,
//            11 => 55,
//            12 => 60,
//        );

        /**
         * 每天相同签到积分
         */
        $config = array(
            1 => 5, // 每天都是5积分
        );
//        $config = array(
//            1 => 5, // 一天以上5积分
//            3 => 10, // 三天以上10积分
//            5 => 20, // 五天以上20积分
//            10 => 50, // 10天以上50积分
//        );

        return $config;
    }
}

 PHP老头博客网:PHP老头博客网 - PHP博客-站长和程序猿的资源库,PHP、源码、资讯、代码、教学、教程、网站开发、软件开发、APP开发。PHP老头博客网为个人站长与企业网络提供全面的站长资讯、源代码程序下载、php代码教程、操作系统安装使用、服务器技术、编程知识、优秀网站推荐、个人和企业网站运营、网页制作、软件使用技巧、网站开发、小程序开发、软件开发、互联网技术分享等。https://www.laotouw.com

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值