PHP实现购物车以及取消(现金+满减+积分)订单

在PHP中,实现购物车一般有以下几种方式:

  1. 使用Session存储购物车数据。当用户选择商品时,将商品信息保存在Session中,当用户提交订单时,将Session中的购物车数据保存到数据库中。这种方式简单易用,但是当网站访问量大时,会对服务器的性能造成影响,同时也有可能出现Session丢失的问题。

  1. 使用Cookie存储购物车数据。当用户选择商品时,将商品信息保存在Cookie中,当用户提交订单时,将Cookie中的购物车数据保存到数据库中。这种方式可以减轻服务器的负担,但是Cookie的大小有限制,不能存储大量数据,而且Cookie可以被用户禁用或清除,数据也容易被篡改。

  1. 使用数据库存储购物车数据。当用户选择商品时,将商品信息保存在数据库中,当用户提交订单时,直接从数据库中读取购物车数据。这种方式可以保证数据的可靠性和安全性,但是会增加数据库的负担,同时也会增加网络传输数据量。

在实际项目中,一般会结合以上三种方式,以达到最佳的用户体验和系统性能。例如,在用户浏览商品时,可以使用Cookie或Session存储购物车数据,当用户登录时,将购物车数据保存到数据库中,当用户提交订单时,从数据库中读取购物车数据进行处理。

下面是一个使用Session存储购物车数据的示例代码:

// 添加商品到购物车functionadd_to_cart($product_id, $quantity) {
    if (!isset($_SESSION['cart'])) {
        $_SESSION['cart'] = array();
    }
    if (isset($_SESSION['cart'][$product_id])) {
        $_SESSION['cart'][$product_id] += $quantity;
    } else {
        $_SESSION['cart'][$product_id] = $quantity;
    }
}

// 从购物车中删除商品functionremove_from_cart($product_id) {
    if (isset($_SESSION['cart'][$product_id])) {
        unset($_SESSION['cart'][$product_id]);
    }
}

// 更新购物车中的商品数量functionupdate_cart($product_id, $quantity) {
    if (isset($_SESSION['cart'][$product_id])) {
        $_SESSION['cart'][$product_id] = $quantity;
    }
}

// 获取购物车中的商品列表functionget_cart_items() {
    $cart_items = array();
    foreach ($_SESSION['cart'] as$product_id => $quantity) {
        $product = get_product_by_id($product_id);
        $cart_items[] = array(
            'product_id' => $product_id,
            'product_name' => $product['name'],
            'product_price' => $product['price'],
            'quantity' => $quantity
        );
    }
    return$cart_items;
}

// 获取购物车中的商品数量functionget_cart_item_count() {
    returncount($_SESSION['cart']);
}

// 获取购物车中的商品总价functionget_cart_total_price() {
    $total_price = 0;
    foreach ($_SESSION['cart'] as$product_id => $quantity) {
        $product = get_product_by_id($product_id); 
        $total_price += $product['price'] * $quantity; 
     }
     return$total_price; 
}

// 清空购物车 functionclear_cart() {
        unset($_SESSION['cart']); 
}

复制代码

在以上代码中,add_to_cart()、remove_from_cart()、update_cart()等函数用于添加、删除、更新购物车中的商品信息,get_cart_items()函数用于获取购物车中的商品列表,get_cart_item_count()函数用于获取购物车中的商品数量,get_cart_total_price()函数用于获取购物车中的商品总价,clear_cart()函数用于清空购物车。这些函数基本涵盖了购物车功能的实现。

在实际开发中,还需要编写商品列表页面、购物车页面和结算页面等相关页面,并将以上函数应用到这些页面中。另外,还需要注意对购物车数据的安全处理,以防止数据泄露和篡改。

优惠分摊,算法很多,这里是从shopnc挖出来,适合优惠条件过滤的算法,实质很简单,但是理解难度还是有一点。

应用场景: 一个订单的商品,如果参与了某种活动的时候,那就需要分摊优惠,一般来说需要分摊的有购物金,积分,优惠券,满减等。而且是在整个订单上来使用优惠。

多件N折,限制抢购,团购等都是在商品单价上面体现的,所以难点就在于如何去分摊优惠,比如一个订单用购物金,积分下单了。订单取消后需要返还。这个时候需要退给用户的钱就是商品的价格-购物金-积分之后的钱了

首先,程序员可以使用百分比分摊算法来处理订单优惠分摊。这个算法按照以下步骤来执行:

1)计算每种优惠的总价值额度;

2)将这三种优惠中每种优惠按理财公司比例分配到订单中;

3)用百分比来计算每种优惠在订单中的价值支出,以及订单最终实付金额。

程序员还可以使用全值分摊算法来处理。这个算法的执行过程如下:

1)给每种优惠划出固定价值;

2)将每种优惠的固定价值划分到订单中;

3)计算订单最终实付金额。

分摊算法也可以被程序员用于处理订单优惠分摊。这个算法按照以下步骤执行:

1)将每种优惠的总价值按理财公司比例分配到订单中;

2)按照赠送的优惠价值比例,计算出每种优惠在订单中的价值支出;

3)计算订单最终实付金额。

通过以上的算法,PHP程序员可以帮助商家实现现金+满减+积分订单优惠分摊的功能,且有效地分配订单中每种优惠的支出量,实现每种优惠最大程度地受益。简单代码示例:

// 订单支付总金额
$totalAmount = 500;
// 现金支付金额 
$cashFee = 400; 
// 满减支付金额 
$manjianFee = 40; 
// 积分支付金额 
$jifenFee = 60; 
// 退款金额 
$refundAmount = 100;

