购物车模块

加入商品 更新商品数 查询商品数 移除商品 单选/取消 全选/取消  购物车列表

【浮点型商业运算精度丢失问题】ej1st 一书提到 float double只适合科研计算,BigDecimal(String)构造型用作商业运算。

BigDecimalUtil

【高复用的核心方法】处理 Cart Product CartProductVO CartVO(cartProductVOList)

DUMP3.5 企业级电商项目-LMLPHP

// 底层 pojo   cart product 是一对一的关系 。vo  cartvo cartproductvo  是 一对多的关系。

// 思路

目标数据: 根据库存、选中状态(全选、单选)修正后 limit操作之后有效数据(计算总价、即时修改选中状态)。

1. assembleCartProductVO: 涉及 CartMapper ,根据 productId 涉及 ProductMapper,

2. 【库存和购买数量】其中 cartProductVO 在修正购买数量 查询下 真实库存,更新字段 limitQuantity 给前端提示客人。

  购买数量 这个字段 在 Cart CartProductVO 都出现了,需要手动同步更新,

3.【计算总价和选中状态】买 n 件产品 放到购物车里 (最终总价 = n件产品遍历计算总价。)

  单样产品有单样产品的选中状态,选不选中决定了 购物车最终总价 ,每次都是重新计算。

  选中状态: cart - product 是1对1,那么cart选中更新到cartproductvo里面,最终cartvo有一个 商品选中非选中列表,都是通过遍历得来。

  

【加入商品】创建抽象 VO ,结合产品 和 购物车条目 ,核心字段 limitQuantity 用于提示客人 ,这样的 VO 对应一条购物车真实条目。

创建抽象 VO ,用来整个购物车条目存放,总价,已选条目,imageHost之类的。

【批量删除商品】和前端约定request传  "," 逗号分隔productIds。

1.利用 guava 的 Splitter.on(",").spiltToList(productIds) 得到集合。

2.编写 sql ,delete from ... 删除 cart 记录。

 <delete id="deleteByUserIdProductIds" parameterType="map">
DELETE FROM mmall_cart
WHERE user_id = #{userId}
<if test="productIds != null">
and product_id in
<foreach collection="productIds" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</delete>

【购物车统计商品数量】

使用 sql 聚合函数细节:返回 对象 结果,如果是字段不存在返回则是 null 。抛给 mybatis 、serivice 都不好,提供默认值比较好。

  SELECT IFNULL(sum(quantity),) FROM mmall_cart
WHERE user_id = #{userId}

……………………………………………………………………………………………………………………………………………………………………

【收货地址模块】

添加地址 删除地址 更新地址 地址列表 地址分页  地址详情

【spring MVC 数据绑定 对象绑定】链接    (文档目标 递归可重用,易维护。)

【mybatis 自动生成主键、配置、使用】【场景:插入一条新纪录立即返回 给前端 id】keyProperty所指定的 id 将填充到 pojo 上。

<insert id="insert" parameterType="com.mmall.pojo.Shipping" useGeneratedKeys="true" keyProperty="id">

【避免横向越权】删除地址,只传shippingId,有可能删除其他用户的收获地址。解决:增加一个 userId的Mapper方法。

更新地址,横向越权。解决:增加 userId ... Mapper方法。

原则 任何时候只信任 session 携带的attribute ,比如关联的userId 。

【地址分页】

 @Override
public ServerResponse<PageInfo> list(Integer userId,int pageNum, int pageSize) {
PageHelper.startPage(pageNum,pageSize);
List<Shipping> shippingList = shippingMapper.selectByUserId(userId);
PageInfo pageInfo = new PageInfo(shippingList);//直接用
return ServerResponse.createBySuccess(pageInfo);
}
04-15 16:16