hl 1 rok pred
rodič
commit
08bec46201
27 zmenil súbory, kde vykonal 1274 pridanie a 1 odobranie
  1. 10 0
      hot_collection/Dockerfile
  2. 116 0
      hot_collection/pom.xml
  3. 20 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/HotCollectionApp.java
  4. 135 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/aop/TaskHot.java
  5. 59 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/controller/ApiController.java
  6. 16 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/controller/TestController.java
  7. 74 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/dingding/DingTalkPushUtil.java
  8. 26 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/domain/aop/HotObj.java
  9. 37 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/domain/base/PageBean.java
  10. 19 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/domain/dto/HotSymbolDto.java
  11. 39 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/domain/entity/HotSymbol.java
  12. 12 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/domain/params/FindHotParams.java
  13. 11 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/domain/params/FindHotSymbolParams.java
  14. 17 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/domain/params/PageParams.java
  15. 100 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/exchanges/BinanceTool.java
  16. 13 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/exchanges/ExchangeTool.java
  17. 97 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/exchanges/GateTool.java
  18. 64 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/filter/BasicFilter.java
  19. 50 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/filter/CoreFilter.java
  20. 16 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/mapper/HotSymbolMapper.java
  21. 70 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/res/R.java
  22. 15 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/service/IHotSymbolService.java
  23. 127 0
      hot_collection/src/main/java/com/liangjiang/hot_collection/service/impl/HotSymbolServiceImpl.java
  24. 60 0
      hot_collection/src/main/resources/application.yml
  25. 51 0
      hot_collection/src/main/resources/log.xml
  26. 19 0
      hot_collection/src/main/resources/mapper/HotSymbolMapper.xml
  27. 1 1
      pom.xml

+ 10 - 0
hot_collection/Dockerfile

@@ -0,0 +1,10 @@
+# 拉取jdk8作为基础镜像
+FROM openjdk:8
+# 作者
+#MAINTAINER zbdemo <zbdemo@163.com>
+# 添加jar到镜像并命名为user.jar
+ADD hot_collection.jar /app/hot_collection.jar
+# 镜像启动后暴露的端口
+EXPOSE 84
+# jar运行命令,参数使用逗号隔开
+ENTRYPOINT ["java","-jar","/app/hot_collection.jar"]

+ 116 - 0
hot_collection/pom.xml

@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <parent>
+        <artifactId>market_warehouse</artifactId>
+        <groupId>com.liangjiang</groupId>
+        <version>1.0</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>hot_collection</artifactId>
+    <packaging>jar</packaging>
+    <name>${project.artifactId}</name>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!-- druid数据源驱动 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+        </dependency>
+        <!-- activemq -->
+        <!--json-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <!-- 由于SpringBoot 2.x中默认并没有使用Redis连接池,所以需要添加commons-pool2的依赖 -->
+        <!--        <dependency>-->
+        <!--            <groupId>org.apache.commons</groupId>-->
+        <!--            <artifactId>commons-pool2</artifactId>-->
+        <!--        </dependency>-->
+        <!--        &lt;!&ndash;redis依赖配置&ndash;&gt;-->
+        <!--        <dependency>-->
+        <!--            <groupId>org.springframework.boot</groupId>-->
+        <!--            <artifactId>spring-boot-starter-data-redis</artifactId>-->
+        <!--        </dependency>-->
+        <!-- hutool  一个常用工具集 -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper</artifactId>
+            <version>6.1.0</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>hot_collection</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>utf-8</encoding>
+                </configuration>
+            </plugin>
+            <!--打包一个JAR-->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>com.liangjiang.hot_collection.HotCollectionApp</mainClass>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 20 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/HotCollectionApp.java

@@ -0,0 +1,20 @@
+package com.liangjiang.hot_collection;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+import java.util.TimeZone;
+
+@EnableScheduling
+@SpringBootApplication
+@EnableAspectJAutoProxy
+
+public class HotCollectionApp {
+    public static void main(String[] args) {
+        // 设置时区
+        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
+        SpringApplication.run(HotCollectionApp.class, args);
+    }
+}

+ 135 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/aop/TaskHot.java

