良仓商城项目总结

这一周我们组队进行了良仓商城项目,通过老师提供的商城api接口,我们完成了注册页,登录页,首页,各分类页,商品详情页,搜索页,购物车和结算页等十几个页面,页面内容都是动态的,利用ajax从后端获取的数据。另外,上线的功能我们也做得比较完善。
这几天,我们从了解甚少到现在的比较熟练,技能成长得还是比较完善的,页面的排版,jquery的应用,ajax请求数据的处理,这些能力都得到了较大的增强。
这里是我们项目上线的地址:firehoo.top/web1708/hz-liangcang/index.html。
以下是部分截图

image.png
image.png
image.png
image.png
image.png

良仓商城项目主要是电商这方面的,跟用户的互动是比较多的,而且里面的数据是非常灵活的,更新也是很自由。
整个项目中,ajax的应用比较重要,get和post用到的地方各有不同。注册页面通过正则表达式和验证码的结合,符合要求的账号密码会发到后端数据库。然后通过登录进入到首页,另外每个分类页都是有用户是否登录的检测的,这里的检测我们是用localstorage来保存用户名和密码的,如果存在这样的本地存储,那么头部就显示用户名,表示已登录状态。
我们项目的分类页还是比较完整的,不过由于虚拟的商城接口数据比较少,所以商品的选择比较少,但是这不影响我们的制作。
其实分类页就是用ajax来请求商品数据然后进行排版,主要方式是get和post,项目中我们直接引用jquery中get和post函数,举个例子:

$.get("http://h6.duchengjiu.top/shop/api_goods.php",{pagesize:18,page:3},function(obj){
        var brandArr=["Burj Al-Arab","Rolex","Chanel","Tiffany","Louis Vuitton","Hennessy","Ralph Lauren"]
        var oUl=document.createElement("ul");
        $("#GoodShow").append(oUl);
        for(i=0;i<obj.data.length;i++){
            (function(){
                var oA=document.createElement("a");
                oA.href="";
                var oLi=document.createElement("li");
                var oImg=document.createElement("img");
                oImg.src=obj.data[i].goods_thumb;
                oLi.appendChild(oImg);
                oUl.appendChild(oA);
                oA.appendChild(oLi);
                if((i+1)%3==0){
                    $(oLi).css({marginRight:0});
                };
                //下面是每张图的详情介绍。
                var Price=obj.data[i].price;
                var oBox=document.createElement("div");
                $(oBox).addClass("text");
    
                var oH3=document.createElement("h3");
                oH3.innerText="¥"+Price;
                $(oBox).append(oH3);
                $(oLi).append(oBox);
    
                var name=obj.data[i].goods_name;
                var oH4=document.createElement("h4");
                oH4.innerText=name;
                $(oBox).append(oH4);
    
                var desc=obj.data[i].goods_desc;
                var oDesc=document.createElement("div");
                oDesc.innerText=desc;
                $(oBox).append(oDesc);
                $(oBox).mousemove(function(){
                    $(oBox).css({"opacity":1});
                })
                $(oBox).mouseout(function(){
                    $(oBox).css({opacity:0});
                })
    
                //加上商家信息,随机数。
                var oBrand=document.createElement("div");
                $(oBrand).addClass("who");
                oLi.appendChild(oBrand);
                var Bimg=document.createElement("img");
                $(Bimg).addClass("Bimg");
                var Bspan=document.createElement("span");
                var z=parseInt(Math.random()*7);
                Bspan.innerText=brandArr[z];
                var x=parseInt(Math.random()*300+500);
                var y=parseInt(Math.random()*300+300);
                Bimg.src="http://imgs-qn.iliangcang.com/ware/brand/"+x+".jpg";
                oBrand.appendChild(Bimg);
                oBrand.appendChild(Bspan);
    
                var oStar=document.createElement("div");
                $(oStar).addClass("star")
                var Simg=document.createElement("img");
                var Stext=document.createElement("div");
                Stext.innerText=y;
                $(Simg).addClass("Simg");
                Simg.src="http://imgs-qn.iliangcang.com/images/default/heart_gray20_18.png";
                $(oStar).append(Simg);
                $(oStar).append(Stext);            
                oBrand.appendChild(oStar);
    
            })(i);
        }
    })

