zoukankan      html  css  js  c++  java
  • PHP.51-TP框架商城应用实例-前台3-楼层推荐、TP框架雪崩问题

    楼层推荐

    效果图

    1、增加表字段

      商品表

       分类表

    2、修改商品模型和分类模型接收字段is_floor

    3、修改商品和分类相关的表单

    4、后台制作推荐方法

      4.1在分类模型中增加获取前台楼层数据的方法

    /****** 获取前台首页楼层中的数据 ***********/
            public function floorData()
            {
                $floorData = S('floorData');
                if($floorData)
                    return $floorData;
                else
                {
                    // 先取出推荐到楼层的顶级分类
                    $ret = $this->where(array(
                        'parent_id' => array('eq', 0),
                        'is_floor' => array('eq', '是')
                    ))->select();
                    //var_dump($ret);die;
                    $goodsModel = D('Admin/Goods');
                    // 循环每个楼层取出楼层中的数据
                    foreach ($ret as $k => $v)
                    {
                        /*********** 这个楼层中的品牌数据 *************/
                        // 先取出这个楼层下所有的商品ID
                        $goodsId = $goodsModel->getGoodsIdByCatId($v['id']);
    
                        // 再取出这些商品所用到的品牌
                        $ret[$k]['brand'] = $goodsModel->alias('a')
                            ->join('LEFT JOIN __BRAND__ b ON a.brand_id=b.id')
                            ->field('DISTINCT brand_id,b.brand_name,b.logo')
                            ->where(array(
                                'a.id' => array('in', $goodsId),
                                'a.brand_id' => array('neq', 0),
                        ))->limit(9)->select();
                            //var_dump($ret[0]['brand']);die;
    
                        /**** 取出未推荐的二级分类并保存到这个顶级分类的subCat字段中 ****/
                        $ret[$k]['subCat'] = $this->where(array(
                            'parent_id' => array('eq', $v['id']),
                            'is_floor' => array('eq', '否'),
                        ))->select();
                            //var_dump($ret[0]['subCat']);die;
                        /****** 取出推荐的二级分类并保存到这个顶级分类的subCat字段中 *******/
                        $ret[$k]['recSubCat'] = $this->where(array(
                            'parent_id' => array('eq', $v['id']),
                            'is_floor' => array('eq', '是'),
                        ))->select();
                            //var_dump($ret[0]['recSubCat']);die;
                        /*****  循环每个推荐的二级分类取出分类下的8件被推荐到楼层的商品 ****/
                        foreach ($ret[$k]['recSubCat'] as $k1 => &$v1)
                        {
                            //取出这个分类下所有商品的ID并返回一维数组
                            $gid = $goodsModel->getGoodsIdByCatId($v1['id']);
                            $gids = implode(",", $gid);
                            //var_dump($gids);die;
                            // 再根据商品ID取出商品的详细信息
                            $v1['goods'] = $goodsModel->field('id,mid_logo,goods_name,shop_price')
                                ->where(array(
                                'is_on_sale' => array('eq', '1'),
                                'is_floor' => array('eq', '是'),
                                'id' => array('in', $gids),
                            ))->order('sort_num ASC')->limit(8)->select();
                            //var_dump($v1['goods']);die;
                        }
                    }
                    S('floorData', $ret, 5);
                    return $ret;
                }
            }

            4.2在IndexController.class.php控制器中取出数据

       4.3在首页中循环输出   ==> 包括品牌信息

     5、为前台页面生成缓存

     

    扩展:解决TP框架雪崩问题

    生成静态缓存的雪崩问题:如果网站的并发量在100【每秒有100个刷新】,在缓存页面失效的一瞬间,100个并发同时进入到后端数据库有可能让数据库崩溃。

    解决方法:修改TP底层源码,在生成静态缓存页时加锁,在缓存失效时只让一个客户端进入控制器      ==> PHP文件锁

     

     

  • 相关阅读:
    2013年10月17日 搬出来了
    如何与领导相处
    WEB系统开发
    C++ 常用术语(后续补充)
    C++ 构造函数放置默认转换explicit关键字(2)
    工作与生活
    C++类型转化分析(1)
    (一)win7下cocos2d-x 21 + vs2010
    为了生活
    iOS
  • 原文地址:https://www.cnblogs.com/zixuanfy/p/7140517.html
Copyright © 2011-2022 走看看