• SSH实战 · 唯唯乐购项目(中)


    用户模块
    三:一级分类的查询
    1. 创建一级分类表并导入基本数据
    CREATE TABLE `category` (
      `cid` int(11) NOT NULL AUTO_INCREMENT,
      `cname` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`cid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
    1. 建包及相应的类:
      • com.weiwei.shopping.category
        • action :CategoryAction
        • service :CategoryService:业务层对象 
        • dao :CategoryDao:持久层对象 
        • vo :Category:实体对象 ;Category.hbm.xml:映射文件 
     
    1. 对Service和DAO进行配置:
      • 在DAO中注入sessionFactory
      • 在Service中注入DAO
     
    1. 需要在IndexAction中注入一级分类的Service.
      • IndexAction   调用   CategoryService   调用   CategoryDao
      • 将一级分类的数据显示到页面
      • 将一级分类的数据存入到session中:因为之后很多页面都会用到。
     
    五:首页上热门商品的显示
    1. 建表:
    创建二级分类的表:
    CREATE TABLE `categorysecond` (
      `csid` int(11) NOT NULL AUTO_INCREMENT,
      `csname` varchar(255) DEFAULT NULL,
      `cid` int(11) DEFAULT NULL,
      PRIMARY KEY (`csid`),
      KEY `FK936FCAF21DB1FD15` (`cid`),
      CONSTRAINT `FK936FCAF21DB1FD15` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8;
    创建商品表:
    CREATE TABLE `product` (
      `pid` int(11) NOT NULL AUTO_INCREMENT,
      `pname` varchar(255) DEFAULT NULL,
      `market_price` double DEFAULT NULL,
      `shop_price` double DEFAULT NULL,
      `image` varchar(255) DEFAULT NULL,
      `pdesc` varchar(255) DEFAULT NULL,
      `is_hot` int(11) DEFAULT NULL,
      `pdate` datetime DEFAULT NULL,
      `csid` int(11) DEFAULT NULL,
      PRIMARY KEY (`pid`),
      KEY `FKED8DCCEFB9B74E02` (`csid`),
      CONSTRAINT `FKED8DCCEFB9B74E02` FOREIGN KEY (`csid`) REFERENCES `categorysecond` (`csid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=utf8;
     
    1. 建包及相应的类:
      • com.weiwei.shopping.product
        • action :ProductAction
        • service :ProductService:业务层对象 
        • dao :ProductDao:持久层对象 
        • vo :Product:实体对象 ;Product.hbm.xml:映射文件 
     
    1. 对Service和DAO进行配置:
      • 在DAO中注入sessionFactory
      • 在Service中注入DAO
     
    1. 需要在IndexAction中注入商品的Service.
      • IndexAction  调用  ProductService  调用  ProductDao
      • 查询热门商品
      • is_hot: 0:不是热门商品  1:是热门商品;
      • 查询带有个数
      • 分页查询
      • 将查询到的数据保存到值栈中
     
    六:首页上最新商品的显示
    1. IndexAction  调用   ProductService  调用   ProductDao
      • 查询最新商品:
      • 按商品上传日期倒序进行排序 只显示10个.
      • 将查询到记录保存到值栈中:
     
    七:首页上点击商品显示商品详情
    1. 点击商品链接:
           * 传递商品id.
    1. 编写Action:
    * 编写Action类,继承ActionSupport实现模型驱动接口.
    * 编写一个执行的方法.
    1. 配置Action:
    * 在applicationContext.xml中配置Action
    * 在struts.xml中配置Action
    1. 在Action中调用Service完成根据ID进行查询的方法:
    * 注入ProductService.
    * 完成查询
    1. 在页面上显示相应数据 :
    * 页面转向
    * 修改页面
    * 显示数据
         显示数据时可以直接通过模型驱动的model对象拿数据。例如:
    src="${pageContext.request.contextPath}/<s:property value="model.image"/>"
    <s:property value="model.shop_price"/>
     
    八:首页上点击一级分类,查询商品列表:(左侧一级分类和二级分类关联查询)
    1. 创建二级分类的包及类:
      • com.weiwei.shopping.categorysecond
        • action :CategorySecondAction 
        • service :CategorySecondService 
        • dao :CategorySecondDao 
        • vo :CategorySecond 
        • CategorySecond.hbm.xml
     
    1. 配置一级分类和二级分类的关联关系:
      • Category.xml
     <!-- 配置一个二级分类的集合   按照编号进行排序  懒加载默认是true,为了不延迟改为false-->
              <set order-by="csid" name="categorySeconds" lazy="false">
                  <key column="cid"></key>
                  <one-to-many class="com.weiwei.shopping.categorysecond.vo.CategorySecond"/>
              </set>
      • CategorySecond.hbm.xml
               <!--
                相对于一级分类,二级分类是many的一端 :在二级分类中配置many-to-one
                name:实体类中的属性
                column:表中的外键字段
               -->
               <many-to-one name="category" class="com.weiwei.shopping.category.vo.Category" column="cid"></many-to-one>
     
    1. 点击一级分类的链接:
      • 传递一级分类的cid,根据cid查询所有商品.
     
    1. 编写Action:
      • 接收cid:
      • 编写一个执行的方法:因为再ProductService中已经做了FindAll()方法,所以在这里直接注入ProductService 调用方法,然后返回字符串进行页面跳转。
      • 在页面上用迭代标签迭代显示左侧分类 ;
      • 关联查找:直接从session中获得一级分类的数据,需要在映射文件中配置一级分类上二级分类的集合(lazy="false" );并且为了数据顺序不变,按二级分类的遍号排序显示(order-by="csid" )。
     
    九:首页上点击一级分类,查询商品列表:(显示商品列表)
    1. 查询商品,带有分页显示商品
      • 回到商品列表页面
      • 需要查询:商品集合,当前页数,总页数(总记录数),每页显示记录数.( 将后台的这些数据带到页面上,首选:值栈 )
      • 将这些数据封装到一个分页类中。(最后将分页类保存到值栈中就OK)。
    1. 在工具包中封装一个PageBean。
    2. 完成查询:
      • 传递当前页数到ProductAction中,提供set方法;
      • 调用ProductService的FindByPageCid()方法完成查询;参数:Cid,page;
    方法返回的是PageBean;
    1. 配置二级分类和商品关联关系——类似于一级分类月二级分类的配置。
    注意:在页面上从值栈中、模型驱动取PageBean不用加#;从session中取值需要加#.
     
    :商品分类页面根据二级分类ID查询商品
    1. 点击二级分类链接:
      • 传递csid
      • 传递page=1
    1. 编写Action :
      • 接收csid:
      • 接收page
    1. 调用Service完成查询:
      • 封装成PageBean
    1. 在页面中进行显示
     
    购物车模块
    一:创建表、包结构及映射文件。
    二:将商品添加进购物车
    1. 封装购物车对象
      • Cart:购物车对象
        • CartItem的集合
        • total:总计 = 小计相加
        • 功能:
          • 将购物项添加到购物车
          • 从购物车中移出购物项
          • 清空购物车
         /*功能1:将购物项添加到购物车*/
         public void addCart(CartItem cartItem){
              /*判断购物车中是否已经存在该购物项
               *   存在:
               *        数量增加
               *        总计 = 总计 + 购物项小计
               * 不存在:
               *        向map中添加购物项
               *        总计 = 总计 + 购物项小计
               * */
              //获得商品id
              Integer pid = cartItem.getProduct().getPid();
              //判断购物车中是否存在该购物项:
              if(map.containsKey(pid)){
                  //存在
                  //获取原来的购物项
                  CartItem OcartItem = map.get(pid);
                  OcartItem.setCount(OcartItem.getCount() + cartItem.getCount());
              } else {
                  //不存在
                  map.put(pid, cartItem);
              }
              //设置总计的值
              total += cartItem.getSubtotal();
         }
      • CartItem:购物项
        • Product:商品信息
        • count:购买某种商品的数量
        • subtotal:购买某种商品的小计=单价*数量(Product.shop_price*count)
     
          提示:(1)set集合每添加一个顺序就会变化:所以购物车中不用set;若只为显示购物车,则用list集合就足够了,但是为了能够删除商品,我们选择用map集合,通过key可以删除选中商品。
                   (2)通过JS提交表单:document.getElementById("表单ID").submit();
                   (3)在购物车中显示商品:${pageContext.request.contextPath}/<s:property value="#cartItem.product.image"在页面上从值栈中取PageBean不用加#;从session中取值需要加#.
                   
     
    三:清空购物车
      • 在CartAction中:
        • 获得购物车
        • 调用clearCart()方法
      • 在页面上:
        • 用struts迭代标签判断
          • 若购物车为空则不显示相关按钮、表单
          • 若不为空则显示表单、相关商品
     
    四:移出购物项
      • 点击页面的移出链接,传入pid
      • 在CartAction中:
        • 获得购物车
        • 调用removeCart()方法
     
    注意:
    session序列化的异常。
    session销毁三种情况:
    (1)服务器超时:30分钟;
    (2)服务器非正常关闭:如从控制台直接关tomcat(点stop是正常关闭,启动会抛序列化异常)
    (3)手动调用session的销毁方法(如本项目中的退出功能);
     
    所以让实体类实现序列化接口就解决了:
    /*实现序列化的接口,以免服务器抛序列化异常*/
    public class Cart implements Serializable{···}
     
     
    订单模块
    一:建表:数据库设计模块已完成;
    二:创建订单模块的包、类:
    • com.weiwei.shopping.order
      • action :OrderAction 
      • service :OrderService 
      • dao :OrderDao 
      • vo :
        • Order 
        • Order.hbm.xml
        • OrderItem
        • OrderItem.hbm.xml
     
    三:配置:
    • applicationContext.xml
    • 配置映射
    • OrderAction   调用   OrderService   调用   OrderDao
    • 实现提交订单时页面的跳转:修改我的购物车页面的提交按钮链接,再编写OrderAction、配置struts.xml
     
    四:订单页面数据生成并显示
    • 生成订单
      • 保存订单的数据
      • 在页面中显示订单数据
      • 通过模型驱动的对象将数据传递到页面.(原理还是值栈)
    • 我的订单
      • 根据用户的uid查询当前用户的所有的订单
     
    五:付款
    • 在线付款原理图:
              本项目采用第二种方式。
    • 在线付款流程分析
    • 本项目付款功能流程
      • 跳转到页面:根据订单的oid查询订单.
      • 在页面中对其进行付款
    • 付款功能的实现
      • 在线支付的方式
      • 在线支付
      • 与第三方支付公司对接:(易宝)
      • 在线支付的流程
      • 付款功能代码实现
      • 修改订单数据:(收货人,地址,电话)
      • 完成付款的功能
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    软件工程——理论、方法与实践 第三章
    软件工程——理论、方法与实践 第二章
    软件工程——理论、方法与实践 第一章
    使用@RunWith(SpringJUnit4ClassRunner.class)进行单元测试时 报错 和 java.lang.NoSuchMethodError的解决方法
    springMVC 校验时,CustomValidationMessages.properties中的错误提示信息的中文乱码 问题
    通过scrapy,从模拟登录开始爬取知乎的问答数据
    利用AJAX JAVA 通过Echarts实现豆瓣电影TOP250的数据可视化
    Scrapy爬取伯乐在线的所有文章
    搭建第一个scrapy项目的常见问题
    利用Ajax实现数据的同步传输,从mysql中提取数据,通过echarts可视化
  • 原文地址:https://www.cnblogs.com/panweiwei/p/6245743.html
Copyright © 2020-2023  润新知