【引用】类似于京东等的搜索筛选查询功能实现,商品分类筛选

 

 前言

    随着电子商务的迅速发展,各大专业和独立蓬勃而出。如京东,凡客等为众人皆知的。作为一个技术领域的人来说,我们会更多的看到其中的技术差别。今天我们就来说一下搜索结果中的筛选功能实现。这个问题有不少的朋友经常问起他的实现原理,在这里我以我的实现方法来给大家讲解一下。以期起到抛砖引玉的作用,希望能够帮助到大家。


效果预览

    效果1:
    类似于京东等的搜索筛选查询功能实现,商品分类筛选 - mazhiyuan1981 - 死人的博客

    效果2:

    类似于京东等的搜索筛选查询功能实现,商品分类筛选 - mazhiyuan1981 - 死人的博客

    提供2张效果图的预览。如果您看不到图片,请前往相应的网址查看。
    效果1网址:http://sports.8t8x.com/product/yumaoqiu.htm
    效果2网址:http://sports.8t8x.com/product/lunhuahuabang.htm

实现原理

    这个功能的实现,归根到底,是数据库的设计问题。如果你的数据库设计得比较好,那么实现起来是件轻而易举的事情。另一方面,是网址传参上的难度。由于需要对搜索引擎的收录比较友好,通常商城类型的网址,都要进行url重写。本文将着手于这两方面给大家讲解。


数据库设计

    
    商品分类表

    类似于京东等的搜索筛选查询功能实现,商品分类筛选 - mazhiyuan1981 - 死人的博客

    搜索属性表

    类似于京东等的搜索筛选查询功能实现,商品分类筛选 - mazhiyuan1981 - 死人的博客

    搜索属性“值”表

    类似于京东等的搜索筛选查询功能实现,商品分类筛选 - mazhiyuan1981 - 死人的博客

    一共是3张表。设计上比较简单。

    简单归简单,但是要注意看清中间的关系。另外要注意表中的冗余字段运用。这可以为你在设计表的时候省去不少麻烦。当然如果数据频繁更新,你要记得同步数据。

 

后台程序实现

    先看一下我们的界面图 

    这是属性绑定。我们的商品属性很多。如果你们没有属性表,可以自己逐个添加属性名称即可。我们的实现是直接在系统的商品属性中选取的。后面的数字文本框,是指排序。   
    类似于京东等的搜索筛选查询功能实现,商品分类筛选 - mazhiyuan1981 - 死人的博客
    绑定的属性名称后,我们就会得到下图所示的一个商品属性表。当然,刚开始绑定的时候,“属性值”是空的。这里您看到“属性值”这一列中有值,是因为我们已经绑定好了。
    类似于京东等的搜索筛选查询功能实现,商品分类筛选 - mazhiyuan1981 - 死人的博客             上面是“属性”表。下面这张图是为这些“属性”添加“属性值”。这些值,将被前台显示。具体的显示效果,您可以看上面网址中的实际效果。   

    效果1网址:http://sports.8t8x.com/product/yumaoqiu.htm
    效果2网址:http://sports.8t8x.com/product/lunhuahuabang.htm

    类似于京东等的搜索筛选查询功能实现,商品分类筛选 - mazhiyuan1981 - 死人的博客

    很好,相信提供的这些页面步骤,已经能够让您了解到了后台的制作的整个过程,至于数据库的数据添加修改和删除功能,这是每一个程序员最基本的,这里没有什么技术含量,您直接代码实现即可。

    上面的后台程序实现中,有个关键点,就是里面有一个字段叫“搜索值”。这个搜索值,是用来查数据库的。前台显示成“尤尼克斯/Yonex”,但是我们的数据库中实际存放的值可能并不是它。而是“尤尼克斯”这个值,所以,需要进行区分。

