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');
});

浙公网安备 33010602011771号