新增系统配置表及默认配置,更新链接生成请求DTO以支持链接数量参数,重构链接生成服务逻辑,添加链接状态查询和有效性检查接口,优化日志记录。

This commit is contained in:
zyh
2025-08-26 10:33:26 +08:00
parent 7317866f98
commit 599ec0a36b
73 changed files with 1829 additions and 50 deletions

View File

@@ -0,0 +1,120 @@
package com.gameplatform.server.controller.admin;
import com.gameplatform.server.model.dto.common.PageResult;
import com.gameplatform.server.model.entity.admin.SystemConfig;
import com.gameplatform.server.model.dto.admin.SystemConfigRequest;
import com.gameplatform.server.model.dto.admin.SystemConfigResponse;
import com.gameplatform.server.model.dto.admin.SystemConfigConverter;
import com.gameplatform.server.service.admin.SystemConfigService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/admin/config")
@Tag(name = "系统配置管理", description = "系统配置的增删改查接口")
public class SystemConfigController {
@Autowired
private SystemConfigService systemConfigService;
@GetMapping("/list")
@Operation(summary = "获取配置列表", description = "分页获取所有系统配置")
public ResponseEntity<PageResult<SystemConfigResponse>> getConfigList(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int size) {
int offset = (page - 1) * size;
List<SystemConfig> configs = systemConfigService.getAllConfigs(size, offset);
long total = systemConfigService.getConfigCount();
List<SystemConfigResponse> responses = configs.stream()
.map(SystemConfigConverter::toResponse)
.toList();
PageResult<SystemConfigResponse> result = new PageResult<>();
result.setItems(responses);
result.setTotal(total);
result.setPage(page);
result.setSize(size);
return ResponseEntity.ok(result);
}
@GetMapping("/key/{configKey}")
@Operation(summary = "根据键获取配置", description = "根据配置键获取配置信息")
public ResponseEntity<SystemConfigResponse> getConfigByKey(@PathVariable String configKey) {
SystemConfig config = systemConfigService.getConfigByKey(configKey);
if (config == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(SystemConfigConverter.toResponse(config));
}
@GetMapping("/type/{configType}")
@Operation(summary = "根据类型获取配置", description = "根据配置类型获取配置列表")
public ResponseEntity<List<SystemConfigResponse>> getConfigsByType(@PathVariable String configType) {
List<SystemConfig> configs = systemConfigService.getConfigsByType(configType);
List<SystemConfigResponse> responses = configs.stream()
.map(SystemConfigConverter::toResponse)
.toList();
return ResponseEntity.ok(responses);
}
@PostMapping
@Operation(summary = "创建配置", description = "创建新的系统配置")
public ResponseEntity<Boolean> createConfig(@RequestBody SystemConfigRequest request) {
SystemConfig systemConfig = SystemConfigConverter.toEntity(request);
boolean success = systemConfigService.createConfig(systemConfig);
return ResponseEntity.ok(success);
}
@PutMapping("/{id}")
@Operation(summary = "更新配置", description = "更新指定ID的系统配置")
public ResponseEntity<Boolean> updateConfig(@PathVariable Long id, @RequestBody SystemConfigRequest request) {
SystemConfig systemConfig = SystemConfigConverter.toEntity(request);
systemConfig.setId(id);
boolean success = systemConfigService.updateConfig(systemConfig);
return ResponseEntity.ok(success);
}
@DeleteMapping("/{id}")
@Operation(summary = "删除配置", description = "删除指定ID的系统配置")
public ResponseEntity<Boolean> deleteConfig(@PathVariable Long id) {
boolean success = systemConfigService.deleteConfig(id);
return ResponseEntity.ok(success);
}
@DeleteMapping("/key/{configKey}")
@Operation(summary = "根据键删除配置", description = "根据配置键删除系统配置")
public ResponseEntity<Boolean> deleteConfigByKey(@PathVariable String configKey) {
boolean success = systemConfigService.deleteConfigByKey(configKey);
return ResponseEntity.ok(success);
}
@GetMapping("/link/defaults")
@Operation(summary = "获取链接默认配置", description = "获取链接生成相关的默认配置")
public ResponseEntity<Object> getLinkDefaults() {
return ResponseEntity.ok(new Object() {
public final Integer defaultQuantity = systemConfigService.getDefaultQuantity();
public final Integer refreshInterval = systemConfigService.getRefreshInterval();
public final Integer qrExpireTime = systemConfigService.getQrExpireTime();
public final Integer maxTimesPerBatch = systemConfigService.getMaxTimesPerBatch();
public final Integer minQuantity = systemConfigService.getMinQuantity();
public final Integer maxQuantity = systemConfigService.getMaxQuantity();
});
}
@GetMapping("/script/config")
@Operation(summary = "获取脚本配置", description = "获取脚本服务器相关配置")
public ResponseEntity<Object> getScriptConfig() {
return ResponseEntity.ok(new Object() {
public final String serverUrl = systemConfigService.getScriptServerUrl();
public final String qrPathTemplate = systemConfigService.getQrPathTemplate();
});
}
}

View File

@@ -2,7 +2,9 @@ package com.gameplatform.server.controller.link;
import com.gameplatform.server.model.dto.link.LinkGenerateRequest;
import com.gameplatform.server.model.dto.link.LinkGenerateResponse;
import com.gameplatform.server.model.dto.link.LinkStatusResponse;
import com.gameplatform.server.service.link.LinkGenerationService;
import com.gameplatform.server.service.link.LinkStatusService;
import io.jsonwebtoken.Claims;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -24,9 +26,11 @@ public class LinkController {
private static final Logger log = LoggerFactory.getLogger(LinkController.class);
private final LinkGenerationService linkGenerationService;
private final LinkStatusService linkStatusService;
public LinkController(LinkGenerationService linkGenerationService) {
public LinkController(LinkGenerationService linkGenerationService, LinkStatusService linkStatusService) {
this.linkGenerationService = linkGenerationService;
this.linkStatusService = linkStatusService;
}
@PostMapping("/generate")
@@ -35,8 +39,8 @@ public class LinkController {
public Mono<LinkGenerateResponse> generateLinks(@Valid @RequestBody LinkGenerateRequest request,
Authentication authentication) {
log.info("=== 开始处理链接生成请求 ===");
log.info("请求参数: times={}, perTimeQuantity={}",
request.getTimes(), request.getPerTimeQuantity());
log.info("请求参数: times={}, linkCount={}",
request.getTimes(), request.getLinkCount());
log.info("=== 开始检查认证信息 ===");
log.info("Authentication: {}", authentication);
@@ -92,11 +96,11 @@ public class LinkController {
log.info("=== 用户认证信息完整,开始处理业务逻辑 ===");
log.info("操作者信息: operatorId={}, operatorType={}, username={}",
operatorId, operatorType, username);
log.info("业务参数: times={}, perTimeQuantity={}",
request.getTimes(), request.getPerTimeQuantity());
log.info("业务参数: times={}, linkCount={}",
request.getTimes(), request.getLinkCount());
return linkGenerationService.generateLinks(operatorId, operatorType,
request.getTimes(), request.getPerTimeQuantity())
request.getTimes(), request.getLinkCount())
.map(result -> {
log.info("链接生成成功batchId: {}, 扣除积分: {}, 过期时间: {}",
result.getBatchId(), result.getNeedPoints(), result.getExpireAt());
@@ -111,6 +115,36 @@ public class LinkController {
log.error("链接生成失败: {}", error.getMessage(), error);
});
}
@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);
}
}