购物车模块

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

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

BigDecimalUtil

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

// 底层 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);
}

DUMP3.5 企业级电商项目的更多相关文章

  1. Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式

    史诗级Java/JavaWeb学习资源免费分享 欢迎关注我的微信公众号:"Java面试通关手册"(坚持原创,分享各种Java学习资源,面试题,优质文章,以及企业级Java实战项目回 ...

  2. Java从零到企业级电商项目实战

    欢迎关注我的微信公众号:"Java面试通关手册"(坚持原创,分享各种Java学习资源,面试题,优质文章,以及企业级Java实战项目回复关键字免费领取)回复关键字:"电商项 ...

  3. DUMP3 企业级电商项目

    [开发模式]controller - service(合法校验问题) - dao   反过来也没问题 用户模块 登录 注册 用户名验证(实时反馈前端) 忘记密码 重置密码 退出登录 更新用户信息 获取 ...

  4. DUMP 5 企业级电商项目

    [订单模块] 创建订单 商品信息  订单列表  订单详情 取消订单 订单列表  订单搜素  订单详情  订单发货 [创建订单]  购物车勾选商品 涉及 Cart Product  => 一个商品 ...

  5. DUMP 3.8 企业级电商项目 支付宝之类

    ① 沙箱登录:https://openhome.alipay.com/platform/appDaily.htm 获得一个 使用环境描述 APPID.授权回调地址.沙箱钱包哪里下载之类的 ② 沙箱环境 ...

  6. DUMP4 企业级电商项目 —— 对接支付宝扫码支付

    延展 <谈谈微信支付曝出的漏洞> [联调 DEMO下载地址]https://docs.open.alipay.com/194/105201/ [内置 一份 说明文档可做参考] [impor ...

  7. DUMP2 企业级电商项目

    正常设计数据库表,按照数据流向. ~~闭环核心业务 [1用户]登录 =>浏览[2分类]+浏览[3商品]=>加入[4购物车]=>结算[5订单]+[6收货地址]=>[7支付] [购 ...

  8. DUMP1 企业级电商项目

    系统:centos6 配置mirror阿里云 https://opsx.alibaba.com/mirror 远程管理首选:ssh 账户密码登录(ssh user@host) 或者 本地私钥连接服务器 ...

  9. 从0到上线开发企业级电商项目_前端_01_sublime使用技巧

    一.用户设置 { "color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme", &quo ...

随机推荐

  1. 【Teradata SQL】FALLBACK表改为NO FALLBACK表

    FALLBACK表在数据库中会留存双份数据,增加了数据可用性,但浪费了存储空间.变更表属性语句如下: alter table tab_fallback ,no fallback;

  2. Scalability of Kafka Messaging using Consumer Groups

    May 10, 2018 By Suhita Goswami No Comments Categories: Data Ingestion Flume Kafka Use Case Tradition ...

  3. AI AutoML

    AutoML 参考链接: https://arxiv.org/pdf/1810.13306.pdf http://nooverfit.com/wp/7%E4%B8%AA%E4%BD%A0%E5%8F% ...

  4. flask(一)之路由和视图

    01-介绍 Flask 是一个 Python 实现的 Web 开发微框架,同时具有很强的扩展能力. 02-第一个flask程序 # 初始化 from flask import Flask, url_f ...

  5. IPv6绝不仅仅是对IPv4地址长度的增加

    众所周知,IPv6 IP地址长度是IPv4 IP地址长度的四倍,是解决IPv4公共网址资源枯竭的最佳技术.的确,IETF在制定IPv6标准时也是基于这一因素考虑的.当时正是90年代初,Web开始出现, ...

  6. java中内存分配

    java程序运行时内存分配详解  一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一 ...

  7. 家庭记账本小程序之增(java web基础版三)

    实现新增消费账单 1.main_left.jsp中该部分,调用add.jsp 2. add.jsp,提交到Servlet的add方法 <%@ page language="java&q ...

  8. openstack搭建之-cinder配置(12)

    一. base节点配置 mysql -u root -proot CREATE DATABASE cinder; GRANT ALL PRIVILEGES ON cinder.* TO 'cinder ...

  9. [转帖]内置系统账户:Local system/Network service/Local Service 区别

    内置系统账户:Local system/Network service/Local Service 区别 学习使用 xp_cmdshell 的时候 发现必须 sqlserver 的服务运行在local ...

  10. Ubuntu shutdown

    gsettings set com.canonical.indicator.session suppress-logout-restart-shutdown true