jichoi / lms_front star
홍아랑 홍아랑 2024-08-16
240816 정다정 단어장 학습 종료 버튼 추가
@c575d0206c8b6658b6191da0b127c7631d6f7e7b
client/views/pages/main/Chapter/Chapter2.vue
--- client/views/pages/main/Chapter/Chapter2.vue
+++ client/views/pages/main/Chapter/Chapter2.vue
@@ -2,15 +2,25 @@
   <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">
-      <span class="title mr40">1. Hello WORLD</span>
-      <span class="subtitle">my name is dd</span>
+    <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" @click="goToPage('Chapter1_3')"><img src="../../../../resources/img/left.png" alt=""></div>
+      <div class="pre-btn" @click="goToPage('Chapter1_3')">
+        <img src="../../../../resources/img/left.png" alt="" />
+      </div>
       <div class="content title-box">
         <p class="title mt25 title-bg">STEP 2 - 단어로 공부하는 영어</p>
         <div class="flex align-center mb30">
@@ -21,13 +31,31 @@
           <div class="vocaGroup">
             <div class="flex justify-between mb80">
               <article class="flex align-center">
-                <div class="imgGroup mr30"><img src="../../../../resources/img/img2_1.png" data-num="1" style="width: 200px;
-"></div>
+                <div class="imgGroup mr30">
+                  <img
+                    src="../../../../resources/img/img2_1.png"
+                    data-num="1"
+                    style="width: 200px"
+                  />
+                </div>
                 <div class="flex align-start">
-                  <button class="listen-btn mr30" data-video="1" tabindex="0" aria-label="음성 재생">
-                    <img src="../../../../resources/img/btn10_s.png" data-num="1" @click="playAudio('audio-family')">
+                  <button
+                    class="listen-btn mr30"
+                    data-video="1"
+                    tabindex="0"
+                    aria-label="음성 재생"
+                  >
+                    <img
+                      src="../../../../resources/img/btn10_s.png"
+                      data-num="1"
+                      @click="playAudio('audio-family')"
+                    />
                   </button>
-                  <audio id="audio-family" src="client/resources/audio/family.wav" preload="auto"></audio>
+                  <audio
+                    id="audio-family"
+                    src="client/resources/audio/family.wav"
+                    preload="auto"
+                  ></audio>
                   <div>
                     <h3>family</h3>
                     <div class="flex align-center mt10">
@@ -38,13 +66,31 @@
                 </div>
               </article>
               <article class="flex align-center">
-                <div class="imgGroup mr30"><img src="../../../../resources/img/img2_4.png" data-num="1" style="width: 200px;
-"></div>
+                <div class="imgGroup mr30">
+                  <img
+                    src="../../../../resources/img/img2_4.png"
+                    data-num="1"
+                    style="width: 200px"
+                  />
+                </div>
                 <div class="flex align-start">
-                  <button class="listen-btn mr30" data-video="1" tabindex="0" aria-label="음성 재생">
-                    <img src="../../../../resources/img/btn10_s.png" data-num="1" @click="playAudio('audio-bank')">
+                  <button
+                    class="listen-btn mr30"
+                    data-video="1"
+                    tabindex="0"
+                    aria-label="음성 재생"
+                  >
+                    <img
+                      src="../../../../resources/img/btn10_s.png"
+                      data-num="1"
+                      @click="playAudio('audio-bank')"
+                    />
                   </button>
-                  <audio id="audio-bank" src="client/resources/audio/bank.wav" preload="auto"></audio>
+                  <audio
+                    id="audio-bank"
+                    src="client/resources/audio/bank.wav"
+                    preload="auto"
+                  ></audio>
                   <div>
                     <h3>bank</h3>
                     <div class="flex align-center mt10">
@@ -57,13 +103,31 @@
             </div>
             <div class="flex justify-between">
               <article class="flex align-center">
-                <div class="imgGroup mr30"><img src="../../../../resources/img/img2_2.png" data-num="1" style="width: 200px;
-"></div>
+                <div class="imgGroup mr30">
+                  <img
+                    src="../../../../resources/img/img2_2.png"
+                    data-num="1"
+                    style="width: 200px"
+                  />
+                </div>
                 <div class="flex align-start">
-                  <button class="listen-btn mr30" data-video="1" tabindex="0" aria-label="음성 재생">
-                    <img src="../../../../resources/img/btn10_s.png" data-num="1" @click="playAudio('audio-love')">
+                  <button
+                    class="listen-btn mr30"
+                    data-video="1"
+                    tabindex="0"
+                    aria-label="음성 재생"
+                  >
+                    <img
+                      src="../../../../resources/img/btn10_s.png"
+                      data-num="1"
+                      @click="playAudio('audio-love')"
+                    />
                   </button>
-                  <audio id="audio-love" src="client/resources/audio/love.wav" preload="auto"></audio>
+                  <audio
+                    id="audio-love"
+                    src="client/resources/audio/love.wav"
+                    preload="auto"
+                  ></audio>
                   <div>
                     <h3>love</h3>
                     <div class="flex align-center mt10">
@@ -74,13 +138,31 @@
                 </div>
               </article>
               <article class="flex align-center">
-                <div class="imgGroup mr30"><img src="../../../../resources/img/img2_3.png" data-num="1" style="width: 200px;
-"></div>
+                <div class="imgGroup mr30">
+                  <img
+                    src="../../../../resources/img/img2_3.png"
+                    data-num="1"
+                    style="width: 200px"
+                  />
+                </div>
                 <div class="flex align-start">
-                  <button class="listen-btn mr30" data-video="1" tabindex="0" aria-label="음성 재생">
-                    <img src="../../../../resources/img/btn10_s.png" data-num="1" @click="playAudio('audio-police')">
+                  <button
+                    class="listen-btn mr30"
+                    data-video="1"
+                    tabindex="0"
+                    aria-label="음성 재생"
+                  >
+                    <img
+                      src="../../../../resources/img/btn10_s.png"
+                      data-num="1"
+                      @click="playAudio('audio-police')"
+                    />
                   </button>
-                  <audio id="audio-police" src="client/resources/audio/police.wav" preload="auto"></audio>
+                  <audio
+                    id="audio-police"
+                    src="client/resources/audio/police.wav"
+                    preload="auto"
+                  ></audio>
                   <div>
                     <h3>police</h3>
                     <div class="flex align-center mt10">
@@ -94,7 +176,9 @@
           </div>
         </div>
       </div>
-      <div class="next-btn" @click="goToPage('Chapter2_3')"><img src="../../../../resources/img/right.png" alt=""></div>
+      <div class="next-btn" @click="goToPage('Chapter2_3')">
+        <img src="../../../../resources/img/right.png" alt="" />
+      </div>
     </div>
   </div>
 </template>
