天天看點

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>