jichoi / lms_front star
이은진 이은진 2024-08-13
240813 이은진 AI대시보드, 대시보드
@3ef3b3090ed8dd74a9c849a758f0282363e2cb2b
client/views/pages/main/AIDashboard.vue
--- client/views/pages/main/AIDashboard.vue
+++ client/views/pages/main/AIDashboard.vue
@@ -1,9 +1,9 @@
 <template>
-    <div class="main">
+    <p class="title1" v-show="isHidden">오늘 공부를 다했어요! 너무 고생했어요!</p>
+    <div class="main" v-show="!isHidden">
         <div class="race-wrap">
             <div class="title-box">
                 <p class="title">AI 학습 보드</p>
-                <p class="subtitle">hi my name is dd!</p>
             </div>
             <div class="race-box">
                 <div class="rabbit-start"><img src="../../../resources/img/img09_s.png" alt=""></div>
@@ -95,14 +95,15 @@
 
                     <div class="race-btn">
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
-                        data-num="11">
+                            data-num="11">
                             <img :src="item.imgSrc3">
                             <img :src="item.imgSrc4" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
                         </button>
                         <p class="long">최종 평가</p>
                     </div>
                 </div>
-                <div class="rabbit-end" @click="ShowPopup"><img src="../../../resources/img/img138_72s.png" alt=""></div>
+                <div class="rabbit-end" @click="ShowPopup"><img src="../../../resources/img/img138_72s.png" alt="">
+                </div>
             </div>
 
             <!-- 팝업 -->
@@ -185,7 +186,8 @@
                                     <input type="range" id="brushSize" min="1" max="10" v-model="brushSize"
                                         @input="updateBrushSize" style="width: 100px; margin-left: 5px;" />
                                     <button class="new-btn" style="font-size: 9px;" @click="setTool('draw')">펜</button>
-                                    <button class="new-btn" style="font-size: 9px;" @click="setTool('eraser')">지우개</button>
+                                    <button class="new-btn" style="font-size: 9px;"
+                                        @click="setTool('eraser')">지우개</button>
                                     <button class="new-btn" style="font-size: 9px;" @click="clearAll">전체 지우개</button>
                                 </div>
                             </div>
@@ -258,13 +260,18 @@
                 </div>
             </article>
         </div>
-         <div class="complete-wrap  myphoto">
-            <button  class="login-btn mt10" type="submit" style="width: 100%;" @click="goToPage('MyPlan')"><img src="../../../resources/img/btn07_s.png" alt="" style="width: 100%; height: 100px;"> <p>학습 종료하기</p></button>
+        <div class="complete-wrap  myphoto">
+            <button class="login-btn mt10" type="submit" style="width: 100%;" @click="finishSchedule"><img
+                    src="../../../resources/img/btn07_s.png" alt="" style="width: 100%; height: 100px;">
+                <p>학습 종료하기</p>
+            </button>
             <h2 class="mb40 mt10">이 단원을 끝낸 친구들</h2>
             <article class=" flex-column" style="gap: 5px;">
                 <div class="flex" style="gap: 5px;">
-                    <div @click="buttonSearch" class="photo"><img src="../../../resources/img/img143_75s.png" alt=""></div>
-                    <div @click="buttonSearch" class="photo"><img src="../../../resources/img/img143_75s.png" alt=""></div>
+                    <div @click="buttonSearch" class="photo"><img src="../../../resources/img/img143_75s.png" alt="">
+                    </div>
+                    <div @click="buttonSearch" class="photo"><img src="../../../resources/img/img143_75s.png" alt="">
+                    </div>
                 </div>
             </article>
             <article class="popup-wrap" v-show="searchOpen">
@@ -290,7 +297,7 @@
                     </div>
                 </div>
             </article>
-        </div> 
+        </div>
 
     </div>
 </template>