@@ -102,13 +186,16 @@
 <script>
 export default {
   data() {
-    return {
-    }
+    return {};
   },
   methods: {
+    complete() {
+      this.$router.push({ name: "Dashboard", query: { value: 2 } });
+    },
     goToPage(page) {
       this.$router.push({ name: page });
-    }, playAudio(audioId) {
+    },
+    playAudio(audioId) {
       const audio = document.getElementById(audioId);
       if (audio) {
         audio.play();
@@ -117,18 +204,11 @@
       }
     },
   },
-  watch: {
-
-  },
-  computed: {
-
-  },
-  components: {
-  },
-  mounted() {
-
-  }
-}
+  watch: {},
+  computed: {},
+  components: {},
+  mounted() {},
+};
 </script>
 <style scoped>
 .grid-container {
@@ -136,4 +216,12 @@
   grid-template-columns: repeat(2, 1fr);
   gap: 20px;
 }
-</style>
(No newline at end of file)
+.completeBtn {
+  margin-right: 100px;
+  background-color: #ffba08;
+  padding: 10px 30px;
+  border-radius: 10px;
+  font-size: 28px;
+  font-family: "ONEMobilePOPOTF";
+}
+</style>
client/views/pages/main/Chapter/Chapter2_2.vue
--- client/views/pages/main/Chapter/Chapter2_2.vue
+++ client/views/pages/main/Chapter/Chapter2_2.vue
@@ -1,142 +1,192 @@
 <template>
-   <div id="Chapter2_2" 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="Chapter2_2" 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"
+      style="justify-content: space-between"
+    >
+      <div>
+        <span class="title mr40">1. Hello WORLD</span>
+        <span class="subtitle">my name is dd</span>
       </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>
+      <button class="completeBtn" @click="complete">학습 종료</button>
+    </div>
+    <div class="flex justify-between align-center">
+      <div class="pre-btn" @click="goToPage('Chapter2_3')">
+        <img src="../../../../resources/img/left.png" alt="" />
       </div>
-      <div class="flex justify-between align-center">
-         <div class="pre-btn" @click="goToPage('Chapter2_3')"><img src="../../../../resources/img/left.png" alt="">
-         </div>
-         <div class="content title-box">
-            <p class="title mt25 title-bg">STEP 2 - 단어로 공부하는 영어</p>
-            <div class="flex align-center mb30" style="justify-content: space-between;margin-right: 9em;">
-               <p class="subtitle2 mr20">카드를 뒤집어 보세요.</p>
-               <div class="time-bg">
-                  <div>
-                     <div class="time">
-                        <p class="second">{{ timer }}</p>
-                        <p class="text">sec</p>
-                     </div>
-                  </div>
-               </div>
-               <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
+      <div class="content title-box">
+        <p class="title mt25 title-bg">STEP 2 - 단어로 공부하는 영어</p>
+        <div
+          class="flex align-center mb30"
+          style="justify-content: space-between; margin-right: 9em"
+        >
+          <p class="subtitle2 mr20">카드를 뒤집어 보세요.</p>
+          <div class="time-bg">
+            <div>
+              <div class="time">
+                <p class="second">{{ timer }}</p>
+                <p class="text">sec</p>
+              </div>
+            </div>
+          </div>
+          <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
           </button> -->
-            </div>
+        </div>
 
-
-            <div class="imgGroup">
-               <div class="flex justify-center" style="gap: 90px;">
-                  <button class="popTxt" v-for="(item, index) in items" :key="index">
-                     <div class="listenGroup">
-                        <img :src="item.imgSrc1">
-                        <p class="textbox"><img :src="item.imgSrc"></p>
-                     </div>
-                     <div class="listenGroup" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
-                        <img :src="item.imgSrc2">
-                        <p class="title4 textbox">{{ item.title }}</p>
-                     </div>
-                  </button>
-               </div>
-            </div>
-         </div>
-         <div class="next-btn" @click="goToPage('Chapter2_9')"><img src="../../../../resources/img/right.png" alt="">
-         </div>
+        <div class="imgGroup">
+          <div class="flex justify-center" style="gap: 90px">
+            <button class="popTxt" v-for="(item, index) in items" :key="index">
+              <div class="listenGroup">
+                <img :src="item.imgSrc1" />
+                <p class="textbox"><img :src="item.imgSrc" /></p>
+              </div>
+              <div
+                class="listenGroup"
+                :style="{
+                  display: item.isSecondImageVisible ? 'block' : 'none',
+                }"
+              >
+                <img :src="item.imgSrc2" />
+                <p class="title4 textbox">{{ item.title }}</p>
+              </div>
+            </button>
+          </div>
+        </div>
       </div>
-   </div>
+      <div class="next-btn" @click="goToPage('Chapter2_9')">
+        <img src="../../../../resources/img/right.png" alt="" />
+      </div>
+    </div>
+  </div>
 </template>
