中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

中國自適應(yīng)網(wǎng)站建設(shè)朝陽網(wǎng)站seo

中國自適應(yīng)網(wǎng)站建設(shè),朝陽網(wǎng)站seo,wordpress固定鏈接翻頁404,東北網(wǎng)站建設(shè)公司登錄方式調(diào)整 第1步:從zmall-common的pom.xml中移除spring-session-data-redis依賴 注意: 1)本次不采用spring-session方式,改用redis直接存儲(chǔ)用戶登錄信息,主要是為了方便之后的jmeter壓測(cè); 2&#xff09…

登錄方式調(diào)整

第1步:從zmall-common的pom.xml中移除spring-session-data-redis依賴

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-EGgFVLjU-1676371517002)(images\20220817224735.jpg)]

注意:
1)本次不采用spring-session方式,改用redis直接存儲(chǔ)用戶登錄信息,主要是為了方便之后的jmeter壓測(cè);
2)這里只注釋調(diào)用spring-session的依賴,保留redis的依賴;

第2步:在zmall-common公共模塊中定義RedisConfig配置類

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> restTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();//String類型Key序列化redisTemplate.setKeySerializer(new StringRedisSerializer());//String類型Value序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());//Hash類型Key序列化redisTemplate.setHashKeySerializer(new StringRedisSerializer());//Hash類型Value序列化redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}
}

第3步:在zmall-common公共模塊中配置redis相關(guān)服務(wù)

IRedisServcie

public interface IRedisService {/*** 將登陸用戶對(duì)象保存到Redis中,并以token來命名* @param token* @param user*/void setUserToRedis(String token, User user);/*** 根據(jù)token令牌從Redis中獲取User對(duì)象* @param token* @return*/User getUserByToken(String token);
}

RedisServcieImple

@Service
public class RedisServiceImpl implements IRedisService {@Autowiredprivate RedisTemplate<String,Object> redisTemplate;@Overridepublic void setUserToRedis(String token, User user) {String key="user:"+token;redisTemplate.boundValueOps(key).set(user,7200,TimeUnit.SECONDS);}@Overridepublic User getUserByToken(String token) {return (User) redisTemplate.opsForValue().get("user:"+token);}
}

用戶登錄成功后,將用戶對(duì)象保存到Redis中,并設(shè)置超時(shí)時(shí)間7200秒。

第4步:配置自定義參數(shù)解析UserArgumentResolver、WebConfig

UserArgumentResolver

/*** 自定義用戶參數(shù)類*/
@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {@Autowiredprivate IRedisService redisService;/*** 只有supportsParameter方法執(zhí)行返回true,才能執(zhí)行下面的resolveArgument方法* @param methodParameter* @return*/@Overridepublic boolean supportsParameter(MethodParameter methodParameter) {Class<?> type = methodParameter.getParameterType();return type== User.class;}@Overridepublic Object resolveArgument(MethodParameter methodParameter,ModelAndViewContainer modelAndViewContainer,NativeWebRequest nativeWebRequest,WebDataBinderFactory webDataBinderFactory) throws Exception {HttpServletRequest req= (HttpServletRequest) nativeWebRequest.getNativeRequest();//從cookie獲取token令牌String token = CookieUtils.getCookieValue(req, "token");//判斷cookie中的token令牌是否為空if(StringUtils.isEmpty(token))throw new BusinessException(JsonResponseStatus.TOKEN_ERROR);//根據(jù)token令牌獲取redis中存儲(chǔ)的user對(duì)象,方便jmeter測(cè)試User user = redisService.getUserByToken(token);if(null==user)throw new BusinessException(JsonResponseStatus.TOKEN_ERROR);return user;}
}

WebConfig

@Component
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate UserArgumentResolver userArgumentResolver;@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(userArgumentResolver);}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//添加靜態(tài)資源訪問映射//registry.addResourceHandler("/static/**")//        .addResourceLocations("classpath:/static/");}
}

第5步:用戶登錄業(yè)務(wù)調(diào)整,將spring-session方式更改為redis方式存儲(chǔ)登錄用戶信息。

//5.通過UUID生成token令牌并保存到cookie中
String token= UUID.randomUUID().toString().replace("-","");
//將隨機(jī)生成的Token令牌保存到Cookie中,并設(shè)置1800秒超時(shí)時(shí)間
CookieUtils.setCookie(req,resp,"token",token,7200);
//6.將token令牌與spring session進(jìn)行綁定并存入redis中
//HttpSession session = req.getSession();
//session.setAttribute(token,us);
//將token令牌與user綁定后存儲(chǔ)到redis中,方便jmeter測(cè)試
redisService.setUserToRedis(token,us);

