天天看点

thinkphp5签到功能获取奖励

<?php
/**
 * 用户签到
 */
namespace app\index\controller;

use app\common\controller\Frontend;
use app\index\controller\Common as Base;
use think\Db;
use think\Session;

class ClickSign extends Frontend
{

    protected $noNeedLogin = '*';
    protected $noNeedRight = '*';
    protected $layout = '';

    public function index()
    {
        $user_id = 1;
        $data = Db::name('web_news')->where('status',2)->order('weigh desc')->field('id,title,memo,createtime,image')->select();
        $qiandao_array = Db::name('integral_setup')->field('day_checkin,three_day,seven_day,fifteen_day,twenty_five_day,thirty_day')->find(1);
        //获取今日签到状态
        $res_status = $this->check_day_qiandao($user_id);
        //获取本月签到次数
        $month_count = $this->check_month_day($user_id);
        //获取今天签到能获取到的积分
        $day_jifen = $this->check_continuous_qiandao($user_id,$month_count);
        return $this->view->fetch('',[
           'data'=>$data,
           'res_status'=>$res_status,
           'month_count'=>$month_count,
           'day_jifen' => $day_jifen,
           'qiandao_array'=>$qiandao_array
        ]);
    }

    public function info(){
        $id = $_GET['id'];
        $data = Db::name('web_news')->field('id,title,content,createtime,image')->find($id);

        return $this->view->fetch('',[
            'data'=>$data
        ]);
    }

    //用户签到
    public function qiandao(){
            $user_id = 1;
            $this->del_qiandao($user_id);
            $day_check = $this->check_day_qiandao($user_id);
            if(true == $day_check){
                return Rjson('202','您今天已经签到过了');
            }else{
                //添加今日签到数据
                //检查昨天是否有签到过,如果有,则为连续签到,根据签到规则,设置相对应积分
                //获取签到积分和连续签到积分
//                $yestaday = $this->getLastTime(1,'before');
                //验证昨天是否签到
                $check_before_qiandao = $this->check_qiandao($user_id);
                //为false 则昨天没有签到
                //为true 昨天有签到
                //获取用户签到最大和连续签到时间
                $user = new \app\index\model\User();
                $member_info = $user->get($user_id);
                //获取签到积分

                Db::startTrans();
                try {
                    //说明昨天有签到,则获取连续签到天数
                    $add_day = $this->check_month_day($user_id)+1;
                    if($check_before_qiandao == true){
                        //签到成功后+1
                        //更新连续签到次数
                        $member_info->save(['continuity_day'=>$add_day],['id'=>$user_id]);
                    }else{
                        //签到成功后+1
                        //则连续签到时间改为1
                        $member_info->save(['continuity_day'=>1],['id'=>$user_id]);
                    }
                    //更新积分
                    //如果连续签到天数,大于最大签到次数,则更新最大签到天数
                    if( $add_day > intval($member_info['max_days'])){
                        $member_info->save(['max_days'=>$this->check_month_day($user_id)+1],['id'=>$user_id]);
                        return true;
                    }
                    //查询今日签到,能获取到多少积分
                    $jifen = $this->check_continuous_qiandao($user_id,$add_day);
                    //更新积分,更新日志表
                    Db::name('user')->where('id',$user_id)->update(['score'=>bcadd($jifen,$member_info->score)]);
                    //写入积分日志
                    self::score_log($user_id,'+'.$jifen,$member_info->score,bcadd($jifen,$member_info->score),'签到'.$add_day.'天获得积分');
                    $data = [
                        'user_id'=>$user_id,
                        'create_time'=>time(),
                        'number'=>$jifen
                    ];
                    $res = $this->addSign($data);
                    if(!$res) return Rjson('202','签到失败!');
                    return Rjson('200','签到成功!');
                    Db::commit();
                }catch (\Exception $e){
                    // 回滚事务
                    $this->error('签到失败','/index/user/index');
                    Db::rollback();
                }
            }
        }

