本地调试成功

This commit is contained in:
flykhan 2023-03-12 20:08:43 +08:00
parent 304f2fbd0c
commit cc95f82b7f
29 changed files with 132 additions and 74 deletions

View File

@ -12,6 +12,28 @@
<groupId>com.kob.backend</groupId>
<artifactId>backend</artifactId>
<!-- 项目打包类型 : jar -->
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--这里写上main方法所在类的路径-->
<configuration>
<mainClass>com.kob.backend.BackendApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>

View File

@ -48,7 +48,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/user/account/token/", "/user/account/register/").permitAll()
.antMatchers("/api/user/account/token/", "/api/user/account/register/").permitAll()
.antMatchers("/pk/start/","/pk/receive/bot/move/").hasIpAddress("127.0.0.1")
.antMatchers(HttpMethod.OPTIONS).permitAll()
.anyRequest().authenticated();

View File

@ -10,7 +10,6 @@ import com.kob.backend.mapper.UserMapper;
import com.kob.backend.pojo.User;
import com.kob.backend.service.impl.utils.UserDetailsImpl;
import com.kob.backend.utils.JwtUtil;
import com.sun.xml.internal.bind.v2.TODO;
import io.jsonwebtoken.Claims;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -46,8 +46,8 @@ public class WebSocketServer {
private User user;
public Game game = null;
// addPlayer 添加用户到匹配池的 URL; removePlayer 从匹配池移除用户的 URL
private final static String addPlayerUrl = "http://127.0.0.1:3001/player/add/";
private final static String removePlayerUrl = "http://127.0.0.1:3001/player/remove/";
private final static String addPlayerUrl = "http://127.0.0.1:3002/player/add/";
private final static String removePlayerUrl = "http://127.0.0.1:3002/player/remove/";
@Autowired
public void setRestTemplate(RestTemplate restTemplate) {

View File

@ -33,7 +33,7 @@ public class Game extends Thread {
// 定义失败者: all(平局), A(A输), B(B输)
private String loser = "";
// 传送消息给 BotRunningSystem 的链接
private static final String addBotUrl = "http://127.0.0.1:3002/bot/add/";
private static final String addBotUrl = "http://127.0.0.1:3003/bot/add/";
// 初始化(有参)构造函数

View File

@ -1,3 +1,4 @@
// 微服务内部 api
package com.kob.backend.controller.pk;
import com.kob.backend.service.pk.ReceiveBotMoveService;

View File

@ -1,3 +1,4 @@
// 微服务内部 api
package com.kob.backend.controller.pk;

View File

@ -14,7 +14,7 @@ public class GetRankListController {
@Autowired
private GetRankListService getRankListService;
@GetMapping("/ranklist/getranklist/")
@GetMapping("/api/ranklist/getranklist/")
JSONObject getRankList(@RequestParam Map<String, String> data) {
Integer page = Integer.parseInt(data.get("page_index"));
Integer.parseInt(data.get("page_index"));

View File

@ -15,7 +15,7 @@ public class GetRecordListController {
private GetRecordListService getRecordListService;
// 这里只需要获取,因此只需要用 get 方法(需要新建和修改数据时,使用 post 方法)
@GetMapping("/record/getlist/")
@GetMapping("/api/record/getlist/")
public JSONObject getList(@RequestParam Map<String, String> data) {
// 解析出 page 信息
Integer page = Integer.parseInt(data.get("page_index"));

View File

@ -13,7 +13,7 @@ public class InfoController {
private InfoService infoService;
// 获取信息
@GetMapping("/user/account/info/")
@GetMapping("/api/user/account/info/")
public Map<String,String> getInfo(){
return infoService.getInfo();
}

View File

@ -16,7 +16,7 @@ public class LoginController {
private LoginService loginService;
// 登录使用 POST 请求,密文传输,更安全
@PostMapping("/user/account/token/")
@PostMapping("/api/user/account/token/")
public Map<String,String> getToken(@RequestParam Map<String,String> map){
String username = map.get("username");
String password = map.get("password");

View File

@ -13,7 +13,7 @@ public class RegisterController {
@Autowired
private RegisterService registerService;
@PostMapping("/user/account/register/")
@PostMapping("/api/user/account/register/")
public Map<String, String> register(@RequestParam Map<String, String> map) {
String username = map.get("username");
String password = map.get("password");

View File

@ -11,7 +11,7 @@ public class AddController {
@Autowired
private AddService addService;
@PostMapping("/user/bot/add/")
@PostMapping("/api/user/bot/add/")
public Map<String,String> add(@RequestParam Map<String,String> data){
return addService.add(data);
}

View File

@ -15,7 +15,7 @@ public class GetListController {
@Autowired
private GetListService getListService;
@GetMapping("/user/bot/getlist/")
@GetMapping("/api/user/bot/getlist/")
public List<Bot> getList(){
return getListService.getList();
}

View File

@ -13,7 +13,7 @@ public class RemoveController {
@Autowired
private RemoveService removeService;
@PostMapping("/user/bot/remove/")
@PostMapping("/api/user/bot/remove/")
public Map<String,String> remove(@RequestParam Map<String,String> data){
return removeService.remove(data);
}

View File

@ -13,7 +13,7 @@ public class UpdateController {
@Autowired
private UpdateService updateService;
@PostMapping("/user/bot/update/")
@PostMapping("/api/user/bot/update/")
public Map<String,String> update(@RequestParam Map<String,String> data){
return updateService.update(data);
}

View File

@ -1,5 +1,5 @@
#default server port
server.port=3000
server.port=3001
#mysql database connect profile
spring.datasource.username=root

View File

@ -1,18 +0,0 @@
package com.kob.backend;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@SpringBootTest
class BackendApplicationTests {
// 测试明文加密
@Test
void contextLoads() {
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
System.out.println(passwordEncoder.encode("123"));
}
}

View File

@ -12,6 +12,28 @@
<groupId>com.kob.botrunningsystem</groupId>
<artifactId>botrunningsystem</artifactId>
<!-- 项目打包类型 : jar -->
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--这里写上main方法所在类的路径-->
<configuration>
<mainClass>com.kob.botrunningsystem.BotRunningSystemApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>

View File

@ -19,7 +19,7 @@ import java.util.function.Supplier;
public class Consumer extends Thread {
private Bot bot;
// 定义返回信息 URL
private final static String receiveBotMoveUrl = "http://127.0.0.1:3000/pk/receive/bot/move/";
private final static String receiveBotMoveUrl = "http://127.0.0.1:3001/pk/receive/bot/move/";
//注入 RestTemplate 用于给 backend 服务发送信息
private static RestTemplate restTemplate;

View File

@ -1 +1 @@
server.port=3002
server.port=3003

View File

@ -12,6 +12,28 @@
<groupId>com.kob.matchingsystem</groupId>
<artifactId>matchingsystem</artifactId>
<!-- 项目打包类型 : jar -->
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--这里写上main方法所在类的路径-->
<configuration>
<mainClass>com.kob.matchingsystem.MatchingSystemApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>

View File

@ -18,7 +18,7 @@ public class MatchingPool extends Thread {
// 定义一个锁, Reentrant Lock 是可重入锁
private final ReentrantLock lock = new ReentrantLock();
// 定义微服务传值 URL
private static final String startGameUrl = "http://127.0.0.1:3000/pk/start/";
private static final String startGameUrl = "http://127.0.0.1:3001/pk/start/";
// 定义 RestTemplate 用来微服务数据通信
private static RestTemplate restTemplate;
@ -27,11 +27,11 @@ public class MatchingPool extends Thread {
MatchingPool.restTemplate = restTemplate;
}
public void addPlayer(Integer userId, Integer rating,Integer botId) {
public void addPlayer(Integer userId, Integer rating, Integer botId) {
lock.lock();
try {
// 一开始匹配等待时间是 0
playerList.add(new Player(userId, rating,botId, 0));
playerList.add(new Player(userId, rating, botId, 0));
} finally {
lock.unlock();
}
@ -65,7 +65,7 @@ public class MatchingPool extends Thread {
// 判断两名玩家是否匹配
private boolean checkMatched(Player a, Player b) {
int ratingDelta = Math.abs(a.getRating() - b.getRating()); // 两名玩家的天梯积分之差
int ratingDelta = Math.abs(a.getRating() - b.getRating()); // 两名玩家的天梯积分之差
// a b 两名玩家的等待时间最小值
// min 是两方任意一方接受等待时间就可以匹配, max 是两方都接受的匹配
int minWaitingTime = Math.min(a.getWaitingTime(), b.getWaitingTime());
@ -79,29 +79,31 @@ public class MatchingPool extends Thread {
MultiValueMap<String, String> data = new LinkedMultiValueMap<>();
// 返回两名玩家的 userId botId
data.add("a_id", a.getUserId().toString());
data.add("a_bot_id",a.getBotId().toString());
data.add("a_bot_id", a.getBotId().toString());
data.add("b_id", b.getUserId().toString());
data.add("b_bot_id",b.getBotId().toString());
data.add("b_bot_id", b.getBotId().toString());
restTemplate.postForObject(startGameUrl, data, String.class);
}
// 尝试匹配所有玩家
private void matchPlayers() {
//TODO 后端调试
System.out.println("match players: " + playerList.toString());
// TODO 后端调试
// System.out.println("match players: " + playerList.toString());
// havaMatched 表示玩家已经匹配过了
boolean[] haveMatched = new boolean[playerList.size()];
for (int i = 0; i < playerList.size(); i++) {
if (haveMatched[i]) continue; // 如果当前枚举到的玩家已经匹配过了,则跳过改玩家
for (int j = i + 1; j < playerList.size(); j++) { // j i+1 开始枚举
if (haveMatched[j]) continue;
if (haveMatched[i])
continue; // 如果当前枚举到的玩家已经匹配过了,则跳过改玩家
for (int j = i + 1; j < playerList.size(); j++) { // j i+1 开始枚举
if (haveMatched[j])
continue;
// 如果 i j 都没有匹配,则将 a b 玩家取出来
Player a = playerList.get(i);
Player b = playerList.get(j);
// 判断 a b 能否匹配:如果匹配,则将结果返回,并将 a b 的位置置为 true
if (checkMatched(a, b)) {
haveMatched[i] = haveMatched[j] = true; // 置为已匹配
sendResult(a, b); // 返回匹配玩家结果
sendResult(a, b); // 返回匹配玩家结果
break;
}
}

View File

@ -1 +1 @@
server.port=3001
server.port=3002

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 264 KiB

View File

@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<title>KoS</title>
</head>
<body>
<noscript>

View File

@ -1,5 +1,5 @@
import $ from "jquery";
import store from ".";
// import $ from "jquery";
// import store from ".";
export default {
state: {
@ -22,25 +22,25 @@ export default {
},
},
actions: {
getRecordList(context, data) {
// 获取 Bot 列表
$.ajax({
url: "http://localhost:3001/api/record/getlist/",
data: {
page_index: data.page,
},
type: "GET",
headers: {
Authorization: "Bearer " + store.state.user.token,
},
success(resp) {
data.success(resp);
},
error(resp) {
data.error(resp);
},
});
},
// getRecordList(context, data) {
// // 获取 Bot 列表
// $.ajax({
// url: "http://localhost:3001/api/record/getlist/",
// data: {
// page_index: data.page,
// },
// type: "GET",
// headers: {
// Authorization: "Bearer " + store.state.user.token,
// },
// success(resp) {
// data.success(resp);
// },
// error(resp) {
// data.error(resp);
// },
// });
// },
},
modules: {},
};

View File

@ -93,7 +93,7 @@ export default {
$.ajax({
url: "http://localhost:3001/api/ranklist/getranklist/",
data: {
page_index:page,
page_index: page,
},
type: "GET",
headers: {

View File

@ -62,6 +62,7 @@ import ContentBase from "../../components/ContentBase.vue";
import { useStore } from 'vuex';
import { ref } from "vue";
import router from "@/router/index";
import $ from "jquery";
export default {
components: {
@ -103,9 +104,15 @@ export default {
const pull_page = (page) => { //
current_page = page; //
store.dispatch("getRecordList", {
page,
$.ajax({
url: "http://localhost:3001/api/record/getlist/",
data: {
page_index: page,
},
type: "GET",
headers: {
Authorization: "Bearer " + store.state.user.token,
},
success(resp) {
console.log(resp.records);
records.value = resp.records;