jichoi / lms_front star
dajeong 2024-08-20
240820 정다정 중간/최종 평가 제출하기 버튼 추가
@04e497f72b37cc3de89fffbe156d7dd0512ecf20
client/views/pages/main/Chapter/Chapter3_10.vue
--- client/views/pages/main/Chapter/Chapter3_10.vue
+++ client/views/pages/main/Chapter/Chapter3_10.vue
@@ -2,7 +2,7 @@
   <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>
+        <div class="logo mb25"><img src="../../../../resources/img/logo2.png" alt="" /></div>
       </router-link>
     </div>
     <div class="title-box mb25 flex align-center mt40">
@@ -10,12 +10,14 @@
       <span class="subtitle">my name is dd</span>
     </div>
     <div class="flex justify-between align-center">
-      <div class="pre-btn" @click="goToPage('Chapter3_9')"><img src="../../../../resources/img/left.png" alt=""></div>
+      <div class="pre-btn" @click="goToPage('Chapter3_9')"><img src="../../../../resources/img/left.png" alt="" /></div>
       <div class="content title-box">
         <p class="title mt25 title-bg">step3.</p>
         <div class="flex align-center mb30">
           <p class="subtitle2 mr20">듣고 알맞은 것을 고르세요.</p>
-          <button><img src="../../../../resources/img/btn10_s.png" alt="">
+          <button @click="playAudio">
+            <img src="../../../../resources/img/btn10_s.png" alt="" />
+            <audio id="audio-player" src="client/resources/audio/bank.wav" preload="auto"></audio>
           </button>
         </div>
 
@@ -31,19 +33,17 @@
               </div>
             </div>
           </div>
-          <div class="imgGroup  mt20">
-            <img src="../../../../resources/img/img116_59s.png" alt="">
-            <p class="title1 mt10" style="width: auto;"><strong>진수가 거절한 제안</strong>은 무엇인지 우리말로 쓰세요.</p>
-            <div class=" mt20">
-              <input class="yellow-bd" type="text" name="" id="" placeholder="답을 입력하세요.">
-
+          <div class="imgGroup mt20">
+            <img src="../../../../resources/img/img116_59s.png" alt="" />
+            <p class="title1 mt10" style="width: auto"><strong>진수가 거절한 제안</strong>은 무엇인지 우리말로 쓰세요.</p>
+            <div class="mt20">
+              <input class="yellow-bd" v-model="answer" type="text" placeholder="답을 입력하세요." />
             </div>
           </div>
-
         </div>
+        <button class="submit-button" @click="handleSubmit()">제출하기</button>
       </div>
-      <div class="next-btn" @click="goToPage('Chapter3_11')"><img src="../../../../resources/img/right.png" alt="">
-      </div>
+      <div class="next-btn" @click="goToPage('Chapter3_11')"><img src="../../../../resources/img/right.png" alt="" /></div>
     </div>
   </div>
 </template>
@@ -52,40 +52,13 @@
 export default {
   data() {
     return {
-      timer: '00',
-      showButton1: false,
-      showButton2: false,
-      showButton3: false,
-      showButton4: false,
-    }
+      timer: "00",
+      answer: null,
+    };
   },
   methods: {
     goToPage(page) {
       this.$router.push({ name: page });
-    },
-    handleDrag(dragNumber) {
-      // Drag 버튼 숨기기
-      // 여기서는 상태 관리를 통해 버튼을 제어합니다.
-      if (dragNumber === 1) {
-        this.showButton1 = false;
-      } else if (dragNumber === 2) {
-        this.showButton2 = false;
-      } else if (dragNumber === 3) {
-        this.showButton3 = false;
-      }
-    },
-    showButton(dropNumber) {
-      // Drop 영역의 이미지 클릭 이벤트 핸들러 설정
-      // 여기서는 상태 관리를 통해 버튼을 보이게 합니다.
-      if (dropNumber === 1) {
-        this.showButton1 = true;
-      } else if (dropNumber === 2) {
-        this.showButton2 = true;
-      } else if (dropNumber === 3) {
-        this.showButton3 = true;
-      } else if (dropNumber === 4) {
-        this.showButton4 = true;
-      }
     },
     startTimer() {
       if (this.intervalId) {
@@ -99,20 +72,22 @@
           clearInterval(this.intervalId);
         }
       }, 1000);
-    }
+    },
+    playAudio() {
+      const audio = document.getElementById("audio-player");
+      audio.play();
+      console.log("playing");
+    },
+    handleSubmit() {
+      console.log("정답 : ", this.answer);
+      this.answer = null;
+    },
   },
-  watch: {
-
-  },
-  computed: {
-
-  },
-  components: {
-  },
-  mounted() {
-
-  }
-}
+  watch: {},
+  computed: {},
+  components: {},
+  mounted() {},
+};
 </script>
 <style scoped>
 input.yellow-bd {
@@ -128,7 +103,7 @@
 }
 
 .dragGroup {
-  background-color: #F2F4F8;
+  background-color: #f2f4f8;
   padding: 30px 50px;
   width: max-content;
   border-radius: 20px;
@@ -136,4 +111,16 @@
 
 .dragGroup button p {
   font-size: 48px;
-}</style>
(No newline at end of file)
+}
+
+.submit-button {
+  position: absolute;
+  background-color: #ffba08;
+  padding: 10px 30px;
+  border-radius: 10px;
+  font-size: 28px;
+  font-family: "ONEMobilePOPOTF";
+  right: 5rem;
+  bottom: 3rem;
+}
+</style>
client/views/pages/main/Chapter/Chapter3_11.vue
--- client/views/pages/main/Chapter/Chapter3_11.vue
+++ client/views/pages/main/Chapter/Chapter3_11.vue
@@ -2,7 +2,7 @@
   <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>
+        <div class="logo mb25"><img src="../../../../resources/img/logo2.png" alt="" /></div>
       </router-link>
     </div>
     <div class="title-box mb25 flex align-center mt40">
@@ -10,7 +10,7 @@
       <span class="subtitle">my name is dd</span>
     </div>
     <div class="flex justify-between align-center">
-      <div class="pre-btn" @click="goToPage('Chapter3_10')"><img src="../../../../resources/img/left.png" alt=""></div>
+      <div class="pre-btn" @click="goToPage('Chapter3_10')"><img src="../../../../resources/img/left.png" alt="" /></div>
       <div class="content title-box">
         <p class="title mt25 title-bg">step3.</p>
         <div class="flex align-center mb30">
@@ -31,20 +31,19 @@
               </div>
             </div>
           </div>
-          <div class="imgGroup  mt20">
-            <img src="../../../../resources/img/img115_58s.png" alt="">
+          <div class="imgGroup mt20">
+            <img src="../../../../resources/img/img115_58s.png" alt="" />
             <!-- <p class="title1 mt10"><strong>진수가 거절한 제안</strong>은 무엇인지 우리말로 쓰세요.</p> -->
-            <div class=" mt50 flex justify-center" style="gap: 50px;">
-              <input class="yellow-bd" type="text" name="" id="">
+            <div class="mt50 flex justify-center" style="gap: 50px">
+              <input class="yellow-bd" type="text" v-model="answer1" />
               <p class="title3">e</p>
-              <input class="yellow-bd" type="text" name="" id="">
+              <input class="yellow-bd" type="text" v-model="answer2" />
             </div>
           </div>
-
         </div>
+        <button class="submit-button" @click="handleSubmit()">제출하기</button>
       </div>
-      <div class="next-btn" @click="goToPage('Chapter3_12')"><img src="../../../../resources/img/right.png" alt="">
-      </div>
+      <div class="next-btn" @click="goToPage('Chapter3_12')"><img src="../../../../resources/img/right.png" alt="" /></div>
     </div>
   </div>
 </template>
