소스 검색

买一卖一存储

JiahengHe 1 년 전
부모
커밋
d1a3ec388a
35개의 변경된 파일749개의 추가작업 그리고 3개의 파일을 삭제
  1. 1 1
      basic/src/main/resources/application.yml
  2. 9 2
      pom.xml
  3. 100 0
      price_collection/pom.xml
  4. 19 0
      price_collection/src/main/java/com/liangjiang/price_collection/PriceCollectionApp.java
  5. 21 0
      price_collection/src/main/java/com/liangjiang/price_collection/controller/ApiController.java
  6. 26 0
      price_collection/src/main/java/com/liangjiang/price_collection/controller/TestController.java
  7. 22 0
      price_collection/src/main/java/com/liangjiang/price_collection/dto/BackupsInfo.java
  8. 14 0
      price_collection/src/main/java/com/liangjiang/price_collection/dto/PriceInfoDto.java
  9. 64 0
      price_collection/src/main/java/com/liangjiang/price_collection/filter/BasicFilter.java
  10. 9 0
      price_collection/src/main/java/com/liangjiang/price_collection/mapper/BackupsInfoMapper.java
  11. 22 0
      price_collection/src/main/java/com/liangjiang/price_collection/mapper/TableMapper.java
  12. 7 0
      price_collection/src/main/java/com/liangjiang/price_collection/service/IBackupsInfoService.java
  13. 19 0
      price_collection/src/main/java/com/liangjiang/price_collection/service/ITableService.java
  14. 12 0
      price_collection/src/main/java/com/liangjiang/price_collection/service/impl/BackupsInfoServiceImpl.java
  15. 80 0
      price_collection/src/main/java/com/liangjiang/price_collection/service/impl/TableServiceImpl.java
  16. 73 0
      price_collection/src/main/resources/application.yml
  17. 51 0
      price_collection/src/main/resources/log.xml
  18. 4 0
      price_collection/src/main/resources/mapper/InfoBackupsMapper.xml
  19. 34 0
      price_collection/src/main/resources/mapper/TableMapper.xml
  20. 73 0
      price_collection/target/classes/application.yml
  21. BIN
      price_collection/target/classes/com/liangjiang/price_collection/PriceCollectionApp.class
  22. BIN
      price_collection/target/classes/com/liangjiang/price_collection/controller/ApiController.class
  23. BIN
      price_collection/target/classes/com/liangjiang/price_collection/controller/TestController.class
  24. BIN
      price_collection/target/classes/com/liangjiang/price_collection/dto/BackupsInfo.class
  25. BIN
      price_collection/target/classes/com/liangjiang/price_collection/dto/PriceInfoDto.class
  26. BIN
      price_collection/target/classes/com/liangjiang/price_collection/filter/BasicFilter.class
  27. BIN
      price_collection/target/classes/com/liangjiang/price_collection/mapper/BackupsInfoMapper.class
  28. BIN
      price_collection/target/classes/com/liangjiang/price_collection/mapper/TableMapper.class
  29. BIN
      price_collection/target/classes/com/liangjiang/price_collection/service/IBackupsInfoService.class
  30. BIN
      price_collection/target/classes/com/liangjiang/price_collection/service/ITableService.class
  31. BIN
      price_collection/target/classes/com/liangjiang/price_collection/service/impl/BackupsInfoServiceImpl.class
  32. BIN
      price_collection/target/classes/com/liangjiang/price_collection/service/impl/TableServiceImpl.class
  33. 51 0
      price_collection/target/classes/log.xml
  34. 4 0
      price_collection/target/classes/mapper/InfoBackupsMapper.xml
  35. 34 0
      price_collection/target/classes/mapper/TableMapper.xml

+ 1 - 1
basic/src/main/resources/application.yml

@@ -57,7 +57,7 @@ spring:
 #        max-wait: -1ms
 mybatis-plus:
   mapper-locations: classpath*:mapper/**/*Mapper.xml
-  type-aliases-package: com.liangjiang.domain
+  type-aliases-package: com.liangjiang.basic.domain
   global-config:
     banner: false
     db-config:

+ 9 - 2
pom.xml

@@ -10,6 +10,7 @@
     <version>1.0</version>
     <modules>
         <module>basic</module>
+        <module>price_collection</module>
     </modules>
 
     <parent>