上面就是通过get来获取后端数据库里面的商并按照顺序用li标签排列。
这样就形成了上面低张图的效果。
ajax获取数据和页面排版还是比较容易的,这次我做出了购物车的效果,这个还是有点难度的。代码如下:

if(localStorage.getItem("username")!=""&&localStorage.getItem("password")!=""){
    $.post("http://h6.duchengjiu.top/shop/api_user.php",{status:"login",username:localStorage.getItem("username"),password:localStorage.getItem("password")},function(obj1){
        $.post("http://h6.duchengjiu.top/shop/api_cart.php?token="+obj1.data.token,function(obj){
            if(obj.code==0){
                var oUl=document.createElement("ul");
                var priceArr=[]; //每个商品小计数组
                var inputArr=[];//每个商品选中框。
                var aa=[];//因为每个商品有不同的购买数量和单价,所以防止for循环异步事件绑定问题,申明几个数组来储存这些数据。

                $("#goods").append(oUl);//添加ul;

                for(i=0;i<obj.data.length;i++){
                    (function(){
                        var id=obj.data[i].goods_id;
                        var oLi=document.createElement("li");
                        var oImg=document.createElement("img");
                        var oInput=document.createElement("input");
                        $(oInput).css({position:"absolute",top:"0px",left:"20px"})
                        oInput.type="checkbox";
                        oInput.name="goods";//让每个复选框name统一,便于后面全选。
                        oImg.src=obj.data[i].goods_thumb;
                        $(oLi).append(oInput);
                        $(oLi).append(oImg);
                        $(oUl).append(oLi);
                        inputArr[i]=oInput;
    
                        var detail=document.createElement("div");
                        $(detail).css({width:"300px",height:"100%",fontSize:"13px",color:"#999",marginLeft:"20px"});
                        detail.innerText=obj.data[i].goods_name;
                        $(oLi).append(detail);//添加各商品详情。
    
                        var shuliang=document.createElement("div");
                        $(shuliang).css({color:"#444",marginLeft:"60px"});                    
                        var plus=document.createElement("span");
                        plus.innerText="+";//设置加号。

                        var shu=document.createElement("span");
                        aa[i]=shu;//将购买数量分别储存起来。
                        var number=obj.data[i].goods_number;
                        shu.innerText=number;

                        var min=document.createElement("span");
                        min.innerText="-";//设置减号。
                        $(shuliang).append(min);
                        $(shuliang).append(shu);
                        $(shuliang).append(plus);
                        $(oLi).append(shuliang);

                        var price=document.createElement("span");
                        $(price).css({marginLeft:"90px",display:"inline-block",width:"80px"})
                        price.innerText=obj.data[i].goods_price;
                        $(oLi).append(price);//添加每个商品的单价。

                        var tPrice=document.createElement("span");//tPrice代表每行的小计
                        $(tPrice).css({marginLeft:"70px",display:"inline-block",width:"80px"})
                        tPrice.innerText=parseInt(obj.data[i].goods_price*number).toFixed(2);//计算商品小计
                        $(oLi).append(tPrice);
                        priceArr[i]=tPrice.innerText;//将每个商品小计添加到数组里面。
                        
                        var del=document.createElement("span");//删除键的设置及排版
                        del.innerText="删除";
                        $(del).css({color:"skyBlue",cursor:"pointer",marginLeft:"70px"})
                        $(oLi).append(del);
                        $(del).click(function(){
                            $.post("http://h6.duchengjiu.top/shop/api_cart.php?token="+obj1.data.token,{goods_id:id,number:"0"},function(){
                                $(oLi).hide();
                            })
                        })//远程删除购物车里面所选商品。

                        var totalPrice=0;//总价格,它的值赋予$("#price"),初始值为0;
                        //下面要计算总价,要先清楚让总价变化的只有两种:加减号和勾选框。
                        $(plus).click(function(){
                            totalPrice=0;//每次点击,让总价为0;
                            number= parseInt(number)+1;
                            shu.innerText=number;
                            tPrice.innerText=parseInt(price.innerText*number).toFixed(2);//更新购买数量。
                            for(n=0;n<inputArr.length;n++){
                                if(inputArr[n].checked){
                                    priceArr[n]=parseInt(obj.data[n].goods_price*aa[n].innerText).toFixed(2);//判断某个商品是否勾选,如果勾选了就让这个商品的小计等于单价乘各自的数量。
                                }else{
                                    priceArr[n]="0";//如果没有勾选,就让此小计为0,这边的小计是放到总计计算的数组里面的,页面显示的字面量还是单价*数量。
                                }
                            }
                            console.log(priceArr);
                            if(oInput.checked){
                                for(m=0;m<priceArr.length;m++){                                    
                                    totalPrice+=parseInt(priceArr[m]);
                                }                                   
                                $("#price").text(totalPrice); //如果目前的商品是勾选状态,就遍历所有商品的小计,累加到商品总价中;如果没有勾选,它的改变不对总价造成影响。                      
                            } 
                        })

                        //减号同理
                        $(min).click(function(){
                            totalPrice=0;                            
                            number= parseInt(number)-1;
                            if(number<1){
                                number=1;
                            }
                            shu.innerText=number;
                            tPrice.innerText=parseInt(price.innerText*number).toFixed(2);
                            for(n=0;n<inputArr.length;n++){
                                if(inputArr[n].checked){
                                    priceArr[n]=priceArr[n]=parseInt(obj.data[n].goods_price*aa[n].innerText).toFixed(2);
                                }else{
                                    priceArr[n]="0";
                                }
                            };
                        
                            if(oInput.checked){

                                for(m=0;m<priceArr.length;m++){                                    
                                    totalPrice+=parseInt(priceArr[m]);
                                }                                   
                                $("#price").text(totalPrice);                       
                            }
                        })

                        //这边是勾选框的操作
                        $(oInput).click(function(){
                            if(oInput.checked){
                                totalPrice=parseInt($("#price").text())+parseInt(tPrice.innerText);//如果选中,则添加到总价里面
                            }else{                           
                                totalPrice=parseInt($("#price").text())-parseInt(tPrice.innerText);//如果取消选中,则添加到总价里面。
                            }
                            $("#price").text(totalPrice);//更新总价                            
                        })
                    })(i);


                    //下面是全选功能。
                    $("#total").click(function(){
                        var cBox=document.getElementsByName("goods");
                        if($("#total").is(":checked")){
                            totalPrice=0;
                            for(j=0;j<cBox.length;j++){
                                cBox[j].checked=true;
                                totalPrice+=parseInt(priceArr[j]);//如果选中,就遍历加上所有商品的小计。
                                $("#price").text(totalPrice);
                            }
                        }else{
                            for(j=0;j<cBox.length;j++){
                                cBox[j].checked=false;
                                $("#price").text("0.00")//如果取消全选,就让总价为0;
                            }
                        }
                    })
                    $("#liji").click(function(){
                        localStorage.setItem("money",$("#price").text());//转到结算页面
                    })

                }


            }

        })
    })
}

购物车的计算逻辑比较简单,不过如何让计算总价的效果如我们所想的一样,就比较难了,因为每个商品的单价、数量和小计都是不同的,还要检测这个商品是否被勾选,所以理清这其中的关键才能让计算变得准确。
我的思路是将所有的单价,购买数量、小计以及勾选框保存在几个数组里面,这样就能知道每个商品的状态,比如各商品小计=购买数量x它的单价,然后判断是否被勾选,如果勾选,就将其小计算入总价,如果没有,就让其小计字面量为单价x数量,不过累加到总价里的小计值为0,这样就能准确地算出总计,以及完成购物车了。
总之,良仓项目告一段落,自我感觉提升还是蛮大的,ajax的应用也比较熟练了,页面的排版也得到了回顾,jquery的应用也很灵活了,任务虽然较重,不过收获确实很大。
由于项目较大,一些项目的编写重复工作很多,所以这里就不能介绍完全了。希望大家喜欢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容