這里采用Redis方式直接存儲(chǔ)登錄用戶信息,只為后續(xù)使用Jmeter壓測(cè)時(shí)提供便利。正常運(yùn)行使用項(xiàng)目還是可以使用spring-session方式。

第6步:修改商品服務(wù)zmall-product模塊中的index方法,將之前從HttpSession中獲取登錄用戶信息改換成User對(duì)象參數(shù)方式

@RequestMapping("/index.html")
public String index(Model model, User user){System.out.println(user);
}

在調(diào)用index方法之前,先由自定義的參數(shù)解析器進(jìn)行參數(shù)解析并返回解析結(jié)果User,所以在這里可直接在方法參數(shù)中獲取的User對(duì)象。

第7步:重啟zmall-user和zmall-product模塊,完成用戶登錄后,直接在瀏覽器地址欄輸入:http://zmall.com/product-serv/index.html,查看zmall-product模塊中的控制臺(tái)是否已經(jīng)獲取到登錄用戶對(duì)象信息。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-nf3XjJz0-1676371517006)(images\20220817233131.jpg)]

生成秒殺訂單

綁定秒殺商品

添加sellDetail.html頁面到zmall-product模塊中;實(shí)現(xiàn)首頁秒殺商品展示,必須保證秒殺商品狀態(tài)為已激活、且秒殺商品的活動(dòng)時(shí)間為有效時(shí)間范圍之內(nèi)。

 <#if kills??><#list kills as g><div class="sell_${g_index?if_exists+1}"><div class="sb_img"><a href="${ctx}/sellDetail.html?pid=${g.id}"><img src="${g.fileName}" width="242" height="356" /></a></div><div class="s_price">¥<span>${g.price}</span></div><div class="s_name"><h2><a href="${ctx}/sellDetail.html?pid=${g.id}">${g.name}</a></h2>倒計(jì)時(shí):<span>1200</span> 時(shí) <span>30</span> 分 <span>28</span> 秒</div></div></#list></#if>

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-A1zL4Qix-1676371517008)(images\2022-08-18_164403.png)]

查看秒殺商品

點(diǎn)擊限時(shí)秒殺中的秒殺商品,根據(jù)秒殺商品ID查詢秒殺商品詳情信息并跳轉(zhuǎn)到sellDetail.html頁面展示秒殺商品信息。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-NWNimZH4-1676371517017)(images\2022-08-18_164751.png)]

訂單秒殺

移除seata相關(guān)

第1步:先注釋掉zmall-order和zmall-product模塊中的seata依賴

第2步:分別刪掉zmall-order和zmall-product模塊中resources目錄下的bootstrap.xml和register.conf文件

第3步:移除zmall-order中分布式事務(wù)案例中的@GlobalTransactional注解

第4步:刪除DataSourceProxyConfig該類

第5步:移除zmall-order中啟動(dòng)類上的注解參數(shù)(exclude = DataSourceAutoConfiguration.class)

//更改前:
//@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
//更改后:
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan({"com.zking.zmall.mapper"})
@EnableFeignClients
public class ZmallOrderApplication {public static void main(String[] args) {SpringApplication.run(ZmallOrderApplication.class, args);}}

第6步:更換zmall-order和zmall-product中的application.yml配置中的數(shù)據(jù)庫連接池

datasource:#type連接池類型 DBCP,C3P0,Hikari,Druid,默認(rèn)為Hikari#更改前:#type: com.alibaba.druid.pool.DruidDataSource#更改后:type: com.zaxxer.hikari.HikariDataSource

生成秒殺訂單

將SnowFlake雪花ID生成工具類導(dǎo)入到zmall-common模塊中utils,然后再生成秒殺訂單時(shí)使用雪花ID來充當(dāng)秒殺訂單編號(hào);在zmall-order模塊中完成秒殺訂單生成工作。

IOrderService

public interface IOrderService extends IService<Order> {JsonResponseBody<?> createKillOrder(User user, Integer pid);
}

OrderServiceImpl