@@ -53,40 +52,15 @@
 export default {
   data() {
     return {
-      timer: '00',
-      showButton1: false,
-      showButton2: false,
-      showButton3: false,
-      showButton4: false,
-    }
+      timer: "00",
+      answer1: null,
+      answer2: null,
+      text: "e",
+    };
   },
   methods: {
     goToPage(page) {
       this.$router.push({ name: page });
-    },
-    handleDrag(dragNumber) {
-      // Drag 버튼 숨기기
-      // 여기서는 상태 관리를 통해 버튼을 제어합니다.
-      if (dragNumber === 1) {
-        this.showButton1 = false;
-      } else if (dragNumber === 2) {
-        this.showButton2 = false;
-      } else if (dragNumber === 3) {
-        this.showButton3 = false;
-      }
-    },
-    showButton(dropNumber) {
-      // Drop 영역의 이미지 클릭 이벤트 핸들러 설정
-      // 여기서는 상태 관리를 통해 버튼을 보이게 합니다.
-      if (dropNumber === 1) {
-        this.showButton1 = true;
-      } else if (dropNumber === 2) {
-        this.showButton2 = true;
-      } else if (dropNumber === 3) {
-        this.showButton3 = true;
-      } else if (dropNumber === 4) {
-        this.showButton4 = true;
-      }
     },
     startTimer() {
       if (this.intervalId) {
@@ -100,20 +74,19 @@
           clearInterval(this.intervalId);
         }
       }, 1000);
-    }
+    },
+    handleSubmit() {
+      let answer = this.answer1 + this.text + this.answer2;
+      console.log("정답 : ", answer);
+      this.answer1 = null;
+      this.answer2 = null;
+    },
   },
-  watch: {
-
-  },
-  computed: {
-
-  },
-  components: {
-  },
-  mounted() {
-
-  }
-}
+  watch: {},
+  computed: {},
+  components: {},
+  mounted() {},
+};
 </script>
 <style scoped>
 input.yellow-bd {
@@ -129,7 +102,7 @@
 }
 
 .dragGroup {
-  background-color: #F2F4F8;
+  background-color: #f2f4f8;
   padding: 30px 50px;
   width: max-content;
   border-radius: 20px;
@@ -138,4 +111,15 @@
 .dragGroup button p {
   font-size: 48px;
 }
-</style>
(No newline at end of file)
+
+.submit-button {
+  position: absolute;
+  background-color: #ffba08;
+  padding: 10px 30px;
+  border-radius: 10px;
+  font-size: 28px;
+  font-family: "ONEMobilePOPOTF";
+  right: 5rem;
+  bottom: 3rem;
+}
+</style>
client/views/pages/main/Chapter/Chapter3_12.vue
--- client/views/pages/main/Chapter/Chapter3_12.vue
+++ client/views/pages/main/Chapter/Chapter3_12.vue
@@ -2,7 +2,7 @@
   <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>
+        <div class="logo mb25"><img src="../../../../resources/img/logo2.png" alt="" /></div>
       </router-link>
     </div>
     <div class="title-box mb25 flex align-center mt40">
@@ -10,67 +10,51 @@
       <span class="subtitle">my name is dd</span>
     </div>
     <div class="flex justify-between align-center">
-      <div class="pre-btn" @click="goToPage('Chapter3_11')"><img src="../../../../resources/img/left.png" alt=""></div>
+      <div class="pre-btn" @click="goToPage('Chapter3_11')"><img src="../../../../resources/img/left.png" alt="" /></div>
       <div class="content title-box">
         <p class="title mt25 title-bg">step3</p>
         <div class="flex align-center mb30">
-               <p class="subtitle2 mr20">그림을 보고 빈칸을 채우세요.</p>
-               <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
+          <p class="subtitle2 mr20">단어를 바르게 배열해 문장을 완성하세요</p>
+          <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
                </button> -->
-            </div>
+        </div>
 
-        <div class=" text-ct">
+        <div class="text-ct">
           <div class="time-hint">
-          <button class="hint-btn">HINT</button>
+            <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 class="time">
+                  <p class="second">{{ timer }}</p>
+                  <p class="text">sec</p>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="dragGroup mt40">
+            <div class="flex justify-center" style="gap: 20px">
+              <div class="dropContainer" id="sourceContainer">
+                <button v-for="(word, index) in question" :key="index" draggable="true" @dragstart="onDragStart($event, word, index)">
+                  <p>{{ word }}</p>
+                </button>
+              </div>
+            </div>
+          </div>
+          <div class="dropContainer flex align-center justify-center mt30" id="targetContainer">
+            <div class="dropSlot" v-for="(slot, index) in questionLength" :key="index" @dragover.prevent @drop="onDrop($event, index)">
+              <div class="dropSlot-inner" draggable="true" @dragstart="onDragStart($event, userAnswer[index], index)">
+                <div class="dropSlot-inner">
+                  <div v-if="userAnswer[index]" class="dropped-char">
+                    {{ userAnswer[index] }}
                   </div>
                 </div>
               </div>
-         </div>
-          <div class="dragGroup mt40">
-            <div class="flex justify-center" style="gap: 20px;">
-              <button><img src="../../../../resources/img/img63_37s.png" alt="">
-                <p @click="handleDrag(1)">A</p>
-              </button>
-              <button><img src="../../../../resources/img/img63_37s_1.png" alt="">
-                <p @click="handleDrag(1)">A</p>
-              </button>
-              <button><img src="../../../../resources/img/img63_37s.png" alt="">
-                <p @click="handleDrag(1)">A</p>
-              </button>
-              <button><img src="../../../../resources/img/img63_37s_2.png" alt="">
-                <p @click="handleDrag(1)">A</p>
-              </button>
-              <button><img src="../../../../resources/img/img63_37s_1.png" alt="">
-                <p @click="handleDrag(1)">A</p>
-              </button>
-              <button><img src="../../../../resources/img/img63_37s_2.png" alt="">
-                <p @click="handleDrag(1)">A</p>
-              </button>
             </div>
-
           </div>
-          <div class="dropGroup flex align-center justify-center mt30">
-            <div class="flex" style="gap: 20px;">
-              <div class="bd-bt textbox" @click="showButton(1)">
-                <p v-if="showButton1">A</p></div>
-              <div class="bd-bt textbox" @click="showButton(2)">
-                <p v-if="showButton2">A</p></div>
-              <div class="bd-bt textbox" @click="showButton(3)">
-                <p v-if="showButton3">A</p></div>
-              <div class="bd-bt textbox" @click="showButton(4)">
-                <p v-if="showButton4">A</p></div>
-            </div>
-
-          </div>
-
         </div>
+        <button class="submit-button" @click="handleSubmit()">제출하기</button>
       </div>
-      <div class="next-btn" @click="goToPage('Chapter3_13')"><img src="../../../../resources/img/right.png" alt=""></div>
+      <div class="next-btn" @click="goToPage('Chapter3_13')"><img src="../../../../resources/img/right.png" alt="" /></div>
     </div>
   </div>
 </template>
@@ -79,40 +63,19 @@
 export default {
   data() {
     return {
-      timer: '00',
-      showButton1: false,
-      showButton2: false,
-      showButton3: false,
-      showButton4: false,
-    }
+      timer: "00",
+      question: [`don't`, "banana", "i", "like"],
+      questionLength: null,
+      answer: null,
+
+      userAnswer: [], // 초기화 시 빈 배열로 설정
+      draggedChar: null, // 드래그한 문자를 임시로 저장
+      draggedCharIndex: null, // 드래그한 문자의 인덱스 저장
+    };
   },
   methods: {
     goToPage(page) {
       this.$router.push({ name: page });
-    },
-    handleDrag(dragNumber) {
-      // Drag 버튼 숨기기
-      // 여기서는 상태 관리를 통해 버튼을 제어합니다.
-      if (dragNumber === 1) {
-        this.showButton1 = false;
-      } else if (dragNumber === 2) {
-        this.showButton2 = false;
-      } else if (dragNumber === 3) {
-        this.showButton3 = false;
-      }
-    },
-    showButton(dropNumber) {
-      // Drop 영역의 이미지 클릭 이벤트 핸들러 설정
-      // 여기서는 상태 관리를 통해 버튼을 보이게 합니다.
-      if (dropNumber === 1) {
-        this.showButton1 = true;
-      } else if (dropNumber === 2) {
-        this.showButton2 = true;
-      } else if (dropNumber === 3) {
-        this.showButton3 = true;
-      } else if (dropNumber === 4) {
-        this.showButton4 = true;
-      }
     },
     startTimer() {
       if (this.intervalId) {
@@ -126,24 +89,48 @@
           clearInterval(this.intervalId);
         }
       }, 1000);
-    }
+    },
+    initializeAnswer() {
+      this.questionLength = this.question.length;
+      this.userAnswer = new Array(this.questionLength).fill(null); // userAnswer 배열을 question 길이만큼 초기화
+    },
+    // 드래그 시작 시 호출
+    onDragStart(event, char, index) {
+      this.draggedChar = char;
+      this.draggedCharIndex = index;
+    },
+    // 드롭 시 호출
+    onDrop(event, index) {
+      if (!this.userAnswer[index]) {
+        // 해당 슬롯이 비어있는 경우에만 드롭
+        this.userAnswer.splice(index, 1, this.draggedChar); // userAnswer에 드래그한 문자 추가
+        this.draggedChar = null;
+        this.draggedCharIndex = null;
+      }
+    },
+    handleSubmit() {
+      // 정답을 체크하거나 제출 시 로직 처리
+      let answer = this.userAnswer.join(" ");
+      console.log("정답 : ", answer);
+    },
   },
