From de25a05c80141fd4113af2d3c85989cf0e959d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E7=9A=AE=E5=B9=BC=E9=B8=9F?= <2960474346@qq.com> Date: Sat, 13 Apr 2024 16:00:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E3=80=81=E4=BA=91=E7=AB=AF=E6=95=B0=E6=8D=AE=E5=BA=93=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E7=89=88=E6=9C=AC=E5=8F=B7=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/LevelController.java | 34 +++++++- .../catchTheLetters/entity/Version.java | 8 ++ .../service/VersionService.java | 24 ++++++ .../service/impl/VersionServiceImpl.java | 33 +++++++ .../catchTheLetters/TestInsertLevel.java | 86 +++++++++++-------- 5 files changed, 148 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/example/catchTheLetters/service/VersionService.java create mode 100644 src/main/java/com/example/catchTheLetters/service/impl/VersionServiceImpl.java diff --git a/src/main/java/com/example/catchTheLetters/controller/LevelController.java b/src/main/java/com/example/catchTheLetters/controller/LevelController.java index 38bd2f1..9940125 100644 --- a/src/main/java/com/example/catchTheLetters/controller/LevelController.java +++ b/src/main/java/com/example/catchTheLetters/controller/LevelController.java @@ -4,6 +4,7 @@ import com.example.catchTheLetters.entity.Level; import com.example.catchTheLetters.model.vo.RankVo; import com.example.catchTheLetters.entity.ScoreInfo; import com.example.catchTheLetters.service.LevelService; +import com.example.catchTheLetters.service.VersionService; import com.example.catchTheLetters.utils.R; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -27,6 +28,9 @@ public class LevelController { @Resource private LevelService levelService; + @Resource + private VersionService versionService; + @ApiOperation(value = "关卡列表(只返回ID、排序、名称和类型)") @GetMapping("/list") public R> list() { @@ -43,20 +47,38 @@ public class LevelController { @ApiOperation(value = "关卡创建(web前端管理员提交)") @PostMapping("/create") public R create(@RequestBody Level level) { - return levelService.levelCreate(level) ? R.ok() : R.fail(); + var res = levelService.levelCreate(level); + // 如果创建成功,将当前UNIX时间戳作为版本号 + if (res) { + versionService.setVersion("level", System.currentTimeMillis()); + return R.ok(); + } + return R.fail(); } @ApiOperation(value = "关卡修改(web前端管理员提交)") @PostMapping("/update") public R update(@RequestBody Level level) { - return levelService.update(level) ? R.ok() : R.fail(); + var res = levelService.update(level); + // 如果修改成功,将当前UNIX时间戳作为版本号 + if (res) { + versionService.setVersion("level", System.currentTimeMillis()); + return R.ok(); + } + return R.fail(); } @ApiOperation(value = "关卡删除(web前端管理员提交)") @PostMapping("/delete") public R delete(String id) { - return levelService.delete(id) ? R.ok() : R.fail(); + var res = levelService.delete(id); + // 如果删除成功,将当前UNIX时间戳作为版本号 + if (res) { + versionService.setVersion("level", System.currentTimeMillis()); + return R.ok(); + } + return R.fail(); } @ApiOperation(value = "获取某个关卡排行榜数据") @@ -71,4 +93,10 @@ public class LevelController { public R settle(@RequestBody ScoreInfo scoreInfo, @RequestHeader("token")String token) { return levelService.settle(scoreInfo, token); } + + @ApiOperation(value = "获取表版本号(用于本地数据库和服务器数据库同步)") + @GetMapping("/version") + public R version() { + return R.ok(versionService.getVersion("level")); + } } diff --git a/src/main/java/com/example/catchTheLetters/entity/Version.java b/src/main/java/com/example/catchTheLetters/entity/Version.java index 1a7d646..3b07d18 100644 --- a/src/main/java/com/example/catchTheLetters/entity/Version.java +++ b/src/main/java/com/example/catchTheLetters/entity/Version.java @@ -19,4 +19,12 @@ public class Version implements Serializable { * 数据表版本号 */ private Long version; + + public Version() { + } + + public Version(String table, Long version) { + this.table = table; + this.version = version; + } } diff --git a/src/main/java/com/example/catchTheLetters/service/VersionService.java b/src/main/java/com/example/catchTheLetters/service/VersionService.java new file mode 100644 index 0000000..0c0c6b1 --- /dev/null +++ b/src/main/java/com/example/catchTheLetters/service/VersionService.java @@ -0,0 +1,24 @@ +package com.example.catchTheLetters.service; + +/** + * 版本服务接口 + * + * @author spyn + */ +public interface VersionService { + /** + * 获取某个表的版本号(用于Realm对MongoDB的数据表版本进行同步检测,版本号不同则进行同步) + * + * @param tableName 表名 + * @return 版本号 + */ + Long getVersion(String tableName); + + /** + * 设置某个表的版本号(用于Realm对MongoDB的数据表版本进行同步检测,版本号不同则进行同步) + * + * @param tableName 表名 + * @param version 版本号 + */ + void setVersion(String tableName, Long version); +} diff --git a/src/main/java/com/example/catchTheLetters/service/impl/VersionServiceImpl.java b/src/main/java/com/example/catchTheLetters/service/impl/VersionServiceImpl.java new file mode 100644 index 0000000..0eb1864 --- /dev/null +++ b/src/main/java/com/example/catchTheLetters/service/impl/VersionServiceImpl.java @@ -0,0 +1,33 @@ +package com.example.catchTheLetters.service.impl; + +import com.example.catchTheLetters.entity.Version; +import com.example.catchTheLetters.service.VersionService; +import jakarta.annotation.Resource; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +@Service +public class VersionServiceImpl implements VersionService { + + @Resource + private MongoTemplate mongoTemplate; + + @Override + public Long getVersion(String tableName) { + var res = mongoTemplate.findOne(new Query(Criteria.where("table").is(tableName)), Version.class); + return res == null ? null : res.getVersion(); + } + + @Override + public void setVersion(String tableName, Long version) { + var res = mongoTemplate.findOne(new Query(Criteria.where("table").is(tableName)), Version.class); + if (res == null) { + mongoTemplate.save(new Version(tableName, version)); + } else { + res.setVersion(version); + mongoTemplate.save(res); + } + } +} diff --git a/src/test/java/com/example/catchTheLetters/TestInsertLevel.java b/src/test/java/com/example/catchTheLetters/TestInsertLevel.java index fd00af2..a770282 100644 --- a/src/test/java/com/example/catchTheLetters/TestInsertLevel.java +++ b/src/test/java/com/example/catchTheLetters/TestInsertLevel.java @@ -1,5 +1,6 @@ package com.example.catchTheLetters; +import com.example.catchTheLetters.controller.LevelController; import com.example.catchTheLetters.entity.Level; import com.example.catchTheLetters.service.LevelService; import jakarta.annotation.Resource; @@ -7,47 +8,48 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.ArrayList; +import java.util.List; import java.util.Random; @SpringBootTest class TestInsertLevel { @Resource - private LevelService levelService; + private LevelController levelController; + + private final List words = new ArrayList<>() { + { + add("apple"); + add("banana"); + add("cherry"); + add("date"); + add("elderberry"); + add("fig"); + add("grape"); + add("honeydew"); + add("imbe"); + add("jackfruit"); + add("kiwi"); + add("lemon"); + add("mango"); + add("nectarine"); + add("orange"); + add("papaya"); + add("quince"); + add("raspberry"); + add("strawberry"); + add("tangerine"); + add("ugli"); + add("vanilla"); + add("watermelon"); + add("ximenia"); + add("yuzu"); + add("zucchini"); + } + }; @Test void testInsertLevel() { - var words = new ArrayList(){ - { - add("apple"); - add("banana"); - add("cherry"); - add("date"); - add("elderberry"); - add("fig"); - add("grape"); - add("honeydew"); - add("imbe"); - add("jackfruit"); - add("kiwi"); - add("lemon"); - add("mango"); - add("nectarine"); - add("orange"); - add("papaya"); - add("quince"); - add("raspberry"); - add("strawberry"); - add("tangerine"); - add("ugli"); - add("vanilla"); - add("watermelon"); - add("ximenia"); - add("yuzu"); - add("zucchini"); - } - }; - // 存20个关卡 for (int i = 0; i < 20; i++) { var type = new Random().nextInt(2); @@ -59,9 +61,25 @@ class TestInsertLevel { wordList.add(words.get(new Random().nextInt(words.size()))); } // 时间全部设置为3分钟 - var level = new Level(Integer.toString(i), i, "Level" + i, type, 180000L, targetScore, wordList); + var level = new Level(Integer.toString(i), i, "Level " + i, type, 180000L, targetScore, wordList); - levelService.levelCreate(level); + levelController.create(level); } } + + @Test + void insertALevel() { + var type = new Random().nextInt(2); + // 如果是1,则需要设置目标分数 + var targetScore = type == 1 ? new Random().nextInt(100) : null; + // 如果是0,则单词列表5个就够,否则15个 + var wordList = new ArrayList(); + for (int j = 0; j < (type == 0 ? 5 : 15); j++) { + wordList.add(words.get(new Random().nextInt(words.size()))); + } + // 时间全部设置为3分钟 + var level = new Level("20", 20, "Level 20", type, 180000L, targetScore, wordList); + + levelController.create(level); + } }