-
 
 <script>
 export default {
-   data() {
-      return {
-         items: [
-            { imgSrc1: 'client/resources/img/img49_s.png', imgSrc2: 'client/resources/img/img50_s.png', imgSrc: 'client/resources/img/img77_41s.png', isSecondImageVisible: false, title: 'america' },
-            { imgSrc1: 'client/resources/img/img49_s.png', imgSrc2: 'client/resources/img/img50_s.png', imgSrc: 'client/resources/img/img47_s.png', isSecondImageVisible: false, title: 'airplane' },
-            { imgSrc1: 'client/resources/img/img49_s.png', imgSrc2: 'client/resources/img/img50_s.png', imgSrc: 'client/resources/img/img75_41s.png', isSecondImageVisible: false, title: 'cat' },
-            { imgSrc1: 'client/resources/img/img49_s.png', imgSrc2: 'client/resources/img/img50_s.png', imgSrc: 'client/resources/img/img74_41s.png', isSecondImageVisible: false, title: 'mountain' }
-         ],
-         timer: 0,
-         intervalId: null,
-         currentIndex: 0,
-      };
-   },
-   methods: {
-      goToPage(page) {
-         this.$router.push({ name: page });
-      },
-      toggleImage(index) {
-         this.items[index].isSecondImageVisible = !this.items[index].isSecondImageVisible;
-      },
-      startTimer() {
-         // 현재 실행 중인 타이머가 있다면 정리
-         if (this.intervalId) {
+  data() {
+    return {
+      items: [
+        {
+          imgSrc1: "client/resources/img/img49_s.png",
+          imgSrc2: "client/resources/img/img50_s.png",
+          imgSrc: "client/resources/img/img77_41s.png",
+          isSecondImageVisible: false,
+          title: "america",
+        },
+        {
+          imgSrc1: "client/resources/img/img49_s.png",
+          imgSrc2: "client/resources/img/img50_s.png",
+          imgSrc: "client/resources/img/img47_s.png",
+          isSecondImageVisible: false,
+          title: "airplane",
+        },
+        {
+          imgSrc1: "client/resources/img/img49_s.png",
+          imgSrc2: "client/resources/img/img50_s.png",
+          imgSrc: "client/resources/img/img75_41s.png",
+          isSecondImageVisible: false,
+          title: "cat",
+        },
+        {
+          imgSrc1: "client/resources/img/img49_s.png",
+          imgSrc2: "client/resources/img/img50_s.png",
+          imgSrc: "client/resources/img/img74_41s.png",
+          isSecondImageVisible: false,
+          title: "mountain",
+        },
+      ],
+      timer: 0,
+      intervalId: null,
+      currentIndex: 0,
+    };
+  },
+  methods: {
+    complete() {
+      this.$router.push({ name: "Dashboard", query: { value: 2 } });
+    },
+    goToPage(page) {
+      this.$router.push({ name: page });
+    },
+    toggleImage(index) {
+      this.items[index].isSecondImageVisible =
+        !this.items[index].isSecondImageVisible;
+    },
+    startTimer() {
+      // 현재 실행 중인 타이머가 있다면 정리
+      if (this.intervalId) {
+        clearInterval(this.intervalId);
+      }
+
+      // 타이머 및 이미지 토글 상태 초기화
+      this.timer = 0;
+      this.currentIndex = 0; // 현재 타이머 인덱스를 추적
+
+      // 시작 타이머 설정
+      this.runTimer();
+    },
+
+    runTimer() {
+      // 반복 타이머 설정
+      this.intervalId = setInterval(() => {
+        if (this.currentIndex == this.items.length) return;
+        if (this.timer < 3) {
+          this.timer++;
+        } else {
+          // 타이머가 끝났을 때, 다음 타이머 설정
+          this.timer = 0;
+
+          if (this.currentIndex < this.items.length) {
+            // 현재 인덱스에 해당하는 아이템으로 이미지 토글
+            this.toggleImage(this.currentIndex);
+            this.currentIndex++;
+          } else {
+            // 모든 타이머가 완료되었으면 타이머 정리
             clearInterval(this.intervalId);
-         }
-
-         // 타이머 및 이미지 토글 상태 초기화
-         this.timer = 0;
-         this.currentIndex = 0; // 현재 타이머 인덱스를 추적
-
-         // 시작 타이머 설정
-         this.runTimer();
-      },
-
-      runTimer() {
-         // 반복 타이머 설정
-         this.intervalId = setInterval(() => {
-            if (this.currentIndex == this.items.length)
-               return;
-            if (this.timer < 3) {
-               this.timer++;
-            } else {
-               // 타이머가 끝났을 때, 다음 타이머 설정
-               this.timer = 0;
-
-               if (this.currentIndex < this.items.length) {
-                  // 현재 인덱스에 해당하는 아이템으로 이미지 토글
-                  this.toggleImage(this.currentIndex);
-                  this.currentIndex++;
-               } else {
-                  // 모든 타이머가 완료되었으면 타이머 정리
-                  clearInterval(this.intervalId);
-                  this.intervalId = null;
-                  console.log('모든 타이머가 완료되었습니다.');
-               }
-            }
-         }, 1000);
-      },
-   },
-   mounted() {
-      this.startTimer()
-   }
-}
-
+            this.intervalId = null;
+            console.log("모든 타이머가 완료되었습니다.");
+          }
+        }
+      }, 1000);
+    },
+  },
+  mounted() {
+    this.startTimer();
+  },
+};
 </script>
 <style scoped>
 .popTxt {
-   width: 295px;
-   height: 406px;
+  width: 295px;
+  height: 406px;
 }
 
 .popTxt div:last-child img {
-   position: absolute;
-   top: 0;
-   left: 0;
+  position: absolute;
+  top: 0;
+  left: 0;
 }
 
 .listenGroup .textbox {
-   top: 50%;
-   left: 50%;
+  top: 50%;
+  left: 50%;
 }
 
 .questionBox {
-   justify-content: space-between;
-   align-items: flex-start;
+  justify-content: space-between;
+  align-items: flex-start;
 }
-</style>
(No newline at end of file)
+.completeBtn {
+  margin-right: 100px;
+  background-color: #ffba08;
+  padding: 10px 30px;
+  border-radius: 10px;
+  font-size: 28px;
+  font-family: "ONEMobilePOPOTF";
+}
+</style>
client/views/pages/main/Chapter/Chapter2_3.vue
--- client/views/pages/main/Chapter/Chapter2_3.vue
+++ client/views/pages/main/Chapter/Chapter2_3.vue
@@ -1,297 +1,331 @@
 <template>
