parent
278f83277f
commit
d9a7b8b0b3
@ -0,0 +1,25 @@
|
||||
package com.xjs.common.client.api.tianxing;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.xjs.common.aop.ApiLog;
|
||||
import com.xjs.common.client.factory.TianXingDYRSFeignFactory;
|
||||
import com.xjs.common.client.factory.TianXingWXRSFeignFactory;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import static com.xjs.consts.ApiConst.*;
|
||||
|
||||
/**
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
@FunctionalInterface
|
||||
@FeignClient(name = "tianXingDYRS",url = TIANXING_TOPSEARCHDOUYIN_URL,fallbackFactory = TianXingDYRSFeignFactory.class)
|
||||
public interface TianXingDYRSFeignClient {
|
||||
@GetMapping
|
||||
@ApiLog(name = TIANXING_TOPSEARCHDOUYIN,
|
||||
url = TIANXING_TOPSEARCHDOUYIN_URL,
|
||||
method = "Get")
|
||||
JSONObject topSearchApi(@RequestParam("key") String key);
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package com.xjs.common.client.api.tianxing;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.xjs.common.aop.ApiLog;
|
||||
import com.xjs.common.client.factory.TianXingWBRSFeignFactory;
|
||||
import com.xjs.common.client.factory.TianXingWXRSFeignFactory;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import static com.xjs.consts.ApiConst.*;
|
||||
|
||||
/**
|
||||
* 天行微博热搜feign
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
@FunctionalInterface
|
||||
@FeignClient(name = "tianXingWBRSF",url = TIANXING_TOPSEARCHWEIBO_URL,fallbackFactory = TianXingWBRSFeignFactory.class)
|
||||
public interface TianXingWBRSFeignClient {
|
||||
|
||||
@GetMapping
|
||||
@ApiLog(name = TIANXING_TOPSEARCHWEIBO,
|
||||
url = TIANXING_TOPSEARCHWEIBO_URL,
|
||||
method = "Get")
|
||||
JSONObject topSearchApi(@RequestParam("key") String key);
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.xjs.common.client.factory;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ruoyi.common.core.domain.R;
|
||||
import com.xjs.common.client.api.tianxing.TianXingDYRSFeignClient;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.cloud.openfeign.FallbackFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
@Component
|
||||
@Log4j2
|
||||
public class TianXingDYRSFeignFactory implements FallbackFactory<TianXingDYRSFeignClient> {
|
||||
@Override
|
||||
public TianXingDYRSFeignClient create(Throwable cause) {
|
||||
log.error("api模块天行抖音热搜榜服务调用失败:{},执行降级处理", cause.getMessage());
|
||||
return key -> {
|
||||
JSONObject jsonObject = new JSONObject();
|
||||
jsonObject.put("error", R.FAIL);
|
||||
return jsonObject;
|
||||
};
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.xjs.common.client.factory;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ruoyi.common.core.domain.R;
|
||||
import com.xjs.common.client.api.tianxing.TianXingWBRSFeignClient;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.cloud.openfeign.FallbackFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 天行微博热搜feign降级
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
@Log4j2
|
||||
@Component
|
||||
public class TianXingWBRSFeignFactory implements FallbackFactory<TianXingWBRSFeignClient> {
|
||||
@Override
|
||||
public TianXingWBRSFeignClient create(Throwable cause) {
|
||||
log.error("api模块天行微博热搜榜服务调用失败:{},执行降级处理", cause.getMessage());
|
||||
return key -> {
|
||||
JSONObject jsonObject = new JSONObject();
|
||||
//构建一个异常json给下层接口处理
|
||||
jsonObject.put("error", R.FAIL);
|
||||
return jsonObject;
|
||||
};
|
||||
}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package com.xjs.topsearch.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.FieldFill;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.ruoyi.common.core.annotation.Excel;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 抖音热搜榜实体
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
@Data
|
||||
public class ApiTopsearchDouyin implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 主键 */
|
||||
private Long id;
|
||||
|
||||
/** 热搜话题 */
|
||||
@Excel(name = "热搜话题")
|
||||
private String word;
|
||||
|
||||
/** 热搜标签 */
|
||||
@Excel(name = "热搜标签")
|
||||
private String label;
|
||||
|
||||
/** 热搜指数 */
|
||||
@Excel(name = "热搜指数")
|
||||
private Long hotindex;
|
||||
|
||||
@Excel(name = "创建时间",dateFormat = "yyyy-MM-dd HH:mm:ss")
|
||||
@TableField(fill = FieldFill.INSERT)
|
||||
private Date createTime;
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package com.xjs.topsearch.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.FieldFill;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.ruoyi.common.core.annotation.Excel;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 微博热搜实体
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
@Data
|
||||
public class ApiTopsearchWeibo implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 主键 */
|
||||
private Long id;
|
||||
|
||||
/** 热搜话题 */
|
||||
@Excel(name = "热搜话题")
|
||||
private String hotword;
|
||||
|
||||
/** 热搜指数 */
|
||||
@Excel(name = "热搜指数")
|
||||
private String hotnum;
|
||||
|
||||
/** 热搜标签 */
|
||||
@Excel(name = "热搜标签")
|
||||
private String hottag;
|
||||
|
||||
@Excel(name = "创建时间",dateFormat = "yyyy-MM-dd HH:mm:ss")
|
||||
@TableField(fill = FieldFill.INSERT)
|
||||
private Date createTime;
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package com.xjs.topsearch.factory.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ruoyi.common.core.constant.HttpStatus;
|
||||
import com.xjs.common.client.api.tianxing.TianXingDYRSFeignClient;
|
||||
import com.xjs.common.client.api.tianxing.TianXingWBRSFeignClient;
|
||||
import com.xjs.config.TianXingProperties;
|
||||
import com.xjs.topsearch.domain.ApiTopsearchDouyin;
|
||||
import com.xjs.topsearch.domain.ApiTopsearchWeibo;
|
||||
import com.xjs.topsearch.factory.TopserachFactory;
|
||||
import com.xjs.topsearch.service.ApiTopsearchDouyinService;
|
||||
import com.xjs.topsearch.service.ApiTopsearchWeiboService;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 天行抖音热搜工厂实现
|
||||
*
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
@Component
|
||||
@Log4j2
|
||||
public class TianXingTopsearchDouyinFactory implements TopserachFactory<ApiTopsearchDouyin> {
|
||||
|
||||
|
||||
@Autowired
|
||||
private TianXingProperties tianXingProperties;
|
||||
|
||||
@Autowired
|
||||
private TianXingDYRSFeignClient tianXingDYRSFeignClient;
|
||||
|
||||
@Autowired
|
||||
private ApiTopsearchDouyinService apiTopsearchDouyinService;
|
||||
|
||||
@Override
|
||||
public List<ApiTopsearchDouyin> topSearchApi() {
|
||||
JSONObject jsonObject = tianXingDYRSFeignClient.topSearchApi(tianXingProperties.getKey());
|
||||
if (!jsonObject.containsKey("error")) {
|
||||
if (jsonObject.getInteger("code") == HttpStatus.SUCCESS) {
|
||||
JSONArray newslist = jsonObject.getJSONArray("newslist");
|
||||
List<ApiTopsearchDouyin> collect = newslist.stream().map(arrayJson -> {
|
||||
ApiTopsearchDouyin apiTopsearchDouyin = new ApiTopsearchDouyin();
|
||||
JSONObject json = (JSONObject) arrayJson;
|
||||
apiTopsearchDouyin.setHotindex(json.getLong("hotindex"));
|
||||
Integer hotwordnum = json.getInteger("label");
|
||||
switch (hotwordnum) {
|
||||
case 1:
|
||||
apiTopsearchDouyin.setLabel("新");
|
||||
break;
|
||||
case 2:
|
||||
apiTopsearchDouyin.setLabel("荐");
|
||||
break;
|
||||
case 3:
|
||||
apiTopsearchDouyin.setLabel("热");
|
||||
break;
|
||||
default:
|
||||
apiTopsearchDouyin.setLabel("-");
|
||||
}
|
||||
apiTopsearchDouyin.setWord(json.getString("hotindex"));
|
||||
return apiTopsearchDouyin;
|
||||
}).collect(Collectors.toList());
|
||||
log.info("抖音热搜批量插入成功了嘛---" + apiTopsearchDouyinService.saveBatch(collect));
|
||||
return collect;
|
||||
} else {
|
||||
log.error("天行抖音热搜服务调用成功,但返回异常");
|
||||
return new ArrayList<>();
|
||||
}
|
||||
} else {
|
||||
log.error("天行抖音热搜服务调用失败,被降级!!");
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,73 @@
|
||||
package com.xjs.topsearch.factory.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ruoyi.common.core.constant.HttpStatus;
|
||||
import com.xjs.common.client.api.tianxing.TianXingWBRSFeignClient;
|
||||
import com.xjs.config.TianXingProperties;
|
||||
import com.xjs.topsearch.domain.ApiTopsearchWechat;
|
||||
import com.xjs.topsearch.domain.ApiTopsearchWeibo;
|
||||
import com.xjs.topsearch.factory.TopserachFactory;
|
||||
import com.xjs.topsearch.service.ApiTopsearchWeiboService;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 微博热搜api工厂实现
|
||||
*
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
@Component
|
||||
@Log4j2
|
||||
public class TianXingTopsearchWeiboFactory implements TopserachFactory<ApiTopsearchWeibo> {
|
||||
|
||||
@Autowired
|
||||
private TianXingProperties tianXingProperties;
|
||||
|
||||
@Autowired
|
||||
private TianXingWBRSFeignClient tianXingWBRSFeignClient;
|
||||
|
||||
@Autowired
|
||||
private ApiTopsearchWeiboService apiTopsearchWeiboService;
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public List<ApiTopsearchWeibo> topSearchApi() {
|
||||
JSONObject jsonObject = tianXingWBRSFeignClient.topSearchApi(tianXingProperties.getKey());
|
||||
if (!jsonObject.containsKey("error")) {
|
||||
if (jsonObject.getInteger("code") == HttpStatus.SUCCESS) {
|
||||
JSONArray newslist = jsonObject.getJSONArray("newslist");
|
||||
List<ApiTopsearchWeibo> collect = newslist.stream().map(arrayJson -> {
|
||||
ApiTopsearchWeibo apiTopsearchWeibo = new ApiTopsearchWeibo();
|
||||
JSONObject json = (JSONObject) arrayJson;
|
||||
apiTopsearchWeibo.setHotword(json.getString("hotword"));
|
||||
apiTopsearchWeibo.setHotnum(json.getString("hotwordnum"));
|
||||
apiTopsearchWeibo.setHottag(json.getString("hottag"));
|
||||
return apiTopsearchWeibo;
|
||||
}).collect(Collectors.toList());
|
||||
log.info("微博热搜批量插入成功了嘛---" + apiTopsearchWeiboService.saveBatch(collect));
|
||||
return collect;
|
||||
} else {
|
||||
log.error("天行微博热搜服务调用成功,但返回异常");
|
||||
return new ArrayList<>();
|
||||
}
|
||||
} else {
|
||||
log.error("天行微博热搜服务调用失败,被降级!!");
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.xjs.topsearch.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.xjs.topsearch.domain.ApiTopsearchDouyin;
|
||||
|
||||
/**
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
public interface ApiTopsearchDouyinMapper extends BaseMapper<ApiTopsearchDouyin> {
|
||||
/**
|
||||
* 删除抖音热搜重复数据
|
||||
* @return Integer
|
||||
*/
|
||||
Integer deleteRepeatData();
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.xjs.topsearch.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.xjs.topsearch.domain.ApiTopsearchWeibo;
|
||||
|
||||
/**
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
public interface ApiTopsearchWeiboMapper extends BaseMapper<ApiTopsearchWeibo> {
|
||||
/**
|
||||
* 删除微博热搜重复数据
|
||||
* @return Integer
|
||||
*/
|
||||
Integer deleteRepeatData();
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package com.xjs.topsearch.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.xjs.topsearch.domain.ApiTopsearchDouyin;
|
||||
|
||||
/**
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
public interface ApiTopsearchDouyinService extends IService<ApiTopsearchDouyin> {
|
||||
|
||||
/**
|
||||
* 删除抖音热搜重复数据
|
||||
* @return Integer
|
||||
*/
|
||||
Integer deleteRepeatData();
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.xjs.topsearch.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.xjs.topsearch.domain.ApiTopsearchWeibo;
|
||||
|
||||
/**
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
public interface ApiTopsearchWeiboService extends IService<ApiTopsearchWeibo> {
|
||||
/**
|
||||
* 删除微博热搜重复数据
|
||||
* @return Integer
|
||||
*/
|
||||
Integer deleteRepeatData();
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package com.xjs.topsearch.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.xjs.topsearch.domain.ApiTopsearchDouyin;
|
||||
import com.xjs.topsearch.mapper.ApiTopsearchDouyinMapper;
|
||||
import com.xjs.topsearch.service.ApiTopsearchDouyinService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
@Service
|
||||
public class ApiTopsearchDouyinServiceImpl extends ServiceImpl<ApiTopsearchDouyinMapper, ApiTopsearchDouyin> implements ApiTopsearchDouyinService {
|
||||
@Resource
|
||||
private ApiTopsearchDouyinMapper apiTopsearchDouyinMapper;
|
||||
|
||||
@Override
|
||||
public Integer deleteRepeatData() {
|
||||
return apiTopsearchDouyinMapper.deleteRepeatData();
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package com.xjs.topsearch.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.xjs.topsearch.domain.ApiTopsearchWeibo;
|
||||
import com.xjs.topsearch.mapper.ApiTopsearchWeiboMapper;
|
||||
import com.xjs.topsearch.service.ApiTopsearchWeiboService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* @author xiejs
|
||||
* @since 2022-01-12
|
||||
*/
|
||||
@Service
|
||||
public class ApiTopsearchWeiboServiceImpl extends ServiceImpl<ApiTopsearchWeiboMapper, ApiTopsearchWeibo> implements ApiTopsearchWeiboService {
|
||||
@Resource
|
||||
private ApiTopsearchWeiboMapper apiTopsearchWeiboMapper;
|
||||
|
||||
@Override
|
||||
public Integer deleteRepeatData() {
|
||||
return apiTopsearchWeiboMapper.deleteRepeatData();
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.xjs.topsearch.mapper.ApiTopsearchBaiduMapper">
|
||||
|
||||
<delete id="deleteRepeatData">
|
||||
DELETE
|
||||
FROM
|
||||
api_topsearch_baidu
|
||||
WHERE
|
||||
title IN ( SELECT t.title FROM ( SELECT title FROM api_topsearch_baidu GROUP BY title HAVING count( title ) > 1 ) t )
|
||||
AND id NOT IN (
|
||||
SELECT
|
||||
c.id
|
||||
FROM
|
||||
( SELECT min( id ) id FROM api_topsearch_baidu GROUP BY title HAVING count( title )> 1 ) c
|
||||
)
|
||||
</delete>
|
||||
|
||||
</mapper>
|
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.xjs.topsearch.mapper.ApiTopsearchDouyinMapper">
|
||||
|
||||
<delete id="deleteRepeatData">
|
||||
DELETE
|
||||
FROM
|
||||
api_topsearch_douyin
|
||||
WHERE
|
||||
word IN ( SELECT t.word FROM ( SELECT word FROM api_topsearch_douyin GROUP BY word HAVING count( word ) > 1 ) t )
|
||||
AND id NOT IN (
|
||||
SELECT
|
||||
c.id
|
||||
FROM
|
||||
( SELECT min( id ) id FROM api_topsearch_douyin GROUP BY word HAVING count( word )> 1 ) c
|
||||
)
|
||||
</delete>
|
||||
|
||||
</mapper>
|
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.xjs.topsearch.mapper.ApiTopsearchWeiboMapper">
|
||||
|
||||
<delete id="deleteRepeatData">
|
||||
DELETE
|
||||
FROM
|
||||
api_topsearch_weibo
|
||||
WHERE
|
||||
hotword IN ( SELECT t.hotword FROM ( SELECT hotword FROM api_topsearch_weibo GROUP BY hotword HAVING count( hotword ) > 1 ) t )
|
||||
AND id NOT IN (
|
||||
SELECT
|
||||
c.id
|
||||
FROM
|
||||
( SELECT min( id ) id FROM api_topsearch_weibo GROUP BY hotword HAVING count( hotword )> 1 ) c
|
||||
)
|
||||
</delete>
|
||||
|
||||
</mapper>
|
Loading…
Reference in new issue