前台程序实现

    由于需要实现Url重写。您在演示网址中,能够看到我们的演示网址,是已经实现了URL路径重写功能的。这里需要注意的点是:“由于你不知道用户会使用哪个筛选条件,所以,你在URL中,必须要保持用户的所有已经选择的筛选条件”。您可以在演示网址中,看到这种网址变化效果。

    那么这个网址的筛选是如何实现的呢?

    首选是路径重写的配置。

    类似于京东等的搜索筛选查询功能实现,商品分类筛选 - mazhiyuan1981 - 死人的博客

    这个配置的实现效果在http://sports.8t8x.com/product/yumaoqiu-85-81-97.htm中可以全部看到。这个网址,已经选取了相关的选项。譬如演示图中的“品牌”、“重量”、“价格”。我们需要将用户已经选择的这些多个条件在URL网址中保持起来。

    还是以上面给的演示URL路径来讲解。http://sports.8t8x.com/product/yumaoqiu-85-81-97.htm经过URL重写后,我们的RequestQuerystring["SearchPropertyID"]会得到这样的一个值:“-85-81-97”,是一串数字。我们需要对它进行解析,并保存下来,这一串数字代表了它们是用户已经选好了筛选条件。

    

    解析URL参数的代码如下:

    int[] searchPropertyValueIDArray = null;

    #region 解析Url属性参数
            //解析Url传的属性参数
            if (!string.IsNullOrEmpty(searchPropertyIDReq))
            {
                ArrayList tempSearchPropertyValueIDArrayList = new ArrayList();
                string[] tempSearchPropertyValueIDArray = searchPropertyIDReq.Split('-');
                foreach (string item in tempSearchPropertyValueIDArray)
                {
                    if (string.IsNullOrEmpty(item))
                    {
                        continue;
                    }

                    try
                    {
                        Convert.ToInt32(item);
                    }
                    catch
                    {
                        continue;
                    }

                    tempSearchPropertyValueIDArrayList.Add(Convert.ToInt32(item));
                }

                searchPropertyValueIDArray = (int[])tempSearchPropertyValueIDArrayList.ToArray(typeof(int));
            }
            #endregion

 

 

    前台显示绑定的时候事件代码如下:

protected void SearchPropertyValueRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            string curPropertyName = DataBinder.Eval(e.Item.DataItem, "PropertyName").ToString();
            string curPropertyValue = DataBinder.Eval(e.Item.DataItem, "PropertyValue").ToString();
            string curPropertyValueID = DataBinder.Eval(e.Item.DataItem, "ID").ToString();

            bool isHasCurrentPropertyName = false;
            int? urlPropertyValueID = null;
            if (searchPropertyValueIDArray != null)
            {
                foreach (int searchPropertyValueID in searchPropertyValueIDArray)
                {
                    Sports_Category_SearchProperty_Value sports_Category_SearchProperty_ValueEntity = CategoryCache.SelectCategorySearchPropertyValueByID(searchPropertyValueID);
                    int searchPropertyID = sports_Category_SearchProperty_ValueEntity.SearchPropertyID;

                    Sports_Category_SearchProperty sports_Category_SearchPropertyEntity = CategoryCache.SelectCategorySearchProperty(searchPropertyID);
                    if (sports_Category_SearchPropertyEntity.PropertyName == curPropertyName)
                    {
                        urlPropertyValueID = searchPropertyValueID;

                        isHasCurrentPropertyName = true;
                        break;
                    }
                }
            }

            string searchPropertyIDUrl = "";
            if (searchPropertyValueIDArray != null)
            {
                foreach (int searchPropertyValueID in searchPropertyValueIDArray)
                {
                    if (searchPropertyValueID != urlPropertyValueID)
                    {
                        searchPropertyIDUrl += "-" + searchPropertyValueID.ToString();
                    }
                }
            }

            //具体属性
            Literal litPropertyValue = (Literal)e.Item.FindControl("litPropertyValue");
            if (isHasCurrentPropertyName)
            {
                if (urlPropertyValueID != null && urlPropertyValueID.ToString() == curPropertyValueID)
                {
                    litPropertyValue.Text = "<a href=\"http://sports.8t8x.com/product/" + cNo + searchPropertyIDUrl + "-" + curPropertyValueID + ".htm\" class=\"curSearchProperty\" isCurrent=\"true\">" + curPropertyValue + "</a>";
                }
                else
                {
                    litPropertyValue.Text = "<a href=\"http://sports.8t8x.com/product/" + cNo + searchPropertyIDUrl + "-" + curPropertyValueID + ".htm\" class=\"normal\">" + curPropertyValue + "</a>";
                }
            }
            else
            {
                litPropertyValue.Text = "<a href=\"http://sports.8t8x.com/product/" + cNo + searchPropertyIDUrl + "-" + curPropertyValueID + ".htm\" class=\"normal\">" + curPropertyValue + "</a>";
            }
        }
    }

       

 

    如此,我们就正式完成了这一个筛选的效果设计。

 

    也许您会问,我有了“搜索的属性值”,要怎么去查找出商品呢,怎么出价格区间呢?模糊匹配会不会影响性能呢?是的。这是需要注意和解决的问题。

    在我们的程序里,用的商品分类索引,然后再用模糊匹配,性能很高。价格区间,是按价格来进行Sql中的between筛选的。

    请回头看我们的这张图:

    类似于京东等的搜索筛选查询功能实现,商品分类筛选 - mazhiyuan1981 - 死人的博客

    您在图中会看到一关键的地方,叫“属性类型”。您在截图上,只能看到“字符串”这一种,实际中,下拉列表中我们还有一种,叫“货币”。这些类型的不同,决定了,解析方式的不同。您现在应该不会感到困惑了吧?!

 