    //清除掉用户两天前的登录记录,防止用户登录数据过大,同时为连续签到保存依据
    public function del_qiandao($user_id){
        $two_days_before = $this->getLastTime(10,'before');
        Db::name('user_sign')
            ->where("create_time","<=",$two_days_before['star'])
            ->where('user_id',$user_id)
            ->delete();
    }
    //验证今天是否有签到数据
    public function check_day_qiandao($user_id){
        $res = Db::name('user_sign')->where('user_id',$user_id)->whereTime('create_time', 'today')->select();
        if(!$res) return false;
        return true;
    }
    //验证昨天是否有签到数据
    public function check_qiandao($user_id){
        $res = Db::name('user_sign')->where('user_id',$user_id)->whereTime('create_time', 'yesterday')->select();
        if(!$res) return false;
        return true;
    }
    //查询本月签到次数
    public function check_month_day($user_id){
        //查询本月签到次数
        $month_num = Db::name('user_sign')->where('user_id',$user_id)->whereTime('create_time', 'month')->count();
        return $month_num;
    }
    //连续签到获取积分
    public function check_continuous_qiandao($user_id,$month_num){
        //获取连续签到次数
        //查询本月签到次数
        $integral = "";
        $qiandao_array = Db::name('integral_setup')->field('day_checkin,three_day,seven_day,fifteen_day,twenty_five_day,thirty_day')->find(1);
        //$month_num = Db::name('user_sign')->where('user_id',$user_id)->whereTime('create_time', 'month')->count();
        if($month_num == 3){
            $integral = $qiandao_array['three_day'];
        }else if($month_num == 7){
            $integral = $qiandao_array['seven_day'];
        }else if($month_num == 15){
            $integral = $qiandao_array['fifteen_day'];
        }else if($month_num == 25){
            $integral = $qiandao_array['twenty_five_day'];
        }else if($month_num == 30){
            $integral = $qiandao_array['thirty_day'];
        }else{
            $integral = $qiandao_array['day_checkin'];
        }
        return $integral;
    }
    //添加签到表
    public function addSign($data=[]){
        $addRes = Db::name('user_sign')->insert($data);
        return $addRes;
    }

}
前端代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="__CDN__/assets/staff/css/base.css">
    <link rel="stylesheet" href="__CDN__/assets/staff/css/staff_common.css">
    <link rel="stylesheet" href="__CDN__/assets/staff/css/signin.css">
    <link rel="stylesheet" href="__CDN__/assets/staff/layui/css/layui.css">
    <link rel="stylesheet" href="__CDN__/assets/staff/css/steps.css">
    <script type="text/javascript" src="__CDN__/assets/staff/js/jquery.min.js"></script>
    <script type="text/javascript" src="__CDN__/assets/staff/js/steps.js"></script>
    <script type="text/javascript" src="__CDN__/assets/staff/layui/layui.js"></script>
    <title>签到管理</title>
</head>

<body>
<header class="header">
    <span><a href="{:url('user/index')}"><img src="__CDN__/assets/staff/images/back.png" alt=""></a></span>
    <span class="header_2">签到管理</span>
    <span class="header_3"><a href="{:url('points_rules/index')}">如何领取及使用积分</a></span>
</header>
<div class="show-bg-block">
    <div class="sigin_name">
        {if condition="$res_status eq true"}
        今天已签到,获得奖励+{$day_jifen}
        {else}
        今天还没签到,签到获得奖励
        {/if}
    </div>
    <div class="integral-img">
        <img src="__CDN__/assets/staff/images/integral.png" alt="">
        积分 x {$day_jifen}
    </div>
    <div class="integral-button">
        <div class="integral-bor">
           {if condition="$res_status eq true"}
            <button type="button"  id="integral-btn2">已签到</button>
            {else}
            <button type="button" id="integral-btn">签到</button>
            {/if}
        </div>
    </div>
    <div class="reBox">
        <div id="steps1"></div>
        <div class="lineDansh">
            <div class="proBar" id="proBar"></div>
        </div>
    </div>
