Java之品优购课程讲义_day16(1)

本文详细介绍了一种购物车系统的实现方案,包括需求分析、购物车数据存储结构、工程搭建步骤、购物车实体类设计、服务接口及实现层的代码示例。探讨了在不同用户状态下,购物车数据如何在cookies和redis间存储与合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

购物车需求分析与解决方案
1.1 需求分析
用户在商品详细页点击加入购物车,提交商品 SKU 编号和购买数量,添加到购物车。购物车展示页面如下:
Java之品优购课程讲义_day16(1)
1.1 实现思路
购物车数据的存储结构如下:
Java之品优购课程讲义_day16(1)
当用户在未登录的情况下,将此购物车存入 cookies , 在用户登陆的情况下,将购物车数据存入 redis 。如果用户登陆时,cookies 中存在购物车,需要将 cookies 的购物车合并到 redis 中存储.
1.1 工程搭建
(1)创建工程 pinyougou-cart-interface ,依赖 pinyougou-pojo
(2)创 建 工 程 pinyougou-cart-service ( WAR ) , 依 赖 pinyougou-cart-interface 和pinyougou-common 工程 和 spring、 dubbox 等相关依赖, 添加 web.xml 与 spring 配置文件(参照其他 service 工程) tomcat 插件端口设置为 9007 ,dubbo 端口为 20887
(3)创建工程 pinyougou-cart-web ,依赖 pinyougou-cart-interface springsecurity 、 CAS 等。添加 web.xml 与 spring 配置文件(参照其他 web 工程)tomcat 插件端口设置为 9107 , 拷贝 UserDetailServiceImpl.java ,Java之品优购课程讲义_day16(1)

(4)将资源文件夹中 Cookie 工 具 类 拷 贝到 pinyougou-common 工程中。需要在

pinyougou-common 工程引入 servlet-api 依赖

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>servlet-api</artifactId>

<scope>provided</scope>

</dependency>

1.1 购物车实体类
在 pinyougou-pojo 的 com.pinyougou.pojogroup 中创建购物车实体类

public  class  Cart  implements  Serializable{

private  String  sellerId;//商家 ID

private  String  sellerName;//商家名称

private  List<TbOrderItem>  orderItemList;//购物车明细

//getter    and  setter    ......

}

这个类是对每个商家的购物车进行的封装

  1. Cookie 存储购物车
    2.1 需求分析
    使用 cookie 存储购物车数据。服务层负责逻辑,控制层负责读写 cookie 。
    2.2 服务接口层
    
    (1)服务层接口        pinyougou-cart-interface 新建 com.pinyougou.cart.service 包,包下建立接口 CartService

/*
购物车服务接口

*@author Administrator

*

*/

public interface CartService {

/**

*添加商品到购物车

*@param cartList

*@param itemId

*@param num

*@return

*/

public List<Cart> addGoodsToCartList(List<Cart> cartList,Long itemId,Integer num );

}

2.1 服务实现层
实现思路:

//1.根据商品 SKU  ID 查询 SKU 商品信息

//2.获取商家 ID

//3.根据商家 ID 判断购物车列表中是否存在该商家的购物车

//4.如果购物车列表中不存在该商家的购物车

//4.1 新建购物车对象

//4.2 将新建的购物车对象添加到购物车列表

//5.如果购物车列表中存在该商家的购物车

// 查询购物车明细列表中是否存在该商品

//5.1.  如果没有,新增购物车明细

//5.2.  如果有,在原购物车明细上添加数量,更改金额

代码实现 pinyougou-cart-service 工程创建 CartServiceImpl.java

