微信小程序秒杀

wxml:

wxml:
<view>商品秒杀页面</view>
<view wx:if="{{goods.stime<goods.time}}">秒杀已开始</view>
<view wx:else="{{goods.stime > goods.time}}">秒杀未开始</view>
<l-countdown time-type="second" time="{{expire_time}}" bind:linend="changeBtn" />
<l-card type="primary" full="{{true}}" image="{{goods.goods.goods_img}}" title="{{goods.goods.goods_name}}">
     <view>
       价格:{{goods.goods.goods_price}}
     </view>
     <view>
     <!-- <button disabled="true" bindtap="buyGoods" >抢购</button> -->
     
      <l-button disabled="{{ btn_disable }}" bind:lintap="buyGoods" type="error" data-goods_id="{{ goods.goods.id }}">立即秒杀</l-button>
     </view>
  </l-card>

js:

js:

import tool from "../../pages/tool/tool.js";
Page({

  /**
   * 页面的初始数据
   */
  data: {
    goods:{},
    expire_time:0,
    btn_disable:false,
    win_scrollTop:0,
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    //商品id
    let goods_id = options.goods_id;
    console.log(goods_id)
    this.getGoodsDetail(goods_id)

  },
   //获取商品详情
   getGoodsDetail(goods_id){
    wx.request({
      url: 'http://www.skill.com/api/detail?goods_id='+goods_id,
      header: {
         token:wx.getStorageSync('token')
      },
      success: res => {
        //当前的时间戳
        let now_time = Math.round(new Date().getTime() / 1000).toString();
        let expire_time = res.data.data.start_time-now_time;
        this.setData({
          goods:res.data.data,
          expire_time
        })
        if(expire_time > 0){
          this.setData({
            btn_disable:true
          })
        }
        console.log(this.data.goods)
      }
    })
  },
 //立即抢购
buyGoods: tool.debounce(function(e) {
  var token = wx.getStorageSync('token')
  if(token==''){
    wx.showToast({
      title: '请先登录',
    })
    // wx.navigateTo({
    //   url: '/pages/login/login',
    // })
    return
  }
  let goods_id = e[0].currentTarget.dataset.goods_id
  wx.request({
    url: 'http://www.skill.com/api/skill',
    header: {
      token:wx.getStorageSync('token')
   },
    method:"POST",
    data:{
      goods_id
    },
    success: res => {
      let code = res.statusCode.toString()
      if (!code.startsWith('2')){
         wx.showToast({
           title: '异常!',
           icon:1
         })
      }
      
      if(res.data.errorCode == 0){
        wx.showToast({
          title: res.data.msg,
        })
        // wx.navigateTo({
        //   url: '/pages/order/order',
        // })
      }else{
        wx.showToast({
          title: res.data.msg,
        })
      }
      console.log(res.data)
    }
  })
}),
changeBtn(){
  this.setData({
    btn_disable:false
  })
},
})

json:

json:

{
  "navigationBarTitleText": "商品详情",
  "usingComponents": {
    "l-countdown":"/miniprogram_npm/lin-ui/countdown",
    "l-card":"/miniprogram_npm/lin-ui/card",
    "l-button":"/miniprogram_npm/lin-ui/button"
  }
}

php:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Jobs\OrderJob;
use App\Models\Goods;
use App\Models\Order;
use App\Models\Skill;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;


class GoodsController extends Controller
{
    /**
     * 商品秒杀列表
     * @return \Illuminate\Http\JsonResponse
     */
    public function activityList()
    {
        $result = Skill::with(['goods'])
            ->get();
        return response()->json(['errorCode' => 0, 'data' => $result, 'msg' => '查询成功']);
    }

    //商品秒杀详情
    public function goodsDetail(Request $request)
    {
        $goods_id = $request->get('goods_id');
        $result = Skill::with(['goods'])
            ->where('goods_id',$goods_id)
            ->first();
        $time = time();
        $result['time'] = $time;
        return response()->json(['errorCode' => 0, 'data' => $result, 'msg' => '查询成功']);
    }

    //同步库存
    public function syncStock(request $request)
    {
        //查看队列的长度
//        $count = Redis::llen('activity_goods_1');
//        echo $count;
//        die;
        //查出所有参与秒杀活动列表
        $page = $request->get('page')?$request->get('page'):1;
        $limit = $request->get('limit')?$request->get('limit'):5;
        $size = ($page-1)*$limit;
        $result = Skill::with(['goods'])
            ->offset($size)
            ->limit($limit)
            ->get();

        $data = json_decode($result,true);

        //进行把参与秒杀的商品写入到数据库
        foreach ($data as $val){
            //生成对应商品库存队列
            $goods = "activity_goods_".$val['goods_id'];
            for ($i=0; $i < $val['skill_num']; $i++) {
                Redis::lpush($goods, 1);
            }
        }
        return response()->json(['errorCode' => 0, 'data' => $result, 'msg' => '查询成功']);
    }
    //校验库存