-  watch: {
-
-  },
-  computed: {
-
-  },
-  components: {
-  },
+  watch: {},
+  computed: {},
+  components: {},
   mounted() {
-
-  }
-}
+    this.initializeAnswer();
+  },
+};
 </script>
 <style scoped>
-.textbox {height: 60px;}
-.textbox p{font-size: 28px; font-weight: bold;     line-height: 65px;}
+.textbox {
+  height: 60px;
+}
+.textbox p {
+  font-size: 28px;
+  font-weight: bold;
+  line-height: 65px;
+}
 .dropGroup button {
   position: relative;
 }
@@ -155,4 +142,42 @@
 .dragGroup button p {
   font-size: 48px;
 }
-</style>
(No newline at end of file)
+
+#sourceContainer {
+  margin-top: 100px;
+  display: flex;
+  flex-direction: row;
+  gap: 230px;
+}
+
+#targetContainer {
+  margin-top: 15rem;
+  height: 100px;
+  display: flex;
+  flex-direction: row;
+  gap: 80px;
+}
+
+#targetContainer .dropSlot {
+  width: 250px;
+  height: 70px;
+  padding: 10px;
+  border-bottom: 8px solid #ffba08;
+}
+
+#targetContainer .dropSlot .dropped-char {
+  font-size: 48px;
+  font-family: "ONEMobilePOPOTF";
+}
+
+.submit-button {
+  position: absolute;
+  background-color: #ffba08;
+  padding: 10px 30px;
+  border-radius: 10px;
+  font-size: 28px;
+  font-family: "ONEMobilePOPOTF";
+  right: 5rem;
+  bottom: 3rem;
+}
+</style>
client/views/pages/main/Chapter/Chapter3_13.vue
--- client/views/pages/main/Chapter/Chapter3_13.vue
+++ client/views/pages/main/Chapter/Chapter3_13.vue
@@ -2,7 +2,7 @@
   <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>
+        <div class="logo mb25"><img src="../../../../resources/img/logo2.png" alt="" /></div>
       </router-link>
     </div>
     <div class="title-box mb25 flex align-center mt40">
@@ -10,90 +10,57 @@
       <span class="subtitle">my name is dd</span>
     </div>
     <div class="flex justify-between align-center">
-      <div class="pre-btn" @click="goToPage('Chapter3_12')"><img src="../../../../resources/img/left.png" alt=""></div>
+      <div class="pre-btn" @click="goToPage('Chapter3_12')"><img src="../../../../resources/img/left.png" alt="" /></div>
       <div class="content title-box">
         <p class="title mt25 title-bg">step3</p>
         <div class="flex align-center mb30">
-               <p class="subtitle2 mr20">그림과 일치하는 올바른 단어를 연결하세요.</p>
-               <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
+          <p class="subtitle2 mr20">그림과 일치하는 올바른 단어를 연결하세요.</p>
+          <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
                </button> -->
-            </div>
+        </div>
 
         <div class="text-ct">
           <div class="time-hint">
-          <button class="hint-btn">HINT</button>
+            <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 class="time">
+                  <p class="second">{{ timer }}</p>
+                  <p class="text">sec</p>
                 </div>
               </div>
-         </div>
-         <div class="flex justify-center ">
-           <div class=" flex justify-between align-center" style="width: 50%;">
+            </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;">
-                    <img src="../../../../resources/img/img121_62s.png" alt="">
-                    <div >
-                      <button class="blue-c">
-                      </button>
-                    </div>
-                  </article>
-                  <article  class="flex align-center justify-between mb20" style="gap: 60px;">
-                    <img src="../../../../resources/img/img122_62s.png" alt="">
-                    <div >
-                      <button class="blue-c">
-                      </button>
-                    </div>
-                  </article>
-                  <article  class="flex align-center justify-between mb20" style="gap: 60px;">
-                    <img src="../../../../resources/img/img123_62s.png" alt="">
-                    <div class="flex">
-                      <button class="blue-c">
-                      </button>
+                  <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">
-                <div>
-                  <article  class="flex align-center justify-between mb20" style="gap: 60px;">
-                    <div class="flex">
-                      <button class="blue-c">
-                      </button>
-                    </div>
-                    <img src="../../../../resources/img/img121_62s.png" alt="">
-                    
-                  </article>
-                  <article  class="flex align-center justify-between mb20" style="gap: 60px;">
-                    <div class="flex">
-                      <button class="blue-c">
-                      </button>
-                    </div>
-                    <img src="../../../../resources/img/img122_62s.png" alt="">
-                    
-                  </article>
-                  <article  class="flex align-center justify-between mb20" style="gap: 60px;">
-                    <div class="flex">
-                      <button class="blue-c">
-                      </button>
-                    </div>
-                    <img src="../../../../resources/img/img123_62s.png" alt="">
-                    
-                  </article>
-                </div>
-    
-              </div>
-           </div>
-         </div>
 
+              <div class="pickGroup right">
+                <article v-for="(word, index) in question" :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 }}</p>
+                </article>
+              </div>
+            </div>
+          </div>
         </div>
+        <button class="submit-button" @click="handleSubmit()">제출하기</button>
       </div>
-      <div class="next-btn" @click="goToPage('Chapter3_14')"><img src="../../../../resources/img/right.png" alt=""></div>
+      <div class="next-btn" @click="goToPage('Chapter3_14')"><img src="../../../../resources/img/right.png" alt="" /></div>
     </div>
   </div>
 </template>