@@ -0,0 +1,135 @@
+package com.liangjiang.hot_collection.aop;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.liangjiang.hot_collection.dingding.DingTalkPushUtil;
+import com.liangjiang.hot_collection.domain.aop.HotObj;
+import com.liangjiang.hot_collection.domain.entity.HotSymbol;
+import com.liangjiang.hot_collection.exchanges.BinanceTool;
+import com.liangjiang.hot_collection.exchanges.GateTool;
+import com.liangjiang.hot_collection.service.IHotSymbolService;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 定时 拉交易所的 价格变化
+ */
+@Slf4j
+@Aspect
+@Component
+public class TaskHot {
+    public static List<HotObj> hotListBinance = new ArrayList<>();
+    public static List<HotObj> hotListGate = new ArrayList<>();
+    public static Map<String, HotObj> mapHotObj = new HashMap<>();
+    public static Map<String, HotObj> dynamic = new HashMap<>();
+
+    @Autowired
+    private BinanceTool binanceTool;
+    @Autowired
+    private GateTool gateTool;
+    @Autowired
+    private DingTalkPushUtil dingTalkPushUtil;
+    @Autowired
+    private IHotSymbolService iHotSymbolService;
+
+    @Scheduled(fixedRate = 5 * 1000)
+    public void performTask() {
+        log.info("performTask");
+        //获取交易所信息。
+        List<HotObj> hot_binance = binanceTool.getHot();
+        List<HotObj> hot_gate = gateTool.getHot();
+        hotListBinance = hot_binance;
+        hotListGate = hot_gate;
+        //合并一起
+        Map<String, HotObj> map = new HashMap<>();
+        for (HotObj h : hotListBinance) {
+            String symbol = h.getSymbol().replace("_", "");
+            map.put(symbol, h);
+        }
+        for (HotObj h : hotListGate) {
+            h.setSymbol(h.getSymbol().replace("_", ""));
+            String symbol = h.getSymbol();
+            if (map.containsKey(symbol)) {
+                HotObj val = map.get(symbol);
+                val.setExchange(val.getExchange() + "|gate");
+                map.put(symbol, val);
+            } else {
+                map.put(symbol, h);
+            }
+        }
+        mapHotObj = map;
+
+        //生成变更记录
+        int[] fudu = {15, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200};
+
+        for (String key : mapHotObj.keySet()) {
+            HotObj hotObj = mapHotObj.get(key);
+
+            String diefu = hotObj.getDiefu();
+            String diefuStr = hotObj.getDiefuStr();
+            String volume = hotObj.getVolume();
+            String volumeStr = hotObj.getVolumeStr();
+            String symbol = hotObj.getSymbol();
+            String exchange = hotObj.getExchange();
+
+            for (int i = fudu.length - 1; i >= 0; i--) {
+                if (Double.parseDouble(diefu) > fudu[i]) {
+                    dynamic.put(hotObj.getSymbol(), hotObj);
+//                    log.info("通知:" + symbol + " ▲上涨" + diefuStr + "% " + exchange + "-->" + volumeStr);
+                    break;
+                }
+            }
+        }
+    }
+
+    @Scheduled(fixedRate = 1 * 60 * 60 * 1000)
+//    @Scheduled(fixedRate = 5 * 1000)
+    public void performTaskDingDing() {
+        List<HotSymbol> saveBatch = new ArrayList<>();
+        StringBuilder str = new StringBuilder();
+        for (String key : dynamic.keySet()) {
+            HotObj hotObj = dynamic.get(key);
+            str.append("\n" + hotObj.getSymbol() + " ▲上涨" + hotObj.getDiefuStr() + " " + hotObj.getExchange() + "-->" + hotObj.getVolumeStr());
+
+            saveBatch.add(new HotSymbol()
+                    .setExchange(hotObj.getExchange())
+                    .setSymbol(hotObj.getSymbol())
+                    .setDiefu(hotObj.getDiefu())
+                    .setVolume(hotObj.getVolume())
+                    .setTime(new Date())
+            );
+        }
+
+        //发送钉钉推送
+        if (str.toString().length() > 0) {
+            dingTalkPushUtil.pushText(str.toString());
+        }
+        //做一次数据库存储
+        if (saveBatch.size() > 0) {
+            iHotSymbolService.saveBatch(saveBatch);
+        }
+    }
+
+    @Scheduled(fixedRate = 24 * 60 * 60 * 1000)
+//    @Scheduled(fixedRate = 60 * 1000)
+    public void delTaskDingDing() {
+        //每天删除前一天
+        // 获取当前日期的实例
+        Calendar calendar = Calendar.getInstance();
+        // 减去一天
+//        calendar.add(Calendar.DATE, -1);
+        // 创建一个日期格式化对象
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        // 格式化前一天的日期
+        String yesterdayStr = formatter.format(calendar.getTime());
+        log.info("时间:" + yesterdayStr);
+        iHotSymbolService.remove(new LambdaQueryWrapper<HotSymbol>().like(HotSymbol::getTime, yesterdayStr));
+    }
+}

