国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

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

蕭云建設(shè)網(wǎng)站內(nèi)部搜索引擎優(yōu)化

蕭云建設(shè)網(wǎng)站,內(nèi)部搜索引擎優(yōu)化,wordpress網(wǎng)易云音樂插件,昆明電商網(wǎng)站建設(shè)登錄方式調(diào)整第1步:從zmall-common的pom.xml中移除spring-session-data-redis依賴注意:本章節(jié)中不采用spring-session方式,改用redis直接存儲用戶登錄信息,主要是為了方便之后的jmeter壓測;2)這里只注釋調(diào)用…

登錄方式調(diào)整

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

注意:本章節(jié)中不采用spring-session方式,改用redis直接存儲用戶登錄信息,主要是為了方便之后的jmeter壓測;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;}
}
這里一定要注意,最后在將RedisConnectionFactory設(shè)置到RedisTemplate中,不要在最前做該步操作,不然會導(dǎo)致String和Hash類型的序列化無效,將采用默認(rèn)的JdkSerializationRedisSerializer進行序列化,從而導(dǎo)致保存的key前綴出現(xiàn)亂碼問題。細(xì)心!!!細(xì)心!!!細(xì)心!!!o(╥﹏╥)o
參考地址:https://blog.csdn.net/hunger_wang/article/details/118713579?spm=1001.2014.3001.5501

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

IRedisServcie

public interface IRedisService {/*** 將登陸用戶對象保存到Redis中,并以token來命名* @param token* @param user*/void setUserToRedis(String token, User user);/*** 根據(jù)token令牌從Redis中獲取User對象* @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);}
}
用戶登錄成功后,將用戶對象保存到Redis中,并設(shè)置超時時間7200秒。

第4步:在zmall-common公共模塊中配置,配置自定義參數(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中存儲的user對象,方便jmeter測試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方式存儲登錄用戶信息。

//5.通過UUID生成token令牌并保存到cookie中
String token= UUID.randomUUID().toString().replace("-","");
//將隨機生成的Token令牌保存到Cookie中,并設(shè)置1800秒超時時間
CookieUtils.setCookie(req,resp,"token",token,7200);
//6.將token令牌與spring session進行綁定并存入redis中
//HttpSession session = req.getSession();
//session.setAttribute(token,us);
//將token令牌與user綁定后存儲到redis中,方便jmeter測試
redisService.setUserToRedis(token,us);
這里采用Redis方式直接存儲登錄用戶信息,只為后續(xù)使用Jmeter壓測時提供便利。正常運行使用項目還是可以使用spring-session方式。

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

@RequestMapping("/index.html")
public String index(Model model, User user){
System.out.println(user);
}
在調(diào)用index方法之前,先由自定義的參數(shù)解析器進行參數(shù)解析并返回解析結(jié)果User,所以在這里可直接在方法參數(shù)中獲取的User對象。

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

生成秒殺訂單

綁定秒殺商品

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

index.html

 <#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.item_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.item_id}">${g.name}</a></h2>倒計時:<span>1200</span> 時 <span>30</span> 分 <span>28</span> 秒</div></div></#list></#if>

sellDetail.html

<table border="0" style="width:100%; margin-bottom:50px;" cellspacing="0" cellpadding="0"><tr valign="top"><td width="315"><div class="lim_name">${(prod.name)!}</div><div class="lim_price"><span class="ch_txt">¥${(prod.price)!}</span><a href="javascript:void(0);" class="ch_a" pid="${(prod.item_id)!}" price="${(prod.price)!}">搶購</a></div><div class="lim_c"><table border="0" style="width:100%; color:#888888;" cellspacing="0" cellpadding="0"><tr><td width="35%">市場價 </td><td width="65%">折扣</td></tr><tr style="font-family:'Microsoft YaHei';"><td style="text-decoration:line-through;">¥${(prod.price)!}</td><td>8.0</td></tr></table></div><div class="lim_c"><div class="des_choice"><span class="fl">型號:</span><ul><li class="checked">30ml<div class="ch_img"></div></li><li>50ml<div class="ch_img"></div></li><li>100ml<div class="ch_img"></div></li></ul></div><div class="des_choice"><span class="fl">顏色:</span><ul><li>紅色<div class="ch_img"></div></li><li class="checked">白色<div class="ch_img"></div></li><li>黑色<div class="ch_img"></div></li></ul></div></div><div class="lim_c"><span class="fl">數(shù)量:</span><input type="text" value="${(prod.total)!}" class="lim_ipt" /></div><div class="lim_clock">距離團購結(jié)束還有<br /><span>1200 時 30 分 28 秒</span></div></td><td width="525" align="center" style="border-left:1px solid #eaeaea;"><img src="${(prod.fileName)!}" width="460" height="460" /></td></tr></table>

web層

@RequestMapping("/index.html")public ModelAndView toIndex(User user){System.out.println("user:"+ JSON.toJSONString(user));ModelAndView mv=new ModelAndView();//獲取熱賣商品列表List<Product> hot = productService.list(new QueryWrapper<Product>().orderByDesc("hot").last("limit 4"));//獲取顯示秒殺商品List<Map<String, Object>> maps = productService.queryKillProdNews();mv.addObject("kills",maps);mv.addObject("hots",hot);mv.setViewName("index");return mv;}

service層

public interface IProductService extends IService<Product> {void updateStock(Integer pid,Integer num);/*** 首頁顯示秒殺商品查詢* @return*/List<Map<String,Object>> queryKillProdNews();/*** 根據(jù)商品ID查詢秒殺商品信息* @param pid 秒殺商品ID* @return*/Map<String,Object> queryKillProdById(Integer pid);
}
@Overridepublic List<Map<String, Object>> queryKillProdNews() {return productMapper.queryKillProdNews();}@Overridepublic Map<String, Object> queryKillProdById(Integer pid) {return productMapper.queryKillProdById(pid);}

