添加金价走势图

master
bynt 2 years ago
parent 8f3ca8c62a
commit dd6df84346

@ -9,10 +9,13 @@ import java.io.Serializable;
* @date : 2022/3/3 * @date : 2022/3/3
*/ */
@Data @Data
public class AnalyticalDataResponse implements Serializable { public class ApiDataResponse<T extends Serializable> implements Serializable {
private static final long serialVersionUID = -489610332459754084L;
private int status; private int status;
private String msg; private String msg;
private Object data; private T data;
} }

@ -0,0 +1,87 @@
package me.zhengjie.utils;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.net.url.UrlBuilder;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.netty.util.CharsetUtil;
import me.zhengjie.exception.BadRequestException;
import org.springframework.http.HttpHeaders;
import java.util.Date;
/**
* @author Enzo
* @date : 2022/3/30
*/
public class ResponseUtil {
private ResponseUtil(){
}
public static JSONObject goldRequest(Long days,String goldCode, Date startDate,Date endDate) {
// 拼接url请求
String buildUrl = UrlBuilder.create()
.setScheme("https")
.setHost("api.jijinhao.com")
.addPath("/quoteCenter").addPath("history.htm")
.addQuery("style", String.valueOf(3))
.addQuery("pageSize", String.valueOf(days)).addQuery("code", goldCode)
.addQuery("startDate", cn.hutool.core.date.DateUtil.format(startDate, DatePattern.NORM_DATE_PATTERN))
.addQuery("endDate", DateUtil.format(endDate, DatePattern.NORM_DATE_PATTERN)).build();
String body = HttpUtil.createGet(buildUrl)
.header(HttpHeaders.REFERER,
"https://quote.cngold.org/")
.execute()
.charset(CharsetUtil.UTF_8)
.body();
// 去除不需要数据替换空格
String resultString = StrUtil.trimToEmpty
(StrUtil.subAfter(body, "=", Boolean.FALSE));
if (resultString.contains("true")) {
return JSON.parseObject(resultString);
}
throw new BadRequestException("the request error");
}
public static JSONObject firstGoldRequest(String bindStr,String vidStr,String rowStr,String pageStr,Date startDate,Date endDate) {
// 拼接url请求
String buildUrl = UrlBuilder.create()
.setScheme("http")
.setHost("www.dyhjw.com")
.addPath("/api").addPath("ajax.html")
.addQuery("jindian_getPriceScope[bid]", bindStr)
.addQuery("jindian_getPriceScope[vid]", vidStr)
.addQuery("jindian_getPriceScope[stime]", DateUtil.format(startDate, DatePattern.NORM_DATE_PATTERN))
.addQuery("jindian_getPriceScope[etime]", DateUtil.format(endDate, DatePattern.NORM_DATE_PATTERN))
.addQuery("jindian_getPriceScope[row]", rowStr)
.addQuery("jindian_getPriceScope[page]", pageStr)
.build();
String body = HttpUtil.createGet(buildUrl).execute().charset(CharsetUtil.UTF_8).body();
// 去除不需要数据替换空格
String resultString = StrUtil.trimToEmpty(body);
if (resultString.contains("data") &&
JSON.parseObject(JSON.parseObject(resultString).get("jindian_getPriceScope").toString()).get("status").equals("1")) {
String byLength =
resultString.substring(
resultString.indexOf(StrUtil.DELIM_START,
resultString.indexOf(StrUtil.DELIM_START) + 1), resultString.length() - 1);
return JSON.parseObject(JSON.parseObject(byLength).get("data").toString());
}
throw new BadRequestException("the request error");
}
}

@ -0,0 +1,43 @@
package me.zhengjie.utils.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author Enzo
* @date : 2022/4/7
*/
@Getter
@AllArgsConstructor
public enum FirstGoldEnums {
/**
*
*/
ZDF("1", "1"),
/**
*
*/
ZDS("10", "48"),
/**
*
*/
LFX("2", "8");
private final String bid;
private final String vid;
static final Map<String,FirstGoldEnums> GOLD_ENUMS_MAP = new ConcurrentHashMap<>();
static {
GOLD_ENUMS_MAP.put("JO_42660", FirstGoldEnums.ZDF);
GOLD_ENUMS_MAP.put("JO_42657", FirstGoldEnums.LFX);
GOLD_ENUMS_MAP.put("JO_52678", FirstGoldEnums.ZDF);
}
}