+ 59 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/controller/ApiController.java

@@ -0,0 +1,59 @@
+package com.liangjiang.hot_collection.controller;
+
+
+import com.liangjiang.hot_collection.dingding.DingTalkPushUtil;
+import com.liangjiang.hot_collection.domain.aop.HotObj;
+import com.liangjiang.hot_collection.domain.base.PageBean;
+import com.liangjiang.hot_collection.domain.dto.HotSymbolDto;
+import com.liangjiang.hot_collection.domain.params.FindHotParams;
+import com.liangjiang.hot_collection.domain.params.FindHotSymbolParams;
+import com.liangjiang.hot_collection.res.R;
+import com.liangjiang.hot_collection.service.IHotSymbolService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import static com.liangjiang.hot_collection.aop.TaskHot.hotListBinance;
+import static com.liangjiang.hot_collection.aop.TaskHot.hotListGate;
+
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api")
+public class ApiController {
+
+    @Autowired
+    private DingTalkPushUtil dingTalkPushUtil;
+
+    @GetMapping("/3")
+    public void da() {
+        dingTalkPushUtil.pushText("短信链接");
+    }
+
+    @Autowired
+    private IHotSymbolService iHotSymbolService;
+
+    //热点币列表
+    @GetMapping("/getHotMonitoring")
+    public R init(FindHotSymbolParams params) {
+        PageBean<HotSymbolDto> data = iHotSymbolService.findHotSymbolPage(params);
+        return R.ok(data);
+    }
+
+    //热点币
+    @GetMapping("/getHot")
+    public R init(FindHotParams params) {
+        PageBean<HotObj> data = iHotSymbolService.findHotPage(params);
+        return R.ok(data);
+    }
+
+
+}

+ 16 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/controller/TestController.java

@@ -0,0 +1,16 @@
+package com.liangjiang.hot_collection.controller;
+
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/test")
+public class TestController {
+
+    @GetMapping("/ok")
+    public String ok() {
+        return "success";
+    }
+}

+ 74 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/dingding/DingTalkPushUtil.java