@@ -353,11 +360,18 @@
             canvasRect: {
                 topLeft: { x: 0, y: 0 },
                 bottomRight: { x: 0, y: 0 }
-            }
+            },
+
+
+            isHidden: false,
 
         }
     },
     methods: {
+
+        finishSchedule() {
+            this.isHidden = true;
+        },
         toggleImage(index) {
             this.items[index].isSecondImageVisible = !this.items[index].isSecondImageVisible;
         },
client/views/pages/main/Dashboard.vue
--- client/views/pages/main/Dashboard.vue
+++ client/views/pages/main/Dashboard.vue
@@ -1,14 +1,14 @@
 <template>
-    <div>
-        <div v-if="roadViewTF">
-            <!-- 1번 템플릿 -->
-            <div class="main">
-                <div class="race-wrap">
-                    <div class="title-box">
-                        <p class="title" style="margin-top: 67px;">hello world!</p>
-                        <p class="subtitle">hi my name is dd!</p>
-                    </div>
-                    <!--
+    <p class="title1" v-if="state === 'finish'">오늘 공부를 다했어요! 너무 고생했어요!</p>
+    <p class="title1" v-else-if="state === ''">지금은 학습 루트가 등록이 안됐어요! 학습 일정에서 학습루트를 등록해볼까요?</p>
+    <!-- 1번 템플릿 -->
+    <div v-else class="main">
+        <div class="race-wrap">
+            <div class="title-box">
+                <p class="title">{{ roadmapData[0].unit_nm }}</p>
+                <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="rcon flex justify-between mb5">
@@ -22,7 +22,7 @@
                         </div>
                     </div>
                 -->
-                <div class="race-box">
+            <div class="race-box">
                 <div class="rabbit-start"><img src="../../../resources/img/img09_s.png" alt=""></div>
                 <div class="rcon flex justify-end mb5">
                     <div class="race-btn" @click="goToPage('Chapter1')">
@@ -112,7 +112,7 @@
 
                     <div class="race-btn">
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
-                        data-num="11">
+                            data-num="11">
                             <img :src="item.imgSrc3">
                             <img :src="item.imgSrc4" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }">
                         </button>
@@ -120,7 +120,37 @@
                     </div>
 
                 </div>
+
+                <button class="login-btn mt50" type="submit" style="width: 100%;" @click="finishSchedule"><img
+                        src="../../../resources/img/btn07_s.png" alt="" style="width: 100%; height: 100px;">
+                    <p>학습 종료하기</p>
+                </button>
+                <div class="complete-wrap smt50 myphoto">
+                    <h2 class="mb40">이 단원을 끝낸 친구들</h2>
+                    <article class=" flex-column" style="gap: 5px;">
+                        <div class="flex" style="gap: 5px;">
+                            <div @click="buttonSearch2" class="photo"><img src="../../../resources/img/img143_75s.png"
+                                    alt="">
+                            </div>
+                            <div @click="buttonSearch" class="photo"><img src="../../../resources/img/img143_75s.png"
+                                    alt="">
+                            </div>
+                        </div>
+                    </article>
+                    <!-- 팝업 -->
+                    <article class="popup-wrap" v-show="searchOpen">
+                        <div class="popup-box ">
+                            <div class="flex mb10  justify-between">
+                                <p class="popup-title">알림</p>
+                                <button type="button" class="popup-close-btn" @click="closeBtn2">
+                                    <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
+                                </button>
+                            </div>
+                        </div>
+                    </article>
+                </div>
             </div>
+
             <!-- 팝업 -->
             <div v-show="searchOpen2" class="popup-wrap">
                 <div class="popup-box">
@@ -129,162 +159,144 @@
                         <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
                     </button>
 
-                        <div class="mb30 text-ct">
-                            <p class="title1 mb20">1단원이 끝났습니다!</p>
-                            <p class="title1"><em class="yellow">기념사진</em>을 촬영하러 가요</p>
-                        </div>
-                        <div class="flex justify-center">
-                            <button type="button" title="사진촬영" class="new-btn" @click="openCameraModal">
-                                사진 촬영
-                            </button>
-                        </div>
+                    <div class="mb30 text-ct">
+                        <p class="title1 mb20">1단원이 끝났습니다!</p>
+                        <p class="title1"><em class="yellow">기념사진</em>을 촬영하러 가요</p>
+                    </div>
+                    <div class="flex justify-center">
+                        <button type="button" title="사진촬영" class="new-btn" @click="openCameraModal">
+                            사진 촬영
+                        </button>
                     </div>
                 </div>