mapper層

@Repository
public interface ProductMapper extends BaseMapper<Product> {
//    @MapKey("queryKillProdNews")List<Map<String,Object>> queryKillProdNews();Map<String,Object> queryKillProdById(Integer pid);
}

productMapper.xml

<select id="queryKillProdNews" resultType="java.util.Map">selectk.id,k.item_id,p.name,p.price,p.fileNamefromzmall_kill k,zmall_product pwhere k.item_id=p.id andk.is_active=1 and(now() between start_time and end_time)order by k.create_time desclimit 4</select><select id="queryKillProdById" resultType="java.util.Map">selectk.id,k.item_id,k.total,p.name,p.price,p.fileNamefromzmall_kill k,zmall_product pwhere k.item_id=p.id and k.is_active=1 and item_id=#{value}</select>

查看秒殺商品

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

@RequestMapping("/sellDetail.html")public String sellDetail(@RequestParam Integer pid, Model model){//根據(jù)商品ID查詢秒殺商品信息Map<String, Object> prod = productService.queryKillProdById(pid);model.addAttribute("prod",prod);return "sellDetails";}

訂單秒殺

移除seata相關(guān)

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

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

seata分布式事務(wù),進行jmeter壓測秒殺訂單接口效率太低(1000個并發(fā)請求,吞吐量為4.5/s)o(╥﹏╥)o

生成秒殺訂單

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

IOrderService

public interface IOrderService extends IService<Order> {Order createOrder(Integer pid,Integer num);/*** 生成秒殺訂單* @param user 登陸用戶對象* @param pid  秒殺商品ID* @param price 秒殺商品價格* @return*/JsonResponseBody<?> createKillOrder(User user, Integer pid, Float price);
}

OrderServiceImpl

@Autowired
private KillServiceImpl killService;
@Autowired
private OrderDetailServiceImpl orderDetailService;@Transactional@Overridepublic JsonResponseBody<?> createKillOrder(User user, Integer pid, Float price) {//1.根據(jù)秒殺商品編號獲取秒殺商品庫存是否為空Kill kill = killService.getOne(new QueryWrapper<Kill>().eq("item_id",pid));if(kill.getTotal()<1)throw new BusinessException(JsonResponseStatus.STOCK_EMPTY);//2.秒殺商品庫存減一killService.update(new UpdateWrapper<Kill>().eq("item_id",pid).setSql("total=total-1"));//3.生成秒殺訂單及訂單項SnowFlake snowFlake=new SnowFlake(2,3);Long orderId=snowFlake.nextId();int orderIdInt = new Long(orderId).intValue();//創(chuàng)建訂單Order order=new Order();order.setUserId(user.getId());order.setLoginName(user.getLoginName());order.setCost(price);order.setSerialNumber(orderIdInt+"");this.save(order);//創(chuàng)建訂單項OrderDetail orderDetail=new OrderDetail();orderDetail.setOrderId(orderIdInt);orderDetail.setProductId(pid);orderDetail.setQuantity(1);orderDetail.setCost(price);orderDetailService.save(orderDetail);return new JsonResponseBody();}

OrderController

@RequestMapping("/createKillOrder/{pid}/{price}")@ResponseBodypublic JsonResponseBody<?> createKillOrder(User user,@PathVariable("pid") Integer pid,@PathVariable("price") Float price){return orderService.createKillOrder(user,pid,price);}

前端頁面秒殺測試

在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>

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

注意:

 $.post('http://user.zmall.com/userLogin',{loginName:loginName,password:password},function(rs){console.log(rs);if(rs.code===200){location.href='http://product.zmall.com/index.html';}else{alert(rs.msg);}},'json');

post方式不能跨二級域名發(fā)送請求,location.href可以跨二級域名發(fā)送請求;

$(function(){$('.ch_a').click(function(){let pid=$(this).attr("pid");let price=$(this).attr("price");console.log("pid=%s,price=%s",pid,price);$.post('http://zmall.com/order-serv/createKillOrder/'+pid+'/'+price,{},function(rs){console.log(rs);if(rs.code===200)alert('秒殺成功');elsealert(rs.msg);},'json');});});
$.post('http://zmall.com/order-serv/createKillOrder/'+pid+'/'+price,{},function(rs){});能夠正常訪問;
$.post('http://order.zmall.com/createKillOrder/'+pid+'/'+price,{},function(rs){});則會出現(xiàn)跨域問題;

http://aloenet.com.cn/news/36900.html

相關(guān)文章:

  • 可以上傳自己做的視頻的網(wǎng)站嗎谷歌競價廣告
  • 手機站和網(wǎng)站有區(qū)別嗎關(guān)鍵詞排名是什么意思
  • 分類信息系統(tǒng)網(wǎng)站模板張家港seo建站
  • 長沙做網(wǎng)站排名汕頭seo網(wǎng)絡(luò)推廣
  • 深圳企業(yè)網(wǎng)站建設(shè)與設(shè)計制作網(wǎng)站運營培訓(xùn)學(xué)校
  • wordpress建娛樂站百度推廣網(wǎng)站平臺
  • 國外好玩的網(wǎng)站seo排名推廣工具
  • 網(wǎng)站建設(shè)維護工作seo兼職論壇
  • 杭州教育網(wǎng)站建設(shè)世界大學(xué)排名
  • 怎么自己做淘寶客網(wǎng)站google谷歌搜索引擎
  • wordPress回復(fù)表情百度seo關(guān)鍵詞排名 s
  • 網(wǎng)站建設(shè)專題全國疫情排名一覽表
  • 做編程的網(wǎng)站有哪些內(nèi)容搜索引擎成功案例分析
  • 青海政府網(wǎng)站建設(shè)公司網(wǎng)站建設(shè)免費網(wǎng)站
  • 寧波網(wǎng)站建設(shè)設(shè)計制作百度信息流推廣平臺
  • 合作加盟廣州中小企業(yè)seo推廣運營
  • 蒼南網(wǎng)站設(shè)計公司百度非企渠道開戶
  • 網(wǎng)站建設(shè)銷售培訓(xùn)2023b站免費推廣入口游戲
  • 如何建立網(wǎng)站會員系統(tǒng)嗎網(wǎng)絡(luò)營銷的特點有哪些
  • wordpress顯示錯亂鄭州seo價格
  • 徐州網(wǎng)站制作機構(gòu)百度網(wǎng)站首頁提交入口
  • 安徽做公司網(wǎng)站哪家好國內(nèi)搜索引擎排行榜
  • 上海外貿(mào)建站推廣公司微信朋友圈廣告怎么推廣
  • 天津建設(shè)工程網(wǎng)站營銷策略
  • 北京家裝設(shè)計師排名北京網(wǎng)站優(yōu)化推廣方案
  • 清溪仿做網(wǎng)站懂得網(wǎng)站推廣
  • 日本無碼做受網(wǎng)站企業(yè)seo顧問
  • 網(wǎng)站設(shè)計報價是多少錢廣告信息發(fā)布平臺
  • 蘇州網(wǎng)站設(shè)計哪家好韓國比分預(yù)測
  • 安卓做網(wǎng)站seo網(wǎng)站關(guān)鍵詞優(yōu)化報價