laravel 秒杀功能实现

控制器代码

<?php

namespace App\Http\Controllers;

use App\Models\Article;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;

class MiaoshaController extends Controller
{
    public function goood_redis(){
        $article = Article::get(['goods_repertory','id']);
        $data = json_decode($article,true);


        foreach ($data as $key=>$value){
            for ($i=1;$i<=$value['goods_repertory'];$i++){
                Redis::lpush('goods'.$value['id'],$i);
            }

        }
        return "设置redis成功";
    }

    public function index(){
        $data = Article::all();
        return view('miaosha2',compact('data'));
    }

    public function endtime(){
        $article = Article::get(['end_time','id']);
        $data = json_decode($article,true);

        foreach ($data as $k=>$v){

            $newtime = time();
            $endtime = $v['end_time'];
            $jietime = $endtime-$newtime;
            $hour = floor($jietime/3600);
            $minu = floor(( $jietime-$hour*3600)/60);
            $sec = $jietime-$hour*3600-$minu*60;

            $data[$k]['hour'] = $hour;
            $data[$k]['minute'] = $minu;
            $data[$k]['sec'] = $sec;
        }
        return $data;
    }


    public function goodsfor(Request $request)
    {
        $id = $request->get('id');
        $arr = Article::where('id', $id)->get('end_time');
        $data = json_decode($arr, true);

        $endtime = $data[0]['end_time'];

        if (time() > $endtime) {
            return ['code' => 2, 'mssage' => '秒杀结束', 'data' => ''];
        }

        $key = 'goods' . $id;
        if (Redis::llen($key) > 0) {
            Redis::lpop($key);

            // 减库存
           DB::table('articles')->where('id',$id)->decrement('goods_repertory');
            //生成订单
           $order_id=date('Ymd',time()).md5(rand(100,999));       // 订单号,你可以随便生成
           $addtime=time();
           DB::table('order')->insert(['order_id'=>$order_id,'addtime'=>$addtime,'goods_id'=>$id]);
            return ['code' => 0, 'mssage' => '秒杀成功', 'data' => $order_id];
        } else {
            return ['code' => 1, 'mssage' => '商品已经抢完', 'data' => ''];
        }
    }
    public  function log($log){
        file_put_contents(storage_path('logs/redis.log'),$log."\r\n",FILE_APPEND);
    }

}

  

  视图层

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>秒杀页面</title>

    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
@foreach($data as $v)

    <div style='float:left;margin-right:20px;'>
        <div>
        <img src="{{$v->goods_path}}" alt="" width='280' height='200'>
    </div>
    <div>距秒杀结束时间 :
        <span id="h{{$v->id}}"></span>时
        <span id="m{{$v->id}}"></span>分
        <span id="s{{$v->id}}"></span>秒
    </div>
    <div>
        <p>商品名称 : {{$v->goods_name}}</p>
        <p>商品价格 : {{$v->goods_price}}元</p>
    </div>
    <div>
        <button class="button" id="{{$v->id}}">抢购</button>
    </div>
    </div>
@endforeach
</body>
</html>
<script type="text/javascript">
    $(document).ready(function () {
        window.setInterval(function () {
            $.ajax({
                url:"http://www.1117.com/article/endtime",
                type:'get',
                dataType:'json',
                success:function (data){
                    for (var i=0;i<data.length;i++){
                        id = data[i]['id'];
                        $('#h'+id).text(data[i]['hour']);
                        $('#m'+id).text(data[i]['minute']);
                        $('#s'+id).text(data[i]['sec']);
                    }
                }
            })
        },1000)
    });
    $('.button').click(function () {
        let id = $(this).attr('id');
        $.ajax({
            url: "http://www.1117.com/article/goodsfor",
            type: 'get',
            data: {id:id},
            dataType:"json",
            success:function (data) {
                if (data['code']==0){
                    alert(data['mssage']);
                    location.href="http://www.1117.com/dingdan?id="+data['data'];

                }else {
                    alert(data['mssage']);
                    location.href="http://www.1117.com/shouye";
                }
            }
        })
    })


</script>

  路由

//秒杀
Route::group(['prefix' => 'article'],function() {
    Route::get('jiaoben','MiaoshaController@goood_redis');
    Route::get('index','MiaoshaController@index');
    Route::get('endtime','MiaoshaController@endtime');
    Route::get('goodsfor','MiaoshaController@goodsfor');
});

  

posted @ 2020-11-22 21:22  拉斯维加斯  阅读(346)  评论(0)    收藏  举报