黑马点评-“附近商户“功能无法实现
问题分析由于Redis版本不够因此我们使用不了GEOSEARCH命令(Redis 6.2.0 或更高版本)需要升级Redis版本下载高版本RedisRedis8.6.2点此下载后缀的区别:带有 -with-Service vs 不带with-Service 包含了将 Redis 注册为 Windows 系统后台服务的相关脚本或程序。这意味着你可以让 Redis 像 MySQL 一样每次电脑开机自动在后台悄悄运行。你写代码时直接连就行不用每次都手动去开一个黑窗口命令行启动它。不带 -with-Service 只有纯净的运行程序。每次你想用 Redis都必须手动启动而且那个黑窗口不能关关了 Redis 就停了msys2 vs cygwinRedis 官方主要是在 Linux 下开发和运行的。为了能让它在 Windows 上跑起来打包的开发者借助了兼容层工具msys2 和 cygwin 都是提供类似 Linux 运行环境的工具。对于直接使用已经编译好的 exe 程序的我们来说这两者在功能和使用体验上几乎没有任何区别。不过msys2通常被认为是更现代、更轻量级的方案代码ShopControllerGetMapping(/of/type)publicResultqueryShopByType(RequestParam(typeId)IntegertypeId,RequestParam(valuecurrent,defaultValue1)Integercurrent,RequestParam(valuex,requiredfalse)Doublex,RequestParam(valuey,requiredfalse)Doubley){returnshopService.queryShopByType(typeId,current,x,y);}IShopService/** * 查询商品的类型 * param typeId 商品类型 * param current 当前页 * param x 经度 * param y 纬度 * return */ResultqueryShopByType(IntegertypeId,Integercurrent,Doublex,Doubley);ShopServiceImplOverridepublicResultqueryShopByType(IntegertypeId,Integercurrent,Doublex,Doubley){// 1.判断是否需要根据坐标查询if(xnull||ynull){// 不需要坐标查询按数据库查询PageShoppagequery().eq(type_id,typeId).page(newPage(current,SystemConstants.DEFAULT_PAGE_SIZE));// 返回数据returnResult.ok(page.getRecords());}// 2.计算分页参数(为了后面能够手动实现分页)intfrom(current-1)*SystemConstants.DEFAULT_PAGE_SIZE;intendcurrent*SystemConstants.DEFAULT_PAGE_SIZE;// 3.查询redis、按照距离排序、分页。结果shopId、distanceStringkeyRedisConstants.SHOP_GEO_KEYtypeId;GeoResultsRedisGeoCommands.GeoLocationStringresultsstringRedisTemplate.opsForGeo()// GEOSEARCH key BYLONLAT x y BYRADIUS 10 WITHDISTANCE.search(key,GeoReference.fromCoordinate(x,y),newDistance(5000),//单位是mRedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance()//显示距离.limit(end)//这里只有一个参数默认从0-end 因此我们需要手动分页);// 4.解析出idif(resultsnull){returnResult.ok(Collections.emptyList());}ListGeoResultRedisGeoCommands.GeoLocationStringlistresults.getContent();if(list.size()from){// 没有下一页了结束 list.size()包含查询到的全部信息 但总量小于分页开头时证明当前页没有数据了returnResult.ok(Collections.emptyList());}// 4.1.截取 from ~ end的部分ListLongidsnewArrayList(list.size());//用来保存店铺id和距离MapString,DistancedistanceMapnewHashMap(list.size());list.stream().skip(from).forEach(result-{// 4.2.获取店铺id (这里的getName其实就是获取成员member我们的member保存的是店铺id)StringshopIdStrresult.getContent().getName();// 4.3.保存店铺idids.add(Long.valueOf(shopIdStr));// 4.4.获取距离Distancedistanceresult.getDistance();distanceMap.put(shopIdStr,distance);});// 5.根据id查询ShopStringidStrStrUtil.join(,,ids);ListShopshopsquery().in(id,ids).last(ORDER BY FIELD(id,idStr)).list();for(Shopshop:shops){shop.setDistance(distanceMap.get(shop.getId().toString()).getValue());}// 6.返回returnResult.ok(shops);}启动新的Redis服务cmdredis-server.exe redis.conf重启项目前记得先在Redis中创建消息队列消费者组xgroup create stream.orders g10mkstream重启项目重新加载shop:geo缓存数据此时控制台有报错:ERROR 21492 — [pool-3-thread-1] c.h.s.impl.VoucherOrderServiceImpl : 处理订单异常(不必理会)刷新前端页面此时页面大概率能展示(不再是服务器异常)但可能还存在一些问题1.下拉页面无法加载其他店铺信息(滚动分页查询功能异常)2.点击距离按钮时页面报错且有重复店铺这些问题其实不在后端,而是在前端,需要优化前端前端问题分析:滚动分页查询功能异常:前端使用了类似“无限滚动”的组件。这种组件的触发原理是当列表的底部距离屏幕底部小于某个阈值时自动发起下一页的请求。屏幕较高时第一页的 5 条数据不足以占满屏幕组件状态没有被正确激活导致用鼠标怎么拖拽也无法触发“触底加载”的事件点击距离按钮时页面报错且有重复店铺:前端 Vue 代码在切换分类时没有清空旧数组解决方案:对于滚动分页查询功能异常,可切换尺寸对于有重复店铺,可修改nginx文件夹中的shop-list.html文件内容切换尺寸修改shop-list.html文件内容(存放nginx的文件夹中)sortAndQuery(sortBy) { this.params.sortBy sortBy; this.params.current 1; // 1. 切换排序时强制回到第一页 this.shops []; // 2. 清空旧的店铺列表数据 this.queryShops(); },修改完成后保存再次刷新前端页面,所有功能均可正常运行
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2479760.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!