关于文章作者的介绍

    马志远(Marc),1981年,2002年湖北大学肄业,现蜗居广州。2004年学习编程,至今已经有8年的编程经验,长期从事asp.net B/S方面的开发和设计。在项目解决方案上、在项目性能和扩展等上,具有深强的能力。您可以使用mazhiyuan1981@163.com与我取得联系。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 基于Vue实现多条件筛选功能,可以通过以下步骤进行: 1. 数据渲染:首先,使用Vue框架将商品数据渲染到网页上,以展示商品信息。 2. 筛选条件定义:根据京东和淘宝等电商网站的筛选功能,我们可以通过定义多个筛选条件来满足用户的需求。例如,品牌、价格、颜色等。 3. 筛选条件组件化:将每个筛选条件封装成Vue组件,通过绑定数据和事件实现交互功能。例如,使用下拉菜单组件展示品牌选项,并绑定选中的品牌数据。 4. 筛选条件联动:根据用户选择的筛选条件,实现条件之间的联动效果。例如,如果用户选择了品牌A,则价格选项中只显示该品牌的价格范围。 5. 筛选功能实现:根据用户选择的筛选条件,通过过滤数据的方式实现商品筛选功能。例如,使用Vue的计算属性或watch属性来监听筛选条件的变化,并根据变化动态过滤数据。 6. 筛选结果展示:将筛选后的商品数据重新渲染到网页上,实时展示给用户。可以使用Vue的v-for指令遍历筛选后的数据,将其展示为商品列表。 通过以上步骤,我们就可以基于Vue实现类似京东和淘宝的多条件筛选功能。用户可以根据自己的需求,选择不同的筛选条件,实时筛选出符合条件的商品,提高购物效率。同时,借助Vue的响应式特性,我们可以方便地实现筛选条件的联动效果,提供更好的用户体验。 ### 回答2: 基于Vue实现多条件筛选功能类似京东和淘宝的功能,可以通过以下步骤来实现: 1. 创建一个Vue组件,用于显示多条件筛选的界面。可以使用Vue的组件化开发方式,将整个筛选功能划分为多个子组件,包括筛选项组件、筛选条件组件以及结果展示组件等。 2. 在筛选项组件中,使用Vue的数据绑定功能,将筛选项的内容与组件的数据进行绑定。可以使用Vue的v-for指令来遍历筛选项的列表,并使用v-model指令将选择结果与组件数据进行双向绑定,以便在用户选择筛选项时及时更新数据。 3. 在筛选条件组件中,监听筛选项组件的数据变化。当筛选项的选择结果发生变化时,通过Vue的事件机制,将新的筛选条件传递给结果展示组件。可以使用Vue的$emit方法触发自定义事件,并通过父组件接收事件并处理新的筛选条件。 4. 在结果展示组件中,根据接收到的筛选条件,使用Vue的计算属性或者watch属性来实时过滤数据,并在组件的模板中展示筛选后的结果。可以根据不同的筛选条件,使用条件语句进行数据过滤,或者使用Vue的filter过滤器来处理数据。 5. 最后,将多个组件组合在一起,构成一个完整的筛选功能界面。可以使用Vue的router来管理不同的筛选页面,并通过Vue的路由导航功能实现页面的切换和数据的传递。 通过以上步骤,我们可以基于Vue实现一个类似京东和淘宝的多条件筛选功能。用户可以根据自己的需求选择不同的筛选项,实时查看筛选后的结果,提高筛选效率和准确性。 ### 回答3: 基于Vue实现的多条件筛选功能是一种常见的电商平台或商品列表页面所具备的功能。这种功能能够让用户根据自己的需求选择多个条件来筛选商品,以便更快地找到自己想要的产品。 要实现这样的功能,首先需要在Vue中设置一个数据模型,用于存储用户选择的筛选条件以及根据条件过滤后的商品列表。可以使用一个数组来保存所有的商品数据,同时使用一个对象来存储当前用户选择的筛选条件。 接下来,需要在页面上展示可供用户选择的各个筛选条件。可以使用Vue的指令来生成相应的筛选项,并使用绑定指令将用户选择的条件存储到数据模型中。 为了实现多条件筛选功能,需要针对不同类型的筛选条件进行相应的处理。比如,对于品牌筛选,可以使用Vue的v-for指令生成各个品牌的复选框,并在用户选择时更新数据模型中的品牌条件。对于价格筛选,可以使用Vue的v-model指令绑定一个输入框,并在用户输入结束后更新数据模型中的价格条件。 最后,在数据模型中根据用户选择的筛选条件对所有商品进行过滤,生成符合条件的商品列表,并在页面上展示出来。 总的来说,基于Vue实现的多条件筛选功能需要设计一个数据模型来存储用户选择的筛选条件和过滤后的商品数据,同时根据不同的筛选条件使用Vue的指令和绑定来生成和更新页面上的筛选选项,最后根据用户选择的条件对商品数据进行过滤并展示出来。这样就可以实现一个类似京东和淘宝的多条件筛选功能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值