PHP tp6 购物车的流程

控制层

/加入购物车 表单提交
public function addcart()
{
// if(request()->isGet()){
// //如果是get请求 跳转到首页
// $this->redirect('home/index/index');
// }
//接收数据
$params = input();
// var_dump($params);die;
//参数检测
$validate = $this->validate($params, [
'goods_id' => 'require|integer|gt:0',
'number' => 'require|integer|gt:0',
'spec_goods_id' => 'integer|gt:0',
]);
if($validate !== true){
$this->error($validate);
}
//判断登录状态:已登录,添加到数据表;未登录,添加到cookie
//处理数据 调用封装好的方法
\app\home\logic\CartLogic::addCart($params['goods_id'], $params['spec_goods_id'], $params['number']);
//结果页面展示
//查询商品相关信息以及SKU信息
$goods = \app\common\model\Goods::getGoodsWithSpec($params['spec_goods_id'], $params['goods_id']);
return view('addcart', ['goods' => $goods, 'number' => $params['number']]);
}

public function index()
{
//查询所有的购物记录
$list = \app\home\logic\CartLogic::getAllCart();
// var_dump($list);die;
//对每一条购物记录 查询商品相关信息(商品信息和SKU信息)
foreach($list as &$v){
//$v['goods_id'] $v['spec_goods_id']
$v['goods'] = \app\common\model\Goods::getGoodsWithSpec($v['spec_goods_id'], $v['goods_id'])->toArray();
}
unset($v);
return view('index', ['list' => $list]);
}

/**
* ajax修改购买数量
*/
public function changenum()
{
//接收参数 id number
$params = input();
//参数检测
$validate = $this->validate($params, [
'id' => 'require',
'number' => 'require|integer|gt:0'
]);
if($validate !== true){
$res = ['code' => 400, 'msg' => '参数错误'];
echo json_encode($res);die;
}
//处理数据
\app\home\logic\CartLogic::changeNum($params['id'], $params['number']);
//返回数据
$res = ['code' => 200, 'msg' => 'success'];
echo json_encode($res);die;
}

/**
* ajax删除购物记录
*/
public function delcart()
{
//接收参数
$params = input();
//参数检测
/*$validate = $this->validate($params, [
'id' => 'require'
]);
if($validate !== true){
$res = ['code' => 400, 'msg' => $validate];
echo json_encode($res);die;
}*/

if(!isset($params['id']) || empty($params['id'])){
$res = ['code' => 400, 'msg' => '参数错误'];
echo json_encode($res);die;
}
//处理数据
\app\home\logic\CartLogic::delCart($params['id']);
//返回数据
$res = ['code' => 200, 'msg' => 'success'];
echo json_encode($res);die;
}

/**
* ajax修改选中状态
*/
public function changestatus()
{
//接收参数
$params = input();
//参数检测
$validate = $this->validate($params, [
'id' => 'require',
'status' => 'require|in:0,1'
]);
if($validate !== true){
$res = ['code' => 400, 'msg' => $validate];
echo json_encode($res);die;
}
//处理数据
\app\home\logic\CartLogic::changeStatus($params['id'], $params['status']);
//返回数据
$res = ['code' => 200, 'msg' => 'success'];
echo json_encode($res);die;
}
}


//逻辑层


public static function getAllCart()
{
//判登录断用户是否
if (session('?uid')) {
$user_id = session('uid.id');
$data = \app\home\model\Cart::where('user_id', $user_id)->select();//将列表展示
return $data->toArray();
} else {
$cart = \cookie('cart')?:[];
// dd($cart);
if (empty($cart)) {
return [];
}
$cart_data = unserialize($cart);
// dd($cart_data);
return array_values($cart_data);
}

}

public static function addCart($goods_id, $spec_goods_id, $number, $is_selected)
{
if (session('?uid.id')) {
$user_id = session('uid.id');
// 如果登录
$data = \app\home\model\Cart::where('goods_id', $goods_id)
->where('spec_goods_id', $spec_goods_id)
->where('user_id', $user_id)
->find();
if (!$data) {
// 找到相同的数据
$cart_arr = [
'number' => $number,
'is_selected' => $is_selected,
'spec_goods_id' => $spec_goods_id,
'goods_id' => $goods_id,
'user_id' => $user_id,
];
$goods = \app\home\model\Cart::create($cart_arr);
return $goods;
} else {
$cart_data['number'] = $data['number'] + $number;
\app\home\model\Cart::update($cart_data, ['id' => $data['id']]);
return $data;
}

} else {
// 未登录
// 取出cookie 如果是第一次在浏览器上加购商品是数组;
//如果不是取出cookie值进行反序列hua;
$cart = \cookie('cart') ?: [];
// 拼接$key
$key = $goods_id . '_' . $spec_goods_id;

if (is_array($cart)) {
$cart[$key]= [
'number' => $number,
'is_selected' => $is_selected,
'spec_goods_id' => $spec_goods_id,
'goods_id' => $goods_id,
];
\cookie('cart', serialize($cart));
}
$cart_arr = unserialize($cart);
// dd($cart_arr);
if (isset($cart_arr[$key])) {
// 如果存在键 数量加一
$cart_arr[$key]['number']+= $number;
\cookie('cart', serialize($cart_arr));
// dd($cart_arr);
} else {
$cart_arr[$key] = [
'number' => $number,

'is_selected' => $is_selected,
'spec_goods_id' => $spec_goods_id,
'goods_id' => $goods_id,
];
}
\cookie('cart', serialize($cart_arr));
return array_values($cart_arr);
}
}