@@ -102,40 +69,24 @@
 export default {
   data() {
     return {
-      timer: '00',
-      showButton1: false,
-      showButton2: false,
-      showButton3: false,
-      showButton4: false,
-    }
+      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의 높이
+    };
   },
   methods: {
     goToPage(page) {
       this.$router.push({ name: page });
-    },
-    handleDrag(dragNumber) {
-      // Drag 버튼 숨기기
-      // 여기서는 상태 관리를 통해 버튼을 제어합니다.
-      if (dragNumber === 1) {
-        this.showButton1 = false;
-      } else if (dragNumber === 2) {
-        this.showButton2 = false;
-      } else if (dragNumber === 3) {
-        this.showButton3 = false;
-      }
-    },
-    showButton(dropNumber) {
-      // Drop 영역의 이미지 클릭 이벤트 핸들러 설정
-      // 여기서는 상태 관리를 통해 버튼을 보이게 합니다.
-      if (dropNumber === 1) {
-        this.showButton1 = true;
-      } else if (dropNumber === 2) {
-        this.showButton2 = true;
-      } else if (dropNumber === 3) {
-        this.showButton3 = true;
-      } else if (dropNumber === 4) {
-        this.showButton4 = true;
-      }
     },
     startTimer() {
       if (this.intervalId) {
@@ -149,33 +100,122 @@
           clearInterval(this.intervalId);
         }
       }, 1000);
-    }
-  },
-  watch: {
+    },
 
-  },
-  computed: {
+    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() {
+      // 매칭된 결과를 확인하거나 제출 시 로직 처리
+      console.log("Matched pairs: ", this.pairs);
+    },
+    updateSVGSize() {
+      const container = document.querySelector(".position-relative");
+      if (container) {
+        this.svgWidth = `${container.clientWidth}px`;
+        this.svgHeight = `${container.clientHeight}px`;
+      }
+    },
   },
-  components: {
-  },
+  watch: {},
+  computed: {},
+  components: {},
   mounted() {
-
-  }
-}
+    // SVG의 크기를 동적으로 설정
+    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;}
+.textbox {
+  height: 60px;
+}
+.textbox p {
+  font-size: 28px;
+  font-weight: bold;
+  line-height: 65px;
+}
 .dropGroup button {
   position: relative;
 }
 
-.dropGroup button p {
+.pickGroup {
+  display: flex;
+  flex-direction: column;
+  gap: 60px;
+}
+
+.pickGroup .word {
   font-size: 48px;
+  font-family: "ONEMobilePOPOTF";
 }
 
 .dragGroup button p {
   font-size: 48px;
 }
-</style>
(No newline at end of file)
+
+.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;
+}
+
+.blue-c {
+  width: 20px;
+  height: 20px;
+  background-color: blue;
+  border-radius: 50%;
+  border: none;
+  cursor: pointer;
+}
+</style>
client/views/pages/main/Chapter/Chapter3_14.vue
--- client/views/pages/main/Chapter/Chapter3_14.vue
+++ client/views/pages/main/Chapter/Chapter3_14.vue
@@ -2,7 +2,7 @@
   <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>
+        <div class="logo mb25"><img src="../../../../resources/img/logo2.png" alt="" /></div>
       </router-link>
     </div>
     <div class="title-box mb25 flex align-center mt40">
@@ -10,46 +10,38 @@
       <span class="subtitle">my name is dd</span>
     </div>
     <div class="flex justify-between align-center">
-      <div class="pre-btn" @click="goToPage('Chapter3_13')"><img src="../../../../resources/img/left.png" alt=""></div>
+      <div class="pre-btn" @click="goToPage('Chapter3_13')"><img src="../../../../resources/img/left.png" alt="" /></div>
       <div class="content title-box">
         <p class="title mt25 title-bg">step3</p>
         <div class="flex align-center mb30">
-               <p class="subtitle2 mr20">그림에 알맞는 낱말을 쓰세요.</p>
-               <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
+          <p class="subtitle2 mr20">그림에 알맞는 낱말을 쓰세요.</p>
+          <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
                </button> -->
-            </div>
+        </div>
 
         <div class="text-ct">
           <div class="time-hint">
-          <button class="hint-btn">HINT</button>
+            <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 class="time">
+                  <p class="second">{{ timer }}</p>
+                  <p class="text">sec</p>
                 </div>
               </div>
-         </div>
-          <div class="imgGroup"><img src="../../../../resources/img/img124_63s.png" alt=""></div>
-          
-          <div class="dropGroup flex align-center justify-center mt30">
-            <div class="flex" style="gap: 20px;">
-              <div class="bd-bt textbox" @click="showButton(1)">
-                <p v-if="showButton1">A</p></div>
-              <div class="bd-bt textbox" @click="showButton(2)">
-                <p v-if="showButton2">A</p></div>
-              <div class="bd-bt textbox" @click="showButton(3)">
-                <p v-if="showButton3">A</p></div>
-              <div class="bd-bt textbox" @click="showButton(4)">
-                <p v-if="showButton4">A</p></div>
             </div>
-
           </div>
+          <div class="imgGroup"><img src="../../../../resources/img/img124_63s.png" alt="" /></div>
 
+          <div class="dropGroup flex align-center justify-center mt30">
+            <div class="mt50">
+              <input class="yellow-bd" v-model="answer" type="text" placeholder="답을 입력하세요." style="width: 50rem" />
+            </div>
+          </div>
         </div>
+        <button class="submit-button" @click="handleSubmit()">제출하기</button>
       </div>
-      <div class="next-btn" @click="goToPage('Chapter3_15')"><img src="../../../../resources/img/right.png" alt=""></div>
+      <div class="next-btn" @click="goToPage('Chapter3_15')"><img src="../../../../resources/img/right.png" alt="" /></div>
     </div>
   </div>
 </template>
@@ -58,40 +50,13 @@
 export default {
   data() {
     return {
-      timer: '00',
-      showButton1: false,
-      showButton2: false,
-      showButton3: false,
-      showButton4: false,
-    }
+      timer: "00",
+      answer: null,
+    };
   },
   methods: {
     goToPage(page) {
       this.$router.push({ name: page });
-    },
-    handleDrag(dragNumber) {
-      // Drag 버튼 숨기기
-      // 여기서는 상태 관리를 통해 버튼을 제어합니다.
-      if (dragNumber === 1) {
-        this.showButton1 = false;
-      } else if (dragNumber === 2) {
-        this.showButton2 = false;
-      } else if (dragNumber === 3) {
-        this.showButton3 = false;
-      }
-    },
-    showButton(dropNumber) {
-      // Drop 영역의 이미지 클릭 이벤트 핸들러 설정
-      // 여기서는 상태 관리를 통해 버튼을 보이게 합니다.
-      if (dropNumber === 1) {
-        this.showButton1 = true;
-      } else if (dropNumber === 2) {
-        this.showButton2 = true;
-      } else if (dropNumber === 3) {
-        this.showButton3 = true;
-      } else if (dropNumber === 4) {
-        this.showButton4 = true;
-      }
     },
     startTimer() {
       if (this.intervalId) {
@@ -105,24 +70,26 @@
           clearInterval(this.intervalId);
         }
       }, 1000);
-    }
+    },
+    handleSubmit() {
+      console.log("정답 : ", this.answer);
+    },
   },
-  watch: {
-
-  },
-  computed: {
-
-  },
-  components: {
-  },
-  mounted() {
-
-  }
-}
+  watch: {},
+  computed: {},
+  components: {},
+  mounted() {},
+};
 </script>
 <style scoped>
-.textbox {height: 60px;}
-.textbox p{font-size: 28px; font-weight: bold;     line-height: 65px;}
+.textbox {
+  height: 60px;
+}
+.textbox p {
+  font-size: 28px;
+  font-weight: bold;
+  line-height: 65px;
+}
 .dropGroup button {
   position: relative;
 }
@@ -134,4 +101,15 @@
 .dragGroup button p {
   font-size: 48px;
 }
