电商网站购物车功能分析与实现

最近刚做了一个分布式的电商项目,关于购物车模块,借鉴了某东的购物车系统。

结合国内两大电商巨头某宝和某东,发现某宝中要向使用购物车就必要先登录,而某东可以不需要登录就添加商品到购物车中。

由于项目借鉴了某东的方式,所以在未登录的时候也是可以使用购物车的。

步骤:
一、用户在对商品进行添加到购物车操作时,通过cookie中的token和redis中的token判断用户是否登录,如果未登录状态时,从cookie中获取到购物车。如果不存在就新建一个。
如果用户登录了,就从redis中获取到购物车,key是用户id,以String方式存储的。

二、在用户进行登录操作的时候,通过MQ发送消息到购物车系统,将用户cookie中的购物车与用户id发送过去。购物车系统的消息监听器监听到消息数据,将cookie中的购物车获取到并与redis中的购物车进行合并。
(当然我这边是把cookie中的购物车也是存在了redis作为临时购物车,具体操作是在新建购物车的时候生成一个不重复的随机字符串,将字符串作为value存入到cookie,同时将字符串作为key,临时购物车作为value存入到redis中。这样就可以通过获取到cookie中的value向redis中查询到临时购物车进行相关操作了)

代码如下:
购物车合并

public class CartLoginListener implements MessageListener{
	@Autowired
	private JedisClient jedisClient;
	
	@Value("${REDIS_CART}")
	private String REDIS_CART;
	