@ -0,0 +1,82 @@
package me.zhengjie.utils.enums;
import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author Enzo
* @date : 2022/3/22
*/
@Getter
@AllArgsConstructor
public enum GoldCodeEnums {
/**
*
*/
ZDF("zdf", "JO_42660"),
/**
*
*/
LFX("lfx", "JO_42657"),
/**
*
*/
ZLF("zlf", "JO_42653"),
/**
*
*/
ZSS("zss", "JO_42625"),
/**
*
*/
LFZB("lfzb", "JO_42646"),
/**
*
*/
CB("cb", "JO_42638"),
/**
*
*/
JZZ("jzz", "JO_42632"),
/**
*
*/
LM("lm", "JO_42634"),
/**
*
*/
CHJ("chj", "JO_52670"),
/**
*
*/
ZDS("zds", "JO_52678"),
/**
*
*/
ZGHJ("zghj", "JO_9753");
private final String code;
private final String shorthand;
public static String findCode(String shorthand) {
for (GoldCodeEnums value : GoldCodeEnums.values()) {
if (shorthand.equalsIgnoreCase(value.getCode())) {
return value.getShorthand();
}
}
return StrUtil.EMPTY;
}
}

@ -6,6 +6,8 @@ package me.zhengjie.modules.constant;
*/ */
public class DefaultConstant { public class DefaultConstant {
private DefaultConstant() {
}
/** /**
@ -34,6 +36,11 @@ public class DefaultConstant {
*/ */
public static final int FIVE_NUMBER = 5; public static final int FIVE_NUMBER = 5;
/**
* 7
*/
public static final int SEVEN_NUMBER = 7;
/** /**
* 10 * 10
*/ */
@ -54,7 +61,10 @@ public class DefaultConstant {
public static final int THIRTEEN_NUMBER = 13; public static final int THIRTEEN_NUMBER = 13;
/**
* 200
*/
public static final int TWO_HUNDRED_NUMBER = 200;
/** /**
* 999999L * 999999L

@ -11,7 +11,7 @@ import cn.hutool.poi.excel.ExcelWriter;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhengjie.common.json.AnalyticalDataResponse; import me.zhengjie.common.json.ApiDataResponse;
import me.zhengjie.constant.SystemConstant; import me.zhengjie.constant.SystemConstant;
import me.zhengjie.domain.vo.EmailVo; import me.zhengjie.domain.vo.EmailVo;
import me.zhengjie.exception.BadRequestException; import me.zhengjie.exception.BadRequestException;
@ -114,8 +114,8 @@ public class StatisticsDmpServiceImpl implements StatisticsDmpService {
String result = HttpUtil.post String result = HttpUtil.post
(SystemConstant.PARSE_DATA_LINK, jsonStr); (SystemConstant.PARSE_DATA_LINK, jsonStr);
if (StringUtils.isNotBlank(result) && result.contains("data")) { if (StringUtils.isNotBlank(result) && result.contains("data")) {
AnalyticalDataResponse response = ApiDataResponse response =
JSONUtil.toBean(result, AnalyticalDataResponse.class); JSONUtil.toBean(result, ApiDataResponse.class);
if (response.getStatus() == 0) { if (response.getStatus() == 0) {
return Convert.toMap(String.class, List.class, response.getData()); return Convert.toMap(String.class, List.class, response.getData());
} }

@ -0,0 +1,23 @@
package me.zhengjie.modules.gold.dto;
import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author Enzo
* @date : 2022/3/22
*/
@Data
public class AnalyzingGoldResponseDTO implements Serializable {
private static final long serialVersionUID = 342180031344936298L;
private Double q1;
@JsonFormat(pattern = DatePattern.NORM_DATE_PATTERN, timezone = "GMT+8")
private Date time;
}

@ -0,0 +1,24 @@
package me.zhengjie.modules.gold.dto;
import lombok.Data;
import java.util.Date;
/**
* @author Enzo
* @date : 2022/3/22
*/
@Data
public class ApiGoldPriceDTO {
private String code;
private Date endDate;
private String style;
private Date startDate;
private Integer pageSize;
}

@ -0,0 +1,22 @@
package me.zhengjie.modules.gold.dto;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author Enzo
* @date : 2022/4/7
*/
@Data
public class FirstGoldResponseDTO implements Serializable {
private static final long serialVersionUID = -4915817022920042708L;
private String bname;
private Double price;
private Date date;
}

@ -0,0 +1,32 @@
package me.zhengjie.modules.gold.dto;
import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.util.Date;
import java.util.List;
/**
* @author Enzo
* @date : 2022/3/22
*/
@Data
public class GoldRequestDTO {
@NotEmpty(message = "编号不能为空")
@ApiModelProperty("黄金编号")
private List<String> goldCodeList;
@JsonFormat(pattern = DatePattern.NORM_DATE_PATTERN)
@ApiModelProperty("开始时间")
private Date startDate;
@JsonFormat(pattern = DatePattern.NORM_DATE_PATTERN)
@ApiModelProperty("结束时间")
private Date endDate;
}

@ -0,0 +1,24 @@
package me.zhengjie.modules.gold.dto;
import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author Enzo
* @date : 2022/3/30
*/
@Data
public class TodayGoldResponseDTO implements Serializable {
private Double q1;
private String goldCode;
@JsonFormat(pattern = DatePattern.NORM_DATE_PATTERN, timezone = "GMT+8")
private Date time;
}

@ -0,0 +1,148 @@
package me.zhengjie.modules.gold.rest;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.annotation.Log;
import me.zhengjie.common.http.CommonResponse;
import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.constant.DefaultConstant;
import me.zhengjie.modules.gold.dto.AnalyzingGoldResponseDTO;
import me.zhengjie.modules.gold.dto.GoldRequestDTO;
import me.zhengjie.modules.gold.dto.TodayGoldResponseDTO;
import me.zhengjie.utils.ResponseUtil;
import me.zhengjie.utils.enums.GoldCodeEnums;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author Enzo
* @date : 2022/3/22
*/
@Slf4j
@Api("获取咨询类信息")
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/gold")
public class GoldPriceController {
@Log("获取咨询类信息")
@ApiOperation("查询金价信息")
@PostMapping("/trend")
public CommonResponse<Map<String, Object>> goldTrend
(@Validated @RequestBody GoldRequestDTO requestDTO) {
if (ObjectUtil.isNull(requestDTO.getStartDate())
&& ObjectUtil.isNull(requestDTO.getEndDate())) {
DateTime date = DateUtil.date();
requestDTO.setStartDate(DateUtil.beginOfDay
(DateUtil.offsetDay(date, -DefaultConstant.SEVEN_NUMBER)));
requestDTO.setEndDate(DateUtil.beginOfDay(date));
}
if (requestDTO.getStartDate().after(requestDTO.getEndDate())) {
throw new BadRequestException("开始时间必须大于结束时间");
}
Map<String, Object> sortedMap = new LinkedHashMap<>();
Map<String, Object> map = new HashMap<>(DefaultConstant.TWO_NUMBER);
List<TodayGoldResponseDTO> goldResponseDTOList = new ArrayList<>();
Map<String, List<AnalyzingGoldResponseDTO>> historyMap = new HashMap<>(DefaultConstant.TWELVE_NUMBER);
// 相差多少天用于分页数量
long betweenDays = DateUtil.between(requestDTO.getStartDate(), requestDTO.getEndDate(), DateUnit.DAY);
DateTime dateTime = DateUtil.beginOfDay(DateUtil.date());
for (String code : requestDTO.getGoldCodeList()) {
String goldCode = GoldCodeEnums.findCode(code);
// 发送请求
JSONObject jsonObject = ResponseUtil.goldRequest
(betweenDays, goldCode, requestDTO.getStartDate(), requestDTO.getEndDate());
// 解析数据
List<AnalyzingGoldResponseDTO> dtoArrayList = getAnalyzingGoldResponse(jsonObject);
List<AnalyzingGoldResponseDTO> todayGoldList = Lists.newArrayList(dtoArrayList);
Iterator<AnalyzingGoldResponseDTO> iterator = todayGoldList.iterator();
TodayGoldResponseDTO todayGoldResponseDTO;
// 查看周几
int dayOfWeek = DateUtil.thisDayOfWeek();
if (dayOfWeek == DefaultConstant.SEVEN_NUMBER || dayOfWeek == DefaultConstant.ONE_NUMBER) {
dateTime = DateUtil.offsetDay
(dateTime, -(dayOfWeek == DefaultConstant.SEVEN_NUMBER
? DefaultConstant.ONE_NUMBER : DefaultConstant.TWO_NUMBER));
}
while (iterator.hasNext()) {
AnalyzingGoldResponseDTO next = iterator.next();
long betweenDay = DateUtil.betweenDay(dateTime, next.getTime(), Boolean.TRUE);
// 查询当天金价
if (betweenDay == DefaultConstant.ZERO_NUMBER) {
todayGoldResponseDTO = new TodayGoldResponseDTO();
BeanUtil.copyProperties(next, todayGoldResponseDTO);
todayGoldResponseDTO.setGoldCode(code);
goldResponseDTOList.add(todayGoldResponseDTO);
break;
}
}
historyMap.put(code, dtoArrayList);
}
// map排序
Stream<Map.Entry<String, List<AnalyzingGoldResponseDTO>>> st =
historyMap.entrySet().stream();
st.sorted(Comparator.comparing(e -> -(e.getValue().size()))).forEach
(e -> sortedMap.put(e.getKey(), e.getValue()));
map.put("historyGoldPrice", sortedMap);
map.put("todayGoldPrice", goldResponseDTOList);
return CommonResponse.createBySuccess(map);
}
@Log("查询当天金价")
@ApiOperation("查询当天金价")
@GetMapping("/dayPrice")
public ResponseEntity<Map<String, Object>> goldTrend(String goldCode) {
Map<String, Object> map = new HashMap<>(DefaultConstant.TWO_NUMBER);
DateTime dateTime = DateUtil.beginOfDay(DateUtil.date());
String shortCode = GoldCodeEnums.findCode(goldCode);
JSONObject jsonObject = ResponseUtil.goldRequest
(Long.parseLong(String.valueOf(DefaultConstant.ONE_NUMBER)), shortCode, dateTime, dateTime);
List<AnalyzingGoldResponseDTO> dtoArrayList = getAnalyzingGoldResponse(jsonObject);
if (CollUtil.isNotEmpty(dtoArrayList)) {
Iterator<AnalyzingGoldResponseDTO> iterator = dtoArrayList.iterator();
while (iterator.hasNext()) {
AnalyzingGoldResponseDTO next = iterator.next();
long betweenDay = DateUtil.betweenDay(dateTime, next.getTime(), Boolean.TRUE);
if (betweenDay != DefaultConstant.ZERO_NUMBER) {
iterator.remove();
}
}
}
map.put(goldCode, dtoArrayList);
return new ResponseEntity<>(map, HttpStatus.OK);
}
private List<AnalyzingGoldResponseDTO> getAnalyzingGoldResponse(JSONObject jsonObject) {
// 解析数据
List<AnalyzingGoldResponseDTO> dtoList =
Convert.toList(AnalyzingGoldResponseDTO.class,
jsonObject.get("data"));
// 时间去除
return dtoList.stream()
.collect(Collectors.collectingAndThen(Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(AnalyzingGoldResponseDTO::getTime))), ArrayList::new));
}
}

@ -123,6 +123,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/api/smsConfiguration/detail").permitAll() .antMatchers("/api/smsConfiguration/detail").permitAll()
// 爬取数据请求 用户小程序过审 By Enzo // 爬取数据请求 用户小程序过审 By Enzo
.antMatchers("/api/consult/**").permitAll() .antMatchers("/api/consult/**").permitAll()
.antMatchers("/api/gold/**").permitAll()
// 放行OPTIONS请求 // 放行OPTIONS请求
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll() .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
// 自定义匿名访问所有url放行允许匿名和带Token访问细腻化到每个 Request 类型 // 自定义匿名访问所有url放行允许匿名和带Token访问细腻化到每个 Request 类型

Loading…
Cancel
Save