</div>
<div class="sigin-data">
    <label>签到日期</label>
    <table class="layui-table">
        <tbody>
        <tr>
            <td class="layui-table-td">2016-11-29</td>
            <td class="layui-table-td">未签到</td>
        </tr>
        <tr>
            <td class="layui-table-td">2016-11-29</td>
            <td class="layui-table-td">已签到</td>
        </tr>
        <tr>
            <td class="layui-table-td">2016-11-29</td>
            <td class="layui-table-td">未签到</td>
        </tr>
        <tr>
            <td class="layui-table-td">2016-11-29</td>
            <td class="layui-table-td">未签到</td>
        </tr>
        </tbody>
    </table>
</div>
<style>
    .step-line,.step-finish-line-bg{
        background: #c0c4cc;
        padding-right: 24px;
    }
    .proBar{
        height: 100%;
        width: 0;
        background: #fbf19a;
    }
    .step-line-box{
        text-align: right;
    }
    .steps-horizontal .step{
        align-items: flex-end;
    }
    .steps .step:last-child .step-line{
        display: block;
    }
    .step.current .step-icon{
        background: #f4de1e;
        border-color: #f4de1e;
    }
</style>
<script type="text/javascript" src="__CDN__/assets/staff/js/common.js"></script>
<script>
    $('#integral-btn').on('click',function () {
        $.ajax({
            url:'click_sign/qiandao',
            dataType:'json',
            type:'post',
            success:function (res) {
                if(res.code == 200){
                    window.location.reload()
                }else{
                    window.location.reload()
                }
            }
        })
    })
</script>
<script type="text/javascript">
    var steps1 = steps({
        el: "#steps1",
        data: [
            { title: "第3天", description:  '奖励'+{$qiandao_array['three_day']}+'' ,icon:"<embed class='icon' src='__CDN__/assets/staff/images/liwu.svg' type='image/svg+xml'/>"},
            { title: "第7天", description:  '奖励'+{$qiandao_array['seven_day']}+'' ,icon:"<embed class='icon' src='__CDN__/assets/staff/images/liwu.svg' type='image/svg+xml'/>"},
            { title: "第15天", description: '奖励'+{$qiandao_array['fifteen_day']}+'' ,icon:"<embed class='icon' src='__CDN__/assets/staff/images/liwu.svg' type='image/svg+xml'/>"},
            { title: "第25天", description: '奖励'+{$qiandao_array['twenty_five_day']}+'' ,icon:"<embed class='icon' src='__CDN__/assets/staff/images/liwu.svg' type='image/svg+xml'/>"},
            { title: "第30天", description: '奖励'+{$qiandao_array['thirty_day']}+'' ,icon:"<embed class='icon' src='__CDN__/assets/staff/images/liwu.svg' type='image/svg+xml'/>"},
        ],
        active: 2,
        // finishLine:"#fcf299",
        dataOrder: ["title", "line", "description"],
        iconType: "custom",
        customClass: "custom-class"
    });
    var day = {$month_count};
    if(day<=3 && day >0){
        process(day,3,0,0);
    }else if(day<=7 && day >3){
        process(day,7,3,1);
    }else if(day<=15 && day >7){
        process(day,15,7,2);
    }else if(day<=25 && day >15){
        process(day,25,15,3);
    }else if(day<=30 && day >25){
        process(day,30,25,4);
    }
    function process(day,max,min,num){
        if(day<=max && day>min ){
            day = day-min;
            let len = max-min;
            let percent = (day / len)*100;
            for(var i=0;i<num;i++){
                $(".step").eq(i).find(".proBar").css("width",'100%');
                $(".step").eq(i).addClass('current');
            }
            $(".step").eq(num).find(".proBar").css("width",percent+'%');
            if(day==len){
                $(".step").eq(num).addClass('current')
            }
        }
    }
</script>
</body>

</html>