【SSH网上商城项目实战17】购物车基本功能的实现

来源:互联网 发布:好的软件培训 编辑:程序博客网 时间:2024/04/30 11:30

目录(?)[+]

  1. 添加新的表
  2. 购物车的后台逻辑
    1. 1 Service层的逻辑
    2. 2 Action部分的逻辑
  3. 前台链接的跳转

        上一节我们将商品的详细页面做完了,并使用了hibernate的二级缓存加载详细页面来提高系统的性能。这节我们开始做购物车部分。

1. 添加新的表

        首先我们向数据库中添加几张表:用户表、订单状态表、订单表(购物车表)以及购物项表。用户表中存有用户的基本信息,订单状态表中主要存储订单的状态,比如已发货这种,订单表主要存储用户的信息和订单的状态,所以跟用户表和订单状态表关联,购物项表存储某个商品以及所属的订单,所以跟商品表和订单表相关联。具体的表信息见下面的sql语句:

[sql] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. /*============================*/  
  2. /* Table: 用户表结构               */  
  3. /*============================*/  
  4. create table user  
  5. (  
  6.    /* 用户编号,自动增长 */  
  7.    id                  int primary key not null auto_increment,  
  8.    /* 用户登录名 */  
  9.    login               varchar(20),  
  10.    /* 用户真实姓名 */  
  11.    name                varchar(20),  
  12.    /* 用户登录密码 */  
  13.    pass                varchar(20),  
  14.    /* 用户性别 */  
  15.    sex                 varchar(20),  
  16.    /* 用户电话 */  
  17.    phone               varchar(20),  
  18.    /* 用户Email */  
  19.    email               varchar(20)  
  20. );  
  21.   
  22. /*=============================*/  
  23. /* Table: 订单状态表结构              */  
  24. /*=============================*/  
  25. create table status  
  26. (  
  27.    /* 状态编号,自动增长 */  
  28.    id                  int primary key not null auto_increment,  
  29.    /* 订单状态 */  
  30.    status               varchar(10)  
  31. );  
  32.   
  33. /*=============================*/  
  34. /* Table: 购物车(订单)表结构           */  
  35. /*=============================*/  
  36. create table forder  
  37. (  
  38.    /* 订单编号,自动增长 */  
  39.    id                  int primary key not null auto_increment,  
  40.    /* 收件人名字 */  
  41.    name                varchar(20),  
  42.    /* 收件人电话 */  
  43.    phone               varchar(20),  
  44.    /* 配送信息 */  
  45.    remark              varchar(20),  
  46.    /* 下单日期 */  
  47.    date                timestamp default CURRENT_TIMESTAMP,  
  48.    /* 订单总金额 */  
  49.    total               decimal(8,2),  
  50.    /* 收件人邮编 */  
  51.    post                varchar(20),  
  52.     /* 收件人邮编 */  
  53.    address             varchar(200),  
  54.    /* 订单状态 */  
  55.    sid                 int default 1,  
  56.    /* 会员编号 */  
  57.    uid                 int,  
  58.    constraint sid_FK foreign key(sid) references status(id),  
  59.    constraint uid_FK foreign key(uid) references user(id)  
  60. );  
  61.   
  62. /*=============================*/  
  63. /* Table: 购物项表结构               */  
  64. /*=============================*/  
  65.   
  66. create table sorder  
  67. (  
  68.    /* 购物项编号,自动增长 */  
  69.    id                  int primary key not null auto_increment,  
  70.    /* 被购买商品的名称 */  
  71.    name                varchar(20),  
  72.    /* 购买时商品的价格 */  
  73.    price               decimal(8,2),  
  74.    /* 购买的数量 */  
  75.    number              int not null,  
  76.    /* 所属商品编号 */  
  77.    pid                  int,  
  78.    /* 此订单项,所属的订单编号 */  
  79.    fid                  int,  
  80.    constraint pid_FK foreign key(pid) references product(id),  
  81.    constraint fid_FK foreign key(fid) references forder(id)  
  82. );  
