vue tp5 实现搜索分页

效果

{include file="common/top"}
    <div id="background">
    <div id="plan">
                 <div class="shenjiax">
                      <div class="shenjiaxtop clearfix">
                          个性方案:<a href="#">管理</a>
                          <span class="rt clearfix shenjiaxtopr">
                               <a href="{:url('discount/index')}" class="fl">神价排行榜</a>
                               <a href="javascript:void(0)" class="rt yx-jinpin-open">展开筛选条件</a>
                          </span>
                      </div>
                      <div class="shenjiaxx" style="display: none;">
                          <div class="shenjiaxx-list clearfix">
                               <div class="shenjiaxx-listfl">筛选商城:</div>
                               <ul class="clearfix shenjiaxx-listul">
                                   <li v-for="item in less_cate"><input v-model="cate_v"  type="checkbox"
                                                                        name="chksitename"
                                               :value="item.cate_id"><label for="chk1">{{item.title}}</label></li>
                               </ul>
                          </div>
                          <div class="shenjiaxx-list clearfix">
                               <div class="shenjiaxx-listfl">价格:</div>
                               <div class="clearfix shenjiaxx-listul">
				                    <input v-model="start_price_v" type="text" class="shenjiaxx-listinput" title="最低价">
				                    <em>-</em>
				                    <input v-model="end_price_v" class="shenjiaxx-listinput" title="最高价">
                               </div>
                          </div>
                          <div class="shenjiaxx-list clearfix">
                               <div class="shenjiaxx-listfl">更新时间:</div>
                               <ul class="clearfix shenjiaxx-listul">
                                   <li v-for="item in create_time">
                                    <input v-model="create_time_v" type="radio" name="uptime" id="t4"
                                           :value="item.val"><label
                                           for="t4">{{item.msg
                                       }}</label>
                                   </li>
                               </ul>
                          </div>
                          <div class="shenjiaxx-list clearfix">
                               <div class="shenjiaxx-listfl">折扣低于:</div>
                               <ul class="clearfix shenjiaxx-listul">
                                   <li v-for="item in less">
						              <input v-model="less_v" type="radio" name="rdozk" id="zk1" :value="item.val"><label
                                           for="zk1">{{item.val}}折
                                   </label>
                                   </li>
                               </ul>
                          </div>
                          <div class="shenjiaxx-list clearfix">
                               <div class="shenjiaxx-listfl">排序方式:</div>
                               <ul class="clearfix shenjiaxx-listul">
                                   <li v-for="item in sort">
                                      <input v-model="sort_v" id="s0" type="radio" :value="item.val"
                                             name="identity"><label
                                           for="s0">{{item.msg}}</label>
                                   </li>
                               </ul>
                          </div>
                          <div class="shenjiaxx-list clearfix">
                              <!--
                               <div class="shenjiaxx-listfl">辅助设置:</div>
                               <ul class="clearfix shenjiaxx-listul">
                                      <input type="checkbox" id="saleType" checked="checked" value="1"><label style="margin-right: 20px;" for="saleType">排除第三方</label>
                                      <input type="checkbox" id="ckxless"><label style="margin-right: 20px;" for="ckxless">低于历史最低价</label>
                                      <input type="checkbox" id="ckxless2" checked="checked"><label style="margin-right: 20px;" for="ckxless2">低于或等于历史最低价</label>
                               </ul>
                               -->
                          </div>
                          <div class="shenjiaxx-list clearfix">
                               <div class="shenjiaxx-listfl">搜索关键词:</div>
                               <ul class="clearfix shenjiaxx-listul">
                                      <input v-model="key_v" type="text" class="shenjiax-listinpu">
                               </ul>
                          </div>
                          <div class="shenjiaxx-list clearfix">
                               <div class="shenjiaxx-listfl">排除关键词:</div>
                               <ul class="clearfix shenjiaxx-listul">
                                      <input v-model="no_key_v" type="text" class="shenjiax-listinpu">
                               </ul>
                          </div>
                          <div class="shenjiaxx-list clearfix">
                               <div class="shenjiaxx-listfl">&nbsp</div>
                               <ul class="clearfix shenjiaxx-listul driving-site-mo">
                                      <a href="javascript:" v-on:click="search"
                                         class="shenjia-listbtn driving-record-mr2">搜索
                                      </a>
                                      <a @click="resetData" href="javascript:"
                                         class="shenjia-listbtn driving-record-mr2">重置</a>
                                         <!--
                                      <a href="javascript:" class="shenjia-listbtn">保存以上查询条件</a>
                                    -->
                               </ul>
                          </div>
                      </div>
                 </div>
                 <table class="table-member driving-record-mt" style="width: 1200px;">
                            <tr>
                                <th style="text-align:left;">商品信息</th>
                                <th>当前价</th>
                                <th>折扣</th>
                                <th>原价</th>
                                <th>历史最低价</th>
                                <th>操作</th>
                            </tr>

                      
                            <tr v-for="item in pageContent">
                                <td>
                                <a :href="'/jump?u=' + item.item_url " target="_blank">
                                <div class="lf zindeximg">
                                   <img :src="item.pic"  alt="" style="max-width: 60px;max-height: 60px;">
                                </div>                    
                                <div class="z-cxright-glccsp">                          
                                      <p><a :href="'/jump?u=' + item.item_url " target="_blank">{{item.title}}</a></p>
                                      <p class="hr-huis"><span class="driving-record-mr10">{{item.cate.title}}
                                      </span></p>
                                </div>                    
                                </a>
                                </td>
                                <td><b class="hr-cheng">¥{{item.cur_price}}</b></td>
                                <td><span class="z-indexzk z-indexzklan">{{item.discount/10}}折</span></td>
                                <td><span class="hr-huis">{{item.before_price}}</span></td>
                                <td><span>{{item.min_price}}</span></td>
                                <td><a :href="'/jump?u=' + item.item_url "><span class="z-indexzk z-indexzkhon">去抢购</span></a></td>
                            </tr>
                    
                        </table>

                        <!-- vue 分页 -->
                         <ul class="pagination">
                             <li @click="home"><span>首页</span></li>
                            <li @click="prev"><span>上一页</span></li>
                            <li v-for="item of pages" class="item" :class="{active: current === item}" @click="active(item)">
                                <a>{{item}}</a>
                            </li>
                            <li @click="next"><span>下一页</span></li>
                            <li @click="trailer"><span>尾页</span></li>
                            <li><span> {{count}} 页</span></li>
                            <li><span>跳转 <input style="width: 50px;height: 15px" type="text" v-model="much"> 页
                            </span></li>
                             <li  @click="goPage"><span>确定</span></li>
                        </ul>
                        <!-- end vue -->
            </div><!-- 更多神价end -->
      </div>
{include file="common/footer"}
<script>
$(function(){
$(".yx-jinpin-open").click(function () {
                $(".shenjiaxx").toggle(100);
                if ($(this).text() == "展开筛选条件") {
                    $(this).html("收起筛选条件");
                }
                else {
                    $(this).html("展开筛选条件");
                }
            });
});
</script>
<script type="text/javascript">
$(function(){
  //回到顶部
    showScroll();
    function showScroll(){
      $(window).scroll( function() { 
        var scrollValue=$(window).scrollTop();
        scrollValue > 450 ? $('div[class="zscroll"]').fadeIn():$('div[class="zscroll"]').fadeOut();
      } );  
      $('#scroll').click(function(){
        $("html,body").animate({scrollTop:0},200);  
      }); 
    }
})
</script>
    <!-- 引入vue js -->
    <script src="__static__/home/common/js/vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script>
        new Vue({
            el: '#plan',
            data: function() {
                return {
                    /** 分页条件 **/
                    count: 0, //总页数
                    current: 1,
                    much: '',
                    content: [],
                    pageContent: [],
                    flag: true,
                    force:false,//强制更新
                    size:10,  //分页大小
                    condi_str:"", //条件,

                    /** 下面为用户搜索条件 **/
                    sort:[{"msg":"最近更新优先","val":"1"},{"msg":"折扣从小到大","val":"2"},{"msg":"折扣从大到小","val":"3"},{"msg":"价格从小到大","val":"4"},{"msg":"价格从大到小","val":"5"}],//排序
                    less:[{"val":"1"},{"val":"2"},{"val":"3"},{"val":"4"},{"val":"5"},{"val":"6"},{"val":"7"},{"val":"8"}],//折扣
                    create_time:[{"msg":"30分钟内","val":"30"},{"msg":"1小时内","val":"60"},{"msg":"3小时内","val":"180"},{"msg":"6小时内","val":"360"},{"msg":"12小时内","val":"720"}],//更新时间
                    less_cate:[], //商城类目

                    /** 搜索条件 双向绑定**/
                    key_v:"",//搜索关键字
                    no_key_v:"", //不包含关键字
                    start_price_v:"",
                    end_price_v:"",
                    sort_v:"",
                    less_v:"",
                    create_time_v:"",
                    cate_v:[]
                }
            },
            created () {
                this._getCate();
                this._getData();
            },
            methods: {
                active (item) {
                    this.current = item;
                },
                prev (){
                    this.current > 1 && this.current--
                },
                next () {
                    this.current < this.count && this.current++
                },
                home () {
                    this.current = 1
                },
                trailer () {
                    this.current = this.count
                },
                goPage () {
                    let num =  parseInt(this.much);
                    if (num >= 1 && num <= this.count) {
                        this.current = num;
                    } else if (num > this.count) {
                        this.current = this.count;
                    } else {
                        this.current = 1;
                    }
                },
                _getData () {
                    // 这里其实用forEach来遍历并不是太好,后续我会再进行改进
                    this.content.forEach(item => {      //当前页等于数据中key 直接调用key中值(不再调用接口中值 缓存)
                        if (item.key === this.current) {
                            this.pageContent = item.data;
                            this.flag = false;
                        }
                    })
                    if (!this.flag) {
                        this.flag = true;
                        return
                    }
                    var _this = this;
                    axios.post('{:url("portal/less/getPage")}', {
                      'page': this.current, 
                      'size': this.size,
                      'condi':this.condi_str
                    }).then(function (res) {
                            // 保存为 [{key:'',data:''} {key:'', data:''}] 的形式 用以切换直接调用
                        var data = res.data.data;
                        _this.count = res.data.data.page_total;
                        _this.content.push({
                            key: _this.current,
                            data:data.data
                        });
                    })
                    .catch(function (error) {
                      console.log(error);
                    });
                },
                _getCate()//获取栏目
                {
                    var _this = this;
                    axios.get('{:url("portal/less/getLessCate")}').then((function (res) {
                        if(res.data.code=="00")
                        {
                            var data = res.data.data;
                            _this.less_cate = data;
                            console.log(_this.less_cate);
                        }
                    }))
                },
                search()//搜索
                {
                    this.condi_str =
                        {"key":this.key_v,"no_key":this.no_key_v,"start_price":this.start_price_v,"end_price":this.end_price_v,"sort":this.sort_v,"less":this.less_v,"cate":this.cate_v,"create_time":this.create_time_v};
                    this.current = 1;//重置分页条件
                    this.content = [];//重置分页内容
                    this._getData ();

                },
                resetData()//重置
                {
                    Object.assign(this.$data, this.$options.data());
                    this._getCate();
                    this._getData ();

                }
            },
            computed: {
                pages () {
                    let left = 1
                    let right = this.count
                    let arr = []
                    if (this.count >= 5) {
                        if (this.current > 3 && this.current <= this.count - 2){
                            left = this.current - 2
                            right = this.current + 2
                        } else {
                            if (this.current <= 3){
                                left = 1
                                right = 5
                            } else {
                                right = this.count
                                left = this.count - 4
                            }
                        }
                    }
                    while (left <= right) {
                        arr.push(left)
                        left++
                    }
                    return arr
                },
            },
            watch: {
                current () {
                    this._getData();
                },
                content () {
                    this.content.forEach(item => {

                        if (item.key === this.current) {
                            this.pageContent =  item.data;
                            console.log(item.key);
                        }
                    })
                }
            }
        })
    </script>