/**

*购物车服务实现类

*@author Administrator

*

*/ @Service
public class CartServiceImpl implements CartService {

@Autowired

private TbItemMapper itemMapper;

@Override

public List<Cart> addGoodsToCartList(List<Cart> cartList, Long itemId, Integer num)
{

//1.根据商品 SKU ID 查询 SKU 商品信息

TbItem item = itemMapper.selectByPrimaryKey(itemId);

if(item==null){

throw new RuntimeException("商品不存在");
}

if(!item.getStatus().equals("1")){

throw new RuntimeException("商品状态无效");

}

//2.获取商家 ID

String sellerId = item.getSellerId();

//3.根据商家 ID 判断购物车列表中是否存在该商家的购物车

Cart cart = searchCartBySellerId(cartList,sellerId);

//4.如果购物车列表中不存在该商家的购物车

if(cart==null){

//4.1 新建购物车对象 ,

cart=new Cart(); cart.setSellerId(sellerId); cart.setSellerName(item.getSeller());
TbOrderItem orderItem = createOrderItem(item,num);

List orderItemList=new ArrayList();

orderItemList.add(orderItem);

cart.setOrderItemList(orderItemList);
//4.2 将购物车对象添加到购物车列表

cartList.add(cart);

}else{

//5.如果购物车列表中存在该商家的购物车

// 判断购物车明细列表中是否存在该商品

TbOrderItem orderItem = searchOrderItemByItemId(cart.getOrderItemList(),itemId);

if(orderItem==null){

//5.1. 如果没有,新增购物车明细

orderItem=createOrderItem(item,num); cart.getOrderItemList().add(orderItem);
}else{

//5.2. 如果有,在原购物车明细上添加数量,更改金额
orderItem.setNum(orderItem.getNum()+num); orderItem.setTotalFee(new
BigDecimal(orderItem.getNum()*orderItem.getPrice().doubleValue()) );

//如果数量操作后小于等于 0,则移除

if(orderItem.getNum()<=0){

cart.getOrderItemList().remove(orderItem);//移除购物车明细

}

//如果移除后 cart 的明细数量为 0,则将 cart 移除

if(cart.getOrderItemList().size()==0){
cartList.remove(cart);

}

}

}

return  cartList;

}

/**

*根据商家 ID 查询购物车对象

*@param  cartList

*@param  sellerId

*@return

*/

private  Cart  searchCartBySellerId(List<Cart>  cartList,  String  sellerId){

for(Cart cart:cartList){

if(cart.getSellerId().equals(sellerId)){ return cart;
}

}

return null;

}

/**

*根据商品明细 ID 查询

*@param orderItemList

*@param itemId

*@return

*/

private TbOrderItem searchOrderItemByItemId(List<TbOrderItem> orderItemList ,Long itemId ){

for(TbOrderItem orderItem :orderItemList){

if(orderItem.getItemId().longValue()==itemId.longValue()){ return orderItem;
}

}

return null;

}

/**

*创建订单明细

*@param item

*@param num

*@return

*/

private TbOrderItem createOrderItem(TbItem item,Integer num){

if(num<=0){


throw  new  RuntimeException("数量非法");

}

TbOrderItem  orderItem=new  TbOrderItem(); orderItem.setGoodsId(item.getGoodsId()); orderItem.setItemId(item.getId()); orderItem.setNum(num); orderItem.setPicPath(item.getImage()); orderItem.setPrice(item.getPrice()); orderItem.setSellerId(item.getSellerId()); orderItem.setTitle(item.getTitle());
orderItem.setTotalFee(new  BigDecimal(item.getPrice().doubleValue()*num));

return  orderItem;

}

}

转载于:https://blog.51cto.com/13517854/2308267

1.2. 结构化一下 1.3. 图形化一下 1.3.1. 运营商后台 1.3.2. 商家后台 1.3.3. 网页前台 参考京东 2. 技术选型 前端:angularJS + Bootstrap 后台:SSM( springmvc+spring+mybatis) 数据库:mysql,使用mycat读写分离 开发模式:SOA 服务中间件:dubbox,需要和zookeeper配合使用 注册中心:zookeeper 消息中间件:Activemq,使用spring-jms 负载均衡:nginx 搜索:solr集群(solrCloud),配合zookeeper搭建, 使用spring-data-solor 缓存:redis集群,使用spring-data-redis 图片存储:fastDFS集群 网页静态化:freemarker 单点登录:cas 权限管理:SpringSecurity, 跨域:cros 支付:微信扫描 短信验证:阿里大于 密码加密:BCrypt 富文本:KindEditor 事务:声明式事务 任务调度:spring task 所有的技术,都可能涉及到为什么用?怎么用?用的过程中有什么问题? 3. 框架搭建 3.1. 前端 理解baseControler.js、base.js、base_pagination.js,以及每一个xxxController.js里面都公共的做了些什么。 baseControler.js 分页配置 列表刷新 处理checkBox勾选 xxxControler.js 自动生成增删改查 base_pagination.js 带分页 base.js 不带分页 3.2. dao 使用了mybatis逆向工程 4. 模块开发 逐个模块开发就好 4.1. 学会评估模块难不难 一个模块难不难从几方面考虑。 涉及几张表? 1,2张表的操作还是没有什么难度的。 涉及哪些功能? 增删改查,批量删除。 前端展示? 分页列表、树形、面屑、三级联动、内容格式化。 4.2. 举几个简单模块的例子 4.2.1. 牌管理 单表 分页、新增、删除、修改 4.2.2. 规格管理 2张表 分页、新增、删除、修改、显示化(显示列表内容的一部分) 4.2.3. 模板管理 2张表 分页、新增、删除、修改、显示化(显示列表内容的一部分) 4.2.4.管理 单表 4.2.5. 商家审核 单表 4.3. 举一个复杂模块 4.3.1.新增 需要插入3张表,tb_goods、tb_goods_desc、tb_item 前端:三级联动、富文本、图片上传、动态生成内容 4.3.2.修改 需要从3张表获取数据,然后进行回显。 4.4. 典型模块设计 4.4.1. 管理后台 商新增、商修改 4.4.2. 前台页面 搜索模块实现 物车模块实现 支付模块实现 秒杀模块实现 5. 开发过程中问题&1.1. 登录 单点登录怎么实现 session怎么共享 1.2. 缓存 哪些场景需要用到redis redis存储格式的选择 怎么提高redis缓存利用率 缓存如何同步 1.3. 图片上传 图片怎么存储 图片怎么上传 1.4. 搜索 ​ 怎么实现 数据量大、 并发量高的搜索 怎么分词 1.5. 消息通知 ​ 哪些情况用到activeMq 1.6. 化 seo怎么化 怎么加快访问速度 1.7. 秒杀 ​ 怎么处理高并发 ​ 秒杀过程中怎么控制库存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值