/*============================*//* Table: 用户表结构               *//*============================*/create table user(   /* 用户编号,自动增长 */   id                  int primary key not null auto_increment,   /* 用户登录名 */   login               varchar(20),   /* 用户真实姓名 */   name                varchar(20),   /* 用户登录密码 */   pass                varchar(20),   /* 用户性别 */   sex                 varchar(20),   /* 用户电话 */   phone               varchar(20),   /* 用户Email */   email               varchar(20));/*=============================*//* Table: 订单状态表结构              *//*=============================*/create table status(   /* 状态编号,自动增长 */   id                  int primary key not null auto_increment,   /* 订单状态 */   status               varchar(10));/*=============================*//* Table: 购物车(订单)表结构           *//*=============================*/create table forder(   /* 订单编号,自动增长 */   id                  int primary key not null auto_increment,   /* 收件人名字 */   name                varchar(20),   /* 收件人电话 */   phone               varchar(20),   /* 配送信息 */   remark              varchar(20),   /* 下单日期 */   date                timestamp default CURRENT_TIMESTAMP,   /* 订单总金额 */   total               decimal(8,2),   /* 收件人邮编 */   post                varchar(20),    /* 收件人邮编 */   address             varchar(200),   /* 订单状态 */   sid                 int default 1,   /* 会员编号 */   uid                 int,   constraint sid_FK foreign key(sid) references status(id),   constraint uid_FK foreign key(uid) references user(id));/*=============================*//* Table: 购物项表结构               *//*=============================*/create table sorder(   /* 购物项编号,自动增长 */   id                  int primary key not null auto_increment,   /* 被购买商品的名称 */   name                varchar(20),   /* 购买时商品的价格 */   price               decimal(8,2),   /* 购买的数量 */   number              int not null,   /* 所属商品编号 */   pid                  int,   /* 此订单项,所属的订单编号 */   fid                  int,   constraint pid_FK foreign key(pid) references product(id),   constraint fid_FK foreign key(fid) references forder(id));
        然后我们将这些表通过逆向工程转换为POJO,具体不在赘述。

2. 购物车的后台逻辑

2.1 Service层的逻辑

        当用户将某个商品加入购物车时,我们首先要通过商品的id获取该商品信息,然后将该商品添加到购物车中,在添加之前,我们首先得判断当前session中有没有购物车,如果没有的话,我们得先创建一个购物车,如果有,我们将当前的购物项添加到购物车里,在添加之前,需要先判断该购物项在购物车中是否已经存在了,如果存在了只需要增加相应的购物数量即可,如果不存在则添加,然后计算购物总价格,最后将购物车存到session中。整个流程见下面的示意图:

        接下来我们来实现具体的逻辑,首先新建两个Service接口:SorderService和ForderService。SorderService中主要定义了两个方法:将用户添加的商品转换为购物项,然后将购物项添加到购物车;ForderService中主要定义了计算购物车总价格的方法,如下:

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. //SorderService接口  
  2. public interface SorderService extends BaseService<Sorder> {  
  3.     //添加购物项,返回新的购物车  
  4.     public Forder addSorder(Forder forder, Product product);  
  5.     //把商品数据转化为购物项  
  6.     public Sorder productToSorder(Product product);  
  7. }  
  8.   
  9. //ForderService接口  
  10. public interface ForderService extends BaseService<Forder> {  
  11.     //计算购物总价格  
  12.     public double cluTotal(Forder forder);  
  13. }  