@@ -0,0 +1,74 @@
+package com.liangjiang.hot_collection.dingding;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpHost;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 钉钉推送工具类
+ */
+@Slf4j
+@Async
+@Component
+public class DingTalkPushUtil {
+    @Value("${proxy-address-this}")
+    private String proxyAddress;
+
+    /**
+     * 推送消息
+     */
+    public void pushText(String content) {
+        //api
+        HttpPost httpPost = new HttpPost("https://oapi.dingtalk.com/robot/send?access_token=f4893f9c1047dc8f6e1f9603e36bfdcab6e517fdd0a726aa70edb0fff49d574c");
+        httpPost.setHeader("Content-Type", "application/json");
+        JSONObject jsonParam = new JSONObject();
+        jsonParam.put("msgtype", "text");
+        JSONObject jsonText = new JSONObject();
+        jsonText.put("content", "通知:" + content);
+        jsonParam.put("text", jsonText);
+        StringEntity entity = new StringEntity(jsonParam.toString(), StandardCharsets.UTF_8);
+        httpPost.setEntity(entity);
+
+        CloseableHttpClient httpClient = null;
+        //是否开启代理
+        if (StringUtils.hasLength(proxyAddress)) {
+            log.debug("开启代理:");
+            String[] split = proxyAddress.split(":");
+            HttpHost proxy = new HttpHost(split[0], Integer.parseInt(split[1]));
+            RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
+            httpClient = HttpClients.custom().setDefaultRequestConfig(config).build();
+        } else {
+            log.debug("没有代理:");
+            httpClient = HttpClients.createDefault();
+        }
+
+        try {
+            CloseableHttpResponse response = httpClient.execute(httpPost);
+            // 获取响应状态码
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode != 200) {
+                log.error("请求错误:" + statusCode);
+            } else {
+                // 获取响应内容
+                String responseBody = EntityUtils.toString(response.getEntity());
+                log.info("发送成功:" + statusCode);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}

+ 26 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/domain/aop/HotObj.java

@@ -0,0 +1,26 @@
+package com.liangjiang.hot_collection.domain.aop;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+@Accessors(chain = true)
+public class HotObj {
+    //交易所
+    private String exchange;
+    private String symbol;
+    //价格变更百分
+    private String diefu;
+    private String diefuStr;
+    //24小时成交额
+    private String volume;
+    private String volumeStr;
+    //当前时间
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date time;
+}

+ 37 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/domain/base/PageBean.java

@@ -0,0 +1,37 @@
+package com.liangjiang.hot_collection.domain.base;
+
+import com.github.pagehelper.Page;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.LinkedList;
+import java.util.List;
+
+@Data
+public class PageBean<T> implements Serializable {
+    private long total;
+    private List<T> list;
+    private int pageNum;
+    private int pageSize;
+    private int pages;
+
+
+    public PageBean(List<T> list) {
+        if (list instanceof Page){
+            Page<T> page = (Page<T>) list;
+            this.pageNum = page.getPageNum();
+            this.pageSize = page.getPageSize();
+            this.total = page.getTotal();
+            this.pages = page.getPages();
+            this.list = page;
+        }
+    }
+
+    public PageBean() {
+        this.total = 0L;
+        this.list = new LinkedList<>();
+        this.pages = 0;
+        this.pageNum = 0;
+        this.pageSize = 0;
+    }
+}

+ 19 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/domain/dto/HotSymbolDto.java

@@ -0,0 +1,19 @@
+package com.liangjiang.hot_collection.domain.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+public class HotSymbolDto {
+    private Integer id;
+    private String exchange;
+    private String symbol;
+    private String diefu;
+    private String volume;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date timeStr;
+}

+ 39 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/domain/entity/HotSymbol.java

@@ -0,0 +1,39 @@
+package com.liangjiang.hot_collection.domain.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("hot_symbol")
+@Accessors(chain = true)
+public class HotSymbol implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("exchange")
+    private String exchange;
+
+    @TableField("symbol")
+    private String symbol;
+    @TableField("diefu")
+    private String diefu;
+    @TableField("volume")
+    private String volume;
+    @TableField("time")
+    private Date time;
+
+}

+ 12 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/domain/params/FindHotParams.java

@@ -0,0 +1,12 @@
+package com.liangjiang.hot_collection.domain.params;
+
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FindHotParams extends PageParams {
+   private String exchange;
+    private String sort;
+}

+ 11 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/domain/params/FindHotSymbolParams.java

@@ -0,0 +1,11 @@
+package com.liangjiang.hot_collection.domain.params;
+
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FindHotSymbolParams extends PageParams {
+    private int  z;
+}

+ 17 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/domain/params/PageParams.java

@@ -0,0 +1,17 @@
+package com.liangjiang.hot_collection.domain.params;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class PageParams implements Serializable {
+    /**
+     * 一页大小
+     */
+    private Integer pageSize;
+    /**
+     * 页码
+     */
+    private Integer pageNum;
+}

+ 100 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/exchanges/BinanceTool.java

@@ -0,0 +1,100 @@
+package com.liangjiang.hot_collection.exchanges;
+
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.liangjiang.hot_collection.dingding.DingTalkPushUtil;
+import com.liangjiang.hot_collection.domain.aop.HotObj;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpHost;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+import java.util.*;
+
+@Slf4j
+@Component
+public class BinanceTool implements ExchangeTool {
+    @Value("${proxy-address-this}")
+    private String proxyAddress;
+
+    @Autowired
+    private DingTalkPushUtil dingTalkPushUtil;
+
+    @Override
+    public List<HotObj> getHot() {
+        List<HotObj> list = new ArrayList<>();
+        //api
+        HttpGet httpGet = new HttpGet("https://fapi.binance.com/fapi/v1/ticker/24hr");
+        CloseableHttpClient httpClient = null;
+
+        //是否开启代理
+        if (StringUtils.hasLength(proxyAddress)) {
+//            log.debug("开启代理:");
+            String[] split = proxyAddress.split(":");
+            HttpHost proxy = new HttpHost(split[0], Integer.parseInt(split[1]));
+            RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
+            httpClient = HttpClients.custom().setDefaultRequestConfig(config).build();
+        } else {
+//            log.debug("没有代理:");
+            httpClient = HttpClients.createDefault();
+        }
+        try {
+            CloseableHttpResponse response = httpClient.execute(httpGet);
+            // 获取响应状态码
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode != 200) {
+                log.error("请求错误:" + statusCode);
+                return null;
+            } else {
+                // 获取响应内容
+                String responseBody = EntityUtils.toString(response.getEntity());
+                JSONArray array = new JSONArray(responseBody);
+                for (int i = 0; i < array.size(); i++) {
+                    JSONObject obj = (JSONObject) array.get(i);
+//                    log.info("binance:" + obj.toString());
+                    //拿到字符串
+                    String symbol = obj.get("symbol", String.class);
+                    String volumeStr = obj.get("quoteVolume", String.class);
+                    String diefuStr = obj.get("priceChangePercent", String.class);
+
+                    //转double
+                    double volume = Double.parseDouble(volumeStr);
+                    double diefu = Double.parseDouble(diefuStr);
+
+                    //保留两位小数
+                    String volume2 =  (String.format("%.2f", volume));
+                    String diefu2 =  (String.format("%.2f", diefu));
+
+                    String volumeString = "";
+                    if (volume > 100000000) {
+                        volumeString = (volume / 100000000) + "亿";
+                    } else {
+                        volumeString = (volume / 10000) + "万";
+                    }
+
+                    list.add(new HotObj()
+                            .setSymbol(symbol)
+                            .setExchange("binance")
+                            .setDiefu(diefu2)
+                            .setDiefuStr(diefu+"%")
+                            .setVolume(volume2)
+                            .setVolumeStr(volumeString)
+                            .setTime(new Date())
+                    );
+                }
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return list;
+    }
+}

+ 13 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/exchanges/ExchangeTool.java

@@ -0,0 +1,13 @@
+package com.liangjiang.hot_collection.exchanges;
+
+
+import com.liangjiang.hot_collection.domain.aop.HotObj;
+
+import java.util.List;
+
+/**
+ * 工具
+ * */
+public interface ExchangeTool {
+    List<HotObj> getHot();
+}

+ 97 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/exchanges/GateTool.java

@@ -0,0 +1,97 @@
+package com.liangjiang.hot_collection.exchanges;
+
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.liangjiang.hot_collection.domain.aop.HotObj;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpHost;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Slf4j
+@Component
+public class GateTool implements ExchangeTool {
+    @Value("${proxy-address-this}")
+    private String proxyAddress;
+
+    @Override
+    public List<HotObj> getHot() {
+        List<HotObj> list = new ArrayList<>();
+        //api
+        HttpGet httpGet = new HttpGet("https://api.gateio.ws/api/v4/futures/usdt/tickers");
+        CloseableHttpClient httpClient = null;
+
+        //是否开启代理
+        if (StringUtils.hasLength(proxyAddress)) {
+//            log.debug("开启代理:");
+            String[] split = proxyAddress.split(":");
+            HttpHost proxy = new HttpHost(split[0], Integer.parseInt(split[1]));
+            RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
+            httpClient = HttpClients.custom().setDefaultRequestConfig(config).build();
+        } else {
+//            log.debug("没有代理:");
+            httpClient = HttpClients.createDefault();
+        }
+        try {
+            CloseableHttpResponse response = httpClient.execute(httpGet);
+            // 获取响应状态码
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode != 200) {
+                log.error("请求错误:" + statusCode);
+                return null;
+            } else {
+                // 获取响应内容
+                String responseBody = EntityUtils.toString(response.getEntity());
+                JSONArray array = new JSONArray(responseBody);
+                for (int i = 0; i < array.size(); i++) {
+                    JSONObject obj = (JSONObject) array.get(i);
+//                    log.info("gate:" + obj.toString());
+                    //拿到字符串
+                    String symbol = obj.get("contract", String.class);
+                    String diefuStr = obj.get("change_percentage", String.class);
+                    String volumeStr = obj.get("volume_24h_quote", String.class);
+
+                    //转double
+                    double volume = Double.parseDouble(volumeStr);
+                    double diefu = Double.parseDouble(diefuStr);
+
+                    //保留两位小数
+                    String volume2 =  (String.format("%.2f", volume));
+                    String diefu2 =  (String.format("%.2f", diefu));
+
+                    String volumeString = "";
+                    if (volume > 100000000) {
+                        volumeString = (volume / 100000000) + "亿";
+                    } else {
+                        volumeString = (volume / 10000) + "万";
+                    }
+
+                    list.add(new HotObj()
+                            .setSymbol(symbol)
+                            .setExchange("gate")
+                            .setDiefu(diefu2)
+                            .setDiefuStr(diefu2+"%")
+                            .setVolume(volume2)
+                            .setVolumeStr(volumeString)
+                            .setTime(new Date())
+                    );
+                }
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return list;
+    }
+}

+ 64 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/filter/BasicFilter.java

@@ -0,0 +1,64 @@
+package com.liangjiang.hot_collection.filter;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Component
+public class BasicFilter implements Filter {
+
+    private static final String AUTH_STR = "4L";
+
+    @Override
+    public void init(FilterConfig filterConfig) {
+
+    }
+
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+        HttpServletRequest request = (HttpServletRequest) servletRequest;
+        HttpServletResponse response = (HttpServletResponse) servletResponse;
+
+        // 简单验证
+        String version = request.getHeader("auth");
+        if (!AUTH_STR.equals(version)) {
+            this.authcReq(response, HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase());
+            return;
+        }
+
+        //执行
+        filterChain.doFilter(servletRequest, servletResponse);
+    }
+
+    @Override
+    public void destroy() {
+
+    }
+
+    /**
+     * 响应访问
+     *
+     * @param response
+     * @throws IOException
+     */
+    private void authcReq(HttpServletResponse response, Integer code, String msg) throws IOException {
+        response.setHeader("Access-Control-Allow-Origin", "*");
+        response.setStatus(HttpServletResponse.SC_OK);
+        response.setContentType("application/json; charset=utf-8");
+        PrintWriter writer = response.getWriter();
+        Map<String, Object> map = new HashMap<>();
+        map.put("code", code);
+        map.put("msg", msg);
+        writer.print(JSONObject.toJSON(map));
+    }
+}

+ 50 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/filter/CoreFilter.java

@@ -0,0 +1,50 @@
+package com.liangjiang.hot_collection.filter;
+
+import org.springframework.core.annotation.Order;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Order(1)
+@Component
+public class CoreFilter implements Filter {
+
+    @Override
+    public void destroy() {
+
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response,
+                         FilterChain chain) throws IOException, ServletException {
+        HttpServletRequest req = (HttpServletRequest) request;
+        HttpServletResponse rep = (HttpServletResponse) response;
+
+        //设置允许跨域的配置
+        // 这里填写你允许进行跨域的主机ip(正式上线时可以动态配置具体允许的域名和IP)
+        rep.setHeader("Access-Control-Allow-Origin", "*");
+        // 允许的访问方法
+        rep.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
+        // Access-Control-Max-Age 用于 CORS 相关配置的缓存
+        rep.setHeader("Access-Control-Max-Age", "3600");
+        // 允许前端发送的请求头
+        rep.setHeader("Access-Control-Allow-Headers", "auth, Origin, X-Requested-With, Content-Type, Accept");
+        //若要返回cookie、携带seesion等信息则将此项设置我true
+        rep.setHeader("Access-Control-Allow-Credentials", "true");
+        if ("OPTIONS".equals(req.getMethod())){
+            rep.setStatus(HttpStatus.ACCEPTED.value());
+            return;
+        }
+        chain.doFilter(req, rep);
+
+    }
+
+    @Override
+    public void init(FilterConfig arg0) {
+
+    }
+}

+ 16 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/mapper/HotSymbolMapper.java

@@ -0,0 +1,16 @@
+package com.liangjiang.hot_collection.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.liangjiang.hot_collection.domain.dto.HotSymbolDto;
+import com.liangjiang.hot_collection.domain.entity.HotSymbol;
+import com.liangjiang.hot_collection.domain.params.FindHotSymbolParams;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface HotSymbolMapper extends BaseMapper<HotSymbol> {
+
+    List<HotSymbolDto> getHotSymbol(FindHotSymbolParams params);
+}

+ 70 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/res/R.java

@@ -0,0 +1,70 @@
+package com.liangjiang.hot_collection.res;
+
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 统一返回数据
+ * 特殊编码 5001 响应客户端,但是不用被提示框弹出
+ */
+//public class R  extends HashMap {
+@Data
+@Accessors(chain = true)
+public class R implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private int code;
+    private String msg;
+    private Object data;
+
+
+    public R() {
+        this.code = 200;
+        this.msg = "success";
+    }
+
+    public R(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public R(Object data) {
+        this.code = 200;
+        this.msg = "success";
+        this.data = data;
+    }
+
+    public R(Object data, String msg) {
+        this.code = 200;
+        this.msg = msg;
+        this.data = data;
+    }
+
+    public static R error(String msg) {
+        return error(700, msg);
+    }
+
+    public static R error(int code, String msg) {
+        return new R(code, msg);
+    }
+    public static R ok(Object data, String msg) {
+        return new R(data, msg);
+    }
+
+    public static R ok(Object data) {
+        return new R(data);
+    }
+
+    public static R ok() {
+        return new R();
+    }
+
+    public String toJsonString() {
+        return JSONObject.toJSONString(this);
+    }
+
+}

+ 15 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/service/IHotSymbolService.java

@@ -0,0 +1,15 @@
+package com.liangjiang.hot_collection.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.liangjiang.hot_collection.domain.aop.HotObj;
+import com.liangjiang.hot_collection.domain.base.PageBean;
+import com.liangjiang.hot_collection.domain.dto.HotSymbolDto;
+import com.liangjiang.hot_collection.domain.entity.HotSymbol;
+import com.liangjiang.hot_collection.domain.params.FindHotParams;
+import com.liangjiang.hot_collection.domain.params.FindHotSymbolParams;
+
+public interface IHotSymbolService  extends IService<HotSymbol> {
+    PageBean<HotSymbolDto> findHotSymbolPage(FindHotSymbolParams params);
+
+    PageBean<HotObj> findHotPage(FindHotParams params);
+}

+ 127 - 0
hot_collection/src/main/java/com/liangjiang/hot_collection/service/impl/HotSymbolServiceImpl.java

@@ -0,0 +1,127 @@
+package com.liangjiang.hot_collection.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageHelper;
+import com.liangjiang.hot_collection.domain.aop.HotObj;
+import com.liangjiang.hot_collection.domain.base.PageBean;
+import com.liangjiang.hot_collection.domain.dto.HotSymbolDto;
+import com.liangjiang.hot_collection.domain.entity.HotSymbol;
+import com.liangjiang.hot_collection.domain.params.FindHotParams;
+import com.liangjiang.hot_collection.domain.params.FindHotSymbolParams;
+import com.liangjiang.hot_collection.mapper.HotSymbolMapper;
+import com.liangjiang.hot_collection.res.R;
+import com.liangjiang.hot_collection.service.IHotSymbolService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import static com.liangjiang.hot_collection.aop.TaskHot.hotListBinance;
+import static com.liangjiang.hot_collection.aop.TaskHot.hotListGate;
+
+@Slf4j
+@Service
+public class HotSymbolServiceImpl extends ServiceImpl<HotSymbolMapper, HotSymbol> implements IHotSymbolService {
+    @Override
+    public PageBean<HotSymbolDto> findHotSymbolPage(FindHotSymbolParams params) {
+        if (params.getPageNum() == null || params.getPageSize() == null) {
+        }
+
+        int pageNum = params.getPageNum();
+        int pageSize = params.getPageSize();
+
+        PageBean r = new PageBean<HotObj>();
+        r.setPageNum(params.getPageNum());
+        r.setPageSize(params.getPageSize());
+
+        List<HotSymbolDto> all = findHotSymbol(params);
+        int pages = all.size() / pageSize;
+        if (pages * pageSize < all.size()) {
+            pages += 1;
+        }
+        r.setTotal(all.size());
+        r.setPages(pages);
+        int index = (pageNum - 1) * pageSize;
+        int maxIndex = index + pageSize;
+        if (maxIndex > all.size()) {
+            maxIndex = all.size();
+        }
+        r.setList(all.subList(index, maxIndex));
+
+        return r;
+    }
+
+    private List<HotSymbolDto> findHotSymbol(FindHotSymbolParams params) {
+        return this.baseMapper.getHotSymbol(params);
+    }
+
+
+    @Override
+    public PageBean<HotObj> findHotPage(FindHotParams params) {
+        if (params.getPageNum() == null || params.getPageSize() == null) {
+
+        }
+
+        int pageNum = params.getPageNum();
+        int pageSize = params.getPageSize();
+
+        PageBean r = new PageBean<HotObj>();
+        r.setPageNum(params.getPageNum());
+        r.setPageSize(params.getPageSize());
+
+        List<HotObj> all = findHot(params);
+        int pages = all.size() / pageSize;
+        if (pages * pageSize < all.size()) {
+            pages += 1;
+        }
+        r.setTotal(all.size());
+        r.setPages(pages);
+        int index = (pageNum - 1) * pageSize;
+        int maxIndex = index + pageSize;
+        if (maxIndex > all.size()) {
+            maxIndex = all.size();
+        }
+        r.setList(all.subList(index, maxIndex));
+
+        return r;
+    }
+
+    private List<HotObj> findHot(FindHotParams params) {
+        String exchange = params.getExchange();
+        String sort = params.getSort();
+        List<HotObj> all = new ArrayList<>();
+        if (exchange.equals("binance")) {
+            all = hotListBinance;
+        } else if (exchange.equals("gate")) {
+            all = hotListGate;
+        }
+        all = sort(all, sort);//排序
+
+        return all;
+    }
+
+    private List<HotObj> sort(List<HotObj> all, String sort) {
+        Collections.sort(all, new Comparator<HotObj>() {
+            @Override
+            public int compare(HotObj o1, HotObj o2) {
+                if (sort.equals("diefu")) {
+                    Double o2Diefu = Double.parseDouble(o2.getDiefu());
+                    Double o1Diefu = Double.parseDouble(o1.getDiefu());
+                    return o2Diefu.compareTo(o1Diefu);
+                } else if (sort.equals("volume")) {
+                    Double o2Volume = Double.parseDouble(o2.getVolume());
+                    Double o1Volume = Double.parseDouble(o1.getVolume());
+                    return o2Volume.compareTo(o1Volume);
+                }
+                return 1;
+            }
+        });
+        return all;
+    }
+
+}
+
+

+ 60 - 0
hot_collection/src/main/resources/application.yml

@@ -0,0 +1,60 @@
+server:
+  servlet:
+    context-path: /hotCollect
+  port: 84
+  tomcat:
+    uri-encoding: UTF-8
+logging:
+  config: classpath:log.xml
+spring:
+  application:
+    name: hot_collection
+  main:
+    allow-bean-definition-overriding: true
+    allow-circular-references: true
+  # 全局配置响应日期格式和时区为东八区,解决日期类型返回前端少八个小时的问题
+  jackson:
+    time-zone: GMT+8
+  datasource:
+    username: root
+    password: qwe123...
+    url: jdbc:mysql://kline.skyfffire.com:3306/idc?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true
+    #    username: root
+    #    password: 123456
+    #    url: jdbc:mysql://127.0.0.1:3306/idc?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    type: com.alibaba.druid.pool.DruidDataSource
+    druid:
+      initial-size: 20
+      max-active: 80
+      min-idle: 20
+      max-wait: 60000
+      timeBetweenEvictionRunsMillis: 60000
+      minEvictableIdleTimeMillis: 1800000
+      validationQuery: SELECT 1
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      poolPreparedStatements: true
+      filter:
+        wall:
+          config:
+            none-base-statement-allow: true
+            multi-statement-allow: true
+
+mybatis-plus:
+  mapper-locations: classpath*:mapper/**/*Mapper.xml
+  type-aliases-package: com.liangjiang.hot_collection.domain
+  global-config:
+    banner: false
+    db-config:
+      id-type: input
+  configuration:
+    # 控制台SQL日志
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+    map-underscore-to-camel-case: false
+
+
+# 配置HTTP 请求代理
+#proxy-address-this:
+proxy-address-this:

+ 51 - 0
hot_collection/src/main/resources/log.xml

@@ -0,0 +1,51 @@
+<configuration>
+    <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->
+    <!-- appender是configuration的子节点,是负责写日志的组件。 -->
+    <!-- ConsoleAppender:把日志输出到控制台 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d %p (%file:%line\)- %m%n</pattern>
+            <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+    <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
+    <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是sys.log -->
+    <!--             2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名-->
+    <appender name="syslog"
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>logs/basics/sys.log</File>
+        <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->
+        <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
+            <!-- 文件名:log/sys.2022-3-09.0.log -->
+            <fileNamePattern>logs/basics/sys.%d.%i.log</fileNamePattern>
+            <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->
+            <maxHistory>30</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <!-- maxFileSize:这是活动文件的大小,默认值是10MB -->
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder>
+            <!-- pattern节点,用来设置日志的输入格式 -->
+            <pattern>
+                %d %p (%file:%line\)- %m%n
+            </pattern>
+            <!-- 记录日志的编码 -->
+            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+        </encoder>
+    </appender>
+
+    <!-- 控制台输出日志级别 -->
+    <root level="info">
+        <appender-ref ref="STDOUT" />
+    </root>
+    <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
+    <!-- com.lightyears为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
+    <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  -->
+    <logger name="com.liangjiang.hot_collection" level="DEBUG">
+        <appender-ref ref="syslog" />
+    </logger>
+</configuration>

+ 19 - 0
hot_collection/src/main/resources/mapper/HotSymbolMapper.xml

@@ -0,0 +1,19 @@
+<?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.liangjiang.hot_collection.mapper.HotSymbolMapper">
+
+    <select id="getHotSymbol"
+            parameterType="com.liangjiang.hot_collection.domain.params.FindHotSymbolParams"
+            resultType="com.liangjiang.hot_collection.domain.dto.HotSymbolDto">
+        SELECT e.id       id,
+               e.exchange exchange,
+               e.symbol   symbol,
+               e.diefu    diefu,
+               e.volume   volume,
+               e.time     timeStr
+        FROM hot_symbol e
+        ORDER BY time desc
+    </select>
+
+
+</mapper>

+ 1 - 1
pom.xml

@@ -11,6 +11,7 @@
     <modules>
         <module>basic</module>
         <module>price_collection</module>
+        <module>hot_collection</module>
     </modules>
 
     <parent>
@@ -90,5 +91,4 @@
             </dependency>
         </dependencies>
     </dependencyManagement>
-
 </project>