商城购物车逻辑思路

来源:互联网 发布:mac添加网页个人收藏 编辑:程序博客网 时间:2024/04/28 08:39
这个是商城购物车逻辑思路,做个记录也是乐于分享!大家相互交流学习
电子商城加入购物车的设计流程
1.判断用户是否登录,如果用户登录采用Db存储商品(即采用数据库的方式存购物车中的商品),如果是用户未登录(即采用Cookie的方式存购物车中的商品,并且采用加密方式)
2.用户在点击购买按钮的时候,有可能是买的是单品,也有可能买的是组合套餐。从而得到点击按钮传过来的参数要么是商品的id,要么就是组合套餐的id号,同时带有商品数量。
3.对于单品来说,先判断商品此时是否处于促销时间,所以通过id首先得判断是否是促销产品,更新商品价格,然后在判断是否是限时折扣,再次更新商品价格,最后再检查库存是不是为空,购买的数量是否大于库存。对于一些虚拟产品、如F码、预售产品最好不要加入在购物车中(因为这些要么是可以直接发货,要么是需要过一段时间才能发货,对于这类产品建议直接购买,禁止加入购物车中)。
4.对于组合套餐来说,需要判断此时商品是否在组合套装中,在判断组合套餐中的每个商品是否有库存,计算组合套餐的总价格,加入购物车的时候只放组合套餐的一个商品在购物车中,同时把组合套餐id放进去,方便以后再购物车页面把组合套餐中的其他商品查询出来。
实例:
  1. /**
  2. * 添加购物车
  3. */
  4. public function add() {
  5.     $model_goods = M('goods');
  6.     $logic_buy = D('buy','Logic');
  7.         if (is_numeric($_GET['goods_id'])) {

  8.             //商品加入购物车(默认)
  9.             $goods_id = intval($_GET['goods_id']);   //商品id
  10.             $num= intval($_GET['num']);  //商品数量
  11.             if ($goods_id <= 0) return ;
  12.             //通过id获取商品的基本信息,如名称,价格,属性等(每个商城的数据库大概都是差不多的)
  13.             $goods_info    = $model_goods->getGoodsInfoById($goods_id);
  14.             //抢购,这里就是对于如果商品处于抢购活动中,更新商品的价格,这里用的是传指针的方式,所以没有返回变量
  15.             $logic_buy->getGroupbuyInfo($goods_info);

  16.             //限时折扣,对于限时折扣活动,也是更新商品的价格
  17.             $logic_buy->getXianshiInfo($goods_info,$quantity);
  18.             //这里就检查库存是不是充足,有没有超拍,是不是虚拟商品或者预售商品
  19.             $this->_check_goods($goods_info,$num);

  20.         } elseif (is_numeric($_GET['bid'])) {//这里传入的是组合套餐的id号

  21.             //优惠套装加入购物车(单套)
  22.             if (!$_SESSION['member_id']) {
  23.                 $this->error('请选登录');exit();
  24.             }
  25.             $bid= intval($_GET['bid']);
  26.             if ($bid<= 0) return ;
  27.             $model_bl = M('bundling');
  28.             $bl_info = $model_bl->getBundlingInfo(array('bid'=>$bid));  //这里很简单就是通过组合套餐ID吧组合套餐的信息查出来,活动是否处于开启状态
  29.             if (empty($bl_info) || $bl_info['bl_state'] == '0') {
  30.                 $this->error('该优惠套装已不存在,建议您单独购买');
  31.             }

  32.             //检查每个商品是否符合条件,并重新计算套装总价
  33.             $bl_goods_list = $model_bl->getBundlingGoodsList(array('bl_id'=>$bl_id));
  34.             $goods_id_array = array();
  35.             $bl_amount = 0;
  36.             foreach ($bl_goods_list as $goods) {
  37.                 $goods_id_array[] = $goods['goods_id'];
  38.                 $bl_amount += $goods['bl_goods_price'];
  39.             }
  40.             $model_goods = M('goods');
  41.             $goods_list = $model_goods->getGoodsInfoById($goods_id_array);
  42.             foreach ($goods_list as $goods) {
  43.                 $this->_check_goods($goods,1);
  44.             }

  45.             //优惠套装作为一条记录插入购物车,图片取套装内的第一个商品图
  46.             $goods_info    = array();
  47.             $goods_info['goods_id']    = $goods_list[0]['goods_id'];
  48.             $goods_info['goods_name'] = $bl_info['bl_name'];
  49.             $goods_info['goods_price'] = $bl_amount;
  50.             $goods_info['goods_num']   = 1;
  51.             $goods_info['goods_image'] = $goods_list[0]['goods_image'];
  52.             $goods_info['store_name'] = $bl_info['store_name'];
  53.             $goods_info['bl_id'] = $bid;
  54.             $num= 1; //组合套餐中的每个商品的数量都只有一个
  55.         }

  56.         //已登录状态,存入数据库,未登录时,存入COOKIE
  57.         if($_SESSION['member_id']) {
  58.             $save_type = 'db';
  59.             $goods_info['buyer_id'] = $_SESSION['member_id'];
  60.         } else {
  61.             $save_type = 'cookie';
  62.         }
  63.         $model_cart    = M('cart');
  64.         $insert = $model_cart->addCart($goods_info,$save_type,$num);
  65.         if ($insert) {
  66.             //购物车商品种数记入cookie
  67.             setNcCookie('cart_goods_num',$model_cart->cart_goods_num,2*3600);
  68.             $data = array('state'=>'true', 'num' => $model_cart->cart_goods_num, 'amount' => ncPriceFormat($model_cart->cart_all_price));
  69.         } else {
  70.             $data = array('state'=>'false');
  71.         }
  72.     exit(json_encode($data));
  73. }

  74.        /**
  75.      * 检查商品是否符合加入购物车条件
  76.      * @param unknown $goods
  77.      * @param number $quantity
  78.      */
  79.     private function _check_goods($goods_info, $num) {
  80.         if(empty($num)) {
  81.             exit(json_encode(array('msg'=>'商品数量错误')));
  82.         }
  83.         if(empty($goods_info)) {
  84.             exit(json_encode(array('msg'=>'商品不存在')));
  85.         }
  86.         if(intval($goods_info['goods_storage']) < 1) {
  87.             exit(json_encode(array('msg'=>'商品库存不足')));
  88.         }
  89.         if(intval($goods_info['goods_storage']) < $num) {
  90.             exit(json_encode(array('msg'=>'购买数量超过库存')));
  91.         }
  92.         if ($goods_info['is_virtual'] || $goods_info['is_fcode'] || $goods_info['is_presell']) {
  93.             exit(json_encode(array('msg'=>'该商品不允许加入购物车,请直接购买','UTF-8')));
  94.         }
  95.     }
  96. function.php中加入两个函数
  97. /**
  98. * 价格格式化
  99. *
  100. * @param int    $price
  101. * @return string    $price_format
  102. */
  103. function ncPriceFormat($price) {
  104.     $price_format    = number_format($price,2,'.','');
  105.     return $price_format;
  106. }
  107. /**
  108.  * 设置cookie
  109.  * 这个加密方式是我上一篇文章里面写了的
  110.  * @param string $name cookie 的名称
  111.  * @param string $value cookie 的值
  112.  * @param int $expire cookie 有效周期
  113.  * @param string $path cookie 的服务器路径 默认为 /
  114.  * @param string $domain cookie 的域名
  115.  * @param string $secure 是否通过安全的 HTTPS 连接来传输 cookie,默认为false
  116.  */
  117. function setNcCookie($name, $value, $expire='3600', $path='', $domain='', $secure=false){
  118.     if (empty($path)) $path = '/';
  119.     if (empty($domain)) $domain = SUBDOMAIN_SUFFIX ? SUBDOMAIN_SUFFIX : '';
  120.     $name = defined('COOKIE_PRE') ? COOKIE_PRE.$name : strtoupper(substr(md5(MD5_KEY),0,4)).'_'.$name;
  121.     $expire = intval($expire)?intval($expire):(intval(SESSION_EXPIRE)?intval(SESSION_EXPIRE):3600);
  122.     $result = setcookie($name, $value, time()+$expire, $path, $domain, $secure);
  123.     $_COOKIE[$name] = $value;
  124. }
0 0
原创粉丝点击