//SorderService接口public interface SorderService extends BaseService<Sorder> {    //添加购物项,返回新的购物车    public Forder addSorder(Forder forder, Product product);    //把商品数据转化为购物项    public Sorder productToSorder(Product product);}//ForderService接口public interface ForderService extends BaseService<Forder> {    //计算购物总价格    public double cluTotal(Forder forder);}
        然后我们具体实现这两个接口:

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. //SorderServiceImpl实现类  
  2. @Service(“sorderService”)  
  3. public class SorderServiceImpl extends BaseServiceImpl<Sorder> implements  
  4.         SorderService {  
  5.   
  6.     @Override  
  7.     public Forder addSorder(Forder forder, Product product) {  
  8.         boolean isHave = false//用来标记有没有重复购物项  
  9.         //拿到当前的购物项  
  10.         Sorder sorder = productToSorder(product);  
  11.         //判断当前购物项是否重复,如果重复,则添加数量即可  
  12.         for(Sorder old : forder.getSorders()) {  
  13.             if(old.getProduct().getId().equals(sorder.getProduct().getId())) {  
  14.                 //购物项有重复,添加数量即可  
  15.                 old.setNumber(old.getNumber() + sorder.getNumber());  
  16.                 isHave = true;  
  17.                 break;  
  18.             }  
  19.         }  
  20.         //当前购物项在购物车中不存在,新添加即可  
  21.         if(!isHave) {  
  22.             forder.getSorders().add(sorder);  
  23.         }  
  24.         return forder;  
  25.     }  
  26.   
  27.     @Override  
  28.     public Sorder productToSorder(Product product) {  
  29.         Sorder sorder = new Sorder();  
  30.         sorder.setName(product.getName());  
  31.         sorder.setNumber(1);  
  32.         sorder.setPrice(product.getPrice());  
  33.         sorder.setProduct(product);  
  34.         return sorder;  
  35.     }  
  36. }  
  37.   
  38. //ForderServiceImpl实现类  
  39. @Service(“forderService”)  
  40. public class ForderServiceImpl extends BaseServiceImpl<Forder> implements ForderService {  
  41.   
  42.     @Override  
  43.     public double cluTotal(Forder forder) {  
  44.   
  45.         double total = 0.0;  
  46.         for(Sorder sorder : forder.getSorders()) {  
  47.             total += sorder.getNumber() * sorder.getPrice();  
  48.         }  
  49.         return total;  
  50.     }  
  51.       
  52. }  
//SorderServiceImpl实现类@Service("sorderService")public class SorderServiceImpl extends BaseServiceImpl<Sorder> implements        SorderService {    @Override    public Forder addSorder(Forder forder, Product product) {        boolean isHave = false; //用来标记有没有重复购物项        //拿到当前的购物项        Sorder sorder = productToSorder(product);        //判断当前购物项是否重复,如果重复,则添加数量即可        for(Sorder old : forder.getSorders()) {            if(old.getProduct().getId().equals(sorder.getProduct().getId())) {                //购物项有重复,添加数量即可                old.setNumber(old.getNumber() + sorder.getNumber());                isHave = true;                break;            }        }        //当前购物项在购物车中不存在,新添加即可        if(!isHave) {            forder.getSorders().add(sorder);        }        return forder;    }    @Override    public Sorder productToSorder(Product product) {        Sorder sorder = new Sorder();        sorder.setName(product.getName());        sorder.setNumber(1);        sorder.setPrice(product.getPrice());        sorder.setProduct(product);        return sorder;    }}//ForderServiceImpl实现类@Service("forderService")public class ForderServiceImpl extends BaseServiceImpl<Forder> implements ForderService {    @Override    public double cluTotal(Forder forder) {        double total = 0.0;        for(Sorder sorder : forder.getSorders()) {            total += sorder.getNumber() * sorder.getPrice();        }        return total;    }    }
        然后我们需要将这两个bean注入到BaseAction中,供SorderAction使用:

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. @Controller(“baseAction”)  
  2. @Scope(“prototype”)  
  3. public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T> {  
  4.   
  5.     //省略其他无关代码……  
  6.   
  7.     @Resource  
  8.     protected ForderService forderService;  
  9.     @Resource  
  10.     protected SorderService sorderService;  
  11.   
  12. }  
