功能点
- 详情展示
- 调整购买数量
- 加入购物车
- 加入收藏
- 加入开团提醒
详情展示的后台逻辑
DealController
@RequestMapping(value = "/item/{skuId}", method = RequestMethod.GET)
public String detail(Model model, @PathVariable Long skuId, HttpServletResponse response) {
if (!DealUtil.isValidSkuId(skuId)) {
return generateError404Page(response);
}
//1.查询商品即deal信息
Deal deal = this.dealService.getBySkuIdForDetailViewOnSite(skuId);
if (null == deal || !DealUtil.isGroupon(deal)) {
return generateError404Page(response);
}
//2.查询dealDetail信息
DealDetail dealDetail = this.dealService.getDetailByDealId(deal.getId());
deal.setDealDetail(dealDetail);
model.addAttribute("deal", deal);
return "/deal/detail";
}
说明:
(1)判断商品的skuId
是否正常,异常则转入404页面。
(2)利用DealService
查询skuId
对应商品的信息,若为空则转入404页面。
(3)利用DealService
,根据deal
查询dealId
对应的商品详情。
(4)加入到model
,供前端使用,跳转页面。
DealService
/**
* 根据SkuID查询商品信息,用于在网站详情页显示
* @param skuId skuId
* @return 商品信息
*/
public Deal getBySkuIdForDetailViewOnSite(Long skuId) {
Map<String, Object> params = new HashMap<>();
params.put("skuId", skuId);
params.put("nowTime", new Date());
return this.dealDAO.getBySkuIdForShowOnView(params);
}
/**
* 根据DealID查询商品详情
* @param dealId DealId
* @return 商品详情
*/
public DealDetail getDetailByDealId(Long dealId) {
return this.dealDetailDAO.getByDealId(dealId);
}
说明:
(1)构造查询参数,利用DAO进行数据库查询。
DealDAO、DealDetailDAO
/**
* 根据skuId查询可以显示在前台的商品
* @param params
* @return
*/
public Deal getBySkuIdForShowOnView(Map<String, Object> params) {
return findOne(MAPPER_NAMESPACE + ".selectBySkuIdForShowOnView", params);
}
public DealDetail getByDealId(Long dealId) {
return findOne(MAPPER_NAMESPACE + ".selectByDealId", dealId);
}
说明:
(1)简单的利用基类的findone
方法(template.selectOne
)查询一个结果,返回。
功能点实现逻辑
收藏功能
HomeController
/**
* 加入收藏
* @param request
* @param skuId
* @return
*/
@RequestMapping(value = "/favorite/{skuId}")
@ResponseBody
public String favorite(HttpServletRequest request, @PathVariable Long skuId) {
Deal deal = this.dealService.getBySkuId(skuId);
Favorite favorite = new Favorite();
favorite.setDealId(deal.getId());
favorite.setDealSkuId(skuId);
WebUser user = getCurrentLoginUser(request);
favorite.setUserId(user.getUserId());
favoriteService.save(favorite);
return "1";
}
(1)通过skuId
来查询商品简要信息。
(2)构造一个Favorite
保存该商品信息以及UserId。
(3)通过FavoriteService保存该实体。
FavoriteService
/**
* 保存
* @param favorite
*/
public void save(Favorite favorite) {
Date now = new Date();
favorite.setCreateTime(now);
favorite.setUpdateTime(now);
this.favoriteDAO.save(favorite);
}
首先更新创建时间和更新时间,然后通过FavoriteDAO进行保存操作。
FavoriteDAO
/**
* 保存
* @param favorite
*/
public void save(Favorite favorite) {
try {
super.save(MAPPER_NAMESPACE + ".insert", favorite);
} catch (Exception e) {
e.printStackTrace();
}
}
MyBatis的标准插入语句。
开团提醒
和收藏极为相似
HomeController
/**
* 加入开团提醒
* @param request
* @param skuId
* @return
*/
@RequestMapping(value="/remind/{skuId}")
@ResponseBody
public String remind(HttpServletRequest request, @PathVariable Long skuId) {
WebUser user = getCurrentLoginUser(request);
Deal deal = dealService.getBySkuId(skuId);
StartRemind remind = new StartRemind();
remind.setDealId(deal.getId());
remind.setDealSkuId(skuId);
remind.setDealTitle(deal.getDealTitle());
remind.setUserId(user.getUserId());
remind.setStartTime(deal.getStartTime());
startRemindService.save(remind);
return "1";
}
StartRemindService
public void save(StartRemind startRemind) {
if (null == this.startRemindDAO.findByUserIdAndSkuId(startRemind.getUserId(), startRemind.getDealSkuId())) {
Date now = new Date();
startRemind.setCreateTime(now);
startRemind.setUpdateTime(now);
this.startRemindDAO.save(startRemind);
}
}
和加入收藏唯一不同的是,需要判断数据库中是否已经存在,若不存在才插入。
加入购物车
CartController
跳转采用Ajax
异步提交的方式,下面的URL略显随意,因为不显示在地址栏。
@RequestMapping(value = "/cart/default/{skuId}")
@ResponseBody
public String addToCart(@PathVariable Long skuId, Integer count, HttpServletRequest request) {
try {
cartService.addDeal(skuId, getCurrentLoginUser(request).getUserId(), count);
return "1";
} catch (Exception e) {
//日志
logger.error("Add deal to cart error, message : {}", e.getMessage());
return "0";
}
}
注意:将构造Cart实体的任务放在了Service中。
CartService
public void addDeal(Long skuId, Long userId, Integer count) {
if (count == null || count < 0) {
count = 1;
}
Cart cart = cartDAO.findByUserIdAndSkuId(userId, skuId);
if (null != cart) {
cartDAO.updateCartDealCount(cart.getId(), count);
} else {
cart = new Cart();
cart.setUserId(userId);
cart.setDealSkuId(skuId);
cart.setDealId(dealDAO.getIdBySkuId(skuId));
cart.setCount(count);
Date now = new Date();
cart.setCreateTime(now);
cart.setUpdateTime(now);
cartDAO.save(cart);
}
}
注意:先查找购物车,若没有则插入;若有则进行更新+1操作。
CartDAO
public Cart findByUserIdAndSkuId(Long userId, Long skuId) {
Map<String, Long> params = new HashMap<>();
params.put("userId", userId);
params.put("skuId", skuId);
return super.findOne(MAPPER_NAMESPACE + ".selectByUserIdAndSkuId", params);
}
/**
* 更新购物车商品数量
* @param cartId
* @param step
*/
public void updateCartDealCount(Long cartId, Integer step) {
Map<String, Object> params = new HashMap<>();
params.put("cartId", cartId);
params.put("step", step);
super.update(MAPPER_NAMESPACE + ".updateCartDealCount", params);
}
注意:
(1)此处查询是两个参数,必须通过两个参数(用户ID和skuID)才可以进行查询。
(2)step就是增加的数量。update cart set count = count + #{step,jdbcType=INTEGER} where id = #{cartId,jdbcType=BIGINT}