-</style>
(No newline at end of file)
+
+.submit-button {
+  position: absolute;
+  background-color: #ffba08;
+  padding: 10px 30px;
+  border-radius: 10px;
+  font-size: 28px;
+  font-family: "ONEMobilePOPOTF";
+  right: 5rem;
+  bottom: 3rem;
+}
+</style>
client/views/pages/main/Chapter/Chapter3_15.vue
--- client/views/pages/main/Chapter/Chapter3_15.vue
+++ client/views/pages/main/Chapter/Chapter3_15.vue
@@ -2,7 +2,7 @@
   <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>
+        <div class="logo mb25"><img src="../../../../resources/img/logo2.png" alt="" /></div>
       </router-link>
     </div>
     <div class="title-box mb25 flex align-center mt40">
@@ -10,37 +10,36 @@
       <span class="subtitle">my name is dd</span>
     </div>
     <div class="flex justify-between align-center">
-      <div class="pre-btn" @click="goToPage('Chapter3_14')"><img src="../../../../resources/img/left.png" alt=""></div>
+      <div class="pre-btn" @click="goToPage('Chapter3_14')"><img src="../../../../resources/img/left.png" alt="" /></div>
       <div class="content title-box">
         <p class="title mt25 title-bg">step3</p>
         <div class="flex align-center mb30">
-               <p class="subtitle2 mr20">듣고 올바른 대답을 말해보세요!</p>
-               <button><img src="../../../../resources/img/btn10_s.png" alt="">
-               </button>
-            </div>
+          <p class="subtitle2 mr20">듣고 올바른 대답을 말해보세요!</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>
+            <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 class="time">
+                  <p class="second">{{ timer }}</p>
+                  <p class="text">sec</p>
                 </div>
               </div>
-         </div>
-          <div class="imgGroup"><img src="../../../../resources/img/img125_64s.png" alt=""></div>
-          
-          <div class="dropGroup flex align-center justify-center mt30">
-            <img src="../../../../resources/img/btn18_64s_normal.png" alt="">
-
+            </div>
           </div>
+          <div class="imgGroup"><img src="../../../../resources/img/img125_64s.png" alt="" /></div>
 
+          <div class="dropGroup flex align-center justify-center mt70">
+            <img src="../../../../resources/img/btn18_64s_normal.png" alt="" />
+          </div>
         </div>
+
+        <button class="submit-button" @click="handleSubmit()">제출하기</button>
       </div>
-      <div class="next-btn" @click="goToPage('Chapter4')"><img src="../../../../resources/img/right.png" alt=""></div>
+      <div class="next-btn" @click="goToPage('Chapter4')"><img src="../../../../resources/img/right.png" alt="" /></div>
     </div>
   </div>
 </template>
@@ -49,40 +48,12 @@
 export default {
   data() {
     return {
-      timer: '00',
-      showButton1: false,
-      showButton2: false,
-      showButton3: false,
-      showButton4: false,
-    }
+      timer: "00",
+    };
   },
   methods: {
     goToPage(page) {
       this.$router.push({ name: page });
-    },
-    handleDrag(dragNumber) {
-      // Drag 버튼 숨기기
-      // 여기서는 상태 관리를 통해 버튼을 제어합니다.
-      if (dragNumber === 1) {
-        this.showButton1 = false;
-      } else if (dragNumber === 2) {
-        this.showButton2 = false;
-      } else if (dragNumber === 3) {
-        this.showButton3 = false;
-      }
-    },
-    showButton(dropNumber) {
-      // Drop 영역의 이미지 클릭 이벤트 핸들러 설정
-      // 여기서는 상태 관리를 통해 버튼을 보이게 합니다.
-      if (dropNumber === 1) {
-        this.showButton1 = true;
-      } else if (dropNumber === 2) {
-        this.showButton2 = true;
-      } else if (dropNumber === 3) {
-        this.showButton3 = true;
-      } else if (dropNumber === 4) {
-        this.showButton4 = true;
-      }
     },
     startTimer() {
       if (this.intervalId) {
@@ -96,24 +67,23 @@
           clearInterval(this.intervalId);
         }
       }, 1000);
-    }
+    },
   },
-  watch: {
-
-  },
-  computed: {
-
-  },
-  components: {
-  },
-  mounted() {
-
-  }
-}
+  watch: {},
+  computed: {},
+  components: {},
+  mounted() {},
+};
 </script>
 <style scoped>
-.textbox {height: 60px;}
-.textbox p{font-size: 28px; font-weight: bold;     line-height: 65px;}
+.textbox {
+  height: 60px;
+}
+.textbox p {
+  font-size: 28px;
+  font-weight: bold;
+  line-height: 65px;
+}
 .dropGroup button {
   position: relative;
 }
@@ -125,4 +95,15 @@
 .dragGroup button p {
   font-size: 48px;
 }
-</style>
(No newline at end of file)
+
+.submit-button {
+  position: absolute;
+  background-color: #ffba08;
+  padding: 10px 30px;
+  border-radius: 10px;
+  font-size: 28px;
+  font-family: "ONEMobilePOPOTF";
+  right: 5rem;
+  bottom: 3rem;
+}
+</style>
client/views/pages/main/Chapter/Chapter3_7.vue
--- client/views/pages/main/Chapter/Chapter3_7.vue
+++ client/views/pages/main/Chapter/Chapter3_7.vue
@@ -1,271 +1,264 @@
 <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 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>
