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/new_img/logo_v2.png" alt="" />
</div>
</router-link>
</div>
<div
class="title-box mb25 flex align-center mt40"
style="justify-content: space-between"
>
<div>
<span class="title mr40">1. Hello WORLD</span>
<span class="subtitle">my name is dd</span>
</div>
<button class="completeBtn" @click="complete">학습 종료</button>
</div>
<div class="flex justify-between align-center">
<div
class="pre-btn"
:style="{ visibility: hiddenState ? 'hidden' : 'visible' }"
@click="previousProblem()"
>
<img src="../../../../resources/img/left.png" alt="" />
</div>
<div class="content title-box">
<div style="display: flex; justify-content: space-between">
<p class="title mt25 title-bg">step3 - 놀면서 배우는 영어</p>
<button id="returnButton" @click="returnPage" style="margin: 4rem">
<img src="../../../../resources/img/btn_return_50x50.png" alt="" />
<p>되돌리기</p>
</button>
</div>
<div class="flex align-center mb30">
<p class="subtitle2 mr20">그림을 보고 문장을 완성시켜줘!</p>
<!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
</button> -->
</div>
<div class="text-ct">
<!-- <p class="title1 mb40" style="color: #464749;">The sun rises in the east and sets in the west. It is very hot during summer.</p>
<img src="../../../../resources/img/img65_37s.png" alt=""> -->
<img
class="exampleImg"
:src="imgUrl"
reloadable="true"
alt="example img"
/>
<!-- 정답 칸 -->
<div class="dropGroup flex align-center justify-center mt30">
<span class="mr30">{{ beforeQuestion }}</span>
<!-- 드롭 가능한 영역 -->
<div class="dropContainer" id="targetContainer">
<div
v-for="(slot, index) in answerLength"
:key="index"
class="dropSlot"
@dragover.prevent
@drop="onDrop($event, index)"
>
<div
class="dropSlot-inner"
draggable="true"
@dragstart="onDragStart($event, userAnswer[index], index)"
>
<img
src="../../../../resources/img/img64_37s.png"
alt="answer slot"
/>
<div v-if="userAnswer[index]" class="dropped-char">
{{ userAnswer[index].toUpperCase() }}
</div>
</div>
</div>
</div>
<span class="mr30">{{ afterQuestion }}</span>
</div>
<!-- 드래그 가능한 버튼 -->
<div class="dragGroup mt40" id="sourceContainer">
<button
v-for="(char, index) in choiceCharacters"
:key="index"
draggable="true"
@dragstart="onDragStart($event, char)"
>
<img
src="../../../../resources/img/img63_37s_2.png"
alt="drag letter"
/>
<p>{{ char.toUpperCase() }}</p>
</button>
</div>
</div>
</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 {
imgSrc: "client/resources/img/jumpingRabbit.gif",
example: "",
beforeQuestion: "",
afterQuestion: "",
choice: "",
answer: "",
answerLength: 0, // 초기화 시 0으로 설정
userAnswer: [], // 초기화 시 빈 배열로 설정
draggedChar: null, // 드래그한 문자를 임시로 저장
prblm_id: [],
unit_id: null,
dataList: [],
seq: this.$store.getters.seqNum,
hiddenState: false,
imgUrl: null,
};
},
computed: {},
methods: {
complete() {
// 로컬 스토리지에서 currentDashboard 값을 가져옴
const savedState = localStorage.getItem("vuexState");
if (savedState) {
const parsedState = JSON.parse(savedState);
const currentDashboard = parsedState.currentDashboard;
const { unit_id, book_id } = this.$route.query;
if (currentDashboard === "Learning") {
// Learning 모드일 때 Dashboard로 이동
this.$router.push({
name: "Dashboard",
query: { value: this.seq, unit_id, book_id },
});
} else if (currentDashboard === "AI") {
// AI 모드일 때 AIDashboard로 이동
this.$router.push({
name: "AIDashboard",
query: { value: this.seq, unit_id, book_id },
});
}
} else {
console.error("currentDashboard 값이 없습니다.");
}
},
goToPage(page) {
this.$router.push({ name: page });
},
splitExample() {
const parts = this.example.split("/?/");
if (parts.length === 2) {
this.beforeQuestion = parts[0];
this.afterQuestion = parts[1];
}
},
// 드래그 시작 시 호출
onDragStart(event, char) {
this.draggedChar = char;
},
// 드롭 시 호출
onDrop(event, index) {
if (this.userAnswer[index] === "") {
this.userAnswer.splice(index, 1, this.draggedChar);
const charIndex = this.choiceCharacters.indexOf(this.draggedChar);
console.log(charIndex);
if (charIndex > -1) {
this.choiceCharacters.splice(charIndex, 1); // 드래그한 문자를 choice에서 제거
}
this.draggedChar = null;
this.checkAnswer(); // 드롭 후 정답을 확인
}
},
checkAnswer() {
// userAnswer 배열이 모두 채워졌는지 확인
if (!this.userAnswer.includes("")) {
setTimeout(() => {
if (this.userAnswer.join("") === this.answer) {
alert("정답입니다!");
this.nextProblem();
} else {
alert("오답입니다!");
}
}, 0);
}
},
initializeUserAnswer() {
this.answerLength = this.answer.length; // answer의 길이를 answerLength에 설정
this.userAnswer = Array(this.answerLength).fill(""); // answerLength만큼 빈 배열 생성
},
returnPage() {
window.location.reload();
},
// async getProblem() {
// const prblmId = this.currentLearningId.prblm_id;
// try {
// const res = await axios.post(
// "problem/problemInfo.json",
// {
// prblmId: prblmId,
// },
// {
// headers: {
// "Content-Type": "application/json; charset=UTF-8",
// },
// }
// );
// console.log("problem - response : ", res.data);
// this.dataList = res.data.problem;
// this.problemDetail = res.data.problemDetail[0];
// this.example = this.dataList.prblmExpln;
// this.answer = this.problemDetail.prblmDtlExpln;
// this.choice = this.answer ? this.shuffleString(this.answer) : "";
// this.splitExample();
// this.initializeUserAnswer();
// this.choiceCharacters = this.choice.split("");
// const fileInfo = await this.findFile(this.dataList.fileMngId);
// if (fileInfo) {
// this.imgUrl = "http://165.229.169.113:9080/" + fileInfo.fileRpath;
// console.log(this.imgUrl);
// } else {
// console.warn("No file found for the given fileMngId.");
// }
// } catch (error) {
// console.log("problem - error : ", error);
// }
// },
async getProblem() {
// 로컬 스토리지에서 currentDashboard를 확인
const savedState = localStorage.getItem("vuexState");
let prblmId = null;
if (savedState) {
const parsedState = JSON.parse(savedState);
const currentDashboard = parsedState.currentDashboard;
if (currentDashboard === "AI") {
// AI 모드일 경우 로컬 스토리지에서 currentLearningIds를 사용
prblmId = parsedState.currentLearningIds; // 로컬스토리지에서 가져온 currentLearningIds 사용
console.log("AI 모드에서 currentLearningIds 사용:", prblmId);
} else {
// Learning 모드일 경우 기존 방식 사용
prblmId = this.currentLearningId.prblm_id;
console.log("Learning 모드에서 currentLearningId 사용:", prblmId);
}
}
try {
const res = await axios.post(
"problem/problemInfo.json",
{
prblmId: prblmId, // AI 모드 또는 Learning 모드에 따라 결정된 prblmId 사용
},
{
headers: {
"Content-Type": "application/json; charset=UTF-8",
}
}
);
console.log("problem - response : ", res.data);
this.dataList = res.data.problem;
this.problemDetail = res.data.problemDetail[0];
this.example = this.dataList.prblmExpln;
this.answer = this.problemDetail.prblmDtlExpln;
this.choice = this.answer ? this.shuffleString(this.answer) : "";
this.splitExample();
this.initializeUserAnswer();
this.choiceCharacters = this.choice.split("");
const fileInfo = await this.findFile(this.dataList.fileMngId);
if (fileInfo) {
this.imgUrl = "http://165.229.169.113:9080/" + fileInfo.fileRpath;
console.log(this.imgUrl);
} else {
console.warn("No file found for the given fileMngId.");
}
} catch (error) {
console.log("problem - error : ", error);
}
},
shuffleString(string) {
const array = string.split("");
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array.join("");
},
async findFile(file_mng_id) {
try {
const res = await axios.post(
"/file/find.json",
{
file_mng_id: file_mng_id,
},
{
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
}
);
return res.data.list[0];
} catch (error) {
console.log("result - error : ", error);
return null;
}
},
nextProblem() {
const problemData = {
prblmImfo: this.currentLearningId,
prblmNumber: this.currentProblemIndex,
prblmAns: this.selectedButton,
};
this.$store.dispatch("saveProblemData", problemData);
if (
this.currentProblemIndex <
this.$store.state.currentLearningIds.length - 1
) {
this.$store.dispatch("goToNextProblem");
this.handleProblemDetail(this.currentLearningId);
this.goToPage(this.problemType);
} else {
// 마지막 문제면 이동
// this.goToPage("Chapter4");
alert("문제 학습 완료");
this.complete();
}
},
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";
}
},
},
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);
// Fetch or process the current problem based on `currentLearningId`
},
mounted() {
this.getProblem();
if (this.currentProblemIndex == 0) {
this.hiddenState = true;
}
},
};
</script>
<style scoped>
.dropContainer {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
gap: 10px;
}
.dropGroup button {
position: relative;
}
.dropGroup button p {
font-size: 48px;
}
.dragGroup button p {
font-size: 48px;
}
.dropGroup span {
margin: 0px 10px;
}
.dropSlot {
position: relative;
width: 64px;
height: 64px;
}
.dropSlot-inner {
position: relative;
width: 100%;
height: 100%;
}
.dropped-char {
font-family: "ONEMobilePOPOTF";
position: absolute;
top: 55%;
left: 55%;
transform: translate(-50%, -50%);
font-size: 48px;
font-weight: bold;
color: black;
pointer-events: none;
}
.dragGroup button p {
font-size: 48px;
}
.exampleImg {
width: 15%;
}
#sourceContainer {
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
}
.completeBtn {
margin-right: 100px;
background-color: #ffba08;
padding: 10px 30px;
border-radius: 10px;
font-size: 28px;
font-family: "ONEMobilePOPOTF";
}
</style>