zset 可以排序 使用xxl-job实现定时任务 对历史排行榜持久化到数据库
代码
cotroller
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
| package com.orchids.ranklist.web.controller;
import com.orchids.ranklist.web.domain.query.BoardQuery; import com.orchids.ranklist.web.domain.vo.PointsBoardVO; import com.orchids.ranklist.web.service.IPointsBoardService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController @RequiredArgsConstructor @RequestMapping("/rank") @Api(tags = "积分积分排行榜") public class PointBoardController { private final IPointsBoardService pointsBoardService;
@GetMapping("boards") @ApiOperation("分页查询指定赛季的排行榜") public PointsBoardVO queryPointsBoardBySeasonId(BoardQuery query){ return pointsBoardService.queryPointsBoardBySeasonId(query); } }
|
service
Iservice
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
| package com.orchids.ranklist.web.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.orchids.ranklist.web.domain.po.PointsBoard; import com.orchids.ranklist.web.domain.query.BoardQuery; import com.orchids.ranklist.web.domain.vo.PointsBoardVO;
import java.util.List;
public interface IPointsBoardService extends IService<PointsBoard> { PointsBoardVO queryPointsBoardBySeasonId(BoardQuery query);
void createPointsBoardTableBySeason(Integer season); }
|
servieImpl
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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
| package com.orchids.ranklist.web.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.orchids.ranklist.web.domain.po.PointsBoard; import com.orchids.ranklist.web.domain.query.BoardQuery; import com.orchids.ranklist.web.domain.vo.PointsBoardVO; import com.orchids.ranklist.web.mapper.PointsBoardMapper; import com.orchids.ranklist.web.service.IPointsBoardService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.orchids.ranklist.web.utils.TableNameContext; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.BoundZSetOperations; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ZSetOperations; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils;
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*;
@Service @RequiredArgsConstructor public class PointsBoardServiceImpl extends ServiceImpl<PointsBoardMapper, PointsBoard> implements IPointsBoardService {
private final PointsBoardMapper pointsBoardMapper;
private final StringRedisTemplate redisTemplate;
@Override public PointsBoardVO queryPointsBoardBySeasonId(BoardQuery query) { Long seasonId = query.getSeasonId(); boolean isCurrent = seasonId == null || seasonId == 0; LocalDate localDate = LocalDate.now(); String format = localDate.format(DateTimeFormatter.ofPattern("yyyy:MM")); String key = "point:rank:board:" + format; PointsBoard pointsBoard = isCurrent ? queryMyCurrentBoard(key): queryMyCountHistoryBoard(seasonId); List<PointsBoard> pointsBoards = isCurrent ? queryCurrentBoardList(key,query.getPageNo(),query.getPageSize()) : queryCountHistoryBoardList(query); PointsBoardVO result = new PointsBoardVO(); if (pointsBoard!=null){ result.setRank(pointsBoard.getRank()); result.setPoints(pointsBoard.getPoints()); } if (CollectionUtils.isEmpty(pointsBoards)){ return result; } result.setBoardList(pointsBoards);
return result; }
private PointsBoard queryMyCurrentBoard(String key) { BoundZSetOperations<String, String> ops = redisTemplate.boundZSetOps(key); Long userId = 13666666L; Double score = ops.score(userId.toString()); Long rank = ops.reverseRank(userId.toString()); PointsBoard board = new PointsBoard(); board.setRank(rank.intValue()+1); board.setUserId(userId); board.setPoints(score.intValue()); return board; }
private PointsBoard queryMyCountHistoryBoard(Long seasonId) { Long userId = 13666666L; TableNameContext.setInfo("points_board_"+seasonId); PointsBoard board = lambdaQuery().eq(PointsBoard::getUserId, userId).one(); board.setRank(board.getId().intValue()); TableNameContext.remove(); return board; }
private List<PointsBoard> queryCurrentBoardList(String key, Integer pageNo, Integer pageSize) { int from = (pageNo - 1) * pageSize; int end = from + pageSize + 1; Set<ZSetOperations.TypedTuple<String>> tuples = redisTemplate.opsForZSet().reverseRangeWithScores(key, from, end); if (CollectionUtils.isEmpty(tuples)) { return new ArrayList<>(); } int rank = from + 1; List<PointsBoard> result = new LinkedList<>(); for (ZSetOperations.TypedTuple<String> tuple : tuples) { String userId = tuple.getValue(); Double score = tuple.getScore(); if (userId==null||score==null){ continue; } PointsBoard board = new PointsBoard(); board.setRank(rank++); board.setUserId(Long.valueOf(userId)); board.setPoints(score.intValue()); result.add(board); } return result; }
private List<PointsBoard> queryCountHistoryBoardList(BoardQuery query) { Long seasonId = query.getSeasonId(); TableNameContext.setInfo("points_board_"+seasonId); Page<PointsBoard> ipage = new Page<>(query.getPageNo(), query.getPageSize()); Page<PointsBoard> page = pointsBoardMapper.selectPage(ipage, null); List<PointsBoard> boardList = page.getRecords(); TableNameContext.remove(); return boardList; }
@Override public void createPointsBoardTableBySeason(Integer season) { pointsBoardMapper.createPointsBoardTable("points_board_" + season); } }
|
定时任务类
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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
| package com.orchids.ranklist.web.handler;
import com.orchids.ranklist.web.domain.po.PointsBoard; import com.orchids.ranklist.web.service.IPointsBoardSeasonService; import com.orchids.ranklist.web.service.IPointsBoardService; import com.orchids.ranklist.web.utils.TableNameContext; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ZSetOperations; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Set;
@Slf4j @Component @RequiredArgsConstructor public class PointsBoardPersistentHandler { private final IPointsBoardSeasonService seasonService; private final IPointsBoardService pointsBoardService; private final StringRedisTemplate redisTemplate;
@XxlJob("xxl_job_time_test") public void createLocalTime(){ log.debug("xl_job_demo执行器正在执行现在时间是{}",LocalDateTime.now()); System.out.println("xl_job_demo执行器正在执行现在时间是"+LocalDateTime.now()); } @XxlJob("xxl_job_points_board_create_table") public void createPointBoardTableOfSeason(){ LocalDateTime time = LocalDateTime.now().minusMonths(1); Integer season = seasonService.querySeasonByTime(time); if (season == null){ return; } TableNameContext.setInfo("points_board_" + season); pointsBoardService.createPointsBoardTableBySeason(season); }
@XxlJob("xxl_job_points_board_save_mysql") private void savePointsBoardToDb() { LocalDateTime time = LocalDateTime.now().minusMonths(1); Integer season = seasonService.querySeasonByTime(time); TableNameContext.setInfo("points_board_"+season); LocalDateTime now = LocalDateTime.now(); String format = now.format(DateTimeFormatter.ofPattern("yyyy:MM")); String key = "point:rank:board:" + format; int pageNo =1; int pageSize = 1000; System.out.println(key);
while (true){ List<PointsBoard> pointsBoards = queryCurrentBoardList(key, pageNo, pageSize); if (CollectionUtils.isEmpty(pointsBoards)){ break; } pointsBoardService.saveBatch(pointsBoards); System.out.println("持久化成功"); pageNo++; } TableNameContext.remove(); } @XxlJob("xxl_job_points_board_remove_redis") public void clearPointsBoardFromRedis(){ LocalDateTime time = LocalDateTime.now().minusMonths(1); String key = "point:rank:board:" + time.format(DateTimeFormatter.ofPattern("yyyy:MM")); redisTemplate.unlink(key); } public List<PointsBoard> queryCurrentBoardList(String key, Integer pageNo, Integer pageSize) { int from = (pageNo - 1) * pageSize; int end = from + pageSize + 1; Set<ZSetOperations.TypedTuple<String>> tuples = redisTemplate.opsForZSet().reverseRangeWithScores(key, from, end); if (CollectionUtils.isEmpty(tuples)) { return new ArrayList<>(); } int rank = from + 1; List<PointsBoard> result = new LinkedList<>(); for (ZSetOperations.TypedTuple<String> tuple : tuples) { String userId = tuple.getValue(); Double score = tuple.getScore(); if (userId==null||score==null){ continue; } PointsBoard board = new PointsBoard(); board.setId(Long.valueOf(rank++)); board.setUserId(Long.valueOf(userId)); board.setPoints(score.intValue()); result.add(board); } return result; }
}
|
配置类
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
| package com.orchids.ranklist.web.config;
import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler; import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.orchids.ranklist.web.utils.TableNameContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;
import java.util.HashMap; import java.util.Map;
@Configuration public class MybatisPlusConfiguration {
@Bean public DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() { Map<String, TableNameHandler> map = new HashMap<>(1); map.put("points_board", (sql, tableName) -> TableNameContext.getInfo() == null ? tableName : TableNameContext.getInfo()); return new DynamicTableNameInnerInterceptor(map); }
@Bean public MybatisPlusInterceptor mybatisPlusInterceptor(@Autowired(required = false) DynamicTableNameInnerInterceptor nameInnerInterceptor) { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(nameInnerInterceptor); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
|
xxl配置类
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
| package com.orchids.ranklist.web.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;
@Slf4j @Configuration @EnableConfigurationProperties(XxlJobProperties.class) public class XxlJobConfig {
@Bean public XxlJobSpringExecutor xxlJobExecutor(XxlJobProperties prop) { log.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
XxlJobProperties.Admin admin = prop.getAdmin(); if (admin != null && admin.getAddress()!=null) { xxlJobSpringExecutor.setAdminAddresses(admin.getAddress()); }
XxlJobProperties.Executor executor = prop.getExecutor(); if (executor != null) { if (executor.getAppName() != null) xxlJobSpringExecutor.setAppname(executor.getAppName()); if (executor.getIp() != null) xxlJobSpringExecutor.setIp(executor.getIp()); if (executor.getPort() != null) xxlJobSpringExecutor.setPort(executor.getPort()); if (executor.getLogPath() != null) xxlJobSpringExecutor.setLogPath(executor.getLogPath()); if (executor.getLogRetentionDays() != null) xxlJobSpringExecutor.setLogRetentionDays(executor.getLogRetentionDays()); }
if (prop.getAccessToken() != null) xxlJobSpringExecutor.setAccessToken(prop.getAccessToken());
log.info(">>>>>>>>>>> xxl-job config end.");
return xxlJobSpringExecutor; } }
|
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
| package com.orchids.ranklist.web.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import lombok.Data; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@ConditionalOnClass(XxlJobSpringExecutor.class) @ConfigurationProperties(prefix = "xxl-job") public class XxlJobProperties { private String accessToken; private Admin admin; private Executor executor;
@Data public static class Admin { private String address; }
@Data public static class Executor { private String appName; private String address; private String ip; private Integer port; private String logPath; private Integer logRetentionDays;
} }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <?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"> <!--接口的地址com开始到接口名UserMapper--> <mapper namespace="com.orchids.ranklist.web.mapper.PointsBoardMapper">
<!--sql语句--> <insert id="createPointsBoardTable"> CREATE TABLE `${tableName}` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '榜单id', `user_id` BIGINT NOT NULL COMMENT '学生id', `points` INT NOT NULL COMMENT '积分值', PRIMARY KEY (`id`) USING BTREE, INDEX `idx_user_id` (`user_id`) USING BTREE ) COMMENT ='学霸天梯榜' COLLATE = 'utf8mb4_0900_ai_ci' ENGINE = InnoDB ROW_FORMAT = DYNAMIC </insert> </mapper>
|
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
| server: port: 8081 spring: application: name: rank-list mvc: pathmatch: matching-strategy: ant_path_matcher redis: port: 6379 host: localhost password: 6379 datasource: type: com.zaxxer.hikari.HikariDataSource url: jdbc:mysql://localhost:3306/tianji_redis?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2b8 username: root password: 123123 hikari: connection-test-query: SELECT 1 connection-timeout: 60000 idle-timeout: 500000 max-lifetime: 540000 maximum-pool-size: 12 minimum-idle: 10 pool-name: SPHHikariPool
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl xxl-job: access-token: default_token admin: address: http://localhost:8080/xxl-job-admin executor: appname: rank-list log-retention-days: 10 logPath: rank-list
|
其他的类
PointsBoard
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
| package com.orchids.ranklist.web.domain.po;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.io.Serializable; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors;
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true)
public class PointsBoard implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id") private Long id;
@TableField("user_id") private Long userId;
@TableField("points") private Integer points;
@TableField(exist = false) private Integer rank;
@TableField(exist = false) private Integer season;
}
|
PointsBoardSeason
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
| package com.orchids.ranklist.web.domain.po;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import java.time.LocalDate; import com.baomidou.mybatisplus.annotation.TableId; import java.io.Serializable; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors;
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("points_board_season") public class PointsBoardSeason implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO) private Integer id;
private String name;
private LocalDate beginTime;
private LocalDate endTime;
}
|
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
| package com.orchids.ranklist.web.domain.query;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors;
import javax.validation.constraints.Min;
@Data @ApiModel(description = "分页请求参数") @Accessors(chain = true) public class BoardQuery { public static final Integer DEFAULT_PAGE_SIZE = 20; public static final Integer DEFAULT_PAGE_NUM =1; @ApiModelProperty(value = "页码", example = "1") @Min(value = 1, message = "页码不能小于1") private Integer pageNo = DEFAULT_PAGE_NUM;
@ApiModelProperty(value = "每页大小", example = "5") @Min(value = 1, message = "每页查询数量不能小于1") private Integer pageSize = DEFAULT_PAGE_SIZE;
@ApiModelProperty(value = "赛季id,为null或者0则代表查询当前赛季") private Long seasonId; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package com.orchids.ranklist.web.domain.vo;
import com.orchids.ranklist.web.domain.po.PointsBoard; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data;
import java.util.List;
@Data @ApiModel(description = "积分榜单汇总信息") public class PointsBoardVO { @ApiModelProperty("我的榜单排名") private Integer rank; @ApiModelProperty("我的积分值") private Integer points; @ApiModelProperty("前100名上榜人信息") private List<PointsBoard> boardList; }
|
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 97 98 99 100 101 102 103 104
| <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.orchids</groupId> <artifactId>rank-list</artifactId> <version>0.0.1-SNAPSHOT</version> <name>rank-list</name> <description>rank-list</description> <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.6.13</spring-boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </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> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.4.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.orchids.ranklist.RankListApplication</mainClass> <skip>true</skip> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
</project>
|
测试
当前赛季


历史赛季