-        <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="goToPage('Chapter3_6')">
-                <img src="../../../../resources/img/left.png" alt="" />
-            </div>
-            <div class="content title-box">
-                <p class="title mt25 title-bg">step3.</p>
-                <div class="flex align-center mb30">
-                    <p class="subtitle2 mr20">O X 퀴즈</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="pickGroup flex align-center justify-between mt80"
-                        style="gap: 100px"
-                    >
-                        <p>Q. {{ dataList.prblmExpln }}</p>
-                        <div class="flex justify-center" style="gap: 60px">
-                            <article>
-                                <div class="flex align-center">
-                                    <button @click="handleCheck('O')" name="O">
-                                        <img
-                                            src="../../../../resources/img/img136_71s.png"
-                                            alt=""
-                                        />
-                                        <p :class="{ active: answer === 'O' }">
-                                            1
-                                        </p>
-                                    </button>
-                                    <img
-                                        src="../../../../resources/img/img111_56s.png"
-                                        alt=""
-                                    />
-                                </div>
-                            </article>
-                            <article>
-                                <div class="flex align-center">
-                                    <button @click="handleCheck('X')" name="X">
-                                        <img
-                                            src="../../../../resources/img/img136_71s.png"
-                                            alt=""
-                                        />
-                                        <p :class="{ active: answer === 'X' }">
-                                            2
-                                        </p>
-                                    </button>
-                                    <img
-                                        src="../../../../resources/img/img112_56s.png"
-                                        alt=""
-                                    />
-                                </div>
-                            </article>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div
-                class="next-btn"
-                @click="
-                    [
-                        goToPage('Chapter3_8'),
-                        // handleSubmitAnswer()
-                    ]
-                "
-            >
-                <img src="../../../../resources/img/right.png" alt="" />
-            </div>
-        </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="goToPage('Chapter3_6')">
+        <img src="../../../../resources/img/left.png" alt="" />
+      </div>
+      <div class="content title-box">
+        <p class="title mt25 title-bg">step3.</p>
+        <div class="flex align-center mb30">
+          <p class="subtitle2 mr20">O X 퀴즈</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="pickGroup flex align-center justify-between mt80" style="gap: 100px">
+            <p>Q. {{ dataList.prblmExpln }}</p>
+            <div class="flex justify-center" style="gap: 60px">
+              <article>
+                <div class="flex align-center">
+                  <button @click="handleCheck('O')" name="O">
+                    <img src="../../../../resources/img/img136_71s.png" alt="" />
+                    <p :class="{ active: answer === 'O' }">1</p>
+                  </button>
+                  <img src="../../../../resources/img/img111_56s.png" alt="" />
+                </div>
+              </article>
+              <article>
+                <div class="flex align-center">
+                  <button @click="handleCheck('X')" name="X">
+                    <img src="../../../../resources/img/img136_71s.png" alt="" />
+                    <p :class="{ active: answer === 'X' }">2</p>
+                  </button>
+                  <img src="../../../../resources/img/img112_56s.png" alt="" />
+                </div>
+              </article>
+            </div>
+          </div>
+        </div>
+        <button class="submit-button" @click="handleSubmit()">제출하기</button>
+      </div>
+      <div
+        class="next-btn"
+        @click="
+          [
+            goToPage('Chapter3_8'),
+            // handleSubmitAnswer()
+          ]
+        "
+      >
+        <img src="../../../../resources/img/right.png" alt="" />
+      </div>
+    </div>
+  </div>
 </template>
 
 <script>
 import axios from "axios";
 
 export default {
-    data() {
-        return {
-            timer: "00",
-            prblmId: "PROBLEM_000000000000003",
-            problemDetail: [],
-            dataList: [],
-            prblmExpln: null,
-            accessTime: null,
-            answer: null,
-            prblmLogAnsCnt: 0,
-        };
+  data() {
+    return {
+      timer: "00",
+      prblmId: "PROBLEM_000000000000003",
+      problemDetail: [],
+      dataList: [],
+      prblmExpln: null,
+      accessTime: null,
+      answer: null,
+      prblmLogAnsCnt: 0,
+    };
+  },
+  methods: {
+    goToPage(page) {
+      this.$router.push({ name: page });
     },
-    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);
-        },
-        problemSearch() {
-            const vm = this;
-            sessionStorage.setItem("prblmId", JSON.stringify(vm.prblmId));
-            // vm.prblmId = JSON.parse(sessionStorage.getItem("prblmId"));
-            axios({
-                url: "problem/problemInfo.json",
-                method: "post",
-                headers: {
-                    "Content-Type": "application/json; charset=UTF-8",
-                },
-                data: {
-                    prblmId: vm.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);
-                });
-        },
-
-        // 문제 풀이 전송
-        handleSubmitAnswer() {
-            const vm = this;
-            // const accessTime = new Date();
-            // const formattedTime =
-            //     this.formatToTimestampWithoutTimeZone(accessTime);
-            axios({
-                url: "problemLog/insertProblemLog.json",
-                method: "post",
-                headers: {
-                    "Content-Type": "application/json; charset=UTF-8",
-                },
-                data: {
-                    prblmAns: vm.answer,
-                    prblmLogAnsCnt: vm.prblmLogAnsCnt + 1,
-                    stdId: "2",
-                    // prblmStrtTm: formattedTime,
-                    prblmId: vm.prblmId,
-                },
-            })
-                .then(function (res) {
-                    console.log("answer submit - response : ", res.data);
-                })
-                .catch(function (error) {
-                    console.log("answer submit - error : ", error);
-                });
-        },
-
-        handleCheck(value) {
-            this.answer = value;
-            console.log(this.answer);
-        },
-
-        // 풀이 시작 시간
-        created() {
-            const now = new Date();
-            this.accessTime = this.formatToTimestampWithoutTimeZone(now);
-            console.log("Formatted timestamp: ", this.accessTime);
-        },
-        formatToTimestampWithoutTimeZone(date) {
-            const year = date.getFullYear();
-            const month = String(date.getMonth() + 1).padStart(2, "0");
-            const day = String(date.getDate()).padStart(2, "0");
-            const hours = String(date.getHours()).padStart(2, "0");
-            const minutes = String(date.getMinutes()).padStart(2, "0");
-            const seconds = String(date.getSeconds()).padStart(2, "0");
-
-            return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-        },
+    startTimer() {
+      if (this.intervalId) {
+        clearInterval(this.intervalId);
+      }
+      this.timer = 5;
+      this.intervalId = setInterval(() => {
+        if (this.timer > 0) {
+          this.timer--;
+        } else {
+          clearInterval(this.intervalId);
+        }
+      }, 1000);
     },
-    watch: {},
-    computed: {},
-    components: {},
-    mounted() {
-        this.problemSearch();
-        this.created();
+    problemSearch() {
+      const vm = this;
+      sessionStorage.setItem("prblmId", JSON.stringify(vm.prblmId));
+      // vm.prblmId = JSON.parse(sessionStorage.getItem("prblmId"));
+      axios({
+        url: "problem/problemInfo.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          prblmId: vm.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);
+        });
     },
-    beforeUnmount() {
-        sessionStorage.removeItem("previewNote");
+
+    // 문제 풀이 전송
+    handleSubmitAnswer() {
+      const vm = this;
+      // const accessTime = new Date();
+      // const formattedTime =
+      //     this.formatToTimestampWithoutTimeZone(accessTime);
+      axios({
+        url: "problemLog/insertProblemLog.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          prblmAns: vm.answer,
+          prblmLogAnsCnt: vm.prblmLogAnsCnt + 1,
+          stdId: "2",
+          // prblmStrtTm: formattedTime,
+          prblmId: vm.prblmId,
+        },
+      })
+        .then(function (res) {
+          console.log("answer submit - response : ", res.data);
+        })
+        .catch(function (error) {
+          console.log("answer submit - error : ", error);
+        });
     },
+
+    handleCheck(value) {
+      this.answer = value;
+      console.log(this.answer);
+    },
+
+    // 풀이 시작 시간
+    created() {
+      const now = new Date();
+      this.accessTime = this.formatToTimestampWithoutTimeZone(now);
+      console.log("Formatted timestamp: ", this.accessTime);
+    },
+    formatToTimestampWithoutTimeZone(date) {
+      const year = date.getFullYear();
+      const month = String(date.getMonth() + 1).padStart(2, "0");
+      const day = String(date.getDate()).padStart(2, "0");
+      const hours = String(date.getHours()).padStart(2, "0");
+      const minutes = String(date.getMinutes()).padStart(2, "0");
+      const seconds = String(date.getSeconds()).padStart(2, "0");
+
+      return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+    },
+    handleSubmit() {
+      console.log("정답 : ", this.answer);
+    },
+  },
+  watch: {},
+  computed: {},
+  components: {},
+  mounted() {
+    this.problemSearch();
+    this.created();
+  },
+  beforeUnmount() {
+    sessionStorage.removeItem("previewNote");
+  },
 };
 </script>
 <style scoped>
 .inputbox {
-    font-size: 38px;
-    font-family: "Pretendard-ExtraBold";
+  font-size: 38px;
+  font-family: "Pretendard-ExtraBold";
 }
 
 .imgGroup button {
-    position: relative;
+  position: relative;
 }
 
 .imgGroup button p,
 .textbox p {
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    transform: translate(-50%, -50%);
-    width: fit-content;
-    height: fit-content;
-    background: #ffffffb8;
-    border-radius: 5px;
-    padding: 10px;
-    font-size: 48px;
-    font-family: "ONEMobilePOP";
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  width: fit-content;
+  height: fit-content;
+  background: #ffffffb8;
+  border-radius: 5px;
+  padding: 10px;
+  font-size: 48px;
+  font-family: "ONEMobilePOP";
 }
 
 .pickGroup {
-    padding: 0px 80px;
+  padding: 0px 80px;
 }
 
 .pickGroup p {
-    font-size: 34px;
-    font-weight: bold;
+  font-size: 34px;
+  font-weight: bold;
 }
 
 .pickGroup button {
-    position: relative;
-    margin-right: 30px;
+  position: relative;
+  margin-right: 30px;
 }
 
 .pickGroup button p {
-    font-size: 34px;
-    color: #c6c6c6;
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    transform: translate(-50%, -50%);
+  font-size: 34px;
+  color: #c6c6c6;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
 }
 .pickGroup button p.active {
-    color: #000000;
+  color: #000000;
+}
+
+.submit-button {
+  position: absolute;
+  background-color: #ffba08;
+  padding: 10px 30px;
+  border-radius: 10px;
+  font-size: 28px;
+  font-family: "ONEMobilePOPOTF";
+  right: 5rem;
+  bottom: 3rem;
 }
 </style>