// cookie中取出数据
static function getCookie()
{
//如果不是取出cookie值进行反序列hua;
$cart = \cookie('cart') ?: [];
if(empty($cart)){
return [];
}
$cart_arr = unserialize($cart);
foreach ($cart_arr as &$v){
self::addCart($v['goods_id'],$v['spec_goods_id'],$v['number'],$v['is_selected']);
}
unset($val);
\cookie('cart',null);

}



//model层
//获取商品以及sku信息
public static function getGoodsWithSpec($spec_goods_id, $goods_id)
{
//如果有sku的id, 就以之作为查询条件
if($spec_goods_id){
//有sku,且有多个,需要根据sku的id取指定的一个
$where = ['t2.id'=>$spec_goods_id];
}else{
//没有sku, 就根据商品id查询,sku相关的字段都是null
$where = ['t1.id' => $goods_id];
}
//如果没有,就以商品id作为查询条件
$goods = self::alias('t1')
->join('pyg_spec_goods t2', 't1.id=t2.goods_id', 'left')
->field('t1.*, t2.value_ids, t2.value_names, t2.price, t2.cost_price as cost_price2, t2.store_count')
->where($where)
->find();
// //如果sku信息中,price cost_price 大于0,则覆盖商品信息中的对应字段
if($goods['price'] > 0){
$goods['goods_price'] = $goods['price'];
}
if($goods['cost_price2'] > 0){
$goods['cost_price'] = $goods['cost_price2'];
}
return $goods;
}
//页面添加

  <div class="success-cart">
<div class="py-container ">
<h3><i class="sui-icon icon-pc-right"></i>商品已成功加入购物车!</h3>
<div class="goods">
<div class="left-good">
<div class="left-pic"><img src="{$goods.goods_logo}"></div>
<div class="right-info">
<p class="title">{$goods.goods_name}</p>
<p class="attr">{$goods.value_names} 数量:{$number}</p>
</div>
</div>
<div class="right-gocart">
<a href="{:url('home/goods/detail', ['id'=>$goods.id])}" class="sui-btn btn-xlarge">查看商品详情</a>
<a href="{:url('home/cart/index')}" class="sui-btn btn-xlarge btn-danger ">去购物车结算 > </a>
</div>
</div>
</div>
</div>




index

<div class="cart-body">
{foreach $list as $v}
<div class="cart-list">
<ul class="goods-list yui3-g" cart_id="{$v.id}" number="{$v.number}">
<li class="yui3-u-1-24">
<input type="checkbox" class="row_check" name="" id="" value="" {if($v.is_selected)}checked="checked"{/if}/>
</li>
<li class="yui3-u-6-24">
<div class="good-item">
<div class="item-img"><img src="{$v.goods.goods_logo}" /></div>
<div class="item-msg">{$v.goods.goods_name}</div>
</div>
</li>
<li class="yui3-u-5-24">
<div class="item-txt">{$v.goods.value_names}</div>
</li>
<li class="yui3-u-1-8"><span class="price">{$v.goods.goods_price}</span></li>
<li class="yui3-u-1-8">
<a href="javascript:void(0)" class="increment mins">-</a>
<input autocomplete="off" type="text" value="{$v.number}" minnum="1" class="itxt current_number" />
<a href="javascript:void(0)" class="increment plus">+</a>
</li>
<li class="yui3-u-1-8"><span class="sum">{$v.goods.goods_price * $v.number}</span></li>
<li class="yui3-u-1-8">
<a href="javascript:;" class="delete">删除</a><br />
<a href="#none">移到我的关注</a>
</li>
</ul>
</div>
{/foreach}
</div>



