使用playframework实现购物车的建议
我正在学习使用playframework
编写代码来实现一个webstore
来销售items.I已经使用crud
和secure
模块实现了Admin
区域。现在,我想创建一个shopping cart
,用户可以添加项目并继续结账。
我对电子商务的了解很少,但我已经阅读了一些教科书,这些教科书使用servlets
实现购物车和一些网店function。在书中,购物车用于保存一Set
CartItem
,每个包含Product
的实例和用户将商品添加到购物车后,购物车存储在user session
。
因此,只要用户进入购物车详细信息页面,它就会显示所有添加的项目。只有当会话被清除时(由于服务器中定义的会话超时或订单下达时), CartItem
被删除来自ShoppingCart
。
我想,我可以在playframework中使用Cache来完成上述操作。将一个CartItem添加到ShoppingCart实例后。我可以
shopcart.add(mycartItem); Cache.set(session.getId(), shopcart); ..
然后,在另一个页面中,我可以检索购物车及其内容,处理它们并清理购物车。
ShopCart cart = Cache.get(session.getId(),ShopCart.class); Set items = cart.getCartItems(); processOrder(items,userinfo); ... cart.clearItems();
这是正确的方法吗?如果我的想法不正确,请帮我提出建议。
错误。 对不起是如此苛刻,但你正在做的事可能会失败。
游戏没有任何意义和无国籍。 所有相关数据必须存储在数据库中。 这意味着您必须在用户添加新项目时保留购物车的数据,并在事务完成后将其删除。
你为什么不能使用缓存? 因为缓存是易变的,并且可以在没有先前警告的情况下移除其中的元素。 这意味着在任何时候您的缓存都可能返回null(找不到项),并且您的代码中出现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; }
然后使用此方法在处理之前检索购物车。
我没有太多玩游戏的经验! 但我认为这很棒。 你的想法应该工作得很好。 我会为缓存的购物车对象添加超时,如下所示:
Cache.set(session.getId(), shopcart, "30mn");
上面的代码会将购物车缓存30分钟。
请注意,Cache.get可能会返回null,因此您的处理代码应更改为:
ShopCart cart = Cache.get(session.getId(),ShopCart.class); if (cart != null) { Set items = cart.getCartItems(); processOrder(items,userinfo); cart.clearItems(); } else { // maybe show expired session warning? }
也可以在成功调用processOrder(…)后从缓存中删除cart对象。
Cache.delete(session.getId());
希望这可以帮助。