sspanel v3魔改版添加功能之——限售(库存为0自动下架)

介绍一个好玩的功能,模拟实体商品库存限制,比如一个套餐卖了10个后,套餐库存不足自动下架。此限量售卖功能较好的适用于特价商品限量售卖的场景中。

本篇为教程,非现成源码,需要一定的耐心和一定的技术要求。

  • sspanel版本:Anankke,其他版本可能不适用。
  • 要求:修改文件前务必先备份!
  • 一定的php功底

初级

打开网站跟目录下的文件:app/Controllers/UserController.php ,搜索并找到如下代码:

public function buy($request, $response, $args)

懂php的同学应该知道,上面代码为定义了一个名为:buy的函数,此函数实现了sspanel套餐的购买功能,因此我们要实现的限量售卖功能,也要从这里着手。我们在上面的代码往下找几行,就能发现这行代码:

$shop = Shop::where('id', $shop)->where('status', 1)->first();

我们在这行代码下添加代码。此代码表示正在购买的商品的剩余库存数量。

$stock = $shop->stock;

添加后看下图:

请输入图片描述

获取到商品的库存数量后,我们就可以实现当任一用户成功购买一次商品后,减少一个该商品的库存数量。

$shop->stock = $stock - 1;
$shop->save();

当库存数量为0表示商品已售完,我们要下架该商品。status字段为0即表示下架。

$shop->status = 0;
$shop->stock = 0;
$shop->save();

我们不一定所有商品都需要限量,我们可以规定库存数量为负数(小于0)即为不限量。对于不限量商品,我们无需操作。

现在我们在buy函数体内找到如下代码。如果找不到,可以使用快捷键:Ctrl+F进行文本查找。

$shop->buy($user);

此代码表示用户成功购买了商品,接下来我们实现商品库存数量减一,如果库存数量为0就下架,不限量就不操作。再上述代码下添加如下代码。

switch (true) {
case $stock - 1 > 0:
$shop->stock = $stock - 1;
$shop->save();
break;
case $stock - 1 == 0:
$shop->status = 0;
$shop->stock = 0;
$shop->save();
break;
default:
break;
}

到此我们完成了限量套餐的所有核心功能。我们现在前往数据库,一般搭建sspanel都用的是宝塔,我们在对应的数据库后面点击“管理”,就进入了网页版的数据库管理界面。进入之前确保你已经安装了phpmyadmin并处于开启状态。我们点击进入 shop 数据表,点击上方的“结构”,点击下方的“执行”。
请输入图片描述

添加一个 stock 字段,默认值为:-1,也就是默认商品都是无限量。按照下图填写即可。不要忘了保存。
请输入图片描述

所有步骤全都完成,现在来测试一下。我们点击上方的“浏览”,修改想要限量的商品的stock值为1(双击进入编辑状态,点击空白保存),表示库存只有一件,卖完就下架。然后回到sspanel网站,该买此限量商品,购买完成后查看此商品是否还在。如果商品不在就表示成功,如果商品还在请从头检查哪一个步骤出错并纠正。

中级

初级实现了限量售卖的功能,但是会涉及到直接对数据库的操作,不安全也不太方便。在初级的基础上,我们实现在sspanel后台控制商品的库存数量。

在网站根目录下找目录:/resources/views/material/admin/shop,在这个目录下打开create.tpl文件,定位到73行并添加如下代码并保存:

<div class="card">
<div class="card-main">
<div class="card-inner">
<div class="form-group form-group-label">
<label class="floating-label" for="stock">库存数量</label>
<input class="form-control maxwidth-edit" id="stock" type="text" value="-1">
</div>
<div class="form-group form-group-label">
填写库存数量,小于0为不限量
</div>
</div>
</div>
</div>

然后搜索如下代码:

content_extra: contentExtra

紧挨这段代码下另起一行,填写如下代码。

stock: $$getValue('stock')

在同目录下打开edit.tpl文件,定位到78行并添加上述相同的代码并保存。

<div class="card">
<div class="card-main">
<div class="card-inner">

<div class="form-group form-group-label">
<label class="floating-label" for="stock">库存数量</label>
<input class="form-control maxwidth-edit" id="stock" type="text" value="{$shop->stock}">
</div>

<div class="form-group form-group-label">
填写库存数量,小于0为不限量
</div>
</div>
</div>
</div>

然后搜索如下代码:

content_extra: contentExtra

紧挨这段代码下另起一行,填写如下代码。

stock: $$getValue('stock')

在网站根目录下找到文件:/app/Controllers/Admin/ShopController.php,定位到40行并添加代码:

$shop->stock = $request->getParam('stock');

定位到110行并添加同样的代码:

$shop->stock = $request->getParam('stock');

最后效果为下图。编辑商品可以修改库存数量,无需再去数据库修改。
请输入图片描述

高级

没有高级了,中级后就可以正式使用,没其他问题。这里再修复一下初级里的一个小bug,当你手动修改商品库存为0,而没有手动下架此商品,则此商品变为了一个不限量商品。修复如下:

在根目录下打开文件:app/Controllers/UserController.php,搜索代码:

$stock = $shop->stock;

在这段代码下方我们添加如下代码:

if($stock == 0)
{
$shop->status = 0;
$shop->stock = 0;
$shop->save();
$res['ret'] = 0;
$res['msg'] = '对不起,此商品库存不足';
return $response->getBody()->write(json_encode($res));
}

具体截图如下:
请输入图片描述
借助此功能,当手动修改库存为0时,意味着你将要下架该商品。商品不会立马下架,只要有用户该买此商品,会得到“对不起,此商品库存不足”的提示并购买失败,之后商品将从商品列表里消失。

说明

  1. 应用场景:对优惠套餐实现“秒杀”,增加用户抢购欲望。
  2. 如有遗漏、错误之处,请不吝赐教,你的建议能够帮助学者少走弯路,感谢!