<script>
$(function(){
//重新计算已选商品数量和金额
var change_total = function(){
//获取到选中行 row_check选中的
var total_number = 0;
var total_price = 0;
$('.row_check:checked').each(function(i, v){
total_number += parseInt( $(v).closest('ul').find('.current_number').val() );
total_price += parseFloat( $(v).closest('ul').find('.sum').html() );
});
//将累加的价格和数量放到页面中
$('#total_number').html(total_number);
$('#total_price').html('¥' + total_price);
};

/**
* 修改购买数量
* @param number 修改数量
* @param element 触发事件的标签
*/
var change_num = function(number, element){
//需要的参数 id number
var data = {
"id":$(element).closest('ul').attr('cart_id'),
"number":number
};
//发送ajax请求
$.ajax({
"url":"{:url('home/cart/changenum')}",
"type":"post",
"data":data,
"dataType":"json",
"success":function(res){
if(res.code != 200){
alert(res.msg);return;
}
//将新的数量展示到页面
$(element).closest('ul').find('.current_number').val(number);
//将新的数量修改到当前行ul的number属性上,用于出错后恢复数据的
$(element).closest('ul').attr('number', number);
//重新计算小计金额
//取当前行的单价
var price = parseFloat( $(element).closest('ul').find('.price').html() );
//计算小计金额
var sum = price * number;
//将小计金额放到页面中
$(element).closest('ul').find('.sum').html(sum);
//重新计算已选商品数量和金额
change_total();
}
});
};
//全选效果
$('.check_all').change(function(){
//获取全选的选中状态 checked属性
var status = $(this).prop('checked');
//将每一行的checkbox状态 和全选设置成一样的
$('.row_check').prop('checked', status);
//重新计算已选商品数量和金额
change_total();
//修改选中状态到购物车数据中
//参数 id status
var data = {
"id":"all",
"status":$(this).prop('checked') ? 1 : 0,
};
//发送ajax请求
$.ajax({
"url":"{:url('home/cart/changestatus')}",
"type":"post",
"data":data,
"dataType":"json",
"success":function(res){
if(res.code != 200){
alert(res.msg);return;
}
}
});
});

//每一行checkbox选中
$('.row_check').change(function(){
//判断 全选是否应该选中
check_all();
//重新计算已选商品数量和金额
change_total();
//修改选中状态到购物车数据中
//参数 id status
var data = {
"id":$(this).closest('ul').attr('cart_id'),
"status":$(this).prop('checked') ? 1 : 0,
};
//发送ajax请求
$.ajax({
"url":"{:url('home/cart/changestatus')}",
"type":"post",
"data":data,
"dataType":"json",
"success":function(res){
if(res.code != 200){
alert(res.msg);return;
}
}
});
});
//页面刷新,直接判断 全选是否应该选中
function check_all(){
//判断 选中的行数 和 总行数 是否相等
var status = $('.row_check:checked').length == $('.row_check').length;
//设置全选的选中状态 checked属性
$('.check_all').prop('checked', status);
}
check_all();
//重新计算已选商品数量和金额
change_total();

//修改购买数量
//+号
$('.plus').click(function(){
var number = parseInt( $(this).closest('ul').find('.current_number').val() );
number += 1;

//调用封装的函数
change_num(number, this);
});
//-号
$('.mins').click(function(){
var number = parseInt( $(this).closest('ul').find('.current_number').val() );
if(number == 1) return;
number -= 1;
//调用封装的函数
change_num(number, this);
});
//input输入框直接修改
$('.current_number').change(function(){
var number = $(this).val();
//检测输入的值 是否数字
if(isNaN(number)){
//不是数字
alert('购买数量必须是数字');
var old_number = $(this).closest('ul').attr('number');
$(this).val(old_number);
return;
}
if(parseInt(number) != number || number <= 0){
//数量必须是正整数
alert('购买数量必须是正整数');
var old_number = $(this).closest('ul').attr('number');
$(this).val(old_number);
return;
}
//调用封装的函数
change_num(number, this);
});

//删除
$('.delete').click(function(){
//获取id 删除条件参数
var data = {
"id":$(this).closest('ul').attr('cart_id')
};
var that = this;
//发送ajax请求
$.ajax({
"url":"{:url('home/cart/delcart')}",
"type":"post",
"data":data,
"dataType":"json",
"success":function(res){
if(res.code != 200){
alert(res.msg);return;
}
//将当前行从页面移除
//$(that).closest('ul').parent().remove();
$(that).closest('.cart-list').remove();
//重新计算已选商品数量和金额
change_total();
}
});
});

//结算
$('.sum-btn').click(function(){
//判断是否有选中的购物记录
if($('.row_check:checked').length == 0){
alert('请选择要结算的商品');
return;
}
//跳转到结算页
location.href = "{:url('home/order/create')}";
});
});
</script>
























posted @ 2021-12-30 12:49  南瓜不能吃  阅读(118)  评论(0)    收藏  举报