	public void onMessage(Message message) {
		TextMessage textMessage=(TextMessage)message;
		try {
			String text = textMessage.getText();
			String[] strings = text.split(",");
			//获取到用户id
			String uid=strings[0];
			//获取到cookie中保存的临时购物车的value
			String value=strings[1];
			//获取到专属购物车
			String redisCart = jedisClient.get(REDIS_CART+uid);
			List<CartItem> cartList=null;
			if(StringUtils.isBlank(redisCart)){
				//用户购物车在redis中不存在,说明购物车时间过期了,或者是个新用户
				//创建一个购物车
				cartList=new ArrayList<CartItem>();
			}else{
				cartList=JsonUtils.jsonToList(redisCart, CartItem.class);
			}
			//获取临时购物车
			if(StringUtils.isNotBlank(value)&&!value.equals("1")){
				//有商品被添加到购物车中,那么将cookie中的购物车信息添加到redis的购物车中
				//从redis中获取到临时购物车
				String string = jedisClient.get(value);
				List<CartItem> carts = JsonUtils.jsonToList(string, CartItem.class);
				//循环遍历cookie中的购物车商品
				if(cartList==null||cartList.size()==0){
					//说明是个空车,将每个cookie中的商品直接添加到redis中的购物车即可
					for(int j=0;j<carts.size();j++){
						cartList.add(carts.get(j));
					}
				}else{
					//redis中的购物车不是空车
					for(int j=0;j<carts.size();j++){
						//默认redis中没有cookie中的商品
						boolean flag=false;
						//遍历cookie中的购物车
						for(int i=0;i<cartList.size();i++){
							//遍历redis中的购物车,看看是否有同一件商品
							if(carts.get(j).getId().equals(cartList.get(i).getId())){
								//有同一件商品,更新数量即可
								cartList.get(i).setNum(cartList.get(i).getNum()+carts.get(j).getNum());
								flag=true;
								break;
							}
						}
						if(!flag){
							//如果遍历完之后redis中没有cookie中同一件商品
							//将该商品添加到redis中
							cartList.add(carts.get(j));
						}
					}
				}
				//将合并后的购物车存放到redis
				jedisClient.set(REDIS_CART+uid, JsonUtils.objectToJson(cartList));
				//设置购物车存在redis最大时间为七天
				jedisClient.expire(REDIS_CART+uid, 86400);
				//同时删除redis中的临时购物车
				jedisClient.expire(value, 0);
			}
			
			
	}

}

获取到购物车

//获取到购物车
	private CartMaster getCartList(HttpServletRequest request,HttpServletResponse response){
		CartMaster master=new CartMaster();
		//检查用户是否登录
		//获取到cookie中的token
		String token = CookieUtils.getCookieValue(request, SESSION_TOKEN);
		if(StringUtils.isNotBlank(token)){
			//说明cookie中有token,即用户登录过
			JDResult result = userService.getUserByToken(token);
			if(result.getStatus()==200){
				//说明用户登录正常,未超时,获取到当前登录对象
				TbUser user=(TbUser)result.getData();
				//从redis中取出购物车
				String redisCart = jedisClient.get(REDIS_CART+user.getId());
				if(StringUtils.isBlank(redisCart)){
					List<CartItem> list=new ArrayList<CartItem>();
					master.setCartList(list);
				}else{
					master.setCartList(JsonUtils.jsonToList(redisCart, CartItem.class));
				}
				master.setUserId(user.getId());
				master.setCartFrom(1);
				return master;
			}
		}
		//用户未登录,或者登录超时,从cookie中获取临时购物车的号码
		String cookieValue = CookieUtils.getCookieValue(request, SHOPPONG_CART,CHARSET);
		if(StringUtils.isNotBlank(cookieValue)){
			//说明cookie中有了临时购物车号码,根据号码从redis中获取到该用户的临时购物车
			String temporaryCart = jedisClient.get(cookieValue);
			if(StringUtils.isNotBlank(temporaryCart)){
				List<CartItem> list = JsonUtils.jsonToList(temporaryCart, CartItem.class);
				master.setCartFrom(2);
				master.setCartList(list);
				return master;
			}
		}
		//说明cookie中没有购物车的号码,或者cookie中有,reids没有,创建购物车
		String cartId=UUID.randomUUID().toString();
		//创建一个购物车
		List<CartItem> list=new ArrayList<CartItem>();
		//将购物车存入redis,设置过期时间七天
		jedisClient.set(cartId, JsonUtils.objectToJson(list));
		jedisClient.expire(cartId, COOKIE_TIME);
		//将id作为value存入到cookie中
		CookieUtils.setCookie(request, response, SHOPPONG_CART, cartId, COOKIE_TIME);
		master.setCartFrom(2);
		master.setCartList(list);
		return master;
	}
  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。
电商网站php需求分析说明书是为了明确网站开发所需的功能和技术要求,从而能够确保开发团队在建设过程中能够准确理解和满足客户的需求。以下是一个可能的电商网站php需求分析说明书的内容: 1. 项目简介:介绍电商网站的背景和目标。说明此项目的目的是为了提供一个用于购买商品的在线平台,并且详细描述了网站的目标用户、服务范围和特色功能。 2. 系统需求:列出了电商网站所需要的技术要求和基础设施要求。这包括开发语言、框架、数据库,以及服务器、安全性和可扩展性等方面的需求。 3. 功能需求:详细描述了电商网站需要实现的各种功能。这包括用户注册与登录、商品展示与搜索、购物车和订单管理、支付和物流等方面。每个功能都应该有具体的描述和实现要求,以确保开发团队能够正确理解和实现需求。 4. 用户界面设计需求:描述了电商网站的用户界面设计要求。这包括整体布局、导航结构、页面样式和交互方式等。可以提供页面原型图和设计参考,以确保开发团队和设计师能够准确理解和实现设计要求。 5. 数据库设计需求:描述了电商网站所需的数据库结构和数据表设计。这包括用户信息、商品信息、订单信息等表的设计要求。确保数据库能够满足网站功能需求,并具备良好的性能和扩展性。 6. 技术支持需求:描述了开发团队对于技术支持和交付物要求。这包括开发环境的搭建、代码版本管理、测试和部署方法等。同时,还需要说明项目提交的详细要求,如文档、源代码和测试报告等。 7. 项目进度和预算:制定项目的时间计划和预算安排。描述项目开发的各个阶段和里程碑,以及开发团队的人员配备和工作量分配。确保项目按照计划进行,并合理控制开发成本。 8. 风险评估和管理:识别项目开发过程中可能出现的风险,并提供相应的解决方案和风险管理策略。例如,根据项目规模和时间限制,可以提出阶段性发布或迭代开发的建议,并对可能的技术和市场风险进行评估。 总结:电商网站php需求分析说明书是一个详细描述电商网站开发需求的文档,通过精确的需求描述和解决方案提出,能够确保开发团队按照客户的要求进行开发,并最终交付一个符合预期的电商网站

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值