模拟抽奖记录

编程入门 行业动态 更新时间:2024-10-25 22:34:47

模拟抽奖记录

模拟抽奖记录

效果图:

页面:

<div id="goods_div">@if(!empty($id))@foreach($LuckyDrawDatas as $key => $item)<div class="layui-form-item"><lable class="layui-form-label">请输入奖品</lable><div class="layui-input-inline"><input type="text" name="name[]" required  lay-verify="required" placeholder="请输入" autocomplete="off" class="layui-input" @if (!empty($id)) value="{{ $item -> name }}" @endif></div><lable class="layui-form-label">请选择类型</lable><div class="layui-input-inline" style="width: 150px;">{{--                        <select name="type" lay-filter="goods_ids" xm-select="goods_ids" xm-select-type="1" xm-select-search>--}}<select name="type" lay-verify="required"><option value="0">请选择</option><option value="1" @if(!empty($id) && $item -> type == 1) selected="selected" @endif>虚拟奖品</option><option value="2" @if(!empty($id) && $item -> type == 2) selected="selected" @endif>实物奖品</option></select></div><lable class="layui-form-label">数量</lable><div class="layui-input-inline" style="width: 70px;"><input type="text" name="quantity[]" required lay-verify="required" placeholder="请输入" autocomplete="off" class="layui-input" @if (!empty($id)) value="{{ $item -> quantity }}" @endif></div><lable class="layui-form-label">中奖概率</lable><div class="layui-input-inline" style="width: 70px;"><input type="text" name="rate[]" required  lay-verify="required" placeholder="请输入" autocomplete="off" class="layui-input" @if (!empty($id)) value="{{ $item -> rate }}" @endif></div><span class="layui-btn add_prize" title="添加奖品项"> + </span>@if($key>0)<span class="layui-btn layui-btn-danger delete_prize" title="减少奖品项"> - </span>@endif@if (!empty( $id ))<input type="hidden" name="prize_id[]" value="{{ $item -> id }}">@endif</div>@endforeach@else<div class="layui-form-item" id=""><lable class="layui-form-label">请输入奖品</lable><div class="layui-input-inline"><input type="text" name="name[]" required  lay-verify="required" placeholder="请输入" autocomplete="off" class="layui-input"></div><lable class="layui-form-label">请选择类型</lable><div class="layui-input-inline" style="width: 150px;"><select name="type" lay-verify="required"><option value="0">请选择</option><option value="1">虚拟奖品</option><option value="2">实物奖品</option></select></div><lable class="layui-form-label">数量</lable><div class="layui-input-inline" style="width: 70px;"><input type="text" name="quantity[]" required lay-verify="required" placeholder="请输入" autocomplete="off" class="layui-input"></div><lable class="layui-form-label">中奖概率</lable><div class="layui-input-inline" style="width: 70px;"><input type="text" name="rate[]" required  lay-verify="required" placeholder="请输入" autocomplete="off" class="layui-input"></div><span class="layui-btn add_prize" title="添加奖品项"> + </span></div>@endif</div>

js:

//添加奖品项$(document).on('click', '.add_prize', function() {// layer.msg('响应点击事件');var str = '<div class="layui-form-item" style="margin: 7px 0 7px 0;">\n' +'                    <lable class="layui-form-label">请输入奖品</lable>\n' +'                    <div class="layui-input-inline">\n' +'                        <input type="text" name="name[]" required  lay-verify="required" placeholder="请输入" autocomplete="off" class="layui-input">\n' +'                    </div>\n' +'\n' +'                    <lable class="layui-form-label">请选择类型</lable>\n' +'                    <div class="layui-input-inline" style="width: 150px;">\n' +'                        <select name="type" lay-verify="required">\n' +'                            <option value="0">请选择</option>\n' +'                            <option value="1">虚拟奖品</option>\n' +'                            <option value="2">实物奖品</option>\n' +'                        </select>\n' +'                    </div>\n' +'\n' +'                    <lable class="layui-form-label">数量</lable>\n' +'                    <div class="layui-input-inline" style="width: 70px;">\n' +'                        <input type="text" name="quantity[]" required lay-verify="required" placeholder="请输入" autocomplete="off" class="layui-input">\n' +'                    </div>\n' +'\n' +'                    <lable class="layui-form-label">中奖概率</lable>\n' +'                    <div class="layui-input-inline" style="width: 70px;">\n' +'                        <input type="text" name="rate[]" required  lay-verify="required" placeholder="请输入" autocomplete="off" class="layui-input">\n' +'                    </div>\n' +'\n' +'                    <span class="layui-btn add_prize" title="添加奖品项"> + </span>\n' +'                    <span class="layui-btn layui-btn-danger delete_prize" title="减少奖品项"> - </span>\n' +'                </div>';$("#goods_div>div:last").append(str);form.render('select');});//减少奖品项$(document).on('click', '.delete_prize', function() {$(this).parent().remove();});

控制器:

            //新增或者编辑活动//数据写入活动奖品表
