图书管理系统【用户、购买、订单模块、添加权限】(二)

简介: 笔记


提供显示购物车商品的Servlet


//先判断该用户是否登陆了

       Useruser=(User)request.getSession().getAttribute("user");

       if(user==null){

           request.setAttribute("message","您还没有登陆呢!");

           request.getRequestDispatcher("/message.jsp").forward(request,response);

           return;

       }


       //如果登陆了.....

       Cartcart=(Cart)request.getSession().getAttribute("cart");


       //把该用户的购物车给JSP页面显示

       request.setAttribute("cart",cart);

       request.getRequestDispatcher("/client/listCart.jsp").forward(request,response);


显示购物车的JSP页面


<c:iftest="${empty(cart.map)}">


   您还没有购买过任何商品哦!!!

</c:if>



<tableborder="1px">

   <c:iftest="${!empty(cart.map)}">

       <h1>您购物车下有如下的商品:</h1><br>


       <tr>

           <td>书名:</td>

           <td>作者:</td>

           <td>数量:</td>

           <td>价钱:</td>

       </tr>

       <c:forEachitems="${cart.map}"var="cartItme">



           <tr>

               <td>${cartItme.value.book.name}</td>

               <td>${cartItme.value.book.author}</td>

               <td>${cartItme.value.quantity}</td>

               <td>${cartItme.value.price}</td>

           </tr>

       </c:forEach>


   </c:if>

</table>

效果:

42.gif


订单模块


在前台用户界面中,当用户要把购物车付款时,应该提供生成订单的超链接....

43.jpg


设计订单实体


订单应该包含id,收货人信息,下单的时间,订单的总价,订单的状态【有无发货】..而不应该包含商品的信息的。商品的信息用一个专门的”订单项“来表示

一个订单对应多个订单项,这是一对多的关系!

privateStringid;

   

   //下单的时间、日期、状态

   privateDatedate;

   privatedoubleprice;

   privatebooleanstate;

   

   //一个用户可以有多个订单,把用户记住

   privateStringuser_id;


   //一个订单中有多个订单项

   privateSet<OrderItem>items=newHashSet<>();


   //各种的setter和getter


设计订单项实体


privateStringid;



   //一本书对应多个订单项,订单项一定是由书组成,记住书

   privateStringbook_id;


   privatedoubleprice;

   privateintquantity;


   //各种的setter和getter


设计数据库表


  • 订单表

mysql不能创建名为”order”的表,后边加个s就可以

CREATETABLEorders(

 id      VARCHAR(40)PRIMARYKEY,

 date    DATE        NOTNULL,

 user_idVARCHAR(40)NOTNULL,

 state   BOOLEAN,

 price   DOUBLE,

 CONSTRAINTuser_id_FKFOREIGNKEY(user_id)REFERENCESuser(id)

);

  • 订单项表:

CREATETABLEorderItem(

 id       VARCHAR(40)PRIMARYKEY,

 price    DOUBLE,

 quantityINT,

 order_idVARCHAR(40),

 book_id  VARCHAR(40),

 CONSTRAINTorder_id_FKFOREIGNKEY(order_id)REFERENCESorders(id),

 CONSTRAINTbook_id_FKFOREIGNKEY(book_id)REFERENCESbook(id)

);

  • 表之间的结构:

44.jpg

设计Dao