+            </div>
 
-                <!-- 카메라 모달 -->
-                <article v-show="showCameraModal" class="popup-wrap">
-                    <div class="popup-box" style="top: 500px; left:500px">
-                        <div class="flex mb10 justify-between">
-                            <p class="popup-title">사진 촬영</p>
-                            <button type="button" class="popup-close-btn" @click="closeModal">
-                                <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
-                            </button>
-                        </div>
-                        <div class="box">
-                            <div style="width: 100%;">
-                                <div id="container" ref="container">
-                                    <video v-if="!photoTaken" autoplay="true" ref="modalVideoElement" class="mirrored"
-                                        @canplay="onVideoLoaded"></video>
-                                </div>
+            <!-- 카메라 모달 -->
+            <article v-show="showCameraModal" class="popup-wrap">
+                <div class="popup-box" style="top: 500px; left:500px">
+                    <div class="flex mb10 justify-between">
+                        <p class="popup-title">사진 촬영</p>
+                        <button type="button" class="popup-close-btn" @click="closeModal">
+                            <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
+                        </button>
+                    </div>
+                    <div class="box">
+                        <div style="width: 100%;">
+                            <div id="container" ref="container">
+                                <video v-if="!photoTaken" autoplay="true" ref="modalVideoElement" class="mirrored"
+                                    @canplay="onVideoLoaded"></video>
                             </div>
-                        </div>
-                        <div class="flex justify-center mt20">
-                            <button type="button" class="new-btn" v-if="!photoTaken" @click="capturePhoto"
-                                :disabled="!videoReady">
-                                사진 촬영
-                            </button>
                         </div>
                     </div>
-                </article>
+                    <div class="flex justify-center mt20">
+                        <button type="button" class="new-btn" v-if="!photoTaken" @click="capturePhoto"
+                            :disabled="!videoReady">
+                            사진 촬영
+                        </button>
+                    </div>
+                </div>
+            </article>
 
