jichoi / lms_front star
홍아랑 홍아랑 2024-08-12
240812 홍아랑 웹캠 관련 기능 추가 (이후 수정 필요)
@717c5fae3250c55adeb5ee00c5f1cb08ef2b9644
client/resources/css/reset.css
--- client/resources/css/reset.css
+++ client/resources/css/reset.css
@@ -80,20 +80,20 @@
     
 }
 html,
-body{height: 100%;  background-color: #eaedf4;}
+body{ background-color: #eaedf4;}
 body{position:relative;text-align: left; overflow-x: hidden; width: 1920px;}
 ::-webkit-scrollbar {width: 10px; height: 10px;}
 ::-webkit-scrollbar-track {border-radius: 5px;background-color: #EAEDF4;}
 ::-webkit-scrollbar-thumb {	border-radius: 5px; background-color: #FFBA08;}
 #root, #app{
-    height: 100%; 
+    /* height: 100%;  */
    }
 input, select, span,p, label {
     font-size: 16px;
 }
 input::placeholder{color: #8C8E92;}
 input[type="text"]{ padding:10px 20px; width: 100%; }
-
+input#file-upload-button{padding: 10px ;} 
   
 button{
     border: none;
@@ -112,4 +112,24 @@
 border: 0;}
 thead{background-color: #eaedf4;}
 tbody tr{border-bottom: #eaedf4 1px solid; cursor: pointer;}
-td{padding: 10px ; text-align: center;} 
(파일 끝에 줄바꿈 문자 없음)
+td{padding: 10px ; text-align: center;} 
+
+/* .btn-upload {
+    width: 100px;
+    height: 40px;
+    background: #f0f0f0;
+    border: 1px solid rgb(77,77,77);
+    font-weight: 500;
+    cursor: pointer;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    &:hover {
+      background: rgb(77,77,77);
+      color: #fff;
+    }
+  }
+  
+  #file {
+    display: none;
+  } */
(파일 끝에 줄바꿈 문자 없음)
client/resources/css/style.css
--- client/resources/css/style.css
+++ client/resources/css/style.css
@@ -277,7 +277,7 @@
   background-image: url('../img/img199_12p.png');
   width: 367px;
   height: 182px;
-  padding: 20px 46px 20px 31px;
+  padding: 20px 50px 20px 40px;
   color: #fff;
 }
 .mypage .textbook{font-family: 'ONEMobilePOPOTF';}
@@ -285,15 +285,17 @@
 .mypage .textbook .text {border-radius:  12px 12px 0px 0px; height: 68px;
 }
 .mypage .textbook .box{height: 199px; text-align: center; padding: 10px;}
-.mypage .textbook:nth-child(1) .text{background-color: #DB2B39;}
+.mypage .book-red .text{background-color: #DB2B39;}
 /* .mypage .textbook:nth-child(2) .text */
-.mypage .textbook:nth-child(3) .text{background-color:#2D7DD2;}
-.mypage .textbook:nth-child(4) .text{ background-color: #3066BE;}
-.mypage .textbook .box{height: 199px; text-align: center; padding: 10px;}
-.mypage .textbook:nth-child(1){border: #DB2B39 solid 6px;}
+.mypage .book-blue .text{background-color:#2D7DD2;}
+.mypage .book-navy .text{ background-color: #3066BE;}
+.mypage .book-gray > .text{ background-color: #F7F8F9;}
+.mypage .textbook .box{ text-align: center; padding: 10px;}
+.mypage .book-red{border: #DB2B39 solid 6px;}
 /* .mypage .textbook:nth-child(2) .text */
-.mypage .textbook:nth-child(3){border:#2D7DD2 solid 6px;}
-.mypage .textbook:nth-child(4){ border: #3066BE solid 6px;}
+.mypage .book-blue{border:#2D7DD2 solid 6px;}
+.mypage .book-navy{ border: #3066BE solid 6px;}
+.mypage .book-gray{ border: #8C8E92 solid 1px;}
 .mypage em.orange {
   color: #FFBA08;
 }
@@ -439,10 +441,15 @@
   width: 1063px;
 }
 
-.rabbit {
+.rabbit-start {
   position: absolute;
   top: -45px;
   left: 393px;
+}
+.rabbit-end {
+  position: absolute;
+  bottom: 24px;
+    right: 40px;
 }
 
 .rabbit img {
@@ -468,6 +475,13 @@
 .race-btn p.long {
   width: fit-content;
 }
+/* .popup-yellow{
+  background-image: url('../img/img139_72s.png');
+  min-width: 439px !important;
+  min-height: 244px !important;
+  background-color: transparent !important;
+  border: 0 !important;
+} */
 /* 사진촬영 */
 .camera{background-color: #000;}
 .camera .header{height: 110px; background-color: #eaedf4; padding: 0 60px;}
@@ -498,6 +512,20 @@
 .complete-wrap img{width: inherit;}
 .complete-wrap .photo{cursor: pointer; width: 200px; height: 130px; }
 /* 챕터 */
+.time-hint{
+  position: absolute;
+  top: 50px;
+  right: 50px;
+  text-align: center;
+}
+.hint-btn{
+  background-image: url('../img/btn01.png');
+  width: 110px;
+  height: 45px;
+  padding: 5px 20px;
+    font-size: 28px;
+    font-family: 'ONEMobilePOP';
+}
 .content-wrap {
   margin: 90px 60px 0 60px;
 
@@ -739,9 +767,6 @@
   width: 560px;
 }
 .time-bg{
-  position: absolute;
-  top: 50px;
-  right: 50px;
   text-align: center;
   font-family: 'neodgm'; background-image: url('../img/img55_s.png'); width: 110px; height: 128px;}
   .time-bg > div{position: relative;}
@@ -828,7 +853,7 @@
 .side_t{
   background-color: #fff;
   width: 360px;
-  height: 100%;
+  /* height: 100%; */
   padding: 25px 40px;
 }
 
@@ -847,7 +872,7 @@
     to { opacity:1; transform:translate3d(0, 0, 0); }
 }
 
-select{min-width: 128px; border-radius: 5px; padding: 10px 20px; font-size: 18px;}
+select{min-width: 128px; border-radius: 5px; padding: 10px 20px; font-size: 18px; }
 select option{font-size: 20px; font-weight: bold;}
 
 
@@ -860,7 +885,7 @@
 .class .member::before{content: ""; background-image: url('../img/img171_82t.png'); width: 20px; height: 22px; position: absolute; left: -28px;}
 .class .btnGroup, .textbook .text .btnGroup {width: initial;}
 .class button, .textbook button{font-size: 19px; font-family: 'Pretendard-Regular';}
-.textbook{width: 300px; border: #FFBA08 solid 6px; border-radius: 20px;  font-size: 19px;}
+.textbook{width: 100%; border: #FFBA08 solid 6px; border-radius: 20px;  font-size: 19px;}
 .textbook-add{width: 300px; height: 354px; background-color: #F8F9FB; border: #75767A solid 2px; border-radius: 20px;  font-size: 19px;}
 .textbook .box{height: 250px;}
 .textbook .text{height: 97px; background-color: #FFBA08; border-radius: 0px 0px 12px 12px; padding: 20px;}
@@ -915,7 +940,7 @@
     font-family: 'Pretendard-Bold';
 }
 .new-btn{
-  padding: 5px 20px;
+  padding: 10px 30px;
   font-size: 20px;
     font-family: 'Pretendard-Bold';
     border-radius: 5px;
@@ -1013,7 +1038,7 @@
     border: #FFBA08 solid 2px;
     cursor: pointer;
 }
-.bookmanage-btn:hover{background-color: #FFF3D7;}
+
 .hidden-tr {
   display: none;
 }
@@ -1025,4 +1050,41 @@
   background-color: #fff;
 
 }
+
+/* 로드맵 */
+.mypage .big{width: 48%; height: 100%;}
+.mypage .big > .text {
+  border-radius: 19px 19px 0px 0px; border-bottom: 1px solid #8C8E92;}
+  .mypage .big > .box{
+    overflow-x: auto;
+    margin: 4rem 3rem;
+    height: 100%;
+    max-height: calc(100% - 16rem);
+  }
+  .dropbox{
+    color: #8C8E92;
+    border: #8C8E92 dotted 1px;
+    background-color: #EAEDF4;
+    border-radius: 20px;
+    min-height: 20rem;
+  }
+  .dropbox p{line-height: 20rem;}
+
+
+  /* 단원 버튼 */
+ .unit-pagination button {
+    font-size: 2rem;
+    font-family: 'Pretendard-Regular';
+    padding: 5px 30px;
+    border: #c6c6c6 3px solid;
+    border-radius: 5px;
+    color: #331600;
+    background-color: #EAEDF4 
+}
+
+ .unit-pagination .selected-btn {
+    background-color:#c6c6c6;
+    /* color: #fff; */
+    font-family: 'Pretendard-ExtraBold';
+}
 /* ------------------------선생님 --------------------- */
(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/img222_57s.png (Binary) (added)
+++ client/resources/img/img222_57s.png
Binary file is not shown
client/views/layout/Header.vue
--- client/views/layout/Header.vue
+++ client/views/layout/Header.vue
@@ -102,7 +102,7 @@
 
       // 페이징 정보
       page: 1,
-      pageSize: 3,
+      pageSize: 2,
       totalpages: null,
 
       // 사용자 정보
client/views/layout/Side.vue
--- client/views/layout/Side.vue
+++ client/views/layout/Side.vue
@@ -4,7 +4,7 @@
         <div class="profile mb30">
             <div class="flex align-start">
                 <img src="../../resources/img/img16_s.png" alt="">
-                <div class="ml25" style="width: 100%;">
+                <div class="ml25" >
                     <p class="name mb10">학생이름</p>
                     <p class="mb5">xx중학교 3학년 x반</p>
                     <progress-bar :progress="progress"></progress-bar>
client/views/layout/Side_t.vue
--- client/views/layout/Side_t.vue
+++ client/views/layout/Side_t.vue
@@ -26,16 +26,17 @@
                     <router-link to="/Home.page" class="tpt">홈</router-link>
                     <router-link to="/Board.page" class="tpt">게시판</router-link>
                     <router-link to="/StudentList.page" class="tpt">학생목록</router-link>
-                    <router-link to="/textbook.page" class="tpt">교재</router-link>
+                    <router-link to="/C_Textbook.page" class="tpt">교재</router-link>
                 </details>
            </div>
             <div>
                 <details>
                     <summary>교재 관리</summary>
-                    <router-link to="/Board.page" class="tpt">홈</router-link>
-                    <router-link to="/Board.page" class="tpt">게시판</router-link>
-                    <router-link to="/Board.page" class="tpt">학생목록</router-link>
-                    <router-link to="/Board.page" class="tpt">교재</router-link>
+                    <router-link to="/textbook.page" class="tpt">홈</router-link>
+                    <router-link to="/TextList.page" class="tpt">지문</router-link>
+                    <router-link to="/QuestionList.page" class="tpt">문제</router-link>
+                    <router-link to="/VocaList.page" class="tpt">단어장</router-link>
+                    <router-link to="/ExamList.page" class="tpt">평가</router-link>
                 </details>
             </div>
         </div>
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -35,6 +35,7 @@
 import Chapter3_1 from "./main/Chapter/Chapter3_1.vue";
 import Chapter3_2 from "./main/Chapter/Chapter3_2.vue";
 import Chapter3_3 from "./main/Chapter/Chapter3_3.vue";
+import Chapter3_3_1 from "./main/Chapter/Chapter3_3_1.vue";
 import Chapter3_4 from "./main/Chapter/Chapter3_4.vue";
 import Chapter3_5 from "./main/Chapter/Chapter3_5.vue";
 import Chapter3_6 from "./main/Chapter/Chapter3_6.vue";
@@ -66,16 +67,32 @@
 import StudentList from "./teacher/StudentList.vue";
 import StudentDetail from "./teacher/StudentDetail.vue";
 import textbook from "./teacher/textbook.vue";
+import C_Textbook from "./teacher/C_Textbook.vue";
+import C_TextBookDetail from "./teacher/C_TextBookDetail.vue";
+import C_TextList from "./teacher/C_TextList .vue";
+import C_TextInsert from "./teacher/C_TextInsert.vue";
+import C_QuestionList from "./teacher/C_QuestionList.vue";
+import C_QuestionInsert from "./teacher/C_QuestionInsert.vue";
+import C_Voca_List from "./teacher/C_Voca_List.vue";
+import C_ExamList from "./teacher/C_ExamList.vue";
+import C_ExamDetail from "./teacher/C_ExamDetail.vue";
+import C_ExamInsert from "./teacher/C_ExamInsert.vue";
 import TextBookDetail from "./teacher/TextBookDetail.vue";
 import Home from "./teacher/Home.vue";
 import ClassDetail from "./teacher/ClassDetail.vue";
 import TextList from "./teacher/TextList.vue";
 import TextInsert from "./teacher/TextInsert.vue";
+import TextDetail from "./teacher/TextDetail.vue";
 import QuestionList from "./teacher/QuestionList.vue";
 import QuestionInsert from "./teacher/QuestionInsert.vue";
+import QuestionDetail from "./teacher/QuestionDetail.vue";
 import VocaList from "./teacher/VocaList.vue";
+import VocaInsert from "./teacher/VocaInsert.vue";
+import VocaDetail from "./teacher/VocaDetail.vue";
 import ExamList from "./teacher/ExamList.vue";
 import ExamDetail from "./teacher/ExamDetail.vue";
+import ExamInsert from "./teacher/ExamInsert.vue";
+import RoadMap from "./teacher/RoadMap.vue";
 
 const routes = [
     { path: '/login.page', name: 'login', component: login },
@@ -130,6 +147,7 @@
     { path: '/Chapter3_1.page', name: 'Chapter3_1', component: Chapter3_1 },
     { path: '/Chapter3_2.page', name: 'Chapter3_2', component: Chapter3_2 },
     { path: '/Chapter3_3.page', name: 'Chapter3_3', component: Chapter3_3 },
+    { path: '/Chapter3_3_1.page', name: 'Chapter3_3_1', component: Chapter3_3_1 },
     { path: '/Chapter3_4.page', name: 'Chapter3_4', component: Chapter3_4 },
     { path: '/Chapter3_5.page', name: 'Chapter3_5', component: Chapter3_5 },
     { path: '/Chapter3_6.page', name: 'Chapter3_6', component: Chapter3_6 },
@@ -167,15 +185,34 @@
             { path: '/ClassDetail.page', name: 'ClassDetail', component: ClassDetail },
             { path: '/StudentList.page', name: 'StudentList', component: StudentList },
             { path: '/StudentDetail.page', name: 'StudentDetail', component: StudentDetail },
+            { path: '/C_Textbook.page', name: 'C_Textbook', component: C_Textbook },
             { path: '/textbook.page', name: 'textbook', component: textbook },
             { path: '/TextBookDetail.page', name: 'TextBookDetail', component: TextBookDetail },
+            { path: '/C_TextBookDetail.page', name: 'C_TextBookDetail', component: C_TextBookDetail },
             { path: '/TextList.page', name: 'TextList', component: TextList },
             { path: '/TextInsert.page', name: 'TextInsert', component: TextInsert },
+            { path: '/TextDetail.page', name: 'TextDetail', component: TextDetail },
             { path: '/QuestionList.page', name: 'QuestionList', component: QuestionList },
             { path: '/QuestionInsert.page', name: 'QuestionInsert', component: QuestionInsert },
+            { path: '/QuestionDetail.page', name: 'QuestionDetail', component: QuestionDetail },
             { path: '/VocaList.page', name: 'VocaList', component: VocaList },
+            { path: '/VocaInsert.page', name: 'VocaInsert', component: VocaInsert },
+            { path: '/VocaDetail.page', name: 'VocaDetail', component: VocaDetail },
             { path: '/ExamList.page', name: 'ExamList', component: ExamList },
             { path: '/ExamDetail.page', name: 'ExamDetail', component: ExamDetail },
+            { path: '/ExamInsert.page', name: 'ExamInsert', component: ExamInsert },
+            { path: '/C_TextList.page', name: 'C_TextList', component: C_TextList },
+            { path: '/C_TextInsert.page', name: 'C_TextInsert', component: C_TextInsert },
+            { path: '/C_QuestionList.page', name: 'C_QuestionList', component: C_QuestionList },
+            { path: '/C_QuestionInsert.page', name: 'C_QuestionInsert', component: C_QuestionInsert },
+            { path: '/C_Voca_List.page', name: 'C_Voca_List', component: C_Voca_List },
+            { path: '/C_ExamList.page', name: 'C_ExamList', component: C_ExamList },
+            { path: '/C_ExamDetail.page', name: 'C_ExamDetail', component: C_ExamDetail },
+            { path: '/C_ExamInsert.page', name: 'C_ExamInsert', component: C_ExamInsert },
+            
+            { path: '/RoadMap.page', name: 'RoadMap', component: RoadMap },
+            
+            { path: '/TextDetail.page', name: 'TextDetail', component: TextDetail },
         ],
     },
 ];
client/views/pages/main/Chapter/Chapter3_1.vue
--- client/views/pages/main/Chapter/Chapter3_1.vue
+++ client/views/pages/main/Chapter/Chapter3_1.vue
@@ -15,14 +15,17 @@
         </div>
 
         <div class="flex align-center justify-center" style="gap: 113px;">
-          <div class="time-bg">
-              <div>
-                <div class="time">
-                  <p class="second">{{ timer }}</p>
-                  <p class="text">sec</p>
+         <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
                 </div>
               </div>
-            </div>
+         </div>
           <div class="pickGroup ">
             <div class="flex" style="gap: 250px;">
               <article  class="text-ct">
@@ -108,7 +111,6 @@
 
 .pickGroup button {
   position: relative;
-  margin-right: 30px;
 }
 
 .pickGroup button p {
client/views/pages/main/Chapter/Chapter3_10.vue
--- client/views/pages/main/Chapter/Chapter3_10.vue
+++ client/views/pages/main/Chapter/Chapter3_10.vue
@@ -15,14 +15,17 @@
             </div>
 
         <div class="text-ct">
-          <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
           <div class="imgGroup  mt20">
             <img src="../../../../resources/img/img116_59s.png" alt="">
             <p class="title1 mt10" style="width: auto;"><strong>진수가 거절한 제안</strong>은 무엇인지 우리말로 쓰세요.</p>
client/views/pages/main/Chapter/Chapter3_11.vue
--- client/views/pages/main/Chapter/Chapter3_11.vue
+++ client/views/pages/main/Chapter/Chapter3_11.vue
@@ -15,14 +15,17 @@
             </div>
 
         <div class="text-ct">
-          <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
           <div class="imgGroup  mt20">
             <img src="../../../../resources/img/img115_58s.png" alt="">
             <!-- <p class="title1 mt10"><strong>진수가 거절한 제안</strong>은 무엇인지 우리말로 쓰세요.</p> -->
client/views/pages/main/Chapter/Chapter3_12.vue
--- client/views/pages/main/Chapter/Chapter3_12.vue
+++ client/views/pages/main/Chapter/Chapter3_12.vue
@@ -15,14 +15,17 @@
             </div>
 
         <div class=" text-ct">
-          <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
           <div class="dragGroup mt40">
             <div class="flex justify-center" style="gap: 20px;">
               <button><img src="../../../../resources/img/img63_37s.png" alt="">
client/views/pages/main/Chapter/Chapter3_13.vue
--- client/views/pages/main/Chapter/Chapter3_13.vue
+++ client/views/pages/main/Chapter/Chapter3_13.vue
@@ -15,14 +15,17 @@
             </div>
 
         <div class="text-ct">
-          <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
          <div class="flex justify-center ">
            <div class=" flex justify-between align-center" style="width: 50%;">
               <div class="pickGroup left">
client/views/pages/main/Chapter/Chapter3_14.vue
--- client/views/pages/main/Chapter/Chapter3_14.vue
+++ client/views/pages/main/Chapter/Chapter3_14.vue
@@ -15,14 +15,17 @@
             </div>
 
         <div class="text-ct">
-          <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
           <div class="imgGroup"><img src="../../../../resources/img/img124_63s.png" alt=""></div>
           
           <div class="dropGroup flex align-center justify-center mt30">
client/views/pages/main/Chapter/Chapter3_15.vue
--- client/views/pages/main/Chapter/Chapter3_15.vue
+++ client/views/pages/main/Chapter/Chapter3_15.vue
@@ -9,39 +9,33 @@
       <div class="content title-box">
         <p class="title mt25 title-bg">step3</p>
         <div class="flex align-center mb30">
-               <p class="subtitle2 mr20">그림에 알맞는 낱말을 쓰세요.</p>
-               <!-- <button><img src="../../../../resources/img/btn10_s.png" alt="">
-               </button> -->
+               <p class="subtitle2 mr20">듣고 올바른 대답을 말해보세요!</p>
+               <button><img src="../../../../resources/img/btn10_s.png" alt="">
+               </button>
             </div>
 
         <div class="text-ct">
-          <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
           <div class="imgGroup"><img src="../../../../resources/img/img125_64s.png" alt=""></div>
           
           <div class="dropGroup flex align-center justify-center mt30">
-            <div class="flex" style="gap: 20px;">
-              <div class="bd-bt textbox" @click="showButton(1)">
-                <p v-if="showButton1">A</p></div>
-              <div class="bd-bt textbox" @click="showButton(2)">
-                <p v-if="showButton2">A</p></div>
-              <div class="bd-bt textbox" @click="showButton(3)">
-                <p v-if="showButton3">A</p></div>
-              <div class="bd-bt textbox" @click="showButton(4)">
-                <p v-if="showButton4">A</p></div>
-            </div>
+            <img src="../../../../resources/img/btn18_64s_normal.png" alt="">
 
           </div>
 
         </div>
       </div>
-      <div class="next-btn" @click="goToPage('Chapter3_16')"><img src="../../../../resources/img/right.png" alt=""></div>
+      <div class="next-btn" @click="goToPage('Chapter4')"><img src="../../../../resources/img/right.png" alt=""></div>
     </div>
   </div>
 </template>
client/views/pages/main/Chapter/Chapter3_16.vue
--- client/views/pages/main/Chapter/Chapter3_16.vue
+++ client/views/pages/main/Chapter/Chapter3_16.vue
@@ -5,7 +5,7 @@
       <span class="subtitle">my name is dd</span>
     </div>
     <div class="flex justify-between align-center">
-      <div class="pre-btn" @click="goToPage('Chapter3_15')"><img src="../../../../resources/img/left.png" alt=""></div>
+      <div class="pre-btn" @click="goToPage('Chapter4')"><img src="../../../../resources/img/left.png" alt=""></div>
       <div class="content title-box">
         <p class="title mt25 title-bg">중간 평가 설문 조사</p>
         <div class="flex align-center mb30">
client/views/pages/main/Chapter/Chapter3_2.vue
--- client/views/pages/main/Chapter/Chapter3_2.vue
+++ client/views/pages/main/Chapter/Chapter3_2.vue
@@ -15,14 +15,17 @@
         </div>
 
         <div class="text-ct">
-          <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
           <div class="imgGroup ">
             <img src="../../../../resources/img/img109_51s.png" alt="">  
           </div>
client/views/pages/main/Chapter/Chapter3_3.vue
--- client/views/pages/main/Chapter/Chapter3_3.vue
+++ client/views/pages/main/Chapter/Chapter3_3.vue
@@ -13,14 +13,17 @@
         </div>
 
         <div class="text-ct">
-          <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
           <div class="pickGroup mt60 flex align-center justify-center" style="gap: 100px; margin-top: 7%;">
             <article style="gap: 60px; bottom: 159px;
     left: 242px;">
@@ -43,7 +46,7 @@
           </div>
         </div>
       </div>
-      <div class="next-btn" @click="goToPage('Chapter3_4')"><img src="../../../../resources/img/right.png" alt=""></div>
+      <div class="next-btn" @click="goToPage('Chapter3_3_1')"><img src="../../../../resources/img/right.png" alt=""></div>
     </div>
   </div>
 </template>
 
client/views/pages/main/Chapter/Chapter3_3_1.vue (added)
+++ client/views/pages/main/Chapter/Chapter3_3_1.vue
@@ -0,0 +1,150 @@
+<template>
+  <div id="Chapter1_1" class="content-wrap">
+    <div class="title-box mb25 flex align-center mt40">
+      <span class="title mr40">1. Hello WORLD</span>
+      <span class="subtitle">my name is dd</span>
+    </div>
+    <div class="flex justify-between align-center">
+      <div class="pre-btn" @click="goToPage('Chapter3_3')"><img src="../../../../resources/img/left.png" alt=""></div>
+      <div class="content title-box">
+        <p class="title mt25 title-bg">step3.</p>
+        <div class="flex align-center mb30">
+          <p class="subtitle2 mr20">1. see the picture</p>
+          <button><img src="../../../../resources/img/btn10_s.png" alt="">
+          </button>
+        </div>
+
+        <div class="text-ct">
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
+              </div>
+         </div>
+          <div class="imgGroup ">
+            <img src="../../../../resources/img/img109_51s.png" alt="">  
+          </div>
+          
+          <div class="pickGroup mt60 flex align-center justify-center" style="gap: 100px; margin-top: 7%;">
+            <article style="gap: 60px; bottom: 159px;
+    left: 242px;">
+              <div class="flex align-center">
+                <button><img src="../../../../resources/img/img136_71s.png" alt="">
+                  <p>1</p>
+                </button>
+                <img src="../../../../resources/img/img122_62s.png" alt="">
+              </div>
+            </article>
+            <article style="gap: 60px; bottom: 159px;
+    right: 559px;">
+             <div class="flex align-center">
+                <button><img src="../../../../resources/img/img136_71s.png" alt="">
+                  <p>2</p>
+                </button>
+                <img src="../../../../resources/img/img123_62s.png" alt="">
+             </div>
+            </article>
+            <article style="gap: 60px; bottom: 159px;
+    right: 559px;">
+             <div class="flex align-center">
+                <button><img src="../../../../resources/img/img136_71s.png" alt="">
+                  <p>3</p>
+                </button>
+                <img src="../../../../resources/img/img121_62s.png" alt="">
+             </div>
+            </article>
+          </div>
+        </div>
+      </div>
+      <div class="next-btn" @click="goToPage('Chapter3_4')"><img src="../../../../resources/img/right.png" alt=""></div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      timer: '00'
+    }
+  },
+  methods: {
+    goToPage(page) {
+      this.$router.push({ name: page });
+    },
+    startTimer() {
+      if (this.intervalId) {
+        clearInterval(this.intervalId);
+      }
+      this.timer = 5;
+      this.intervalId = setInterval(() => {
+        if (this.timer > 0) {
+          this.timer--;
+        } else {
+          clearInterval(this.intervalId);
+        }
+      }, 1000);
+    }
+  },
+  watch: {
+
+  },
+  computed: {
+
+  },
+  components: {
+  },
+  mounted() {
+
+  }
+}
+</script>
+<style scoped>
+.inputbox {
+  font-size: 38px;
+  font-family: 'Pretendard-ExtraBold';
+}
+
+.imgGroup button {
+  position: relative;
+}
+
+.imgGroup button p,
+.textbox p {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  width: fit-content;
+  height: fit-content;
+  background: #ffffffb8;
+  border-radius: 5px;
+  padding: 10px;
+  font-size: 48px;
+  font-family: 'ONEMobilePOP';
+}
+
+.pickGroup p {
+  font-size: 34px;
+  font-weight: bold;
+}
+
+.pickGroup button {
+  position: relative;
+  margin-right: 30px;
+}
+
+.pickGroup button p {
+  font-size: 34px;
+  color: #c6c6c6;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+}
+</style>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/main/Chapter/Chapter3_4.vue
--- client/views/pages/main/Chapter/Chapter3_4.vue
+++ client/views/pages/main/Chapter/Chapter3_4.vue
@@ -5,7 +5,7 @@
       <span class="subtitle">my name is dd</span>
     </div>
     <div class="flex justify-between align-center">
-      <div class="pre-btn" @click="goToPage('Chapter3_3')"><img src="../../../../resources/img/left.png" alt=""></div>
+      <div class="pre-btn" @click="goToPage('Chapter3_3_1')"><img src="../../../../resources/img/left.png" alt=""></div>
       <div class="content title-box">
         <p class="title mt25 title-bg">step3.</p>
         <div class="flex align-center mb30">
@@ -15,14 +15,17 @@
             </div>
 
         <div class="text-ct">
-          <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
           <div class="pickGroup flex align-center justify-center" style="gap: 100px; margin-top: 7%;">
             <article style="gap: 60px; bottom: 159px;
     left: 242px;">
client/views/pages/main/Chapter/Chapter3_5.vue
--- client/views/pages/main/Chapter/Chapter3_5.vue
+++ client/views/pages/main/Chapter/Chapter3_5.vue
@@ -15,14 +15,17 @@
         </div>
 
         <div class=" text-ct">
-          <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
           <div class="imgGroup ">
             <img src="../../../../resources/img/img125_64s.png" alt="">  
           </div>
client/views/pages/main/Chapter/Chapter3_6.vue
--- client/views/pages/main/Chapter/Chapter3_6.vue
+++ client/views/pages/main/Chapter/Chapter3_6.vue
@@ -14,14 +14,17 @@
                <button><img src="../../../../resources/img/btn10_s.png" alt="">
                </button>
             </div>
-            <div class="time-bg">
-               <div>
+            <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
                   <div class="time">
-                     <p class="second">{{ timer }}</p>
-                     <p class="text">sec</p>
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
                   </div>
-               </div>
-            </div>
+                </div>
+              </div>
+         </div>
             
             <div class="imgGroup">
                <img src="../../../../resources/img/img114_57s.png" alt="">
client/views/pages/main/Chapter/Chapter3_7.vue
--- client/views/pages/main/Chapter/Chapter3_7.vue
+++ client/views/pages/main/Chapter/Chapter3_7.vue
@@ -15,16 +15,19 @@
             </div>
 
         <div class="text-ct">
-          <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
           
-          <div class="pickGroup flex align-center justify-between" style="gap: 100px;">
+          <div class="pickGroup flex align-center justify-between mt80" style="gap: 100px;">
             <p>1. 문제</p>
             <div class="flex justify-center" style="gap: 60px;">
               <article >
client/views/pages/main/Chapter/Chapter3_8.vue
--- client/views/pages/main/Chapter/Chapter3_8.vue
+++ client/views/pages/main/Chapter/Chapter3_8.vue
@@ -15,14 +15,17 @@
             </div>
   
           <div class="text-ct">
-            <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+            <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
           <div class="imgGroup flex align-center justify-center mt50">
             <img src="../../../../resources/img/img114_57s.png" alt="">
                <input class="yellow-bd ml50" style="width: 30%;" type="text" name="" id="" placeholder="답을 입력하세요.">
client/views/pages/main/Chapter/Chapter3_9.vue
--- client/views/pages/main/Chapter/Chapter3_9.vue
+++ client/views/pages/main/Chapter/Chapter3_9.vue
@@ -15,14 +15,17 @@
             </div>
 
         <div class="mt50 text-ct">
-          <div class="time-bg">
-            <div>
-              <div class="time">
-                <p class="second">{{ timer }}</p>
-                <p class="text">sec</p>
+          <div class="time-hint">
+          <button class="hint-btn">HINT</button>
+            <div class="time-bg mt20">
+                <div>
+                  <div class="time">
+                    <p class="second">{{ timer }}</p>
+                    <p class="text">sec</p>
+                  </div>
+                </div>
               </div>
-            </div>
-          </div>
+         </div>
           <div class="imgGroup  mt50">
             <img src="../../../../resources/img/img115_58s.png" alt="">
             <div class=" mt50">
client/views/pages/main/Chapter/Chapter4.vue
--- client/views/pages/main/Chapter/Chapter4.vue
+++ client/views/pages/main/Chapter/Chapter4.vue
@@ -102,7 +102,7 @@
 
                 </div>
             </div>
-            <div class="next-btn" @click="goToPage('Dashboard')"><img src="../../../../resources/img/right.png" alt="">
+            <div class="next-btn" @click="goToPage('Chapter3_16')"><img src="../../../../resources/img/right.png" alt="">
             </div>
         </div>
     </div>
client/views/pages/main/Dashboard.vue
--- client/views/pages/main/Dashboard.vue
+++ client/views/pages/main/Dashboard.vue
@@ -6,7 +6,7 @@
                 <p class="subtitle">hi my name is dd!</p>
             </div>
             <div class="race-box">
-                <div class="rabbit"><img src="../../../resources/img/img09_s.png" alt=""></div>
+                <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')">
                         <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
@@ -262,6 +262,7 @@
             <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>
@@ -270,7 +271,7 @@
                 <div class="popup-box ">
                     <div class="flex mb10  justify-between">
                         <p class="popup-title">알림</p>
-                        <button type="button" class="popup-close-btn" @click="closeBtn">
+                        <button type="button" class="popup-close-btn" @click="closeBtn2">
                             <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
                         </button>
                     </div>
@@ -436,6 +437,9 @@
         buttonSearch() {
             this.searchOpen = true;
         },
+        buttonSearch2() {
+            this.searchOpen2 = true;
+        },
         closeBtn() {
             this.searchOpen = false;
         },
client/views/pages/main/MyPage.vue
--- client/views/pages/main/MyPage.vue
+++ client/views/pages/main/MyPage.vue
@@ -74,7 +74,7 @@
         </div>
         <div class=" mb30">
             <div class=" flex " style="gap: 50px;">
-                <div class="textbook">
+                <div class="textbook book-red">
                     <div class="text ">
                         <p class="title1" style="color: #fff;">포토북 랭킹</p>
                     </div>
@@ -83,7 +83,7 @@
                         <P class="title2 mt10">현재 30명 중 <em class="red">2등</em>입니다.</P>
                     </div>
                 </div>
-                <div class="textbook">
+                <div class="textbook ">
                     <div class="text ">
                         <p class="title1" style="color: #fff;">포토북 랭킹</p>
                     </div>
@@ -92,7 +92,7 @@
                         <P class="title2 mt10">현재 30명 중 <em class="yellow">2등</em>입니다.</P>
                     </div>
                 </div>
-                <div class="textbook">
+                <div class="textbook book-blue">
                     <div class="text ">
                         <p class="title1" style="color: #fff;">포토북 랭킹</p>
                     </div>
@@ -101,7 +101,7 @@
                         <P class="title2 mt10">현재 30명 중 <em class="blue">2등</em>입니다.</P>
                     </div>
                 </div>
-                <div class="textbook">
+                <div class="textbook book-navy">
                     <div class="text ">
                         <p class="title1" style="color: #fff;">포토북 랭킹</p>
                     </div>
@@ -172,4 +172,7 @@
 }
 </script>
 <style scoped>
+.mypage .textbook {
+    width: 22%;
+}
 </style>
(파일 끝에 줄바꿈 문자 없음)
client/views/pages/teacher/Board.vue
--- client/views/pages/teacher/Board.vue
+++ client/views/pages/teacher/Board.vue
@@ -1,8 +1,14 @@
 <template>
   <div class="title-box flex justify-between mb40">
     <p class="title">게시판</p>
-    <select name="" id="">
-      <option value="">A반</option>
+    <select v-model="sclsId" @change="handleClassId()">
+      <option
+        v-for="(item, index) in classList"
+        :key="index"
+        :value="item.sclsId"
+      >
+        {{ item.sclsNm }}
+      </option>
     </select>
   </div>
   <div class="search-wrap flex justify-end mb20">
@@ -38,11 +44,11 @@
           :class="{ 'selected-row': selectedRow == item.dataList }"
           @click="[goToPage('noticeDetail'), selectBoardList(item)]"
         >
-          <td>{{ totalBoard - index }}</td>
+          <td>{{ createNo(index) }}</td>
           <td>{{ item.bbsTtl }}</td>
           <td>{{ item.bbsCls }}</td>
           <td>{{ userNm }}</td>
-          <td>{{ item.bbsTm }}</td>
+          <td>{{ item.bbsTm.substr(0, 16) }}</td>
         </tr>
       </tbody>
     </table>
@@ -50,22 +56,19 @@
       class="table-pagination flex justify-center align-center mb20 mt30"
       style="gap: 10px"
     >
-      <button>
-        <img
-          src="../../../resources/img/btn27_90t_normal.png"
-          alt=""
-          @click="previousPage"
-          :disabled="page === 1"
-        />
+      <button @click="goToPagination(currentPage - 1)">
+        <img src="../../../resources/img/btn27_90t_normal.png" alt="" />
       </button>
-      <button class="selected-btn">{{ page }}</button>
-      <button>
-        <img
-          src="../../../resources/img/btn28_90t_normal.png"
-          alt=""
-          @click="nextPage"
-          :disabled="page === totalPages"
-        />
+      <button
+        v-for="page in paginationButtons"
+        :key="page"
+        @click="goToPagination(page - 1)"
+        :class="{ 'selected-btn': currentPage === page - 1 }"
+      >
+        {{ page }}
+      </button>
+      <button @click="goToPagination(currentPage + 1)">
+        <img src="../../../resources/img/btn28_90t_normal.png" alt="" />
       </button>
     </article>
     <div class="flex justify-end">
@@ -93,20 +96,24 @@
 
       // 게시글 정보
       dataList: [],
-      totalBoard: null,
+      totalPosts: 0,
       selectedRow: "",
+      bbsTm: "",
 
       // 페이징
-      page: 1,
-      pageSize: 8,
-      totalPages: null,
+      currentPage: 0,
+      itemsPerPage: 8,
 
       // 반 아이디 (추후 세션에서 받는걸로 수정)
-      sclsId: "1",
+      sclsId: "",
+      classList: [],
 
+      userId: "",
       // 검색어
       searchKeyword: "",
       selectedSearchOption: "bbsTtl",
+
+      selected: null,
     };
   },
   methods: {
@@ -131,39 +138,44 @@
     // 게시글 전체 조회
     boardList() {
       const vm = this;
+      vm.sclsId = JSON.parse(sessionStorage.getItem("sclsId"));
       axios({
         url: "/board/findAll.json",
         method: "post",
         headers: {
           "Content-Type": "application/json; charset=UTF-8",
         },
-        data: { page: vm.page, pageSize: vm.pageSize, sclsId: vm.sclsId },
+        data: {
+          page: vm.currentPage + 1,
+          pageSize: vm.itemsPerPage,
+          sclsId: vm.sclsId,
+        },
       })
         .then(function (res) {
           console.log("dataList - response : ", res.data);
-          console.log(res.data.result[0].boardClass[0].board);
-
-          vm.dataList = res.data.result[0].boardClass[0].board;
-          vm.userNm = res.data.result[0].userNm;
-          vm.userId = res.data.result[0].userId;
-          vm.totalBoard = res.data.totalBoard;
-          vm.totalPages = Math.ceil(vm.totalBoard / vm.pageSize);
+          if (res.data.result.length !== 0) {
+            vm.dataList = res.data.result[0].boardClass[0].board;
+            vm.userNm = res.data.result[0].userNm;
+            vm.userId = res.data.result[0].userId;
+            vm.totalPosts = res.data.totalBoard;
+            vm.selectClass();
+            sessionStorage.removeItem("bbsId");
+            sessionStorage.removeItem("file");
+          } else {
+            vm.selectClass();
+          }
         })
         .catch(function (error) {
-          console.log("result - error : ", error);
-          alert("비상 비상!");
+          console.log("boardListError - error : ", error);
         });
     },
 
     // 게시글 정보 세션에 저장
     selectBoardList(item) {
-      sessionStorage.setItem("selectedBoardList", JSON.stringify(item));
+      sessionStorage.setItem("bbsId", JSON.stringify(item.bbsId));
     },
 
     // 반 아이디 세션에 저장
-    setClassId() {
-      sessionStorage.setItem("sclsId", JSON.stringify(this.sclsId));
-    },
 
     // 게시글 검색
     boardDataSearch() {
@@ -171,8 +183,8 @@
       let searchPayload = {
         keyword: vm.searchKeyword,
         option: vm.selectedSearchOption,
-        page: vm.page,
-        pageSize: vm.pageSize,
+        page: vm.currentPage,
+        pageSize: vm.itemsPerPage,
         sclsId: vm.sclsId,
       };
       axios({
@@ -188,7 +200,7 @@
           vm.dataList = res.data.result[0].boardClass[0].board;
           vm.userNm = res.data.result[0].userNm;
           vm.userId = res.data.result[0].userId;
-          vm.totalBoard = res.data.totalBoard;
+          vm.totalPosts = res.data.totalBoard;
         })
         .catch(function (error) {
           console.log("dataSearch - error : ", error);
@@ -196,29 +208,70 @@
         });
     },
 
-    previousPage() {
-      if (this.page > 1) {
-        this.page -= 1;
-        this.boardList();
-      }
+    // 반 조회
+    selectClass() {
+      const vm = this;
+      axios({
+        url: "/classes/selectClass.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          userId: vm.userId,
+        },
+      })
+        .then(function (res) {
+          console.log("classData - response : ", res.data);
+          vm.classList = res.data.data;
+          vm.selected = res.data.data.sclsId;
+        })
+        .catch(function (error) {
+          console.log("classData - error : ", error);
+        });
+    },
+    handleClassId() {
+      sessionStorage.setItem("sclsId", JSON.stringify(this.sclsId));
+      this.boardList();
     },
 
-    nextPage() {
-      if (this.page < this.totalPages) {
-        this.page += 1;
-        this.boardList();
+    createNo(index) {
+      return this.totalPosts - (this.currentPage * this.itemsPerPage + index);
+    },
+
+    goToPagination(page) {
+      if (page < 0 || page >= this.totalPages) {
+        return;
       }
+      this.currentPage = page;
+      this.boardList();
     },
   },
   watch: {},
-  computed: {},
+  computed: {
+    totalPages() {
+      return Math.ceil(this.totalPosts / this.itemsPerPage);
+    },
+    paginationButtons() {
+      let start = Math.max(0, this.currentPage - 2);
+      let end = Math.min(start + 5, this.totalPages);
+
+      if (end - start < 5) {
+        start = Math.max(0, end - 5);
+      }
+
+      return Array.from({ length: end - start }, (_, i) => start + i + 1);
+    },
+    startIndex() {
+      return this.currentPage * this.itemsPerPage;
+    },
+  },
   components: {
     SvgIcon,
   },
   mounted() {
     console.log("Main2 mounted");
     this.boardList();
-    this.setClassId();
   },
 };
 </script>
 
client/views/pages/teacher/C_ExamDetail.vue (added)
+++ client/views/pages/teacher/C_ExamDetail.vue
@@ -0,0 +1,93 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">문제 상세 페이지</p>
+    </div>
+    <label for="" class="title1">문제 리스트</label>
+    <table class="mt20 mb100">
+        <colgroup>
+            <col style="width: 10%;">
+            <col style="width: 70%;">
+            <col style="width: 20%;">
+        </colgroup>
+        <thead>
+            <td>No.</td>
+            <td>문제</td>
+            <td>보기</td>
+        </thead>
+        <tbody>
+            <tr>
+                <td>1</td>
+                <td>1</td>
+                <td><button type="button" title="수정" class="new-btn">
+                        수정
+                    </button></td>
+            </tr>
+        </tbody>
+    </table>
+    <label for="" class="title1">상세 내용</label>
+    <div class="board-wrap mt20">
+        <div class="flex align-center mb20">
+            <label for="" class="title2">문제</label>
+            <input type="text" class="data-wrap">
+        </div>
+
+        <hr>
+        <div class="flex align-center">
+            <label for="" class="title2">내용</label>
+            <textarea name="" id="" class="data-wrap"></textarea>
+        </div>
+        <hr>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">첨부파일</label>
+            <input type="file" ref="fileInput" @change="handleFileUpload" />
+        </div>
+        <div class="flex align-center">
+            <label for="" class="title2">답</label>
+            <input type="text" class="data-wrap">
+        </div>
+    </div>
+    <div class="flex justify-between mt50">
+        <button type="button" title="글쓰기" class="new-btn" @click="goToPage('ExamList')">
+            목록
+        </button>
+        <div class="flex">
+            <button type="button" title="글쓰기" class="new-btn mr10">
+                수정
+            </button>
+            <button type="button" title="글쓰기" class="new-btn">
+                삭제
+            </button>
+        </div>
+    </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify } from '@mdi/js';
+
+
+export default {
+    data() {
+        return {
+            mdiMagnify: mdiMagnify,
+        }
+    },
+    methods: {
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        SvgIcon
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/teacher/C_ExamInsert.vue (added)
+++ client/views/pages/teacher/C_ExamInsert.vue
@@ -0,0 +1,93 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">문제 등록 페이지</p>
+    </div>
+    <!-- <label for="" class="title1">문제 리스트</label>
+    <table class="mt20 mb100">
+        <colgroup>
+            <col style="width: 10%;">
+            <col style="width: 70%;">
+            <col style="width: 20%;">
+        </colgroup>
+        <thead>
+            <td>No.</td>
+            <td>문제</td>
+            <td>보기</td>
+        </thead>
+        <tbody>
+            <tr>
+                <td>1</td>
+                <td>1</td>
+                <td><button type="button" title="수정" class="new-btn">
+                        수정
+                    </button></td>
+            </tr>
+        </tbody>
+    </table> -->
+    <label for="" class="title1">상세 내용</label>
+    <div class="board-wrap mt20">
+        <div class="flex align-center mb20">
+            <label for="" class="title2">문제</label>
+            <input type="text" class="data-wrap">
+        </div>
+
+        <hr>
+        <div class="flex align-center">
+            <label for="" class="title2">내용</label>
+            <textarea name="" id="" class="data-wrap"></textarea>
+        </div>
+        <hr>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">첨부파일</label>
+            <input type="file" ref="fileInput" @change="handleFileUpload" />
+        </div>
+        <div class="flex align-center">
+            <label for="" class="title2">답</label>
+            <input type="text" class="data-wrap">
+        </div>
+    </div>
+    <div class="flex justify-between mt50">
+        <button type="button" title="글쓰기" class="new-btn" @click="goToPage('C_ExamList')">
+            목록
+        </button>
+        <div class="flex">
+            <button type="button" title="글쓰기" class="new-btn mr10">
+                취소
+            </button>
+            <button type="button" title="글쓰기" class="new-btn">
+                등록
+            </button>
+        </div>
+    </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify } from '@mdi/js';
+
+
+export default {
+    data() {
+        return {
+            mdiMagnify: mdiMagnify,
+        }
+    },
+    methods: {
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        SvgIcon
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/teacher/C_ExamList.vue (added)
+++ client/views/pages/teacher/C_ExamList.vue
@@ -0,0 +1,150 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">평가</p>
+        <select name="" id="">
+            <option value="">1단원</option>
+        </select>
+    </div>
+    <div class="search-wrap flex justify-end mb20">
+            <select name="" id="" class="mr10 data-wrap">
+                <option value="">중간</option>
+                <option value="">최종</option>
+            </select>
+            <select name="" id="" class="mr10 data-wrap">
+                <option value="">전체</option>
+            </select>
+                <input  type="text" placeholder="검색하세요.">
+                <button type="button" title="위원회 검색">
+                    <img src="../../../resources/img/look_t.png" alt="">
+                </button>
+        </div>
+        <div class="table-wrap">
+            <table>
+                <thead>
+                    <td>No.</td>
+                    <td>제목</td>
+                    <td>중간/최종</td>
+                    <td>작성자</td>
+                    <td>문항</td>
+                    <td>보기</td>
+                    <td>등록일</td>
+                </thead>
+                <tbody>
+                    <tr>
+                        <td></td>
+                        <td></td>
+                        <td></td>
+                        <td></td>
+                        <td></td>
+                        <td><button type="button" title="보기" class="new-btn" @click="goToPage('C_ExamDetail')">
+                    보기
+                </button></td>
+                        <td></td>
+                    </tr>
+                    <!-- <tr :class="{ 'hidden-tr': !isRowVisible }" class="show-tr">
+                        <td colspan="7">
+                            <div>
+                                <table>
+                                    <colgroup>
+                                        <col style="width: 10%;">
+                <col style="width: 70%;">
+                <col style="width: 20%;">
+                                    </colgroup>
+                                    <thead>
+                                        <td>No.</td>
+                                        <td>문제</td>
+                                        <td></td>
+                                    </thead>
+                                    <tbody>
+                                        <tr>
+                                            <td>1</td>
+                                            <td>1</td>
+                                            <td><button type="button" title="수정" class="new-btn"  @click="goToPage('ExamDetail')">
+                    수정
+                </button></td>
+                                        </tr>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </td>
+                    </tr> -->
+                </tbody>
+            </table>
+            <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;">
+                    <button><img src="../../../resources/img/btn27_90t_normal.png" alt=""></button>
+                    <button class="selected-btn">1</button>
+                    <button>2</button>
+                    <button>3</button>
+                    <button><img src="../../../resources/img/btn28_90t_normal.png" alt=""></button>
+                </article>
+                <div class="flex justify-end ">
+                <button type="button" title="등록" class="new-btn" @click="goToPage('C_ExamInsert')">
+                    등록
+                </button>
+        </div>
+        </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify, mdiWindowClose} from '@mdi/js';
+
+
+export default {
+    data () {
+        return {
+            mdiMagnify: mdiMagnify,
+            mdiWindowClose: mdiWindowClose,
+            showModal: false,
+            searchOpen: false,
+            isRowVisible: false
+        }
+    },
+    methods: {
+        toggleRow() {
+                    this.isRowVisible = !this.isRowVisible;
+                },
+        goToPage(page) {
+         this.$router.push({ name: page });
+      },
+      showConfirm(type) {
+            let message = '';
+            if (type === 'cancel') {
+                message = '삭제하시겠습니까?';
+            } else if (type === 'reset') {
+                message = '초기화하시겠습니까?';
+            } else if (type === 'save') {
+                message = '등록하시겠습니까?';
+            }
+
+            if (confirm(message)) {
+                this.goBack();
+            }
+        },
+        
+        closeModal() {
+            this.showModal = false;
+        },
+        buttonSearch() {
+            this.searchOpen = true;
+        },
+        closeBtn() {
+            this.searchOpen = false;
+
+        },
+
+    },
+    watch: {
+
+    },
+    computed: {
+       
+    },
+    components:{
+        SvgIcon
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/teacher/C_QuestionInsert.vue (added)
+++ client/views/pages/teacher/C_QuestionInsert.vue
@@ -0,0 +1,99 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">문제 등록</p>
+    </div>
+    <div class="board-wrap">
+        <div class="flex align-center mb20">
+            <label for="" class="title2">제목</label>
+            <input type="text" class="data-wrap">
+        </div>
+        <hr>
+        <div class="flex align-center">
+            <label for="" class="title2">내용</label>
+            <textarea name="" id="" class="data-wrap"></textarea>
+        </div>
+        <hr>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">첨부파일</label>
+            <input type="file" ref="fileInput" @change="handleFileUpload" />
+        </div>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">답</label>
+            <input type="text" class="data-wrap">
+        </div>
+        <div>
+            <label for="" class="title2">오답 학생</label>
+            <div class="table-wrap mt20">
+                <table>
+                    <thead>
+                        <td>No.</td>
+                        <td>이름</td>
+                        <td>학년</td>
+                        <td>반</td>
+                        <td>오답</td>
+                    </thead>
+                    <tbody>
+                        <tr @click="goToPage('noticeDetail')">
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                        </tr>
+                    </tbody>
+                </table>
+                <!-- <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;">
+                    <button><img src="../../../resources/img/btn27_90t_normal.png" alt=""></button>
+                    <button class="selected-btn">1</button>
+                    <button>2</button>
+                    <button>3</button>
+                    <button><img src="../../../resources/img/btn28_90t_normal.png" alt=""></button>
+                </article> -->
+            </div>
+        </div>
+    </div>
+    <div class="flex justify-between mt50">
+        <button type="button" title="글쓰기" class="new-btn" @click="goToPage('C_QuestionList')">
+            목록
+        </button>
+        <div class="flex">
+            <button type="button" title="글쓰기" class="new-btn mr10">
+                수정
+            </button>
+            <button type="button" title="글쓰기" class="new-btn">
+                삭제
+            </button>
+        </div>
+    </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify } from '@mdi/js';
+
+
+export default {
+    data() {
+        return {
+            mdiMagnify: mdiMagnify,
+        }
+    },
+    methods: {
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        SvgIcon
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/teacher/C_QuestionList.vue (added)
+++ client/views/pages/teacher/C_QuestionList.vue
@@ -0,0 +1,97 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">문제</p>
+        <select name="" id="">
+            <option value="">1단원</option>
+        </select>
+    </div>
+    <div class="search-wrap flex justify-end mb20">
+            <select name="" id="" class="mr10 data-wrap">
+                <option value="">전체</option>
+            </select>
+                <input  type="text" placeholder="검색하세요.">
+                <button type="button" title="위원회 검색">
+                    <img src="../../../resources/img/look_t.png" alt="">
+                </button>
+        </div>
+        <div class="table-wrap">
+            <table>
+                <thead>
+                    <td>No.</td>
+                    <td>제목</td>
+                    <td>문제</td>
+                    <td>작성자</td>
+                    <td>오답률</td>
+                    <td>등록일</td>
+                </thead>
+                <tbody>
+                    <tr @click="goToPage('C_QuestionInsert')">
+                        <td></td>
+                        <td></td>
+                        <td></td>
+                        <td></td>
+                        <td></td>
+                        <td></td>
+                    </tr>
+                </tbody>
+            </table>
+            <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;">
+                    <button><img src="../../../resources/img/btn27_90t_normal.png" alt=""></button>
+                    <button class="selected-btn">1</button>
+                    <button>2</button>
+                    <button>3</button>
+                    <button><img src="../../../resources/img/btn28_90t_normal.png" alt=""></button>
+                </article>
+                <div class="flex justify-end ">
+                <button type="button" title="등록" class="new-btn" @click="goToPage('C_QuestionInsert')">
+                    등록
+                </button>
+        </div>
+        </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify} from '@mdi/js';
+
+
+export default {
+    data () {
+        return {
+            mdiMagnify: mdiMagnify,
+        }
+    },
+    methods: {
+        goToPage(page) {
+         this.$router.push({ name: page });
+      },
+      showConfirm(type) {
+            let message = '';
+            if (type === 'cancel') {
+                message = '삭제하시겠습니까?';
+            } else if (type === 'reset') {
+                message = '초기화하시겠습니까?';
+            } else if (type === 'save') {
+                message = '등록하시겠습니까?';
+            }
+
+            if (confirm(message)) {
+                this.goBack();
+            }
+        },
+
+    },
+    watch: {
+
+    },
+    computed: {
+       
+    },
+    components:{
+        SvgIcon
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/teacher/C_TextBookDetail.vue (added)
+++ client/views/pages/teacher/C_TextBookDetail.vue
@@ -0,0 +1,121 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">A교재</p>
+        <select name="" id="">
+            <option value="">A 반</option>
+        </select>
+    </div>
+    <div class="board-wrap">
+        <label for="" class="title1">단원</label>
+        <div class="unit-pagination flex mt10" style="gap: 10px;">
+            <button class="selected-btn">1</button>
+            <button>2</button>
+            <button>3</button>
+        </div>
+        <hr>
+        <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('C_TextList')">
+            <label for="" class="title1">지문</label>
+            <div class="flex align-center " style="gap: 10px;">
+                <p>00개</p>
+                <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button>
+            </div>
+        </div>
+        <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('C_QuestionList')">
+            <label for="" class="title1">문제</label>
+            <div class="flex align-center " style="gap: 10px;">
+                <p>00개</p>
+                <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button>
+            </div>
+        </div>
+        <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('C_Voca_List')">
+            <label for="" class="title1">단어</label>
+            <div class="flex align-center " style="gap: 10px;">
+                <p>00개</p>
+                <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button>
+            </div>
+        </div>
+        <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('C_ExamList')">
+            <label for="" class="title1">중간 평가</label>
+            <div class="flex align-center " style="gap: 10px;">
+                <p>00개</p>
+                <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button>
+            </div>
+        </div>
+        <div class="bookmanage-btn flex justify-between align-center" @click="goToPage('C_ExamList')">
+            <label for="" class="title1">최종 평가</label>
+            <div class="flex align-center " style="gap: 10px;">
+                <p>00개</p>
+                <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button>
+            </div>
+        </div>
+    </div>
+    <div class="flex justify-end mt30" style="gap: 10px;">
+        <!-- <button type="button" title="" class="new-btn" @click="showConfirm('delete')">
+            추가
+        </button> -->
+        <button type="button" title="" class="new-btn" @click="goToPage('RoadMap')">
+            로드맵
+        </button>
+        <button type="button" title="" class="new-btn" @click="showConfirm('delete')">
+            삭제
+        </button>
+    </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify, mdilArrowRight } from '@mdi/js';
+import ProgressBar from '../../component/ProgressBar.vue';
+
+
+export default {
+    data() {
+        return {
+            mdiMagnify: mdiMagnify,
+            mdilArrowRight: mdilArrowRight,
+            timer: "00:00",
+            progress: 20
+        }
+    },
+    methods: {
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
+        increaseProgress() {
+            if (this.progress < 100) {
+                this.progress += 10;
+            }
+        },
+        showConfirm(type) {
+            let message = '';
+            if (type === 'delete') {
+                message = '삭제하시겠습니까?';
+            } else if (type === 'reset') {
+                message = '초기화하시겠습니까?';
+            } else if (type === 'save') {
+                message = '등록하시겠습니까?';
+            }
+
+            if (confirm(message)) {
+                this.goBack();
+            }
+        },
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        SvgIcon,
+        ProgressBar
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>
+<style scoped>
+.bookmanage-btn:hover{background-color: #FFF3D7;}
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/teacher/C_TextInsert.vue (added)
+++ client/views/pages/teacher/C_TextInsert.vue
@@ -0,0 +1,64 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">지문 등록</p>
+    </div>
+        <div class="board-wrap">
+            <div class="flex align-center mb20">
+                <label for="" class="title2">제목</label>
+                <input type="text" class="data-wrap">
+            </div>
+            <div class="flex align-center">
+                <label for="" class="title2">URL</label>
+                <input type="text" class="data-wrap">
+            </div>
+            <hr>
+            <div class="flex align-center">
+                <label for="" class="title2">스크립트</label>
+                <textarea name="" id="" class="data-wrap"></textarea>
+            </div>
+        </div>
+        <div class="flex justify-between mt50">
+                <button type="button" title="글쓰기" class="new-btn"  @click="goToPage('C_TextList')">
+                    목록
+                </button>
+               <div class="flex">
+                    <button type="button" title="글쓰기" class="new-btn mr10"  >
+                        수정
+                    </button>
+                    <button type="button" title="글쓰기" class="new-btn"  >
+                        삭제
+                    </button>
+               </div>
+        </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify} from '@mdi/js';
+
+
+export default {
+    data () {
+        return {
+            mdiMagnify: mdiMagnify,
+        }
+    },
+    methods: {
+        goToPage(page) {
+         this.$router.push({ name: page });
+      },
+    },
+    watch: {
+
+    },
+    computed: {
+       
+    },
+    components:{
+        SvgIcon
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/teacher/C_TextList .vue (added)
+++ client/views/pages/teacher/C_TextList .vue
@@ -0,0 +1,95 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">지문</p>
+        <select name="" id="">
+            <option value="">1단원</option>
+        </select>
+    </div>
+    <div class="search-wrap flex justify-end mb20">
+            <select name="" id="" class="mr10 data-wrap">
+                <option value="">전체</option>
+            </select>
+                <input  type="text" placeholder="검색하세요.">
+                <button type="button" title="위원회 검색">
+                    <img src="../../../resources/img/look_t.png" alt="">
+                </button>
+        </div>
+        <div class="table-wrap">
+            <table>
+                <thead>
+                    <td>No.</td>
+                    <td>제목</td>
+                    <td>내용</td>
+                    <td>작성자</td>
+                    <td>등록일</td>
+                </thead>
+                <tbody>
+                    <tr @click="goToPage('C_TextInsert')">
+                        <td></td>
+                        <td></td>
+                        <td></td>
+                        <td></td>
+                        <td></td>
+                    </tr>
+                </tbody>
+            </table>
+            <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;">
+                    <button><img src="../../../resources/img/btn27_90t_normal.png" alt=""></button>
+                    <button class="selected-btn">1</button>
+                    <button>2</button>
+                    <button>3</button>
+                    <button><img src="../../../resources/img/btn28_90t_normal.png" alt=""></button>
+                </article>
+                <div class="flex justify-end ">
+                <button type="button" title="등록" class="new-btn" @click="goToPage('C_TextInsert')">
+                    등록
+                </button>
+        </div>
+        </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify} from '@mdi/js';
+
+
+export default {
+    data () {
+        return {
+            mdiMagnify: mdiMagnify,
+        }
+    },
+    methods: {
+        goToPage(page) {
+         this.$router.push({ name: page });
+      },
+      showConfirm(type) {
+            let message = '';
+            if (type === 'cancel') {
+                message = '삭제하시겠습니까?';
+            } else if (type === 'reset') {
+                message = '초기화하시겠습니까?';
+            } else if (type === 'save') {
+                message = '등록하시겠습니까?';
+            }
+
+            if (confirm(message)) {
+                this.goBack();
+            }
+        },
+
+    },
+    watch: {
+
+    },
+    computed: {
+       
+    },
+    components:{
+        SvgIcon
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/teacher/C_Textbook.vue (added)
+++ client/views/pages/teacher/C_Textbook.vue
@@ -0,0 +1,115 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">교재</p>
+        <select name="" id="">
+            <option value="">A반</option>
+        </select>
+        </div>
+        <div class="content-t">
+            <div  class=" flex " style="gap: 50px;">
+                <div class="textbook">
+                    <div class="box " style="gap: 10px;" @click="goToPage('C_TextBookDetail')">
+                    </div>
+                    <div class="text ">
+                        <p class="title1" style="color: #fff;">A 교재</p>
+                        <div class="btnGroup mt15 flex align-center justify-end" style="gap: 10px;">
+                            <button>수정</button><p>&#124;</p>
+                            <button @click="showConfirm('delete')">삭제</button>
+                        </div>
+                    </div>
+                </div>
+                
+                <div class="textbook-add">
+                        <button  @click="buttonSearch"><img src="../../../resources/img/btn32_98t_normal.png" alt=""></button>
+        
+                </div>
+            </div>
+        </div>
+        <div v-show="searchOpen" class="popup-wrap">
+                <div class="popup-box ">
+                    <div class="flex justify-between mb30">
+                        <p class="popup-title">교재 이름</p>
+                        <button type="button" class="popup-close-btn" @click="closeBtn">
+                            <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
+
+                        </button>
+                    </div>
+                    <div class="search-wrap mb30">
+                        <select v-model="selectedSearchOption" class="mr10 data-wrap">
+      <option value="bbsTtl">제목</option>
+      <option value="bbsCnt">내용</option>
+      <option value="userNm">작성자</option>
+      <option value="bbsCls">카테고리</option>
+    </select>
+                    </div>
+                    <div class="flex justify-center ">
+                        <button type="button" title="글쓰기" class="new-btn mr10">
+                            취소
+                        </button>
+                        <button type="button" title="글쓰기" class="new-btn">
+                            등록
+                        </button>
+                    </div>
+                </div>
+            </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify, mdiWindowClose } from '@mdi/js';
+
+export default {
+    data () {
+        return {
+            mdiWindowClose: mdiWindowClose,
+            showModal: false,
+            searchOpen: false,
+        }
+    },
+    methods: {
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
+        closeModal() {
+            this.showModal = false;
+        },
+        buttonSearch() {
+            this.searchOpen = true;
+        },
+        closeBtn() {
+            this.searchOpen = false;
+
+        },
+        showConfirm(type) {
+            let message = '';
+            if (type === 'delete') {
+                message = '삭제하시겠습니까?';
+            } else if (type === 'reset') {
+                message = '초기화하시겠습니까?';
+            } else if (type === 'save') {
+                message = '등록하시겠습니까?';
+            }
+
+            if (confirm(message)) {
+                this.goBack();
+            }
+        },
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        SvgIcon
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>
+<style scoped>
+.textbook{width: 300px;}
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/teacher/C_Voca_List.vue (added)
+++ client/views/pages/teacher/C_Voca_List.vue
@@ -0,0 +1,184 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">단어장</p>
+        <select name="" id="">
+            <option value="UNIT_000000000000001">1단원</option>
+        </select>
+    </div>
+    <div class="search-wrap flex justify-between mb20 align-center">
+        <div class="title2 gray">?단원 전체 목록</div>
+        <div>
+            <select name="" id="" class="mr10 data-wrap">
+                <option value="">지문</option>
+                <option value="">단어</option>
+            </select>
+            <input  type="text" placeholder="검색하세요.">
+            <button type="button" title="단어장 검색">
+                <img src="../../../resources/img/look_t.png" alt="">
+            </button>
+        </div>
+    </div>
+    <div class="table-wrap">
+        <table>
+            <thead>
+                <td>No.</td>
+                <td>지문</td>
+                <td>단어 목록</td>
+                <td>작성자</td>
+                <td>등록일</td>
+            </thead>
+            <tbody>
+                <tr v-for="(wordBook, index) in dataList" :key="wordBook.wdBookId" @click="goToViewPage('noticeDetail')">
+                    <td>{{ createNo(index) }}</td>
+                    <td>{{ wordBook.textTtl }}</td>
+                    <td>{{ wordBook.wordsPreview }}</td>
+                    <td>{{ wordBook.userId }}</td>
+                    <td>{{ '' }}</td>
+                </tr>
+            </tbody>
+        </table>
+        <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;">
+            <button @click="goToPage(currentPage - 1)">
+                <img src="../../../resources/img/btn27_90t_normal.png" alt="">
+            </button>
+            <button v-for="page in paginationButtons" :key="page" @click="goToPage(page - 1)" :class="{ 'selected-btn': currentPage === page - 1 }">
+                {{ page }}
+            </button>
+            <button @click="goToPage(currentPage + 1)">
+                <img src="../../../resources/img/btn28_90t_normal.png" alt="">
+            </button>
+        </article>
+        <div class="flex justify-end ">
+            <button type="button" title="등록" class="new-btn" @click="goToPage('noticeInsert')">
+                등록
+            </button>
+        </div>
+    </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify } from '@mdi/js';
+import axios from "axios";
+
+
+export default {
+    data () {
+        return {
+            mdiMagnify: mdiMagnify,
+            dataList: [],
+            currentPage: 0,
+            itemsPerPage: 2,
+            totalPosts: 0,
+            unitId: "UNIT_000000000000001"
+        }
+    },
+    methods: {
+
+        dataSelectList() {
+            const vm = this;
+            axios({
+                url: "/wordbook/findByUnitId.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: {
+                    unitId: vm.unitId,
+                    page: vm.currentPage + 1,
+                    pageSize: vm.itemsPerPage
+                },
+            })
+            .then(function (response) {
+                console.log("dataList - response: ", response.data);
+                const wordBooks = response.data.wordBooks;
+                vm.totalPosts = response.data.totalWordBooks;
+                
+                // 지문 제목 및 단어 목록 가져오기
+                const fetchDataPromises = wordBooks.map(wordBook => {
+                    const textTitlePromise = axios.post("/text/selectOneText.json", {
+                        textId: wordBook.textId
+                    }).then(textResponse => {
+                        wordBook.textTtl = textResponse.data[0].text_ttl;
+                    }).catch(error => {
+                        console.error(`${wordBook.textId}으로 지문 제목 가져오기 실패: `, error);
+                        wordBook.textTtl = '제목값없음'; // 오류 시 기본값 설정
+                    });
+
+                    const wordsPromise = axios.post("/word/getWordsByBookId.json", {
+                        wdBookId: wordBook.wdBookId
+                    }).then(wordsResponse => {
+                        const words = wordsResponse.data.map(word => word.wdNm);
+                        wordBook.wordsPreview = vm.generateWordsPreview(words);
+                    }).catch(error => {
+                        console.error(`${wordBook.wdBookId}으로 단어 목록 가져오기 실패: `, error);
+                        wordBook.wordsPreview = '단어값없음'; // 오류 시 기본값 설정
+                    });
+
+                    return Promise.all([textTitlePromise, wordsPromise]);
+                });
+
+                // 모든 데이터 가져오기 작업이 완료되면 dataList에 데이터 설정
+                Promise.all(fetchDataPromises).then(() => {
+                    vm.dataList = wordBooks;
+                });
+            })
+            .catch(function (error) {
+                console.log("dataList - error: ", error);
+                alert("단어장 목록 조회에 오류가 발생했습니다.");
+            });
+        },
+        generateWordsPreview(words) {
+            const maxLength = 20; // 최대 표시 길이 설정
+            const wordString = words.join(', ');
+
+            if (wordString.length > maxLength) {
+                return wordString.substring(0, maxLength) + '...';
+            } else {
+                return wordString;
+            }
+        },
+        createNo(index) {
+            return this.totalPosts - (this.currentPage * this.itemsPerPage + index);
+        },
+        goToPage(page) {
+            if (page < 0 || page >= this.totalPages) {
+                return;
+            }
+            this.currentPage = page;
+            this.dataSelectList();
+        },
+        goToViewPage(page) {
+            this.$router.push({ name: page });
+        },
+    },
+    watch: {
+
+    },
+    computed: {
+        totalPages() {
+            return Math.ceil(this.totalPosts / this.itemsPerPage);
+        },
+        paginationButtons() {
+            let start = Math.max(0, this.currentPage - 2);
+            let end = Math.min(start + 5, this.totalPages);
+
+            if (end - start < 5) {
+                start = Math.max(0, end - 5);
+            }
+
+            return Array.from({ length: end - start }, (_, i) => start + i + 1);
+        },
+        startIndex() {
+            return this.currentPage * this.itemsPerPage;
+        }
+    },
+    components:{
+        SvgIcon
+    },
+    mounted() {
+        console.log('Voca Book List Component mounted');
+        this.dataSelectList();
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/teacher/ClassDetail.vue
--- client/views/pages/teacher/ClassDetail.vue
+++ client/views/pages/teacher/ClassDetail.vue
@@ -1,149 +1,218 @@
 <template>
-    <div class="title-box flex justify-between mb40">
-        <p class="title">반 관리</p>
+  <div class="title-box flex justify-between mb40">
+    <p class="title">반 관리</p>
+  </div>
+  <div class="wrap mb30">
+    <div class="flex justify-between mb30 align-center">
+      <label for="" class="title1">게시판</label>
+      <div class="look-btn flex align-center" @click="goToPage('Board')">
+        <p>자세히 보기</p>
+        <svg-icon type="mdi" :path="mdilArrowRight" class="ml10"></svg-icon>
+      </div>
+    </div>
+    <div class="table-wrap">
+      <table>
+        <thead>
+          <td>No.</td>
+          <td>제목</td>
+          <td>내용</td>
+          <td>작성자</td>
+          <td>등록일</td>
+        </thead>
+        <tbody>
+          <tr
+            v-for="(item, index) in dataList"
+            :key="item.id"
+            :class="{ 'selected-row': selectedRow == item.dataList }"
+            @click="[goToPage('noticeDetail'), selectBoardList(item)]"
+          >
+            <td>{{ totalPosts - index }}</td>
+            <td>{{ item.bbsTtl }}</td>
+            <td>{{ item.bbsCls }}</td>
+            <td>{{ userNm }}</td>
+            <td>{{ item.bbsTm.substr(0, 16) }}</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+  <div class="flex justify-between" style="gap: 30px">
+    <div class="wrap mb30">
+      <div class="flex justify-between mb30 align-center">
+        <label for="" class="title1">학생 목록</label>
+        <div class="look-btn align-center flex">
+          <p>자세히 보기</p>
+          <svg-icon type="mdi" :path="mdilArrowRight" class="ml10"></svg-icon>
+        </div>
+      </div>
+      <div class="table-wrap">
+        <table>
+          <thead>
+            <td>No.</td>
+            <td>이름</td>
+            <td>학년</td>
+            <td>반</td>
+          </thead>
+          <tbody>
+            <tr>
+              <td></td>
+              <td></td>
+              <td></td>
+              <td></td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
     </div>
     <div class="wrap mb30">
-        <div class="flex justify-between mb30 align-center">
-            <label for="" class="title1">학습 현황</label>
-            <div class="look-btn flex align-center">
-                <p>자세히 보기 </p>
-                <svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon>
+      <div class="flex justify-between mb30 align-center">
+        <label for="" class="title1">책 </label>
+        <div class="align-center flex look-btn">
+          <p>자세히 보기</p>
+          <svg-icon type="mdi" :path="mdilArrowRight" class="ml10"></svg-icon>
+        </div>
+      </div>
+      <div class="flex" style="gap: 50px">
+        <div class="textbook">
+          <div class="box" style="gap: 10px"></div>
+          <div class="text">
+            <p class="title1" style="color: #fff">A 교재</p>
+            <div
+              class="btnGroup mt15 flex align-center justify-end"
+              style="gap: 10px"
+            >
+              <button>수정</button>
+              <p>&#124;</p>
+              <button @click="showConfirm('delete')">삭제</button>
             </div>
+          </div>
         </div>
-        <div class="table-wrap">
-            <table>
-                <thead>
-                    <td>No.</td>
-                    <td>제목</td>
-                    <td>내용</td>
-                    <td>작성자</td>
-                    <td>등록일</td>
-                </thead>
-                <tbody>
-                    <tr>
-                        <td></td>
-                        <td></td>
-                        <td></td>
-                        <td></td>
-                        <td></td>
-                    </tr>
-                </tbody>
-            </table>
+        <div class="textbook">
+          <div class="box" style="gap: 10px"></div>
+          <div class="text">
+            <p class="title1" style="color: #fff">A 교재</p>
+            <div
+              class="btnGroup mt15 flex align-center justify-end"
+              style="gap: 10px"
+            >
+              <button>수정</button>
+              <p>&#124;</p>
+              <button @click="showConfirm('delete')">삭제</button>
+            </div>
+          </div>
         </div>
+      </div>
     </div>
-    <div class="flex justify-between" style="gap: 30px;">
-        <div class="wrap mb30">
-            <div class="flex justify-between mb30 align-center">
-                <label for="" class="title1">학생 목록</label>
-                <div class="look-btn align-center flex">
-                    <p>자세히 보기 </p>
-                    <svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon>
-                </div>
-            </div>
-            <div class="table-wrap">
-                <table>
-                    <thead>
-                        <td>No.</td>
-                        <td>이름</td>
-                        <td>학년</td>
-                        <td>반</td>
-                    </thead>
-                    <tbody>
-                        <tr>
-                            <td></td>
-                            <td></td>
-                            <td></td>
-                            <td></td>
-                        </tr>
-                    </tbody>
-                </table>
-            </div>
-        </div>
-        <div class="wrap mb30">
-            <div class="flex justify-between mb30 align-center">
-                <label for="" class="title1">책 </label>
-                <div class="align-center flex look-btn"><p>자세히 보기 </p><svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon></div>
-            </div>
-            <div  class=" flex " style="gap: 50px;">
-                <div class="textbook">
-                    <div class="box " style="gap: 10px;">
-                    </div>
-                    <div class="text ">
-                        <p class="title1" style="color: #fff;">A 교재</p>
-                        <div class="btnGroup mt15 flex align-center justify-end" style="gap: 10px;">
-                            <button>수정</button><p>&#124;</p>
-                            <button @click="showConfirm('delete')">삭제</button>
-                        </div>
-                    </div>
-                </div>
-                <div class="textbook">
-                    <div class="box " style="gap: 10px;">
-                    </div>
-                    <div class="text ">
-                        <p class="title1" style="color: #fff;">A 교재</p>
-                        <div class="btnGroup mt15 flex align-center justify-end" style="gap: 10px;">
-                            <button>수정</button><p>&#124;</p>
-                            <button @click="showConfirm('delete')">삭제</button>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
+  </div>
 </template>
 
 <script>
-import SvgIcon from '@jamescoyle/vue-icon';
-import { mdiMagnify,  } from '@mdi/js';
-import { mdilArrowRight } from '@mdi/light-js';
-import ProgressBar from '../../component/ProgressBar.vue';
-
+import SvgIcon from "@jamescoyle/vue-icon";
+import { mdiMagnify } from "@mdi/js";
+import { mdilArrowRight } from "@mdi/light-js";
+import ProgressBar from "../../component/ProgressBar.vue";
+import axios from "axios";
 
 export default {
-    data() {
-        return {
-            mdiMagnify: mdiMagnify,
-            mdilArrowRight: mdilArrowRight,
-            timer: "00:00",
-            progress: 20
-        }
-    },
-    methods: {
-        goToPage(page) {
-            this.$router.push({ name: page });
-        },
-        increaseProgress() {
-            if (this.progress < 100) {
-                this.progress += 10;
-            }
-        },
-        showConfirm(type) {
-            let message = '';
-            if (type === 'cancel') {
-                message = '삭제하시겠습니까?';
-            } else if (type === 'reset') {
-                message = '초기화하시겠습니까?';
-            } else if (type === 'save') {
-                message = '등록하시겠습니까?';
-            }
+  data() {
+    return {
+      mdiMagnify: mdiMagnify,
+      mdilArrowRight: mdilArrowRight,
+      timer: "00:00",
+      progress: 20,
 
-            if (confirm(message)) {
-                this.goBack();
-            }
+      // 교사 홈페이지에서 쿼리 파라미터로부터 전달받은 선택된 반의 아이디
+      selectedClassId: this.$route.query.sclsId,
+
+      // 게시글 정보
+      dataList: [],
+      totalPosts: 0,
+      selectedRow: "",
+      bbsTm: "",
+
+      // 페이징
+      currentPage: 0,
+      itemsPerPage: 5,
+
+      // 반 아이디
+      sclsId: "",
+    };
+  },
+  methods: {
+    goToPage(page) {
+      this.$router.push({ name: page });
+    },
+    increaseProgress() {
+      if (this.progress < 100) {
+        this.progress += 10;
+      }
+    },
+    showConfirm(type) {
+      let message = "";
+      if (type === "cancel") {
+        message = "삭제하시겠습니까?";
+      } else if (type === "reset") {
+        message = "초기화하시겠습니까?";
+      } else if (type === "save") {
+        message = "등록하시겠습니까?";
+      }
+
+      if (confirm(message)) {
+        this.goBack();
+      }
+    },
+
+    // 게시글 조회
+    boardList() {
+      const vm = this;
+      axios({
+        url: "/board/findAll.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
         },
-    },
-    watch: {
+        data: {
+          page: vm.currentPage + 1,
+          pageSize: vm.itemsPerPage,
+          sclsId: vm.selectedClassId,
+        },
+      })
+        .then(function (res) {
+          console.log("dataList - response : ", res.data);
 
-    },
-    computed: {
+          vm.dataList = res.data.result[0].boardClass[0].board;
+          vm.userNm = res.data.result[0].userNm;
+          vm.userId = res.data.result[0].userId;
+          vm.totalPosts = res.data.totalBoard;
 
+          console.log(vm.userId);
+        })
+        .catch(function (error) {
+          console.log("result - error : ", error);
+        });
     },
-    components: {
-        SvgIcon,
-        ProgressBar
+    setClassId() {
+      sessionStorage.setItem("sclsId", JSON.stringify(this.selectedClassId));
+      sessionStorage.removeItem("selectedBoardList");
+      sessionStorage.removeItem("file");
+      this.boardList();
     },
-    mounted() {
-        console.log('Main2 mounted');
-    }
-}
-</script>
(파일 끝에 줄바꿈 문자 없음)
+
+    // 게시글 정보 세션에 저장
+    selectBoardList(item) {
+      sessionStorage.setItem("selectedBoardList", JSON.stringify(item));
+    },
+  },
+  watch: {},
+  computed: {},
+  components: {
+    SvgIcon,
+    ProgressBar,
+  },
+  mounted() {
+    console.log("Main2 mounted");
+    //console.log(`반 페이지 sclsId(반 아이디) 확인 : ${this.selectedClassId}`);
+    this.setClassId();
+  },
+};
+</script>
client/views/pages/teacher/ExamDetail.vue
--- client/views/pages/teacher/ExamDetail.vue
+++ client/views/pages/teacher/ExamDetail.vue
@@ -18,8 +18,8 @@
             <tr>
                 <td>1</td>
                 <td>1</td>
-                <td><button type="button" title="보기" class="new-btn">
-                        보기
+                <td><button type="button" title="수정" class="new-btn">
+                        수정
                     </button></td>
             </tr>
         </tbody>
 
client/views/pages/teacher/ExamInsert.vue (added)
+++ client/views/pages/teacher/ExamInsert.vue
@@ -0,0 +1,131 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">평가 등록</p>
+    </div>
+    <!-- <label for="" class="title1">문제 리스트</label>
+    <table class="mt20 mb100">
+        <colgroup>
+            <col style="width: 10%;">
+            <col style="width: 70%;">
+            <col style="width: 20%;">
+        </colgroup>
+        <thead>
+            <td>No.</td>
+            <td>문제</td>
+            <td>보기</td>
+        </thead>
+        <tbody>
+            <tr>
+                <td>1</td>
+                <td>1</td>
+                <td><button type="button" title="수정" class="new-btn">
+                        수정
+                    </button></td>
+            </tr>
+        </tbody>
+    </table> -->
+    <label for="" class="title1">상세 내용</label>
+    <div class="board-wrap mt20">
+        <div class="flex align-center mb20">
+            <label for="" class="title2">단원</label>
+            <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                <option value="bbsTtl">제목</option>
+                <option value="bbsCnt">내용</option>
+                <option value="userNm">작성자</option>
+                <option value="bbsCls">카테고리</option>
+            </select>
+        </div>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">평가 유형</label>
+            <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                <option value="bbsTtl">제목</option>
+                <option value="bbsCnt">내용</option>
+                <option value="userNm">작성자</option>
+                <option value="bbsCls">카테고리</option>
+            </select>
+        </div>
+
+        <hr>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">문제 1</label>
+            <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                <option value="bbsTtl">제목</option>
+                <option value="bbsCnt">내용</option>
+                <option value="userNm">작성자</option>
+                <option value="bbsCls">카테고리</option>
+            </select>
+        </div>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">문제 2</label>
+            <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                <option value="bbsTtl">제목</option>
+                <option value="bbsCnt">내용</option>
+                <option value="userNm">작성자</option>
+                <option value="bbsCls">카테고리</option>
+            </select>
+        </div>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">문제 3</label>
+            <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                <option value="bbsTtl">제목</option>
+                <option value="bbsCnt">내용</option>
+                <option value="userNm">작성자</option>
+                <option value="bbsCls">카테고리</option>
+            </select>
+        </div>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">문제 4</label>
+            <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                <option value="bbsTtl">제목</option>
+                <option value="bbsCnt">내용</option>
+                <option value="userNm">작성자</option>
+                <option value="bbsCls">카테고리</option>
+            </select>
+        </div>
+        
+    </div>
+    <div class="flex justify-between mt50">
+        <button type="button" title="글쓰기" class="new-btn" @click="goToPage('C_ExamList')">
+            목록
+        </button>
+        <div class="flex">
+            <button type="button" title="글쓰기" class="new-btn mr10">
+                취소
+            </button>
+            <button type="button" title="글쓰기" class="new-btn">
+                등록
+            </button>
+        </div>
+    </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify } from '@mdi/js';
+
+
+export default {
+    data() {
+        return {
+            mdiMagnify: mdiMagnify,
+        }
+    },
+    methods: {
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        SvgIcon
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/teacher/ExamList.vue
--- client/views/pages/teacher/ExamList.vue
+++ client/views/pages/teacher/ExamList.vue
@@ -5,6 +5,12 @@
             <option value="">1단원</option>
         </select>
     </div>
+    <label for="" class="title2">단원</label>
+        <div class="unit-pagination flex mt10 mb20" style="gap: 10px;">
+            <button class="selected-btn">1</button>
+            <button>2</button>
+            <button>3</button>
+        </div>
     <div class="search-wrap flex justify-end mb20">
             <select name="" id="" class="mr10 data-wrap">
                 <option value="">중간</option>
@@ -36,12 +42,12 @@
                         <td></td>
                         <td></td>
                         <td></td>
-                        <td><button type="button" title="보기" class="new-btn"  @click="toggleRow">
+                        <td><button type="button" title="보기" class="new-btn" @click="goToPage('ExamDetail')">
                     보기
                 </button></td>
                         <td></td>
                     </tr>
-                    <tr :class="{ 'hidden-tr': !isRowVisible }" class="show-tr">
+                    <!-- <tr :class="{ 'hidden-tr': !isRowVisible }" class="show-tr">
                         <td colspan="7">
                             <div>
                                 <table>
@@ -67,7 +73,7 @@
                                 </table>
                             </div>
                         </td>
-                    </tr>
+                    </tr> -->
                 </tbody>
             </table>
             <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;">
@@ -78,7 +84,7 @@
                     <button><img src="../../../resources/img/btn28_90t_normal.png" alt=""></button>
                 </article>
                 <div class="flex justify-end ">
-                <button type="button" title="등록" class="new-btn" @click="goToPage('ExamDetail')">
+                <button type="button" title="등록" class="new-btn" @click="goToPage('ExamInsert')">
                     등록
                 </button>
         </div>
client/views/pages/teacher/Home.vue
--- client/views/pages/teacher/Home.vue
+++ client/views/pages/teacher/Home.vue
@@ -1,114 +1,289 @@
 <template>
-    <div class="title-box flex justify-between mb40">
-        <p class="title">홈</p>
-        <select name="" id="">
-            <option value="">A반</option>
-        </select>
-    </div>
-    <div class="content-t">
-        <div class=" flex " style="gap: 50px;">
-            <div class="class">
-                <div class="box gd-col2" style="gap: 10px;" @click="goToPage('ClassDetail')">
-                    <div><img src="../../../resources/img/img176_82t.png" alt=""></div>
-                    <div><img src="../../../resources/img/img176_82t.png" alt=""></div>
-                    <div><img src="../../../resources/img/img176_82t.png" alt=""></div>
-                    <div><img src="../../../resources/img/img176_82t.png" alt=""></div>
-                </div>
-                <div class="text flex justify-between mt20">
-                    <p class="title1">A반</p>
-                    <span class="member">20명</span>
-                </div>
-                <div class="btnGroup mt15 flex align-center justify-end" style="gap: 10px;">
-                    <button @click="showConfirm('edit')">수정</button>
-                    <p>&#124;</p>
-                    <button @click="showConfirm('delete')">삭제</button>
-                </div>
-            </div>
-            <div class="textbook-add">
-                <button @click="buttonSearch"><img src="../../../resources/img/btn32_98t_normal.png" alt=""></button>
-
-            </div>
-            <div v-show="searchOpen" class="popup-wrap">
-                <div class="popup-box ">
-                    <div class="flex justify-between mb30">
-                        <p class="popup-title">반 이름</p>
-                        <button type="button" class="popup-close-btn" @click="closeBtn">
-                            <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
-
-                        </button>
-                    </div>
-                    <div class="search-wrap mb30">
-                        <input type="text" class="data-wrap" placeholder="">
-                        <!-- <button type="button" >
+  <div class="title-box flex justify-between mb40">
+    <p class="title">홈</p>
+  </div>
+  <div class="content-t">
+    <div class="flex" style="gap: 50px" :style="{ flexWrap: 'wrap' }">
+      <div
+        class="class"
+        v-for="classItem in classesList"
+        :key="classItem.sclsId"
+      >
+        <div
+          class="box gd-col2"
+          style="gap: 10px"
+          @click="goToPage('ClassDetail', classItem.sclsId)"
+        >
+          <div><img src="../../../resources/img/img176_82t.png" alt="" /></div>
+          <div><img src="../../../resources/img/img176_82t.png" alt="" /></div>
+          <div><img src="../../../resources/img/img176_82t.png" alt="" /></div>
+          <div><img src="../../../resources/img/img176_82t.png" alt="" /></div>
+        </div>
+        <div class="text flex justify-between mt20">
+          <p class="title1">{{ classItem.sclsNm }}</p>
+          <span class="member">{{ classItem.studentCount }}</span>
+        </div>
+        <div
+          class="btnGroup mt15 flex align-center justify-end"
+          style="gap: 10px"
+        >
+          <button @click="editModeModal(classItem.sclsId)">수정</button>
+          <p>&#124;</p>
+          <button @click="deleteClass(classItem.sclsId)">삭제</button>
+        </div>
+      </div>
+      <div class="textbook-add">
+        <button @click="addModeModal">
+          <img src="../../../resources/img/btn32_98t_normal.png" alt="" />
+        </button>
+      </div>
+      <!-- 팝업창 -->
+      <div v-show="searchOpen" class="popup-wrap">
+        <div class="popup-box">
+          <div class="flex justify-between mb30">
+            <p class="popup-title">반 이름</p>
+            <button type="button" class="popup-close-btn" @click="closeBtn">
+              <svg-icon
+                type="mdi"
+                :path="mdiWindowClose"
+                class="close-btn"
+              ></svg-icon>
+            </button>
+          </div>
+          <div class="search-wrap mb30">
+            <input
+              type="text"
+              v-model="createClassName"
+              class="data-wrap"
+              placeholder=""
+            />
+            <!-- <button type="button" >
                             <img src="../../../resources/img/look_t.png" alt="">
                         </button> -->
-                    </div>
-                    <div class="flex justify-center ">
-                        <button type="button" title="글쓰기" class="new-btn mr10">
-                            취소
-                        </button>
-                        <button type="button" title="글쓰기" class="new-btn">
-                            생성
-                        </button>
-                    </div>
-                </div>
-            </div>
+          </div>
+          <div class="flex justify-center">
+            <button
+              type="button"
+              title="글쓰기"
+              class="new-btn mr10"
+              @click="closeBtn"
+            >
+              취소
+            </button>
+            <button
+              type="button"
+              title="등록"
+              class="new-btn"
+              @click="isEditMode ? updateClass() : insertClass()"
+            >
+              {{ isEditMode ? "수정" : "등록" }}
+            </button>
+          </div>
         </div>
+      </div>
     </div>
+  </div>
 </template>
 
 <script>
-import SvgIcon from '@jamescoyle/vue-icon';
-import { mdiMagnify, mdiWindowClose } from '@mdi/js';
+import axios from "axios";
+import SvgIcon from "@jamescoyle/vue-icon";
+import { mdiMagnify, mdiWindowClose } from "@mdi/js";
 export default {
-    data() {
-        return {
-            mdiWindowClose: mdiWindowClose,
-            showModal: false,
-            searchOpen: false,
-        }
-    },
-    methods: {
-        goToPage(page) {
-            this.$router.push({ name: page });
-        },
-        closeModal() {
-            this.showModal = false;
-        },
-        buttonSearch() {
-            this.searchOpen = true;
-        },
-        closeBtn() {
-            this.searchOpen = false;
+  data() {
+    return {
+      mdiWindowClose: mdiWindowClose,
+      showModal: false,
+      searchOpen: false,
 
+      classesList: [], // 불러온 반 정보
+      user_id: "2", //유저 아이디 : 현재는 고정
+      createClassName: "", // 생성 또는 수정할 반 이름
+
+      isEditMode: false, // 추가 모드인지 수정 모드인지 구분하는 변수
+      current_editId: "", // 현재 수정할 반 id
+    };
+  },
+  methods: {
+    goToPage(page, sclsId) {
+      //console.log(`sclsId : ${sclsId}`); // 쿼리 확인
+      this.$router.push({ name: page, query: { sclsId: sclsId } });
+    },
+    closeModal() {
+      this.showModal = false;
+    },
+    editModeModal(sclsId) {
+      this.searchOpen = true;
+      this.isEditMode = true; // 수정 모드로 설정
+      this.current_editId = sclsId;
+    },
+    addModeModal() {
+      this.searchOpen = true;
+      this.isEditMode = false; // 추가 모드로 설정
+    },
+    closeBtn() {
+      this.searchOpen = false;
+      this.createClassName = ""; // 팝업 닫을 때 반 이름 초기화
+    },
+    showConfirm(type, callback) {
+      let message = "";
+      if (type === "delete") {
+        message = "삭제하시겠습니까?";
+      } else if (type === "reset") {
+        message = "초기화하시겠습니까?";
+      } else if (type === "save") {
+        message = "등록하시겠습니까?";
+      } else if (type === "edit") {
+        message = "수정하시겠습니까?";
+      }
+
+      if (confirm(message)) {
+        if (callback) callback(); // 콜백 함수 호출
+      }
+    },
+    // 조회
+    selectClass() {
+      sessionStorage.removeItem("sclsId");
+      axios({
+        url: "/classes/selectClass.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
         },
-        showConfirm(type) {
-            let message = '';
-            if (type === 'delete') {
-                message = '삭제하시겠습니까?';
-            } else if (type === 'reset') {
-                message = '초기화하시겠습니까?';
-            } else if (type === 'save') {
-                message = '등록하시겠습니까?';
+        data: {
+          userId: this.user_id,
+        },
+      })
+        .then((res) => {
+          if (res.data.status === "success") {
+            console.log("classesList - response(조회) : ", res.data.data);
+            this.classesList = res.data.data;
+          } else {
+            console.log("조회에 실패했습니다: ", res.data);
+            alert("조회에 실패했습니다.");
+          }
+        })
+        .catch((err) => {
+          console.log("classesList - error(조회) : ", err);
+          alert("조회에 오류가 발생했습니다.");
+        });
+    },
+    // 추가
+    insertClass() {
+      if (this.createClassName.trim() === "") {
+        alert("반 이름을 입력해주세요");
+      } else {
+        this.showConfirm("save", () => {
+          axios({
+            url: "/classes/insertClass.json",
+            method: "post",
+            headers: {
+              "Content-Type": "application/json; charset=UTF-8",
+            },
+            data: {
+              userId: this.user_id,
+              sclsNm: this.createClassName,
+            },
+          })
+            .then((res) => {
+              if (res.data.status === "success") {
+                console.log("classesList - response(추가) : ", res.data.data);
+                this.selectClass();
+                this.createClassName = ""; // 반 이름 초기화
+                this.closeBtn(); // 생성 모달 닫기
+              } else {
+                console.log("추가에 실패했습니다: ", res.data);
+                alert("추가에 실패했습니다.");
+              }
+            })
+            .catch((err) => {
+              console.log("classesList - error(추가) : ", err);
+              alert("추가에 오류가 발생했습니다.");
+            });
+        });
+      }
+    },
+    // 삭제
+    deleteClass(sclsId) {
+      this.showConfirm("delete", () => {
+        axios({
+          url: "/classes/deleteClass.json",
+          method: "post",
+          headers: {
+            "Content-Type": "application/json; charset=UTF-8",
+          },
+          data: {
+            sclsId: sclsId,
+          },
+        })
+          .then((res) => {
+            if (res.data.status === "success") {
+              console.log("classesList - response(삭제) : ", res.data.data);
+              this.selectClass();
+            } else {
+              console.log("삭제에 실패했습니다: ", res.data);
+              alert("삭제에 실패했습니다.");
             }
-
-            if (confirm(message)) {
-                this.goBack();
-            }
-        },
-
+          })
+          .catch((err) => {
+            console.log("classesList - error(삭제) : ", err);
+            alert("삭제에 오류가 발생했습니다.");
+          });
+      });
     },
-    watch: {
+    // 수정
+    updateClass() {
+      if (this.createClassName.trim() === "") {
+        alert("반 이름을 입력해주세요");
+      } else {
+        this.showConfirm("edit", () => {
+          axios({
+            url: "/classes/updateClass.json",
+            method: "post",
+            headers: {
+              "Content-Type": "application/json; charset=UTF-8",
+            },
+            data: {
+              sclsId: this.current_editId,
+              sclsNm: this.createClassName,
+            },
+          })
+            .then((res) => {
+              if (res.data.status === "success") {
+                console.log("classesList - response(수정) : ", res.data.data);
+                this.selectClass();
+                this.createClassName = ""; // 반 이름 초기화
+                this.current_editId = ""; // 반 Id 초기화
+                this.closeBtn(); // 팝업 닫기
+              } else {
+                console.log("수정에 실패했습니다: ", res.data);
+                alert("수정에 실패했습니다.");
+              }
+            })
+            .catch((err) => {
+              console.log("classesList - error(수정) : ", err);
+              alert("수정에 오류가 발생했습니다.");
+            });
+        });
+      }
+    },
+  },
+  watch: {},
+  computed: {},
+  components: {
+    SvgIcon,
+  },
+  mounted() {
+    console.log("Main2 mounted");
+    this.selectClass();
+  },
+};
+</script>
 
-    },
-    computed: {
-
-    },
-    components: {
-        SvgIcon
-    },
-    mounted() {
-        console.log('Main2 mounted');
-    }
+<style>
+.content-t {
+  flex-wrap: wrap;
+  height: 90%;
+  overflow-y: scroll;
 }
-</script>
(파일 끝에 줄바꿈 문자 없음)
+</style>
client/views/pages/teacher/Main_t.vue
--- client/views/pages/teacher/Main_t.vue
+++ client/views/pages/teacher/Main_t.vue
@@ -1,7 +1,7 @@
 <template>
     <div class="flex justify-between" style="height: 100%;">
        <Side_t></Side_t>
-       <div style="padding: 15px 60px 90px 60px; ">
+       <div style="padding: 15px 60px 120px 0px ">
         <Header></Header>
           <div class="main-wrap">
               <router-view />
 
client/views/pages/teacher/QuestionDetail.vue (added)
+++ client/views/pages/teacher/QuestionDetail.vue
@@ -0,0 +1,232 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">문제 등록</p>
+    </div>
+    <div class="board-wrap">
+        <div class="tab-box" >
+            <label class="mr20 title1">
+               <input type="radio" v-model="selectedTab" value="tab1" />
+               문제 유형 (일반형)
+            </label>
+            <label class="mr20 title1">
+               <input type="radio" v-model="selectedTab" value="tab2" />
+               문제 유형 (O,X형)
+            </label>
+            <label class="mr20 title1">
+               <input type="radio" v-model="selectedTab" value="tab3" />
+               문제 유형 (연결형)
+            </label>
+            <label class="mr20 title1">
+               <input type="radio" v-model="selectedTab" value="tab4" />
+               문제 유형 (다중 정답형)
+            </label>
+        </div>
+        <hr>
+       <div class="gd-col2 " >
+            <div class="flex align-center mb20">
+                <label for="" class="title2">카테고리</label>
+                <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                    <option value="bbsTtl">제목</option>
+                    <option value="bbsCnt">내용</option>
+                    <option value="userNm">작성자</option>
+                    <option value="bbsCls">카테고리</option>
+                </select>
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">문제 유형</label>
+                <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                    <option value="bbsTtl">제목</option>
+                    <option value="bbsCnt">내용</option>
+                    <option value="userNm">작성자</option>
+                    <option value="bbsCls">카테고리</option>
+                </select>
+            </div>
+            <div class="flex align-center">
+                <label for="" class="title2">지문</label>
+                <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                    <option value="bbsTtl">제목</option>
+                    <option value="bbsCnt">내용</option>
+                    <option value="userNm">작성자</option>
+                    <option value="bbsCls">카테고리</option>
+                </select>
+            </div>
+            <div class="flex align-center">
+                <label for="" class="title2">문제 지표</label>
+                <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                    <option value="bbsTtl">제목</option>
+                    <option value="bbsCnt">내용</option>
+                    <option value="userNm">작성자</option>
+                    <option value="bbsCls">카테고리</option>
+                </select>
+            </div>
+       </div>
+        <div class="flex align-center mb20 mt40">
+            <label for="" class="title2">문제 배점</label>
+            <input type="text" class="data-wrap">
+        </div>
+
+        <div class="flex align-center mb20">
+            <label for="" class="title2">내용</label>
+            <textarea name="" id="" class="data-wrap"></textarea>
+        </div>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">힌트</label>
+            <input type="text" class="data-wrap">
+        </div>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">첨부파일</label>
+            <input type="file" ref="fileInput" @change="handleFileUpload" />
+        </div>
+        <hr>
+        <div v-if="selectedTab === 'tab1'">
+            <div class="flex align-center mb20">
+                <label for="" class="title2">답1</label>
+                <input type="text" class="data-wrap">
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">답2</label>
+                <input type="text" class="data-wrap">
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">답3</label>
+                <input type="text" class="data-wrap">
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">답4</label>
+                <input type="text" class="data-wrap">
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">해설</label>
+                <textarea name="" id="" class="data-wrap"></textarea>
+            </div>
+        </div>
+       <div v-else-if="selectedTab === 'tab2'">
+            <div class="flex align-center mb20">
+                <label for="" class="title2">답</label>
+                    <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                            <option value="bbsTtl">O</option>
+                            <option value="bbsCnt">X</option>
+                        </select>
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">해설</label>
+                <textarea name="" id="" class="data-wrap"></textarea>
+            </div>
+       </div>
+       <div v-else-if="selectedTab === 'tab3'">
+            <div class="gd-col2 " >
+                <div class="flex align-center mb20 mr40" >
+                    <label for="" class="title2">문제1</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20">
+                    <label for="" class="title2">답1</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20 mr40">
+                    <label for="" class="title2">문제2</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20">
+                    <label for="" class="title2">답2</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20 mr40">
+                    <label for="" class="title2">문제3</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20 ">
+                    <label for="" class="title2">답3</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20 mr40">
+                    <label for="" class="title2">문제4</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20">
+                    <label for="" class="title2">답4</label>
+                    <input type="text" class="data-wrap">
+                </div>
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">해설</label>
+                <textarea name="" id="" class="data-wrap"></textarea>
+            </div>
+       </div>
+       <div v-else-if="selectedTab === 'tab4'">
+                <div class="flex align-center mb20 mr40" >
+                    <label for="" class="title2">문제1</label>
+                    <input type="text" class="data-wrap">
+                    <input type="checkbox" class="ui-checkbox ml30">
+                </div>
+                <div class="flex align-center mb20 mr40">
+                    <label for="" class="title2">문제2</label>
+                    <input type="text" class="data-wrap">
+                    <input type="checkbox" class="ui-checkbox ml30">
+                </div>
+                <div class="flex align-center mb20 mr40">
+                    <label for="" class="title2">문제3</label>
+                    <input type="text" class="data-wrap">
+                    <input type="checkbox" class="ui-checkbox ml30">
+                </div>
+                <div class="flex align-center mb20 mr40">
+                    <label for="" class="title2">문제4</label>
+                    <input type="text" class="data-wrap">
+                    <input type="checkbox" class="ui-checkbox ml30">
+                </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">해설</label>
+                <textarea name="" id="" class="data-wrap"></textarea>
+            </div>
+       </div>
+       
+    </div>
+    <div class="flex justify-between mt50">
+        <button type="button" title="글쓰기" class="new-btn" @click="goToPage('QuestionList')">
+            목록
+        </button>
+        <div class="flex">
+            <button type="button" title="글쓰기" class="new-btn mr10">
+                삭제
+            </button>
+            <button type="button" title="글쓰기" class="new-btn">
+                수정
+            </button>
+        </div>
+    </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify } from '@mdi/js';
+
+
+export default {
+    data() {
+        return {
+            mdiMagnify: mdiMagnify,
+            selectedTab: 'tab1',
+        }
+    },
+    methods: {
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        SvgIcon
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>
+<style scoped>
+.ui-checkbox{width: 30px; height: 30px;}
+</style>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/teacher/QuestionInsert.vue
--- client/views/pages/teacher/QuestionInsert.vue
+++ client/views/pages/teacher/QuestionInsert.vue
@@ -3,54 +3,183 @@
         <p class="title">문제 등록</p>
     </div>
     <div class="board-wrap">
-        <div class="flex align-center mb20">
-            <label for="" class="title2">제목</label>
-            <input type="text" class="data-wrap">
+        <div class="tab-box" >
+            <label class="mr20 title1">
+               <input type="radio" v-model="selectedTab" value="tab1" />
+               문제 유형 (일반형)
+            </label>
+            <label class="mr20 title1">
+               <input type="radio" v-model="selectedTab" value="tab2" />
+               문제 유형 (O,X형)
+            </label>
+            <label class="mr20 title1">
+               <input type="radio" v-model="selectedTab" value="tab3" />
+               문제 유형 (연결형)
+            </label>
+            <label class="mr20 title1">
+               <input type="radio" v-model="selectedTab" value="tab4" />
+               문제 유형 (다중 정답형)
+            </label>
         </div>
         <hr>
-        <div class="flex align-center">
+       <div class="gd-col2 " >
+            <div class="flex align-center mb20">
+                <label for="" class="title2">카테고리</label>
+                <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                    <option value="bbsTtl">제목</option>
+                    <option value="bbsCnt">내용</option>
+                    <option value="userNm">작성자</option>
+                    <option value="bbsCls">카테고리</option>
+                </select>
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">문제 유형</label>
+                <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                    <option value="bbsTtl">제목</option>
+                    <option value="bbsCnt">내용</option>
+                    <option value="userNm">작성자</option>
+                    <option value="bbsCls">카테고리</option>
+                </select>
+            </div>
+            <div class="flex align-center">
+                <label for="" class="title2">지문</label>
+                <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                    <option value="bbsTtl">제목</option>
+                    <option value="bbsCnt">내용</option>
+                    <option value="userNm">작성자</option>
+                    <option value="bbsCls">카테고리</option>
+                </select>
+            </div>
+            <div class="flex align-center">
+                <label for="" class="title2">문제 지표</label>
+                <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                    <option value="bbsTtl">제목</option>
+                    <option value="bbsCnt">내용</option>
+                    <option value="userNm">작성자</option>
+                    <option value="bbsCls">카테고리</option>
+                </select>
+            </div>
+       </div>
+        <div class="flex align-center mb20 mt40">
+            <label for="" class="title2">문제 배점</label>
+            <input type="text" class="data-wrap">
+        </div>
+
+        <div class="flex align-center mb20">
             <label for="" class="title2">내용</label>
             <textarea name="" id="" class="data-wrap"></textarea>
         </div>
-        <hr>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">힌트</label>
+            <input type="text" class="data-wrap">
+        </div>
         <div class="flex align-center mb20">
             <label for="" class="title2">첨부파일</label>
             <input type="file" ref="fileInput" @change="handleFileUpload" />
         </div>
-        <div class="flex align-center mb20">
-            <label for="" class="title2">답</label>
-            <input type="text" class="data-wrap">
-        </div>
-        <div>
-            <label for="" class="title2">오답 학생</label>
-            <div class="table-wrap mt20">
-                <table>
-                    <thead>
-                        <td>No.</td>
-                        <td>이름</td>
-                        <td>학년</td>
-                        <td>반</td>
-                        <td>오답</td>
-                    </thead>
-                    <tbody>
-                        <tr @click="goToPage('noticeDetail')">
-                            <td></td>
-                            <td></td>
-                            <td></td>
-                            <td></td>
-                            <td></td>
-                        </tr>
-                    </tbody>
-                </table>
-                <!-- <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;">
-                    <button><img src="../../../resources/img/btn27_90t_normal.png" alt=""></button>
-                    <button class="selected-btn">1</button>
-                    <button>2</button>
-                    <button>3</button>
-                    <button><img src="../../../resources/img/btn28_90t_normal.png" alt=""></button>
-                </article> -->
+        <hr>
+        <div v-if="selectedTab === 'tab1'">
+            <div class="flex align-center mb20">
+                <label for="" class="title2">답1</label>
+                <input type="text" class="data-wrap">
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">답2</label>
+                <input type="text" class="data-wrap">
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">답3</label>
+                <input type="text" class="data-wrap">
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">답4</label>
+                <input type="text" class="data-wrap">
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">해설</label>
+                <textarea name="" id="" class="data-wrap"></textarea>
             </div>
         </div>
+       <div v-else-if="selectedTab === 'tab2'">
+            <div class="flex align-center mb20">
+                <label for="" class="title2">답</label>
+                    <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                            <option value="bbsTtl">O</option>
+                            <option value="bbsCnt">X</option>
+                        </select>
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">해설</label>
+                <textarea name="" id="" class="data-wrap"></textarea>
+            </div>
+       </div>
+       <div v-else-if="selectedTab === 'tab3'">
+            <div class="gd-col2 " >
+                <div class="flex align-center mb20 mr40" >
+                    <label for="" class="title2">문제1</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20">
+                    <label for="" class="title2">답1</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20 mr40">
+                    <label for="" class="title2">문제2</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20">
+                    <label for="" class="title2">답2</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20 mr40">
+                    <label for="" class="title2">문제3</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20 ">
+                    <label for="" class="title2">답3</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20 mr40">
+                    <label for="" class="title2">문제4</label>
+                    <input type="text" class="data-wrap">
+                </div>
+                <div class="flex align-center mb20">
+                    <label for="" class="title2">답4</label>
+                    <input type="text" class="data-wrap">
+                </div>
+            </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">해설</label>
+                <textarea name="" id="" class="data-wrap"></textarea>
+            </div>
+       </div>
+       <div v-else-if="selectedTab === 'tab4'">
+                <div class="flex align-center mb20 mr40" >
+                    <label for="" class="title2">문제1</label>
+                    <input type="text" class="data-wrap">
+                    <input type="checkbox" class="ui-checkbox ml30">
+                </div>
+                <div class="flex align-center mb20 mr40">
+                    <label for="" class="title2">문제2</label>
+                    <input type="text" class="data-wrap">
+                    <input type="checkbox" class="ui-checkbox ml30">
+                </div>
+                <div class="flex align-center mb20 mr40">
+                    <label for="" class="title2">문제3</label>
+                    <input type="text" class="data-wrap">
+                    <input type="checkbox" class="ui-checkbox ml30">
+                </div>
+                <div class="flex align-center mb20 mr40">
+                    <label for="" class="title2">문제4</label>
+                    <input type="text" class="data-wrap">
+                    <input type="checkbox" class="ui-checkbox ml30">
+                </div>
+            <div class="flex align-center mb20">
+                <label for="" class="title2">해설</label>
+                <textarea name="" id="" class="data-wrap"></textarea>
+            </div>
+       </div>
+       
     </div>
     <div class="flex justify-between mt50">
         <button type="button" title="글쓰기" class="new-btn" @click="goToPage('QuestionList')">
@@ -58,10 +187,10 @@
         </button>
         <div class="flex">
             <button type="button" title="글쓰기" class="new-btn mr10">
-                수정
+                취소
             </button>
             <button type="button" title="글쓰기" class="new-btn">
-                삭제
+                등록
             </button>
         </div>
     </div>
@@ -76,6 +205,7 @@
     data() {
         return {
             mdiMagnify: mdiMagnify,
+            selectedTab: 'tab1',
         }
     },
     methods: {
@@ -96,4 +226,7 @@
         console.log('Main2 mounted');
     }
 }
-</script>
(파일 끝에 줄바꿈 문자 없음)
+</script>
+<style scoped>
+.ui-checkbox{width: 30px; height: 30px;}
+</style>
(파일 끝에 줄바꿈 문자 없음)
client/views/pages/teacher/QuestionList.vue
--- client/views/pages/teacher/QuestionList.vue
+++ client/views/pages/teacher/QuestionList.vue
@@ -2,9 +2,15 @@
     <div class="title-box flex justify-between mb40">
         <p class="title">문제</p>
         <select name="" id="">
-            <option value="">1단원</option>
+            <option value="">A교재</option>
         </select>
     </div>
+    <label for="" class="title2">단원</label>
+        <div class="unit-pagination flex mt10 mb20" style="gap: 10px;">
+            <button class="selected-btn">1</button>
+            <button>2</button>
+            <button>3</button>
+        </div>
     <div class="search-wrap flex justify-end mb20">
             <select name="" id="" class="mr10 data-wrap">
                 <option value="">전체</option>
@@ -19,13 +25,13 @@
                 <thead>
                     <td>No.</td>
                     <td>제목</td>
-                    <td>문제</td>
-                    <td>작성자</td>
-                    <td>오답률</td>
+                    <td>내용</td>
+                    <td>유형</td>
+                    <td>지문</td>
                     <td>등록일</td>
                 </thead>
                 <tbody>
-                    <tr @click="goToPage('QuestionInsert')">
+                    <tr @click="goToPage('QuestionDetail')">
                         <td></td>
                         <td></td>
                         <td></td>
 
client/views/pages/teacher/RoadMap.vue (added)
+++ client/views/pages/teacher/RoadMap.vue
@@ -0,0 +1,166 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">A반</p>
+        <select name="" id="">
+            <option value="">A 교재</option>
+        </select>
+    </div>
+    <div class="board-wrap" style="    height: calc(100% - 16rem);">
+        <label for="" class="title2">단원</label>
+        <div class="table-pagination flex mt10">
+            <button class="selected-btn">1</button>
+            <button>2</button>
+            <button>3</button>
+        </div>
+        <hr>
+        <label for="" class="title2 ">1단원 로드맵 등록</label>
+        <div class="search-wrap flex mb20 mt30">
+            <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                <option value="bbsTtl">제목</option>
+                <option value="bbsCnt">내용</option>
+                <option value="userNm">작성자</option>
+                <option value="bbsCls">카테고리</option>
+            </select>
+            <input v-model="searchKeyword" type="text" placeholder="검색하세요." @keyup.enter="boardDataSearch" />
+            <button type="button" @click="boardDataSearch()" title="게시글 검색">
+                <img src="../../../resources/img/look_t.png" alt="" />
+            </button>
+        </div>
+        <div class="flex justify-between align-center mypage mt10" style="height: calc(100% - 23rem);">
+            <div class="textbook big book-gray">
+                <div class="text ">
+                    <p class="title1">학습항목</p>
+                </div>
+                <div class="box flex-column" style="gap: 30px;">
+                    <!-- 지문 -->
+                    <div class="textbook book-red">
+                        <div class="text ">
+                            <p class="title1" style="color: #fff;">지문. 제목</p>
+                        </div>
+                        <div class="box">
+                            
+                            <P class="title2 mt10">지문 내용</P>
+                        </div>
+                    </div>
+                    <!-- 단어 -->
+                    <div class="textbook ">
+                        <div class="text ">
+                            <p class="title1" style="color: #fff;">단어장1</p>
+                        </div>
+                        <div class="box">
+                            
+                            <P class="title2 mt10">단어1</P>
+                        </div>
+                    </div>
+                    <!-- 문제 -->
+                    <div class="textbook book-blue">
+                        <div class="text ">
+                            <p class="title1" style="color: #fff;">문제1</p>
+                        </div>
+                        <div class="box">
+                            
+                            <P class="title2 mt10">문제유형</P>
+                            <P class="title2 mt10">정답</P>
+                        </div>
+                    </div>
+                    <!-- 평가 -->
+                    <div class="textbook book-navy">
+                        <div class="text ">
+                            <p class="title1" style="color: #fff;">평가1</p>
+                        </div>
+                        <div class="box">
+                            
+                            <P class="title2 mt10">평가 내용</P>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="textbook big book-gray">
+                <div class="text ">
+                    <p class="title1">로드맵</p>
+                </div>
+                <div class="box flex-column" style="gap: 10px;">
+                    <div class="dropbox"><P class="title2">여기로 드래그 하세요</P></div>
+                    <div class="text-ct"><svg-icon type="mdi" :path="mdilArrowDown" style="width: 40px; height: 40px; color: #8C8E92;"></svg-icon></div>
+                    <div class="dropbox"><P class="title2">여기로 드래그 하세요</P></div>
+                    <div class="text-ct"><svg-icon type="mdi" :path="mdilArrowDown" style="width: 40px; height: 40px; color: #8C8E92;"></svg-icon></div>
+                    <div class="dropbox"><P class="title2">여기로 드래그 하세요</P></div>
+                </div>
+            </div>
+        </div>
+
+    </div>
+    <div class="flex justify-end mt30" style="gap: 10px;">
+        <!-- <button type="button" title="" class="new-btn" @click="showConfirm('delete')">
+            추가
+        </button> -->
+        <button type="button" title="" class="new-btn" @click="goToPage('TextBookDetail')">
+            취소
+        </button>
+        <button type="button" title="" class="new-btn" @click="goToPage('TextBookDetail')">
+            등록
+        </button>
+    </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify, mdilArrowRight } from '@mdi/js';
+import { mdilArrowDown } from '@mdi/light-js';
+import ProgressBar from '../../component/ProgressBar.vue';
+
+
+export default {
+    data() {
+        return {
+            mdilArrowDown: mdilArrowDown,
+            mdiMagnify: mdiMagnify,
+            mdilArrowRight: mdilArrowRight,
+            timer: "00:00",
+            progress: 20
+        }
+    },
+    methods: {
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
+        increaseProgress() {
+            if (this.progress < 100) {
+                this.progress += 10;
+            }
+        },
+        showConfirm(type) {
+            let message = '';
+            if (type === 'delete') {
+                message = '삭제하시겠습니까?';
+            } else if (type === 'reset') {
+                message = '초기화하시겠습니까?';
+            } else if (type === 'save') {
+                message = '등록하시겠습니까?';
+            }
+
+            if (confirm(message)) {
+                this.goBack();
+            }
+        },
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        SvgIcon,
+        ProgressBar
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>
+<style scoped>
+.search-wrap button {
+    right: 83rem;
+}
+</style>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/teacher/TextBookDetail.vue
--- client/views/pages/teacher/TextBookDetail.vue
+++ client/views/pages/teacher/TextBookDetail.vue
@@ -1,70 +1,191 @@
 <template>
     <div class="title-box flex justify-between mb40">
-        <p class="title">교재 관리</p>
-        <select name="" id="">
-            <option value="">A 교재</option>
-        </select>
+        <p class="title">A교재</p>
+        <!-- <select name="" id="">
+            <option value="">1단원</option>
+        </select> -->
     </div>
-    <div class="board-wrap">
-        <label for="" class="title2">단원</label>
-        <div class="table-pagination flex mt10">
+    <label for="" class="title1">단원</label>
+        <div class="unit-pagination flex mt10" style="gap: 10px;">
             <button class="selected-btn">1</button>
             <button>2</button>
             <button>3</button>
+            <button ><svg-icon type="mdi" :path="mdiPlus" style="    padding-top: 6px;
+    width: 30px;
+    height: 30px;"></svg-icon></button>
+        </div>
+    <div class="board-wrap mt30">
+        <div class="mb20 ">
+            <div class="flex justify-between mb30 align-center">
+                <label for="" class="title1">지문</label>
+                <div class="look-btn flex align-center" @click="goToPage('TextList')">
+                    <p>자세히 보기 </p>
+                    <svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon>
+                </div>
+            </div>
+            <div class="table-wrap">
+                <table>
+                    <thead>
+                        <td>No.</td>
+                        <td>제목</td>
+                        <td>내용</td>
+                        <td>작성자</td>
+                        <td>등록일</td>
+                    </thead>
+                    <tbody>
+                        <tr>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                        </tr>
+                    </tbody>
+                </table>
+            </div>
         </div>
         <hr>
-        <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('TextList')">
-            <label for="" class="title1">지문</label>
-            <div class="flex align-center " style="gap: 10px;">
-                <p>00개</p>
-                <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button>
+        <div class="mb20" >
+            <div class="flex justify-between mb30 align-center">
+                <label for="" class="title1">문제</label>
+                <div class="look-btn flex align-center" @click="goToPage('QuestionList')">
+                    <p>자세히 보기 </p>
+                    <svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon>
+                </div>
+            </div>
+            <div class="table-wrap">
+                <table>
+                    <thead>
+                        <td>No.</td>
+                        <td>제목</td>
+                        <td>내용</td>
+                        <td>작성자</td>
+                        <td>등록일</td>
+                    </thead>
+                    <tbody>
+                        <tr>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                        </tr>
+                    </tbody>
+                </table>
             </div>
         </div>
-        <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('QuestionList')">
-            <label for="" class="title1">문제</label>
-            <div class="flex align-center " style="gap: 10px;">
-                <p>00개</p>
-                <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button>
+        <hr>
+        <div class="mb20" >
+            <div class="flex justify-between mb30 align-center">
+                <label for="" class="title1">단어</label>
+                <div class="look-btn flex align-center" @click="goToPage('VocaList')">
+                    <p>자세히 보기 </p>
+                    <svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon>
+                </div>
+            </div>
+            <div class="table-wrap">
+                <table>
+                    <thead>
+                        <td>No.</td>
+                        <td>단어</td>
+                        <td>뜻</td>
+                        <td>작성자</td>
+                        <td>등록일</td>
+                    </thead>
+                    <tbody>
+                        <tr>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                        </tr>
+                    </tbody>
+                </table>
             </div>
         </div>
-        <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('VocaList')">
-            <label for="" class="title1">단어</label>
-            <div class="flex align-center " style="gap: 10px;">
-                <p>00개</p>
-                <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button>
+        <hr>
+        <div class="mb20" >
+            <div class="flex justify-between mb30 align-center">
+                <label for="" class="title1">중간 평가</label>
+                <div class="look-btn flex align-center" @click="goToPage('ExamList')">
+                    <p>자세히 보기 </p>
+                    <svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon>
+                </div>
+            </div>
+            <div class="table-wrap">
+                <table>
+                    <thead>
+                        <td>No.</td>
+                        <td>제목</td>
+                        <td>내용</td>
+                        <td>작성자</td>
+                        <td>등록일</td>
+                    </thead>
+                    <tbody>
+                        <tr>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                        </tr>
+                    </tbody>
+                </table>
             </div>
         </div>
-        <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('ExamList')">
-            <label for="" class="title1">중간 평가</label>
-            <div class="flex align-center " style="gap: 10px;">
-                <p>00개</p>
-                <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button>
+        <hr>
+        <div >
+            <div class="flex justify-between mb30 align-center">
+                <label for="" class="title1">최종 평가</label>
+                <div class="look-btn flex align-center" @click="goToPage('ExamList')">
+                    <p>자세히 보기 </p>
+                    <svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon>
+                </div>
             </div>
-        </div>
-        <div class="bookmanage-btn flex justify-between align-center" @click="goToPage('ExamList')">
-            <label for="" class="title1">최종 평가</label>
-            <div class="flex align-center " style="gap: 10px;">
-                <p>00개</p>
-                <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button>
+            <div class="table-wrap">
+                <table>
+                    <thead>
+                        <td>No.</td>
+                        <td>제목</td>
+                        <td>내용</td>
+                        <td>작성자</td>
+                        <td>등록일</td>
+                    </thead>
+                    <tbody>
+                        <tr>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                        </tr>
+                    </tbody>
+                </table>
             </div>
         </div>
     </div>
-    <div class="flex justify-end mt30">
+    <!-- <div class="flex justify-end mt30" style="gap: 10px;">
+        <button type="button" title="" class="new-btn" @click="goToPage('RoadMap')">
+            로드맵
+        </button>
         <button type="button" title="" class="new-btn" @click="showConfirm('delete')">
             삭제
         </button>
-    </div>
+    </div> -->
 </template>
 
 <script>
 import SvgIcon from '@jamescoyle/vue-icon';
-import { mdiMagnify, mdilArrowRight } from '@mdi/js';
+import { mdiMagnify,mdiPlus  } from '@mdi/js';
+import { mdilArrowRight } from '@mdi/light-js';
 import ProgressBar from '../../component/ProgressBar.vue';
 
 
 export default {
     data() {
         return {
+            mdiPlus :mdiPlus ,
             mdiMagnify: mdiMagnify,
             mdilArrowRight: mdilArrowRight,
             timer: "00:00",
@@ -109,4 +230,5 @@
         console.log('Main2 mounted');
     }
 }
-</script>
(파일 끝에 줄바꿈 문자 없음)
+</script>
+<style scoped></style>
(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/teacher/TextDetail.vue (added)
+++ client/views/pages/teacher/TextDetail.vue
@@ -0,0 +1,229 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">지문 상세 보기</p>
+    </div>
+    <div class="board-wrap">
+        <div class="flex align-center mb20">
+            <label for="" class="title2">제목</label>
+            <input v-if="isEditing" type="text" v-model="post.textTtl" class=" data-wrap">
+            <p class="data-wrap" v-else>{{ post.textTtl }}</p>
+        </div>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">URL</label>
+            <input v-if="isEditing" type="text" v-model="post.textUrl" class="data-wrap">
+            <p v-else class="data-wrap">{{ post.textUrl }}</p>
+        </div>
+        <div class="flex align-center mb20" style="display: flex; flex-direction: row;">
+            <label class="title2">형식</label>
+            <label class="title2">
+                <input type="radio" v-model="post.textTypeId" value="1" class="data-wrap" :disabled="!isEditing"> 일반
+            </label>
+            <label class="title2">
+                <input type="radio" v-model="post.textTypeId" value="2" class="data-wrap" :disabled="!isEditing"> 대화
+            </label>
+            <label class="title2">
+                <input type="radio" v-model="post.textTypeId" value="3" class="data-wrap" :disabled="!isEditing"> 책 리스닝
+            </label>
+            <select v-if="isEditing" id="" v-model="post.bookId" @change="fetchUnits" class="ml20">
+                <option value="" disabled>교재를 선택하세요</option>
+                <option v-for="book in books" :key="book.book_id" :value="book.book_id">
+                    {{ book.book_nm }}
+                </option>
+            </select>
+            <label v-else for="" class="title2 flex align-center ml20" style="display: flex; width: 20rem;">교재:&nbsp;
+                <p class="title2">{{ post.bookName }}</p>
+            </label>
+                <select v-if="isEditing" name="" id="" v-model="post.unitId" class="ml20">
+                    <option value="" disabled>단원을 선택하세요</option>
+                    <option v-for="unit in units" :key="unit.unitId" :value="unit.unitId">
+                        {{ unit.unitName }}
+                    </option>
+                </select>
+            <label v-else  for="" class="title2 flex align-center ml20"
+                style="display: flex; width: 20rem; text-align: right;">단원:&nbsp;
+                <p class="title2">{{ post.unitName }}</p>
+            </label>
+        </div>
+        <hr>
+        <div class="flex align-center">
+            <label for="" class="title2">스크립트</label>
+            <textarea v-if="isEditing" v-model="post.textCnt" class="data-wrap"></textarea>
+            <p v-else class="data-wrap">{{ post.textCnt }}</p>
+        </div>
+    </div>
+    <div class="flex justify-between mt50">
+        <button type="button" title="목록으로" class="new-btn" @click="goToPage('TextList')">
+            목록
+        </button>
+        <div class="flex">
+            <button type="button" title="수정" class="new-btn mr10" @click="toggleEdit">
+                {{ isEditing ? '저장' : '수정' }}
+            </button>
+            <button type="button" title="삭제" class="new-btn" @click="deletePost">
+                삭제
+            </button>
+        </div>
+    </div>
+</template>
+
+<script>
+import axios from "axios";
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify } from '@mdi/js';
+
+export default {
+    data() {
+        return {
+            mdiMagnify: mdiMagnify,
+            post: {
+                textId: "",
+                textTtl: "",
+                textCnt: "",
+                textUrl: "",
+                textTypeId: "",
+                bookId: "",
+                unitId: "",
+                bookName: "",  
+                unitName: ""
+            },
+            books: [],  
+            units: [], 
+            isEditing: false
+        };
+    },
+    computed: {
+        textId() {
+            return this.$route.query.textId;
+        },
+        selectedBookName() {
+            const book = this.books.find(book => book.book_id === this.post.bookId);
+            return book ? book.book_nm : '';
+        },
+        selectedUnitName() {
+            const unit = this.units.find(unit => unit.unit_id === this.post.unitId);
+            return unit ? unit.unit_nm : '';
+        }
+    },
+    methods: {
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
+        fetchPostDetail() {
+            const textId = this.$route.query.textId;
+            axios.post('/text/selectOneText.json', { textId }, {
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                }
+            })
+                .then(response => {
+                    if (response.data && response.data[0]) {
+                        this.post.textId = response.data[0].text_id;
+                        this.post.textTtl = response.data[0].text_ttl;
+                        this.post.textCnt = response.data[0].text_cnt;
+                        this.post.textUrl = response.data[0].text_url;
+                        this.post.textTypeId = response.data[0].text_type_id;
+                        this.post.bookId = response.data[0].book_id;
+                        this.post.unitId = response.data[0].unit_id;
+                        this.post.bookName = response.data[0].book_name;
+                        this.post.unitName = response.data[0].unit_name;
+                    } else {
+                        this.error = "Failed to fetch post details.";
+                    }
+                })
+                .catch(error => {
+                    console.error("Error fetching post detail:", error);
+                    this.error = "Failed to fetch post details.";
+                });
+        },
+        dataInsert() {
+            this.newPost = {
+                textId: this.post.textId,
+                textTtl: this.post.textTtl,
+                textCnt: this.post.textCnt,
+                textUrl: this.post.textUrl,
+                textTypeId: this.post.textTypeId,
+                bookId: this.post.bookId,
+                unitId: this.post.unitId
+            };
+            console.log(this.newPost)
+
+            axios.post("/text/textUpdate.json", this.newPost, {
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                }
+            })
+                .then(response => {
+                    alert(response.data.message);
+                    this.fetchPostDetail();
+                })
+                .catch(error => {
+                    console.log("dataInsert - error:", error.response.data);
+                    alert("게시글 등록에 오류가 발생했습니다.");
+                });
+        },
+        toggleEdit() {
+            if (this.isEditing) {
+                this.dataInsert();
+                this.isEditing = false;
+            } else {
+                this.isEditing = true;
+                this.fetchBooks();
+            }
+        },
+        deletePost() {
+            axios.post("/text/textDelete.json", { textId: this.textId }, {
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                }
+            })
+                .then(response => {
+                    alert(response.data.message);
+                    this.goToPage('TextList');
+                })
+                .catch(error => {
+                    console.error("Error deleting post:", error);
+                    alert("게시글 삭제에 오류가 발생했습니다.");
+                });
+        },
+        fetchBooks() {
+            axios.post("/book/findAll.json", {}, {
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                }
+            })
+                .then(response => {
+                    this.books = response.data;  
+                })
+                .catch(error => {
+                    console.error("fetchBooks - error:", error);
+                    alert("교재 목록을 불러오는 중 오류가 발생했습니다.");
+                });
+        },
+        fetchUnits() {
+            if (!this.post.bookId) return;  
+
+            axios.post("/unit/unitList.json", { bookId: this.post.bookId }, {
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                }
+            })
+                .then(response => {
+                    this.units = response.data;  
+                })
+                .catch(error => {
+                    console.error("fetchUnits - error:", error);
+                    alert("단원 목록을 불러오는 중 오류가 발생했습니다.");
+                });
+        }
+    },
+    mounted() {
+        this.fetchPostDetail();
+    },
+    components: {
+        SvgIcon
+    }
+};
+</script>
+
+<style scoped> 
+</style>
client/views/pages/teacher/TextInsert.vue
--- client/views/pages/teacher/TextInsert.vue
+++ client/views/pages/teacher/TextInsert.vue
@@ -1,63 +1,221 @@
+
 <template>
     <div class="title-box flex justify-between mb40">
         <p class="title">지문 등록</p>
     </div>
-        <div class="board-wrap">
-            <div class="flex align-center mb20">
-                <label for="" class="title2">제목</label>
-                <input type="text" class="data-wrap">
-            </div>
-            <div class="flex align-center">
-                <label for="" class="title2">URL</label>
-                <input type="text" class="data-wrap">
-            </div>
-            <hr>
-            <div class="flex align-center">
-                <label for="" class="title2">스크립트</label>
-                <textarea name="" id="" class="data-wrap"></textarea>
-            </div>
+    <div class="board-wrap">
+        <div class="flex align-center mb20">
+            <label for="" class="title2">제목</label>
+            <input type="text" class="data-wrap" v-model="newData.textTtl">
         </div>
-        <div class="flex justify-between mt50">
-                <button type="button" title="글쓰기" class="new-btn"  @click="goToPage('TextList')">
-                    목록
-                </button>
-               <div class="flex">
-                    <button type="button" title="글쓰기" class="new-btn mr10"  >
-                        수정
-                    </button>
-                    <button type="button" title="글쓰기" class="new-btn"  >
-                        삭제
-                    </button>
-               </div>
+        <div class="flex align-center mb20">
+            <label for="" class="title2">URL</label>
+            <input type="text" class="data-wrap" v-model="newData.textUrl">
         </div>
+        <div class="flex align-center">
+            <label class="title2">형식</label>
+            <label class="title2">
+                <input type="radio" v-model="newData.textTypeId" value="1" class="data-wrap"> 일반
+            </label>
+            <label class="title2">
+                <input type="radio" v-model="newData.textTypeId" value="2" class="data-wrap"> 대화
+            </label>
+            <label class="title2">
+                <input type="radio" v-model="newData.textTypeId" value="3" class="data-wrap"> 책 리스닝
+            </label>
+            <select name="" id="" v-model="newData.bookId" @change="fetchUnits" class="ml20">
+                <option value="" disabled>교재를 선택하세요</option>
+                <option v-for="book in books" :key="book.book_id" :value="book.book_id">
+                    {{ book.book_nm }}
+                </option>
+            </select>
+            <select name="" id="" v-model="newData.unitId" class="ml20">
+                <option value="" disabled>단원을 선택하세요</option>
+                <option v-for="unit in units" :key="unit.unitId" :value="unit.unitId">
+                    {{ unit.unitName }}
+                </option>
+            </select>
+        </div>
+        <hr>
+        <div class="flex align-center">
+            <label for="" class="title2">스크립트</label>
+            <textarea name="" id="" class="data-wrap" v-model="newData.textCnt"></textarea>
+        </div>
+    </div>
+    <div class="flex justify-between mt50">
+        <button type="button" title="글쓰기" class="new-btn" @click="goToPage('TextList')">
+            목록
+        </button>
+        <div class="flex">
+            <button type="button" title="글쓰기" class="new-btn mr10" @click="handleButtonAction">
+                작성
+            </button>
+        </div>
+    </div>
 </template>
 
 <script>
+import axios from "axios";
 import SvgIcon from '@jamescoyle/vue-icon';
-import { mdiMagnify} from '@mdi/js';
+import { mdiMagnify } from '@mdi/js';
 
 
 export default {
-    data () {
+    computed: {
+        textId() {
+            return this.$route.query.textId;
+        }
+    },
+    data() {
         return {
             mdiMagnify: mdiMagnify,
+            post: null,
+            newData: {
+                textId: "",
+                textTtl: "",
+                textCnt: "",
+                textUrl: "",
+                textTypeId: "",
+                //fileMngId:"",
+                // userId:"".
+                bookId: "",
+                unitId: ""
+            },
+            books: [],  
+            units: [],  
         }
     },
     methods: {
         goToPage(page) {
-         this.$router.push({ name: page });
-      },
+            this.$router.push({ name: page });
+        }, fetchPostDetail() {
+            const textId = this.$route.query.textId
+            axios({
+                url: `/text/selectOneText.json`,
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: { "textId": textId }
+            })
+                .then(response => {
+                    if (response.data && response.data[0]) {
+                        this.post = response.data[0];
+                        this.editTitle = this.post.title;
+                        this.editContent = this.post.content;
+                        console.log(this.post);
+                    } else {
+                        this.error = "Failed to fetch post details.";
+                    }
+                })
+                .catch(error => {
+                    console.error("Error fetching post detail:", error);
+                    this.error = "Failed to fetch post details.";
+                });
+        }, dataInsert() {
+            const vm = this;
+            axios({
+                url: "/text/insertText.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: vm.newData,
+            })
+                .then(response => {
+                    alert(response.data.message);
+                    this.goToPage('TextList')
+                })
+                .catch(error => {
+                    console.log("dataInsert - error : ", error.response.data);
+                    alert("게시글 등록에 오류가 발생했습니다.");
+                });
+        },
+        handleButtonAction() {
+            if (!this.newData.textTtl) {
+                alert("제목을 입력해 주세요.");
+                return;
+            }
+
+            if (!this.newData.textUrl) {
+                alert("url을 입력해 주세요.");
+                return;
+            }
+
+            if (!this.newData.textTypeId) {
+                alert("지문 형식을 입력해 주세요.");
+                return;
+            }
+
+            if (!this.newData.bookId) {
+                alert("교재를 선택해 주세요.");
+                return;
+            }
+
+            if (!this.newData.unitId) {
+                alert("단원을 선택해 주세요.");
+                return;
+            }
+
+            if (!this.newData.textCnt) {
+                alert("내용을 입력해 주세요.");
+                return;
+            }
+
+            this.dataInsert();
+        },
+        fetchBooks() {
+            axios({
+                url: "/book/findAll.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+            })
+                .then(response => {
+                    console.log(response.data)
+                    this.books = response.data;  
+                })
+                .catch(error => {
+                    console.error("fetchBooks - error: ", error);
+                    alert("교재 목록을 불러오는 중 오류가 발생했습니다.");
+                });
+        },
+        fetchUnits() {
+            if (!this.newData.bookId) return;  
+
+            axios({
+                url: "/unit/unitList.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: {
+                    "bookId": this.newData.bookId
+                },
+            })
+                .then(response => {
+                    console.log(response.data)
+                    this.units = response.data;  
+                })
+                .catch(error => {
+                    console.error("fetchUnits - error: ", error);
+                    alert("단원 목록을 불러오는 중 오류가 발생했습니다.");
+                });
+        },
     },
     watch: {
 
     },
     computed: {
-       
+
     },
-    components:{
+    components: {
         SvgIcon
     },
     mounted() {
+        this.fetchPostDetail();
+        this.fetchBooks();  
         console.log('Main2 mounted');
     }
 }
client/views/pages/teacher/TextList.vue
--- client/views/pages/teacher/TextList.vue
+++ client/views/pages/teacher/TextList.vue
@@ -1,69 +1,109 @@
 <template>
-    <div class="title-box flex justify-between mb40">
+    <div class="title-box flex justify-between mb40 myplan">
         <p class="title">지문</p>
-        <select name="" id="">
-            <option value="">1단원</option>
+        <select name="" id="" v-model="selectedBook" @change="fetchUnits">
+            <option value="" disabled>교재를 선택하세요</option>
+            <option v-for="book in books" :key="book.book_id" :value="book.book_id">
+                {{ book.book_nm }}
+            </option>
         </select>
     </div>
+    <label for="" class="title2">단원</label>
+    <div class="unit-pagination flex mt10 mb20" style="gap: 10px;">
+        <button 
+            v-for="(unit, index) in units" 
+            :key="index" 
+            :class="{ 'selected-btn': selectedUnit === unit.unitId }"
+            @click="selectUnit(unit.unitId)">
+            {{ unit.unitName }}
+        </button>
+    </div>
     <div class="search-wrap flex justify-end mb20">
-            <select name="" id="" class="mr10 data-wrap">
-                <option value="">전체</option>
-            </select>
-                <input  type="text" placeholder="검색하세요.">
-                <button type="button" title="위원회 검색">
-                    <img src="../../../resources/img/look_t.png" alt="">
-                </button>
-        </div>
-        <div class="table-wrap">
-            <table>
-                <thead>
+        <select name="" id="" class="mr10 data-wrap" style="width: 15rem;" v-model="option">
+            <option value="" disabled>검색유형</option>
+            <option v-for="g in optionList" :key="g.value" :value="g.value">{{ g.text }}</option>
+        </select>
+        <input type="text" placeholder="검색하세요." v-model="keyword">
+        <button type="button" title="위원회 검색" @click="search">
+            <img src="../../../resources/img/look_t.png" alt="">
+        </button>
+    </div>
+    <div class="table-wrap">
+        <table>
+            <thead>
+                <tr>
                     <td>No.</td>
                     <td>제목</td>
                     <td>내용</td>
                     <td>작성자</td>
                     <td>등록일</td>
-                </thead>
-                <tbody>
-                    <tr @click="goToPage('TextInsert')">
-                        <td></td>
-                        <td></td>
-                        <td></td>
-                        <td></td>
-                        <td></td>
-                    </tr>
-                </tbody>
-            </table>
-            <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;">
-                    <button><img src="../../../resources/img/btn27_90t_normal.png" alt=""></button>
-                    <button class="selected-btn">1</button>
-                    <button>2</button>
-                    <button>3</button>
-                    <button><img src="../../../resources/img/btn28_90t_normal.png" alt=""></button>
-                </article>
-                <div class="flex justify-end ">
-                <button type="button" title="등록" class="new-btn" @click="goToPage('TextInsert')">
-                    등록
-                </button>
+                </tr>
+            </thead>
+            <tbody>
+                <tr v-for="(post, index) in posts" :key="index" class="post"
+                    @click="goToPage('TextDetail', post.textId)">
+                    <td>{{ index + 1 + (currentPage - 1) * pageSize }}</td>
+                    <td>{{ post.textTtl.slice(0, 20) }}{{ post.textTtl.length > 20 ? '...' : '' }}</td>
+                    <td>{{ post.textCnt.slice(0, 20) }}{{ post.textCnt.length > 20 ? '...' : '' }}</td>
+                    <td>{{ post.userId }}</td>
+                    <td>{{ post.regDt }}</td>
+                </tr>
+            </tbody>
+        </table>
+        <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;">
+            <button @click="changePage(currentPage - 1)" :disabled="currentPage === 1">
+                <img src="../../../resources/img/btn27_90t_normal.png" alt="Previous">
+            </button>
+            <button v-for="page in totalPages" :key="page" @click="changePage(page)"
+                :class="{ 'selected-btn': currentPage === page }">
+                {{ page }}
+            </button>
+            <button @click="changePage(currentPage + 1)" :disabled="currentPage === totalPages">
+                <img src="../../../resources/img/btn28_90t_normal.png" alt="Next">
+            </button>
+        </article>
+        <div class="flex justify-end">
+            <button type="button" title="등록" class="new-btn" @click="goToPage('TextInsert')">
+                등록
+            </button>
         </div>
-        </div>
+    </div>
 </template>
 
 <script>
+import axios from "axios";
 import SvgIcon from '@jamescoyle/vue-icon';
-import { mdiMagnify} from '@mdi/js';
-
+import { mdiMagnify } from '@mdi/js';
 
 export default {
-    data () {
+    data() {
         return {
             mdiMagnify: mdiMagnify,
-        }
+            posts: [],
+            currentPage: 1,
+            pageSize: 10,
+            totalPosts: 0,
+            option: "",
+            keyword: "",
+            books: [], 
+            selectedBook: "", 
+            optionList: [
+                { text: "번호", value: "textId" },
+                { text: "제목", value: "textTtl" },
+                { text: "내용", value: "textCnt" },
+                { text: "작성자", value: "userId" },
+                { text: "등록일", value: "regDt" },
+            ],
+            units: [], 
+            selectedUnit: null, 
+            searching: false,
+        };
     },
     methods: {
-        goToPage(page) {
-         this.$router.push({ name: page });
-      },
-      showConfirm(type) {
+        goToPage(page, textId) {
+            this.$router.push({ name: page, query: { textId } });
+        },
+        showConfirm(type) {
             let message = '';
             if (type === 'cancel') {
                 message = '삭제하시겠습니까?';
@@ -77,19 +117,110 @@
                 this.goBack();
             }
         },
+        selectUnit(unitId) {
+            this.selectedUnit = unitId;
+            this.fetchData();  
+        },
+        search() {
+            if (!this.option) {
+                alert("검색유형을 선택해 주세요")
+            } else {
+                this.currentPage = 1; 
+                this.searching = true;
+                this.fetchData();  
+            }
+        },
+        fetchData() {
+            const idx = (this.currentPage - 1) * this.pageSize;
+            axios({
+                url: "/text/textSearch.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: {
+                    "option": this.option,
+                    "keyword": this.keyword,
+                    "pageSize": this.pageSize,
+                    "startIndex": idx,
+                    "unitId": this.selectedUnit  
+                },
+            })
+                .then(response => {
+                    this.posts = response.data.list;
+                    if (!this.searching || this.keyword === "") {
+                        this.totalPosts = response.data.totalText;
+                    } else if (this.searching) {
+                        this.totalPosts = response.data.resultCount;
+                    }
+                    this.posts.forEach(post => {
+                        let regDt = post.regDt;
+                        let date = new Date(regDt);
+                        post.regDt = date.toISOString().split('T')[0];
+                    });
+                })
+                .catch(error => {
+                    console.error("fetchData - error: ", error);
+                    alert("검색 중 오류가 발생했습니다.");
+                });
+        },
+        changePage(page) {
+            if (page > 0 && page <= this.totalPages) {
+                this.currentPage = page;
+                this.fetchData();
+            }
+        },
+        fetchBooks() {
+            axios({
+                url: "/book/findAll.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+            })
+                .then(response => {
+                    console.log(response.data)
+                    this.books = response.data;  
+                })
+                .catch(error => {
+                    console.error("fetchBooks - error: ", error);
+                    alert("교재 목록을 불러오는 중 오류가 발생했습니다.");
+                });
+        },
+        fetchUnits() {
+            if (!this.selectedBook) return; 
 
-    },
-    watch: {
-
+            axios({
+                url: "/unit/unitList.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: {
+                    "bookId": this.selectedBook
+                },
+            })
+                .then(response => {
+                    console.log(response.data)
+                    this.units = response.data; 
+                })
+                .catch(error => {
+                    console.error("fetchUnits - error: ", error);
+                    alert("단원 목록을 불러오는 중 오류가 발생했습니다.");
+                });
+        },
     },
     computed: {
-       
+        totalPages() {
+            return Math.ceil(this.totalPosts / this.pageSize);
+        }
     },
-    components:{
+    components: {
         SvgIcon
     },
     mounted() {
-        console.log('Main2 mounted');
+        this.fetchBooks(); // Fetch books when the component is mounted
+        this.fetchData(); // Fetch data for the default view
     }
-}
-</script>
(파일 끝에 줄바꿈 문자 없음)
+};
+</script>
 
client/views/pages/teacher/VocaDetail.vue (added)
+++ client/views/pages/teacher/VocaDetail.vue
@@ -0,0 +1,102 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">단어장 등록</p>
+    </div>
+    <div class="board-wrap">
+        <div class="flex align-center mb20">
+            <label for="" class="title2">지문</label>
+            <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                <option value="bbsTtl">제목</option>
+                <option value="bbsCnt">내용</option>
+                <option value="userNm">작성자</option>
+                <option value="bbsCls">카테고리</option>
+            </select>
+        </div>
+        <div class="flex align-center">
+            <label for="" class="title2">단어 목록</label>
+            <div class="flex-column" style="gap: 10px;">
+                <div class="flex align-center" style="gap: 10px;">
+                    <input type="text" class="data-wrap" placeholder="영어">
+                    <input type="text" class="data-wrap" placeholder="한글">
+                    <button type="button" @click="addThesis">
+                        <img src="../../../resources/img/btn39_120t_normal.png" alt="">
+
+                    </button>
+                </div>
+                <div class="flex align-center " style="gap: 10px;" v-for="(thesis, index) in thesised" :key="thesis.id">
+                    <input type="text" class="data-wrap" placeholder="영어">
+                    <input type="text" class="data-wrap" placeholder="한글">
+                    <button type="button" @click="removeThesis(thesis.id)">
+                        <img src="../../../resources/img/btn38_120t_normal.png" alt="">
+                    </button>
+
+                </div>
+            </div>
+
+        </div>
+    </div>
+    <div class="flex justify-between mt50">
+        <button type="button" title="글쓰기" class="new-btn" @click="goToPage('TextList')">
+            목록
+        </button>
+        <div class="flex">
+            <button type="button" title="글쓰기" class="new-btn mr10">
+                취소
+            </button>
+            <button type="button" title="글쓰기" class="new-btn">
+                수정
+            </button>
+        </div>
+    </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify, mdiPlusCircleOutline, mdiWindowClose } from '@mdi/js';
+
+
+export default {
+    data() {
+        return {
+            thesised: [],
+            mdiPlusCircleOutline: mdiPlusCircleOutline,
+            mdiMagnify: mdiMagnify,
+            mdiWindowClose: mdiWindowClose,
+        }
+    },
+    methods: {
+        // 논문실적 버튼 추가
+        addThesis() {
+            // 고유 ID로 현재 시간의 타임스탬프를 사용
+            const uniqueId = Date.now();
+            this.thesised.push({
+                id: uniqueId, // 고유 ID 추가
+
+            });
+        },
+        removeThesis(thesisId) {
+            // ID를 기준으로 교육 정보 객체를 찾아서 삭제
+            const index = this.thesised.findIndex(thesis => thesis.id === thesisId);
+            if (index !== -1) {
+                this.thesised.splice(index, 1);
+            }
+        },
+        // 
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        SvgIcon
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/teacher/VocaInsert.vue (added)
+++ client/views/pages/teacher/VocaInsert.vue
@@ -0,0 +1,102 @@
+<template>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">단어장 등록</p>
+    </div>
+    <div class="board-wrap">
+        <div class="flex align-center mb20">
+            <label for="" class="title2">지문</label>
+            <select v-model="selectedSearchOption" class="mr10 data-wrap">
+                <option value="bbsTtl">제목</option>
+                <option value="bbsCnt">내용</option>
+                <option value="userNm">작성자</option>
+                <option value="bbsCls">카테고리</option>
+            </select>
+        </div>
+        <div class="flex align-center">
+            <label for="" class="title2">단어 목록</label>
+            <div class="flex-column" style="gap: 10px;">
+                <div class="flex align-center" style="gap: 10px;">
+                    <input type="text" class="data-wrap" placeholder="영어">
+                    <input type="text" class="data-wrap" placeholder="한글">
+                    <button type="button" @click="addThesis">
+                        <img src="../../../resources/img/btn39_120t_normal.png" alt="">
+
+                    </button>
+                </div>
+                <div class="flex align-center " style="gap: 10px;" v-for="(thesis, index) in thesised" :key="thesis.id">
+                    <input type="text" class="data-wrap" placeholder="영어">
+                    <input type="text" class="data-wrap" placeholder="한글">
+                    <button type="button" @click="removeThesis(thesis.id)">
+                        <img src="../../../resources/img/btn38_120t_normal.png" alt="">
+                    </button>
+
+                </div>
+            </div>
+
+        </div>
+    </div>
+    <div class="flex justify-between mt50">
+        <button type="button" title="글쓰기" class="new-btn" @click="goToPage('TextList')">
+            목록
+        </button>
+        <div class="flex">
+            <button type="button" title="글쓰기" class="new-btn mr10">
+                취소
+            </button>
+            <button type="button" title="글쓰기" class="new-btn">
+                등록
+            </button>
+        </div>
+    </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify, mdiPlusCircleOutline, mdiWindowClose } from '@mdi/js';
+
+
+export default {
+    data() {
+        return {
+            thesised: [],
+            mdiPlusCircleOutline: mdiPlusCircleOutline,
+            mdiMagnify: mdiMagnify,
+            mdiWindowClose: mdiWindowClose,
+        }
+    },
+    methods: {
+        // 논문실적 버튼 추가
+        addThesis() {
+            // 고유 ID로 현재 시간의 타임스탬프를 사용
+            const uniqueId = Date.now();
+            this.thesised.push({
+                id: uniqueId, // 고유 ID 추가
+
+            });
+        },
+        removeThesis(thesisId) {
+            // ID를 기준으로 교육 정보 객체를 찾아서 삭제
+            const index = this.thesised.findIndex(thesis => thesis.id === thesisId);
+            if (index !== -1) {
+                this.thesised.splice(index, 1);
+            }
+        },
+        // 
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        SvgIcon
+    },
+    mounted() {
+        console.log('Main2 mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/teacher/VocaList.vue
--- client/views/pages/teacher/VocaList.vue
+++ client/views/pages/teacher/VocaList.vue
@@ -2,9 +2,15 @@
     <div class="title-box flex justify-between mb40">
         <p class="title">단어장</p>
         <select name="" id="">
-            <option value="UNIT_000000000000001">1단원</option>
+            <option value="UNIT_000000000000001">A교재</option>
         </select>
     </div>
+    <label for="" class="title2">단원</label>
+        <div class="unit-pagination flex mt10 mb20" style="gap: 10px;">
+            <button class="selected-btn">1</button>
+            <button>2</button>
+            <button>3</button>
+        </div>
     <div class="search-wrap flex justify-between mb20 align-center">
         <div class="title2 gray">?단원 전체 목록</div>
         <div>
@@ -28,7 +34,7 @@
                 <td>등록일</td>
             </thead>
             <tbody>
-                <tr v-for="(wordBook, index) in dataList" :key="wordBook.wdBookId" @click="goToViewPage('noticeDetail')">
+                <tr v-for="(wordBook, index) in dataList" :key="wordBook.wdBookId" @click="goToViewPage('VocaDetail')">
                     <td>{{ createNo(index) }}</td>
                     <td>{{ wordBook.textTtl }}</td>
                     <td>{{ wordBook.wordsPreview }}</td>
@@ -49,7 +55,7 @@
             </button>
         </article>
         <div class="flex justify-end ">
-            <button type="button" title="등록" class="new-btn" @click="goToPage('noticeInsert')">
+            <button type="button" title="등록" class="new-btn" @click="goToPage('VocaInsert')">
                 등록
             </button>
         </div>
client/views/pages/teacher/noticeDetail.vue
--- client/views/pages/teacher/noticeDetail.vue
+++ client/views/pages/teacher/noticeDetail.vue
@@ -1,78 +1,224 @@
 <template>
-    <div class="title-box flex justify-between mb40">
-        <p class="title">공지 등록</p>
+  <div class="title-box flex justify-between mb40">
+    <p class="title">{{ category }}</p>
+  </div>
+  <div class="board-wrap">
+    <div class="flex align-center">
+      <label for="" class="title2">{{ title }}</label>
     </div>
-        <div class="board-wrap">
-            <div class="flex align-center">
-                <label for="" class="title2">제목</label>
-                <input type="text" class="data-wrap">
-            </div>
-            <hr>
-            <textarea name="" id=""></textarea>
-            <hr>
-            <div class="flex align-center">
-                <label for="" class="title2">첨부파일</label>
-                <input type="file" ref="fileInput" @change="handleFileUpload" />
-            </div>
-            <hr>
-            <div class="flex justify-between">
-                <button type="button" class="flex align-center">
-                            <svg-icon type="mdi" :path="mdilChevronLeft" ></svg-icon>
-                   <p> 이전글</p>
-                        </button>
-                <button type="button" class="flex align-center"><p>다음글</p>
-                            <svg-icon type="mdi" :path="mdilChevronRight" ></svg-icon>
-
-                        </button>
-
-
-            </div>
-        </div>
-        <div class="flex justify-between mt50">
-                <button type="button" title="글쓰기" class="new-btn"  @click="goToPage('Board')">
-                    목록
-                </button>
-               <div class="flex">
-                    <button type="button" title="글쓰기" class="new-btn mr10"  >
-                        수정
-                    </button>
-                    <button type="button" title="글쓰기" class="new-btn"  >
-                        삭제
-                    </button>
-               </div>
-        </div>
+    <hr />
+    <textarea readonly name="" id="">{{ content }}</textarea>
+    <hr />
+    <div class="flex align-center">
+      <label for="" class="title2">첨부파일</label>
+      <label for="" class="title2" v-if="file">{{ file.fileNm }}</label>
+    </div>
+    <hr />
+    <div class="flex justify-between">
+      <button type="button" class="flex align-center" @click="prevBoard()">
+        <svg-icon type="mdi" :path="mdilChevronLeft"></svg-icon>
+        <p>이전글</p>
+      </button>
+      <button type="button" class="flex align-center" @click="nextBoard()">
+        <p>다음글</p>
+        <svg-icon type="mdi" :path="mdilChevronRight"></svg-icon>
+      </button>
+    </div>
+  </div>
+  <div class="flex justify-between mt50">
+    <button
+      type="button"
+      title="글쓰기"
+      class="new-btn"
+      @click="goToPage('Board')"
+    >
+      목록
+    </button>
+    <div class="flex">
+      <button
+        type="button"
+        title="글쓰기"
+        class="new-btn mr10"
+        @click="goToPage('noticeInsert')"
+      >
+        수정
+      </button>
+      <button
+        type="button"
+        title="글쓰기"
+        class="new-btn"
+        @click="[deleteBoard(), goToPage('Board')]"
+      >
+        삭제
+      </button>
+    </div>
+  </div>
 </template>
 
 <script>
-import SvgIcon from '@jamescoyle/vue-icon';
-import { mdiMagnify } from '@mdi/js';
-import { mdilChevronRight,mdilChevronLeft } from '@mdi/light-js';
-
+import SvgIcon from "@jamescoyle/vue-icon";
+import { mdiMagnify } from "@mdi/js";
+import { mdilChevronRight, mdilChevronLeft } from "@mdi/light-js";
+import axios from "axios";
 
 export default {
-    data () {
-        return {
-            mdiMagnify: mdiMagnify,
-            mdilChevronRight: mdilChevronRight ,
-            mdilChevronLeft:mdilChevronLeft,
-        }
-    },
-    methods: {
-        goToPage(page) {
-         this.$router.push({ name: page });
-      },
-    },
-    watch: {
+  data() {
+    return {
+      mdiMagnify: mdiMagnify,
+      mdilChevronRight: mdilChevronRight,
+      mdilChevronLeft: mdilChevronLeft,
 
+      dataList: null,
+      sclsId: "",
+      bbsId: "",
+
+      title: "",
+      content: "",
+      category: "",
+      file: "",
+      time: "",
+      user: "",
+    };
+  },
+  methods: {
+    goToPage(page) {
+      this.$router.push({ name: page });
     },
-    computed: {
-       
+
+    findBoard() {
+      const vm = this;
+      vm.bbsId = JSON.parse(sessionStorage.getItem("bbsId"));
+      console.log(vm.bbsId);
+      axios({
+        url: "/board/find.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          bbsId: vm.bbsId,
+        },
+      })
+        .then(function (res) {
+          console.log("boardData - response : ", res.data);
+          vm.dataList = res.data.result[0].boardClass[0].board[0];
+          vm.title = vm.dataList.bbsTtl;
+          vm.content = vm.dataList.bbsCnt;
+          vm.category = vm.dataList.bbsCls;
+          vm.time = vm.dataList.bbsTm;
+          vm.findFile();
+        })
+        .catch(function (error) {
+          console.log("boardData - error : ", error);
+        });
     },
-    components:{
-        SvgIcon
+
+    findFile() {
+      const vm = this;
+      axios({
+        url: "/file/find.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          file_mng_id: vm.dataList.fileMngId,
+        },
+      })
+        .then(function (res) {
+          console.log("fileInfo - response : ", res.data.list[0]);
+          vm.file = res.data.list[0];
+          sessionStorage.setItem("file", JSON.stringify(vm.file));
+        })
+        .catch(function (error) {
+          console.log("result - error : ", error);
+        });
     },
-    mounted() {
-        console.log('Main2 mounted');
-    }
-}
-</script>
(파일 끝에 줄바꿈 문자 없음)
+
+    prevBoard() {
+      const vm = this;
+      axios({
+        url: "/board/prevBoard.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          sclsId: vm.dataList.sclsId,
+          bbsId: vm.dataList.bbsId,
+        },
+      })
+        .then(function (res) {
+          console.log("dataList - response : ", res.data);
+          vm.dataList = res.data[0].boardClass[0].board[0];
+          vm.title = vm.dataList.bbsTtl;
+          vm.content = vm.dataList.bbsCnt;
+          vm.category = vm.dataList.bbsCls;
+          vm.time = vm.dataList.bbsTm;
+          vm.findFile();
+        })
+        .catch(function (error) {
+          console.log("result - error : ", error);
+          alert("첫번째 글 입니다.");
+        });
+    },
+
+    nextBoard() {
+      const vm = this;
+      axios({
+        url: "/board/nextBoard.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          sclsId: vm.dataList.sclsId,
+          bbsId: vm.dataList.bbsId,
+        },
+      })
+        .then(function (res) {
+          console.log("dataList - response : ", res.data);
+          vm.dataList = res.data[0].boardClass[0].board[0];
+          vm.title = vm.dataList.bbsTtl;
+          vm.content = vm.dataList.bbsCnt;
+          vm.category = vm.dataList.bbsCls;
+          vm.time = vm.dataList.bbsTm;
+          vm.findFile();
+        })
+        .catch(function (error) {
+          console.log("result - error : ", error);
+          alert("가장 최신 글 입니다.");
+        });
+    },
+    deleteBoard() {
+      const vm = this;
+      axios({
+        url: "/board/delete.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          bbsId: vm.dataList.bbsId,
+        },
+      })
+        .then(function (res) {
+          console.log("delete - response : ", res.data);
+          alert("삭제 되었습니다.");
+        })
+        .catch(function (error) {
+          console.log("rssult - error : ", error);
+        });
+    },
+  },
+  watch: {},
+  computed: {},
+  components: {
+    SvgIcon,
+  },
+  mounted() {
+    console.log("Main2 mounted");
+    this.findBoard();
+  },
+};
+</script>
client/views/pages/teacher/noticeInsert.vue
--- client/views/pages/teacher/noticeInsert.vue
+++ client/views/pages/teacher/noticeInsert.vue
@@ -1,9 +1,9 @@
 <template>
   <div class="title-box flex justify-between mb40">
-    <p class="title">공지 등록</p>
+    <p class="title">{{ titleLabel }}</p>
   </div>
   <div class="board-wrap">
-    <form @submit.prevent="handleSubmit">
+    <form @submit.prevent="handleButtonAction">
       <div class="flex align-center">
         <label for="title" class="title2">제목</label>
         <input type="text" id="title" class="data-wrap" v-model="title" />
@@ -13,13 +13,21 @@
       <hr />
       <div class="flex align-center">
         <label for="file" class="title2">첨부파일</label>
-        <input type="file" ref="fileInput" @change="handleFileUpload" />
+        <label for="file" class="title2"> {{ file.fileNm }}</label>
+        <input
+          type="file"
+          ref="fileInput"
+          @change="handleFileUpload"
+          multiple
+        />
       </div>
       <div class="flex justify-between mt50">
         <button title="글쓰기" class="new-btn" @click="goToPage('Board')">
           목록
         </button>
-        <button title="글쓰기" class="new-btn">등록</button>
+        <button title="글쓰기" class="new-btn">
+          {{ buttonLabel }}
+        </button>
       </div>
     </form>
   </div>
@@ -38,8 +46,16 @@
       title: "",
       content: "",
       category: "Notice",
+      file: "",
       sclsId: "",
-      selectedFile: null,
+      bbsId: "",
+      fileMngId: null,
+
+      selectedFiles: [],
+      dataList: "",
+
+      // 데이터 편집 상태 (true = 수정, false = 등록)
+      isEditMode: false,
     };
   },
   methods: {
@@ -48,26 +64,113 @@
     },
 
     handleFileUpload(e) {
-      this.selectedFile = e.target.files[0];
-      console.log(this.selectedFile);
+      this.selectedFiles = e.target.files;
     },
 
     created() {
       const vm = this;
       const sclsId = JSON.parse(sessionStorage.getItem("sclsId"));
+      const bbsId = JSON.parse(sessionStorage.getItem("bbsId"));
+      const file = JSON.parse(sessionStorage.getItem("file"));
 
       if (sclsId) {
         vm.sclsId = sclsId;
+        if (bbsId && file) {
+          vm.bbsId = bbsId;
+          vm.file = file;
+          vm.fileMngId = file.fileMngId;
+          vm.isEditMode = true;
+          vm.findBoard();
+        } else {
+          vm.isEditMode = false;
+        }
       }
-      console.log(sclsId);
     },
 
-    async handleSubmit() {
+    // 게시글 상세 조회
+    findBoard() {
+      const vm = this;
+      vm.bbsId = JSON.parse(sessionStorage.getItem("bbsId"));
+      console.log(vm.bbsId);
+      axios({
+        url: "/board/find.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          bbsId: vm.bbsId,
+        },
+      })
+        .then(function (res) {
+          console.log("boardData - response : ", res.data);
+          vm.dataList = res.data.result[0].boardClass[0].board[0];
+          vm.title = vm.dataList.bbsTtl;
+          vm.content = vm.dataList.bbsCnt;
+          vm.category = vm.dataList.bbsCls;
+          vm.time = vm.dataList.bbsTm;
+        })
+        .catch(function (error) {
+          console.log("boardData - error : ", error);
+        });
+    },
+
+    // 게시글 등록
+    async dataInsert() {
       const vm = this;
       try {
         // 파일 업로드
+        if (this.selectedFiles && this.selectedFiles.length > 0) {
+          // 파일 업로드
+          const formData = new FormData();
+          for (let i = 0; i < this.selectedFiles.length; i++) {
+            formData.append("files", this.selectedFiles[i]);
+          }
+
+          const fileUploadResponse = await axios.post(
+            "/file/upload.json",
+            formData,
+            {
+              headers: {
+                "Content-Type": "multipart/form-data",
+              },
+            }
+          );
+
+          // 업로드 후 파일 매니지 아이디 호출
+          fileMngId = fileUploadResponse.data.fileMngId;
+        }
+
+        // 게시물 등록
+        const newData = {
+          bbsTtl: vm.title,
+          bbsCls: vm.category,
+          bbsCnt: vm.content,
+          fileMngId: vm.fileMngId,
+          sclsId: vm.sclsId,
+        };
+
+        await axios.post("/board/insert.json", newData);
+
+        alert("게시물 등록 성공");
+        vm.$router.push({ name: "Board" });
+      } catch (error) {
+        console.error("게시물 등록 실패 ", error);
+        alert("게시물 등록 실패");
+      }
+    },
+
+    // 게시글 수정
+    async boardUpdate() {
+      const vm = this;
+
+      // 파일 업로드
+      if (this.selectedFiles && this.selectedFiles.length > 0) {
+        // 파일 업로드
         const formData = new FormData();
-        formData.append("files", this.selectedFile);
+        for (let i = 0; i < this.selectedFiles.length; i++) {
+          formData.append("files", this.selectedFiles[i]);
+        }
 
         const fileUploadResponse = await axios.post(
           "/file/upload.json",
@@ -80,28 +183,50 @@
         );
 
         // 업로드 후 파일 매니지 아이디 호출
-        const fileMngId = fileUploadResponse.data.fileMngId;
+        fileMngId = fileUploadResponse.data.fileMngId;
+      }
 
-        // 게시물 등록
-        const newData = {
-          bbsTtl: vm.title,
-          bbsCls: vm.category,
-          bbsCnt: vm.content,
-          fileMngId: fileMngId,
-          sclsId: vm.sclsId,
-        };
+      const newData = {
+        bbsTtl: vm.title,
+        bbsCls: vm.category,
+        bbsCnt: vm.content,
+        fileMngId: vm.fileMngId,
+        bbsId: vm.bbsId,
+      };
+      await axios({
+        url: "/board/update.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: newData,
+      })
+        .then(function (res) {
+          console.log("dataUpdate - response : ", res.data);
+        })
+        .catch(function (error) {
+          console.log("result - error : ", error);
+        });
+    },
 
-        await axios.post("/board/insert.json", newData);
-
-        alert("게시물 등록 성공");
-      } catch (error) {
-        console.error("게시물 등록 실패 ", error);
-        alert("게시물 등록 실패");
+    handleButtonAction() {
+      if (this.isEditMode) {
+        this.boardUpdate();
+      } else {
+        this.dataInsert();
       }
     },
   },
   watch: {},
-  computed: {},
+  computed: {
+    titleLabel() {
+      return this.isEditMode ? "수정" : "공지 등록";
+    },
+
+    buttonLabel() {
+      return this.isEditMode ? "수정" : "등록";
+    },
+  },
   components: {
     SvgIcon,
   },
client/views/pages/teacher/textbook.vue
--- client/views/pages/teacher/textbook.vue
+++ client/views/pages/teacher/textbook.vue
@@ -4,98 +4,163 @@
         <select name="" id="">
             <option value="">A반</option>
         </select>
-        </div>
-        <div class="content-t">
-            <div  class=" flex " style="gap: 50px;">
-                <div class="textbook">
-                    <div class="box " style="gap: 10px;" @click="goToPage('TextBookDetail')">
-                    </div>
-                    <div class="text ">
-                        <p class="title1" style="color: #fff;">A 교재</p>
-                        <div class="btnGroup mt15 flex align-center justify-end" style="gap: 10px;">
-                            <button>수정</button><p>&#124;</p>
-                            <button @click="showConfirm('delete')">삭제</button>
-                        </div>
-                    </div>
+    </div>
+    <div class="content-t">
+        <div class="flex" style="gap: 2.5%;" :style="{flexWrap: 'wrap'}">
+            <div class="textbook" v-for="textbookItem in textbookList" :key="textbookItem.book_id" style="width: 22.5%; margin-bottom: 30px;">
+                <div class="box" style="gap: 10px;" @click="goToPage('TextBookDetail', textbookItem.book_id)">
                 </div>
-                
-                <div class="textbook-add">
-                        <button  @click="buttonSearch"><img src="../../../resources/img/btn32_98t_normal.png" alt=""></button>
-        
+                <div class="text">
+                    <p class="title1" style="color: #fff;">{{ textbookItem.book_nm }}</p>
+                    <div class="btnGroup mt15 flex align-center justify-end" style="gap: 10px;">
+                        <button @click="editBook(textbookItem)">수정</button>
+                        <p>&#124;</p>
+                        <button @click="deleteBook(textbookItem.book_id)">삭제</button>
+                    </div>
                 </div>
             </div>
-        </div>
-        <div v-show="searchOpen" class="popup-wrap">
-                <div class="popup-box ">
+
+            <div class="textbook-add" style="width: 22.5%; margin-bottom: 30px;">
+                <button @click="buttonSearch">
+                    <img src="../../../resources/img/btn32_98t_normal.png" alt="">
+                </button>
+            </div>
+
+            <div v-show="searchOpen" class="popup-wrap">
+                <div class="popup-box">
                     <div class="flex justify-between mb30">
                         <p class="popup-title">교재 이름</p>
                         <button type="button" class="popup-close-btn" @click="closeBtn">
                             <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
-
                         </button>
                     </div>
                     <div class="search-wrap mb30">
-                        <input type="text" class="data-wrap" placeholder="">
-                        <button type="button" title="교재 검색">
+                        <input type="text" class="data-wrap" v-model="newBookName" placeholder="교재 이름을 입력하세요">
+                        <button type="button" title="교재 검색" @click="insertBook">
                             <img src="../../../resources/img/look_t.png" alt="">
                         </button>
                     </div>
-                    <div class="flex justify-center ">
-                        <button type="button" title="글쓰기" class="new-btn mr10">
+                    <div class="flex justify-center">
+                        <button type="button" title="취소" class="new-btn mr10" @click="closeBtn">
                             취소
                         </button>
-                        <button type="button" title="글쓰기" class="new-btn">
-                            생성
+                        <button type="button" title="생성" class="new-btn" @click="editMode ? updateBook() : insertBook()">
+                            {{ editMode ? '수정' : '생성' }}
                         </button>
                     </div>
                 </div>
             </div>
+        </div>
+    </div>
 </template>
+
+
 
 <script>
 import SvgIcon from '@jamescoyle/vue-icon';
-import { mdiMagnify, mdiWindowClose } from '@mdi/js';
+import { mdiWindowClose } from '@mdi/js';
+import axios from 'axios';
 
 export default {
-    data () {
+    data() {
         return {
             mdiWindowClose: mdiWindowClose,
             showModal: false,
             searchOpen: false,
+            textbookList: [],
+            newBookName: '',
+            editMode: false,
+            editBookId: null,
         }
     },
     methods: {
-        goToPage(page) {
-            this.$router.push({ name: page });
-        },
-        closeModal() {
-            this.showModal = false;
+        goToPage(page, book_id) {
+            this.$router.push({ name: page, query: { book_id }});
         },
         buttonSearch() {
             this.searchOpen = true;
         },
         closeBtn() {
             this.searchOpen = false;
-
+            this.editMode = false;
+            this.editBookId = null;
+            this.newBookName = '';
         },
-        showConfirm(type) {
-            let message = '';
-            if (type === 'delete') {
-                message = '삭제하시겠습니까?';
-            } else if (type === 'reset') {
-                message = '초기화하시겠습니까?';
-            } else if (type === 'save') {
-                message = '등록하시겠습니까?';
-            }
-
-            if (confirm(message)) {
-                this.goBack();
-            }
+        editBook(book) {
+            this.newBookName = book.book_nm;
+            this.editMode = true;
+            this.editBookId = book.book_id;
+            this.searchOpen = true;
         },
-
-    },
-    watch: {
-
+        bookList() {
+            axios({
+                url: "/book/findAll.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                }
+            })
+            .then(response => {
+                this.textbookList = response.data;
+                })
+            .catch(error => {
+                console.error('Error fetching books:', error);
+            });
+        },
+        insertBook() {
+            const newBook = {
+                book_nm: this.newBookName
+            };
+            axios.post('/book/insert.json', newBook)
+                .then(response => {
+                    this.bookList();
+                    this.closeBtn();
+                })
+                .catch(error => {
+                    console.error('Error creating book:', error);
+                });
+        },
+        updateBook() {
+            const updatedBook = {
+                book_id: this.editBookId,
+                book_nm: this.newBookName
+            };
+            axios({
+                url: "/book/update.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: updatedBook,
+            })
+            .then(response => {
+                this.bookList();
+                this.closeBtn();
+            })
+            .catch(error => {
+                 console.error('Error updating book:', error);
+            });
+        },
+        deleteBook(book_id) {
+            if (confirm('삭제하시겠습니까?')) {
+                axios({
+                    url: "/book/delete.json",
+                    method: "post",
+                    headers: {
+                        "Content-Type": "application/json; charset=UTF-8",
+                    },
+                    data: {
+                        book_id: book_id
+                    },
+                })
+                .then(response => {
+                    this.bookList();
+                })
+                .catch(error => {
+                    console.error('Error deleting book:', error);
+                });
+            }
+        }
     },
     computed: {
 
@@ -105,6 +170,22 @@
     },
     mounted() {
         console.log('Main2 mounted');
+        this.bookList();
     }
 }
-</script>
(파일 끝에 줄바꿈 문자 없음)
+</script>
+
+<style>
+.content-t {
+    flex-wrap: wrap; 
+    height: 90%;
+    overflow-y: scroll;
+}
+.flex {
+    display: flex;
+    flex-wrap: wrap;
+}
+.textbook, .textbook-add {
+    margin-bottom: 30px;
+}
+</style>
(파일 끝에 줄바꿈 문자 없음)
Add a comment
List