@Controller("baseAction")@Scope("prototype")public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T> {    //省略其他无关代码……    @Resource    protected ForderService forderService;    @Resource    protected SorderService sorderService;}
        好了,Service层的逻辑做完了,接下来准备做Action部分:

2.2 Action部分的逻辑

        我们新建一个SorderAction,将上面的逻辑图上显示的流程走一遍即可完成添加购物车的逻辑了。代码如下:

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. @Controller  
  2. @Scope(“prototype”)  
  3. public class SorderAction extends BaseAction<Sorder> {  
  4.     public String addSorder() {  
  5.           
  6.         //1. 根据product.id获取相应的商品数据  
  7.         Product product = productService.get(model.getProduct().getId());  
  8.           
  9.         //2. 判断当前session是否有购物车,如果没有则创建  
  10.         if(session.get(“forder”) == null) {  
  11.             //创建新的购物车,存储到session中  
  12.             session.put(”forder”new Forder(new HashSet<Sorder>()));  
  13.         }   
  14.   
  15.         //3. 把商品信息转化为sorder,并且添加到购物车中(判断购物项是否重复)  
  16.         Forder forder = (Forder) session.get(”forder”);  
  17.         forder = sorderService.addSorder(forder, product);  
  18.           
  19.         //4. 计算购物的总价格  
  20.         forder.setTotal(forderService.cluTotal(forder));  
  21.         //5. 把新的购物车存储到session中  
  22.         session.put(”forder”, forder);  
  23.         return “showCart”;  
  24.     }  
  25. }  
@Controller@Scope("prototype")public class SorderAction extends BaseAction<Sorder> {    public String addSorder() {        //1. 根据product.id获取相应的商品数据        Product product = productService.get(model.getProduct().getId());        //2. 判断当前session是否有购物车,如果没有则创建        if(session.get("forder") == null) {            //创建新的购物车,存储到session中            session.put("forder", new Forder(new HashSet<Sorder>()));        }         //3. 把商品信息转化为sorder,并且添加到购物车中(判断购物项是否重复)        Forder forder = (Forder) session.get("forder");        forder = sorderService.addSorder(forder, product);        //4. 计算购物的总价格        forder.setTotal(forderService.cluTotal(forder));        //5. 把新的购物车存储到session中        session.put("forder", forder);        return "showCart";    }}
        配置一下struts.xml文件:

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. <action name=“sorder_*” class=“sorderAction” method=“{1}”>  
  2.     <result name=“showCart”>/showCart.jsp</result>  
  3. </action>  
<action name="sorder_*" class="sorderAction" method="{1}">    <result name="showCart">/showCart.jsp</result></action>
        然后跳转到购物车显示页面showCart.jsp,showCart.jsp中关于购物车部分的前台程序如下:


3. 前台链接的跳转

        后台部分全部做完了,接下来将前台detail.jsp页面添加购物车的链接地址该成访问SorderAction即可:


       这样就能正确跳转了,下面我们看一下购物车显示页面的具体效果:

        这样我们购物车的基本功能就做完了,后面我们再对其做一些完善。


       相关阅读:http://blog.csdn.net/column/details/str2hiberspring.html

       整个项目的源码下载地址:http://blog.csdn.NET/eson_15/article/details/51479994

_____________________________________________________________________________________________________________________________________________________

—–乐于分享,共同进步!

—–更多文章请看:http://blog.csdn.net/eson_15

document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
    <div id="digg" articleid="51418350">        <dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">             <dt>顶</dt>            <dd>11</dd>        </dl>        <dl id="btnBury" class="digg digg_enable" onclick="btnburya();">              <dt>踩</dt>            <dd>0</dd>                       </dl>    </div> <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank">&nbsp;</a>   </div><div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</a></div><script type="text/javascript">            function btndigga() {                $(".tracking-ad[data-mod='popu_222'] a").click();            }            function btnburya() {                $(".tracking-ad[data-mod='popu_223'] a").click();            }        </script>


<div style="clear:both; height:10px;"></div>    <div class="similar_article" style="">            <h4>我的同类文章</h4>            <div class="similar_c" style="margin:20px 0px 0px 0px">                <div class="similar_c_t">                            <label class="similar_cur">                                <span style="cursor:pointer" onclick="GetCategoryArticles('6228419','eson_15','foot','51418350');">●  项目实战<em>(29)</em></span>                            </label>                            <label class="">                                <span style="cursor:pointer" onclick="GetCategoryArticles('6214186','eson_15','foot','51418350');">------【SSH网上商城】<em>(29)</em></span>                            </label>                </div>                <div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">                    <a href="http://blog.csdn.net" style="display:none" target="_blank">http://blog.csdn.net</a>                    <ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51506334" id="foot_aritcle_51506334undefined07923260436447199" target="_blank" title="【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表">【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表</a><span>2016-05-26</span><label><i>阅读</i><b>6059</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51484247" id="foot_aritcle_51484247undefined4768835685464923" target="_blank" title="【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布">【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布</a><span>2016-05-23</span><label><i>阅读</i><b>13823</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51475431" id="foot_aritcle_51475431undefined24466559284061407" target="_blank" title="【SSH网上商城项目实战26】完成订单支付后的短信发送功能">【SSH网上商城项目实战26】完成订单支付后的短信发送功能</a><span>2016-05-22</span><label><i>阅读</i><b>4704</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51465067" id="foot_aritcle_51465067undefined005530096470807377" target="_blank" title="【SSH网上商城项目实战24】Struts2中如何处理多个Model请求">【SSH网上商城项目实战24】Struts2中如何处理多个Model请求</a><span>2016-05-21</span><label><i>阅读</i><b>4245</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51452243" id="foot_aritcle_51452243undefined0062675089359605085" target="_blank" title="【SSH网上商城项目实战22】获取银行图标以及支付页面的显示">【SSH网上商城项目实战22】获取银行图标以及支付页面的显示</a><span>2016-05-19</span><label><i>阅读</i><b>3742</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51441431" id="foot_aritcle_51441431undefined820387173455515" target="_blank" title="【SSH网上商城项目实战20】在线支付平台的介绍">【SSH网上商城项目实战20】在线支付平台的介绍</a><span>2016-05-18</span><label><i>阅读</i><b>4107</b></label></li> </ul>                    <ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51487323" id="foot_aritcle_51487323undefined8876969164530883" target="_blank" title="【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价">【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价</a><span>2016-05-24</span><label><i>阅读</i><b>5337</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51479994" id="foot_aritcle_51479994undefined5001572471017519" target="_blank" title="【SSH网上商城项目实战30】项目总结(附源码下载地址)">【SSH网上商城项目实战30】项目总结(附源码下载地址)</a><span>2016-05-27</span><label><i>阅读</i><b>21890</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51475046" id="foot_aritcle_51475046undefined9184912825972149" target="_blank" title="【SSH网上商城项目实战25】使用java email给用户发送邮件">【SSH网上商城项目实战25】使用java email给用户发送邮件</a><span>2016-05-22</span><label><i>阅读</i><b>4007</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51464415" id="foot_aritcle_51464415undefined3111782963392702" target="_blank" title="【SSH网上商城项目实战23】完成在线支付功能">【SSH网上商城项目实战23】完成在线支付功能</a><span>2016-05-20</span><label><i>阅读</i><b>8822</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51447492" id="foot_aritcle_51447492undefined24922161472174964" target="_blank" title="【SSH网上商城项目实战21】从Demo中看易宝支付的流程">【SSH网上商城项目实战21】从Demo中看易宝支付的流程</a><span>2016-05-18</span><label><i>阅读</i><b>9653</b></label></li> </ul>                <a href="http://blog.csdn.net/eson_15/article/category/6228419" class="MoreArticle">更多文章</a></div>            </div>        </div>    <script type="text/javascript">    $(function () {        GetCategoryArticles('6228419', 'eson_15','foot','51418350');    });</script>

0 0