-                <!-- 사진 모달 -->
-                <article v-show="showPhotoModal" class="popup-wrap">
-                    <div class="popup-box" style="top: 500px; left: auto">
-                        <div class="flex mb10 justify-between">
-                            <p class="popup-title">사진 꾸미기</p>
-                            <button type="button" class="popup-close-btn" @click="closePhotoModal">
-                                <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
-                            </button>
-                        </div>
-                        <div class="flex justify-between align-center" style="gap: 40px;">
-                            <div class="content" style="padding: 30px; min-width: 401px; min-height: 710px;">
-                                <div class="tool">
-                                    <div class="flex justify-center mb20" style="gap: 20px;">
-                                        <button class="popTxt" style="width: 101px;" v-for="(item, index) in items_photo"
-                                            :key="index" @click="updateContent(index)"
-                                            :class="{ active: selectedIndex === index }">
-                                            <img :src="item.imgSrc1" style="display: block;">
-                                            <img :src="item.imgSrc2" v-if="selectedIndex === index" style="display: block;">
-                                        </button>
-                                    </div>
-                                </div>
-
-                                <div class="stickers" v-show="!stickersVisible">
-                                    <div class="toolbar">
-                                        <label for="brushSize" style="font-size: 9px;">펜 굵기</label>
-                                        <input type="color" v-model="color" />
-                                        <input type="range" id="brushSize" min="1" max="10" v-model="brushSize"
-                                            @input="updateBrushSize" style="width: 100px; margin-left: 5px;" />
-                                        <button class="new-btn" style="font-size: 9px;" @click="setTool('draw')">펜</button>
-                                        <button class="new-btn" style="font-size: 9px;" @click="setTool('eraser')">지우개</button>
-                                        <button class="new-btn" style="font-size: 9px;" @click="clearAll">전체 지우개</button>
-                                    </div>
-                                </div>
-
-                                <div class="stickers" v-show="stickersVisible">
-                                    <button><img src="../../../resources/img/img146_75s.png" alt=""></button>
-                                    <button><img src="../../../resources/img/img147_75s.png" alt=""></button>
-                                    <button><img src="../../../resources/img/img148_75s.png" alt=""></button>
-                                    <button><img src="../../../resources/img/img149_75s.png" alt=""></button>
-                                    <button><img src="../../../resources/img/img150_75s.png" alt=""></button>
-                                    <button><img src="../../../resources/img/img151_75s.png" alt=""></button>
-                                    <button><img src="../../../resources/img/img152_75s.png" alt=""></button>
-                                    <button><img src="../../../resources/img/img153_75s.png" alt=""></button>
-                                    <button><img src="../../../resources/img/img154_75s.png" alt=""></button>
-                                    <button><img src="../../../resources/img/img155_75s.png" alt=""></button>
-                                    <button><img src="../../../resources/img/img156_75s.png" alt=""></button>
-                                    <button><img src="../../../resources/img/img157_75s.png" alt=""></button>
-                                    <button><img src="../../../resources/img/img158_75s.png" alt=""></button>
+            <!-- 사진 모달 -->
+            <article v-show="showPhotoModal" class="popup-wrap">
+                <div class="popup-box" style="top: 500px; left: auto">
+                    <div class="flex mb10 justify-between">
+                        <p class="popup-title">사진 꾸미기</p>
+                        <button type="button" class="popup-close-btn" @click="closePhotoModal">
+                            <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
+                        </button>
+                    </div>
+                    <div class="flex justify-between align-center" style="gap: 40px;">
+                        <div class="content" style="padding: 30px; min-width: 401px; min-height: 710px;">
+                            <div class="tool">
+                                <div class="flex justify-center mb20" style="gap: 20px;">
+                                    <button class="popTxt" style="width: 101px;" v-for="(item, index) in items_photo"
+                                        :key="index" @click="updateContent(index)"
+                                        :class="{ active: selectedIndex === index }">
+                                        <img :src="item.imgSrc1" style="display: block;">
+                                        <img :src="item.imgSrc2" v-if="selectedIndex === index" style="display: block;">
+                                    </button>
                                 </div>
                             </div>
-                            <div>
-                                <div class="content" style="height: 549px; 
+
+                            <div class="stickers" v-show="!stickersVisible">
+                                <div class="toolbar">
+                                    <label for="brushSize" style="font-size: 9px;">펜 굵기</label>
+                                    <input type="color" v-model="color" />
+                                    <input type="range" id="brushSize" min="1" max="10" v-model="brushSize"
+                                        @input="updateBrushSize" style="width: 100px; margin-left: 5px;" />
+                                    <button class="new-btn" style="font-size: 9px;" @click="setTool('draw')">펜</button>
+                                    <button class="new-btn" style="font-size: 9px;"
+                                        @click="setTool('eraser')">지우개</button>
+                                    <button class="new-btn" style="font-size: 9px;" @click="clearAll">전체
+                                        지우개</button>
+                                </div>
+                            </div>
+
+                            <div class="stickers" v-show="stickersVisible">
+                                <button><img src="../../../resources/img/img146_75s.png" alt=""></button>
+                                <button><img src="../../../resources/img/img147_75s.png" alt=""></button>
+                                <button><img src="../../../resources/img/img148_75s.png" alt=""></button>
+                                <button><img src="../../../resources/img/img149_75s.png" alt=""></button>
+                                <button><img src="../../../resources/img/img150_75s.png" alt=""></button>
+                                <button><img src="../../../resources/img/img151_75s.png" alt=""></button>
+                                <button><img src="../../../resources/img/img152_75s.png" alt=""></button>
+                                <button><img src="../../../resources/img/img153_75s.png" alt=""></button>
+                                <button><img src="../../../resources/img/img154_75s.png" alt=""></button>
+                                <button><img src="../../../resources/img/img155_75s.png" alt=""></button>
+                                <button><img src="../../../resources/img/img156_75s.png" alt=""></button>
+                                <button><img src="../../../resources/img/img157_75s.png" alt=""></button>
+                                <button><img src="../../../resources/img/img158_75s.png" alt=""></button>
+                            </div>
+                        </div>
+                        <div>
+                            <div class="content" style="height: 549px; 
                                     position: relative;
                                     width: 973px; 
                                     display: flex; 
                                     justify-content: center; 
                                     align-items: center;">
