日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

類似于京東商城等的商品分類搜索篩選功能實(shí)現(xiàn)

 CevenCheng 2012-05-13

類似于京東商城等的商品分類搜索篩選功能實(shí)現(xiàn)

 

前言

    隨著電子商務(wù)的迅速發(fā)展,各大專業(yè)和獨(dú)立蓬勃而出。如京東,凡客等為眾人皆知的。作為一個(gè)技術(shù)領(lǐng)域的人來說,我們會(huì)更多的看到其中的技術(shù)差別。今天我們就來說一下搜索結(jié)果中的篩選功能實(shí)現(xiàn)。這個(gè)問題有不少的朋友經(jīng)常問起他的實(shí)現(xiàn)原理,在這里我以我的實(shí)現(xiàn)方法來給大家講解一下。以期起到拋磚引玉的作用,希望能夠幫助到大家。


效果預(yù)覽

    效果1:
    

    效果2:

    

    提供2張效果圖的預(yù)覽。如果您看不到圖片,請(qǐng)前往相應(yīng)的網(wǎng)址查看。
    效果1網(wǎng)址:http://sports./product/yumaoqiu.htm
    效果2網(wǎng)址:http://sports./product/lunhuahuabang.htm
實(shí)現(xiàn)原理

    這個(gè)功能的實(shí)現(xiàn),歸根到底,是數(shù)據(jù)庫的設(shè)計(jì)問題。如果你的數(shù)據(jù)庫設(shè)計(jì)得比較好,那么實(shí)現(xiàn)起來是件輕而易舉的事情。另一方面,是網(wǎng)址傳參上的難度。由于需要對(duì)搜索引擎的收錄比較友好,通常商城類型的網(wǎng)址,都要進(jìn)行url重寫。本文將著手于這兩方面給大家講解。


數(shù)據(jù)庫設(shè)計(jì)

    
    商品分類表

    

    搜索屬性表

    

    搜索屬性“值”表

    

    一共是3張表。設(shè)計(jì)上比較簡(jiǎn)單。

    簡(jiǎn)單歸簡(jiǎn)單,但是要注意看清中間的關(guān)系。另外要注意表中的冗余字段運(yùn)用。這可以為你在設(shè)計(jì)表的時(shí)候省去不少麻煩。當(dāng)然如果數(shù)據(jù)頻繁更新,你要記得同步數(shù)據(jù)。

 

后臺(tái)程序?qū)崿F(xiàn)

    先看一下我們的界面圖 

    這是屬性綁定。我們的商品屬性很多。如果你們沒有屬性表,可以自己逐個(gè)添加屬性名稱即可。我們的實(shí)現(xiàn)是直接在系統(tǒng)的商品屬性中選取的。后面的數(shù)字文本框,是指排序?!  ?br style="margin: 0px; padding: 0px; ">    
    綁定的屬性名稱后,我們就會(huì)得到下圖所示的一個(gè)商品屬性表。當(dāng)然,剛開始綁定的時(shí)候,“屬性值”是空的。這里您看到“屬性值”這一列中有值,是因?yàn)槲覀円呀?jīng)綁定好了。
                 上面是“屬性”表。下面這張圖是為這些“屬性”添加“屬性值”。這些值,將被前臺(tái)顯示。具體的顯示效果,您可以看上面網(wǎng)址中的實(shí)際效果。   

    效果1網(wǎng)址:http://sports./product/yumaoqiu.htm
    效果2網(wǎng)址:http://sports./product/lunhuahuabang.htm

    

    很好,相信提供的這些頁面步驟,已經(jīng)能夠讓您了解到了后臺(tái)的制作的整個(gè)過程,至于數(shù)據(jù)庫的數(shù)據(jù)添加修改和刪除功能,這是每一個(gè)程序員最基本的,這里沒有什么技術(shù)含量,您直接代碼實(shí)現(xiàn)即可。

    上面的后臺(tái)程序?qū)崿F(xiàn)中,有個(gè)關(guān)鍵點(diǎn),就是里面有一個(gè)字段叫“搜索值”。這個(gè)搜索值,是用來查數(shù)據(jù)庫的。前臺(tái)顯示成“尤尼克斯/Yonex”,但是我們的數(shù)據(jù)庫中實(shí)際存放的值可能并不是它。而是“尤尼克斯”這個(gè)值,所以,需要進(jìn)行區(qū)分。

