thinkphp商城購物車邏輯思路

字號+ 編輯: 国内TP粉 修訂: SyncLWT 來源: ThinkPHP 2023-09-11 我要說兩句(0)

這個是商城購物車邏輯思路,做個記錄也是樂於分享!大家相互交流學習

電子商城加入購物車的設計流程

1.判斷用戶是否登錄,如果用戶登錄採用Db存儲商品(即採用數據庫的方式存購物車中的商品),如果是用戶未登錄(即採用Cookie的方式存購物車中的商品,並且採用加密方式)

2.用戶在點擊購買按鈕的時候,有可能是買的是單品,也有可能買的是組合套餐。從而得到點擊按鈕傳過來的參數要麽是商品的id,要麽就是組合套餐的id號,同時帶有商品數量。

3.對於單品來說,先判斷商品此時是否處於促銷時間,所以通過id首先得判斷是否是促銷産品,更新商品價格,然後在判斷是否是限時折釦,再次更新商品價格,最後再檢查庫存是不是爲空,購買的數量是否大於庫存。對於一些虛擬産品、如F碼、預售産品最好不要加入在購物車中(因爲這些要麽是可以直接發貨,要麽是需要過一段時間才能發貨,對於這類産品建議直接購買,禁止加入購物車中)。

4.對於組合套餐來說,需要判斷此時商品是否在組合套裝中,在判斷組合套餐中的每個商品是否有庫存,計算組合套餐的總價格,加入購物車的時候只放組合套餐的一個商品在購物車中,同時把組合套餐id放進去,方便以後再購物車頁面把組合套餐中的其他商品查詢出來。

實例:

/**
* 添加購物車
*/
public function add() {
    $model_goods = M('goods');
    $logic_buy = D('buy','Logic');
        if (is_numeric($_GET['goods_id'])) {

            //商品加入購物車(默認)
            $goods_id = intval($_GET['goods_id']);   //商品id
            $num= intval($_GET['num']);  //商品數量
            if ($goods_id <= 0) return ;
            //通過id獲取商品的基本信息,如名稱,價格,屬性等(每個商城的數據庫大概都是差不多的)
            $goods_info    = $model_goods->getGoodsInfoById($goods_id);
            //搶購,這裡就是對於如果商品處於搶購活動中,更新商品的價格,這裡用的是傳指針的方式,所以沒有返回變量
            $logic_buy->getGroupbuyInfo($goods_info);

            //限時折釦,對於限時折釦活動,也是更新商品的價格
            $logic_buy->getXianshiInfo($goods_info,$quantity);
            //這裡就檢查庫存是不是充足,有沒有超拍,是不是虛擬商品或者預售商品
            $this->_check_goods($goods_info,$num);

        } elseif (is_numeric($_GET['bid'])) {//這裡傳入的是組合套餐的id號

            //優惠套裝加入購物車(單套)
            if (!$_SESSION['member_id']) {
                $this->error('請選登錄');exit();
            }
            $bid= intval($_GET['bid']);
            if ($bid<= 0) return ;
            $model_bl = M('bundling');
            $bl_info = $model_bl->getBundlingInfo(array('bid'=>$bid));  //這裡很簡單就是通過組合套餐ID吧組合套餐的信息查出來,活動是否處於開啓狀態
            if (empty($bl_info) || $bl_info['bl_state'] == '0') {
                $this->error('該優惠套裝已不存在,建議您單獨購買');
            }

            //檢查每個商品是否符合條件,並重新計算套裝總價
            $bl_goods_list = $model_bl->getBundlingGoodsList(array('bl_id'=>$bl_id));
            $goods_id_array = array();
            $bl_amount = 0;
            foreach ($bl_goods_list as $goods) {
                $goods_id_array[] = $goods['goods_id'];
                $bl_amount += $goods['bl_goods_price'];
            }
            $model_goods = M('goods');
            $goods_list = $model_goods->getGoodsInfoById($goods_id_array);
            foreach ($goods_list as $goods) {
                $this->_check_goods($goods,1);
            }

            //優惠套裝作爲一條記錄插入購物車,圖片取套裝内的第一個商品圖
            $goods_info    = array();
            $goods_info['goods_id']    = $goods_list[0]['goods_id'];
            $goods_info['goods_name'] = $bl_info['bl_name'];
            $goods_info['goods_price'] = $bl_amount;
            $goods_info['goods_num']   = 1;
            $goods_info['goods_image'] = $goods_list[0]['goods_image'];
            $goods_info['store_name'] = $bl_info['store_name'];
            $goods_info['bl_id'] = $bid;
            $num= 1; //組合套餐中的每個商品的數量都只有一個
        }

        //已登錄狀態,存入數據庫,未登錄時,存入COOKIE
        if($_SESSION['member_id']) {
            $save_type = 'db';
            $goods_info['buyer_id'] = $_SESSION['member_id'];
        } else {
            $save_type = 'cookie';
        }
        $model_cart    = M('cart');
        $insert = $model_cart->addCart($goods_info,$save_type,$num);
        if ($insert) {
            //購物車商品種數記入cookie
            setNcCookie('cart_goods_num',$model_cart->cart_goods_num,2*3600);
            $data = array('state'=>'true', 'num' => $model_cart->cart_goods_num, 'amount' => ncPriceFormat($model_cart->cart_all_price));
        } else {
            $data = array('state'=>'false');
        }
    exit(json_encode($data));
}

    /**
     * 檢查商品是否符合加入購物車條件
     * @param unknown $goods
     * @param number $quantity
     */
    private function _check_goods($goods_info, $num) {
        if(empty($num)) {
            exit(json_encode(array('msg'=>'商品數量錯誤')));
        }
        if(empty($goods_info)) {
            exit(json_encode(array('msg'=>'商品不存在')));
        }
        if(intval($goods_info['goods_storage']) < 1) {
            exit(json_encode(array('msg'=>'商品庫存不足')));
        }
        if(intval($goods_info['goods_storage']) < $num) {
            exit(json_encode(array('msg'=>'購買數量超過庫存')));
        }
        if ($goods_info['is_virtual'] || $goods_info['is_fcode'] || $goods_info['is_presell']) {
            exit(json_encode(array('msg'=>'該商品不允許加入購物車,請直接購買','UTF-8')));
        }
    }