publicclassOrderDaoImplimplementszhongfucheng.dao.OrderDao{


   @Override

   publicvoidaddOrder(Orderorder){

       QueryRunnerqueryRunner=newQueryRunner(Utils2DB.getDataSource());

       Stringsql1="INSERT INTO orders(id,ordertime,user_id,state,price) VALUES(?,?,?,?,?)";

       try{

           //订单的基本信息

           queryRunner.update(sql1,newObject[]{order.getId(),order.getOrdertime(),order.getUser_id(),order.isState(),order.getPrice()});


           //订单项的信息

           Stringsql2="INSERT INTO orderItem(id,price,quantity,order_id,book_id) VALUES(?,?,?,?,?)";


           Set<OrderItem>items=order.getItems();


           for(OrderItemitem:items){

               queryRunner.update(sql2,newObject[]{item.getId(),item.getPrice(),item.getQuantity(),item.getOrder_id(),item.getBook_id()});

           }

       }catch(SQLExceptione){

           thrownewRuntimeException(e);

       }

   }


   @Override

   publicOrderfindOrder(Stringid){

       QueryRunnerqueryRunner=newQueryRunner(Utils2DB.getDataSource());


       Orderorder;

       try{

           //找出订单的基本信息

           Stringsql="SELECT * FROM orders WHERE id=?";

           order=(Order)queryRunner.query(sql,newBeanHandler(Order.class),newObject[]{id});


           //找出订单的所有订单项

           Stringsql2="SELECT * FROM orderItem WHERE order_id=?";

           List<OrderItem>list=(List<OrderItem>)queryRunner.query(sql2,newBeanListHandler(OrderItem.class),newObject[]{order.getId()});


           System.out.println("这是数据库拿到的list集合:"+list.size());



           //将所有订单项装到订单里边

           order.getItems().addAll(list);

           System.out.println("这是数据库拿到的"+order.getItems().size());



           //找出该订单是属于哪一个用户的

           Stringsql3="SELECT * FROM orders o,user u WHERE o.user_id=u.id AND o.id=? ";

           Useruser=(User)queryRunner.query(sql3,newBeanHandler(User.class),newObject[]{order.getId()});


           order.setUser_id(user.getId());

           returnorder;



       }catch(SQLExceptione){

           thrownewRuntimeException(e);

       }

   }



   //更新订单的状态

   publicvoidupdateState(Stringid){


       QueryRunnerqueryRunner=newQueryRunner(Utils2DB.getDataSource());


       Stringsql="UPDATE orders SET state=? WHERE id=?";


       try{

           queryRunner.update(sql,newObject[]{true,id});

       }catch(SQLExceptione){

           thrownewRuntimeException(e);

       }

   }


   //查看已经发货或没发货的订单信息

   publicList<Order>getAllOrder(booleanstate){

       QueryRunnerqueryRunner=newQueryRunner(Utils2DB.getDataSource());


       Stringsql="SELECT * FROM orders WHERE state=? ";

       try{

           return(List<Order>)queryRunner.query(sql,newBeanListHandler(Order.class),newObject[]{state});

       }catch(SQLExceptione){

           thrownewRuntimeException(e);

       }

   }


   //通过用户的id查找用户的订单,可能不止一个

   publicList<Order>findUserOrder(Stringuser_id){

       QueryRunnerqueryRunner=newQueryRunner(Utils2DB.getDataSource());


       Stringsql="SELECT * FROM orders WHERE user_id=? ";


       try{

           returnList<Order>queryRunner.query(sql,newBeanHandler(Order.class),newObject[]{user_id});


       }catch(SQLExceptione){

           thrownewRuntimeException(e);

       }


   }

}


二次更新


在编写dao的时候,尤其是Add方法。它是将所有数据都封装到Order对象上,然后取出数据,把数据插入到数据表中

  • 其实,我们的Order和OrderItem的操作可以分开。OrderItem也可以另外编写一个Dao,那么我们在插入完Order对象之后,得到Order对象返回的主键,再调用OrderItemDao的方法来插入OrderItem的数据,这样我觉得会让代码清晰一些。
  • 在OrderItemDao中接收的是一个List,因为我们一个订单会对应多个订单项。


抽取成DAO接口


publicinterfaceOrderDao{

   voidaddOrder(Orderorder);


   OrderfindOrder(Stringid);


   List<Order>getAllOrder(booleanstate);


   voidupdateState(Stringuser_id);


   List<Order>findUserOrder(Stringuser_id);

}


BussinessService


