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