client/views/pages/main/Chapter/Chapter3_8.vue
--- client/views/pages/main/Chapter/Chapter3_8.vue
+++ client/views/pages/main/Chapter/Chapter3_8.vue
@@ -2,7 +2,7 @@
   <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>
+        <div class="logo mb25"><img src="../../../../resources/img/logo2.png" alt="" /></div>
       </router-link>
     </div>
     <div class="title-box mb25 flex align-center mt40">
@@ -10,11 +10,11 @@
       <span class="subtitle">my name is dd</span>
     </div>
     <div class="flex justify-between align-center">
-      <div class="pre-btn" @click="goToPage('Chapter3_7')"><img src="../../../../resources/img/left.png" alt=""></div>
+      <div class="pre-btn" @click="goToPage('Chapter3_7')"><img src="../../../../resources/img/left.png" alt="" /></div>
       <div class="content title-box">
         <p class="title mt25 title-bg">step3.</p>
         <div class="flex align-center mb30">
-          <p class="subtitle2 mr20">주어진 단어 중 인 것을 고르세요.</p>
+          <p class="subtitle2 mr20">그림을 보고 철자를 바르게 배열하세요.</p>
           <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
                </button> -->
         </div>
@@ -32,50 +32,41 @@
             </div>
           </div>
           <div class="imgGroup flex align-center justify-center mt50">
-            <img src="../../../../resources/img/img114_57s.png" alt="">
-            <input class="yellow-bd ml50" style="width: 30%;" type="text" name="" id="" placeholder="답을 입력하세요.">
-
-          </div>
-          <div class="flex justify-center mt40 ">
-            <div class="dragGroup flex " style="gap: 50px;">
-              <button><img src="../../../../resources/img/img63_37s.png" alt="">
-                <p @click="handleDrag(1)">A</p>
-              </button>
-              <button><img src="../../../../resources/img/img63_37s_1.png" alt="">
-                <p @click="handleDrag(1)">A</p>
-              </button>
-              <button><img src="../../../../resources/img/img63_37s.png" alt="">
-                <p @click="handleDrag(1)">A</p>
-              </button>
-              <button><img src="../../../../resources/img/img63_37s_2.png" alt="">
-                <p @click="handleDrag(1)">A</p>
-              </button>
-              <button><img src="../../../../resources/img/img63_37s_1.png" alt="">
-                <p @click="handleDrag(1)">A</p>
-              </button>
-              <button><img src="../../../../resources/img/img63_37s_2.png" alt="">
-                <p @click="handleDrag(1)">A</p>
-              </button>
+            <img src="../../../../resources/img/img114_57s.png" alt="" />
+            <div class="flex justify-center mt40">
+              <div class="dragGroup flex" style="gap: 50px">
+                <button v-for="(char, index) in word_shuffle" :key="index">
+                  <img :src="items_card[index % items_card.length]" alt="" />
+                  <p>{{ char }}</p>
+                </button>
+              </div>
             </div>
-
+            <input class="yellow-bd" v-model="answer" style="width: 45%" type="text" placeholder="답을 입력하세요." />
           </div>
         </div>
+        <button class="submit-button" @click="handleSubmit()">제출하기</button>
       </div>
-      <div class="next-btn" @click="goToPage('Chapter3_9')"><img src="../../../../resources/img/right.png" alt=""></div>
+      <div class="next-btn" @click="goToPage('Chapter3_9')"><img src="../../../../resources/img/right.png" alt="" /></div>
     </div>
   </div>
 </template>
-  
+
 <script>
 export default {
   data() {
     return {
-      timer: '00',
-      showButton1: false,
-      showButton2: false,
-      showButton3: false,
-      showButton4: false,
-    }
+      timer: "00",
+      items_card: [
+        "client/resources/img/img63_37s.png",
+        "client/resources/img/img63_37s_1.png",
+        "client/resources/img/img63_37s.png",
+        "client/resources/img/img63_37s_2.png",
+        "client/resources/img/img63_37s_1.png",
+        "client/resources/img/img63_37s_2.png",
+      ],
+      word_shuffle: "docul",
+      answer: null,
+    };
   },
   methods: {
     goToPage(page) {
@@ -117,22 +108,20 @@
           clearInterval(this.intervalId);
         }
       }, 1000);
-    }
+    },
+    handleSubmit() {
+      console.log("정답 : ", this.answer);
+      this.answer = null;
+    },
   },
-  watch: {
-
-  },
-  computed: {
-
-  },
-  components: {
-  },
-  mounted() {
-
-  }
-}
+  watch: {},
+  computed: {},
+  components: {},
+  mounted() {},
+};
 </script>
-<style scoped>.dropGroup button {
+<style scoped>
+.dropGroup button {
   position: relative;
 }
 
@@ -141,12 +130,29 @@
 }
 
 .dragGroup {
-  background-color: #F2F4F8;
-  padding: 30px 50px;
+  background-color: #f2f4f8;
+  padding: 10px 20px;
   width: max-content;
   border-radius: 20px;
 }
 
-.dragGroup button p {
+.dragGroup p {
   font-size: 48px;
-}</style>
(No newline at end of file)
+}
+
+.imgGroup {
+  flex-direction: column;
+  gap: 20px;
+}
+
+.submit-button {
+  position: absolute;
+  background-color: #ffba08;
+  padding: 10px 30px;
+  border-radius: 10px;
+  font-size: 28px;
+  font-family: "ONEMobilePOPOTF";
+  right: 5rem;
+  bottom: 3rem;
+}
+</style>
client/views/pages/main/Chapter/Chapter3_9.vue
--- client/views/pages/main/Chapter/Chapter3_9.vue
+++ client/views/pages/main/Chapter/Chapter3_9.vue
@@ -1,218 +1,223 @@
 <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 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>
-        <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="goToPage('Chapter3_8')">
-                <img src="../../../../resources/img/left.png" alt="" />
-            </div>
-            <div class="content title-box">
-                <p class="title mt25 title-bg">step3.</p>
-                <div class="flex align-center mb30">
-                    <p class="subtitle2 mr20">{{ dataList.prblmExpln }}</p>
-                    <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
+      </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="goToPage('Chapter3_8')">
+        <img src="../../../../resources/img/left.png" alt="" />
+      </div>
+      <div class="content title-box">
+        <p class="title mt25 title-bg">step3.</p>
+        <div class="flex align-center mb30">
+          <p class="subtitle2 mr20">{{ dataList.prblmExpln }}</p>
+          <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
                </button> -->
-                </div>
+        </div>
 
-                <div class="mt50 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="imgGroup mt50">
-                        <!-- <img
+        <div class="mt50 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="imgGroup mt50">
+            <!-- <img
                             src="../../../../resources/img/img115_58s.png"
                             alt=""
                         /> -->
-                        <div class="mt50">
-                            <input
-                                class="yellow-bd"
-                                type="text"
-                                name=""
-                                id=""
-                                placeholder="답을 입력하세요."
-                                v-model="answer"
-                                @change="submitAnswer"
-                            />
-                        </div>
-                    </div>
-                </div>
+            <div class="mt50">
+              <input class="yellow-bd" type="text" name="" id="" placeholder="답을 입력하세요." v-model="answer" @change="submitAnswer" />
             </div>
