![](/assets/images/project_default_logo.png)
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
<template>
<div id="Chapter1_1" class="content-wrap">
<div style="margin: 30px 0px 50px; width: 20%">
<router-link to="/MyPlan.page">
<div class="logo mb25"><img src="../../../../resources/img/logo2.png" alt="" /></div>
</router-link>
</div>
<div class="title-box mb25 flex align-center mt40">
<span class="title mr40">1. Hello WORLD</span>
<span class="subtitle">my name is dd</span>
</div>
<div class="flex justify-between align-center">
<div class="pre-btn" @click="previousProblem()"><img src="../../../../resources/img/left.png" alt=""
:class="{ active: currentIndex === 0 }" />
</div>
<div class="content title-box">
<p class="title mt25 title-bg">step3</p>
<div class="flex align-center mb30">
<p class="subtitle2 mr20">{{ currentProblemIndex + 1 }}. {{ dataList.prblmExpln }}</p>
<!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
</button> -->
</div>
<div class="text-ct">
<div class="time-hint">
<button class="hint-btn">HINT</button>
<div class="time-bg mt20">
<div>
<div class="time">
<p class="second">{{ timer }}</p>
<p class="text">sec</p>
</div>
</div>
</div>
</div>
<div class="flex justify-center">
<div class="flex justify-between align-center" style="width: 50%">
<!-- SVG Container for Drawing Lines -->
<svg class="line-container" xmlns="http://www.w3.org/2000/svg"
:style="{ width: svgWidth, height: svgHeight }">
<line v-for="(pair, index) in pairs" :key="'line-' + index" :x1="pair.leftPos.x" :y1="pair.leftPos.y"
:x2="pair.rightPos.x" :y2="pair.rightPos.y" stroke="blue" stroke-width="2" />
</svg>
<div class="pickGroup left">
<div>
<article class="flex align-center justify-between mb20" style="gap: 60px"
v-for="(image, index) in images" :key="'left-' + index">
<img :src="image.src" :alt="image.alt" />
<div>
<button class="blue-c" @click="selectLeft(index, $event)"></button>
</div>
</article>
</div>
</div>
<div class="pickGroup right">
<article v-for="(word, index) in problemDetail" :key="index"
class="flex align-center justify-start mb20" style="gap: 30px">
<button class="blue-c" @click="selectRight(index, $event)"></button>
<p class="word">{{ word.prblmDtlExpln }}</p>
</article>
</div>
</div>
</div>
</div>
<button class="submit-button" @click="handleSubmit()"
v-if="currentIndex === learningIdsLength - 1">제출하기</button>
<button class="submit-button" @click="nextProblem()"
v-else>다음 문제로</button>
</div>
<div class="next-btn" @click="nextProblem()"><img src="../../../../resources/img/right.png" alt="" />
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
export default {
data() {
return {
timer: "00",
question: ["Australia", "Brazil", "China"],
images: [
{ src: "client/resources/img/img121_62s.png", alt: "Australia" },
{ src: "client/resources/img/img122_62s.png", alt: "Brazil" },
{ src: "client/resources/img/img123_62s.png", alt: "China" },
],
selectedLeft: null, // 왼쪽에서 선택된 인덱스 저장
selectedRight: null, // 오른쪽에서 선택된 인덱스 저장
pairs: [], // 매칭된 쌍을 저장
svgWidth: "100%", // SVG의 너비
svgHeight: "100%", // SVG의 높이
dataList: [],
problemDetail: [],
currentIndex: null,
learningIdsLength: null,
};
},
methods: {
goToPage(page) {
this.$router.push({ name: page });
},
startTimer() {
if (this.intervalId) {
clearInterval(this.intervalId);
}
this.timer = 5;
this.intervalId = setInterval(() => {
if (this.timer > 0) {
this.timer--;
} else {
clearInterval(this.intervalId);
}
}, 1000);
},
selectLeft(index, event) {
this.selectedLeft = { index, element: event.target };
this.checkMatch(); // 매칭을 시도
},
selectRight(index, event) {
this.selectedRight = { index, element: event.target };
this.checkMatch(); // 매칭을 시도
},
checkMatch() {
if (this.selectedLeft !== null && this.selectedRight !== null) {
// 매칭 성공 시 좌표를 계산하여 저장
const leftPos = this.getElementPosition(this.selectedLeft.element);
const rightPos = this.getElementPosition(this.selectedRight.element);
this.pairs.push({
left: this.selectedLeft.index,
right: this.selectedRight.index,
leftPos,
rightPos,
});
// 매칭이 된 후 선택 해제
this.selectedLeft = null;
this.selectedRight = null;
}
},
getElementPosition(element) {
const rect = element.getBoundingClientRect();
return {
x: rect.left + rect.width / 2,
y: rect.top + rect.height / 2,
};
},
handleSubmit() {
const userConfirmed = window.confirm("제출 하시겠습니까?");
if (userConfirmed) {
const problemData = {
prblmInfo: this.currentLearningId,
prblmNumber: this.currentProblemIndex,
prblmAns: this.selectedButton
};
const answerData = {
prblmId: this.currentLearningId.prblm_id,
prblmAns: this.selectedButton,
stdId: this.$store.getters.getStdId,
prblmLogAnsCnt: 1
};
this.$store.dispatch('saveProblemData', problemData);
this.$store.dispatch('saveProblemAttempt', answerData);
console.log(this.$store.getters.getAllProblems);
console.log(this.$store.getters.getAllAnswers);
axios({
url: "problemLog/insertProblemLog.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: this.$store.getters.getAllAnswers,
})
.then(function (res) {
console.log("problem - response : ", res.data);
this.goToPage('Chapter4')
})
.catch(function (error) {
console.log("problem - error : ", error);
});
} else {
console.log("Submission canceled by the user.");
}
},
updateSVGSize() {
const container = document.querySelector(".position-relative");
if (container) {
this.svgWidth = `${container.clientWidth}px`;
this.svgHeight = `${container.clientHeight}px`;
}
},
getProblem() {
const vm = this;
const prblmId = this.currentLearningId.prblm_id;
axios({
url: "problem/problemInfo.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: {
prblmId: prblmId,
},
})
.then(function (res) {
console.log("problem - response : ", res.data);
vm.dataList = res.data.problem;
vm.problemDetail = res.data.problemDetail;
})
.catch(function (error) {
console.log("problem - error : ", error);
});
},
nextProblem() {
const problemData = {
prblmInfo: this.currentLearningId,
prblmNumber: this.currentProblemIndex,
prblmAns: this.selectedButton
}
const answerData = {
prblmId: this.currentLearningId.prblm_id,
prblmAns: this.selectedButton,
stdId: this.$store.getters.getStdId,
prblmLogAnsCnt: 1
}
this.$store.dispatch('saveProblemData', problemData);
this.$store.dispatch('saveProblemAttempt', answerData);
console.log(this.$store.getters.getAllProblems)
console.log(this.$store.getters.getAllAnswers)
if (this.currentProblemIndex < this.$store.state.currentLearningIds.length - 1) {
this.$store.dispatch('goToNextProblem');
this.handleProblemDetail(this.currentLearningId);
this.goToPage(this.problemType);
}
},
previousProblem() {
if (this.currentProblemIndex > 0) {
this.$store.dispatch('goToPreviousProblem');
this.handleProblemDetail(this.currentLearningId);
this.goToPage(this.problemType);
}
},
handleProblemDetail(item) {
if (item.prblm_type_id === "prblm_type_001") {
this.problemType = "Chapter3";
} else if (item.prblm_type_id === "prblm_type_002") {
this.problemType = "Chapter3_1";
} else if (item.prblm_type_id === "prblm_type_003") {
this.problemType = "Chapter3_2";
} else if (item.prblm_type_id === "prblm_type_004") {
this.problemType = "Chapter3_3";
} else if (item.prblm_type_id === "prblm_type_005") {
this.problemType = "Chapter3_3_1";
} else if (item.prblm_type_id === "prblm_type_006") {
this.problemType = "Chapter3_4";
} else if (item.prblm_type_id === "prblm_type_007") {
this.problemType = "Chapter3_5";
} else if (item.prblm_type_id === "prblm_type_008") {
this.problemType = "Chapter3_6";
} else if (item.prblm_type_id === "prblm_type_009") {
this.problemType = "Chapter3_7";
} else if (item.prblm_type_id === "prblm_type_010") {
this.problemType = "Chapter3_8";
} else if (item.prblm_type_id === "prblm_type_011") {
this.problemType = "Chapter3_9";
} else if (item.prblm_type_id === "prblm_type_012") {
this.problemType = "Chapter3_10";
} else if (item.prblm_type_id === "prblm_type_013") {
this.problemType = "Chapter3_11";
} else if (item.prblm_type_id === "prblm_type_014") {
this.problemType = "Chapter3_12";
} else if (item.prblm_type_id === "prblm_type_015") {
this.problemType = "Chapter3_13";
} else if (item.prblm_type_id === "prblm_type_016") {
this.problemType = "Chapter3_14";
} else if (item.prblm_type_id === "prblm_type_017") {
this.problemType = "Chapter3_15";
} else if (item.prblm_type_id === "prblm_type_018") {
this.problemType = "Chapter2_8";
} else if (item.prblm_type_id === "prblm_type_019") {
this.problemType = "Chapter2_7";
} else if (item.prblm_type_id === "prblm_type_020") {
this.problemType = "Chapter2_5";
} else if (item.prblm_type_id === "prblm_type_021") {
this.problemType = "Chapter2_6";
} else if (item.prblm_type_id === "prblm_type_022") {
this.problemType = "Chapter2_10";
} else if (item.prblm_type_id === "prblm_type_023") {
this.problemType = "Chapter2_11";
} else if (item.prblm_type_id === "prblm_type_024") {
this.problemType = "Chapter2_13";
}
},
},
watch: {},
computed: {
currentLearningId() {
return this.$store.getters.currentLearningId;
},
currentLabel() {
return this.$store.getters.currentLabel;
},
currentProblemIndex() {
return this.$store.getters.currentProblemIndex;
},
isPreviousButtonDisabled() {
return this.currentProblemIndex === 0;
}
},
created() {
console.log('Current Learning ID:', this.currentLearningId);
console.log('Current Label:', this.currentLabel);
console.log('Current Problem Index:', this.currentProblemIndex);
this.currentIndex = this.currentProblemIndex;
this.learningIdsLength = this.$store.state.currentLearningIds.length;
// Fetch or process the current problem based on `currentLearningId`
},
components: {},
mounted() {
this.getProblem()
this.updateSVGSize();
window.addEventListener("resize", this.updateSVGSize);
},
beforeDestroy() {
window.removeEventListener("resize", this.updateSVGSize);
},
};
</script>
<style scoped>
.textbox {
height: 60px;
}
.textbox p {
font-size: 28px;
font-weight: bold;
line-height: 65px;
}
.dropGroup button {
position: relative;
}
.pickGroup {
display: flex;
flex-direction: column;
gap: 60px;
}
.pickGroup .word {
font-size: 48px;
font-family: "ONEMobilePOPOTF";
}
.dragGroup button p {
font-size: 48px;
}
.submit-button {
position: absolute;
background-color: #ffba08;
padding: 10px 30px;
border-radius: 10px;
font-size: 28px;
font-family: "ONEMobilePOPOTF";
right: 5rem;
bottom: 3rem;
}
.position-relative {
position: relative;
}
.line-container {
position: absolute;
bottom: 215px;
right: 125px;
pointer-events: none;
}
.pre-btn img.active {
visibility: hidden;
}
.pre-btn img.active {
visibility: hidden;
}
.blue-c {
width: 20px;
height: 20px;
background-color: blue;
border-radius: 50%;
border: none;
cursor: pointer;
}
</style>