@PutMapping("/logs/request-dev-log")完成这个接口功能1、点击预约日志按钮,跳出一个弹窗。 2、在设备sn框中输入sn号点击确定触发@PutMapping("/logs/request-dev-log")会生成一个日志记录,之后会在页面中显示出这条日志记录。操作人adminer从服务本地获取,sn从输入框获取,其他都是http://10.21.122.20:8097/admin/logs服务获取
时间: 2025-07-19 20:30:10 浏览: 5
<think>根据需求,我们需要实现一个Spring Boot的PUT接口,当用户输入SN号后,调用远程日志服务创建日志记录,并返回该记录以便前端显示。
步骤:
1. 创建一个Spring Boot控制器,包含一个处理PUT请求的方法。
2. 从请求参数中获取SN号。
3. 获取当前操作人(adminer)。这里假设当前操作人可以从安全上下文或会话中获取,为了简化,我们先使用一个固定值,但实际中应该从认证信息中获取。
4. 构建请求体,包含SN和操作人,然后调用远程日志服务(http://10.21.122.20:8097/admin/logs)创建日志记录。
5. 将远程服务返回的日志记录作为响应返回给前端。
注意:由于远程服务地址是HTTP,我们使用RestTemplate来调用。
实现代码:</think>### 解决方案:日志预约接口实现
根据需求,我们需要实现一个Spring Boot接口,完成以下功能:
1. 接收前端传入的SN号
2. 获取当前操作人(adminer)
3. 调用远程日志服务创建日志记录
4. 返回创建的日志记录
以下是完整的实现代码:
```java
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@RestController
public class LogController {
// 远程日志服务地址
private static final String REMOTE_LOG_SERVICE_URL = "http://10.21.122.20:8097/admin/logs";
@PutMapping("/logs/request-dev-log")
public ResponseEntity<?> requestDevLog(@RequestParam("sn") String sn) {
try {
// 1. 获取当前操作人 (从本地服务获取)
String adminer = getCurrentAdminer(); // 实际项目中从安全上下文获取
// 2. 准备请求数据
Map<String, Object> logData = new HashMap<>();
logData.put("sn", sn);
logData.put("operator", adminer);
// 3. 调用远程日志服务创建记录
Map<String, Object> createdLog = createLogRecord(logData);
// 4. 返回创建成功的日志记录
return ResponseEntity.ok(createdLog);
} catch (Exception e) {
// 异常处理
Map<String, String> error = new HashMap<>();
error.put("error", "日志创建失败: " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
}
}
// 获取当前操作人 (示例实现)
private String getCurrentAdminer() {
// 实际项目中从Spring Security上下文获取
// SecurityContext context = SecurityContextHolder.getContext();
// return context.getAuthentication().getName();
return "adminer"; // 示例固定值
}
// 调用远程日志服务
private Map<String, Object> createLogRecord(Map<String, Object> logData) {
RestTemplate restTemplate = new RestTemplate();
// 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
// 创建请求实体
HttpEntity<Map<String, Object>> requestEntity =
new HttpEntity<>(logData, headers);
// 发送POST请求
ResponseEntity<Map> response = restTemplate.exchange(
REMOTE_LOG_SERVICE_URL,
HttpMethod.POST,
requestEntity,
Map.class
);
return response.getBody();
}
}
```
### 代码解释
1. **接口定义**:
- 使用`@PutMapping`定义PUT请求端点
- `@RequestParam("sn")`获取前端传入的SN号
2. **操作人获取**:
- `getCurrentAdminer()`方法获取当前操作人(示例中返回固定值)
- 实际项目中应集成Spring Security获取认证用户
3. **远程服务调用**:
- 使用`RestTemplate`调用远程日志服务
- 构造包含SN和adminer的JSON请求体
- 设置JSON请求头和接收类型
4. **异常处理**:
- 捕获可能的异常(网络错误、服务不可用等)
- 返回500错误和详细信息
5. **响应处理**:
- 成功时返回远程服务创建的日志记录
- 失败时返回错误信息
### 前端调用示例 (Vue.js)
```javascript
// 预约日志方法
async requestDeviceLog() {
try {
const response = await this.$axios.put('/logs/request-dev-log', null, {
params: {
sn: this.deviceSn // 从输入框获取的值
}
});
// 将返回的日志添加到页面显示
this.logRecords.unshift(response.data);
// 关闭弹窗
this.showDialog = false;
} catch (error) {
console.error('日志创建失败:', error);
this.errorMessage = '日志创建失败,请重试';
}
}
```
### 关键注意事项
1. **安全认证**:
- 实际项目中需要添加JWT或OAuth2认证
- 远程服务调用可能需要认证头
2. **参数验证**:
- 应添加SN号的格式验证
- 使用Spring Validation验证输入
3. **服务可用性**:
- 添加远程服务熔断机制(建议使用Resilience4j)
- 设置合理的请求超时时间
4. **日志记录**:
- 添加接口调用日志
- 记录关键操作信息
阅读全文