谷粒商城-購物車-高級篇筆記九_第1頁
谷粒商城-購物車-高級篇筆記九_第2頁
谷粒商城-購物車-高級篇筆記九_第3頁
谷粒商城-購物車-高級篇筆記九_第4頁
谷粒商城-購物車-高級篇筆記九_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

?粒商城--購物車--?級篇筆記九?粒商城–購物車–?級篇筆記九0.購物車需求?戶可以在登錄狀態(tài)下將商品添加到購物車【?戶購物車/在線購物車】放?數(shù)據(jù)庫mongodb放?redis(采?)登錄以后,會將臨時購物車的數(shù)據(jù)全部合并過來,并清空臨時購物車;?戶可以在未登錄狀態(tài)下將商品添加到購物車【游客購物車/離線購物車/臨時購物車】放?localstorage(客戶端存儲,后臺不存)cookieWebSQL放?redis(采?)瀏覽器即使關(guān)閉,下次進(jìn)?,臨時購物車數(shù)據(jù)都在?戶可以使?購物車?起結(jié)算下單給購物車添加商品?戶可以查詢??的購物車?戶可以在購物車中修改購買商品的數(shù)量。?戶可以在購物車中刪除商品。選中不選中商品在購物車中展?商品優(yōu)惠信息提?購物車商品價格變化1.數(shù)據(jù)模型分析1.1數(shù)據(jù)存儲?式購物車是?個讀多寫多的場景,因此放?數(shù)據(jù)庫并不合適,但購物車?是需要持久化,因此這我們選?redis存儲購物車數(shù)據(jù)。1.2數(shù)據(jù)存儲結(jié)構(gòu)?個購物車是由多個購物項(xiàng)組成的,但是我們?List進(jìn)?存儲并不合適,因?yàn)槭?List查找某個購物項(xiàng)時需要挨個遍歷每個購物項(xiàng),會造成?量時間損耗,為保證查找速度,我們使?hash進(jìn)?存儲,?先不同?戶應(yīng)?的購物車,因此購物車應(yīng)該以?戶的作為key來存儲,Value是?戶的所有購物車信息。這樣看來基本的k-v結(jié)構(gòu)就可以了。但是,我們對購物車中的商品進(jìn)?增、刪、改操作,基本都需要根據(jù)商品id進(jìn)?判斷,為了?便后期處理,我們的購物車也應(yīng)該是k-v結(jié)構(gòu),key是商品id,value才是這個商品的購物車信息。綜上所述,我們的購物車結(jié)構(gòu)是?個雙層Map:Map<String,Map<String,String>>第?層Map,Key是?戶id第?層Map,Key是購物車中商品id,值是購物項(xiàng)數(shù)據(jù)1.3流程參照京東user-key是隨機(jī)?成的id,不管有沒有登錄都會有這個cookie信息。兩個功能:新增商品到購物車、查詢購物車。新增商品:判斷是否登錄是:則添加商品到后臺Redis中,把user的唯?標(biāo)識符作為key。否:則添加商品到后臺redis中,使?隨機(jī)?成的user-key作為key。查詢購物車列表:判斷是否登錄否:直接根據(jù)user-key查詢redis中數(shù)據(jù)并展?是:已登錄,則需要先根據(jù)user-key查詢redis是否有數(shù)據(jù)。有:需要提交到后臺添加到redis,合并數(shù)據(jù),?后查詢。否:直接去后臺查詢redis,?后返回2.環(huán)境搭建2.1新建模塊2.1.1pom并且導(dǎo)?gulimall-common<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="/POM/4.0.0"xsi="/2001/XMLSchema-instance"<projectxmlns="/POM/4.0.0"xsi="/2001/XMLSchema-instance"schemaLocation="/POM/4.0.0/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/><!--lookupparentfromrepository--></parent><groupId>site.zhourui</groupId><artifactId>gulimall-cart</artifactId><version>0.0.1-SNAPSHOT</version><name>gulimall-cart</name><description>購物車</description><properties><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR6</spring-cloud.version></properties><dependencies><dependency><groupId>com.zhourui.gulimall</groupId><artifactId>gulimall-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>jectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>jectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>2.2新增host2.3靜態(tài)資源分離2.4配置?關(guān)gulimall-gateway/src/main/resources/application.yml#購物車-id:gulimall_cart_routeuri:lb://gulimall-cartpredicates:-Host=2.5ThreadLocal?戶?份鑒別2.5.1ThreadLocal同?個線程共享數(shù)據(jù)2.5.2整合springsession導(dǎo)?依賴gulimall-cart/pom.xml<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>?定義springsessiongulimall-cart/src/main/java/site/zhourui/gulimall/cart/config/GulimallSessionConfig.javapackage;importimportimportimportimportimportBean;Configuration;GenericJackson2JsonRedisSerializer;RedisSerializer;CookieSerializer;DefaultCookieSerializer;/***@authorzr*@date2021/12/1210:29*/@ConfigurationpublicclassGulimallSessionConfig{@BeanpublicCookieSerializercookieSerializer(){DefaultCookieSerializercookieSerializer//放?作?域=newDefaultCookieSerializer();cookieSerializer.setDomainName("");.setCookieName("GULISESSION");.setCookieMaxAge(60*60*24*7);returncookieSerializer;cookieSerializercookieSerializer}@BeanpublicRedisSerializer<Object>springSessionDefaultRedisSerializer(){returnnewGenericJackson2JsonRedisSerializer();}}配置redis作為sessionserver:port:30000spring:application:name:gulimall-cartcloud:nacos:discovery:server-addr::8848thymeleaf:cache:falseredis:host:28port:6379session:store-type:redisservlet:session:timeout:30m開啟redis-springsessiongulimall-cart/src/main/java/site/zhourui/gulimall/cart/GulimallCartApplication.java@EnableRedisHttpSession2.5.3新增?戶鑒別攔截器gulimall-cart/src/main/java/site/zhourui/gulimall/cart/Interceptor/CartInterceptor.javapackageInterceptor;StringUtils;importimportimportimportimportimportimportHandlerInterceptor;ModelAndView;AuthServerConstant;CartConstant;UserInfoTo;MemberResponseVo;importimportimportimportimportCookie;HttpServletRequest;HttpServletResponse;HttpSession;UUID;/***@authorzr*@date2021/12/1314:47*/publicclassCartInterceptorimplementsHandlerInterceptor{publicstaticThreadLocal<UserInfoTo>toThreadLocal=newThreadLocal<>();/***攔*截所有請求給ThreadLocal封裝UserInfoTo對象*、1從session中獲取MemberResponseVo!=null,登錄狀態(tài),為UserInfoTo設(shè)置Id*、2從request中獲取cookie,找到user-key的value,?*標(biāo)?法執(zhí)?之前:在ThreadLocal中存??戶信息【同?個線程共享數(shù)據(jù)】從*session中獲取數(shù)據(jù)【使?session需要cookie中的GULISESSION值】*/@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{UserInfoTouserInfoTo=newUserInfoTo();UserInfoTouserInfoTo=newUserInfoTo();HttpSessionsession=request.getSession();//獲得當(dāng)前登錄?戶的信息MemberResponseVomemberResponseVo=(MemberResponseVo)session.getAttribute(AuthServerConstant.LOGIN_USER);if(memberResponseVo//?戶登錄了!=null){userInfoTo.setUserId(memberResponseVo.getId());}Cookie[]cookies=request.getCookies();if(cookies!=null&&cookies.length>0){for(Cookiecookie:cookies){//user-keyString=cnameookie.getName();if(name.equals(CartConstant.TEMP_USER_COOKIE_NAMEuserInfoTo.setUserKey(cookie.getValue());//標(biāo)識客戶端已經(jīng)存儲了user-keyuserInfoTo.setTempUser(true);)){}}}//如果沒有臨時?戶?定分配?個臨時?戶if(StringUtils.isEmpty(userInfoTo.getUserKey())){String=UuuidUID.randomUUID().toString();userInfoTo.setUserKey(uuid);}//?標(biāo)?法執(zhí)?之前toThreadLocal.set(userInfoTo);returntrue;}/**業(yè)*務(wù)執(zhí)?之后,讓瀏覽器保存臨時?戶user-key*/@OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{//獲取當(dāng)前?戶的值UserInfoTouserInfoT=toThreadLocal.get();//、1判斷是否登錄;2、判斷是否創(chuàng)建user-token的cookieif(userInfoTo!=null&&!userInfoTo.isTempUser()){//創(chuàng)建?個cookieCookiecookie=newCookie(CartConstant.TEMP_USER_COOKIE_NAMEcookie.setDomain("");,userInfoTo.getUserKey());cookie.setMaxAge(CartConstant.TEMP_USER_COOKIE_TIMEOUT);response.addCookie(cookie);}}}gulimall-cart/src/main/java/site/zhourui/gulimall/cart/config/GulimallWebConfig.javapackage;importimportimportimportConfiguration;InterceptorRegistry;WebMvcConfigurer;Interceptor.CartInterceptor;/***@authorzr*@date2021/12/1314:45*/@ConfigurationpublicclassGulimallWebConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(newCartInterceptor()).addPathPatterns("/**");}}2.6封裝所需vo/to2.6.1購物項(xiàng)CartItemVogulimall-cart/src/main/java/site/zhourui/gulimall/cart/vo/CartItemVo.javapackage;/***@authorzr*@date2021/12/1311:51*/importimportBigDecimal;List;/***購物項(xiàng)內(nèi)容*/publicclassCartItemVo{privateLongskuId;//skuIdprivateBooleancheck=true;//是否選中privateStringtitle;privateStringimage;//標(biāo)題//圖?privateList<String>skuAttrValues;//商品銷售屬性privateBigDecimalprice;//單價privateIntegercount;//當(dāng)前商品數(shù)量privateBigDecimaltotalPrice;//總價publicLonggetSkuId(){returnskuId;}publicvoidsetSkuId(LongskuId){this.skuId=skuId;}publicBooleangetCheck(){returncheck;}publicvoidsetCheck(Booleancheck){this.check=check;}publicStringgetTitle(){returntitle;}publicvoidsetTitle(Stringtitle){this.title=title;}publicStringgetImage(){returnimage;}publicvoidsetImage(Stringimage){this.image=image;}publicList<String>getSkuAttrValues(){returnskuAttrValues;}publicvoidsetSkuAttrValues(List<String>skuAttrValues){this.skuAttrValues=skuAttrValues;}publicBigDecimalgetPrice(){returnprice;}publicvoidsetPrice(BigDecimalprice){this.price=price;}publicIntegergetCount(){returncount;}publicvoidsetCount(Integercount){this.count=count;}/**計(jì)*算當(dāng)前購物項(xiàng)總價*/publicBigDecimalgetTotalPrice(){returnthis.price.multiply(newBigDecimal(""+this.count));}publicvoidsetTotalPrice(BigDecimaltotalPrice){this.totalPrice=totalPrice;}}2.6.2購物車CartVogulimall-cart/src/main/java/site/zhourui/gulimall/cart/vo/CartVo.javapackage;/***@authorzr*@date2021/12/1311:52*/importCollectionUtils;importCollectionUtils;importimportBigDecimal;List;/***購物車Vo*需要計(jì)算的屬性需要重寫get?法,保證每次獲取屬性都會進(jìn)?計(jì)算*/publicclassCartVo{privateList<CartItemVo>items;//購物項(xiàng)集合privateIntegercountNum;//商品件數(shù)【例如購物項(xiàng)12件,購物項(xiàng)23件,?共5件】privateIntegercountType;//商品數(shù)量,items的size()privateBigDecimaltotalAmount;//商品總價privateBigDecimalreduce=newBigDecimal("0.00");//減免價格publicList<CartItemVo>getItems(){returnitems;}publicvoidsetItems(List<CartItemVo>items){this.items=items;}publicIntegergetCountNum(){intcount=0;if(items!=null&&items.size()>0){for(CartItemVoitem:items){+=countitem.getCount();}}returncount;}publicIntegergetCountType(){returnitems!=null?items.size():0;}publicBigDecimalgetTotalAmount(){BigDecimalamount=newBigDecimal("0");//、1計(jì)算購物項(xiàng)總價if(!CollectionUtil.isEmpty(items)){for(CartItemVocartItem:items){if(cartItem.getCheck()){=amountamount.add(cartItem.getTotalPrice());}}}//、2計(jì)算優(yōu)惠后的價格returnamount.subtract(getReduce());}publicBigDecimalgetReduce(){returnreduce;}publicvoidsetReduce(BigDecimalreduce){this.reduce=reduce;}}2.6.3商品信息SkuInfoVo?于封裝遠(yuǎn)程調(diào)?gulimall-product獲取的商品信息gulimall-cart/src/main/java/site/zhourui/gulimall/cart/vo/SkuInfoVo.javapackageimportimport;Data;BigDecimal;/***@authorzr*@date2021/12/1315:45*/@DatapublicclassSkuInfoVo{privateLongskuId;/***spuId*/privateLongspuId;/***sku名稱*/privateStringskuName;/***sku介紹描述*/privateStringskuDesc;/**所*屬分類id*/privateLongcatalogId;/**品*牌id*/privateLongbrandId;/**默*認(rèn)圖?*/privateStringskuDefaultImg;/**標(biāo)*題*/privateStringskuTitle;/**副*標(biāo)題*/privateStringskuSubtitle;/**價*格*/privateBigDecimalprice;/**銷*量*/privateLongsaleCount;}2.6.4?戶信息UserInfoTo?戶封裝ThreadLocal中傳輸?shù)?戶信息package;/***@authorzr*@date2021/12/1315:18*/importimportData;ToString;/***?戶信息**/@ToString@DatapublicclassUserInfoTo{privateLonguserId;privateStringuserKey;//關(guān)聯(lián)購物車privatebooleantempUser=false;//客戶端是否需要存儲cookie:user-key}2.7線程池相關(guān)配置gulimall-cart/src/main/java/site/zhourui/gulimall/cart/config/ThreadPoolConfigProperties.javapackage;/***@authorzr*@date2021/12/1315:50*/importimportData;ConfigurationProperties;/***線程池屬性類**/@ConfigurationProperties(prefix="gulimall.thread")@DatapublicclassThreadPoolConfigProperties{privateIntegercoreSize;privateIntegermaxSize;privateIntegerkeepAliveTime;}gulimall-cart/src/main/java/site/zhourui/gulimall/cart/config/MyThreadConfig.javapackage;/***@authorzr*@date2021/12/1315:52*/importimportimportEnableConfigurationProperties;Bean;Configuration;importimportimportimportExecutors;LinkedBlockingDeque;ThreadPoolExecutor;TimeUnit;/***線程池配置類**/@EnableConfigurationProperties(ThreadPoolConfigProperties.class)@ConfigurationpublicclassMyThreadConfig{@BeanpublicThreadPoolExecutorexecutor(ThreadPoolConfigPropertiespool){returnnewThreadPoolExecutor(.getpoolCoreSize(),.getpoolMaxSize(),.getpoolKeepAliveTime(),TimeUnit.SECONDS,newLinkedBlockingDeque<>(100000),Executors.defaultThreadFactory(),newThreadPoolExecutor.AbortPolicy());}}gulimall-cart/src/main/resources/application.yaml#配置線程池gulimall:thread:core-size:20max-size:200keep-alive-time:102.8購物車相關(guān)常量gulimall-common/src/main/java/site/zhourui/common/constant/CartConstant.javapackage;/***@authorzr*@date2021/12/1315:20*//***購物車常量**/publicclassCartConstant{publicfinalstaticStringTEMP_USER_COOKIE_NAMEpublicfinalstaticintTEMP_USER_COOKIE_TIMEOUT="user-key";=60*60*24*30;publicfinalstaticStringCART_PREFIX="gulimall:cart:";}2.9封裝商品模塊相關(guān)接?(?于遠(yuǎn)程調(diào)?)gulimall-product/src/main/java/site/zhourui/gulimall/product/app/SkuInfoController.java/**根*據(jù)skuId查詢當(dāng)前商品的最新價格*@paramskuId*@return*/@GetMapping(value="/{skuId}/price")BigDecimalgetPrice(@PathVariable("skuId")LongskuId){//獲取當(dāng)前商品的信息SkuInfoEntityskuInfo=skuInfoService.getById(skuId);//獲取商品的價格BigDecimalprice=skuInfo.getPrice();returnprice;}gulimall-product/src/main/java/site/zhourui/gulimall/product/app/SkuSaleAttrValueController.java/**根*據(jù)skuId查詢當(dāng)前商品的最新價格*@paramskuId*@return*/@GetMapping(value="/{skuId}/price")BigDecimalgetPrice(@PathVariable("skuId")LongskuId){//獲取當(dāng)前商品的信息SkuInfoEntityskuInfo=skuInfoService.getById(skuId);//獲取商品的價格BigDecimalprice=skuInfo.getPrice();returnprice;}/**信*息*/@RequestMapping("/info/{skuId}")publicRinfo(@PathVariable("skuId")LongskuId){SkuInfoEntityskuInfo=skuInfoService.getById(skuId);returnR.ok().put("skuInfo",skuInfo);}2.10遠(yuǎn)程調(diào)?接?gulimall-cart/src/main/java/site/zhourui/gulimall/cart/feign/ProductFeignService.javapackage;importimportimportimportimportFeignClient;GetMapping;PathVariable;RequestMapping;R;importimportBigDecimal;List;/***@authorzr*@date2021/12/1315:46*/@FeignClient("gulimall-product")publicinterfaceProductFeignService{/**根*據(jù)skuId查詢sku信息*@paramskuId*@return*/@RequestMapping("/product/skuinfo/info/{skuId}")RgetInfo(@PathVariable("skuId")LongskuId);/**根*據(jù)skuId查詢pms_sku_sale_attr_value表中的信息*@paramskuId*@return*/@GetMapping(value="/product/skusaleattrvalue/stringList/{skuId}")List<String>getSkuSaleAttrValues(@PathVariable("skuId")LongskuId);/**根*據(jù)skuId查詢當(dāng)前商品的最新價格*@paramskuId*@return*/@GetMapping(value="/product/skuinfo/{skuId}/price")BigDecimalgetPrice(@PathVariable("skuId")LongskuId);}2.11封裝購物車CRUD接?gulimall-cart/src/main/java/site/zhourui/gulimall/cart/service/CartService.javapackage;/***@authorzr*@date2021/12/1315:37*/importimportCartItemVo;CartVo;importimportList;ExecutionException;/***購物車服務(wù)*/publicinterfaceCartService{/**將*商品添加?購物車*/CartItemVoaddToCart(LongskuId,Integernum)throwsExecutionException,InterruptedException;/**獲*取購物車某個購物項(xiàng)*/CartItemVogetCartItem(LongskuId);/**獲*取購物車??的信息*@return*/CartVogetCart()throwsExecutionException,InterruptedException;/**清*空購物車的數(shù)據(jù)*@paramcartKey*/publicvoidclearCartInfo(StringcartKey);/**勾*選購物項(xiàng)*@paramskuId*@paramcheck*/voidcheckItem(LongskuId,Integercheck);/**改*變商品數(shù)量*@paramskuId*@paramnum*/voidchangeItemCount(LongskuId,Integernum);/**刪*除購物項(xiàng)*@paramskuId*/voiddeleteIdCartInfo(IntegerskuId);/**獲*取當(dāng)前?戶的購物車所有商品項(xiàng)*@return*/List<CartItemVo>getUserCartItems();}gulimall-cart/src/main/java/site/zhourui/gulimall/cart/service/Impl/CartServiceImpl.javapackageImpl;importimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportJSON;TypeReference;Slf4j;Autowired;BoundHashOperations;StringRedisTemplate;Service;StringUtils;CartConstant;UserInfoTo;R;Interceptor.CartInterceptor;CartExceptionHandler;ProductFeignService;CartService;CartItemVo;CartVo;SkuInfoVo;importimportimportimportimportimportimportBigDecimal;ArrayList;List;CompletableFuture;ExecutionException;ThreadPoolExecutor;Collectors;/***@authorzr*@date2021/12/1315:38*/@Slf4j@Service("cartService")publicclassCartServiceImplimplementsCartService{@AutowiredprivateStringRedisTemplateredisTemplate;@AutowiredprivateProductFeignServiceproductFeignService;@AutowiredprivateThreadPoolExecutorexecutor;/**跳*轉(zhuǎn)cartList頁?封*裝購物車類【所有商品,所有商品的價格】【*整合登錄狀態(tài)與未登錄狀態(tài)】*/@OverridepublicCartVogetCart()throwsExecutionException,InterruptedException{CartVocartVo=newCartVo();UserInfoTouserInfoTo=CartInterceptor.toThreadLocal.get();System.out.println(userInfoTo);if(userInfoTo.getUserId()!=null){//)1、登錄后購物車的keyStringcartKey=CartConstant.CART_PREFIX+userInfoTo.getUserId();//)2、臨時購物車的keyStringtemptCartKey=CartConstant.CART_PREFIX+userInfoTo.getUserKey();//2、如果臨時購物車的數(shù)據(jù)還未進(jìn)?合并<CaListrtItemVo>tempCartItems=getCartItems(temptCartKey);if(tempCartItems!=null){//臨時購物車有數(shù)據(jù)需要進(jìn)?合并操作for(CartItemVoitem:tempCartItems){for(CartItemVoitem:tempCartItems){addToCart(item.getSkuId(),item.getCount());}//清除臨時購物車的數(shù)據(jù)clearCartInfo(temptCartKey);}//3、獲取登錄后的購物車數(shù)據(jù)【包含合并過來的臨時購物車的數(shù)據(jù)和登錄后購物車的數(shù)據(jù)】<CaListrtItemVo>cartItems=getCartItems(cartKey);car.setVoItems(cartItems);}else{//沒登錄StringcartKey=CartConstant.CART_PREFIX//獲取臨時購物車??的所有購物項(xiàng)+userInfoTo.getUserKey();<CaListrtItemVo>cartItems=getCartItems(cartKey);car.setVoItems(cartItems);}returncartVo;}/**添*加商品到購物車*@paramskuId*@paramnum*/@OverridepublicCartItemVoaddToCart(LongskuId,Integernum)throwsExecutionException,InterruptedException{//拿到要操作的購物車信息【cartOps就相當(dāng)于綁定了當(dāng)前?戶購物車數(shù)據(jù)的hash】BoundHashOperations<String,Object,Object>cartOps=getCartOps();//判斷Redis是否有該商品的信息StringproductRedisValue=(String)cartOps.get(skuId.toString());//如果沒有就添加數(shù)據(jù)【遠(yuǎn)程查詢skuId】if(StringUtils.isEmpty(productRedisValue)){//2、添加新的商品到購物車(redis)CartItemVocartItem=newCartItemVo();//開啟第?個異步任務(wù)CompletableFuture<Void>getSkuInfoFuture=CompletableFuture.runAsync(()->{//1、遠(yuǎn)程查詢當(dāng)前要添加商品的信息RproductSkuInfoSkuInfoVo=skuInfoproductSkuInfo.getData("skuInfo",newTypeReference<SkuInfoVo>(){});//數(shù)據(jù)賦值操作=productFeignService.getInfo(skuId);cartItem.setSkuId(skuInfo.getSkuId());cartItem.setTitle(skuInfo.getSkuTitle());cartItem.setImage(skuInfo.getSkuDefaultImg());cartItem.setPrice(skuInfo.getPrice());cartItem.setCount(num);cartItem.setCheck(true);},executor);//開啟第?個異步任務(wù)CompletableFuture<Void>getSkuAttrValuesFuture=CompletableFuture.runAsync(()->{//2、遠(yuǎn)程查詢skuAttrValues組合信息<StrListing>skuSaleAttrValues=productFeignService.getSkuSaleAttrValues(skuId);cartItem.setSkuAttrValues(skuSaleAttrValues);},executor);//等待所有的異步任務(wù)全部完成CompletableFuture.allOf(getSkuInfoFuture,getSkuAttrValuesFuture).get();StringcartItemJsoncartOps.put(skuId.toString(),cartItemJson);returncartItem;=JSON.toJSONString(cartItem);}else{//購物車有此商品,修改數(shù)量即可CartItemVocartItemVo=JSON.parseObject(productRedisValue,CartItemVo.class);cartIt.setmVCount(cartItemVo.getCount()+num);//修改redis的數(shù)據(jù)StringcartItemJsoncartOps.put(skuId.toString(),cartItemJson);returncartItemVo;=JSON.toJSONString(cartItemVo);returncartItemVo;}}/**獲*取到我們要操作的購物車簡*化代碼:*、判1斷是否登錄,拼接key*、數(shù)2據(jù)是hash類型,所以每次要調(diào)?兩次key【直接綁定外層key】*第?層key:gulimall:cart:2*第?層key:skuId*/privateBoundHashOperations<String,Object,Object>getCartOps(){//先得到當(dāng)前?戶信息UserInfoTouserInfoTo=CartInterceptor.toThreadLocal.get();StringcartKey="";if(userInfoTo.getUserId()!=null){//gulimall:cart:1cartKey=CartConstant.CART_PREFIX+userInfoTo.getUserId();}else{cartKey=CartConstant.CART_PREFIX+userInfoTo.getUserKey();}//綁定指定的key操作RedisBoundHashOperations<String,Object,Object>operations=redisTemplate.boundHashOps(cartKey);returnoperations;}/**重*定向頁?獲取當(dāng)前購物車中sku商品信息*@paramskuId*@return*/@OverridepublicCartItemVogetCartItem(LongskuId){//拿到要操作的購物車信息BoundHashOperations<String,Object,Object>cartOps=getCartOps();StringredisValue=(String)cartOps.get(skuId.toString());CartItemVocartItemVo=JSON.parseObject(redisValue,CartItemVo.class);returncartItemVo;}/**遠(yuǎn)*程調(diào)?:訂單服務(wù)調(diào)?【更新最新價格】獲*取當(dāng)前?戶購物車所有選中的商品項(xiàng)check=true【從redis中取】*/@OverridepublicList<CartItemVo>getUserCartItems(){<ListCartItemVo>cartItemVoList=newArrayList<>();//獲取當(dāng)前?戶登錄的信息UserInfoTouserInfoTo=CartInterceptor.toThreadLocal.get();//如果?戶未登錄直接返回nullif(userInfoTo.getUserId()==null){returnnull;}else{//獲取購物車項(xiàng)StringcartKey=CartConstant.CART_PREFIX//獲取所有的+userInfoTo.getUserId();<CaListrtItemVo>cartItems=getCartItems(cartKey);if(cartItems==null){thrownewCartExceptionHandler();}//篩選出選中的cartItemVoLis=cartItems.stream().filter(items->items.getCheck()).map(item->{//更新為最新的價格(查詢數(shù)據(jù)庫)//redis中的價格不是最新的BigDecimal=prodpricuctFeignService.getPrice(item.getSkuId());BigDecimal=prod.setPriciteme(price);returnitem;pricuctFeignService.getPrice(item.getSkuId());}).collect(Collectors.toList());}returncartItemVoList;}/**獲*取購物車??的數(shù)據(jù)【根據(jù)key,包裝成List<CartItemVo>】*key=【gulimall:cart:2或gulimall:cart:lkajkashjghj2989dsj】*@paramcartKey*@return*/privateList<CartItemVo>getCartItems(StringcartKey){//獲取購物車??的所有商品BoundHashOperations<String,Object,Object>operations=redisTemplate.boundHashOps(cartKey);<ListObject>values=operations.values();if(values!=null&&values.size()>0){<CaListrtItemVo>cartItemVoStream=values.stream().map((obj)->{String=(Stristrng)obj;CartItemVocartItem=JSON.parseObject(str,CartItemVo.class);returncartItem;}).collect(Collectors.toList());returncartItemVoStream;}returnnull;}@OverridepublicvoidclearCartInfo(StringcartKey){redisTemplate.delete(cartKey);}@OverridepublicvoidcheckItem(LongskuId,Integercheck){//查詢購物車??的商品CartItemVocartItem=getCartItem(skuId);//修改商品狀態(tài)cartItem.setCheck(check==1?true:false);//序列化存?redis中StringredisValue=JSON.toJSONString(cartItem);BoundHashOperations<String,Object,Object>cartOps=getCartOps();cartOps.put(skuId.toString(),redisValue);}/**修*改購物項(xiàng)數(shù)量*@paramskuId*@paramnum*/@OverridepublicvoidchangeItemCount(LongskuId,Integernum){//查詢購物車??的商品CartItemVocartItem=getCartItem(skuId);cartItem.setCount(num);BoundHashOperations<String,Object,Object>cartOps=getCartOps();//序列化存?redis中StringredisValue=JSON.toJSONString(cartItem);cartOps.put(skuId.toString(),redisValue);}}/**刪*除購物項(xiàng)*@paramskuId*/@OverridepublicvoiddeleteIdCartInfo(IntegerskuId){BoundHashOperations<String,Object,Object>cartOps=getCartOps();cartOps.delete(skuId.toString());}}gulimall-cart/src/main/java/site/zhourui/gulimall/cart/controller/CartController.javapackage;importimportimportimportimportimportimportimportimportimportAutowired;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論