@@ -23,11 +24,12 @@
         <mybatis-plus.version>3.5.1</mybatis-plus.version>
         <druid.version>1.1.10</druid.version>
         <fastjson.version>1.2.83</fastjson.version>
-        <pagehelper.version>1.4.1</pagehelper.version>
-        <hutool.version>5.7.22</hutool.version>
+        <pagehelper.version>2.1.0</pagehelper.version>
+        <hutool.version>5.8.25</hutool.version>
         <commons-io.version>2.5</commons-io.version>
         <commons-collections4.version>4.4</commons-collections4.version>
         <validation.version>2.0.1.Final</validation.version>
+        <guava.version>32.0.0-android</guava.version>
     </properties>
 
     <dependencyManagement>
@@ -81,6 +83,11 @@
                 <artifactId>commons-collections4</artifactId>
                 <version>${commons-collections4.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

+ 100 - 0
price_collection/pom.xml

@@ -0,0 +1,100 @@
+<?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>price_collection</artifactId>
+    <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.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>
+        <!--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>
+    </dependencies>
+    <build>
+        <finalName>price_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.price_collection.PriceCollectionApp</mainClass>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 19 - 0
price_collection/src/main/java/com/liangjiang/price_collection/PriceCollectionApp.java

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

+ 21 - 0
price_collection/src/main/java/com/liangjiang/price_collection/controller/ApiController.java

@@ -0,0 +1,21 @@
+package com.liangjiang.price_collection.controller;
+
+import com.liangjiang.price_collection.dto.PriceInfoDto;
+import com.liangjiang.price_collection.service.ITableService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@CrossOrigin
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api")
+public class ApiController {
+    private final ITableService tableService;
+
+    @PostMapping("/add")
+    public void saveInfo(@RequestBody List<PriceInfoDto> priceInfoDtos){
+        tableService.savePriceBatch(priceInfoDtos);
+    }
+}

+ 26 - 0
price_collection/src/main/java/com/liangjiang/price_collection/controller/TestController.java

@@ -0,0 +1,26 @@
+package com.liangjiang.price_collection.controller;
+
+import com.liangjiang.price_collection.dto.PriceInfoDto;
+import com.liangjiang.price_collection.service.ITableService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@CrossOrigin
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/test")
+public class TestController {
+    private final ITableService tableService;
+
+    @RequestMapping(value = "/createTable", method = RequestMethod.POST)
+    public Boolean createTable(@RequestBody PriceInfoDto priceInfoDto) {
+        return this.tableService.createTable(priceInfoDto.getSource(), priceInfoDto.getCoin(), priceInfoDto.getType());
+    }
+
+    @RequestMapping(value = "/getTableName", method = RequestMethod.GET)
+    public List<String> getTableName() {
+        return this.tableService.getTableNames();
+    }
+}

+ 22 - 0
price_collection/src/main/java/com/liangjiang/price_collection/dto/BackupsInfo.java

@@ -0,0 +1,22 @@
+package com.liangjiang.price_collection.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("info_backups")
+public class BackupsInfo {
+    // 时间
+    @TableField("time")
+    private Integer time;
+    // 卖价
+    @TableField("ask")
+    private String ask;
+    // 买价
+    @TableField("bid")
+    private String bid;
+    // 表名
+    @TableField("table_name")
+    private  String tableName;
+}

+ 14 - 0
price_collection/src/main/java/com/liangjiang/price_collection/dto/PriceInfoDto.java

@@ -0,0 +1,14 @@
+package com.liangjiang.price_collection.dto;
+
+import lombok.Data;
+
+@Data
+public class PriceInfoDto {
+    private String source;
+    // swap spot
+    private String type;
+    private String coin;
+    private Integer time;
+    private String bid;
+    private String ask;
+}

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

@@ -0,0 +1,64 @@
+package com.liangjiang.price_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 = "43626546liangjiang";
+
+    @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));
+    }
+}

+ 9 - 0
price_collection/src/main/java/com/liangjiang/price_collection/mapper/BackupsInfoMapper.java

@@ -0,0 +1,9 @@
+package com.liangjiang.price_collection.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.liangjiang.price_collection.dto.BackupsInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface BackupsInfoMapper extends BaseMapper<BackupsInfo> {
+}

+ 22 - 0
price_collection/src/main/java/com/liangjiang/price_collection/mapper/TableMapper.java

