jichoi / lms_front star
[jichoi] 08-08
240808 최정임 선생님 페이지
@e9d1963ecbdfa8ec0753477a6f9d6cae6621693c
client/resources/css/style.css
--- client/resources/css/style.css
+++ client/resources/css/style.css
@@ -1015,7 +1015,7 @@
     border: #FFBA08 solid 2px;
     cursor: pointer;
 }
-.bookmanage-btn:hover{background-color: #FFF3D7;}
+
 .hidden-tr {
   display: none;
 }
client/views/layout/Side_t.vue
--- client/views/layout/Side_t.vue
+++ client/views/layout/Side_t.vue
@@ -26,7 +26,7 @@
                     <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>
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -66,6 +66,16 @@
 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";
@@ -168,8 +178,10 @@
             { 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: '/QuestionList.page', name: 'QuestionList', component: QuestionList },
@@ -177,6 +189,15 @@
             { path: '/VocaList.page', name: 'VocaList', component: VocaList },
             { path: '/ExamList.page', name: 'ExamList', component: ExamList },
             { path: '/ExamDetail.page', name: 'ExamDetail', component: ExamDetail },
+            { 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 },
         ],
     },
 
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="title2">단원</label>
+        <div class="table-pagination flex mt10">
+            <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/TextBookDetail.vue
--- client/views/pages/teacher/TextBookDetail.vue
+++ client/views/pages/teacher/TextBookDetail.vue
@@ -1,6 +1,6 @@
 <template>
     <div class="title-box flex justify-between mb40">
-        <p class="title">A반</p>
+        <p class="title">A교재</p>
         <select name="" id="">
             <option value="">A 교재</option>
         </select>
@@ -13,58 +13,170 @@
             <button>3</button>
         </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('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>
-        <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('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('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('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('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 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 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 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" style="gap: 10px;">
-        <!-- <button type="button" title="" class="new-btn" @click="showConfirm('delete')">
-            추가
-        </button> -->
+    <!-- <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, } from '@mdi/js';
+import { mdilArrowRight } from '@mdi/light-js';
 import ProgressBar from '../../component/ProgressBar.vue';
 
 
@@ -115,4 +227,5 @@
         console.log('Main2 mounted');
     }
 }
-</script>
(파일 끝에 줄바꿈 문자 없음)
+</script>
+<style scoped></style>
(파일 끝에 줄바꿈 문자 없음)
client/views/pages/teacher/textbook.vue
--- client/views/pages/teacher/textbook.vue
+++ client/views/pages/teacher/textbook.vue
@@ -1,9 +1,9 @@
 <template>
     <div class="title-box flex justify-between mb40">
-        <p class="title">교재</p>
-        <select name="" id="">
+        <p class="title">교재 관리</p>
+        <!-- <select name="" id="">
             <option value="">A반</option>
-        </select>
+        </select> -->
         </div>
         <div class="content-t">
             <div  class=" flex " style="gap: 50px;">
@@ -36,9 +36,9 @@
                     </div>
                     <div class="search-wrap mb30">
                         <input type="text" class="data-wrap" placeholder="">
-                        <button type="button" title="교재 검색">
+                        <!-- <button type="button" title="교재 검색">
                             <img src="../../../resources/img/look_t.png" alt="">
-                        </button>
+                        </button> -->
                     </div>
                     <div class="flex justify-center ">
                         <button type="button" title="글쓰기" class="new-btn mr10">
@@ -107,4 +107,7 @@
         console.log('Main2 mounted');
     }
 }
-</script>
(파일 끝에 줄바꿈 문자 없음)
+</script>
+<style scoped>
+.textbook{width: 300px;}
+</style>
(파일 끝에 줄바꿈 문자 없음)
Add a comment
List