关于使用PlayFramework实现购物车的建议



我正在通过编写代码来实现销售商品的webstore来学习使用playframework。我使用 crudsecure 模块实现了Admin区域。现在,我想创建一个用户可以向其添加项目并继续结帐的shopping cart

我对电子商务的了解很少,但是我已经浏览了一些使用servlets实现购物车和一些网店功能的教科书。在书中,购物车用来保存CartItemSet,每个都包含一个Productquantity的实例。之后,用户将商品添加到购物车中,购物车存储在user session中。

因此,每当用户转到购物车详细信息页面时,它都会显示所有添加的项目。仅当会话被清除时(由于服务器中定义的会话超时,或者下订单时(,CartItem才会从ShoppingCart中删除。

我想,我可以使用游戏框架中的缓存来执行上述操作。将购物车项添加到购物车实例后。我可以

shopcart.add(mycartItem);
Cache.set(session.getId(), shopcart);
..

稍后,在另一个页面中,我可以检索购物车及其内容,处理它们并清除购物车。

ShopCart cart = Cache.get(session.getId(),ShopCart.class);
Set<CartItem> items = cart.getCartItems();
processOrder(items,userinfo);
...
cart.clearItems();

这是正确的方法吗?如果我的想法不正确,请帮助我提出建议。

错了。很抱歉如此苛刻,但你正在做的事情可能会失败得很惨。

游戏是无所事事的,也是无状态的。所有相关数据必须存储在数据库中。这意味着,当用户添加新项目时,您必须保留购物车的数据,并在事务完成后将其删除。

为什么无法使用缓存?因为缓存是易失性的,其中的元素可能会在没有事先警告的情况下被删除。这意味着在任何时候,您的缓存都可能返回一个空值(未找到项(,并且您在代码中得到一个 NullPointerException,并且您的用户丢失了购物车。

缓存只是为了提高性能,但你不能指望它总是拥有你需要的所有项目。

您应该将您的ShopCart变成一个实体(如果它不是一个实体(并添加如下内容:

public static ShopCart findCart(String sessionId){
   ShopCart sc = Cache.get(session.getId(),ShopCart.class);
   if(sc == null){
      sc = ShopCart.findCurrentUserCart(); //implement to find the cart of the current user
      Cache.set(sessionId,sc);
   }
   return sc; 
}

然后使用此方法在处理之前检索购物车。

我没有太多的Play经验! 但我认为这很棒。你的想法应该可以正常工作。我会为缓存的购物车对象添加超时,如下所示:

Cache.set(session.getId(), shopcart, "30mn");

上面的代码将缓存购物车 30 分钟。

请注意,Cache.get 可能会返回 null,因此用于处理的代码应更改为:

ShopCart cart = Cache.get(session.getId(),ShopCart.class);
if (cart != null) { 
  Set<CartItem> items = cart.getCartItems();
  processOrder(items,userinfo);
  cart.clearItems();
} else {
  // maybe show expired session warning?
}

此外,您可能应该在成功调用 processOrder(...( 后从缓存中删除 cart 对象。

Cache.delete(session.getId());

希望这有帮助。

最新更新