@Transactional
@Override
public JsonResponseBody<?> createKillOrder(User user, Integer pid) {//1.判斷用戶是否登錄if(null==user)throw new BusinessException(JsonResponseStatus.TOKEN_ERROR);//根據(jù)用戶ID和秒殺商品Id判斷。。。。//2.根據(jù)秒殺商品編號(hào)獲取秒殺商品庫存是否為空Kill kill = killService.getOne(new QueryWrapper<Kill>().eq("item_id",pid));if(kill.getTotal()<1)throw new BusinessException(JsonResponseStatus.STOCK_EMPTY);//3.根據(jù)商品ID獲取商品Product product = productService.getProductById(pid);//4.秒殺商品庫存減一killService.updateKillStockById(pid);//5.生成秒殺訂單及訂單項(xiàng)SnowFlake snowFlake=new SnowFlake(2,3);Long orderId=snowFlake.nextId();//創(chuàng)建訂單Order order=new Order();order.setUserId(user.getId());order.setLoginName(user.getLoginName());order.setCost(product.getPrice());order.setSerialNumber(orderId);this.save(order);//創(chuàng)建訂單項(xiàng)OrderDetail orderDetail=new OrderDetail();orderDetail.setOrderId(orderId);orderDetail.setProductId(product.getId());orderDetail.setQuantity(1);orderDetail.setCost(product.getPrice());orderDetailService.save(orderDetail);return new JsonResponseBody();
}

前端頁面秒殺測(cè)試

在sellDetail.html頁面中添加訂單秒殺JS方法。

<script>$(function(){$('.ch_a').click(function(){let pid=$(this).attr('alt');console.log(pid);$.post('http://zmall.com/order-serv/createKillOrder',{pid:pid},function(rs){console.log(rs);if(rs.code===200)alert('秒殺成功');elsealert(rs.msg);},'json');});});
</script>

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-LM7Ibg8f-1676371517019)(images\2022-08-18_171847.png)]

這里雖然已經(jīng)能正常展示秒殺效果,但是還是存在很多問題,比如:重復(fù)搶購問題等等問題。

utils:https://pan.baidu.com/s/1ExaC4GgEg_ofKsARkYhHXw
提取碼:kq20

http://www.risenshineclean.com/news/43019.html

相關(guān)文章:

  • 醫(yī)藥網(wǎng)站怎么做搜索引擎優(yōu)化是做什么的
  • 國務(wù)院政府網(wǎng)站集約化建設(shè)seo排名優(yōu)化工具
  • 求一個(gè)能用的網(wǎng)址網(wǎng)站搜索排名優(yōu)化價(jià)格
  • index 石家莊網(wǎng)站建設(shè)友鏈交易平臺(tái)源碼
  • 浙江龍游疫情最新消息搜索引擎排名優(yōu)化
  • 編寫 網(wǎng)站 語言海外免費(fèi)網(wǎng)站推廣有哪些
  • 網(wǎng)站開發(fā)工作描述百度搜索引擎介紹
  • 商用自適應(yīng)網(wǎng)站建設(shè)智能搜索引擎
  • 自助建站廣告發(fā)布天津推廣的平臺(tái)
  • 自適應(yīng)營銷網(wǎng)站模板互聯(lián)網(wǎng)營銷培訓(xùn)班
  • 建立soho公司網(wǎng)站什么是搜索引擎優(yōu)化推廣
  • 代做畢業(yè)項(xiàng)目哪個(gè)網(wǎng)站好新浪微輿情大數(shù)據(jù)平臺(tái)
  • 新泰網(wǎng)站制作公司北京seo收費(fèi)
  • 公眾號(hào)小程序二維碼怎么生成搜索引擎排名優(yōu)化
  • 專業(yè)格泰建站海外自媒體推廣
  • 怎么設(shè)計(jì)公司的網(wǎng)站模板無代碼免費(fèi)web開發(fā)平臺(tái)
  • 可視化信息 網(wǎng)站個(gè)人如何在百度做廣告
  • 網(wǎng)站網(wǎng)站制作400多少錢百度app大全
  • 網(wǎng)站如何留住用戶關(guān)鍵詞代發(fā)排名首頁
  • 自己制作wordpress主題成都網(wǎng)站seo性價(jià)比高
  • 儋州網(wǎng)站建設(shè)網(wǎng)站查詢域名解析
  • node.js 做網(wǎng)站全媒體運(yùn)營師報(bào)名費(fèi)多少錢
  • 建站公司網(wǎng)站用什么好色目人
  • 天津網(wǎng)站建設(shè)報(bào)價(jià)登錄百度app
  • 做淘寶的批發(fā)網(wǎng)站有哪些百度sem
  • 日語網(wǎng)站建設(shè)需要注意什么seo快速排名網(wǎng)站優(yōu)化
  • 安徽省建設(shè)法治協(xié)會(huì)網(wǎng)站google play官網(wǎng)入口
  • 自然志wordpress百度網(wǎng)盤seo優(yōu)化
  • 網(wǎng)絡(luò)營銷推廣方法結(jié)論紹興網(wǎng)站快速排名優(yōu)化
  • 門戶網(wǎng)站做壓力測(cè)試搜索引擎的工作原理是什么?