    /**
     * 秒杀接口
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function checkStock(Request $request)
    {

        //抢购用户id
        $openid =$request['uid'];
        $user = User::where('openid',$openid)->first();

        $userID = $user['id'];

        //商品id
        $goodsID = $request->input("goods_id");
        //对应商品库存队列
        $goods = "activity_goods_".$goodsID;
        //对应商品抢购成功用户集合 {1,3,4}
        $robSuccessUser = "success_user".$goodsID;
        //进行判断当前用户是否在抢成功的队列里面
        $result = Redis::sismember($robSuccessUser,$userID);
        //如果你在这里面,就抢完了
        if ($result) {
            //如果抢购成功 返回状态码,进行下单
            return response()->json(['errorCode' => 20000, 'data' => '', 'msg' => '已经抢购过了']);
        }
        //减库存,把队列里面的数据从左边 头
        $count = Redis::lpop($goods);
        if (!$count) {
            //如果抢购成功 返回状态码,进行下单
            return response()->json(['errorCode' => 20001, 'data' => '', 'msg' => '已经抢光了哦']);
        }
        //把当前这个秒杀的uid存储到中奖的队列里set
        $success = Redis::sadd($robSuccessUser, $userID);
        if(!$success){
            //已经在成功队列里了,加回库存,防止的是同个用户并发请求
            Redis::lpush($goods, 1);
            //如果抢购成功 返回状态码,进行下单
            return response()->json(['errorCode' => 20002, 'data' => '', 'msg' => '已经抢购过了']);
        }

        //如果抢购成功 返回状态码,进行下单
        return response()->json(['errorCode' => 0, 'data' => '', 'msg' => '秒杀成功']);
    }

}

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Java微信小程序商城模版是一种用于开发微信小程序商城的模板,使用Java语言编写。它为开发人员提供了一套完整的基础架构和功能组件,以便快速搭建和定制微信小程序商城。 该模版具有以下特点: 1. 功能丰富:Java微信小程序商城模板提供了许多常见的商城功能,如商品展示、购物车、订单管理、支付功能等。开发人员可以根据实际需求进行定制和改进,以开发出独具特色的小程序商城。 2. 易于使用:该模版具有完善的开发文档和示例代码,使得开发人员能够快速上手并完成开发任务。同时,它也提供了可视化的界面编辑器,可以方便地进行页面布局和样式设计。 3. 高可扩展性:Java是一种面向对象的编程语言,具有良好的可扩展性。通过使用Java微信小程序商城模版,开发人员可以根据实际需求添加新的功能和模块,以满足不同的商城需求。 4. 多平台支持:Java微信小程序商城模版可以在各种操作系统上运行,包括Windows、Linux和MacOS等。同时,它也支持多种数据库,如MySQL、Oracle和SQL Server等。 总之,Java微信小程序商城模版为开发人员提供了一个快速、高效的开发平台,可以帮助他们快速搭建和定制微信小程序商城,并为用户提供丰富的商城功能和良好的使用体验。 ### 回答2: Java微信小程序商城模版是一种使用Java语言编写的微信小程序商城模版。它提供了基本的商城功能,包括商品展示、购买、支付、订单管理等功能。 首先,Java微信小程序商城模版可以实现商品展示功能。用户可以在小程序中浏览商城中的商品,包括商品的图片、名称、价格等信息。用户可以通过浏览商品列表或通过搜索来查找感兴趣的商品。 其次,Java微信小程序商城模版还具备购买功能。用户可以将心仪的商品加入购物车并进行批量购买。购物车功能可以方便用户进行商品管理和结算。 另外,Java微信小程序商城模版还具备支付功能。用户可以选择不同的支付方式进行支付,如微信支付、支付宝支付等。支付功能确保了购物流程的安全性和便捷性。 最后,Java微信小程序商城模版还包含订单管理功能。用户可以查看已购买的商品订单、订单状态以及物流信息。商家和管理员可以通过后台管理系统对订单进行处理和管理,包括订单确认、发货、退款等操作。 综上所述,Java微信小程序商城模版提供了一套完整的商城解决方案,包括商品展示、购买、支付、订单管理等功能。它可以满足用户购物的需求,并提供便捷的管理工具给商家和管理员。这样的模版可以帮助开发者快速搭建微信小程序商城,节省开发时间和成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值