//            $data['goods_info'] = [['goods_name'=>'饮水机', 'quantity'=>10], ['goods_name'=>'净水器', 'quantity'=>20]];foreach ($data['name'] as $k=>$v){$data['goods_info'][] = ['goods_name'=>$v, 'quantity'=>$data['quantity'][$k], 'rate'=>$data['rate'][$k], 'id'=>isset($data['prize_id'][$k])?$data['prize_id'][$k]:''];}if(isset($data['goods_info'])){//当编辑时减少了奖品项$oldPrizeIds = $LuckyDraw::where('draw_id', $id)->pluck('id')->toArray();$diff = array_diff($oldPrizeIds, $data['prize_id']);if($diff){foreach ($diff as $m){$flag = $LuckyDraw->deleteLuckyDraw($m);}}foreach ($data['goods_info'] as $key=>$val){$data['name'] = $val['goods_name'];$data['quantity'] = $val['quantity'];$data['rate'] = $val['rate'];$data['draw_id'] = $draw_id;$flag = $LuckyDraw->saveLuckyDraw($data, $val['id']);if(!$flag){$msg = '添加失败';throw new AdminException($msg,-1);}}}else{$flag = $LuckyDraw->saveLuckyDraw($data);}

模型:

    public function saveLuckyDraw($data,$id) {if($item = $this->fill($data)->toArray()){if($id){return LuckyDraw::where('id', $id)->update($item);}else{return LuckyDraw::insert($item);}}}public function updateData($data) {LuckyDraw::where('id',$data['id'])->decrement('quantity');// 已中奖,库存自减 1//当奖品库存为0,从原奖品数组中剔除已经中奖礼品   将库存为0奖品设为删除状态。$quantity = LuckyDraw::where('id',$data['id']) -> value('quantity');if($quantity <= 0){$this->deleteLuckyDraw($data['id']);}}public function deleteLuckyDraw($id) {$item['status'] = 1;LuckyDraw::where('id',$id)->update($item);}

 

 

ps:抽奖代码

    //抽奖管理 -- 开始抽奖public function beganToDraw (Request $request) {//获取用户登录等信息global $_U;$user = $_U["user"];//从数据库中获取用户是否已经参加抽奖$user_id = $user['id'];$DrawInfo = new DrawInfo();if($DrawInfo->where("user_id", $user_id)->count()>0){return json_encode(array('code'=>0,'msg'=>'您的抽奖机会已经用完'));}//高并发情况,先将用户进入抽奖前置集合,//判断用户是否已在抽奖前置集合,如果在则已抽奖,否则未抽奖// 用户抽奖前置集合,为了避免重复抽奖,做一个判断$isExist = Redis::sAdd('user_set',$user_id);if(!$isExist){return json_encode(array('code'=>0,'msg'=>'正在抽奖中,请等待结果。'));}//初始化奖品池,7个奖品,满概率100,最小概率为1$model = new LuckyDraw();$list = $model -> where('status',0) -> get() -> toArray();/* 抽奖操作,抽奖前判断redis队列库存量 */$count=Redis::lpop('goods_store:1');//lpop是移除并返回列表的第一个元素。if(!$count) return '已经抢光了哦';/* 下面处理抽奖成功流程 *///下标存储数组,按概率分配对应的数量$indexArr = array();for($i=0;$i<sizeof($list);$i++){for($j=0;$j<$list[$i]['rate'];$j++){//index 追加到数组indexArrarray_push($indexArr, $i);}}//数组乱序shuffle($indexArr);//从下标数组中随机取一个下标作为中奖下标,$rand_index 是$indexArr的随机元素的下标(0-99)$rand_index = array_rand($indexArr,1);//获取中奖信息 更新中奖奖品库存 已中奖,库存减一,当奖品库存为0,从原奖品数组中剔除已经中奖礼品,将库存为0设为删除状态。$prize_index = $indexArr[$rand_index];$prizeInfo = $list[$prize_index];$quantity = array('id' => $prizeInfo['id']);$model -> updateData($quantity);//生成一个用户抽奖的数据,用来记录到数据库$data=array('id'=>'','user_name'=>$user['name'],'user_id'=>$user_id,'content'=>$prizeInfo['name'],//中奖信息'created_at'=>date('Y-m-d H:i:s'));//将用户抽奖信息数组写入数据库$DrawInfo->saveDate($data);$data['code'] = 1;$data['msg'] = array('pnum' => $prize_index,//对应前端奖品编号'pid' => $prizeInfo['id'],'pname' => $prizeInfo['name']);
//        dd($data);return json_encode($data);}//往redis的goods_store列表中存入库存public function addRedis(){$model = new LuckyDraw();
//        $num = $model -> where('status',0) -> sum('quantity');//奖品库存$num=10; //库存$len=Redis::llen('goods_store:1'); //检查库存,goods_store:1 定义为健名$count = $num-$len; //实际库存-被抢购的库存 = 剩余可用库存for($i=0;$i<$count;$i++) Redis::lpush('goods_store:1',1);//往goods_store列表中存入库存,未抢购之前这里应该是默认滴push10个库存数了//        echo Redis::llen('goods_store:1');//未抢购之前这里就是10了}

参考链接:

redis实现高并发下的抢购/秒杀功能:.html

php 抽奖算法(适合九宫格和大转盘):

PHP抽奖功能实例:.html

更多推荐

模拟抽奖记录

本文发布于:2024-03-10 17:45:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1728615.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!