diff --git a/pom.xml b/pom.xml
index a3ff6fc..1063b85 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,98 +1,118 @@
- 4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.7.12
-
-
- com.sztzjy
- foreign_exchange_trading
- 2.0-SNAPSHOT
- foreign_exchange_trading
- jar
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.12
+
+
+ com.sztzjy
+ foreign_exchange_trading
+ 2.0-SNAPSHOT
+ foreign_exchange_trading
+ jar
-
- UTF-8
- UTF-8
- 1.8
-
-
-
- org.springframework.boot
- spring-boot-starter
-
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
- cn.hutool
- hutool-all
- 5.8.10
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.security
- spring-security-jwt
- 1.1.1.RELEASE
-
-
- com.nimbusds
- nimbus-jose-jwt
- 9.26
-
-
- org.springframework.boot
- spring-boot-starter-data-jpa
-
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ cn.hutool
+ hutool-all
+ 5.8.10
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.security
+ spring-security-jwt
+ 1.1.1.RELEASE
+
+
+ com.nimbusds
+ nimbus-jose-jwt
+ 9.26
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
-
- com.alibaba
- druid-spring-boot-starter
- 1.2.18
-
+
+ com.alibaba
+ druid-spring-boot-starter
+ 1.2.18
+
-
- com.github.xiaoymin
- knife4j-spring-boot-starter
- 3.0.3
-
-
- org.springframework.security.oauth
- spring-security-oauth2
- 2.3.8.RELEASE
-
-
- org.projectlombok
- lombok
-
-
- org.hibernate
- hibernate-spatial
-
-
-
- mysql
- mysql-connector-java
- 8.0.28
-
-
+
+ com.github.xiaoymin
+ knife4j-spring-boot-starter
+ 3.0.3
+
+
+ org.springframework.security.oauth
+ spring-security-oauth2
+ 2.3.8.RELEASE
+
+
+ org.projectlombok
+ lombok
+
+
+ org.hibernate
+ hibernate-spatial
+ 5.4.29.Final
+
+
+ mysql-connector-java
+ mysql
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ 8.0.32
+
+
+
+
+
+
+
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
diff --git a/src/main/java/com/sztzjy/forex/trading_trading/config/DateToLongSerialized.java b/src/main/java/com/sztzjy/forex/trading_trading/config/DateToLongSerialized.java
new file mode 100644
index 0000000..fbf95c3
--- /dev/null
+++ b/src/main/java/com/sztzjy/forex/trading_trading/config/DateToLongSerialized.java
@@ -0,0 +1,19 @@
+package com.sztzjy.forex.trading_trading.config;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+import java.util.Date;
+
+/**
+ * 自定义日期序列化工具 Date -> Long
+ * 使用方法:通过在实体字段或get方法上使用注解 @JsonSerialize(using = DateToLongSerialized.class) 进行转换输出
+ */
+public class DateToLongSerialized extends JsonSerializer {
+ @Override
+ public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+ jsonGenerator.writeNumber(date.getTime());
+ }
+}
diff --git a/src/main/java/com/sztzjy/forex/trading_trading/config/security/WebSecurityConfig.java b/src/main/java/com/sztzjy/forex/trading_trading/config/security/WebSecurityConfig.java
index f3c64ca..9a99432 100644
--- a/src/main/java/com/sztzjy/forex/trading_trading/config/security/WebSecurityConfig.java
+++ b/src/main/java/com/sztzjy/forex/trading_trading/config/security/WebSecurityConfig.java
@@ -73,6 +73,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/webjars/**").permitAll()
.antMatchers("/v2/**").permitAll()
.antMatchers("/test/**").permitAll()
+ .antMatchers("/druid/**").permitAll()
.antMatchers(anonymousUrls.toArray(new String[]{})).permitAll()
.anyRequest().authenticated();
}
diff --git a/src/main/java/com/sztzjy/forex/trading_trading/controller/LogController.java b/src/main/java/com/sztzjy/forex/trading_trading/controller/LogController.java
new file mode 100644
index 0000000..499f63e
--- /dev/null
+++ b/src/main/java/com/sztzjy/forex/trading_trading/controller/LogController.java
@@ -0,0 +1,39 @@
+package com.sztzjy.forex.trading_trading.controller;
+
+import com.sztzjy.forex.trading_trading.dto.PageVO;
+import com.sztzjy.forex.trading_trading.entity.Log;
+import com.sztzjy.forex.trading_trading.service.LogService;
+import com.sztzjy.forex.trading_trading.util.ResultEntity;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(tags = "系统:操作日志")
+@RestController
+@RequestMapping("api/syslog")
+@RequiredArgsConstructor
+public class LogController {
+ private final LogService logService;
+
+ @ApiOperation("根据条件查询操作日志(分页)")
+ @GetMapping("findAll")
+ public ResultEntity> findAll(@ApiParam("ip地址") @RequestParam(required = false) String ipAddress,
+ @ApiParam("开始时间") @RequestParam(required = false) Long startTime,
+ @ApiParam("结束时间") @RequestParam(required = false) Long endTime,
+ @ApiParam("分页索引:{0}为第一页") @RequestParam(required = false) Integer index,
+ @ApiParam("页量") @RequestParam(required = false) Integer size,
+ @ApiParam("操作人") @RequestParam(required = false) String operatorName
+ ) {
+ Page page = logService.findByConditions(index, size, ipAddress, startTime, endTime, operatorName);
+ PageVO pageVO = new PageVO<>();
+ pageVO.setPageInfo(page, page.getContent());
+ return new ResultEntity<>(HttpStatus.OK, pageVO);
+ }
+}
diff --git a/src/main/java/com/sztzjy/forex/trading_trading/dto/PageVO.java b/src/main/java/com/sztzjy/forex/trading_trading/dto/PageVO.java
new file mode 100644
index 0000000..e6ca641
--- /dev/null
+++ b/src/main/java/com/sztzjy/forex/trading_trading/dto/PageVO.java
@@ -0,0 +1,41 @@
+package com.sztzjy.forex.trading_trading.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+
+import java.util.List;
+
+/**
+ * 分页输出VO
+ */
+@ApiModel("分页出参对象")
+@Getter
+public class PageVO {
+ private List content;
+ private Long totalElements;
+ private Boolean last;
+ private Integer totalPages;
+ private Integer number;
+ private Integer size;
+ private Integer numberOfElements;
+ private Boolean first;
+ private Boolean empty;
+
+ /**
+ * 转换分页实体
+ * @param pageData org.springframework.data.domain.Page
+ * @param voList 实体几何
+ */
+ public void setPageInfo(Page> pageData, List voList) {
+ this.content = voList;
+ this.totalPages = pageData.getTotalPages();
+ this.size = pageData.getSize();
+ this.number = pageData.getNumber();
+ this.first = pageData.isFirst();
+ this.last = pageData.isLast();
+ this.empty = pageData.isEmpty();
+ this.totalElements = pageData.getTotalElements();
+ this.numberOfElements = pageData.getNumberOfElements();
+ }
+}
diff --git a/src/main/java/com/sztzjy/forex/trading_trading/entity/Base.java b/src/main/java/com/sztzjy/forex/trading_trading/entity/Base.java
new file mode 100644
index 0000000..e231c6b
--- /dev/null
+++ b/src/main/java/com/sztzjy/forex/trading_trading/entity/Base.java
@@ -0,0 +1,34 @@
+package com.sztzjy.forex.trading_trading.entity;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.sztzjy.forex.trading_trading.config.DateToLongSerialized;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+import java.util.Date;
+
+@ApiModel("基础实体类")
+@Getter
+@Setter
+@MappedSuperclass
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"})
+public class Base {
+ @ApiModelProperty("主键id")
+ @Id
+ @GenericGenerator(name = "system_uuid", strategy = "uuid")
+ @GeneratedValue(generator = "system_uuid")
+ private String id;
+ @ApiModelProperty("创建时间")
+ @JsonSerialize(using = DateToLongSerialized.class)
+ private Date createTime = null;
+ @ApiModelProperty("更新时间")
+ @JsonSerialize(using = DateToLongSerialized.class)
+ private Date updateTime = null;
+}
\ No newline at end of file
diff --git a/src/main/java/com/sztzjy/forex/trading_trading/entity/Log.java b/src/main/java/com/sztzjy/forex/trading_trading/entity/Log.java
new file mode 100644
index 0000000..10dd7c2
--- /dev/null
+++ b/src/main/java/com/sztzjy/forex/trading_trading/entity/Log.java
@@ -0,0 +1,32 @@
+package com.sztzjy.forex.trading_trading.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+@ApiModel("日志")
+@Getter
+@Setter
+@Entity
+@Table(name = "sys_log")
+public class Log extends Base {
+ @ApiModelProperty("执行的操作")
+ private String action;
+ @ApiModelProperty("操作来源IP地址")
+ private String ipAddress;
+ @ApiModelProperty("操作人ID")
+ private String operatorId;
+ @ApiModelProperty("操作人姓名")
+ private String operatorName;
+ @ApiModelProperty("客户端")
+ private String userAgent;
+ @ApiModelProperty("执行参数")
+ private String params;
+ @ApiModelProperty("描述")
+ private String description;
+
+}
diff --git a/src/main/java/com/sztzjy/forex/trading_trading/repository/IBaseJpaRepository.java b/src/main/java/com/sztzjy/forex/trading_trading/repository/IBaseJpaRepository.java
new file mode 100644
index 0000000..ea8f5e8
--- /dev/null
+++ b/src/main/java/com/sztzjy/forex/trading_trading/repository/IBaseJpaRepository.java
@@ -0,0 +1,17 @@
+package com.sztzjy.forex.trading_trading.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.NoRepositoryBean;
+
+import java.io.Serializable;
+
+/**
+ * 自定义持久层接口
+ * 当系统业务持久层需要自定义功能
+ * 则需要继承此接口
+ */
+@NoRepositoryBean
+public interface IBaseJpaRepository extends JpaRepository, JpaSpecificationExecutor {
+}
+
diff --git a/src/main/java/com/sztzjy/forex/trading_trading/repository/ILogRepository.java b/src/main/java/com/sztzjy/forex/trading_trading/repository/ILogRepository.java
new file mode 100644
index 0000000..d4bad68
--- /dev/null
+++ b/src/main/java/com/sztzjy/forex/trading_trading/repository/ILogRepository.java
@@ -0,0 +1,7 @@
+package com.sztzjy.forex.trading_trading.repository;
+
+
+import com.sztzjy.forex.trading_trading.entity.Log;
+
+public interface ILogRepository extends IBaseJpaRepository {
+}
diff --git a/src/main/java/com/sztzjy/forex/trading_trading/service/LogService.java b/src/main/java/com/sztzjy/forex/trading_trading/service/LogService.java
new file mode 100644
index 0000000..19e08cc
--- /dev/null
+++ b/src/main/java/com/sztzjy/forex/trading_trading/service/LogService.java
@@ -0,0 +1,59 @@
+package com.sztzjy.forex.trading_trading.service;
+
+import com.sztzjy.forex.trading_trading.entity.Log;
+import com.sztzjy.forex.trading_trading.repository.ILogRepository;
+import com.sztzjy.forex.trading_trading.util.PageUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.criteria.Predicate;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 系统日志服务层
+ */
+@Service
+@RequiredArgsConstructor
+public class LogService {
+ private final ILogRepository logRepository;
+
+ public Page findAll(Integer index, Integer size) {
+ PageUtil pageUtil = new PageUtil(index, size);
+ pageUtil.addSort("operatedTime", false);
+ return logRepository.findAll(pageUtil.getPageable());
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public Log add(Log logRecord) {
+ logRecord.setCreateTime(new Date());
+ logRepository.save(logRecord);
+ return logRecord;
+ }
+
+ public Page findByConditions(Integer index, Integer size, String ipAddress, Long startTime, Long endTime, String operatorName) {
+ Specification specification = (Specification) (root, criteriaQuery, criteriaBuilder) -> {
+ List andPredicate = new ArrayList<>();
+ if (ipAddress != null && !ipAddress.isEmpty()) {
+ andPredicate.add(criteriaBuilder.equal(root.get("ipAddress"), ipAddress));
+ }
+ if (startTime != null && startTime != 0) {
+ andPredicate.add(criteriaBuilder.greaterThanOrEqualTo(root.get("createTime"), new Date(startTime)));
+ }
+ if (endTime != null && endTime != 0) {
+ andPredicate.add(criteriaBuilder.lessThanOrEqualTo(root.get("createTime"), new Date(endTime)));
+ }
+ if (operatorName != null && !operatorName.isEmpty()) {
+ andPredicate.add(criteriaBuilder.like(root.get("operatorName"), operatorName + '%'));
+ }
+ return criteriaQuery.where(andPredicate.toArray(new Predicate[]{})).getRestriction();
+ };
+ PageUtil pageUtil = new PageUtil(index, size);
+ pageUtil.addSort("createTime", false);
+ return logRepository.findAll(specification, pageUtil.getPageable());
+ }
+}
diff --git a/src/main/java/com/sztzjy/forex/trading_trading/util/PageUtil.java b/src/main/java/com/sztzjy/forex/trading_trading/util/PageUtil.java
new file mode 100644
index 0000000..39e4dac
--- /dev/null
+++ b/src/main/java/com/sztzjy/forex/trading_trading/util/PageUtil.java
@@ -0,0 +1,49 @@
+package com.sztzjy.forex.trading_trading.util;
+
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+
+/**
+ * 分页工具类
+ */
+public class PageUtil {
+ private final Integer index;
+ private final Integer size;
+ private Sort sort;
+
+ public PageUtil(Integer index, Integer size) {
+ if (index == null || index < 0) index = 0;
+ if (size == null || size < 0) size = 10;
+ if (size > 200) size = 1000;
+ this.index = index;
+ this.size = size;
+ }
+
+ //该方法用于数据量大的情况下分页导出
+ public PageUtil(Integer index, Integer size, boolean type) {
+ if (index == null || index < 0) index = 0;
+ if (size == null || size < 0) size = 10;
+ this.index = index;
+ this.size = size;
+ }
+
+ public void addSort(String columnName, Boolean asc) {
+ Sort.Direction direction = Sort.Direction.ASC;
+ if (!asc) direction = Sort.Direction.DESC;
+ if (sort == null) {
+ sort = Sort.by(direction, columnName);
+ } else {
+ sort = sort.and(Sort.by(direction, columnName));
+ }
+ }
+
+ public Pageable getPageable() {
+ if (sort == null)
+ return PageRequest.of(index, size);
+ else
+ return PageRequest.of(index, size, sort);
+ }
+
+
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 3e38a98..7892ab5 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -1,8 +1,8 @@
spring:
datasource:
druid:
- db-type: com.alibaba.druid.pool.DruidDataSource
- driverClassName: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://${DB_HOST:118.31.7.2}:${DB_PORT:3306}}/${DB_NAME:foreign_trading_system}?useSSL=false&serverTimezone=UTC
+ db-type: mysql
+ url: jdbc:mysql://${DB_HOST:118.31.7.2}:${DB_PORT:3306}/${DB_NAME:foreign_exchange_trading}?useSSL=false&serverTimezone=UTC
username: ${DB_USER:root}
- password: ${DB_PWD:sztzjy2017}
\ No newline at end of file
+ password: ${DB_PWD:sztzjy2017}
+ driver-class-name: com.mysql.cj.jdbc.Driver
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 6a4c421..995379a 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -47,7 +47,7 @@ spring:
url-pattern: /druid/*
reset-enable: false
login-username: admin
- login-password: 2023inspect
+ login-password: 2023
filter:
stat:
enabled: true
@@ -58,19 +58,20 @@ spring:
wall:
config:
multi-statement-allow: true
- #配置 Jpa
- jpa:
+ #配置 Jpa
+ jpa:
+ hibernate:
+ ddl-auto: update
+ open-in-view: true
+ show-sql: true
+ properties:
hibernate:
- ddl-auto: update
- open-in-view: true
- show-sql: true
- properties:
- hibernate:
- format_sql: true
- dialect: org.hibernate.dialect.MySQL8Dialect
- temp:
- use_jdbc_metadata_defaults: false
- database: mysql
+ format_sql: true
+ dialect: org.hibernate.dialect.MySQL8Dialect
+ storage_engine: innodb
+ temp:
+ use_jdbc_metadata_defaults: false
+ database: mysql
swagger:
enable: true