diff --git a/.gitignore b/.gitignore
index 5ff6309..8a9d8ad 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,4 +35,6 @@ build/
.vscode/
### Mac OS ###
-.DS_Store
\ No newline at end of file
+.DS_Store
+
+.env
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 894ba69..ea9247b 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -27,6 +27,8 @@
+
+
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..3018bff
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 8b2863e..f6ec5cf 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,9 @@
应该是第三代后端了吧。
-新的重写过的后端,其实在这版正式出来之前已经有很多个实验性的原型版本了,但是都因为效果不如意胎死腹中给砍了,没有继续写下去(其实这个readme也是曾经最早的一个原型版本改来的)
+新的重写过的后端,其实在这版正式出来之前已经有很多个实验性的原型版本了,用了各种不同的技术,包括grpc,dubbo等等,但是都因为效果不如意或者不合适胎死腹中给砍了,没有继续写下去(其实这个readme也是曾经最早的一个原型版本改来的)
+
+现在的这个版本应该差不多了,是时候放上来了。
这代后端结构与前面的有很大不同,使用了真·多模块的方式运行部署,部分独立模块以不同的程序运行,子模块部署在内网时,可以自动注册frpc进行服务远程转发,主服务和子服务通过http进行通信调用,各模块可以部署在不同的服务器或容器中,当然,也可以挤在一起跑。
@@ -22,8 +24,9 @@
## 环境要求
包管理和构建:
-Maven 3.8.2+
-- 后续可能会看情况转用Gradle
+Maven 3.8.2+
+
+- *后续可能会看情况转用Gradle*
Java版本:
Java 17+
@@ -32,7 +35,7 @@ Java 17+
## 项目模块结构
-### agent-service
+详见[doc](/doc)
---
@@ -40,10 +43,18 @@ Java 17+
---
-## 文档
+## API文档
详见[doc](/doc)
---
+## 构建
+
+---
+
+## 运行
+
+---
+
就先这样吧,手累了
\ No newline at end of file
diff --git a/backend-main/backend-data/src/main/java/cn/wustlinghang/data/Main.java b/backend-main/backend-data/src/main/java/cn/wustlinghang/main/data/Main.java
similarity index 76%
rename from backend-main/backend-data/src/main/java/cn/wustlinghang/data/Main.java
rename to backend-main/backend-data/src/main/java/cn/wustlinghang/main/data/Main.java
index 87fe5b7..f550351 100644
--- a/backend-main/backend-data/src/main/java/cn/wustlinghang/data/Main.java
+++ b/backend-main/backend-data/src/main/java/cn/wustlinghang/main/data/Main.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.data;
+package cn.wustlinghang.main.data;
public class Main {
public static void main(String[] args) {
diff --git a/backend-main/backend-web/src/main/java/cn/wustlinghang/internal/api/v1/FrpPluginHandler.java b/backend-main/backend-web/src/main/java/cn/wustlinghang/internal/api/v1/FrpPluginHandler.java
new file mode 100644
index 0000000..07cce3c
--- /dev/null
+++ b/backend-main/backend-web/src/main/java/cn/wustlinghang/internal/api/v1/FrpPluginHandler.java
@@ -0,0 +1,20 @@
+package cn.wustlinghang.internal.api.v1;
+
+import cn.wustlinghang.internal.api.v1.response.FrpPluginResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@RestController
+@RequestMapping("/internal/frp")
+public class FrpPluginHandler {
+ @RequestMapping("/handler")
+ public FrpPluginResponse handle(String request) {
+ log.info(request);
+ return FrpPluginResponse.builder()
+ .reject(false)
+ .unchange(true)
+ .build();
+ }
+}
diff --git a/backend-main/backend-web/src/main/java/cn/wustlinghang/internal/api/v1/response/FrpPluginResponse.java b/backend-main/backend-web/src/main/java/cn/wustlinghang/internal/api/v1/response/FrpPluginResponse.java
new file mode 100644
index 0000000..731ab2a
--- /dev/null
+++ b/backend-main/backend-web/src/main/java/cn/wustlinghang/internal/api/v1/response/FrpPluginResponse.java
@@ -0,0 +1,14 @@
+package cn.wustlinghang.internal.api.v1.response;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class FrpPluginResponse {
+ private boolean reject;
+
+ private boolean unchange;
+
+// private String rejectReason;
+}
diff --git a/backend-main/backend-web/src/main/java/cn/wustlinghang/main/web/Main.java b/backend-main/backend-web/src/main/java/cn/wustlinghang/main/web/Main.java
new file mode 100644
index 0000000..27d10e0
--- /dev/null
+++ b/backend-main/backend-web/src/main/java/cn/wustlinghang/main/web/Main.java
@@ -0,0 +1,15 @@
+package cn.wustlinghang.main.web;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@EnableAsync
+@EnableScheduling
+@SpringBootApplication
+public class Main {
+ public static void main(String[] args) {
+ SpringApplication.run(Main.class);
+ }
+}
diff --git a/backend-main/backend-web/src/main/java/cn/wustlinghang/main/web/api/v2/undergrade/UndergradController.java b/backend-main/backend-web/src/main/java/cn/wustlinghang/main/web/api/v2/undergrade/UndergradController.java
new file mode 100644
index 0000000..f151964
--- /dev/null
+++ b/backend-main/backend-web/src/main/java/cn/wustlinghang/main/web/api/v2/undergrade/UndergradController.java
@@ -0,0 +1,13 @@
+package cn.wustlinghang.main.web.api.v2.undergrade;
+
+import cn.wustlinghang.wusthelper.main.response.Response;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/jwc")
+public class UndergradController {
+ public Response login() {
+ return Response.success("");
+ }
+}
\ No newline at end of file
diff --git a/backend-main/backend-web/src/main/resources/application.yml b/backend-main/backend-web/src/main/resources/application.yml
new file mode 100644
index 0000000..6897622
--- /dev/null
+++ b/backend-main/backend-web/src/main/resources/application.yml
@@ -0,0 +1,10 @@
+# 服务端配置
+# 密码/密钥/内部地址『禁止』写在此处或其他git能检测到的地方
+# 具体数值由运维填写在.env文件中,不能添加到git仓库中
+
+spring:
+ config:
+ import: optional:file:.env[.properties]
+
+server:
+ port: ${RUN_PORT}
\ No newline at end of file
diff --git a/backend-main/pom.xml b/backend-main/pom.xml
index 2150a77..5433147 100644
--- a/backend-main/pom.xml
+++ b/backend-main/pom.xml
@@ -22,4 +22,17 @@
UTF-8
+
+
+ cn.wustlinghang.wusthelper
+ common
+ ${revision}
+
+
+
+ cn.wustlinghang.mywust
+ mywust-common
+ ${mywust.version}
+
+
\ No newline at end of file
diff --git a/common/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/response/ResponseCode.java b/common/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/response/RpcCommonResponseCode.java
similarity index 56%
rename from common/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/response/ResponseCode.java
rename to common/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/response/RpcCommonResponseCode.java
index d882257..45a9f4e 100644
--- a/common/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/response/ResponseCode.java
+++ b/common/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/response/RpcCommonResponseCode.java
@@ -4,7 +4,7 @@
package cn.wustlinghang.wusthelper.internal.rpc.response;
-public enum ResponseCode {
+public enum RpcCommonResponseCode {
SUCCESS(20000, "成功"),
REQUEST_TOO_FAST(20001, "技能冷却中..."),
INVALID_REQUEST(30000, "非法请求"),
@@ -13,22 +13,13 @@ public enum ResponseCode {
TOKEN_EXPIRED(40001, "token过期"),
TOKEN_INVALID(40002, "token无效"),
SERVER_INTERNAL_ERROR(50000, "服务器内部错误"),
- API_NOT_IMPLEMENT(0, "接口未实现"),
-
- STUDENT_ID_DOES_NOT_EXISTS(60001,"学生学号不存在"),
- USER_WAS_BANNED_PUBLISH(60201, "用户被禁止发布告示信息"),
- IMAGE_FORMAT_WORN(60202, "上传的图片格式有误"),
- NOTICE_WAS_INTERCEPT(60203, "消息被系统拦截发布"),
-
- USER_DOES_NOT_MATCH_PUBLISHER(60301, "请求用户与告示发表者不匹配"),
-
- REQUEST_FILE_DOES_NOT_EXIST(60701, "请求的文件不存在");
+ API_NOT_IMPLEMENT(0, "接口未实现"),;
private final int code;
private final String message;
- ResponseCode(int code, String message) {
+ RpcCommonResponseCode(int code, String message) {
this.code = code;
this.message = message;
}
diff --git a/common/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/response/RpcResponse.java b/common/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/response/RpcResponse.java
index bd394c8..d1406e9 100644
--- a/common/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/response/RpcResponse.java
+++ b/common/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/response/RpcResponse.java
@@ -2,7 +2,7 @@ package cn.wustlinghang.wusthelper.internal.rpc.response;
public record RpcResponse(int code, String msg, T data) {
public static RpcResponse success(T data) {
- return new RpcResponse<>(ResponseCode.SUCCESS.getCode(), "ok", data);
+ return new RpcResponse<>(RpcCommonResponseCode.SUCCESS.getCode(), "ok", data);
}
public static RpcResponse success() {
@@ -13,7 +13,7 @@ public record RpcResponse(int code, String msg, T data) {
return new RpcResponse<>(code, message, null);
}
- public static RpcResponse error(ResponseCode code) {
+ public static RpcResponse error(RpcCommonResponseCode code) {
return error(code.getCode(), code.getMessage());
}
}
\ No newline at end of file
diff --git a/common/src/main/java/cn/wustlinghang/wusthelper/main/response/Response.java b/common/src/main/java/cn/wustlinghang/wusthelper/main/response/Response.java
new file mode 100644
index 0000000..2518116
--- /dev/null
+++ b/common/src/main/java/cn/wustlinghang/wusthelper/main/response/Response.java
@@ -0,0 +1,28 @@
+package cn.wustlinghang.wusthelper.main.response;
+
+
+/**
+ * 通用的响应
+ *
+ * @param code 响应码
+ * @param msg 响应信息
+ * @param data 响应数据
+ * @param data的类型
+ */
+public record Response(int code, String msg, T data) {
+ public static Response success(T data) {
+ return new Response<>(ResponseCode.SUCCESS.getCode(), "ok", data);
+ }
+
+ public static Response success() {
+ return success(null);
+ }
+
+ public static Response error(int code, String message) {
+ return new Response<>(code, message, null);
+ }
+
+ public static Response error(ResponseCode code) {
+ return error(code.getCode(), code.getMessage());
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/java/cn/wustlinghang/wusthelper/main/response/ResponseCode.java b/common/src/main/java/cn/wustlinghang/wusthelper/main/response/ResponseCode.java
new file mode 100644
index 0000000..9ad8f89
--- /dev/null
+++ b/common/src/main/java/cn/wustlinghang/wusthelper/main/response/ResponseCode.java
@@ -0,0 +1,28 @@
+/*
+ * Class created by lensfrex.
+ */
+
+package cn.wustlinghang.wusthelper.main.response;
+
+public enum ResponseCode {
+ SUCCESS(0, "成功"),
+ SERVER_INTERNAL_ERROR(-2, "服务器内部错误"),
+ API_NOT_IMPLEMENT(-1, "接口未实现");
+
+ private final int code;
+
+ private final String message;
+
+ ResponseCode(int code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+}
\ No newline at end of file
diff --git a/external-library/mywust b/external-library/mywust
index 965562b..736dc78 160000
--- a/external-library/mywust
+++ b/external-library/mywust
@@ -1 +1 @@
-Subproject commit 965562b69e35d445fb5c58b2e2afd9cdf27d3146
+Subproject commit 736dc78d1b9e64124474cee98c5db6e8212fa096
diff --git a/external-library/pom.xml b/external-library/pom.xml
index a926241..a21584b 100644
--- a/external-library/pom.xml
+++ b/external-library/pom.xml
@@ -14,5 +14,6 @@
pom
mywust
+ rpc-frp-consul
\ No newline at end of file
diff --git a/external-library/rpc-frp-consul/.gitignore b/external-library/rpc-frp-consul/.gitignore
new file mode 100644
index 0000000..5ff6309
--- /dev/null
+++ b/external-library/rpc-frp-consul/.gitignore
@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/external-library/rpc-frp-consul/pom.xml b/external-library/rpc-frp-consul/pom.xml
new file mode 100644
index 0000000..4428a92
--- /dev/null
+++ b/external-library/rpc-frp-consul/pom.xml
@@ -0,0 +1,42 @@
+
+
+ 4.0.0
+
+ cn.wustlinghang.wusthelper
+ external-library
+ 0.0.1-SNAPSHOT
+
+
+ rpc-frp-consul
+
+
+ 17
+ 17
+ UTF-8
+
+ 2.15.2
+ 0.5.4
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+ compile
+
+
+ cn.wustlinghang.mywust
+ mywust-network-okhttp
+ ${mywust.version}
+
+
+
+ org.ini4j
+ ini4j
+ ${ini4j.version}
+
+
+
\ No newline at end of file
diff --git a/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/FrpConsulRegister.java b/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/FrpConsulRegister.java
new file mode 100644
index 0000000..0e69639
--- /dev/null
+++ b/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/FrpConsulRegister.java
@@ -0,0 +1,92 @@
+package cn.wustlinghang.wusthelper.internal.rpc;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.wustlinghang.mywust.network.Requester;
+import cn.wustlinghang.wusthelper.internal.rpc.client.ConsulClient;
+import cn.wustlinghang.wusthelper.internal.rpc.client.FrpcClient;
+import cn.wustlinghang.wusthelper.internal.rpc.config.FrpConfig;
+import cn.wustlinghang.wusthelper.internal.rpc.config.RegisterConfig;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class FrpConsulRegister {
+
+ private final String serviceId;
+
+ private final RegisterConfig registerConfig;
+
+ private final FrpcClient frpcClientClient;
+
+ private final ConsulClient consulClient;
+
+ private boolean registered = false;
+
+ public FrpConsulRegister(RegisterConfig registerConfig, FrpConfig frpConfig,
+ Requester requester, ObjectMapper objectMapper) {
+
+ this.serviceId = RandomUtil.randomString(8);
+ this.registerConfig = registerConfig;
+
+ this.frpcClientClient = new FrpcClient(frpConfig, requester, objectMapper);
+ this.consulClient = new ConsulClient(this.serviceId, registerConfig, objectMapper, requester);
+ }
+
+ public void register() {
+ ThreadUtil.execute(() -> {
+ try {
+ log.info("连接frp并注册consul...");
+ this.doRegister();
+ log.info("注册完毕");
+ } catch (Exception e) {
+ log.warn("注册服务时发生异常:", e);
+ log.warn("不进行转发注册,直接服务");
+ }
+ });
+
+ Runtime.getRuntime().addShutdownHook(new Thread(this::onShutdown, "ShutdownHookThread"));
+ }
+
+ private void onShutdown() {
+ try {
+ if (this.registered) {
+ log.info("注销服务...");
+ this.consulClient.deregister();
+ this.frpcClientClient.removeProxy();
+ this.registered = false;
+ log.info("服务注销完毕");
+ }
+ } catch (Exception e) {
+ log.warn("注销服务时发生异常:", e);
+ }
+ }
+
+ private void doRegister() throws Exception {
+ frpcClientClient.addFrpProxy(
+ registerConfig.getServiceName(), serviceId,
+ "127.0.0.1", registerConfig.getLocalServicePort()
+ );
+
+ String remoteAddress;
+ String[] remote;
+ int retry = 0;
+ do {
+ // 先睡个0.5秒等待连接成功再获取状态读端口
+ ThreadUtil.sleep(500);
+
+ JsonNode proxy = frpcClientClient.getProxyStatus(registerConfig.getServiceName(), serviceId);
+ remoteAddress = proxy.path("remote_addr")
+ .asText("127.0.0.1:" + registerConfig.getLocalServicePort());
+ remote = remoteAddress.split(":");
+ retry++;
+ } while (retry < 3 && remote.length < 2);
+ if (retry == 3) {
+ throw new Exception("获取frp隧道信息重试次数过多,请手动添加隧道和注册中心");
+ }
+
+ this.consulClient.register(remoteAddress, Integer.parseInt(remote[1]));
+ this.registered = true;
+ }
+}
\ No newline at end of file
diff --git a/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/client/ConsulClient.java b/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/client/ConsulClient.java
new file mode 100644
index 0000000..e0aef38
--- /dev/null
+++ b/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/client/ConsulClient.java
@@ -0,0 +1,63 @@
+package cn.wustlinghang.wusthelper.internal.rpc.client;
+
+import cn.wustlinghang.mywust.network.Requester;
+import cn.wustlinghang.mywust.network.entitys.HttpResponse;
+import cn.wustlinghang.mywust.network.request.RequestFactory;
+import cn.wustlinghang.wusthelper.internal.rpc.config.RegisterConfig;
+import cn.wustlinghang.wusthelper.internal.rpc.entity.RegisterRequestBody;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+
+@Slf4j
+public class ConsulClient {
+ private final String serviceId;
+ private final String serviceName;
+ private final String consulAddress;
+
+ private final ObjectMapper objectMapper;
+ private final Requester requester;
+
+ public ConsulClient(String serviceId, RegisterConfig registerConfig, ObjectMapper objectMapper, Requester requester) {
+ this.serviceId = serviceId;
+ this.serviceName = registerConfig.getServiceName();
+ this.consulAddress = registerConfig.getConsulAddress();
+
+ this.objectMapper = objectMapper;
+ this.requester = requester;
+ }
+
+ public void register(String remoteAddress, int remotePort,
+ RegisterRequestBody.HealthCheckOption... healthCheckOption
+ ) throws IOException {
+ var registerRequestBody = RegisterRequestBody.builder()
+ .id(serviceId)
+ .name(serviceName)
+ .address(remoteAddress)
+ .port(remotePort)
+ .checks(Lists.newArrayList(healthCheckOption))
+ .build();
+
+ byte[] registerRequestData = objectMapper.writeValueAsBytes(registerRequestBody);
+ var url = consulAddress + "/v1/agent/service/register";
+
+ var registerRequest = RequestFactory.makeHttpRequest(url, registerRequestData);
+ var registerResponse = requester.put(registerRequest);
+
+ if (registerResponse.getStatusCode() != HttpResponse.HTTP_OK) {
+ log.warn("注册中心注册不成功,请手动注册");
+ }
+ }
+
+ public void deregister() throws IOException {
+ var url = String.format("%s/v1/agent/service/deregister/%s", consulAddress, serviceId);
+ var deregisterRequest = RequestFactory.makeHttpRequest(url);
+ var deregisterResponse = requester.put(deregisterRequest);
+
+ if (deregisterResponse.getStatusCode() != HttpResponse.HTTP_OK) {
+ log.warn("服务注销不成功,请手动注册");
+ }
+ }
+}
diff --git a/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/client/FrpcClient.java b/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/client/FrpcClient.java
new file mode 100644
index 0000000..7808530
--- /dev/null
+++ b/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/client/FrpcClient.java
@@ -0,0 +1,96 @@
+package cn.wustlinghang.wusthelper.internal.rpc.client;
+
+import cn.hutool.core.codec.Base64;
+import cn.wustlinghang.mywust.network.request.RequestFactory;
+import cn.wustlinghang.mywust.network.Requester;
+import cn.wustlinghang.wusthelper.internal.rpc.config.FrpConfig;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.MissingNode;
+import org.ini4j.Ini;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+public class FrpcClient {
+ private final String frpcAdminAddress;
+
+ private final String frpAuthHeaderValue;
+
+ private final Requester requester;
+
+ private final ObjectMapper objectMapper;
+
+ public FrpcClient(FrpConfig config, Requester requester, ObjectMapper objectMapper) {
+
+ this.frpcAdminAddress = config.getFrpcAdminAddress();
+
+ this.requester = requester;
+ this.objectMapper = objectMapper;
+
+ String username = config.getFrpcAdminUsername();
+ String password = config.getFrpcAdminPassword();
+ this.frpAuthHeaderValue = "Basic " + Base64.encode(username + ":" + password);
+ }
+
+ private String frpProxyName;
+
+ public void addFrpProxy(String serviceName, String serviceId, String localAddress, String localPort)
+ throws IOException {
+ this.frpProxyName = String.format("%s-%s", serviceName, serviceId);
+
+ Ini ini = this.getFrpConfig();
+ ini.put(frpProxyName, "type", "tcp");
+ ini.put(frpProxyName, "local_address", localAddress);
+ ini.put(frpProxyName, "local_port", localPort);
+ ini.put(frpProxyName, "use_compression", "true");
+
+ var output = new ByteArrayOutputStream();
+ ini.store(output);
+
+ this.reloadFrpConfig(ini);
+ }
+
+ public void removeProxy() throws IOException {
+ Ini ini = this.getFrpConfig();
+ ini.remove(this.frpProxyName);
+
+ this.reloadFrpConfig(ini);
+ }
+
+ public Ini getFrpConfig() throws IOException {
+ var frpConfigRequest = RequestFactory.makeHttpRequest(frpcAdminAddress + "/api/config");
+ frpConfigRequest.addHeaders("Authorization", frpAuthHeaderValue);
+ var response = requester.get(frpConfigRequest);
+
+ return new Ini(new ByteArrayInputStream(response.getBody()));
+ }
+
+ public void reloadFrpConfig(Ini ini) throws IOException {
+ var output = new ByteArrayOutputStream();
+ ini.store(output);
+
+ var uploadRequest = RequestFactory.makeHttpRequest(frpcAdminAddress + "/api/config", output.toByteArray());
+ uploadRequest.addHeaders("Authorization", frpAuthHeaderValue);
+ requester.put(uploadRequest);
+ var reloadRequest = RequestFactory.makeHttpRequest(frpcAdminAddress + "/api/reload");
+ reloadRequest.addHeaders("Authorization", frpAuthHeaderValue);
+ requester.get(reloadRequest);
+ }
+
+ public JsonNode getProxyStatus(String serviceName, String serviceId) throws IOException {
+ var statusRequest = RequestFactory.makeHttpRequest(frpcAdminAddress + "/api/status");
+ statusRequest.addHeaders("Authorization", frpAuthHeaderValue);
+ var statusResponse = requester.get(statusRequest);
+
+ JsonNode proxies = objectMapper.readTree(statusResponse.getBody()).path("tcp");
+ for (JsonNode proxy : proxies) {
+ if (proxy.path("name").asText().equals(serviceName + "-" + serviceId)) {
+ return proxy;
+ }
+ }
+
+ return MissingNode.getInstance();
+ }
+}
diff --git a/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/config/FrpConfig.java b/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/config/FrpConfig.java
new file mode 100644
index 0000000..9fe9e73
--- /dev/null
+++ b/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/config/FrpConfig.java
@@ -0,0 +1,12 @@
+package cn.wustlinghang.wusthelper.internal.rpc.config;
+
+import lombok.Data;
+
+@Data
+public class FrpConfig {
+ private String frpcAdminAddress;
+
+ private String frpcAdminUsername;
+
+ private String frpcAdminPassword;
+}
diff --git a/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/config/RegisterConfig.java b/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/config/RegisterConfig.java
new file mode 100644
index 0000000..f706f0f
--- /dev/null
+++ b/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/config/RegisterConfig.java
@@ -0,0 +1,12 @@
+package cn.wustlinghang.wusthelper.internal.rpc.config;
+
+import lombok.Data;
+
+@Data
+public class RegisterConfig {
+ private String localServicePort;
+
+ private String serviceName;
+
+ private String consulAddress;
+}
diff --git a/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/entity/RegisterRequestBody.java b/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/entity/RegisterRequestBody.java
new file mode 100644
index 0000000..94ee17f
--- /dev/null
+++ b/external-library/rpc-frp-consul/src/main/java/cn/wustlinghang/wusthelper/internal/rpc/entity/RegisterRequestBody.java
@@ -0,0 +1,12 @@
+package cn.wustlinghang.wusthelper.internal.rpc.entity;
+
+import lombok.Builder;
+
+import java.util.List;
+
+@Builder
+public record RegisterRequestBody(String address, int port, List checks, String name, String id) {
+ @Builder
+ public record HealthCheckOption(String http, String interval, String timeout) {
+ }
+}
\ No newline at end of file
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/CookieApi.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/CookieApi.java
similarity index 93%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/CookieApi.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/CookieApi.java
index cdf2f9b..2d064d8 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/CookieApi.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/CookieApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1;
import cn.wustlinghang.wusthelper.internal.graduate.services.LoginService;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/CourseTableApi.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/CourseTableApi.java
similarity index 94%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/CourseTableApi.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/CourseTableApi.java
index 664b8c1..63eb736 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/CourseTableApi.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/CourseTableApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1;
import cn.wustlinghang.mywust.data.global.Course;
import cn.wustlinghang.wusthelper.internal.graduate.services.CourseTableService;
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/ScoreApi.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/ScoreApi.java
similarity index 94%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/ScoreApi.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/ScoreApi.java
index 8bc1095..f1e002c 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/ScoreApi.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/ScoreApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1;
import cn.wustlinghang.mywust.data.global.Score;
import cn.wustlinghang.wusthelper.internal.graduate.services.ScoreService;
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/StudentInfoApi.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/StudentInfoApi.java
similarity index 94%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/StudentInfoApi.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/StudentInfoApi.java
index 68512a9..83acf6b 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/StudentInfoApi.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/StudentInfoApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1;
import cn.wustlinghang.mywust.data.global.StudentInfo;
import cn.wustlinghang.wusthelper.internal.graduate.services.StudentInfoService;
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/TrainingPlanApi.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/TrainingPlanApi.java
similarity index 94%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/TrainingPlanApi.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/TrainingPlanApi.java
index e9247bc..aaa65c0 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/TrainingPlanApi.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/TrainingPlanApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1;
import cn.wustlinghang.wusthelper.internal.graduate.services.TrainingPlanService;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/BaseExceptionHandler.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/BaseExceptionHandler.java
similarity index 80%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/BaseExceptionHandler.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/BaseExceptionHandler.java
index 98279aa..66fc0ce 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/BaseExceptionHandler.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/BaseExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import cn.wustlinghang.wusthelper.internal.rpc.response.RpcResponse;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -12,7 +12,7 @@ public abstract class BaseExceptionHandler {
private static final ObjectMapper objectMapper = new ObjectMapper();
- public Response toResponse(ResponseCode code, String msg, String handlerName) {
+ public Response toResponse(RpcCommonResponseCode code, String msg, String handlerName) {
return toResponse(code.getCode(), msg, handlerName);
}
@@ -29,7 +29,7 @@ public abstract class BaseExceptionHandler {
try {
response = objectMapper.writeValueAsString(RpcResponse.error(code, msg));
} catch (JsonProcessingException e) {
- response = RpcResponse.error(ResponseCode.SERVER_INTERNAL_ERROR);
+ response = RpcResponse.error(RpcCommonResponseCode.SERVER_INTERNAL_ERROR);
}
return Response.status(status)
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/DefaultExceptionHandler.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/DefaultExceptionHandler.java
similarity index 69%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/DefaultExceptionHandler.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/DefaultExceptionHandler.java
index 22bfe4f..c667399 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/DefaultExceptionHandler.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/DefaultExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
@@ -13,7 +13,7 @@ public class DefaultExceptionHandler extends BaseExceptionHandler implements Exc
public Response toResponse(Exception e) {
log.error("未知异常:", e);
return super.toResponse(
- ResponseCode.SERVER_INTERNAL_ERROR,
+ RpcCommonResponseCode.SERVER_INTERNAL_ERROR,
e.toString(),
"DefaultExceptionHandler"
);
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/IOExceptionHandler.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/IOExceptionHandler.java
similarity index 70%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/IOExceptionHandler.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/IOExceptionHandler.java
index 22887d6..97a22ba 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/IOExceptionHandler.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/IOExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
@@ -15,7 +15,7 @@ public class IOExceptionHandler extends BaseExceptionHandler implements Exceptio
public Response toResponse(IOException e) {
log.error("IO异常:", e);
return super.toResponse(
- ResponseCode.SERVER_INTERNAL_ERROR,
+ RpcCommonResponseCode.SERVER_INTERNAL_ERROR,
e.toString(),
"IOExceptionHandler"
);
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/ParseExceptionHandler.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/ParseExceptionHandler.java
similarity index 72%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/ParseExceptionHandler.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/ParseExceptionHandler.java
index 5e3f95a..bfaaba5 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/ParseExceptionHandler.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/ParseExceptionHandler.java
@@ -1,7 +1,7 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1.handler;
import cn.wustlinghang.mywust.exception.ParseException;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
@@ -14,7 +14,7 @@ public class ParseExceptionHandler extends BaseExceptionHandler implements Excep
public Response toResponse(ParseException e) {
log.error("解析异常:", e);
return super.toResponse(
- ResponseCode.SERVER_INTERNAL_ERROR,
+ RpcCommonResponseCode.SERVER_INTERNAL_ERROR,
e.toString(),
"ParseExceptionHandler"
);
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/RpcExceptionHandler.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/RpcExceptionHandler.java
similarity index 87%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/RpcExceptionHandler.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/RpcExceptionHandler.java
index 97f6ac6..0c7783c 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/RpcExceptionHandler.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/RpcExceptionHandler.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1.handler;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
import jakarta.ws.rs.core.Response;
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/ValidationExceptionHandler.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/ValidationExceptionHandler.java
similarity index 73%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/ValidationExceptionHandler.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/ValidationExceptionHandler.java
index f08ab67..70b1cbe 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/ValidationExceptionHandler.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/ValidationExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.validation.ValidationException;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
@@ -14,7 +14,7 @@ public class ValidationExceptionHandler extends BaseExceptionHandler
@Override
public Response toResponse(ValidationException e) {
return super.toResponse(
- ResponseCode.PARAM_WRONG,
+ RpcCommonResponseCode.PARAM_WRONG,
"参数错误:" + e.toString(),
"ValidationExceptionHandler"
);
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/WebApplicationExceptionHandler.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/WebApplicationExceptionHandler.java
similarity index 93%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/WebApplicationExceptionHandler.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/WebApplicationExceptionHandler.java
index 91482a3..1a21a32 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/WebApplicationExceptionHandler.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/handler/WebApplicationExceptionHandler.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1.handler;
import cn.wustlinghang.wusthelper.internal.rpc.exception.GraduateRpcException;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/interceptor/ResponseWrapperInterceptor.java b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/interceptor/ResponseWrapperInterceptor.java
similarity index 88%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/interceptor/ResponseWrapperInterceptor.java
rename to sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/interceptor/ResponseWrapperInterceptor.java
index cfa0fd6..3898001 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/interceptor/ResponseWrapperInterceptor.java
+++ b/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/v1/interceptor/ResponseWrapperInterceptor.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http.interceptor;
+package cn.wustlinghang.wusthelper.internal.graduate.api.http.v1.interceptor;
-import cn.wustlinghang.wusthelper.internal.undergrad.api.http.handler.BaseExceptionHandler;
+import cn.wustlinghang.wusthelper.internal.graduate.api.http.v1.handler.BaseExceptionHandler;
import cn.wustlinghang.wusthelper.internal.rpc.response.RpcResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.ws.rs.WebApplicationException;
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/BookCoverImageApi.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/BookCoverImageApi.java
similarity index 95%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/BookCoverImageApi.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/BookCoverImageApi.java
index dfd95cd..05b7f13 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/BookCoverImageApi.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/BookCoverImageApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1;
import cn.wustlinghang.wusthelper.internal.library.services.BookCoverImageUrlService;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/BookDetailApi.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/BookDetailApi.java
similarity index 93%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/BookDetailApi.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/BookDetailApi.java
index 554cf95..17e1ca8 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/BookDetailApi.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/BookDetailApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1;
import cn.wustlinghang.mywust.data.library.parsed.BookDetail;
import cn.wustlinghang.wusthelper.internal.library.services.BookDetailService;
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/BookHoldingApi.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/BookHoldingApi.java
similarity index 93%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/BookHoldingApi.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/BookHoldingApi.java
index ef3ecd0..b80739e 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/BookHoldingApi.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/BookHoldingApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1;
import cn.wustlinghang.mywust.data.library.parsed.BookHolding;
import cn.wustlinghang.wusthelper.internal.library.services.BookHoldingService;
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/CookieApi.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/CookieApi.java
similarity index 93%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/CookieApi.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/CookieApi.java
index 2e996c7..1cd512c 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/CookieApi.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/CookieApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1;
import cn.wustlinghang.wusthelper.internal.library.services.LoginService;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/CurrentLoanApi.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/CurrentLoanApi.java
similarity index 96%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/CurrentLoanApi.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/CurrentLoanApi.java
index 33a75d1..b1f1481 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/CurrentLoanApi.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/CurrentLoanApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1;
import cn.wustlinghang.mywust.data.library.PagingResult;
import cn.wustlinghang.mywust.data.library.origin.CurrentLoanBook;
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/LoanHistoryApi.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/LoanHistoryApi.java
similarity index 96%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/LoanHistoryApi.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/LoanHistoryApi.java
index 04dd283..abcd31f 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/LoanHistoryApi.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/LoanHistoryApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1;
import cn.wustlinghang.mywust.data.library.PagingResult;
import cn.wustlinghang.mywust.data.library.origin.HistoryLoanBook;
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/OverdueSoonApi.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/OverdueSoonApi.java
similarity index 96%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/OverdueSoonApi.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/OverdueSoonApi.java
index 5d67f94..9b2eb34 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/OverdueSoonApi.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/OverdueSoonApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1;
import cn.wustlinghang.mywust.data.library.PagingResult;
import cn.wustlinghang.mywust.data.library.origin.BaseLoanBook;
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/SearchApi.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/SearchApi.java
similarity index 95%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/SearchApi.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/SearchApi.java
index 125f0fa..b86104a 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/SearchApi.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/SearchApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1;
import cn.wustlinghang.mywust.data.library.PagingResult;
import cn.wustlinghang.mywust.data.library.origin.BookSearchResult;
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/BaseExceptionHandler.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/BaseExceptionHandler.java
similarity index 80%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/BaseExceptionHandler.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/BaseExceptionHandler.java
index 45e8259..f5aeb27 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/BaseExceptionHandler.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/BaseExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import cn.wustlinghang.wusthelper.internal.rpc.response.RpcResponse;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -12,7 +12,7 @@ public abstract class BaseExceptionHandler {
private static final ObjectMapper objectMapper = new ObjectMapper();
- public Response toResponse(ResponseCode code, String msg, String handlerName) {
+ public Response toResponse(RpcCommonResponseCode code, String msg, String handlerName) {
return toResponse(code.getCode(), msg, handlerName);
}
@@ -29,7 +29,7 @@ public abstract class BaseExceptionHandler {
try {
response = objectMapper.writeValueAsString(RpcResponse.error(code, msg));
} catch (JsonProcessingException e) {
- response = RpcResponse.error(ResponseCode.SERVER_INTERNAL_ERROR);
+ response = RpcResponse.error(RpcCommonResponseCode.SERVER_INTERNAL_ERROR);
}
return Response.status(status)
diff --git a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/DefaultExceptionHandler.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/DefaultExceptionHandler.java
similarity index 70%
rename from sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/DefaultExceptionHandler.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/DefaultExceptionHandler.java
index b13cdab..fda3bc2 100644
--- a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/DefaultExceptionHandler.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/DefaultExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.physics.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
@@ -13,7 +13,7 @@ public class DefaultExceptionHandler extends BaseExceptionHandler implements Exc
public Response toResponse(Exception e) {
log.error("未知异常:", e);
return super.toResponse(
- ResponseCode.SERVER_INTERNAL_ERROR,
+ RpcCommonResponseCode.SERVER_INTERNAL_ERROR,
e.toString(),
"DefaultExceptionHandler"
);
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/IOExceptionHandler.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/IOExceptionHandler.java
similarity index 70%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/IOExceptionHandler.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/IOExceptionHandler.java
index a4bc6c3..940d1ba 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/IOExceptionHandler.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/IOExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
@@ -15,7 +15,7 @@ public class IOExceptionHandler extends BaseExceptionHandler implements Exceptio
public Response toResponse(IOException e) {
log.error("IO异常:", e);
return super.toResponse(
- ResponseCode.SERVER_INTERNAL_ERROR,
+ RpcCommonResponseCode.SERVER_INTERNAL_ERROR,
e.toString(),
"IOExceptionHandler"
);
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/ParseExceptionHandler.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/ParseExceptionHandler.java
similarity index 72%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/ParseExceptionHandler.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/ParseExceptionHandler.java
index 879292f..119bebd 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/ParseExceptionHandler.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/ParseExceptionHandler.java
@@ -1,7 +1,7 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1.handler;
import cn.wustlinghang.mywust.exception.ParseException;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
@@ -14,7 +14,7 @@ public class ParseExceptionHandler extends BaseExceptionHandler implements Excep
public Response toResponse(ParseException e) {
log.error("解析异常:", e);
return super.toResponse(
- ResponseCode.SERVER_INTERNAL_ERROR,
+ RpcCommonResponseCode.SERVER_INTERNAL_ERROR,
e.toString(),
"ParseExceptionHandler"
);
diff --git a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/RpcExceptionHandler.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/RpcExceptionHandler.java
similarity index 87%
rename from sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/RpcExceptionHandler.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/RpcExceptionHandler.java
index 2693671..80f4da5 100644
--- a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/RpcExceptionHandler.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/RpcExceptionHandler.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.physics.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1.handler;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
import jakarta.ws.rs.core.Response;
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/ValidationExceptionHandler.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/ValidationExceptionHandler.java
similarity index 73%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/ValidationExceptionHandler.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/ValidationExceptionHandler.java
index 25f4fb7..b369ac8 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/ValidationExceptionHandler.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/ValidationExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.validation.ValidationException;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
@@ -14,7 +14,7 @@ public class ValidationExceptionHandler extends BaseExceptionHandler
@Override
public Response toResponse(ValidationException e) {
return super.toResponse(
- ResponseCode.PARAM_WRONG,
+ RpcCommonResponseCode.PARAM_WRONG,
"参数错误:" + e.toString(),
"ValidationExceptionHandler"
);
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/WebApplicationExceptionHandler.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/WebApplicationExceptionHandler.java
similarity index 93%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/WebApplicationExceptionHandler.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/WebApplicationExceptionHandler.java
index 9600689..f89b0a4 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/WebApplicationExceptionHandler.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/handler/WebApplicationExceptionHandler.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1.handler;
import cn.wustlinghang.wusthelper.internal.rpc.exception.LibraryRpcException;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
diff --git a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/interceptor/ResponseWrapperInterceptor.java b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/interceptor/ResponseWrapperInterceptor.java
similarity index 88%
rename from sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/interceptor/ResponseWrapperInterceptor.java
rename to sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/interceptor/ResponseWrapperInterceptor.java
index 5bf463c..5776a51 100644
--- a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/interceptor/ResponseWrapperInterceptor.java
+++ b/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/v1/interceptor/ResponseWrapperInterceptor.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.physics.api.http.interceptor;
+package cn.wustlinghang.wusthelper.internal.library.api.http.v1.interceptor;
-import cn.wustlinghang.wusthelper.internal.physics.api.http.handler.BaseExceptionHandler;
+import cn.wustlinghang.wusthelper.internal.library.api.http.v1.handler.BaseExceptionHandler;
import cn.wustlinghang.wusthelper.internal.rpc.response.RpcResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.ws.rs.WebApplicationException;
diff --git a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/CookieApi.java b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/CookieApi.java
similarity index 93%
rename from sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/CookieApi.java
rename to sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/CookieApi.java
index a651847..954d987 100644
--- a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/CookieApi.java
+++ b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/CookieApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.physics.api.http;
+package cn.wustlinghang.wusthelper.internal.physics.api.http.v1;
import cn.wustlinghang.wusthelper.internal.physics.services.LoginService;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
diff --git a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/CourseTableApi.java b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/CourseTableApi.java
similarity index 94%
rename from sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/CourseTableApi.java
rename to sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/CourseTableApi.java
index dd26de8..d307055 100644
--- a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/CourseTableApi.java
+++ b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/CourseTableApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.physics.api.http;
+package cn.wustlinghang.wusthelper.internal.physics.api.http.v1;
import cn.wustlinghang.mywust.data.physics.PhysicsCourse;
import cn.wustlinghang.wusthelper.internal.physics.services.CourseTableService;
diff --git a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/ScoreApi.java b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/ScoreApi.java
similarity index 95%
rename from sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/ScoreApi.java
rename to sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/ScoreApi.java
index 6677f85..977625d 100644
--- a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/ScoreApi.java
+++ b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/ScoreApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.physics.api.http;
+package cn.wustlinghang.wusthelper.internal.physics.api.http.v1;
import cn.wustlinghang.mywust.data.global.Score;
import cn.wustlinghang.wusthelper.internal.physics.services.ScoreService;
diff --git a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/BaseExceptionHandler.java b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/BaseExceptionHandler.java
similarity index 80%
rename from sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/BaseExceptionHandler.java
rename to sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/BaseExceptionHandler.java
index 6ee8f5c..8fc6aab 100644
--- a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/BaseExceptionHandler.java
+++ b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/BaseExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.physics.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.physics.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import cn.wustlinghang.wusthelper.internal.rpc.response.RpcResponse;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -12,7 +12,7 @@ public abstract class BaseExceptionHandler {
private static final ObjectMapper objectMapper = new ObjectMapper();
- public Response toResponse(ResponseCode code, String msg, String handlerName) {
+ public Response toResponse(RpcCommonResponseCode code, String msg, String handlerName) {
return toResponse(code.getCode(), msg, handlerName);
}
@@ -29,7 +29,7 @@ public abstract class BaseExceptionHandler {
try {
response = objectMapper.writeValueAsString(RpcResponse.error(code, msg));
} catch (JsonProcessingException e) {
- response = RpcResponse.error(ResponseCode.SERVER_INTERNAL_ERROR);
+ response = RpcResponse.error(RpcCommonResponseCode.SERVER_INTERNAL_ERROR);
}
return Response.status(status)
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/DefaultExceptionHandler.java b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/DefaultExceptionHandler.java
similarity index 70%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/DefaultExceptionHandler.java
rename to sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/DefaultExceptionHandler.java
index 3d30dd5..759bd61 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/DefaultExceptionHandler.java
+++ b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/DefaultExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.physics.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
@@ -13,7 +13,7 @@ public class DefaultExceptionHandler extends BaseExceptionHandler implements Exc
public Response toResponse(Exception e) {
log.error("未知异常:", e);
return super.toResponse(
- ResponseCode.SERVER_INTERNAL_ERROR,
+ RpcCommonResponseCode.SERVER_INTERNAL_ERROR,
e.toString(),
"DefaultExceptionHandler"
);
diff --git a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/IOExceptionHandler.java b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/IOExceptionHandler.java
similarity index 70%
rename from sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/IOExceptionHandler.java
rename to sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/IOExceptionHandler.java
index 18e3019..f7d7574 100644
--- a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/IOExceptionHandler.java
+++ b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/IOExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.physics.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.physics.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
@@ -15,7 +15,7 @@ public class IOExceptionHandler extends BaseExceptionHandler implements Exceptio
public Response toResponse(IOException e) {
log.error("IO异常:", e);
return super.toResponse(
- ResponseCode.SERVER_INTERNAL_ERROR,
+ RpcCommonResponseCode.SERVER_INTERNAL_ERROR,
e.toString(),
"IOExceptionHandler"
);
diff --git a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/ParseExceptionHandler.java b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/ParseExceptionHandler.java
similarity index 72%
rename from sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/ParseExceptionHandler.java
rename to sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/ParseExceptionHandler.java
index ab65e80..90369a0 100644
--- a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/ParseExceptionHandler.java
+++ b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/ParseExceptionHandler.java
@@ -1,7 +1,7 @@
-package cn.wustlinghang.wusthelper.internal.physics.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.physics.api.http.v1.handler;
import cn.wustlinghang.mywust.exception.ParseException;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
@@ -14,7 +14,7 @@ public class ParseExceptionHandler extends BaseExceptionHandler implements Excep
public Response toResponse(ParseException e) {
log.error("解析异常:", e);
return super.toResponse(
- ResponseCode.SERVER_INTERNAL_ERROR,
+ RpcCommonResponseCode.SERVER_INTERNAL_ERROR,
e.toString(),
"ParseExceptionHandler"
);
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/RpcExceptionHandler.java b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/RpcExceptionHandler.java
similarity index 87%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/RpcExceptionHandler.java
rename to sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/RpcExceptionHandler.java
index bd83eb4..50bc5ae 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/RpcExceptionHandler.java
+++ b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/RpcExceptionHandler.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.physics.api.http.v1.handler;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
import jakarta.ws.rs.core.Response;
diff --git a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/ValidationExceptionHandler.java b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/ValidationExceptionHandler.java
similarity index 73%
rename from sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/ValidationExceptionHandler.java
rename to sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/ValidationExceptionHandler.java
index 4d89680..950be29 100644
--- a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/ValidationExceptionHandler.java
+++ b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/ValidationExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.physics.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.physics.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.validation.ValidationException;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
@@ -14,7 +14,7 @@ public class ValidationExceptionHandler extends BaseExceptionHandler
@Override
public Response toResponse(ValidationException e) {
return super.toResponse(
- ResponseCode.PARAM_WRONG,
+ RpcCommonResponseCode.PARAM_WRONG,
"参数错误:" + e.toString(),
"ValidationExceptionHandler"
);
diff --git a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/WebApplicationExceptionHandler.java b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/WebApplicationExceptionHandler.java
similarity index 93%
rename from sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/WebApplicationExceptionHandler.java
rename to sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/WebApplicationExceptionHandler.java
index 9ad609a..ca91465 100644
--- a/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/handler/WebApplicationExceptionHandler.java
+++ b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/handler/WebApplicationExceptionHandler.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.physics.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.physics.api.http.v1.handler;
import cn.wustlinghang.wusthelper.internal.rpc.exception.PhysicsRpcException;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/interceptor/ResponseWrapperInterceptor.java b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/interceptor/ResponseWrapperInterceptor.java
similarity index 88%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/interceptor/ResponseWrapperInterceptor.java
rename to sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/interceptor/ResponseWrapperInterceptor.java
index 4ecf0cd..d774eeb 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/interceptor/ResponseWrapperInterceptor.java
+++ b/sub-services/physics/src/main/java/cn/wustlinghang/wusthelper/internal/physics/api/http/v1/interceptor/ResponseWrapperInterceptor.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http.interceptor;
+package cn.wustlinghang.wusthelper.internal.physics.api.http.v1.interceptor;
-import cn.wustlinghang.wusthelper.internal.graduate.api.http.handler.BaseExceptionHandler;
+import cn.wustlinghang.wusthelper.internal.physics.api.http.v1.handler.BaseExceptionHandler;
import cn.wustlinghang.wusthelper.internal.rpc.response.RpcResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.ws.rs.WebApplicationException;
diff --git a/sub-services/undergrad/.flattened-pom.xml b/sub-services/undergrad/.flattened-pom.xml
index 0c24ec8..0de1689 100644
--- a/sub-services/undergrad/.flattened-pom.xml
+++ b/sub-services/undergrad/.flattened-pom.xml
@@ -30,16 +30,22 @@
3.1.3.Final
compile
+
+ org.ini4j
+ ini4j
+ 0.5.4
+ compile
+
cn.wustlinghang.mywust
mywust-core
- 0.0.2-SNAPSHOT
+ 0.0.2-beta
compile
cn.wustlinghang.mywust
mywust-network-okhttp
- 0.0.2-SNAPSHOT
+ 0.0.2-beta
compile
diff --git a/sub-services/undergrad/pom.xml b/sub-services/undergrad/pom.xml
index cef6ac2..89d256b 100644
--- a/sub-services/undergrad/pom.xml
+++ b/sub-services/undergrad/pom.xml
@@ -29,6 +29,7 @@
17
true
UTF-8
+
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/Main.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/Main.java
deleted file mode 100644
index edcd35f..0000000
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/Main.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package cn.wustlinghang.wusthelper.internal.undergrad;
-
-import io.quarkus.runtime.Startup;
-import jakarta.annotation.PostConstruct;
-import jakarta.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Startup
-@Singleton
-public class Main {
- @PostConstruct
- public void run() {
- log.info("Undergrad service started.");
- }
-}
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/CookieApi.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/CookieApi.java
similarity index 93%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/CookieApi.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/CookieApi.java
index 235cf5d..2c85b5a 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/CookieApi.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/CookieApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1;
import cn.wustlinghang.wusthelper.internal.undergrad.services.LoginService;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/CourseTableApi.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/CourseTableApi.java
similarity index 95%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/CourseTableApi.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/CourseTableApi.java
index ddcac9d..90cd196 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/CourseTableApi.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/CourseTableApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1;
import cn.wustlinghang.mywust.data.global.Course;
import cn.wustlinghang.wusthelper.internal.undergrad.services.CourseTableService;
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/CreditStatusApi.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/CreditStatusApi.java
similarity index 94%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/CreditStatusApi.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/CreditStatusApi.java
index dffe812..64caabe 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/CreditStatusApi.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/CreditStatusApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1;
import cn.wustlinghang.wusthelper.internal.undergrad.services.CreditStatusService;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/ExamActivitiesApi.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/ExamActivitiesApi.java
similarity index 95%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/ExamActivitiesApi.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/ExamActivitiesApi.java
index 1a695af..f27d585 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/ExamActivitiesApi.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/ExamActivitiesApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1;
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradExamDelayApiService;
import cn.wustlinghang.mywust.data.global.Score;
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/ExamDelayApplicationApi.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/ExamDelayApplicationApi.java
similarity index 96%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/ExamDelayApplicationApi.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/ExamDelayApplicationApi.java
index d9f5e95..e4aadb4 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/ExamDelayApplicationApi.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/ExamDelayApplicationApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1;
import cn.wustlinghang.mywust.data.undergrad.ExamDelayApplication;
import cn.wustlinghang.wusthelper.internal.undergrad.services.ExamDelayApplicationService;
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/ScoreApi.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/ScoreApi.java
similarity index 94%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/ScoreApi.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/ScoreApi.java
index 8f5cbba..b90c812 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/ScoreApi.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/ScoreApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1;
import cn.wustlinghang.mywust.data.global.Score;
import cn.wustlinghang.wusthelper.internal.undergrad.services.ScoreService;
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/StudentInfoApi.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/StudentInfoApi.java
similarity index 94%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/StudentInfoApi.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/StudentInfoApi.java
index 05c5ebf..a2df199 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/StudentInfoApi.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/StudentInfoApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1;
import cn.wustlinghang.mywust.data.global.StudentInfo;
import cn.wustlinghang.wusthelper.internal.undergrad.services.StudentInfoService;
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/TrainingPlanApi.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/TrainingPlanApi.java
similarity index 94%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/TrainingPlanApi.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/TrainingPlanApi.java
index 26bee7b..2a26864 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/TrainingPlanApi.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/TrainingPlanApi.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1;
import cn.wustlinghang.wusthelper.internal.undergrad.services.TrainingPlanService;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/BaseExceptionHandler.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/BaseExceptionHandler.java
similarity index 80%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/BaseExceptionHandler.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/BaseExceptionHandler.java
index f67a531..a77f71f 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/BaseExceptionHandler.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/BaseExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import cn.wustlinghang.wusthelper.internal.rpc.response.RpcResponse;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -12,7 +12,7 @@ public abstract class BaseExceptionHandler {
private static final ObjectMapper objectMapper = new ObjectMapper();
- public Response toResponse(ResponseCode code, String msg, String handlerName) {
+ public Response toResponse(RpcCommonResponseCode code, String msg, String handlerName) {
return toResponse(code.getCode(), msg, handlerName);
}
@@ -29,7 +29,7 @@ public abstract class BaseExceptionHandler {
try {
response = objectMapper.writeValueAsString(RpcResponse.error(code, msg));
} catch (JsonProcessingException e) {
- response = RpcResponse.error(ResponseCode.SERVER_INTERNAL_ERROR);
+ response = RpcResponse.error(RpcCommonResponseCode.SERVER_INTERNAL_ERROR);
}
return Response.status(status)
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/DefaultExceptionHandler.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/DefaultExceptionHandler.java
similarity index 69%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/DefaultExceptionHandler.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/DefaultExceptionHandler.java
index e1ee003..e0fc42a 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/DefaultExceptionHandler.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/DefaultExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
@@ -13,7 +13,7 @@ public class DefaultExceptionHandler extends BaseExceptionHandler implements Exc
public Response toResponse(Exception e) {
log.error("未知异常:", e);
return super.toResponse(
- ResponseCode.SERVER_INTERNAL_ERROR,
+ RpcCommonResponseCode.SERVER_INTERNAL_ERROR,
e.toString(),
"DefaultExceptionHandler"
);
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/IOExceptionHandler.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/IOExceptionHandler.java
similarity index 70%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/IOExceptionHandler.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/IOExceptionHandler.java
index e8444e9..e06d817 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/handler/IOExceptionHandler.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/IOExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
@@ -15,7 +15,7 @@ public class IOExceptionHandler extends BaseExceptionHandler implements Exceptio
public Response toResponse(IOException e) {
log.error("IO异常:", e);
return super.toResponse(
- ResponseCode.SERVER_INTERNAL_ERROR,
+ RpcCommonResponseCode.SERVER_INTERNAL_ERROR,
e.toString(),
"IOExceptionHandler"
);
diff --git a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/ParseExceptionHandler.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/ParseExceptionHandler.java
similarity index 72%
rename from sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/ParseExceptionHandler.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/ParseExceptionHandler.java
index 3f7c90c..b503159 100644
--- a/sub-services/graduate/src/main/java/cn/wustlinghang/wusthelper/internal/graduate/api/http/handler/ParseExceptionHandler.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/ParseExceptionHandler.java
@@ -1,7 +1,7 @@
-package cn.wustlinghang.wusthelper.internal.graduate.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1.handler;
import cn.wustlinghang.mywust.exception.ParseException;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
@@ -14,7 +14,7 @@ public class ParseExceptionHandler extends BaseExceptionHandler implements Excep
public Response toResponse(ParseException e) {
log.error("解析异常:", e);
return super.toResponse(
- ResponseCode.SERVER_INTERNAL_ERROR,
+ RpcCommonResponseCode.SERVER_INTERNAL_ERROR,
e.toString(),
"ParseExceptionHandler"
);
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/RpcExceptionHandler.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/RpcExceptionHandler.java
similarity index 87%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/RpcExceptionHandler.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/RpcExceptionHandler.java
index 0de94db..995a542 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/RpcExceptionHandler.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/RpcExceptionHandler.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1.handler;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
import jakarta.ws.rs.core.Response;
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/ValidationExceptionHandler.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/ValidationExceptionHandler.java
similarity index 73%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/ValidationExceptionHandler.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/ValidationExceptionHandler.java
index 5a67fcd..098707c 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/ValidationExceptionHandler.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/ValidationExceptionHandler.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1.handler;
-import cn.wustlinghang.wusthelper.internal.rpc.response.ResponseCode;
+import cn.wustlinghang.wusthelper.internal.rpc.response.RpcCommonResponseCode;
import jakarta.validation.ValidationException;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
@@ -14,7 +14,7 @@ public class ValidationExceptionHandler extends BaseExceptionHandler
@Override
public Response toResponse(ValidationException e) {
return super.toResponse(
- ResponseCode.PARAM_WRONG,
+ RpcCommonResponseCode.PARAM_WRONG,
"参数错误:" + e.toString(),
"ValidationExceptionHandler"
);
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/WebApplicationExceptionHandler.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/WebApplicationExceptionHandler.java
similarity index 93%
rename from sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/WebApplicationExceptionHandler.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/WebApplicationExceptionHandler.java
index 1f93418..7ace25e 100644
--- a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/handler/WebApplicationExceptionHandler.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/handler/WebApplicationExceptionHandler.java
@@ -1,4 +1,4 @@
-package cn.wustlinghang.wusthelper.internal.undergrad.api.http.handler;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1.handler;
import cn.wustlinghang.wusthelper.internal.rpc.exception.UndergradRpcException;
import cn.wustlinghang.wusthelper.internal.rpc.exception.RpcException;
diff --git a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/interceptor/ResponseWrapperInterceptor.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/interceptor/ResponseWrapperInterceptor.java
similarity index 88%
rename from sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/interceptor/ResponseWrapperInterceptor.java
rename to sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/interceptor/ResponseWrapperInterceptor.java
index 5ce4fcc..05f60d0 100644
--- a/sub-services/library/src/main/java/cn/wustlinghang/wusthelper/internal/library/api/http/interceptor/ResponseWrapperInterceptor.java
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/api/http/v1/interceptor/ResponseWrapperInterceptor.java
@@ -1,6 +1,6 @@
-package cn.wustlinghang.wusthelper.internal.library.api.http.interceptor;
+package cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1.interceptor;
-import cn.wustlinghang.wusthelper.internal.library.api.http.handler.BaseExceptionHandler;
+import cn.wustlinghang.wusthelper.internal.undergrad.api.http.v1.handler.BaseExceptionHandler;
import cn.wustlinghang.wusthelper.internal.rpc.response.RpcResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.ws.rs.WebApplicationException;
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/FrpConsulRegister.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/FrpConsulRegister.java
new file mode 100644
index 0000000..b5273f2
--- /dev/null
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/FrpConsulRegister.java
@@ -0,0 +1,107 @@
+package cn.wustlinghang.wusthelper.internal.undergrad.rpc;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.wustlinghang.mywust.network.Requester;
+import cn.wustlinghang.wusthelper.internal.undergrad.rpc.client.ConsulClient;
+import cn.wustlinghang.wusthelper.internal.undergrad.rpc.client.FrpcClient;
+import cn.wustlinghang.wusthelper.internal.undergrad.rpc.config.RpcConfig;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.quarkus.runtime.Startup;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.PreDestroy;
+import jakarta.enterprise.context.ApplicationScoped;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+
+@Slf4j
+@Startup
+@ApplicationScoped
+public class FrpConsulRegister {
+
+ @ConfigProperty(name = "quarkus.http.port")
+ String localServicePort;
+
+ private final String serviceId;
+
+ private final RpcConfig rpcConfig;
+
+ private final FrpcClient frpcClientClient;
+
+ private final ConsulClient consulClient;
+
+ private boolean registered = false;
+
+ public FrpConsulRegister(RpcConfig rpcConfig, FrpcClient frpcClientClient, Requester requester,
+ ObjectMapper objectMapper) {
+ this.rpcConfig = rpcConfig;
+
+ this.frpcClientClient = frpcClientClient;
+
+ this.serviceId = RandomUtil.randomString(8);
+
+ this.consulClient = new ConsulClient(
+ rpcConfig.getServiceName(), this.serviceId,
+ rpcConfig.getConsulAddress(),
+ objectMapper, requester);
+ }
+
+ @PostConstruct
+ public void onStartup() {
+ ThreadUtil.execute(() -> {
+ try {
+ log.info("连接frp并注册consul...");
+ this.doRegister();
+ log.info("注册完毕");
+ } catch (Exception e) {
+ log.warn("注册服务时发生异常:", e);
+ log.warn("不进行转发注册,直接服务");
+ }
+ });
+
+ Runtime.getRuntime().addShutdownHook(new Thread(this::onShutdown, "ShutdownHookThread"));
+ }
+
+ @PreDestroy
+ public void onShutdown() {
+ try {
+ if (this.registered) {
+ log.info("注销服务...");
+ this.consulClient.deregister();
+ this.frpcClientClient.removeProxy();
+ log.info("服务注销完毕");
+ this.registered = false;
+ }
+ } catch (Exception e) {
+ log.warn("注销服务时发生异常:", e);
+ }
+ }
+
+ private void doRegister() throws Exception {
+ frpcClientClient.addFrpProxy(
+ rpcConfig.getServiceName(), serviceId,
+ "127.0.0.1", localServicePort
+ );
+
+ String remoteAddress;
+ String[] remote;
+ int retry = 0;
+ do {
+ // 先睡个0.5秒等待连接成功再获取状态读端口
+ ThreadUtil.sleep(500);
+
+ JsonNode proxy = frpcClientClient.getProxyStatus(rpcConfig.getServiceName(), serviceId);
+ remoteAddress = proxy.path("remote_addr")
+ .asText("127.0.0.1:" + localServicePort);
+ remote = remoteAddress.split(":");
+ retry++;
+ } while (retry < 3 && remote.length < 2);
+ if (retry == 3) {
+ throw new Exception("获取frp隧道信息重试次数过多,请手动添加隧道和注册中心");
+ }
+
+ this.consulClient.register(remoteAddress, Integer.parseInt(remote[1]));
+ this.registered = true;
+ }
+}
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/client/ConsulClient.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/client/ConsulClient.java
new file mode 100644
index 0000000..c33a913
--- /dev/null
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/client/ConsulClient.java
@@ -0,0 +1,60 @@
+package cn.wustlinghang.wusthelper.internal.undergrad.rpc.client;
+
+import cn.wustlinghang.mywust.network.request.RequestFactory;
+import cn.wustlinghang.mywust.network.Requester;
+import cn.wustlinghang.mywust.network.entitys.HttpResponse;
+import cn.wustlinghang.wusthelper.internal.undergrad.rpc.entity.RegisterRequestBody;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+
+@Slf4j
+public class ConsulClient {
+ private final String serviceId;
+ private final String serviceName;
+ private final String consulAddress;
+ private final ObjectMapper objectMapper;
+ private final Requester requester;
+
+ public ConsulClient(String serviceName, String serviceId, String consulAddress,
+ ObjectMapper objectMapper, Requester requester) {
+ this.serviceId = serviceId;
+ this.serviceName = serviceName;
+ this.consulAddress = consulAddress;
+
+ this.objectMapper = objectMapper;
+ this.requester = requester;
+ }
+
+ public void register(String remoteAddress, int remotePort) throws IOException {
+ var checksItem = RegisterRequestBody.ChecksItem.builder()
+ .http("http://" + remoteAddress + "/health")
+ .interval("3s")
+ .build();
+
+ var registerRequestBody = RegisterRequestBody.builder()
+ .id(serviceId)
+ .name(serviceName)
+ .address("127.0.0.1")
+ .port(remotePort)
+ .checks(Lists.newArrayList(checksItem))
+ .build();
+
+ byte[] registerRequestData = objectMapper.writeValueAsBytes(registerRequestBody);
+ var registerRequest = RequestFactory.makeHttpRequest(consulAddress + "/v1/agent/service/register", registerRequestData);
+ var registerResponse = requester.put(registerRequest);
+ if (registerResponse.getStatusCode() != HttpResponse.HTTP_OK) {
+ log.warn("注册中心注册不成功,请手动注册");
+ }
+ }
+
+ public void deregister() throws IOException {
+ var deregisterRequest = RequestFactory.makeHttpRequest(consulAddress + "/v1/agent/service/deregister/" + serviceId);
+ var deregisterResponse = requester.put(deregisterRequest);
+ if (deregisterResponse.getStatusCode() != HttpResponse.HTTP_OK) {
+ log.warn("服务注销不成功,请手动注册");
+ }
+ }
+}
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/client/FrpcClient.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/client/FrpcClient.java
new file mode 100644
index 0000000..a6a5f05
--- /dev/null
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/client/FrpcClient.java
@@ -0,0 +1,100 @@
+package cn.wustlinghang.wusthelper.internal.undergrad.rpc.client;
+
+import cn.hutool.core.codec.Base64;
+import cn.wustlinghang.mywust.network.request.RequestFactory;
+import cn.wustlinghang.mywust.network.Requester;
+import cn.wustlinghang.wusthelper.internal.undergrad.rpc.config.FrpConfig;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.MissingNode;
+import jakarta.inject.Singleton;
+import org.ini4j.Ini;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+@Singleton
+public class FrpcClient {
+
+ private final String frpcAdminAddress;
+
+ private final String frpAuthHeaderValue;
+
+ private final Requester requester;
+
+ private final ObjectMapper objectMapper;
+
+ private String frpProxyName;
+
+ public FrpcClient(FrpConfig frpConfig,
+ Requester requester, ObjectMapper objectMapper) {
+
+ this.frpcAdminAddress = frpConfig.getFrpcAdminAddress();
+
+ this.requester = requester;
+ this.objectMapper = objectMapper;
+
+ String username = frpConfig.getFrpcAdminUsername();
+ String password = frpConfig.getFrpcAdminPassword();
+ this.frpAuthHeaderValue = "Basic " + Base64.encode(username + ":" + password);
+ }
+
+ public void addFrpProxy(String serviceName, String serviceId, String localAddress, String localPort)
+ throws IOException {
+ this.frpProxyName = String.format("%s-%s", serviceName, serviceId);
+
+ Ini ini = this.getFrpConfig();
+ ini.put(frpProxyName, "type", "tcp");
+ ini.put(frpProxyName, "local_address", localAddress);
+ ini.put(frpProxyName, "local_port", localPort);
+ ini.put(frpProxyName, "use_compression", "true");
+
+ var output = new ByteArrayOutputStream();
+ ini.store(output);
+
+ this.reloadFrpConfig(ini);
+ }
+
+ public void removeProxy() throws IOException {
+ Ini ini = this.getFrpConfig();
+ ini.remove(this.frpProxyName);
+
+ this.reloadFrpConfig(ini);
+ }
+
+ public Ini getFrpConfig() throws IOException {
+ var frpConfigRequest = RequestFactory.makeHttpRequest(frpcAdminAddress + "/api/config");
+ frpConfigRequest.addHeaders("Authorization", frpAuthHeaderValue);
+ var response = requester.get(frpConfigRequest);
+
+ return new Ini(new ByteArrayInputStream(response.getBody()));
+ }
+
+ public void reloadFrpConfig(Ini ini) throws IOException {
+ var output = new ByteArrayOutputStream();
+ ini.store(output);
+
+ var uploadRequest = RequestFactory.makeHttpRequest(frpcAdminAddress + "/api/config", output.toByteArray());
+ uploadRequest.addHeaders("Authorization", frpAuthHeaderValue);
+ requester.put(uploadRequest);
+ var reloadRequest = RequestFactory.makeHttpRequest(frpcAdminAddress + "/api/reload");
+ reloadRequest.addHeaders("Authorization", frpAuthHeaderValue);
+ requester.get(reloadRequest);
+ }
+
+ public JsonNode getProxyStatus(String serviceName, String serviceId) throws IOException {
+ var statusRequest = RequestFactory.makeHttpRequest(frpcAdminAddress + "/api/status");
+ statusRequest.addHeaders("Authorization", frpAuthHeaderValue);
+ var statusResponse = requester.get(statusRequest);
+
+ JsonNode proxies = objectMapper.readTree(statusResponse.getBody()).path("tcp");
+ for (JsonNode proxy : proxies) {
+ if (proxy.path("name").asText().equals(serviceName + "-" + serviceId)) {
+ return proxy;
+ }
+ }
+
+ return MissingNode.getInstance();
+ }
+}
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/config/FrpConfig.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/config/FrpConfig.java
new file mode 100644
index 0000000..b1cf86f
--- /dev/null
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/config/FrpConfig.java
@@ -0,0 +1,22 @@
+package cn.wustlinghang.wusthelper.internal.undergrad.rpc.config;
+
+import jakarta.inject.Singleton;
+import jakarta.ws.rs.DefaultValue;
+import lombok.Data;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+
+@Data
+@Singleton
+public class FrpConfig {
+ @DefaultValue("http://127.0.0.1:7400")
+ @ConfigProperty(name = "frpc.admin-api.address")
+ String frpcAdminAddress;
+
+ @DefaultValue("")
+ @ConfigProperty(name = "frpc.admin.username")
+ String frpcAdminUsername;
+
+ @DefaultValue("")
+ @ConfigProperty(name = "frpc.admin.password")
+ String frpcAdminPassword;
+}
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/config/RpcConfig.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/config/RpcConfig.java
new file mode 100644
index 0000000..3c5beae
--- /dev/null
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/config/RpcConfig.java
@@ -0,0 +1,18 @@
+package cn.wustlinghang.wusthelper.internal.undergrad.rpc.config;
+
+import jakarta.inject.Singleton;
+import jakarta.ws.rs.DefaultValue;
+import lombok.Data;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+
+@Data
+@Singleton
+public class RpcConfig {
+ @DefaultValue("default.service")
+ @ConfigProperty(name = "rpc.service.name")
+ String serviceName;
+
+ @DefaultValue("http://127.0.0.1:8500")
+ @ConfigProperty(name = "rpc.register.consul-api.address")
+ String consulAddress;
+}
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/entity/RegisterRequestBody.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/entity/RegisterRequestBody.java
new file mode 100644
index 0000000..50573b9
--- /dev/null
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/entity/RegisterRequestBody.java
@@ -0,0 +1,13 @@
+package cn.wustlinghang.wusthelper.internal.undergrad.rpc.entity;
+
+import lombok.Builder;
+
+import java.util.List;
+
+@Builder
+public record RegisterRequestBody(String address, int port, List checks, String name, String id) {
+
+ @Builder
+ public record ChecksItem(String http, String interval) {
+ }
+}
\ No newline at end of file
diff --git a/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/health/HealthCheck.java b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/health/HealthCheck.java
new file mode 100644
index 0000000..44eb0c1
--- /dev/null
+++ b/sub-services/undergrad/src/main/java/cn/wustlinghang/wusthelper/internal/undergrad/rpc/health/HealthCheck.java
@@ -0,0 +1,14 @@
+package cn.wustlinghang.wusthelper.internal.undergrad.rpc.health;
+
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.core.Response;
+
+@Path("/health")
+public class HealthCheck {
+ private static final Response successResponse = Response.accepted().status(200).build();
+
+ @GET
+ @Path("/")
+ public Response response() {return successResponse;}
+}
diff --git a/sub-services/undergrad/src/main/resources/application.properties b/sub-services/undergrad/src/main/resources/application.properties
index c216edb..cbf13fc 100644
--- a/sub-services/undergrad/src/main/resources/application.properties
+++ b/sub-services/undergrad/src/main/resources/application.properties
@@ -1,4 +1,6 @@
quarkus.http.port=22800
+quarkus.http.enable-compression=true
+
#quarkus.log.level=DEBUG
quarkus.log.file.encoding=UTF-8
@@ -8,4 +10,11 @@ quarkus.package.type=uber-jar
# 原生镜像编译附加参数,去掉后编译会失败
# 但也只是能编译完成,目前的编译产物完全不可用,有非常多的严重bug
# 现阶段使用jar运行,启动效率虽不如原生程序,但速度尚可
-quarkus.native.additional-build-args=--initialize-at-run-time=cn.wustlinghang.mywust,--initialize-at-run-time=cn.wustlinghang.wusthelper,--enable-url-protocols=https
\ No newline at end of file
+quarkus.native.additional-build-args=--initialize-at-run-time=cn.wustlinghang.mywust,--initialize-at-run-time=cn.wustlinghang.wusthelper,--enable-url-protocols=https
+
+rpc.service.name=wusthelper.undergrad
+rpc.register.consul-api.address=http://127.0.0.1:8500
+
+frpc.admin-api.address=http://127.0.0.1:7400
+frpc.admin.username=admin
+frpc.admin.password=admin
\ No newline at end of file