// 先计算比例
if($totalAmount > 0){
    // 现金支付比例
    $cashRatio = $cashFee/$totalAmount; 
    // 满减比例
    $manjianRatio = $manjianFee/$totalAmount; 
    // 积分比例
    $jifenRatio = $jifenFee/$totalAmount; 
}

// 计算退款比例
$refundCash = $cashRatio * $refundAmount;
$refundManjian = $manjianRatio * $refundAmount;
$refundJifen = $jifenRatio * $refundAmount;

// 输出最后结果
echo "现金支付退款金额:".$refundCash;
echo "满减支付退款金额:".$refundManjian;
echo "积分支付退款金额:".$refundJifen;复制代码

以下提供优惠分摊的方法,有需要的可以借鉴一下

<?php/*
* useuserpoint 拆购物金分摊
* usediscount 拆代金卷分摊
* use_offer 除去购物金和折价券之外的优惠分摊,目前来说就是满减的分摊
* 
* 按照不同活动类型来计算此次参与活动商品总金额,再按参与商品金额goods_total的占比来分配分摊的优惠,
* $type就是来对应相关的优惠分摊类型
*/function _splitPrice(&$goods_info, $tmprice, $type) {

    $goods_num = count($goods_info);
    $total = 0;

    foreach($goods_info as $k => $v) {
        if($type=='use_offer'){
            if($v['is_own_shop'] == 1) {
                if($goods_num>1){
                    if(!$v['yihe_supplier_deliver']){   //第三方发货的不要摊到满减等优惠
                                 if(!$v['more_goods_discount_info']){  //多件N折商品跳过满减优惠分摊
                             $total += $v['goods_total'];
                                 }
                    }    
                }else{
                    $total += $v['goods_total'];
                }
            }   
        }else{
            if($v['is_own_shop'] == 1) {
                $total += $v['goods_total'];
            }
        }
    }
    $tmp = $tmprice;
复制代码

表面看很不理解,但是其他2个$type对应的值写出来就很明白就是一个根据不同优惠分摊类型经行计算总价格的。

下面的也是不过是计算分摊具体优惠转换成存打数据库的字段

//        foreach($goods_info as $k => $v) {
//            if($type=='use_offer'){
//                if($v['is_own_shop'] == 1) {
//                    if($goods_num>1){
//                        if(!$v['yihe_supplier_deliver']){   //第三方发货的不要摊到满减等优惠
//                                     if(!$v['more_goods_discount_info']){  //多件N折商品跳过满减优惠分摊
//                                 $total += $v['goods_total'];
//                                     }
//                        }    
//                    }else{
//                        $total += $v['goods_total'];
//                    }
//                }   
//            }elseif($type=='usediscount'){
//                if($v['is_own_shop'] == 1) {
//                    $total += $v['goods_total'];
//                }
//            }elseif($type=='useuserpoint'){
//                        if($v['is_own_shop'] == 1) {
//                    $total += $v['goods_total'];
//                }
//                        
//                    }
//        }


        foreach($goods_info as $k => $v) {
            //第三方发货的跳过
            //多件N折商品跳过满减优惠分摊

            if($type == 'use_offer'&&$goods_num>1&&$v['yihe_supplier_deliver']){
                continue;
            }

            if($type == 'use_offer'&&$goods_num>1&&$v['more_goods_discount_info']){
                continue;
            }

            if($v['is_own_shop'] == 1) {
                $splitVal = intval($v['goods_total']/$total*$tmprice) + 1;
                if($splitVal > $tmp) {
                    $splitVal = $tmp;
                }

                $tmp -= $splitVal;
                if($type == 'useuserpoint') {
                    $goods_info[$k]['goods_splituserpoint'] = $splitVal;
                } elseif($type == 'usediscount') {
                    $goods_info[$k]['goods_splitusediscount'] = $splitVal;
                }elseif($type=='use_offer'){
                    $goods_info[$k]['goods_split_use_offer'] = $splitVal;
                }

                if($tmp == 0) {
                    break;
                }
            }
        }
//                P($goods_info);
//                die;
    }
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
购物车系统是一个常见的电子商务功能,能够为用户提供方便快捷的购物体验。在JavaWeb开发中,我们可以利用Servlet、MySQL、JSP和Tomcat来实现购物车系统。 首先,我们需要使用MySQL数据库来储商品信息、用户信息和订单信息等。可以创建相应的数据库表来储这些数据,并通过Java程序连接数据库进行增删改查操作。 接下来,在Servlet中编写相应的逻辑来处理用户的购物车操作。当用户点击添加商品到购物车按钮时,可以将商品的信息储到Session中,这样就可以在用户的不同请求之间保持购物车的信息不丢失。同时,可以编写其他Servlet来处理购物车中的商品数量修改、商品删除等操作。 在JSP中,可以使用JSTL标签库来展示用户的购物车信息。通过循环遍历Session中的商品列表,可以将商品名称、价格、数量等信息展示出来,并提供修改和删除商品的链接。 最后,利用Tomcat作为服务器来部署我们的Web应用程序。将编写好的Servlet和JSP文件打包成一个war包,然后将其部署到Tomcat服务器上即可。用户可以通过浏览器访问我们的网站,添加商品到购物车,并进行相关的操作。 除了基本的购物车功能,我们还可以进一步扩展购物车系统,例如实现用户登录注册功能、生成订单、进行支付等。通过不断改进和迭代,可以让购物车系统变得更加完善和实用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Student Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值