@@ -0,0 +1,22 @@
+package com.liangjiang.price_collection.mapper;
+
+import com.liangjiang.price_collection.dto.PriceInfoDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.sql.SQLSyntaxErrorException;
+import java.util.List;
+
+@Mapper
+public interface TableMapper {
+    // 创建表
+    void createTable(@Param("tableName")String tableName);
+    // 获取所有表名
+    List<String> getTableName();
+
+    // 保存价格信息
+    void savePrice(@Param("tableName") String tableName, @Param("id") Integer id, @Param("ask") String ask,@Param("bid") String bid) throws SQLSyntaxErrorException;
+
+    // 获取价格列表
+    List<PriceInfoDto> getPriceInfo(@Param("tableName") String tableName,@Param("endTime") Integer endTime);
+}

+ 7 - 0
price_collection/src/main/java/com/liangjiang/price_collection/service/IBackupsInfoService.java

@@ -0,0 +1,7 @@
+package com.liangjiang.price_collection.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.liangjiang.price_collection.dto.BackupsInfo;
+
+public interface IBackupsInfoService extends IService<BackupsInfo> {
+}

+ 19 - 0
price_collection/src/main/java/com/liangjiang/price_collection/service/ITableService.java

@@ -0,0 +1,19 @@
+package com.liangjiang.price_collection.service;
+
+import com.liangjiang.price_collection.dto.PriceInfoDto;
+
+import java.util.List;
+
+public interface ITableService {
+    // 创建表
+    boolean createTable(String source, String coin, String type);
+
+    // 查询所有表名
+    List<String> getTableNames();
+
+    // 写价格信息
+    void savePrice(PriceInfoDto dto);
+
+    // 批量写入
+    void savePriceBatch(List<PriceInfoDto> dtos);
+}

+ 12 - 0
price_collection/src/main/java/com/liangjiang/price_collection/service/impl/BackupsInfoServiceImpl.java

@@ -0,0 +1,12 @@
+package com.liangjiang.price_collection.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.liangjiang.price_collection.dto.BackupsInfo;
+import com.liangjiang.price_collection.mapper.BackupsInfoMapper;
+import com.liangjiang.price_collection.service.IBackupsInfoService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class BackupsInfoServiceImpl extends ServiceImpl<BackupsInfoMapper, BackupsInfo> implements IBackupsInfoService {
+
+}

+ 80 - 0
price_collection/src/main/java/com/liangjiang/price_collection/service/impl/TableServiceImpl.java

@@ -0,0 +1,80 @@
+package com.liangjiang.price_collection.service.impl;
+
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
+import com.liangjiang.price_collection.dto.BackupsInfo;
+import com.liangjiang.price_collection.dto.PriceInfoDto;
+import com.liangjiang.price_collection.mapper.TableMapper;
+import com.liangjiang.price_collection.service.IBackupsInfoService;
+import com.liangjiang.price_collection.service.ITableService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.jdbc.BadSqlGrammarException;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class TableServiceImpl implements ITableService {
+    private final TableMapper tableMapper;
+    private final IBackupsInfoService backupsInfoService;
+    private final Interner<Object> interner = Interners.newWeakInterner();
+
+    @Override
+    public boolean createTable(String source, String coin, String type){
+        String tableName = String.format("%s_%s_%s", source, coin, type).toUpperCase();
+        synchronized (interner.intern(tableName)){
+            try {
+                tableMapper.createTable(tableName);
+                return true;
+            } catch (Exception ex){
+                log.error(tableName + "创建表失败", ex);
+                return false;
+            }
+        }
+    }
+
+    @Override
+    public List<String> getTableNames(){
+        return tableMapper.getTableName();
+    }
+
+    @Override
+    public void savePriceBatch(List<PriceInfoDto> dtos){
+        dtos.forEach(this::savePrice);
+    }
+
+    @Override
+    public void savePrice(PriceInfoDto dto){
+        String tableName = String.format("%s_%s_%s", dto.getSource(), dto.getCoin(), dto.getType()).toUpperCase();
+        try {
+            // 尝试先写入
+            this.tableMapper.savePrice(tableName, dto.getTime(), dto.getAsk(), dto.getBid());
+        } catch (BadSqlGrammarException ex){// 捕获表不存在的异常
+            // 建表
+            this.createTable(dto.getSource(), dto.getCoin(), dto.getType());
+            try {
+                // 写入
+               this.tableMapper.savePrice(tableName, dto.getTime(), dto.getAsk(), dto.getBid());
+            } catch (Exception er){
+                // 写入存档表
+                BackupsInfo backupsInfo = new BackupsInfo();
+                backupsInfo.setTableName(tableName);
+                backupsInfo.setAsk(dto.getAsk());
+                backupsInfo.setBid(dto.getBid());
+                backupsInfo.setTime(dto.getTime());
+                backupsInfoService.save(backupsInfo);
+            }
+        } catch (Exception e){ // 其他异常
+            // 写入存档表
+            BackupsInfo backupsInfo = new BackupsInfo();
+            backupsInfo.setTableName(tableName);
+            backupsInfo.setAsk(dto.getAsk());
+            backupsInfo.setBid(dto.getBid());
+            backupsInfo.setTime(dto.getTime());
+            backupsInfoService.save(backupsInfo);
+        }
+    }
+}

