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

Мои знания об электронной торговле минимальны, но я просмотрел несколько учебников, в которых реализованы тележки для покупок и некоторые функции интернет-магазина с использованием servlets. В книгах тележка использовалась для хранения Set из CartItem s, каждый из которых содержал экземпляры 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();

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

8
Damon Julian 30 Авг 2011 в 17:34

2 ответа

Лучший ответ

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

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

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

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

13
Pere Villega 30 Авг 2011 в 14:39

У меня нет большого опыта работы с 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 (...).

Cache.delete(session.getId());

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

1
buritos 30 Авг 2011 в 14:10