</body>
</html>

后端

<?php
/**
 * Created by july_c
 * Date: 2018/7/9
 * Time: 22:23
 * Desc: 神价
 */

namespace app\portal\controller;


use think\Request;

class Less extends Base
{

    /**
     * 神价列表
     */
    public function index()
    {
        $list = model("PriceLess")->getPageList();
        $this->assign("list", $list);

        return $this->fetch();
    }

    /**
     * 获取神价类目
     */
    public function getLessCate()
    {
        $result = model("Category")->getLessCate();
        return json(["code"=>"00","data"=>$result]);
    }

    /**
     * ajax 获取分页
     */
    public function getPage()
    {
        if (!Request::instance()->isPost()) {
            $this->error("非法请求");
        }

        $params = Request::instance()->post();

        if (!$params['page'] || !$params['size']) {
            return json(["msg" => "参数不完整"]);
        }

        $condi = $this->pageFormCondi($params['condi']);//组成条件

        $result = model("PriceLess")->getPaging($condi['where'], $condi['order'], $params['page'], $params['size'],"cate");

        if (!empty($result)) {
            $res_arr = [
                "code" => "00",
                "data" => $result
            ];
        } else {
            $res_arr = [
                "code" => "-1",
                "msg" => "没有数据"
            ];
        }

        return json($res_arr);
    }