前臺(tái)程序?qū)崿F(xiàn)

    由于需要實(shí)現(xiàn)Url重寫。您在演示網(wǎng)址中,能夠看到我們的演示網(wǎng)址,是已經(jīng)實(shí)現(xiàn)了URL路徑重寫功能的。這里需要注意的點(diǎn)是:“由于你不知道用戶會(huì)使用哪個(gè)篩選條件,所以,你在URL中,必須要保持用戶的所有已經(jīng)選擇的篩選條件”。您可以在演示網(wǎng)址中,看到這種網(wǎng)址變化效果。

    那么這個(gè)網(wǎng)址的篩選是如何實(shí)現(xiàn)的呢?

    首選是路徑重寫的配置。

    

    這個(gè)配置的實(shí)現(xiàn)效果在http://sports./product/yumaoqiu-85-81-97.htm中可以全部看到。這個(gè)網(wǎng)址,已經(jīng)選取了相關(guān)的選項(xiàng)。譬如演示圖中的“品牌”、“重量”、“價(jià)格”。我們需要將用戶已經(jīng)選擇的這些多個(gè)條件在URL網(wǎng)址中保持起來。

    還是以上面給的演示URL路徑來講解。http://sports./product/yumaoqiu-85-81-97.htm經(jīng)過URL重寫后,我們的RequestQuerystring["SearchPropertyID"]會(huì)得到這樣的一個(gè)值:“-85-81-97”,是一串?dāng)?shù)字。我們需要對(duì)它進(jìn)行解析,并保存下來,這一串?dāng)?shù)字代表了它們是用戶已經(jīng)選好了篩選條件。

    

    解析URL參數(shù)的代碼如下:

    int[] searchPropertyValueIDArray = null;

    #region 解析Url屬性參數(shù)
            //解析Url傳的屬性參數(shù)
            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

 

 

    前臺(tái)顯示綁定的時(shí)候事件代碼如下:

protected void SearchPropertyValueRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            string curPropertyName = DataBinder.eval_r(e.Item.DataItem, "PropertyName").ToString();
            string curPropertyValue = DataBinder.eval_r(e.Item.DataItem, "PropertyValue").ToString();
            string curPropertyValueID = DataBinder.eval_r(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./product/" + cNo + searchPropertyIDUrl + "-" + curPropertyValueID + ".htm\" class=\"curSearchProperty\" isCurrent=\"true\">" + curPropertyValue + "</a>";
                }
                else
                {
                    litPropertyValue.Text = "<a href=\"http://sports./product/" + cNo + searchPropertyIDUrl + "-" + curPropertyValueID + ".htm\" class=\"normal\">" + curPropertyValue + "</a>";
                }
            }
            else
            {
                litPropertyValue.Text = "<a href=\"http://sports./product/" + cNo + searchPropertyIDUrl + "-" + curPropertyValueID + ".htm\" class=\"normal\">" + curPropertyValue + "</a>";
            }
        }
    }

       

 

    如此,我們就正式完成了這一個(gè)篩選的效果設(shè)計(jì)。

 

    也許您會(huì)問,我有了“搜索的屬性值”,要怎么去查找出商品呢,怎么出價(jià)格區(qū)間呢?模糊匹配會(huì)不會(huì)影響性能呢?是的。這是需要注意和解決的問題。

    在我們的程序里,用的商品分類索引,然后再用模糊匹配,性能很高。價(jià)格區(qū)間,是按價(jià)格來進(jìn)行Sql中的between篩選的。

    請(qǐng)回頭看我們的這張圖:

    

    您在圖中會(huì)看到一關(guān)鍵的地方,叫“屬性類型”。您在截圖上,只能看到“字符串”這一種,實(shí)際中,下拉列表中我們還有一種,叫“貨幣”。這些類型的不同,決定了,解析方式的不同。您現(xiàn)在應(yīng)該不會(huì)感到困惑了吧?!

 

關(guān)于文章作者的介紹

    馬志遠(yuǎn)(Marc),1981年,2002年湖北大學(xué)肄業(yè),現(xiàn)蝸居廣州。2004年學(xué)習(xí)編程,至今已經(jīng)有8年的編程經(jīng)驗(yàn),長(zhǎng)期從事asp.net B/S方面的開發(fā)和設(shè)計(jì)。在項(xiàng)目解決方案上、在項(xiàng)目性能和擴(kuò)展等上,具有深強(qiáng)的能力。您可以使用mazhiyuan1981@163.com與我取得聯(lián)系。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多