DUMP3.5 企业级电商项目
购物车模块
加入商品 更新商品数 查询商品数 移除商品 单选/取消 全选/取消 购物车列表
【浮点型商业运算精度丢失问题】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 企业级电商项目的更多相关文章
- Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式
史诗级Java/JavaWeb学习资源免费分享 欢迎关注我的微信公众号:"Java面试通关手册"(坚持原创,分享各种Java学习资源,面试题,优质文章,以及企业级Java实战项目回 ...
- Java从零到企业级电商项目实战
欢迎关注我的微信公众号:"Java面试通关手册"(坚持原创,分享各种Java学习资源,面试题,优质文章,以及企业级Java实战项目回复关键字免费领取)回复关键字:"电商项 ...
- DUMP3 企业级电商项目
[开发模式]controller - service(合法校验问题) - dao 反过来也没问题 用户模块 登录 注册 用户名验证(实时反馈前端) 忘记密码 重置密码 退出登录 更新用户信息 获取 ...
- DUMP 5 企业级电商项目
[订单模块] 创建订单 商品信息 订单列表 订单详情 取消订单 订单列表 订单搜素 订单详情 订单发货 [创建订单] 购物车勾选商品 涉及 Cart Product => 一个商品 ...
- DUMP 3.8 企业级电商项目 支付宝之类
① 沙箱登录:https://openhome.alipay.com/platform/appDaily.htm 获得一个 使用环境描述 APPID.授权回调地址.沙箱钱包哪里下载之类的 ② 沙箱环境 ...
- DUMP4 企业级电商项目 —— 对接支付宝扫码支付
延展 <谈谈微信支付曝出的漏洞> [联调 DEMO下载地址]https://docs.open.alipay.com/194/105201/ [内置 一份 说明文档可做参考] [impor ...
- DUMP2 企业级电商项目
正常设计数据库表,按照数据流向. ~~闭环核心业务 [1用户]登录 =>浏览[2分类]+浏览[3商品]=>加入[4购物车]=>结算[5订单]+[6收货地址]=>[7支付] [购 ...
- DUMP1 企业级电商项目
系统:centos6 配置mirror阿里云 https://opsx.alibaba.com/mirror 远程管理首选:ssh 账户密码登录(ssh user@host) 或者 本地私钥连接服务器 ...
- 从0到上线开发企业级电商项目_前端_01_sublime使用技巧
一.用户设置 { "color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme", &quo ...
随机推荐
- 【Teradata SQL】FALLBACK表改为NO FALLBACK表
FALLBACK表在数据库中会留存双份数据,增加了数据可用性,但浪费了存储空间.变更表属性语句如下: alter table tab_fallback ,no fallback;
- Scalability of Kafka Messaging using Consumer Groups
May 10, 2018 By Suhita Goswami No Comments Categories: Data Ingestion Flume Kafka Use Case Tradition ...
- AI AutoML
AutoML 参考链接: https://arxiv.org/pdf/1810.13306.pdf http://nooverfit.com/wp/7%E4%B8%AA%E4%BD%A0%E5%8F% ...
- flask(一)之路由和视图
01-介绍 Flask 是一个 Python 实现的 Web 开发微框架,同时具有很强的扩展能力. 02-第一个flask程序 # 初始化 from flask import Flask, url_f ...
- IPv6绝不仅仅是对IPv4地址长度的增加
众所周知,IPv6 IP地址长度是IPv4 IP地址长度的四倍,是解决IPv4公共网址资源枯竭的最佳技术.的确,IETF在制定IPv6标准时也是基于这一因素考虑的.当时正是90年代初,Web开始出现, ...
- java中内存分配
java程序运行时内存分配详解 一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一 ...
- 家庭记账本小程序之增(java web基础版三)
实现新增消费账单 1.main_left.jsp中该部分,调用add.jsp 2. add.jsp,提交到Servlet的add方法 <%@ page language="java&q ...
- openstack搭建之-cinder配置(12)
一. base节点配置 mysql -u root -proot CREATE DATABASE cinder; GRANT ALL PRIVILEGES ON cinder.* TO 'cinder ...
- [转帖]内置系统账户:Local system/Network service/Local Service 区别
内置系统账户:Local system/Network service/Local Service 区别 学习使用 xp_cmdshell 的时候 发现必须 sqlserver 的服务运行在local ...
- Ubuntu shutdown
gsettings set com.canonical.indicator.session suppress-logout-restart-shutdown true