购物项目实战学习记录(8)——商品详情页

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012525096/article/details/87970786

功能点

  • 详情展示
  • 调整购买数量
  • 加入购物车
  • 加入收藏
  • 加入开团提醒

详情展示的后台逻辑

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}

猜你喜欢

转载自blog.csdn.net/u012525096/article/details/87970786