jichoi / lms_front star
이은진 이은진 2024-08-16
240816 이은진, 정다정 토끼 이동 수정중
@2d6a0a362948cbd2b925ba996a68e0f3cf1d2983
client/views/pages/main/Chapter/Chapter1.vue
--- client/views/pages/main/Chapter/Chapter1.vue
+++ client/views/pages/main/Chapter/Chapter1.vue
@@ -7,9 +7,14 @@
         </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">
@@ -37,6 +42,9 @@
     TextToImage,
   },
   methods: {
+    complete() {
+      this.$router.push({ name: 'Dashboard', query: { value: 1 } });
+    },
     goToPage(page) {
       this.$router.push({ name: page });
     },
@@ -94,7 +102,18 @@
 
 <style scoped>
 .youtube-player {
-  width: 950px; /* 플레이어의 가로 크기 */
-  height: 550px; /* 플레이어의 세로 크기 */
+  width: 950px;
+  /* 플레이어의 가로 크기 */
+  height: 550px;
+  /* 플레이어의 세로 크기 */
+}
+
+.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,284 +1,297 @@
 <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>
-       <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="">
+    <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">
+            <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>
 
-               <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="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>
+                    <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';
 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',
-       };
-   },
-   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' });
+            path: mdiStop,
+            nowWord: 'cloud',
+        };
+    },
+    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);
-               /******************************/
+                /******************************/
+                // 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; // 녹음 상태 변경
-       },
+                console.log('Recorded Audio Blob:', this.audioBlob); // 콘솔에 Blob 확인
+                this.sendAudioToServer(); // 서버로 오디오 전송
+            };
+            this.mediaRecorder.start(); // 녹음 시작
+            this.isRecording = true; // 녹음 상태 변경
+        },
 
-       // 녹음 중지
-       stopRecording() {
-           this.mediaRecorder.stop(); // 녹음 중단
+        // 녹음 중지
+        stopRecording() {
+            this.mediaRecorder.stop(); // 녹음 중단
 
-           if (this.stream) {
-               this.stream.getTracks().forEach((track) => track.stop()); // 스트림의 모든 트랙 중지
-           }
+            if (this.stream) {
+                this.stream.getTracks().forEach((track) => track.stop()); // 스트림의 모든 트랙 중지
+            }
 
-           this.isRecording = false; // 녹음 상태 변경
-       },
+            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',
-                   },
-               });
+        // 오디오 전송
+        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();
+                this.transcription = response.data.trim().toLowerCase();
+                this.nowWord = this.nowWord.toLowerCase();
 
-               console.log('지금 단어: ', this.nowWord);
-               console.log('녹음 결과: ', this.transcription);
+                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);
-       }
-   },
+                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;
+
+.box23 {
+    display: flex;
     align-items: center;
     gap: 80px;
     justify-content: center;
 }
+
+.mic-btn {
+    cursor: pointer;
+}
+
+.mic-btn.notRecording {
+    background-image: none;
+    cursor: pointer;
+}
+
+.speakText {
+    background-color: #fff8e9;
+    border: 0;
+}
+
+.speakText span {
+    font-size: 28px;
+}
 </style>
client/views/pages/main/Dashboard.vue
--- client/views/pages/main/Dashboard.vue
+++ client/views/pages/main/Dashboard.vue
@@ -9,21 +9,29 @@
                 <p class="subtitle">{{ roadmapData[0].book_nm }}</p>
             </div>
             <div class="race-box">
-                <div class="rabbit-start"><img src="../../../resources/img/img09_s.png" alt=""></div>
+
+
+                <div class="rabbit-start"><img src="../../../resources/img/img09_s.png" alt=""
+                        :style="{ display: rabbitPos[0] ? 'block' : 'none' }"></div>
                 <div class="rcon flex justify-end mb5">
                     <div class="race-btn" @click="goToPage('Chapter1')">
+
+                        <div class="rabbit-running"><img src="../../../resources/img/img09_s.png" alt=""
+                                :style="{ display: rabbitPos[1] ? 'block' : 'none' }"></div>
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
                             data-num="1">
-                            <img :src="item.imgSrc1">
-                            <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
+                            <img :src="item.imgSrc1" :style="{ display: !rabbitCompl[1] ? 'block' : 'none' }">
+                            <img :src="item.imgSrc2" :style="{ display: rabbitCompl[1] ? 'block' : 'none' }">
                         </button>
                         <p>지문1</p>
                     </div>
                     <div class="race-btn" @click="goToPage('Chapter2')">
+                        <div class="rabbit-running"><img src="../../../resources/img/img09_s.png" alt=""
+                                :style="{ display: rabbitPos[2] ? 'block' : 'none' }"></div>
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
                             data-num="2">