+ 73 - 0
price_collection/src/main/resources/application.yml

@@ -0,0 +1,73 @@
+server:
+  port: 82
+  tomcat:
+    uri-encoding: UTF-8
+logging:
+  config: classpath:log.xml
+spring:
+  application:
+    name: price_collection
+  main:
+    allow-bean-definition-overriding: true
+    allow-circular-references: true
+  # 全局配置响应日期格式和时区为东八区,解决日期类型返回前端少八个小时的问题
+  jackson:
+    time-zone: GMT+8
+  datasource:
+    username: root
+    password: zxc123...
+    url: jdbc:mysql://as.skyfffire.com:3306/one_price_warehouse?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
+      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计。‘wall’用于防火墙
+      filters: stat,wall
+      filter:
+        wall:
+          config:
+            none-base-statement-allow: true
+            multi-statement-allow: true
+
+#  redis:
+#    # Redis服务器地址
+#    host: localhost
+#    # Redis数据库索引(默认为0)
+#    database: 0
+#    # Redis服务器连接端口
+#    port: 6379
+#    # Redis服务器连接密码(默认为空)
+#    password: 123456
+#    # 连接超时时间
+#    timeout: 1000ms
+#    lettuce:
+#      pool:
+#        # 连接池最大连接数
+#        max-active: 8
+#        # 连接池最大空闲连接数
+#        max-idle: 8
+#        # 连接池最小空闲连接数
+#        min-idle: 0
+#        # 连接池最大阻塞等待时间,负值表示没有限制
+#        max-wait: -1ms
+mybatis-plus:
+  mapper-locations: classpath*:mapper/**/*Mapper.xml
+  type-aliases-package: com.liangjiang.price_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

+ 51 - 0
price_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.basics" level="DEBUG">
+        <appender-ref ref="syslog" />
+    </logger>
+</configuration>

+ 4 - 0
price_collection/src/main/resources/mapper/InfoBackupsMapper.xml

@@ -0,0 +1,4 @@
+<?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.price_collection.mapper.BackupsInfoMapper">
+</mapper>

+ 34 - 0
price_collection/src/main/resources/mapper/TableMapper.xml

@@ -0,0 +1,34 @@
+<?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.price_collection.mapper.TableMapper">
+    <!-- 创建数据表 -->
+    <update id="createTable" parameterType="java.lang.String">
+        CREATE TABLE ${tableName} (
+         `id` INT UNSIGNED NOT NULL,
+         `bid` VARCHAR(128) NOT NULL,
+         `ask` VARCHAR(128) NOT NULL,
+         PRIMARY KEY (`id`)
+        )
+    </update>
+
+    <!-- 获取所有数据表格 -->
+    <select id="getTableName" resultType="java.lang.String">
+        SELECT
+            table_name
+        FROM
+            information_schema.TABLES
+        WHERE
+            table_type = 'BASE TABLE'
+          AND table_schema = 'one_price_warehouse'
+        ORDER BY
+            table_name
+    </select>
+
+    <insert id="savePrice">
+        INSERT ${tableName} ( id, bid, ask ) VALUE (${id}, ${bid}, ${ask})on duplicate key update bid = ${bid}, ask = ${ask}
+    </insert>
+
+    <select id="getPriceInfo" resultType="com.liangjiang.price_collection.dto.PriceInfoDto">
+        select id, bid, ask from ${tableName} where id > ${timeEnd}
+    </select>
+</mapper>

+ 73 - 0
price_collection/target/classes/application.yml

