советы по внедрению корзины покупок с использованием playframework - PullRequest
8 голосов
/ 30 августа 2011

Я учусь использовать playframework, написав код для реализации webstore для продажи предметов. Я реализовал область Admin с использованием модулей crud и secure. Теперь я хочу создать shopping cart, к которому пользователь может добавить товары и перейти к оформлению заказа.

Мои знания в области электронной коммерции минимальны, но я изучил некоторые учебники, в которых реализованы корзины покупок и некоторые функции интернет-магазина, используя servlets. В книгах корзина содержала Set CartItem с, каждый из которых содержал экземпляр Product и quantity. После того, как пользователь добавил товары в корзину, корзина хранилась в user session.

Таким образом, каждый раз, когда пользователь переходил на страницу сведений о корзине, он отображал все добавленные элементы. Только когда сеанс был очищен (либо из-за тайм-аута сеанса, определенного на сервере, либо после размещения заказа), CartItem были удалены из ShoppingCart.

Полагаю, я могу использовать Cache в playframework для выполнения вышеуказанного. После добавления 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();

Это правильный путь? Если я думаю, что это неправильно, пожалуйста, помогите мне с предложениями.

Ответы [ 2 ]

13 голосов
/ 30 августа 2011

Неправильно. Извините за грубость, но то, что вы делаете, может ужасно сорваться.

Игра - это ничто и ничто без состояния. Все соответствующие данные ДОЛЖНЫ храниться в базе данных. Это означает, что вы должны сохранить данные корзины покупок, когда пользователь добавляет новый товар, и удалить их после завершения транзакции.

Почему вы не можете использовать кеш? Поскольку кэш является изменчивым, и элементы в нем могут быть удалены без предварительного предупреждения. Это означает, что в любой момент ваш кеш может вернуть нуль (элемент не найден), и вы получите исключение 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; 
}

Затем используйте этот метод, чтобы получить корзину перед обработкой.

1 голос
/ 30 августа 2011

У меня мало опыта с Play! но я думаю это здорово. Ваша идея должна работать просто отлично. Я бы добавил тайм-аут для кэшированного объекта корзины, как в:

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

приведенный выше код будет кэшировать корзину на 30 минут.

обратите внимание, что Cache.get может возвращать ноль, поэтому ваш код для обработки должен измениться на:

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 (...).

Cache.delete(session.getId());

Надеюсь, это поможет.

...