-    <div id="Chapter2_2" 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="Chapter2_2" 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('Chapter2')">
-                <img src="../../../../resources/img/left.png" alt="" />
-            </div>
-            <div class="content title-box">
-                <p class="subtitle2"></p>
-                <p class="title mt25 title-bg">STEP 2 - 단어로 공부하는 영어</p>
-                <div class="flex align-center mb30">
-                    <p class="subtitle2 mr20">다음을 듣고 따라 말하세요.</p>
-                    <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
-         </button> -->
-                </div>
-
-                <div class="imgGroup box23">
-                    <div class="con">
-                        <img :src="currentCon.imgSrc" alt="" />
-                        <p class="title3">
-                            <em class="yellow">{{ currentCon.titleEm }}</em>{{ currentCon.title }}
-                        </p>
-                        <div class="flex align-center justify-center mt10">
-                            <p class="yellow-box-big">{{ currentCon.boxText }}</p>
-                            <span class="subtitle3">{{ currentCon.subtitle }}</span>
-                        </div>
-                        <div class="flex justify-center">
-                            <div class="btnGroup mt50 flex justify-between">
-                                <button class="popTxt" v-for="(item, index) in items" :key="index"
-                                    @click="updateContent(index)" :class="{ active: selectedIndex === index }">
-                                    <img :src="item.imgSrc1" />
-                                    <img :src="item.imgSrc2" v-if="selectedIndex === index" style="display: block" />
-                                </button>
-                            </div>
-                        </div>
-                    </div>
-
-                    <div class="flex justify-center">
-                        <div class="readGroup">
-                            <section>
-                                <div class="imgGroup flex justify-center">
-                                    <!-- 녹음 버튼 -->
-                                    <div :class="['mic-btn', { notRecording: !isRecording }]" @click="toggleRecording">
-                                        <img src="../../../../resources/img/btn11_s.png" alt="" />
-                                    </div>
-                                </div>
-                                <article>
-                                    <p ref="speakText" class="speakText mb25">위의 버튼을 누른 후 단어를 말해보세요!</p>
-                                </article>
-                            </section>
-                        </div>
-                    </div>
-
-                </div>
-            </div>
-            <div class="next-btn" @click="goToPage('Chapter2_2')">
-                <img src="../../../../resources/img/right.png" alt="" />
-            </div>
-        </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" @click="goToPage('Chapter2')">
+        <img src="../../../../resources/img/left.png" alt="" />
+      </div>
+      <div class="content title-box">
+        <p class="subtitle2"></p>
+        <p class="title mt25 title-bg">STEP 2 - 단어로 공부하는 영어</p>
+        <div class="flex align-center mb30">
+          <p class="subtitle2 mr20">다음을 듣고 따라 말하세요.</p>
+          <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
+         </button> -->
+        </div>
+
+        <div class="imgGroup box23">
+          <div class="con">
+            <img :src="currentCon.imgSrc" alt="" />
+            <p class="title3">
+              <em class="yellow">{{ currentCon.titleEm }}</em
+              >{{ currentCon.title }}
+            </p>
+            <div class="flex align-center justify-center mt10">
+              <p class="yellow-box-big">{{ currentCon.boxText }}</p>
+              <span class="subtitle3">{{ currentCon.subtitle }}</span>
+            </div>
+            <div class="flex justify-center">
+              <div class="btnGroup mt50 flex justify-between">
+                <button
+                  class="popTxt"
+                  v-for="(item, index) in items"
+                  :key="index"
+                  @click="updateContent(index)"
+                  :class="{ active: selectedIndex === index }"
+                >
+                  <img :src="item.imgSrc1" />
+                  <img
+                    :src="item.imgSrc2"
+                    v-if="selectedIndex === index"
+                    style="display: block"
+                  />
+                </button>
+              </div>
+            </div>
+          </div>
+
+          <div class="flex justify-center">
+            <div class="readGroup">
+              <section>
+                <div class="imgGroup flex justify-center">
+                  <!-- 녹음 버튼 -->
+                  <div
+                    :class="['mic-btn', { notRecording: !isRecording }]"
+                    @click="toggleRecording"
+                  >
+                    <img src="../../../../resources/img/btn11_s.png" alt="" />
+                  </div>
+                </div>
+                <article>
+                  <p ref="speakText" class="speakText mb25">
+                    위의 버튼을 누른 후 단어를 말해보세요!
+                  </p>
+                </article>
+              </section>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="next-btn" @click="goToPage('Chapter2_2')">
+        <img src="../../../../resources/img/right.png" alt="" />
+      </div>
+    </div>
+  </div>
 </template>
 
 <script>