-                            <img :src="item.imgSrc1">
-                            <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
+                            <img :src="item.imgSrc1" :style="{ display: !rabbitCompl[2] ? 'block' : 'none' }">
+                            <img :src="item.imgSrc2" :style="{ display: rabbitCompl[2] ? 'block' : 'none' }">
                         </button>
                         <p>단어장</p>
                     </div>
@@ -32,7 +40,8 @@
                     <div class="race-btn" @click="goToPage('Chapter7')">
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
                             data-num="7">
-                            <img :src="item.imgSrc1">
+                            <img :src="item.imgSrc1"
+                                :style="{ display: !item.isSecondImageVisible ? 'block' : 'none' }">
                             <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
                         </button>
                         <p>문제1</p>
@@ -40,7 +49,8 @@
                     <div class="race-btn" @click="goToPage('Chapter6')">
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
                             data-num="6">
-                            <img :src="item.imgSrc1">
+                            <img :src="item.imgSrc1"
+                                :style="{ display: !item.isSecondImageVisible ? 'block' : 'none' }">
                             <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
                         </button>
                         <p>단어장</p>
@@ -48,7 +58,8 @@
                     <div class="race-btn" @click="goToPage('Chapter5')">
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
                             data-num="5">
-                            <img :src="item.imgSrc1">
+                            <img :src="item.imgSrc1"
+                                :style="{ display: !item.isSecondImageVisible ? 'block' : 'none' }">
                             <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
                         </button>
                         <p>지문2</p>
@@ -56,7 +67,8 @@
                     <div class="race-btn" @click="goToPage('Chapter4')">
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
                             data-num="4">
-                            <img :src="item.imgSrc1">
+                            <img :src="item.imgSrc1"
+                                :style="{ display: !item.isSecondImageVisible ? 'block' : 'none' }">
                             <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
                         </button>
                         <p>문제2</p>
@@ -64,7 +76,8 @@
                     <div class="race-btn" @click="goToPage('Chapter3')">
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
                             data-num="3">
-                            <img :src="item.imgSrc1">
+                            <img :src="item.imgSrc1"
+                                :style="{ display: !item.isSecondImageVisible ? 'block' : 'none' }">
                             <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
                         </button>
                         <p>문제1</p>
@@ -74,7 +87,8 @@
                     <div class="race-btn" @click="goToPage('Chapter8')">
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
                             data-num="8">
-                            <img :src="item.imgSrc3">
+                            <img :src="item.imgSrc3"
+                                :style="{ display: !item.isSecondImageVisible ? 'block' : 'none' }">
                             <img :src="item.imgSrc4" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
                         </button>
                         <p class="long">중간 평가</p>
@@ -82,7 +96,8 @@
                     <div class="race-btn" @click="goToPage('Chapter9')">
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
                             data-num="9">
-                            <img :src="item.imgSrc1">
+                            <img :src="item.imgSrc1"
+                                :style="{ display: !item.isSecondImageVisible ? 'block' : 'none' }">
                             <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
                         </button>
                         <p>지문3</p>
@@ -90,7 +105,8 @@
                     <div class="race-btn" @click="goToPage('Chapter10')">
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
                             data-num="10">
-                            <img :src="item.imgSrc1">
+                            <img :src="item.imgSrc1"
+                                :style="{ display: !item.isSecondImageVisible ? 'block' : 'none' }">
                             <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
                         </button>
                         <p>단어장</p>
@@ -99,7 +115,8 @@
                     <div class="race-btn">
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
                             data-num="11">
-                            <img :src="item.imgSrc3">
+                            <img :src="item.imgSrc3"
+                                :style="{ display: !item.isSecondImageVisible ? 'block' : 'none' }">
                             <img :src="item.imgSrc4" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
                         </button>
                         <p class="long">최종 평가</p>
@@ -346,11 +363,24 @@
 
             schedules: [],
             nowSchedule: "",
-            state: ''
+            state: '',
+            rabbitPos: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+            rabbitCompl: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
         }
     },
     methods: {
         //은진
+        fetchRabbit() {
+            for (var i = 0; i < 12; i++) {
+                this.rabbitPos[i] = false
+            }
+            if (this.$route.query.value) {
+                this.rabbitPos[this.$route.query.value] = true
+                this.rabbitCompl[this.$route.query.value] = true
+            }
+            else
+                this.rabbitPos[0] = true
+        },
         fetchSchedule() {
             axios({
                 url: "/schedule/selectSchedule.json",
@@ -845,6 +875,7 @@
     mounted() {
         console.log('main mounted');
         this.fetchSchedule();
+        this.fetchRabbit();
     },
     computed() {
 
@@ -936,4 +967,12 @@
 .rabbit-end {
     cursor: pointer;
 }
+
+.rabbit-running {
+    position: absolute;
+    bottom: 40px;
+    right: 110px;
+    z-index: 10000;
+    transform: scaleX(-1);
+}
 </style>
(No newline at end of file)
Add a comment
List