반응형
클라이언트 vue 코드
submitTest() {
console.log(this.userAnswers);
console.log('네비게이션 전에 로그 출력');
const isAllAnswered = Object.keys(this.userAnswers).length === this.questions.length;
if (!isAllAnswered) {
alert("모든 질문에 답해주세요.");
return; // 모든 질문에 답하지 않았다면 여기서 함수 종료
}
// 총점 계산을 위해 각 질문의 답변을 배열에 담기
const userAnswersArray = this.questions.map(question => {
return parseInt(this.userAnswers[question.qid]);
})
console.log('test page 전송하는 데이터:', userAnswersArray);
axios.post('http://localhost:3000/api/submitTest', {
userAnswersArray: userAnswersArray,
totalScore: userAnswersArray.reduce((acc, cur) => acc + cur, 0) // 각 답변의 총합
})
.then(response => {
console.log('성공적으로 제출됨:', response.data);
const { totalScore, recommendedJobs, personalTraits } = response.data;
this.result.totalScore = totalScore;
this.result.recommendedJobs = recommendedJobs;
this.result.personalTraits = personalTraits;
this.$router.push({ name: 'ResultPage', query: { userAnswers: JSON.stringify(userAnswersArray) } });
})
.catch(error => {
console.error('Error submitting test:', error);
});
}
TestController.java
@RestController
@RequestMapping("/api")
public class TestController {
@Autowired
TestService testService;
// 설문지 제출 -> 결과 생성
@PostMapping("/submitTest")
public ResponseEntity<ResultData> submitTest(@RequestBody ResultData resultData) {
List<TestResult> testResults = new ArrayList<>();
int totalScore = 0;
// 응답 배열 가져옴
List<Integer> userAnswersArray = resultData.getUserAnswersArray();
for (int i = 0; i < userAnswersArray.size(); i++) {
Integer answer = userAnswersArray.get(i);
if (answer != null && answer >= 1 && answer <= 3) {
int score = calculateScore(answer);
totalScore += score;
TestResult testResult = new TestResult();
testResult.setQid(i + 1);
testResult.setTanswer(answer);
testResult.setTdate(LocalDateTime.now());
testResult.setTotalScore(totalScore);
testResults.add(testResult);
}
}
ResultData result = generateResultData(totalScore);
return ResponseEntity.ok(result);
}
// 결과 조회
@PostMapping("/getTestResult")
public ResponseEntity<ResultData> getTestResult(@RequestBody List<Integer> userAnswers) {
int totalScore = 0;
int validAnswersCount = 0;
for (Integer answer : userAnswers) {
if (answer != null && answer >= 1 && answer <= 3) {
int score = calculateScore(answer);
totalScore += score;
validAnswersCount++;
}
}
// 적어도 하나의 유효한 답변이 있는 경우에만 결과를 반환
if (validAnswersCount > 0) {
ResultData result = generateResultData(totalScore);
return ResponseEntity.ok(result);
} else {
// 유효한 답변이 없는 경우에는 예외 처리 또는 적절한 메시지를 반환할 수 있습니다.
return ResponseEntity.badRequest().build();
}
}
// 답변에 따른 점수 계산
private int calculateScore(int answer) {
return answer; // 응답 값이 점수와 동일하므로 그대로 반환
}
// 총점에 따른 결과 생성
private ResultData generateResultData(int totalScore) {
ResultData result = new ResultData();
result.setTotalScore(totalScore);
result.setRecommendedJobs(getRecommendedJobs(totalScore));
result.setPersonalTraits(getPersonalTraits(totalScore));
result.setTdate(LocalDateTime.now());
return result;
}
ResultData (DTO)
// ResultData(DTO) 클래스는 TestQuestion, TestAnswer, TestResult 엔티티 간의 데이터 전송을 위해 사용
@NoArgsConstructor
@JsonAutoDetect
@Data
public class ResultData {
private int totalScore;
private String recommendedJobs;
private List<String> personalTraits;
private LocalDateTime tdate;
private List<Integer> userAnswersArray;
}
db에 저장된다..!
반응형
'프로젝트' 카테고리의 다른 글
DB에 있는 List값을 불러오지 못하는 경우 (0) | 2024.05.20 |
---|---|
기존 DB 테이블에 id 저장하기 (토큰으로 받아오기) (0) | 2024.05.20 |
[GeoServer] 시도, 시군구, 범례 레이어 겹치지 않게 (0) | 2024.04.04 |
[GeoServer] spring과 DB연동해서 차트 그리기 (0) | 2024.04.01 |
[GeoServer] 데이터베이스에 txt파일 업로드하기 DB연동 (0) | 2024.03.27 |
댓글