본문 바로가기
프로젝트

심리검사 총점 받아오기

by 개발자신입 2024. 5. 17.
반응형

클라이언트 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에 저장된다..!

반응형

댓글