-                                    <canvas ref="canvas" style="position: absolute;"></canvas>
-                                </div>
-                                <div class="btn-wrap flex justify-center mt40" style="gap: 40px;">
-                                    <button class="login-btn" @click="openCameraModal">
-                                        <img src="../../../resources/img/btn07_s.png" alt="">
-                                        <p>재촬영</p>
-                                    </button>
-
-                                    <button class="login-btn" type="submit" @click="goToPage('PhotoEdit')">
-                                        <img src="../../../resources/img/btn07_s.png" alt="">
-                                        <p>완성</p>
-                                    </button>
-                                </div>
+                                <canvas ref="canvas" style="position: absolute;"></canvas>
                             </div>
-                            <div class="content" style="padding: 30px; min-width: 401px; min-height: 710px;">
-                                <div class="mb20">
-                                    <p class="popup-title" style="font-size: 32px">랜덤 단어</p>
-                                </div>
-                                <div class="flex-column" style="gap: 10px;">
-                                    <button class="login-btn"><img src="../../../resources/img/img141_75s.png" alt="">
-                                        <p class="title">a</p>
-                                    </button>
-                                    <button class="login-btn"><img src="../../../resources/img/img152_75s_01.png" alt="">
-                                        <p class="title">a</p>
-                                    </button>
-                                    <button class="login-btn"><img src="../../../resources/img/img144_75s.png" alt="">
-                                        <p class="title" style="color: #fff;">a</p>
-                                    </button>
-                                    <button class="login-btn"><img src="../../../resources/img/img145_75s.png" alt="">
-                                        <p class="title mt20" style="color: #fff;">a</p>
-                                    </button>
-                                </div>
+                            <div class="btn-wrap flex justify-center mt40" style="gap: 40px;">
+                                <button class="login-btn" @click="openCameraModal">
+                                    <img src="../../../resources/img/btn07_s.png" alt="">
+                                    <p>재촬영</p>
+                                </button>
+
+                                <button class="login-btn" type="submit" @click="goToPage('PhotoEdit')">
+                                    <img src="../../../resources/img/btn07_s.png" alt="">
+                                    <p>완성</p>
+                                </button>
+                            </div>
+                        </div>
+                        <div class="content" style="padding: 30px; min-width: 401px; min-height: 710px;">
+                            <div class="mb20">
+                                <p class="popup-title" style="font-size: 32px">랜덤 단어</p>
+                            </div>
+                            <div class="flex-column" style="gap: 10px;">
+                                <button class="login-btn"><img src="../../../resources/img/img141_75s.png" alt="">
+                                    <p class="title">a</p>
+                                </button>
+                                <button class="login-btn"><img src="../../../resources/img/img152_75s_01.png" alt="">
+                                    <p class="title">a</p>
+                                </button>
+                                <button class="login-btn"><img src="../../../resources/img/img144_75s.png" alt="">
+                                    <p class="title" style="color: #fff;">a</p>
+                                </button>
+                                <button class="login-btn"><img src="../../../resources/img/img145_75s.png" alt="">
+                                    <p class="title mt20" style="color: #fff;">a</p>
+                                </button>
                             </div>
                         </div>
                     </div>
-                </article>
-            </div>
-        </div>
+                </div>
+            </article>
 
         </div>
