• 19.项目开发之量化交易QuantTrade(一)


    项目开发之量化交易QuantTrade

    数据库创建&项目创建

    01

    02

    SpringBoot项目之量化交易QuantTrade创建

    03

    04
    05
    06
    创建项目之初,将需要的pom一次性导入

    <properties>
       <java.version>1.8</java.version>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
       <spring-boot.version>2.3.12.RELEASE</spring-boot.version>
    </properties>
    <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>org.mybatis.spring.boot</groupId>
           <artifactId>mybatis-spring-boot-starter</artifactId>
           <version>2.2.2</version>
       </dependency>
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.33</version>
       </dependency>
       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
           <optional>true</optional>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
           <exclusions>
               <exclusion>
                   <groupId>org.junit.vintage</groupId>
                   <artifactId>junit-vintage-engine</artifactId>
               </exclusion>
           </exclusions>
       </dependency>
       <dependency>
           <groupId>io.springfox</groupId>
           <artifactId>springfox-boot-starter</artifactId>
           <version>3.0.0</version>
       </dependency>
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.17</version>
       </dependency>
       <dependency>
           <groupId>com.opencsv</groupId>
           <artifactId>opencsv</artifactId>
           <version>5.7.1</version>
       </dependency>
    </dependencies>
    <dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-dependencies</artifactId>
               <version>${spring-boot.version}</version>
               <type>pom</type>
               <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
    
    <build>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.8.1</version>
               <configuration>
                   <source>1.8</source>
                   <target>1.8</target>
                   <encoding>UTF-8</encoding>
               </configuration>
           </plugin>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
               <version>${spring-boot.version}</version>
               <configuration>
                   <mainClass>com.quanttrade_bk.QuantTradeBkApplication</mainClass>
                   <skip>true</skip>
               </configuration>
               <executions>
                   <execution>
                       <id>repackage</id>
                       <goals>
                           <goal>repackage</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
       </plugins>
    </build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96

    在这里插入图片描述

    解释:3380是MySql的端口号
    root是MySql的用户名
    1234是MySql的密码

    application.properties

    # 应用服务 WEB 访问端口
    server.port=8080
    # 配置数据库连接信息
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3380/db_quant?serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=1234
    #配置mapper.xml的路径
    mybatis.mapper-locations=classpath:mapper/*/*.xml
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Application入口

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    import springfox.documentation.swagger2.annotations.EnableSwagger2;
    
    @SpringBootApplication
    @EnableSwagger2
    public class QuantTradeApplication {
    
       public static void main(String[] args) {
           SpringApplication.run(QuantTradeApplication.class, args);
       }
       /**
        * 向spring注册RestTemplate工具
        * @return
        */
       @Bean
       public RestTemplate getRestTemplate(){
           return new RestTemplate();
       }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    08
    启动项目,运行:
    http://localhost:8080/swagger-ui/index.html
    能够正常进入swagger2,说明SpringBoot项目已经启动成功

    搭建JSON响应式工具-RestObject

    09

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class RestObject {
       private Integer code;           //前端的状态码 0:业务失败  1:业务成功
       private String msg;              //前端需要展示的信息
       private Object data;            //前端需要的复杂数据
       //业务成功的方法----------
       /**
        * 业务成功,自定义返回msg和返回的数据
        * @param msg
        * @param data
        * @return
        */
       public static RestObject OK(String msg,Object data){
           return new RestObject(1,msg,data);
       }
       /**
        * 业务成功,自定义返回msg,无返回数据
        * @param msg
        * @return
        */
       public static RestObject OK(String msg){
           return OK(msg,null);
       }
       /**
        * 业务成功,自定义返回的数据,无返回msg
        * @param data
        * @return
        */
       public static RestObject OK(Object data){
           return OK(null,data);
       }
       //业务失败的方法----------
       /**
        * 业务失败,自定义返回msg和返回的数据
        * @param msg
        * @param data
        * @return
        */
       public static RestObject ERROR(String msg,Object data){
           return new RestObject(0,msg,data);
       }
       /**
        * 业务失败,自定义返回msg,无返回数据
        * @param msg
        * @return
        */
       public static RestObject ERROR(String msg){
           return ERROR(msg,null);
       }
       /**
        * 业务失败,自定义返回的数据,无返回msg
        * @param data
        * @return
        */
       public static RestObject ERROR(Object data){
           return ERROR(null,data);
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    前后端业务:用户注册

    用户ER图

    010

    用户表(tb_member)

    之所以不叫做User,是为了减少撞库问题。
    011

    012
    013

    用户实体

    014

    import com.fasterxml.jackson.annotation.JsonProperty;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Member {
       private Integer id;
       //JsonProperty是为了和前端json请求对应
       @JsonProperty("userName")
       private String account;
       @JsonProperty("passWord")
       private String authstring;
       //repeat非数据库字段,是为了进行密码一致性校验
       private String repeat;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    三层搭建

    015
    016
    MemberMapper

    import org.springframework.stereotype.Repository;
    @Repository
    public interface MemberMapper {
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Application

    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    import springfox.documentation.swagger2.annotations.EnableSwagger2;
    
    @SpringBootApplication
    @EnableSwagger2
    @MapperScan("com.quanttrade.member.mapper")
    public class QuantTradeApplication {
    
       public static void main(String[] args) {
           SpringApplication.run(QuantTradeApplication.class, args);
       }
       /**
        * 向spring注册RestTemplate工具
        * @return
        */
       @Bean
       public RestTemplate getRestTemplate(){
           return new RestTemplate();
       }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    MapperMapper.xml

    <?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.quanttrade.member.mapper.MemberMapper">
    
    </mapper>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    MemberService

    import com.quanttrade.member.mapper.MemberMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class MemberService {
       @Autowired
       private MemberMapper memberMapper;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    MemberController

    import com.quanttrade.member.service.MemberService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.CrossOrigin;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/member")
    @CrossOrigin //测试阶段进行跨域,项目正式上线时,会将资源整合到static中,到时候就无需跨域
    public class MemberController {
       @Autowired
       private MemberService memberService;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    后端业务实现

    MemberController

    import com.quanttrade.member.javabean.Member;
    import com.quanttrade.member.service.MemberService;
    import com.quanttrade.utils.javabean.RestObject;
    import io.swagger.annotations.ApiOperation;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping("/member")
    @CrossOrigin //测试阶段进行跨域,项目正式上线时,会将资源整合到static中,到时候就无需跨域
    public class MemberController {
       @Autowired
       private MemberService memberService;
    
       /**
        * 注册接口
        * @param param     用户名、密码、确认密码
        * @return
        */
       @ApiOperation("注册接口")
       @PostMapping("/register")
       public @ResponseBody RestObject register(@RequestBody Member param){
           return memberService.register(param);
       }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    MemberService

    /**
    * 注册用户信息
    * @param param 用户名、密码、确认密码
    * @return 注册结果
    */
    public RestObject register(Member param) {
       //1、合法性校验
       //1.0、防止空指针异常
       if(param == null){
           return RestObject.ERROR("注册失败,请联系管理员");
       }
       //1.1、用户名必须存在
       if(param.getAccount()==null || "".equals(param.getAccount().trim())){
           return RestObject.ERROR("注册失败,请先填写用户名!");
       }
       //1.2、密码必须存在
       if(param.getAuthstring()==null || "".equals(param.getAuthstring().trim())){
           return RestObject.ERROR("注册失败,请先填写密码!");
       }
       //1.3、确认密码必须存在
       if(param.getRepeat()==null || "".equals(param.getRepeat().trim())){
           return RestObject.ERROR("注册失败,请先填写确认密码!");
       }
       //1.4、密码和确认密码必须保持一致
       if(!param.getAuthstring().equals(param.getRepeat())){
           return RestObject.ERROR("注册失败,密码和确认密码必须保持一致!");
       }
       //2、先对密码进行MD5加密,替换未加密密码
       param.setAuthstring(
               DigestUtils.md5DigestAsHex(
                       param.getAuthstring().getBytes()
               )
       );
       //3、调用mapper层保存数据
       int rows = 0;
       try {
           rows = memberMapper.saveMemberInfo(param);
       } catch (Exception e) {
           String errorMsg = e.getMessage();
           if(errorMsg.contains("Duplicate entry")&& errorMsg.contains("tb_member.account")){
               //判断如果是用户名重复了,抛出用户名重复的问题
               return RestObject.ERROR("注册失败,该用户名已注册,请更换一个新的用户名!");
           }
           return RestObject.ERROR("注册失败,请联系管理员");
       }
       //4、返回业务结果
       if(rows>0){
           return RestObject.OK("注册成功!");
       }else{
           return RestObject.ERROR("注册失败,请联系管理员");
       }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    MemberMapper

    import com.quanttrade.member.javabean.Member;
    import org.apache.ibatis.annotations.Param;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public interface MemberMapper {
       /**
        * 保存用户名和密码信息
        * @param param
        * @return 保存成功了几条数据
        */
       int saveMemberInfo(@Param("member") Member param);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    MemberMapper.xml

    <insert id="saveMemberInfo">
       insert into tb_member (
           account,
           authstring
       ) values (
                 #{member.account},
                 #{member.authstring}
                        )
    </insert>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试:
    打开swagger-ui
    017
    018

    前端整合

    019

    020
    目前阶段echarts图表会报错,不用管
    前后端项目地址下载:传送门

  • 相关阅读:
    JAVA代码审计——SQL注入靶场审计01
    vue3中ref和reactive的区别
    HTML+CSS+JavaScript七夕情人节表白网页【樱花雨3D相册】超好看
    第五章(1):词嵌入进阶之Glove模型讲解与pytorch实现
    spring事务传播的Propagation.REQUIRES_NEW以及NEVER MANDATORY验证,及其失效的诡异问题
    Python中的*args 和 **kwargs
    【mysql 高级】explain的使用及explain包含字段的含义
    【常用指令ubuntu18.04】
    IDEA常用快捷键汇总
    学习笔记-组策略
  • 原文地址:https://blog.csdn.net/m0_58503202/article/details/133859176