irh icon indicating copy to clipboard operation
irh copied to clipboard

在goods服务的RecommendProductServiceImpl的getRealtimeRecommend()方法

Open liutao-lx opened this issue 3 years ago • 7 comments

在goods服务的RecommendProductServiceImpl的getRealtimeRecommend()方法 public Message<Page<ProductInfo>> getRealtimeRecommend(Integer pageSize, Integer currentPage, Long userId) { //如果是游客登录直接 查询发布时间最新的商品

    if(userId == null){
        log.info("智能推送{}---->商城首页"," userId == null ");
        return productInfoService.getProductBriefInfoByPage(currentPage, pageSize);
    }
    //获得存储在redis中的实时推荐的商品id的list
    String redisKey = RedisUtil.getProductRealtimeRecommendListKey(userId);
    Boolean aBoolean = redisTemplate.hasKey(redisKey);
    //直接返回redis的的数据
    if(aBoolean){
        log.info("智能推送{}---->商城首页","redis存储实时推荐商品id的list");
        return getInfoFromRedis(pageSize, currentPage, redisKey);
    }

    //MongoDB的数据,这里找不到数据所以每次推荐都是离线推荐
    ProductRealtimeRecommendDto recommendInfo = productRealtimeRecommendRepository.findByUserId(userId);
    List<MongoProductInfo> recs = null;
    if(recommendInfo != null){
        recs = recommendInfo.getRecs();
    }

    String userBrowseRecordBitmap = RedisUtil.getUserBrowseRecordBitmap(BrowserType.ES_SELL_PRODUCT, userId);
    //当实时推荐中没有商品时,转到离线推荐
    if(CollectionUtils.isEmpty(recs)) {
        log.info("智能推送{}---->商城首页","实时推荐没有商品转离线推荐");
        return getOfflineRecommendListByUserId(pageSize, currentPage, userId);
    }
    //将商品信息存入redis中
    List<Long> ids = recs.stream().map(MongoProductInfo::getProductId).collect(Collectors.toList());
    ids.stream().forEach(id -> {
        if(commands.getbit(userBrowseRecordBitmap.getBytes(), id) == null){
            redisTemplate.opsForSet().add(redisKey, id);
        }
    });
    return getInfoFromRedis(pageSize, currentPage, redisKey);
}

Originally posted by @liutao-lx in https://github.com/HMingR/irh/issues/3#issuecomment-799288743

liutao-lx avatar Mar 15 '21 10:03 liutao-lx

@HMingR 大哥帮我康康是那些添加数据到MongoDB数据库的方式,在您的项目中是怎么个方式

liutao-lx avatar Mar 15 '21 10:03 liutao-lx

https://gitee.com/peng_fei_Napoleon/irh_intelligent_recommendation 这个是仓库地址,智能推荐模块是用scale写的

HMingR avatar Mar 15 '21 10:03 HMingR

我又来了,大哥有没有数据库的测试数据,您给的sql语句中少了权限表的那些数据我看的有点不懂

liutao-lx avatar Mar 22 '21 03:03 liutao-lx

我又来了,大哥有没有数据库的测试数据,您给的sql语句中少了权限表的那些数据我看的有点不懂 @HMingR 老大哥

liutao-lx avatar Mar 22 '21 12:03 liutao-lx

权限那一块是通过拦截请求的uri进行判断的,在程序刚启动的时候Gateway会把权限和角色加载到一个map中,然后在gateway拦截请求的uri进行判断。具体的我明天看看,电脑不在身边。而且说实话,权限那一块我写的很low,尤其是过期时间那一块。你先看看吧,不懂了再说哈哈

HMingR avatar Mar 22 '21 13:03 HMingR

权限那一块是通过拦截请求的uri进行判断的,在程序刚启动的时候Gateway会把权限和角色加载到一个map中,然后在gateway拦截请求的uri进行判断。具体的我明天看看,电脑不在身边。而且说实话,权限那一块我写的很low,尤其是过期时间那一块。你先看看吧,不懂了再说哈哈

嗯嗯,明天有时间发一下您的数据库数据就好了,因为项目中的sql少了权限表的很多数据有测试数据就好了,因为那个后台去掉测试logintest前端登录不上没有权限,我现在在前后台调用就会因为没有权限调用失败

liutao-lx avatar Mar 22 '21 14:03 liutao-lx

权限那一块是通过拦截请求的uri进行判断的,在程序刚启动的时候Gateway会把权限和角色加载到一个map中,然后在gateway拦截请求的uri进行判断。具体的我明天看看,电脑不在身边。而且说实话,权限那一块我写的很low,尤其是过期时间那一块。你先看看吧,不懂了再说哈哈

嗯嗯,明天有时间发一下您的数据库数据就好了,因为项目中的sql少了权限表的很多数据有测试数据就好了,因为那个后台去掉测试logintest前端登录不上没有权限,我现在在前后台调用就会因为没有权限调用失败

额,项目里面的数据就是当时测试的时候用的,其他的也没有了,你可以看看AntPathMatcher这个类,匹配请求的url和数据库里面的url的,如果你觉得是权限问题的话,你调试一下AbstractUrlFilterInvocationSecurityMetadataSource这个类和UrlAccessDecosopmManager类看看需要什么权限。是前端的问题还是后端的问题

HMingR avatar Mar 23 '21 07:03 HMingR