昌平区网站建设,怎么使自己做的网站有音乐,网站开发费摊销多少年,wordpress 只有内页能打开人生在世如身处荆棘之中#xff0c;心不动#xff0c;人不妄动#xff0c;不动则不伤#xff1b;如心动则人妄动#xff0c;伤其身痛其骨#xff0c;于是体会到世间诸般痛苦。 1、购物车需求
1#xff09;、需求描述#xff1a;
- 用户可以在登录状态下将商品添加到购… 人生在世如身处荆棘之中心不动人不妄动不动则不伤如心动则人妄动伤其身痛其骨于是体会到世间诸般痛苦。 1、购物车需求
1、需求描述
- 用户可以在登录状态下将商品添加到购物车【用户购物车/在线购物车】 - 放入数据库 - mongodb - 放入 redis采用 登录以后会将临时购物车的数据全部合并过来并清空临时购物车 - 用户可以在未登录状态下将商品添加到购物车【游客购物车/离线购物车/临时购物车】 - 放入 localstorage客户端存储后台不存 - cookie - WebSQL - 放入 redis采用 浏览器即使关闭下次进入临时购物车数据都在 - 用户可以使用购物车一起结算下单 - 给购物车添加商品 - 用户可以查询自己的购物车 - 用户可以在购物车中修改购买商品的数量。 - 用户可以在购物车中删除商品。 - 选中不选中商品 - 在购物车中展示商品优惠信息 - 提示购物车商品价格变化 2、数据结构 因此每一个购物项信息都是一个对象基本字段包括 另外购物车中不止一条数据因此最终会是对象的数组。即 Redis 有 5 种不同数据结构这里选择哪一种比较合适呢
- 首先不同用户应该有独立的购物车因此购物车应该以用户的作为 key 来存储Value 是 用户的所有购物车信息。这样看来基本的k-v结构就可以了。
- 但是我们对购物车中的商品进行增、删、改操作基本都需要根据商品 id 进行判断 为了方便后期处理我们的购物车也应该是k-v结构key 是商品 idvalue 才是这个商品的 购物车信息。
综上所述我们的购物车结构是一个双层 MapMastring,mapstring,string - 第一层 MapKey 是用户 id - 第二层 MapKey 是购物车中商品 id值是购物项数据 3、流程
参照京东 user-key 是随机生成的 id不管有没有登录都会有这个 cookie 信息。
两个功能新增商品到购物车、查询购物车。
新增商品判断是否登录 - 是则添加商品到后台 Redis 中把 user 的唯一标识符作为 key。 - 否则添加商品到后台 redis 中使用随机生成的 user-key 作为 key。 查询购物车列表判断是否登录 - 否直接根据 user-key 查询 redis 中数据并展示 - 是已登录则需要先根据 user-key 查询 redis 是否有数据。 - 有需要提交到后台添加到 redis合并数据而后查询。 - 否直接去后台查询 redis而后返回。 2、临时购物车 /*** 获取到我们要操作的购物车* return*/private BoundHashOperationsString, Object, Object getCartOps() {UserInfoTo userInfoTo CartInterceptor.threadLocal.get();//1.String cartKey ;if (userInfoTo.getUserId() ! null) {cartKey CART_PREFIX userInfoTo.getUserId();} else {cartKey CART_PREFIX userInfoTo.getUserKey();}BoundHashOperationsString, Object, Object operations redisTemplate.boundHashOps(cartKey);return operations;}
3、登录购物车 Overridepublic CartItem addToCart(Long skuId, Integer num) {BoundHashOperationsString, Object, Object cartOps getCartOps();String res (String) cartOps.get(skuId.toString());if(StringUtils.isEmpty(res)){CartItem cartItem new CartItem();// 1.运程查询当前要添加的商品信息CompletableFutureVoid getSkuInfoTask CompletableFuture.runAsync(() - {//2.商品添加到购物车(新商品)R skuInfo productFeignService.getSkuInfo(skuId);SkuInfoVo data skuInfo.getData(skuInfo, new TypeReferenceSkuInfoVo() {});cartItem.setCheck(true);cartItem.setCount(1);cartItem.setImage(data.getSkuDefaultImg());cartItem.setTitle(data.getSkuTitle());cartItem.setPrice(data.getPrice());cartItem.setSkuId(data.getSkuId());},executor);CompletableFutureVoid getSkuSaleAttr CompletableFuture.runAsync(() - {//运程查询sku的组合信息ListString values productFeignService.getSkuSaleAttrValues(skuId);cartItem.setSkuAttr(values);}, executor);CompletableFutureVoid allOf CompletableFuture.allOf(getSkuInfoTask, getSkuSaleAttr);try {allOf.get();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}String s JSON.toJSONString(cartItem);cartOps.put(skuId.toString(),s);return cartItem;}else{//购物车有这个商品CartItem cartItem JSON.parseObject(res, CartItem.class);cartItem.setCount(cartItem.getCount()num);cartOps.put(skuId.toString(),JSON.toJSONString(cartItem));return cartItem;}}Overridepublic CartItem getCartItem(Long skuId) {BoundHashOperationsString, Object, Object cartOps getCartOps();String str (String) cartOps.get(skuId.toString());CartItem cartItem JSON.parseObject(str, CartItem.class);return cartItem;}Overridepublic Cart getCart() {UserInfoTo userInfoTo CartInterceptor.threadLocal.get();Cart cart new Cart();if(userInfoTo.getUserId()!null){//登录String cartKey CART_PREFIXuserInfoTo.getUserId();//如果临时购物车的数据还没有合并【合并购物车】String tempCartKey CART_PREFIX userInfoTo.getUserKey();ListCartItem tempCartItems getCartItems(tempCartKey);if(tempCartItems!null){//合并for (CartItem item : tempCartItems) {addToCart(item.getSkuId(),item.getCount());}}//3.获取登录后的数据ListCartItem cartItems getCartItems(cartKey);cart.setItems(cartItems);//清除临时购物车数据clearCart(tempCartKey);}else {//没登陆String cartKey CART_PREFIXuserInfoTo.getUserKey();//获取临时购物车的所有购物项ListCartItem cartItems getCartItems(cartKey);cart.setItems(cartItems);}return cart;}
Overridepublic void checkItem(Long skuId, Integer check) {BoundHashOperationsString, Object, Object cartOps getCartOps();CartItem cartItem getCartItem(skuId);cartItem.setCheck(check1?true:false);String s JSON.toJSONString(cartItem);cartOps.put(skuId.toString(),s);}Overridepublic void changeItemCount(Long skuId, Integer num) {BoundHashOperationsString, Object, Object cartOps getCartOps();CartItem cartItem getCartItem(skuId);cartItem.setCount(num);String s JSON.toJSONString(cartItem);cartOps.put(skuId.toString(),s);}Overridepublic void deleteItem(Long skuId) {BoundHashOperationsString, Object, Object cartOps getCartOps();cartOps.delete(skuId.toString());} 人生在世如身处荆棘之中心不动人不妄动不动则不伤如心动则人妄动伤其身痛其骨于是体会到世间诸般痛苦。