-            <div
-                class="next-btn"
-                @click="
-                    [
-                        goToPage('Chapter3_10'),
-                        // handleSubmitAnswer()
-                    ]
-                "
-            >
-                <img src="../../../../resources/img/right.png" alt="" />
-            </div>
+          </div>
         </div>
+        <!-- <button class="submit-button" @click="handleSubmitAnswer()">제출하기</button> -->
+        <button class="submit-button" @click="submitAnswer()">제출하기</button>
+      </div>
+      <div
+        class="next-btn"
+        @click="
+          [
+            goToPage('Chapter3_10'),
+            // handleSubmitAnswer()
+          ]
+        "
+      >
+        <img src="../../../../resources/img/right.png" alt="" />
+      </div>
     </div>
+  </div>
 </template>
 
 <script>
 import axios from "axios";
 export default {
-    data() {
-        return {
-            timer: "00",
-            showButton1: false,
-            showButton2: false,
-            showButton3: false,
-            showButton4: false,
+  data() {
+    return {
+      timer: "00",
+      showButton1: false,
+      showButton2: false,
+      showButton3: false,
+      showButton4: false,
 
-            problemDetail: [],
-            dataList: [],
-            prblmExpln: null,
-            prblmId: "1004",
-            answer: null,
-        };
+      problemDetail: [],
+      dataList: [],
+      prblmExpln: null,
+      prblmId: "1004",
+      answer: null,
+    };
+  },
+  methods: {
+    goToPage(page) {
+      this.$router.push({ name: page });
     },
-    methods: {
-        goToPage(page) {
-            this.$router.push({ name: page });
+    handleDrag(dragNumber) {
+      // Drag 버튼 숨기기
+      // 여기서는 상태 관리를 통해 버튼을 제어합니다.
+      if (dragNumber === 1) {
+        this.showButton1 = false;
+      } else if (dragNumber === 2) {
+        this.showButton2 = false;
+      } else if (dragNumber === 3) {
+        this.showButton3 = false;
+      }
+    },
+    showButton(dropNumber) {
+      // Drop 영역의 이미지 클릭 이벤트 핸들러 설정
+      // 여기서는 상태 관리를 통해 버튼을 보이게 합니다.
+      if (dropNumber === 1) {
+        this.showButton1 = true;
+      } else if (dropNumber === 2) {
+        this.showButton2 = true;
+      } else if (dropNumber === 3) {
+        this.showButton3 = true;
+      } else if (dropNumber === 4) {
+        this.showButton4 = true;
+      }
+    },
+    startTimer() {
+      if (this.intervalId) {
+        clearInterval(this.intervalId);
+      }
+      this.timer = 5;
+      this.intervalId = setInterval(() => {
+        if (this.timer > 0) {
+          this.timer--;
+        } else {
+          clearInterval(this.intervalId);
+        }
+      }, 1000);
+    },
+    problemSearch() {
+      const vm = this;
+      sessionStorage.setItem("prblmId", JSON.stringify(vm.prblmId));
+      // vm.prblmId = JSON.parse(sessionStorage.getItem("prblmId"));
+      axios({
+        url: "problem/problemInfo.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
         },
-        handleDrag(dragNumber) {
-            // Drag 버튼 숨기기
-            // 여기서는 상태 관리를 통해 버튼을 제어합니다.
-            if (dragNumber === 1) {
-                this.showButton1 = false;
-            } else if (dragNumber === 2) {
-                this.showButton2 = false;
-            } else if (dragNumber === 3) {
-                this.showButton3 = false;
-            }
+        data: {
+          prblmId: vm.prblmId,
         },
-        showButton(dropNumber) {
-            // Drop 영역의 이미지 클릭 이벤트 핸들러 설정
-            // 여기서는 상태 관리를 통해 버튼을 보이게 합니다.
-            if (dropNumber === 1) {
-                this.showButton1 = true;
-            } else if (dropNumber === 2) {
-                this.showButton2 = true;
-            } else if (dropNumber === 3) {
-                this.showButton3 = true;
-            } else if (dropNumber === 4) {
-                this.showButton4 = true;
-            }
-        },
-        startTimer() {
-            if (this.intervalId) {
-                clearInterval(this.intervalId);
-            }
-            this.timer = 5;
-            this.intervalId = setInterval(() => {
-                if (this.timer > 0) {
-                    this.timer--;
-                } else {
-                    clearInterval(this.intervalId);
-                }
-            }, 1000);
-        },
-        problemSearch() {
-            const vm = this;
-            sessionStorage.setItem("prblmId", JSON.stringify(vm.prblmId));
-            // vm.prblmId = JSON.parse(sessionStorage.getItem("prblmId"));
-            axios({
-                url: "problem/problemInfo.json",
-                method: "post",
-                headers: {
-                    "Content-Type": "application/json; charset=UTF-8",
-                },
-                data: {
-                    prblmId: vm.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);
-                });
-        },
+      })
+        .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);
+        });
+    },
 
-        submitAnswer() {
-            console.log(this.answer);
-        },
+    submitAnswer() {
+      console.log(this.answer);
+    },
 
-        // 문제 풀이 전송
-        handleSubmitAnswer() {
-            const vm = this;
-            // const accessTime = new Date();
-            // const formattedTime =
-            //     this.formatToTimestampWithoutTimeZone(accessTime);
-            axios({
-                url: "problemLog/insertProblemLog.json",
-                method: "post",
-                headers: {
-                    "Content-Type": "application/json; charset=UTF-8",
-                },
-                data: {
-                    prblmAns: vm.answer,
-                    prblmLogAnsCnt: 0,
-                    stdId: "2",
-                    // prblmStrtTm: formattedTime,
-                    prblmId: vm.prblmId,
-                },
-            })
-                .then(function (res) {
-                    console.log("answer submit - response : ", res.data);
-                })
-                .catch(function (error) {
-                    console.log("answer submit - error : ", error);
-                });
+    // 문제 풀이 전송
+    handleSubmitAnswer() {
+      const vm = this;
+      // const accessTime = new Date();
+      // const formattedTime =
+      //     this.formatToTimestampWithoutTimeZone(accessTime);
+      axios({
+        url: "problemLog/insertProblemLog.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
         },
+        data: {
+          prblmAns: vm.answer,
+          prblmLogAnsCnt: 0,
+          stdId: "2",
+          // prblmStrtTm: formattedTime,
+          prblmId: vm.prblmId,
+        },
+      })
+        .then(function (res) {
+          console.log("answer submit - response : ", res.data);
+        })
+        .catch(function (error) {
+          console.log("answer submit - error : ", error);
+        });
     },
-    watch: {},
-    computed: {},
-    components: {},
-    mounted() {
-        this.problemSearch();
-    },
+  },
+  watch: {},
+  computed: {},
+  components: {},
+  mounted() {
+    this.problemSearch();
+  },
 };
 </script>
 <style scoped>
 input.yellow-bd {
-    width: 30%;
+  width: 30%;
 }
 
 .dropGroup button {
-    position: relative;
+  position: relative;
 }
 
 .dropGroup button p {
-    font-size: 48px;
+  font-size: 48px;
 }
 
 .dragGroup {
-    background-color: #f2f4f8;
-    padding: 30px 50px;
-    width: max-content;
-    border-radius: 20px;
+  background-color: #f2f4f8;
+  padding: 30px 50px;
+  width: max-content;
+  border-radius: 20px;
 }
 
 .dragGroup button p {
-    font-size: 48px;
+  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;
 }
 </style>
Add a comment
List