为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第14天 多端全栈项目实战

标签:
SpringBoot

课程名称:多端全栈项目实战:商业级代驾全流程落地




课程章节:  华夏代驾全栈小程序实战




课程讲师: 神思者




课程内容:


   位置服务缓存司机定时定位


https://img1.sycdn.imooc.com//6326fe670001e23208100278.jpg

司机端子系统通过fegin远程调用的方式 通过updateLocationCache 方法调用seriver 

并缓存到redis里面 这是需要设置两个缓存 一个是geo缓存 一个是司机上线缓存



https://img1.sycdn.imooc.com//6326fe6d000181b108040280.jpg


当司机进行停止接单后 我们需要删除缓存


创建两个抽象接口 分别是



public void updateLocationCache(Map param);


下面的form 将装缓存map对象 所以这里使用map

    

至于需要传什么值 通过form类里面的值来

@Data@Schema(description = "更新司机GPS坐标缓存的表单")public class UpdateLocationCacheForm {

    @NotNull(message = "driverId不能为空")
    @Min(value = 1, message = "driverId不能小于1")
    @Schema(description = "司机ID")
    private Long driverId;

    @NotBlank(message = "latitude不能为空")
    @Pattern(regexp = "^(([1-8]\\d?)|([1-8]\\d))(\\.\\d{1,18})|90|0(\\.\\d{1,18})?$", message = "latitude内容不正确")
    @Schema(description = "纬度")
    private String latitude;

    @NotBlank(message = "longitude不能为空")
    @Pattern(regexp = "^(([1-9]\\d?)|(1[0-7]\\d))(\\.\\d{1,18})|180|0(\\.\\d{1,18})?$", message = "longitude内容不正确")
    @Schema(description = "经度")
    private String longitude;

    @NotNull(message = "rangeDistance不能为空")
    @Range(min = 1, max = 5, message = "rangeDistance范围错误")
    @Schema(description = "接收几公里内的订单")
    private Integer rangeDistance;

    @NotNull(message = "orderDistance不能为空")
    @Schema(description = "接收代驾里程几公里以上的订单")
    @Range(min = 0, max = 30, message = "orderDistance范围错误")
    private Integer orderDistance;

    @Pattern(regexp = "^(([1-9]\\d?)|(1[0-7]\\d))(\\.\\d{1,18})|180|0(\\.\\d{1,18})?$", message = "orientateLongitude内容不正确")
    @Schema(description = "定向接单的经度")
    private String orientateLongitude;

    @Pattern(regexp = "^(([1-8]\\d?)|([1-8]\\d))(\\.\\d{1,18})|90|0(\\.\\d{1,18})?$", message = "orientateLatitude内容不正确")
    @Schema(description = "定向接单的纬度")
    private String orientateLatitude;}


public void removeLocationCache(long driverId);

这个抽象方法用来删除两种缓存


设置第一种缓存  首先需要把取到得值 进行转义

long driverId = MapUtil.getLong(param, "driverId");
String latitude = MapUtil.getStr(param, "latitude");
String longitude = MapUtil.getStr(param, "longitude");

//接单范围
int rangeDistance = MapUtil.getInt(param, "rangeDistance");
//订单里程范围
int orderDistance = MapUtil.getInt(param, "orderDistance");


geo里面要求的经纬度必须是double类型的所以我们需要在进行一次

//封装成Point对象才能缓存到Redis里面
Point point = new Point(Convert.toDouble(longitude), Convert.toDouble(latitude));
/*
 * 把司机实时定位缓存到Redis里面,便于Geo定位计算
 * Geo是集合形式,如果设置过期时间,所有司机的定位缓存就全都失效了
 * 正确做法是司机上线后,更新GEO中的缓存定位
*/
redisTemplate.opsForGeo().add("driver_location", point, driverId + "");


获取定向接单的经纬度 (司机 定制 想要去哪里的  定向)

//定向接单地址的经度
String orientateLongitude = null;
if (param.get("orientateLongitude") != null) {
  orientateLongitude = MapUtil.getStr(param, "orientateLongitude");
}
//定向接单地址的纬度
String orientateLatitude = null;
if (param.get("orientateLatitude") != null) {
  orientateLatitude = MapUtil.getStr(param, "orientateLatitude");
}
//定向接单经纬度的字符串
String orientation = "none";
if (orientateLongitude != null && orientateLatitude != null) {
  orientation = orientateLatitude + "," + orientateLongitude;
}


为司机设置一个超时60秒缓存  如果超过一分钟没有 那就代表他下线了

 /*
  * 为了解决判断哪些司机在线,我们还要单独弄一个上线缓存
  * 缓存司机的接单设置(定向接单、接单范围、订单总里程),便于系统判断该司机是否符合接单条件
  */
String temp = rangeDistance + "#" + orderDistance + "#" + orientation;
redisTemplate.opsForValue().set("driver_online#" + driverId, temp, 60, TimeUnit.SECONDS);



接下来写两个controller

@PostMapping("/updateLocationCache")
    @Operation(summary = "更新司机GPS定位缓存")
    public R updateLocationCache(@RequestBody @Valid UpdateLocationCacheForm form) {	
        //更新新的定位缓存
        Map param = BeanUtil.beanToMap(form);
        driverLocationService.updateLocationCache(param);
        return R.ok();
    }


    @PostMapping("/removeLocationCache")
    @Operation(summary = "删除司机GPS定位缓存")
    public R removeLocationCache(@RequestBody @Valid RemoveLocationCacheForm form) {
        driverLocationService.removeLocationCache(form.getDriverId());
        return R.ok();
    }






https://img1.sycdn.imooc.com//6326fe1b0001b75409330795.jpg


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
27
获赞与收藏
19

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消