privateOrderDaoorderDao=DaoFactory.getInstance().createDao("zhongfucheng.dao.impl.OrderDaoImpl",OrderDao.class);

   publicvoidcreateOrder(Cartcart,Useruser){


       //订单的基本信息

       Stringorder_id=WebUtils.makeId();

       Orderorder=newOrder();

       order.setId(order_id);

       order.setPrice(cart.getPrice());

       order.setOrdertime(newDate());

       order.setState(false);

       order.setUser_id(user.getId());



       //订单项的基本信息

       //得到每个购物项,购物项就作为订单项

       for(Map.Entry<String,CartItem>me:cart.getMap().entrySet()){


           OrderItemorderItem=newOrderItem();

           CartItemcartItem=me.getValue();


           orderItem.setId(WebUtils.makeId());

           orderItem.setPrice(cartItem.getPrice());

           orderItem.setBook_id(cartItem.getBook().getId());

           orderItem.setQuantity(cartItem.getQuantity());

           orderItem.setOrder_id(order_id);

           order.getItems().add(orderItem);

       }


       orderDao.addOrder(order);


   }


   publicOrderfindOrder(Stringuser_id){


       returnorderDao.findOrder(user_id);

   }


   publicList<Order>getAllOrder(booleanstate){

       returnorderDao.getAllOrder(state);

   }


   publicvoidsendOutOrder(Stringid){


       orderDao.updateState(id);

   }


   publicList<Order>findUserOrder(Stringuser_id){

       returnorderDao.findUserOrder(user_id);

   }


目录
相关文章
|
3月前
|
API 开发工具
支付系统23-------使用沙箱账号进行支付测试,统一收单并支付页面接口的调用
支付系统23-------使用沙箱账号进行支付测试,统一收单并支付页面接口的调用
|
数据安全/隐私保护
阿里云国际版账户简便注册流程
如需注册阿里云国际版账号,可以与alicloudlx联系,只需要一个邮箱就ok了,简单快捷
阿里云国际版账户简便注册流程
|
数据安全/隐私保护
4-企业权限管理-订单操作
4-企业权限管理-订单操作
4-企业权限管理-订单操作
|
消息中间件 数据库 RocketMQ
创建支付订单流程|学习笔记
快速学习创建支付订单流程
340 0
创建支付订单流程|学习笔记
|
XML JSON Java
课程支付功能(生成订单接口1) | 学习笔记
简介:快速学习课程支付功能(生成订单接口1)
174 0
课程支付功能(生成订单接口1) | 学习笔记
|
开发者 微服务
课程支付功能(生成订单接口2) | 学习笔记
简介:快速学习课程支付功能(生成订单接口2)
课程支付功能(生成订单接口2) | 学习笔记
|
XML API 数据格式
课程支付功能(查询订单接口) | 学习笔记
简介:快速学习课程支付功能(查询订单接口)
|
Java 网络安全
纳税服务系统一(用户模块)【简单增删改查、日期组件、上传和修改头像】(二)
为了更好地掌握SSH的用法,使用一个纳税服务系统来练手…..搭建SSH框架环境在上一篇已经详细地说明了。
160 0
纳税服务系统一(用户模块)【简单增删改查、日期组件、上传和修改头像】(二)
|
XML Java 网络安全
纳税服务系统一(用户模块)【简单增删改查、日期组件、上传和修改头像】(一)
为了更好地掌握SSH的用法,使用一个纳税服务系统来练手…..搭建SSH框架环境在上一篇已经详细地说明了。
117 0
纳税服务系统一(用户模块)【简单增删改查、日期组件、上传和修改头像】(一)
|
JavaScript Java 网络安全
纳税服务系统一(用户模块)【简单增删改查、日期组件、上传和修改头像】(三)
为了更好地掌握SSH的用法,使用一个纳税服务系统来练手…..搭建SSH框架环境在上一篇已经详细地说明了。
179 0
纳税服务系统一(用户模块)【简单增删改查、日期组件、上传和修改头像】(三)