feat: 添加AOP支持和更新链接控制器逻辑

主要修改:
1. 在pom.xml中新增spring-boot-starter-aop依赖,支持面向切面编程。
2. 在LinkController中移除DeviceCodeMappingService的依赖,更新二维码获取逻辑,使用linkStatusService获取设备ID。
3. 在SelectRegionResponse中新增mecmachineId字段,便于调试和维护。
4. 在SecurityConfig中允许二维码HEAD请求公开访问。

技术细节:
- 通过引入AOP支持,提升了代码的可维护性和扩展性,同时优化了链接控制器的逻辑,确保设备ID的获取更加灵活。
This commit is contained in:
zyh
2025-08-28 22:19:06 +08:00
parent a56eebc30b
commit 1d72bc4c5a
12 changed files with 526 additions and 352 deletions

View File

@@ -15,7 +15,6 @@ import com.gameplatform.server.model.dto.link.UserLinkStatusResponse;
import com.gameplatform.server.service.link.LinkGenerationService;
import com.gameplatform.server.service.link.LinkListService;
import com.gameplatform.server.service.link.LinkStatusService;
import com.gameplatform.server.service.device.DeviceCodeMappingService;
import com.gameplatform.server.service.external.ScriptClient;
import io.jsonwebtoken.Claims;
import io.swagger.v3.oas.annotations.Operation;
@@ -41,18 +40,15 @@ public class LinkController {
private final LinkGenerationService linkGenerationService;
private final LinkStatusService linkStatusService;
private final LinkListService linkListService;
private final DeviceCodeMappingService deviceCodeMappingService;
private final ScriptClient scriptClient;
public LinkController(LinkGenerationService linkGenerationService,
LinkStatusService linkStatusService,
LinkListService linkListService,
DeviceCodeMappingService deviceCodeMappingService,
ScriptClient scriptClient) {
this.linkGenerationService = linkGenerationService;
this.linkStatusService = linkStatusService;
this.linkListService = linkListService;
this.deviceCodeMappingService = deviceCodeMappingService;
this.scriptClient = scriptClient;
}
@@ -182,35 +178,6 @@ public class LinkController {
});
}
// @GetMapping("/{codeNo}/status")
// @Operation(summary = "获取链接状态", description = "根据链接编号获取链接的详细状态信息,包括过期时间、奖励点数、当前状态等")
// public Mono<LinkStatusResponse> getLinkStatus(@PathVariable("codeNo") String codeNo) {
// log.info("=== 开始查询链接状态 ===");
// log.info("链接编号: {}", codeNo);
//
// return linkStatusService.getLinkStatus(codeNo)
// .doOnSuccess(response -> {
// log.info("链接状态查询成功: codeNo={}, status={}, isExpired={}",
// codeNo, response.getStatus(), response.getIsExpired());
// })
// .doOnError(error -> {
// log.error("链接状态查询失败: codeNo={}, error={}", codeNo, error.getMessage(), error);
// });
// }
//
// @GetMapping("/{codeNo}/exists")
// @Operation(summary = "检查链接是否存在", description = "检查指定链接编号是否存在")
// public Mono<Boolean> isLinkExists(@PathVariable("codeNo") String codeNo) {
// log.debug("检查链接是否存在: codeNo={}", codeNo);
// return linkStatusService.isLinkExists(codeNo);
// }
//
// @GetMapping("/{codeNo}/valid")
// @Operation(summary = "检查链接是否有效", description = "检查指定链接是否有效(未过期且状态正常)")
// public Mono<Boolean> isLinkValid(@PathVariable("codeNo") String codeNo) {
// log.debug("检查链接是否有效: codeNo={}", codeNo);
// return linkStatusService.isLinkValid(codeNo);
// }
@DeleteMapping("/{codeNo}")
@Operation(summary = "删除链接", description = "删除指定的链接,用户只能删除自己创建的链接")
public Mono<Boolean> deleteLink(@PathVariable("codeNo") String codeNo, Authentication authentication) {
@@ -464,31 +431,31 @@ public Mono<Boolean> deleteLink(@PathVariable("codeNo") String codeNo, Authentic
* 代理二维码获取接口
* 通过代理code获取真实设备的二维码避免暴露设备编号
*/
@GetMapping("/qr/{proxyCode}")
@GetMapping("/qr/{code}")
@Operation(summary = "获取二维码", description = "通过代理code获取设备二维码用于扫码上号")
public Mono<ResponseEntity<byte[]>> getProxyQrCode(@PathVariable("proxyCode") String proxyCode) {
public Mono<ResponseEntity<byte[]>> getProxyQrCode(@PathVariable("code") String code) {
log.info("=== 获取代理二维码 ===");
log.info("代理code: {}", proxyCode);
log.info("代理code: {}", code);
// 验证代理code是否有效
if (!deviceCodeMappingService.isValidProxyCode(proxyCode)) {
log.warn("无效的代理code: {}", proxyCode);
return Mono.just(ResponseEntity.notFound().build());
}
// // 验证代理code是否有效
// if (!deviceCodeMappingService.isValidProxyCode(proxyCode)) {
// log.warn("无效的代理code: {}", proxyCode);
// return Mono.just(ResponseEntity.notFound().build());
// }
// 获取真实设备编号
String deviceId = deviceCodeMappingService.getDeviceId(proxyCode);
if (deviceId == null) {
log.warn("代理code对应的设备不存在: {}", proxyCode);
String meachainId = linkStatusService.getMechainIdByCode(code);
if (meachainId == null) {
log.warn("代理code对应的设备不存在: {}", code);
return Mono.just(ResponseEntity.notFound().build());
}
log.info("代理code {} 对应设备: {}", proxyCode, deviceId);
log.info("代理code {} 对应设备: {}", code, meachainId);
// 获取真实设备的二维码
return scriptClient.getDeviceQrCode(deviceId)
return scriptClient.getDeviceQrCode(meachainId)
.map(qrData -> {
log.info("获取设备 {} 二维码成功,大小: {} 字节", deviceId, qrData.length);
log.info("获取设备 {} 二维码成功,大小: {} 字节", meachainId, qrData.length);
// 设置响应头
HttpHeaders headers = new HttpHeaders();
@@ -502,14 +469,14 @@ public Mono<Boolean> deleteLink(@PathVariable("codeNo") String codeNo, Authentic
.body(qrData);
})
.onErrorResume(error -> {
log.error("获取设备 {} 二维码失败: {}", deviceId, error.getMessage(), error);
log.error("获取设备 {} 二维码失败: {}", meachainId, error.getMessage(), error);
// 如果是404错误返回404其他错误返回500
if (error instanceof WebClientResponseException.NotFound) {
log.warn("设备 {} 的二维码文件不存在返回404", deviceId);
log.warn("设备 {} 的二维码文件不存在返回404", meachainId);
return Mono.just(ResponseEntity.status(HttpStatus.NOT_FOUND).build());
} else {
log.error("获取设备 {} 二维码时发生系统错误", deviceId);
log.error("获取设备 {} 二维码时发生系统错误", meachainId);
return Mono.just(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build());
}
});