MVC三层结构
1、Model层
在Model层,需要定义一个GoodsModel类,用来处理与商品表(goods)相关的数据操作,包括商品详情展示、商品加入购物车、商品关联订单、商品关联仓库等功能。下面是一个简单的示例代码:
namespace app\model;
use think\Model;
class GoodsModel extends Model
{
protected $table = 'goods';
/**
* 获取商品详情
* @param int $id 商品ID
* @return mixed|null
*/
public function getGoodsDetail($id)
{
return $this->where('id', $id)->find();
}
/**
* 将商品加入购物车
* @param int $userId 用户ID
* @param int $goodsId 商品ID
* @param int $num 商品数量
* @return bool
*/
public function addGoodsToCart($userId, $goodsId, $num)
{
// 判断购物车中是否已经存在该商品
$cartGoods = \app\model\CartModel::where('user_id', $userId)
->where('goods_id', $goodsId)
->find();
if ($cartGoods) {
// 存在,更新商品数量
$cartGoods->num += $num;
return $cartGoods->save();
} else {
// 不存在,添加商品到购物车
$cartGoods = new \app\model\CartModel();
$cartGoods->user_id = $userId;
$cartGoods->goods_id = $goodsId;
$cartGoods->num = $num;
return $cartGoods->save();
}
}
/**
* 商品关联订单
* @param int $orderId 订单ID
* @param array $goodsList 商品列表
* @return bool
*/
public function relateOrder($orderId, $goodsList)
{
$orderGoodsList = [];
foreach ($goodsList as $goods) {
$orderGoods = [
'order_id' => $orderId,
'goods_id' => $goods['goods_id'],
'num' => $goods['num'],
];
$orderGoodsList[] = $orderGoods;
}
return \app\model\OrderGoodsModel::insertAll($orderGoodsList);
}
/**
* 商品关联仓库
* @param int $warehouseId 仓库ID
* @param int $goodsId 商品ID
* @param int $num 商品数量
* @return bool
*/
public function relateWarehouse($warehouseId, $goodsId, $num)
{
// 判断该商品是否已经存在于仓库中
$warehouseGoods = \app\model\WarehouseGoodsModel::where('warehouse_id', $warehouseId)
->where('goods_id', $goodsId)
->find();
if ($warehouseGoods) {
// 存在,更新商品数量
$warehouseGoods->num += $num;
return $warehouseGoods->save();
} else {
// 不存在,添加商品到仓库
$warehouseGoods = new \app\model\WarehouseGoodsModel();
$warehouseGoods->warehouse_id = $warehouseId;
$warehouseGoods->goods_id = $goodsId;
$warehouseGoods->num = $num;
return $warehouseGoods->save();
}
}
}
在上面的代码中,我们通过定义不同的方法实现了不同的商品功能,包括获取商品详情、将商品加入购物车、商品关联订单、商品关联仓库等。
2、Controller层
在Controller层,我们需要定义一个GoodsController类,用来处理与商品相关的HTTP请求,根据用户的请求,调用Model层中相应的方法来处理数据,并返回相应的视图给用户。下面是一个简单的示例代码:
namespace app\controller;
use think\Controller;
use app\model\GoodsModel;
class GoodsController extends Controller
{
/**
* 商品详情
* @param int $id 商品ID
* @return mixed
*/
public function detail($id)
{
$goodsModel = new GoodsModel();
$goods = $goodsModel->getGoodsDetail($id);
return $this->fetch('detail', [
'goods' => $goods,
]);
}
/**
* 将商品加入购物车
* @param int $goodsId 商品ID
* @param int $num 商品数量
* @return mixed
*/
public function addToCart($goodsId, $num)
{
$userId = session('user_id');
$goodsModel = new GoodsModel();
$result = $goodsModel->addGoodsToCart($userId, $goodsId, $num);
if ($result) {
return $this->success('商品已添加到购物车');
} else {
return $this->error('添加失败');
}
}
/**
* 商品关联订单
* @param int $orderId 订单ID
* @param array $goodsList 商品列表
* @return mixed
*/
public function relateOrder($orderId, $goodsList)
{
$goodsModel = new GoodsModel();
$result = $goodsModel->relateOrder($orderId, $goodsList);
if ($result) {
return $this->success('商品关联订单成功');
} else {
return $this->error('商品关联订单失败');
}
}
/**
* 商品关联仓库
* @param int $warehouseId 仓库ID
* @param int $goodsId 商品ID
* @param int $num 商品数量
* @return mixed
*/
public function relateWarehouse($warehouseId, $goodsId, $num)
{
$goodsModel = new GoodsModel();
$result = $goodsModel->relateWarehouse($warehouseId, $goodsId, $num);
if ($result) {
return $this->success('商品关联仓库成功');
} else {
return $this->error('商品关联仓库失败');
}
}
}
在上面的代码中,我们通过定义不同的方法来处理不同的商品HTTP请求,包括商品详情、将商品加入购物车、商品关联订单、商品关联仓库等。
3、View层
在View层,我们需要定义不同的模板文件来展示不同的商品视图,包括商品详情页、购物车页、订单页、仓库页等。下面是一个简单的示例代码:
<!-- 商品详情页 -->
<h1>{$goods.name}</h1>
<p>{$goods.desc}</p>
<p>价格:{$goods.price}</p>
<!-- 加入购物车 -->
<form action="{:url('goods/addToCart')}" method="post">
<input type="hidden" name="goods_id" value="{$goods.id}">
<input type="number" name="num" value="1">
<button type="submit">加入购物车</button>
</form>
<!-- 订单页 -->
<h1>订单详情</h1>
<table>
<thead>
<tr>
<th>商品名称</th>
<th>商品数量</th>
</tr>
</thead>
<tbody>
{foreach $goodsList as $goods}
<tr>
<td>{$goods.name}</td>
<td>{$goods.num}</td>
</tr>
{/foreach}
</tbody>
</table>
<!-- 仓库页 -->
<h1>仓库详情</h1>
<table>
<thead>
<tr>
<th>商品名称</th>
<th>商品数量</th>
</tr>
</thead>
<tbody>
{foreach $goodsList as $goods}
<tr>
<td>{$goods.name}</td>
<td>{$goods.num}</td>
</tr>
{/foreach}
</tbody>
</table>
在上面的代码中,我们通过不同的模板文件来展示不同的商品视图,包括商品详情页、订单页、仓库页等。
综上所述,通过MVC三层结构来实现一个商品类,我们可以更好地组织代码,提高代码复用性,让代码更加清晰易懂。同时,MVC也是目前最流行的Web开发架构之一,通过学习MVC,可以更好地理解Web开发中的各种概念和设计原则,提高自己的开发水平。