在function.php中加入兩個函數

/**
 * 價格格式化
 *
 * @param int    $price
 * @return string    $price_format
 */
function ncPriceFormat($price) {
    $price_format    = number_format($price,2,'.','');
    return $price_format;
}
/**
 * 設置cookie
 * 這個加密方式是我上一篇文章裡面寫了的
 * @param string $name cookie 的名稱
 * @param string $value cookie 的值
 * @param int $expire cookie 有效周期
 * @param string $path cookie 的服務器路徑 默認爲 /
 * @param string $domain cookie 的域名
 * @param string $secure 是否通過安全的 HTTPS 連接來傳輸 cookie,默認爲false
 */
function setNcCookie($name, $value, $expire='3600', $path='', $domain='', $secure=false){
    if (empty($path)) $path = '/';
    if (empty($domain)) $domain = SUBDOMAIN_SUFFIX ? SUBDOMAIN_SUFFIX : '';
    $name = defined('COOKIE_PRE') ? COOKIE_PRE.$name : strtoupper(substr(md5(MD5_KEY),0,4)).'_'.$name;
    $expire = intval($expire)?intval($expire):(intval(SESSION_EXPIRE)?intval(SESSION_EXPIRE):3600);
    $result = setcookie($name, $value, time()+$expire, $path, $domain, $secure);
    $_COOKIE[$name] = $value;
}


閲完此文,您的感想如何?
  • 有用

    1

  • 沒用

    0

  • 開心

    0

  • 憤怒

    0

  • 可憐

    1

1.如文章侵犯了您的版權,請發郵件通知本站,該文章將在24小時内刪除;
2.本站標注原創的文章,轉發時煩請注明來源;
3.交流群: 2702237 13835667

相關課文
  • mac開發接入微信公衆號接口返回報錯 cURL error 56: SSLRead() return error -9806

  • PHP的換行符是什麽

  • pecl安裝程序時報錯Array and string offset access syntax with curly braces is no longer supported

  • 由於商家傳入的H5交易參數有誤,該筆交易暫時無法完成,請聯繫商家解決

我要說說
網上賓友點評