-import axios from 'axios';
-import { mdiStop } from '@mdi/js';
+import axios from "axios";
+import { mdiStop } from "@mdi/js";
 export default {
-    data() {
-        return {
-            items: [
-                {
-                    imgSrc1: 'client/resources/img/img53_6_35s.png',
-                    imgSrc2: 'client/resources/img/img53_1_35s.png',
-                    con: {
-                        imgSrc: 'client/resources/img/img54_s.png',
-                        titleEm: 'c',
-                        title: 'loud',
-                        boxText: '명',
-                        subtitle: '구름',
-                    },
-                },
-                {
-                    imgSrc1: 'client/resources/img/img53_7_35s.png',
-                    imgSrc2: 'client/resources/img/img53_2_35s.png',
-                    con: {
-                        imgSrc: 'client/resources/img/img40_s.png',
-                        titleEm: 'a',
-                        title: 'pple',
-                        boxText: '명',
-                        subtitle: '사과',
-                    },
-                },
-                {
-                    imgSrc1: 'client/resources/img/img53_8_35s.png',
-                    imgSrc2: 'client/resources/img/img53_3_35s.png',
-                    con: {
-                        imgSrc: 'client/resources/img/31img40_s.png',
-                        titleEm: 'l',
-                        title: 'og',
-                        boxText: '명',
-                        subtitle: '통나무',
-                    },
-                },
-                {
-                    imgSrc1: 'client/resources/img/img53_9_35s.png',
-                    imgSrc2: 'client/resources/img/img53_4_35s.png',
-                    con: {
-                        imgSrc: 'client/resources/img/img41_s.png',
-                        titleEm: 'g',
-                        title: 'uitar',
-                        boxText: '명',
-                        subtitle: '기타',
-                    },
-                },
-                {
-                    imgSrc1: 'client/resources/img/img53_10_35s.png',
-                    imgSrc2: 'client/resources/img/img53_5_35s.png',
-                    con: {
-                        imgSrc: 'client/resources/img/img76_41s.png',
-                        titleEm: 'w',
-                        title: 'ater melon',
-                        boxText: '명',
-                        subtitle: '수박',
-                    },
-                },
-            ],
-            currentCon: {
-                imgSrc: 'client/resources/img/img54_s.png',
-                titleEm: 'c',
-                title: 'loud',
-                boxText: '명',
-                subtitle: '구름',
-            },
-            selectedIndex: 0,
-            timer: '00',
-            intervalId: null,
+  data() {
+    return {
+      items: [
+        {
+          imgSrc1: "client/resources/img/img53_6_35s.png",
+          imgSrc2: "client/resources/img/img53_1_35s.png",
+          con: {
+            imgSrc: "client/resources/img/img54_s.png",
+            titleEm: "c",
+            title: "loud",
+            boxText: "명",
+            subtitle: "구름",
+          },
+        },
+        {
+          imgSrc1: "client/resources/img/img53_7_35s.png",
+          imgSrc2: "client/resources/img/img53_2_35s.png",
+          con: {
+            imgSrc: "client/resources/img/img40_s.png",
+            titleEm: "a",
+            title: "pple",
+            boxText: "명",
+            subtitle: "사과",
+          },
+        },
+        {
+          imgSrc1: "client/resources/img/img53_8_35s.png",
+          imgSrc2: "client/resources/img/img53_3_35s.png",
+          con: {
+            imgSrc: "client/resources/img/31img40_s.png",
+            titleEm: "l",
+            title: "og",
+            boxText: "명",
+            subtitle: "통나무",
+          },
+        },
+        {
+          imgSrc1: "client/resources/img/img53_9_35s.png",
+          imgSrc2: "client/resources/img/img53_4_35s.png",
+          con: {
+            imgSrc: "client/resources/img/img41_s.png",
+            titleEm: "g",
+            title: "uitar",
+            boxText: "명",
+            subtitle: "기타",
+          },
+        },
+        {
+          imgSrc1: "client/resources/img/img53_10_35s.png",
+          imgSrc2: "client/resources/img/img53_5_35s.png",
+          con: {
+            imgSrc: "client/resources/img/img76_41s.png",
+            titleEm: "w",
+            title: "ater melon",
+            boxText: "명",
+            subtitle: "수박",
+          },
+        },
+      ],
+      currentCon: {
+        imgSrc: "client/resources/img/img54_s.png",
+        titleEm: "c",
+        title: "loud",
+        boxText: "명",
+        subtitle: "구름",
+      },
+      selectedIndex: 0,
+      timer: "00",
+      intervalId: null,
 
-            isRecording: false, // 녹음 중 여부
-            mediaRecorder: null,
-            audioChunks: [], // 녹음된 오디오 데이터
-            audioBlob: null, // 오디오 Blob 객체
-            stream: null, // MediaStream 객체
+      isRecording: false, // 녹음 중 여부
+      mediaRecorder: null,
+      audioChunks: [], // 녹음된 오디오 데이터
+      audioBlob: null, // 오디오 Blob 객체
+      stream: null, // MediaStream 객체
 
-            path: mdiStop,
-            nowWord: 'cloud',
-        };
+      path: mdiStop,
+      nowWord: "cloud",
+    };
+  },
+  methods: {
+    complete() {
+      this.$router.push({ name: "Dashboard", query: { value: 2 } });
     },
-    methods: {
-        goToPage(page) {
-            this.$router.push({ name: page });
-        },
-        updateContent(index) {
-            this.selectedIndex = index;
-            this.currentCon = this.items[index].con;
-            this.startTimer();
-        },
-        startTimer() {
-            if (this.intervalId) {
-                clearInterval(this.intervalId);
-            }
-            this.timer = 5;
-            this.intervalId = setInterval(() => {
-                if (this.timer > 0) {
-                    this.timer--;
-                } else {
-                    clearInterval(this.intervalId);
-                }
-            }, 1000);
-        },
-        // 녹음 시작/중지 토글
-        async toggleRecording() {
-            if (this.isRecording) {
-                console.log('녹음 그만!');
-                this.stopRecording(); // 녹음 중이면 중지
-            } else {
-                console.log('녹음 시작!');
-                await this.startRecording(); // 녹음 중이 아니면 녹음 시작
-            }
-        },
-        // 녹음 시작
-        async startRecording() {
-            this.audioChunks = []; // 오디오 초기화
-            this.stream = await navigator.mediaDevices.getUserMedia({ audio: true });
-            this.mediaRecorder = new MediaRecorder(this.stream);
-            this.mediaRecorder.ondataavailable = (event) => {
-                this.audioChunks.push(event.data); // 녹음 데이터 저장
-            };
-            this.mediaRecorder.onstop = () => {
-                this.audioBlob = new Blob(this.audioChunks, { type: 'audio/wav' });
-
-                /******************************/
-                // this.audioURL = URL.createObjectURL(this.audioBlob); // 오디오 URL 생성
-                // console.log('Audio URL:', this.audioURL);
-                /******************************/
-
-                console.log('Recorded Audio Blob:', this.audioBlob); // 콘솔에 Blob 확인
-                this.sendAudioToServer(); // 서버로 오디오 전송
-            };
-            this.mediaRecorder.start(); // 녹음 시작
-            this.isRecording = true; // 녹음 상태 변경
-        },
-
-        // 녹음 중지
-        stopRecording() {
-            this.mediaRecorder.stop(); // 녹음 중단
-
-            if (this.stream) {
-                this.stream.getTracks().forEach((track) => track.stop()); // 스트림의 모든 트랙 중지
-            }
-
-            this.isRecording = false; // 녹음 상태 변경
-        },
-
-        // 오디오 전송
-        async sendAudioToServer() {
-            const formData = new FormData();
-            formData.append('file', this.audioBlob, 'recording.wav');
-            try {
-                const response = await axios.post('/api/speechToText.json', formData, {
-                    headers: {
-                        'Content-Type': 'multipart/form-data',
-                    },
-                });
-
-                this.transcription = response.data.trim().toLowerCase();
-                this.nowWord = this.nowWord.toLowerCase();
-
-                console.log('지금 단어: ', this.nowWord);
-                console.log('녹음 결과: ', this.transcription);
-
-                if (this.transcription === this.nowWord) {
-                    this.$refs.speakText.innerText = '정답입니다! 잘했어요';
-                } else {
-                    this.$refs.speakText.innerText = '다시 말해보세요!';
-                }
-            } catch (error) {
-                console.log('파일 전송 실패: ', error);
-            }
-        },
+    goToPage(page) {
+      this.$router.push({ name: page });
     },
-    watch: {
-        transcription: null, // 서버에서 받아온 텍스트 결과
-        currentCon: {
-            handler(newValue) {
-                // Update nowWord when currentCon changes
-                this.nowWord = newValue.titleEm + newValue.title;
-            },
-            deep: true, // Watch for deep changes in currentCon
-        },
+    updateContent(index) {
+      this.selectedIndex = index;
+      this.currentCon = this.items[index].con;
+      this.startTimer();
     },
-    beforeDestroy() {
-        if (this.intervalId) {
-            clearInterval(this.intervalId);
+    startTimer() {
+      if (this.intervalId) {
+        clearInterval(this.intervalId);
+      }
+      this.timer = 5;
+      this.intervalId = setInterval(() => {
+        if (this.timer > 0) {
+          this.timer--;
+        } else {
+          clearInterval(this.intervalId);
         }
+      }, 1000);
     },
+    // 녹음 시작/중지 토글
+    async toggleRecording() {
+      if (this.isRecording) {
+        console.log("녹음 그만!");
+        this.stopRecording(); // 녹음 중이면 중지
+      } else {
+        console.log("녹음 시작!");
+        await this.startRecording(); // 녹음 중이 아니면 녹음 시작
+      }
+    },
+    // 녹음 시작
+    async startRecording() {
+      this.audioChunks = []; // 오디오 초기화
+      this.stream = await navigator.mediaDevices.getUserMedia({ audio: true });
+      this.mediaRecorder = new MediaRecorder(this.stream);
+      this.mediaRecorder.ondataavailable = (event) => {
+        this.audioChunks.push(event.data); // 녹음 데이터 저장
+      };
+      this.mediaRecorder.onstop = () => {
+        this.audioBlob = new Blob(this.audioChunks, { type: "audio/wav" });
+
+        /******************************/
+        // this.audioURL = URL.createObjectURL(this.audioBlob); // 오디오 URL 생성
+        // console.log('Audio URL:', this.audioURL);
+        /******************************/
+
+        console.log("Recorded Audio Blob:", this.audioBlob); // 콘솔에 Blob 확인
+        this.sendAudioToServer(); // 서버로 오디오 전송
+      };
+      this.mediaRecorder.start(); // 녹음 시작
+      this.isRecording = true; // 녹음 상태 변경
+    },
+
+    // 녹음 중지
+    stopRecording() {
+      this.mediaRecorder.stop(); // 녹음 중단
+
+      if (this.stream) {
+        this.stream.getTracks().forEach((track) => track.stop()); // 스트림의 모든 트랙 중지
+      }
+
+      this.isRecording = false; // 녹음 상태 변경
+    },
+
+    // 오디오 전송
+    async sendAudioToServer() {
+      const formData = new FormData();
+      formData.append("file", this.audioBlob, "recording.wav");
+      try {
+        const response = await axios.post("/api/speechToText.json", formData, {
+          headers: {
+            "Content-Type": "multipart/form-data",
+          },
+        });
+
+        this.transcription = response.data.trim().toLowerCase();
+        this.nowWord = this.nowWord.toLowerCase();
+
+        console.log("지금 단어: ", this.nowWord);
+        console.log("녹음 결과: ", this.transcription);
+
+        if (this.transcription === this.nowWord) {
+          this.$refs.speakText.innerText = "정답입니다! 잘했어요";
+        } else {
+          this.$refs.speakText.innerText = "다시 말해보세요!";
+        }
+      } catch (error) {
+        console.log("파일 전송 실패: ", error);
+      }
+    },
+  },
+  watch: {
+    transcription: null, // 서버에서 받아온 텍스트 결과
+    currentCon: {
+      handler(newValue) {
+        // Update nowWord when currentCon changes
+        this.nowWord = newValue.titleEm + newValue.title;
+      },
+      deep: true, // Watch for deep changes in currentCon
+    },
+  },
+  beforeDestroy() {
+    if (this.intervalId) {
+      clearInterval(this.intervalId);
+    }
+  },
 };
 </script>
 
 <style scoped>
 .popTxt img {
-    position: absolute;
-    top: 0;
-    left: 0;
+  position: absolute;
+  top: 0;
+  left: 0;
 }
 
 .box23 {
-    display: flex;
-    align-items: center;
-    gap: 80px;
-    justify-content: center;
+  display: flex;
+  align-items: center;
+  gap: 80px;
+  justify-content: center;
 }
 
 .mic-btn {
-    cursor: pointer;
+  cursor: pointer;
 }
 
 .mic-btn.notRecording {
-    background-image: none;
-    cursor: pointer;
+  background-image: none;
+  cursor: pointer;
 }
 
 .speakText {
-    background-color: #fff8e9;
-    border: 0;
+  background-color: #fff8e9;
+  border: 0;
 }
 
 .speakText span {
-    font-size: 28px;
+  font-size: 28px;
+}
+
+.completeBtn {
+  margin-right: 100px;
+  background-color: #ffba08;
+  padding: 10px 30px;
+  border-radius: 10px;
+  font-size: 28px;
+  font-family: "ONEMobilePOPOTF";
 }
 </style>
client/views/pages/main/Chapter/Chapter2_4.vue
--- client/views/pages/main/Chapter/Chapter2_4.vue
+++ client/views/pages/main/Chapter/Chapter2_4.vue
@@ -1,129 +1,185 @@
 <template>
-   <div id="Chapter2_2" 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="Chapter2_2" 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"
+      style="justify-content: space-between"
+    >
+      <div>
+        <span class="title mr40">1. Hello WORLD</span>
+        <span class="subtitle">my name is dd</span>
       </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>
+      <button class="completeBtn" @click="complete">학습 종료</button>
+    </div>
+    <div class="flex justify-between align-center">
+      <div class="pre-btn" @click="goToPage('Chapter2_9')">
+        <img src="../../../../resources/img/left.png" alt="" />
       </div>
-      <div class="flex justify-between align-center">
-         <div class="pre-btn" @click="goToPage('Chapter2_9')"><img src="../../../../resources/img/left.png" alt="">
-         </div>
-         <div class="content title-box">
-            <p class="title mt25 title-bg">STEP 2 - 단어로 공부하는 영어</p>
-            <div class="flex align-center mb30">
-               <p class="subtitle2 mr20">다음을 듣고 맞는 단어를 선택하세요.</p>
-               <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
+      <div class="content title-box">
+        <p class="title mt25 title-bg">STEP 2 - 단어로 공부하는 영어</p>
+        <div class="flex align-center mb30">
+          <p class="subtitle2 mr20">다음을 듣고 맞는 단어를 선택하세요.</p>
+          <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
           </button> -->
-            </div>
+        </div>
 
-
-            <div class="imgGroup">
-
-               <div class="flex justify-center">
-                  <div class="listenGroup  flex" style="gap: 60px;">
-                     <button class="popTxt" v-for="(item, index) in items" :key="index" @click="updateContent(index)"
-                        :class="{ active: selectedIndex === index }">
-                        <img :src="item.imgSrc1">
-                        <img :src="item.imgSrc2" v-if="selectedIndex === index" style="display: block;">
-                        <div class="textbox">
-                           <div style="height: 80%; line-height: 200px;"> <img :src="item.imgSrc" alt=""></div>
-                           <p class="subtitle3" style="height: 20%;">{{ item.title }}</p>
-                        </div>
-                     </button>
+        <div class="imgGroup">
+          <div class="flex justify-center">
+            <div class="listenGroup flex" style="gap: 60px">
+              <button
+                class="popTxt"
+                v-for="(item, index) in items"
+                :key="index"
+                @click="updateContent(index)"
+                :class="{ active: selectedIndex === index }"
+              >
+                <img :src="item.imgSrc1" />
+                <img
+                  :src="item.imgSrc2"
+                  v-if="selectedIndex === index"
+                  style="display: block"
+                />
+                <div class="textbox">
+                  <div style="height: 80%; line-height: 200px">
+                    <img :src="item.imgSrc" alt="" />
                   </div>
-               </div>
-               <div class="listen-btn mt50">
-                  <img src="client/resources/img/btn10_s.png" alt="Listen" @click="playAudio">
-               </div>
-
-               <audio id="audio-player" src="client/resources/audio/bank.wav" preload="auto"></audio>
+                  <p class="subtitle3" style="height: 20%">{{ item.title }}</p>
+                </div>
+              </button>
             </div>
-         </div>
-         <div class="next-btn" @click="goToPage('Chapter2_8')"><img src="../../../../resources/img/right.png" alt="">
-         </div>
+          </div>
+          <div class="listen-btn mt50">
+            <img
+              src="client/resources/img/btn10_s.png"
+              alt="Listen"
+              @click="playAudio"
+            />
+          </div>
+
+          <audio
+            id="audio-player"
+            src="client/resources/audio/bank.wav"
+            preload="auto"
+          ></audio>
+        </div>
       </div>
-   </div>
+      <div class="next-btn" @click="goToPage('Chapter2_8')">
+        <img src="../../../../resources/img/right.png" alt="" />
+      </div>
+    </div>
+  </div>
 </template>
 <script>
-import SvgIcon from '@jamescoyle/vue-icon';
+import SvgIcon from "@jamescoyle/vue-icon";
 export default {
-   data() {
-      return {
-         items: [
-            { imgSrc1: 'client/resources/img/img61_36s.png', imgSrc2: 'client/resources/img/img62_36s.png', imgSrc: 'client/resources/img/img59_36s.png', title: 'apple' },
-            { imgSrc1: 'client/resources/img/img61_36s.png', imgSrc2: 'client/resources/img/img62_36s.png', imgSrc: 'client/resources/img/img2_4.png', title: 'bank' },
-            { imgSrc1: 'client/resources/img/img61_36s.png', imgSrc2: 'client/resources/img/img62_36s.png', imgSrc: 'client/resources/img/img57_36s.png', title: 'car' },
-            { imgSrc1: 'client/resources/img/img61_36s.png', imgSrc2: 'client/resources/img/img62_36s.png', imgSrc: 'client/resources/img/img56_36s.png', title: 'guitar' },
-         ],
-         selectedIndex: 0,
-      };
-   },
-   methods: {
-      goToPage(page) {
-         this.$router.push({ name: page });
-      },
-      updateContent(index) {
-         this.selectedIndex = index;
-         this.currentCon = this.items[index].con;
-         setTimeout(() => {
-            if(index==1){
-               alert("정답입니다!")
-            }else{
-               alert("오답입니다!")
-            }
-         },0)
-        
-      }, playAudio() {
-         const audio = document.getElementById('audio-player');
-         audio.play();
-         console.log("playing")
-      }
-
-
-
-   },
-   components: {
-      SvgIcon
-   },
-}
+  data() {
+    return {
+      items: [
+        {
+          imgSrc1: "client/resources/img/img61_36s.png",
+          imgSrc2: "client/resources/img/img62_36s.png",
+          imgSrc: "client/resources/img/img59_36s.png",
+          title: "apple",
+        },
+        {
+          imgSrc1: "client/resources/img/img61_36s.png",
+          imgSrc2: "client/resources/img/img62_36s.png",
+          imgSrc: "client/resources/img/img2_4.png",
+          title: "bank",
+        },
+        {
+          imgSrc1: "client/resources/img/img61_36s.png",
+          imgSrc2: "client/resources/img/img62_36s.png",
+          imgSrc: "client/resources/img/img57_36s.png",
+          title: "car",
+        },
+        {
+          imgSrc1: "client/resources/img/img61_36s.png",
+          imgSrc2: "client/resources/img/img62_36s.png",
+          imgSrc: "client/resources/img/img56_36s.png",
+          title: "guitar",
+        },
+      ],
+      selectedIndex: 0,
+    };
+  },
+  methods: {
+    complete() {
+      this.$router.push({ name: "Dashboard", query: { value: 2 } });
+    },
+    goToPage(page) {
+      this.$router.push({ name: page });
+    },
+    updateContent(index) {
+      this.selectedIndex = index;
+      this.currentCon = this.items[index].con;
+      setTimeout(() => {
+        if (index == 1) {
+          alert("정답입니다!");
+        } else {
+          alert("오답입니다!");
+        }
+      }, 0);
+    },
+    playAudio() {
+      const audio = document.getElementById("audio-player");
+      audio.play();
+      console.log("playing");
+    },
+  },
+  components: {
+    SvgIcon,
+  },
+};
 </script>
 
 <style scoped>
 .listenGroup {
-   height: 305px;
+  height: 305px;
 }
 
 .listenGroup button {
-   position: relative;
+  position: relative;
 }
 
 .listenGroup .textbox {
-   width: 184px;
-   height: 206px;
-   left: 46%;
-   top: 43%;
+  width: 184px;
+  height: 206px;
+  left: 46%;
+  top: 43%;
 }
 
 .look-text {
-   bottom: 50px;
+  bottom: 50px;
 }
 
 .btnGroup {
-   width: 1060px;
-   height: 340px;
+  width: 1060px;
+  height: 340px;
 }
 
 .popTxt {
-   width: 216px;
+  width: 216px;
 }
 
-.popTxt>img {
-   position: absolute;
-   top: 0;
-   left: 0;
+.popTxt > img {
+  position: absolute;
+  top: 0;
+  left: 0;
 }
-</style>
(No newline at end of file)
+
+.completeBtn {
+  margin-right: 100px;
+  background-color: #ffba08;
+  padding: 10px 30px;
+  border-radius: 10px;
+  font-size: 28px;
+  font-family: "ONEMobilePOPOTF";
+}
+</style>
client/views/pages/main/Chapter/Chapter2_9.vue
--- client/views/pages/main/Chapter/Chapter2_9.vue
+++ client/views/pages/main/Chapter/Chapter2_9.vue
@@ -2,36 +2,56 @@
   <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">
-      <span class="title mr40">1. Hello WORLD</span>
-      <span class="subtitle">my name is dd</span>
+    <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" @click="goToPage('Chapter2_2')"><img src="../../../../resources/img/left.png" alt=""></div>
+      <div class="pre-btn" @click="goToPage('Chapter2_2')">
+        <img src="../../../../resources/img/left.png" alt="" />
+      </div>
       <div class="content title-box">
-        <div style="display: flex; justify-content: space-between;">
+        <div style="display: flex; justify-content: space-between">
           <p class="title mt25 title-bg">STEP 2 - 단어로 공부하는 영어</p>
-          <button id="returnButton" @click="returnPage" style="margin: 4rem;">
-            <img src="../../../../resources/img/btn_return_50x50.png" alt="">
+          <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>
+          <p class="subtitle2 mr20">
+            앗! 잉크가 쏟아졌어! 지우개로 잉크를 지워줘!
+          </p>
         </div>
 
         <div class="text-ct">
           <div class="dropGroup flex align-center justify-center">
-            <div style="position: relative;">
-              <img src="../../../../resources/img/img72_41s.png" alt="" style="width: 93%;">
+            <div style="position: relative">
+              <img
+                src="../../../../resources/img/img72_41s.png"
+                alt=""
+                style="width: 93%"
+              />
               <div class="vocaGroup">
                 <div class="flex justify-between mb80">
                   <article class="flex align-center">
                     <div class="imgGroup mr30">
-                      <img src="../../../../resources/img/img74_41s.png" data-num="1" class="ink" />
+                      <img
+                        src="../../../../resources/img/img74_41s.png"
+                        data-num="1"
+                        class="ink"
+                      />
                     </div>
                     <div class="flex align-start">
                       <div>
@@ -44,7 +64,11 @@
                   </article>
                   <article class="flex align-center">
                     <div class="imgGroup mr30">
-                      <img src="../../../../resources/img/img75_41s.png" data-num="2" class="ink" />
+                      <img
+                        src="../../../../resources/img/img75_41s.png"
+                        data-num="2"
+                        class="ink"
+                      />
                     </div>
                     <div class="flex align-start">
                       <div>
@@ -59,7 +83,11 @@
                 <div class="flex justify-between">
                   <article class="flex align-center">
                     <div class="imgGroup mr30">
-                      <img src="../../../../resources/img/img76_41s.png" data-num="3" class="ink" />
+                      <img
+                        src="../../../../resources/img/img76_41s.png"
+                        data-num="3"
+                        class="ink"
+                      />
                     </div>
                     <div class="flex align-start">
                       <div>
@@ -72,7 +100,11 @@
                   </article>
                   <article class="flex align-center">
                     <div class="imgGroup mr30">
-                      <img src="../../../../resources/img/img77_41s.png" data-num="4" class="ink" />
+                      <img
+                        src="../../../../resources/img/img77_41s.png"
+                        data-num="4"
+                        class="ink"
+                      />
                     </div>
                     <div class="flex align-start">
                       <div>
@@ -86,16 +118,32 @@
                 </div>
               </div>
               <div class="textbox">
-                <button id="eraser1" class="dropzone" style="left: 141px; top: 44px;">
+                <button
+                  id="eraser1"
+                  class="dropzone"
+                  style="left: 141px; top: 44px"
+                >
                   <img src="../../../../resources/img/img78_41s.png" alt="" />
                 </button>
-                <button id="eraser2" class="dropzone" style="left: 200px; bottom: 46px;">
+                <button
+                  id="eraser2"
+                  class="dropzone"
+                  style="left: 200px; bottom: 46px"
+                >
                   <img src="../../../../resources/img/img79_41s.png" alt="" />
                 </button>
-                <button id="eraser3" class="dropzone" style="right: 237px; top: 114px;">
+                <button
+                  id="eraser3"
+                  class="dropzone"
+                  style="right: 237px; top: 114px"
+                >
                   <img src="../../../../resources/img/img80_41s.png" alt="" />
                 </button>
-                <button id="eraser4" class="dropzone" style="right: 159px; bottom: 5px;">
+                <button
+                  id="eraser4"
+                  class="dropzone"
+                  style="right: 159px; bottom: 5px"
+                >
                   <img src="../../../../resources/img/img81_41s.png" alt="" />
                 </button>
               </div>
@@ -103,8 +151,12 @@
           </div>
           <div class="dragGroup">
             <div>
-              <article style="left: 83px; top: 69%;">
-                <button id="eraser" draggable="true" @dragstart="handleDragStart">
+              <article style="left: 83px; top: 69%">
+                <button
+                  id="eraser"
+                  draggable="true"
+                  @dragstart="handleDragStart"
+                >
                   <img src="../../../../resources/img/img73_41s.png" alt="" />
                 </button>
               </article>
@@ -112,11 +164,12 @@
           </div>
         </div>
       </div>
-      <div class="next-btn" @click="goToPage('Chapter2_4')"><img src="../../../../resources/img/right.png" alt=""></div>
+      <div class="next-btn" @click="goToPage('Chapter2_4')">
+        <img src="../../../../resources/img/right.png" alt="" />
+      </div>
     </div>
   </div>
 </template>
-
 
 <script>
 export default {
@@ -126,12 +179,15 @@
     };
   },
   methods: {
+    complete() {
+      this.$router.push({ name: "Dashboard", query: { value: 2 } });
+    },
     goToPage(page) {
       this.$router.push({ name: page });
     },
     handleDragStart(event) {
       this.draggedElementId = event.target.id; // 드래그한 요소의 ID를 저장
-      event.dataTransfer.setData('text/plain', this.draggedElementId);
+      event.dataTransfer.setData("text/plain", this.draggedElementId);
     },
     handleDragOver(event) {
       event.preventDefault(); // 드롭을 허용
@@ -140,20 +196,20 @@
       event.preventDefault();
 
       // 드롭된 영역이 버튼인지 확인
-      const dropZone = event.target.closest('button.dropzone');
+      const dropZone = event.target.closest("button.dropzone");
 
       if (dropZone) {
         // 드롭이 이루어진 영역이 버튼일 때만 처리
-        dropZone.querySelector('img').style.display = 'none'; // 잉크를 숨깁니다
+        dropZone.querySelector("img").style.display = "none"; // 잉크를 숨깁니다
       }
 
       // 드래그한 요소를 원래 위치로 복원
       const draggedElement = document.getElementById(this.draggedElementId);
       if (draggedElement) {
-        draggedElement.style.visibility = 'visible';
-        draggedElement.style.position = '';
-        draggedElement.style.top = '';
-        draggedElement.style.left = '';
+        draggedElement.style.visibility = "visible";
+        draggedElement.style.position = "";
+        draggedElement.style.top = "";
+        draggedElement.style.left = "";
       }
 
       this.draggedElementId = null; // 드래그 상태 초기화
@@ -164,15 +220,13 @@
   },
   mounted() {
     // 드래그 가능한 영역에 드래그 오버 및 드롭 이벤트를 추가합니다
-    document.querySelectorAll('.dropzone').forEach(button => {
-      button.addEventListener('dragover', this.handleDragOver);
-      button.addEventListener('drop', this.handleDrop);
+    document.querySelectorAll(".dropzone").forEach((button) => {
+      button.addEventListener("dragover", this.handleDragOver);
+      button.addEventListener("drop", this.handleDrop);
     });
-  }
-}
+  },
+};
 </script>
-
-
 
 <style scoped>
 .vocaGroup {
@@ -185,4 +239,13 @@
 .ink {
   cursor: pointer;
 }
-</style>
(No newline at end of file)
+
+.completeBtn {
+  margin-right: 100px;
+  background-color: #ffba08;
+  padding: 10px 30px;
+  border-radius: 10px;
+  font-size: 28px;
+  font-family: "ONEMobilePOPOTF";
+}
+</style>
Add a comment
List