微信小程序结合 tp实现秒杀
2024-09-28 08:00:12
一:建表
1:用户表
2:订单表
3:收货地址
4:秒杀的商品表:
二: 微信后台方法
1 /**
2 * 秒杀接口
3 */
4 public function seckill(Request $request)
5 {
6 //1.接收秒杀商品参数(参数验证),未登录用户不能参与秒杀
7 $params = $request->post();
8 $userID = $request->user_id;
9
10 //2.查询本地还有没有库存,如果没有库存,则提示库存不足
11 $redis = Redis::getInstance();
12 //求出秒杀队列的长度
13 $listName = 'seckill_queue_' . $params['goods_id'];
14 $listLen = $redis->lLen($listName);
15 //如果队列的长度小于等于0,没有库存
16 if ($listLen <= 0) {
17 return failJson('6000', '您手慢了,商品被抢购空了');
18 }
19 //3.如果有库存,进行判断该用户是否已经参与过秒杀,秒杀成功的用户数据存储到哪里的(set集合里的,无序且唯一)
20 $setName = 'seckkill_success_member_' . $params['goods_id'];
21 $bool = $redis->sIsMember($setName, $userID);
22 if ($bool) {
23 return failJson('6001', '您已经秒杀过了,请不要在参与了');
24 }
25 //把秒杀成功的用户id放到集合里
26 $redis->sAdd($setName, $userID);
27 //4.如果set集合里没有该用户的信息,进行减本地库存,然后生成订单
28 $redis->lpop($listName);
29 // 启动事务
30 Db::startTrans();
31 try {
32 //订单数组
33 //去查询秒杀商品的价格
34 $goods = SeckillGoods::getSeckillGoodsDetailByID($params['goods_id']);
35 $orderArr = [
36 'user_id' => $userID,
37 'goods_id' => $params['goods_id'],
38 'goods_nums' => $params['goods_nums'],
39 'order_no' => makeOrderSn(),//唯一的订单号
40 'status' => OrderEnum::$paidStatus,
41 'total_price' => ($goods->sckill_price * 100 * $params['goods_nums']) / 100//商品的价格需要重新计算
42 ];
43 $res = Order::createOrder($orderArr);
44 //5.分布式的数据库,如果以主键id作为key查询数据库,就有可能有问题
45 if ($res) {
46 // 提交事务
47 Db::commit();
48 }
49 //6.返回下单成功与否的状态
50 return successJson(0, '下单成功', $res);
51 } catch (\Exception $exception) {
52 // 回滚事务
53 Db::rollback();
54 throw new Exception($exception->getMessage());
55 }
56 }
最新文章
- 通过TStringList保存csv文件,只要循环.Add表格里面的每行记录进去,保存即可
- JAVA代码热部署,在线不停服动态更新
- jQuery.fn.extend与jQuery.extend到底区别在哪?
- VC++ 如何在显示对话框的时候,指定焦点控件!
- JavaEE系列之(二)commons-fileupload实现文件上传、下载
- 【转载】Linux小白福利:《超容易的Linux系统管理入门书》(三)在虚拟机上安装Linux
- POJ 3648-Wedding(2-SAT)
- Android 内存管理 &;amp;Memory Leak &;amp; OOM 分析
- (译)Windsor入门教程---第二部分 引用Windsor
- 笔记整理——C语言-http
- javac编译原理
- 独立完成一个移动点餐wap后的小结
- 深入浅出mongoose
- A1102. Invert a Binary Tree
- 避免crontab输出日志
- SQL语句--查询任务
- 再识ASCII实体、符号实体和字符实体
- 不忘初心,方得始终——NOIP2016前的感悟
- Http Digest认证协议
- springboo 添加logback日志