-        <div class="complete-wrap mt90 myphoto">
-            <h2 class="mb40">이 단원을 끝낸 친구들</h2>
-            <article class=" flex-column" style="gap: 5px;">
-                <div class="flex" style="gap: 5px;">
-                    <div @click="buttonSearch2" class="photo"><img src="../../../resources/img/img143_75s.png" alt=""></div>
-                    <div @click="buttonSearch" class="photo"><img src="../../../resources/img/img143_75s.png" alt=""></div>
-                </div>
-            </article>
-            <!-- 팝업 -->
-            <article class="popup-wrap" v-show="searchOpen">
-                <div class="popup-box ">
-                    <div class="flex mb10  justify-between">
-                        <p class="popup-title">알림</p>
-                        <button type="button" class="popup-close-btn" @click="closeBtn2">
-                            <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
-                        </button>
-                    </div>
-                </div>
-            </article>
-        </div>
+
     </div>
+
 </template>
 
 <script>
@@ -350,11 +362,65 @@
             },
 
 
-            roadViewTF : false,
+            roadViewTF: false,
             roadmapData: [],
+
+            schedules: [],
+            nowSchedule: "",
+            state: ''
         }
     },
     methods: {
+        //은진
+        fetchSchedule() {
+            axios({
+                url: "/schedule/selectSchedule.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: {
+                    stdId: "2",
+                }
+            }).then(response => {
+                this.schedules = response.data;
+
+                if (this.schedules.length == 0) {
+                    this.state = ''
+                } else {
+                    this.nowSchedule = this.schedules.find(schedule => schedule.finish === null || schedule.finish === "");
+                    if (this.nowSchedule) {
+                        this.fetchRoadmapData(); // 진행 중인 스케줄이 있을 때 데이터를 가져오는 함수 호출
+                        this.state = 'studying'
+                    } else {
+                        this.state = 'finish'
+                    }
+                }
+            })
+                .catch(error => {
+                    console.error("Error fetching roadmap data:", error);
+                });
+        },
+        finishSchedule() {
+            axios({
+                url: "/schedule/scheduleUpdate.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: {
+                    scheduleId: this.nowSchedule.schdl_id,
+                    finish: "T"
+                }
+            })
+                .then(response => { 
+                    window.location.reload();
+                })
+                .catch(error => {
+                    console.error("Error fetching roadmap data:", error);
+                });
+        },
+
         fetchRoadmapData() {
             const vm = this;
             axios({
@@ -364,25 +430,25 @@
                     "Content-Type": "application/json; charset=UTF-8",
                 },
                 data: {
-                    unit_id: "UNIT_000000000000001",
-                    book_id: "BOOK_000000000000004"
+                    unit_id: this.schedules[0].unit_id,
+                    book_id: this.schedules[0].book_id
                 }
             })
-            .then(response => {
-                    console.log("roadmap - response : ", response.data);
-                    vm.roadmapData = response.data;
-                    vm.roadViewTF = vm.roadmapData.length > 0;
-            })
-            .catch(error => {
-                console.error("Error fetching roadmap data:", error);
-            });
+                .then(response => { 
+                    this.roadmapData = response.data;
+                    console.log(this.roadmapData)
+                    this.roadViewTF = vm.roadmapData.length > 0;
+                })
+                .catch(error => {
+                    console.error("Error fetching roadmap data:", error);
+                });
         },
         getNonNullColumn(item) {
             if (item.prblm_id !== null) return '문제';
             if (item.wd_book_id !== null) return '단어장';
             if (item.text_id !== null) return '지문';
             if (item.eval_id !== null) return '평가';
-        return '';
+            return '';
         },
         toggleImage(index) {
             this.items[index].isSecondImageVisible = !this.items[index].isSecondImageVisible;
@@ -769,7 +835,7 @@
             if (item.wd_book_id !== null) return '단어장';
             if (item.text_id !== null) return '지문';
             if (item.eval_id !== null) return '평가';
-            return ''; 
+            return '';
         },
         showConfirm(type) {
             let message = '';
@@ -791,7 +857,7 @@
     },
     mounted() {
         console.log('main mounted');
-        this.fetchRoadmapData();
+        this.fetchSchedule();
     },
     computed() {
 
Add a comment
List