    /**
     * 组成分页条件
     */
    private function pageFormCondi($condi)
    {
        $where = [];

        if(!empty($condi['cate']))
        {
            $where['plat_id'] = ["in",$condi['cate']];
        }

        if(!empty($condi['key'])) //关键词
        {
            $where['title'] = ["like","%".$condi['key']."%"];
        }

        if(!empty($condi['no_key'])) //不包括关键词
        {
            $where['title'] = ["not like","%".$condi['no_key']."%"];
        }

        if(!empty($condi['key'])&&!empty($condi['no_key']))
        {
            $where['title'] = [["like","%".$condi['key']."%"],["not like","%".$condi['no_key']."%"]];
        }

        if(!empty($condi['less'])) //折扣
        {
            $where['discount'] = ["<=",($condi['less']*10)];
        }

        if(!empty($condi['create_time'])) //创建时间 30/60/180/360/720
        {
            $where['create_time'] = [">=",time()-($condi['create_time']*60)];
        }

        if(!empty($condi['start_price']))
        {
            $where['cur_price'] = [">=",$condi['start_price']];
        }

        if(!empty($condi['end_price']))
        {
            $where['cur_price'] = ["<=",$condi['end_price']];
        }

        if(!empty($condi['start_price'])&&!empty($condi['end_price']))
        {
            $where['cur_price'] = ["between",[$condi['start_price'],$condi['end_price']]];
        }

        //排序
        $order = "";
        if(!empty($condi['sort']))
        {
            switch ($condi['sort'])
            {
                case "1": //最先更新
                    $order = "create_time desc";
                    break;
                case "2": //折扣从小到大
                    $order = "discount asc";
                    break;
                case "3": //折扣从大到小
                    $order = "discount desc";
                    break;
                case "4": //价格从小到大
                    $order = "cur_price asc";
                    break;
                case "5": //价格从大到小
                    $order = "cur_price desc";
                    break;
                default:
                    $order = "id desc";
                    break;    
            }
        }
        else
        {
             $order = "id desc";
        }


        return ["where"=>$where,"order"=>$order];
    }

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值