@@ -0,0 +1,73 @@
+server:
+  port: 82
+  tomcat:
+    uri-encoding: UTF-8
+logging:
+  config: classpath:log.xml
+spring:
+  application:
+    name: price_collection
+  main:
+    allow-bean-definition-overriding: true
+    allow-circular-references: true
+  # 全局配置响应日期格式和时区为东八区,解决日期类型返回前端少八个小时的问题
+  jackson:
+    time-zone: GMT+8
+  datasource:
+    username: root
+    password: zxc123...
+    url: jdbc:mysql://as.skyfffire.com:3306/one_price_warehouse?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
+      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计。‘wall’用于防火墙
+      filters: stat,wall
+      filter:
+        wall:
+          config:
+            none-base-statement-allow: true
+            multi-statement-allow: true
+
+#  redis:
+#    # Redis服务器地址
+#    host: localhost
+#    # Redis数据库索引(默认为0)
+#    database: 0
+#    # Redis服务器连接端口
+#    port: 6379
+#    # Redis服务器连接密码(默认为空)
+#    password: 123456
+#    # 连接超时时间
+#    timeout: 1000ms
+#    lettuce:
+#      pool:
+#        # 连接池最大连接数
+#        max-active: 8
+#        # 连接池最大空闲连接数
+#        max-idle: 8
+#        # 连接池最小空闲连接数
+#        min-idle: 0
+#        # 连接池最大阻塞等待时间,负值表示没有限制
+#        max-wait: -1ms
+mybatis-plus:
+  mapper-locations: classpath*:mapper/**/*Mapper.xml
+  type-aliases-package: com.liangjiang.price_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

BIN
price_collection/target/classes/com/liangjiang/price_collection/PriceCollectionApp.class


BIN
price_collection/target/classes/com/liangjiang/price_collection/controller/ApiController.class


BIN
price_collection/target/classes/com/liangjiang/price_collection/controller/TestController.class


BIN
price_collection/target/classes/com/liangjiang/price_collection/dto/BackupsInfo.class


BIN
price_collection/target/classes/com/liangjiang/price_collection/dto/PriceInfoDto.class


BIN
price_collection/target/classes/com/liangjiang/price_collection/filter/BasicFilter.class


BIN
price_collection/target/classes/com/liangjiang/price_collection/mapper/BackupsInfoMapper.class


BIN
price_collection/target/classes/com/liangjiang/price_collection/mapper/TableMapper.class


BIN
price_collection/target/classes/com/liangjiang/price_collection/service/IBackupsInfoService.class


BIN
price_collection/target/classes/com/liangjiang/price_collection/service/ITableService.class


BIN
price_collection/target/classes/com/liangjiang/price_collection/service/impl/BackupsInfoServiceImpl.class


BIN
price_collection/target/classes/com/liangjiang/price_collection/service/impl/TableServiceImpl.class


+ 51 - 0
price_collection/target/classes/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.basics" level="DEBUG">
+        <appender-ref ref="syslog" />
+    </logger>
+</configuration>

+ 4 - 0
price_collection/target/classes/mapper/InfoBackupsMapper.xml

@@ -0,0 +1,4 @@
+<?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.price_collection.mapper.BackupsInfoMapper">
+</mapper>

+ 34 - 0
price_collection/target/classes/mapper/TableMapper.xml

@@ -0,0 +1,34 @@
+<?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.price_collection.mapper.TableMapper">
+    <!-- 创建数据表 -->
+    <update id="createTable" parameterType="java.lang.String">
+        CREATE TABLE ${tableName} (
+         `id` INT UNSIGNED NOT NULL,
+         `bid` VARCHAR(128) NOT NULL,
+         `ask` VARCHAR(128) NOT NULL,
+         PRIMARY KEY (`id`)
+        )
+    </update>
+
+    <!-- 获取所有数据表格 -->
+    <select id="getTableName" resultType="java.lang.String">
+        SELECT
+            table_name
+        FROM
+            information_schema.TABLES
+        WHERE
+            table_type = 'BASE TABLE'
+          AND table_schema = 'one_price_warehouse'
+        ORDER BY
+            table_name
+    </select>
+
+    <insert id="savePrice">
+        INSERT ${tableName} ( id, bid, ask ) VALUE (${id}, ${bid}, ${ask})on duplicate key update bid = ${bid}, ask = ${ask}
+    </insert>
+
+    <select id="getPriceInfo" resultType="com.liangjiang.price_collection.dto.PriceInfoDto">
+        select id, bid, ask from ${tableName} where id > ${timeEnd}
+    </select>
+</mapper>