[jichoi]
08-08
240808 최정임 선생님 페이지
@e9d1963ecbdfa8ec0753477a6f9d6cae6621693c
--- client/resources/css/style.css
+++ client/resources/css/style.css
... | ... | @@ -1015,7 +1015,7 @@ |
1015 | 1015 |
border: #FFBA08 solid 2px; |
1016 | 1016 |
cursor: pointer; |
1017 | 1017 |
} |
1018 |
-.bookmanage-btn:hover{background-color: #FFF3D7;} |
|
1018 |
+ |
|
1019 | 1019 |
.hidden-tr { |
1020 | 1020 |
display: none; |
1021 | 1021 |
} |
--- client/views/layout/Side_t.vue
+++ client/views/layout/Side_t.vue
... | ... | @@ -26,7 +26,7 @@ |
26 | 26 |
<router-link to="/Home.page" class="tpt">홈</router-link> |
27 | 27 |
<router-link to="/Board.page" class="tpt">게시판</router-link> |
28 | 28 |
<router-link to="/StudentList.page" class="tpt">학생목록</router-link> |
29 |
- <router-link to="/textbook.page" class="tpt">교재</router-link> |
|
29 |
+ <router-link to="/C_Textbook.page" class="tpt">교재</router-link> |
|
30 | 30 |
</details> |
31 | 31 |
</div> |
32 | 32 |
<div> |
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
... | ... | @@ -66,6 +66,16 @@ |
66 | 66 |
import StudentList from "./teacher/StudentList.vue"; |
67 | 67 |
import StudentDetail from "./teacher/StudentDetail.vue"; |
68 | 68 |
import textbook from "./teacher/textbook.vue"; |
69 |
+import C_Textbook from "./teacher/C_Textbook.vue"; |
|
70 |
+import C_TextBookDetail from "./teacher/C_TextBookDetail.vue"; |
|
71 |
+import C_TextList from "./teacher/C_TextList .vue"; |
|
72 |
+import C_TextInsert from "./teacher/C_TextInsert.vue"; |
|
73 |
+import C_QuestionList from "./teacher/C_QuestionList.vue"; |
|
74 |
+import C_QuestionInsert from "./teacher/C_QuestionInsert.vue"; |
|
75 |
+import C_Voca_List from "./teacher/C_Voca_List.vue"; |
|
76 |
+import C_ExamList from "./teacher/C_ExamList.vue"; |
|
77 |
+import C_ExamDetail from "./teacher/C_ExamDetail.vue"; |
|
78 |
+import C_ExamInsert from "./teacher/C_ExamInsert.vue"; |
|
69 | 79 |
import TextBookDetail from "./teacher/TextBookDetail.vue"; |
70 | 80 |
import Home from "./teacher/Home.vue"; |
71 | 81 |
import ClassDetail from "./teacher/ClassDetail.vue"; |
... | ... | @@ -168,8 +178,10 @@ |
168 | 178 |
{ path: '/ClassDetail.page', name: 'ClassDetail', component: ClassDetail }, |
169 | 179 |
{ path: '/StudentList.page', name: 'StudentList', component: StudentList }, |
170 | 180 |
{ path: '/StudentDetail.page', name: 'StudentDetail', component: StudentDetail }, |
181 |
+ { path: '/C_Textbook.page', name: 'C_Textbook', component: C_Textbook }, |
|
171 | 182 |
{ path: '/textbook.page', name: 'textbook', component: textbook }, |
172 | 183 |
{ path: '/TextBookDetail.page', name: 'TextBookDetail', component: TextBookDetail }, |
184 |
+ { path: '/C_TextBookDetail.page', name: 'C_TextBookDetail', component: C_TextBookDetail }, |
|
173 | 185 |
{ path: '/TextList.page', name: 'TextList', component: TextList }, |
174 | 186 |
{ path: '/TextInsert.page', name: 'TextInsert', component: TextInsert }, |
175 | 187 |
{ path: '/QuestionList.page', name: 'QuestionList', component: QuestionList }, |
... | ... | @@ -177,6 +189,15 @@ |
177 | 189 |
{ path: '/VocaList.page', name: 'VocaList', component: VocaList }, |
178 | 190 |
{ path: '/ExamList.page', name: 'ExamList', component: ExamList }, |
179 | 191 |
{ path: '/ExamDetail.page', name: 'ExamDetail', component: ExamDetail }, |
192 |
+ { path: '/C_TextList.page', name: 'C_TextList', component: C_TextList }, |
|
193 |
+ { path: '/C_TextInsert.page', name: 'C_TextInsert', component: C_TextInsert }, |
|
194 |
+ { path: '/C_QuestionList.page', name: 'C_QuestionList', component: C_QuestionList }, |
|
195 |
+ { path: '/C_QuestionInsert.page', name: 'C_QuestionInsert', component: C_QuestionInsert }, |
|
196 |
+ { path: '/C_Voca_List.page', name: 'C_Voca_List', component: C_Voca_List }, |
|
197 |
+ { path: '/C_ExamList.page', name: 'C_ExamList', component: C_ExamList }, |
|
198 |
+ { path: '/C_ExamDetail.page', name: 'C_ExamDetail', component: C_ExamDetail }, |
|
199 |
+ { path: '/C_ExamInsert.page', name: 'C_ExamInsert', component: C_ExamInsert }, |
|
200 |
+ |
|
180 | 201 |
{ path: '/RoadMap.page', name: 'RoadMap', component: RoadMap }, |
181 | 202 |
], |
182 | 203 |
}, |
+++ client/views/pages/teacher/C_ExamDetail.vue
... | ... | @@ -0,0 +1,93 @@ |
1 | +<template> | |
2 | + <div class="title-box flex justify-between mb40"> | |
3 | + <p class="title">문제 상세 페이지</p> | |
4 | + </div> | |
5 | + <label for="" class="title1">문제 리스트</label> | |
6 | + <table class="mt20 mb100"> | |
7 | + <colgroup> | |
8 | + <col style="width: 10%;"> | |
9 | + <col style="width: 70%;"> | |
10 | + <col style="width: 20%;"> | |
11 | + </colgroup> | |
12 | + <thead> | |
13 | + <td>No.</td> | |
14 | + <td>문제</td> | |
15 | + <td>보기</td> | |
16 | + </thead> | |
17 | + <tbody> | |
18 | + <tr> | |
19 | + <td>1</td> | |
20 | + <td>1</td> | |
21 | + <td><button type="button" title="수정" class="new-btn"> | |
22 | + 수정 | |
23 | + </button></td> | |
24 | + </tr> | |
25 | + </tbody> | |
26 | + </table> | |
27 | + <label for="" class="title1">상세 내용</label> | |
28 | + <div class="board-wrap mt20"> | |
29 | + <div class="flex align-center mb20"> | |
30 | + <label for="" class="title2">문제</label> | |
31 | + <input type="text" class="data-wrap"> | |
32 | + </div> | |
33 | + | |
34 | + <hr> | |
35 | + <div class="flex align-center"> | |
36 | + <label for="" class="title2">내용</label> | |
37 | + <textarea name="" id="" class="data-wrap"></textarea> | |
38 | + </div> | |
39 | + <hr> | |
40 | + <div class="flex align-center mb20"> | |
41 | + <label for="" class="title2">첨부파일</label> | |
42 | + <input type="file" ref="fileInput" @change="handleFileUpload" /> | |
43 | + </div> | |
44 | + <div class="flex align-center"> | |
45 | + <label for="" class="title2">답</label> | |
46 | + <input type="text" class="data-wrap"> | |
47 | + </div> | |
48 | + </div> | |
49 | + <div class="flex justify-between mt50"> | |
50 | + <button type="button" title="글쓰기" class="new-btn" @click="goToPage('ExamList')"> | |
51 | + 목록 | |
52 | + </button> | |
53 | + <div class="flex"> | |
54 | + <button type="button" title="글쓰기" class="new-btn mr10"> | |
55 | + 수정 | |
56 | + </button> | |
57 | + <button type="button" title="글쓰기" class="new-btn"> | |
58 | + 삭제 | |
59 | + </button> | |
60 | + </div> | |
61 | + </div> | |
62 | +</template> | |
63 | + | |
64 | +<script> | |
65 | +import SvgIcon from '@jamescoyle/vue-icon'; | |
66 | +import { mdiMagnify } from '@mdi/js'; | |
67 | + | |
68 | + | |
69 | +export default { | |
70 | + data() { | |
71 | + return { | |
72 | + mdiMagnify: mdiMagnify, | |
73 | + } | |
74 | + }, | |
75 | + methods: { | |
76 | + goToPage(page) { | |
77 | + this.$router.push({ name: page }); | |
78 | + }, | |
79 | + }, | |
80 | + watch: { | |
81 | + | |
82 | + }, | |
83 | + computed: { | |
84 | + | |
85 | + }, | |
86 | + components: { | |
87 | + SvgIcon | |
88 | + }, | |
89 | + mounted() { | |
90 | + console.log('Main2 mounted'); | |
91 | + } | |
92 | +} | |
93 | +</script>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/teacher/C_ExamInsert.vue
... | ... | @@ -0,0 +1,93 @@ |
1 | +<template> | |
2 | + <div class="title-box flex justify-between mb40"> | |
3 | + <p class="title">문제 등록 페이지</p> | |
4 | + </div> | |
5 | + <!-- <label for="" class="title1">문제 리스트</label> | |
6 | + <table class="mt20 mb100"> | |
7 | + <colgroup> | |
8 | + <col style="width: 10%;"> | |
9 | + <col style="width: 70%;"> | |
10 | + <col style="width: 20%;"> | |
11 | + </colgroup> | |
12 | + <thead> | |
13 | + <td>No.</td> | |
14 | + <td>문제</td> | |
15 | + <td>보기</td> | |
16 | + </thead> | |
17 | + <tbody> | |
18 | + <tr> | |
19 | + <td>1</td> | |
20 | + <td>1</td> | |
21 | + <td><button type="button" title="수정" class="new-btn"> | |
22 | + 수정 | |
23 | + </button></td> | |
24 | + </tr> | |
25 | + </tbody> | |
26 | + </table> --> | |
27 | + <label for="" class="title1">상세 내용</label> | |
28 | + <div class="board-wrap mt20"> | |
29 | + <div class="flex align-center mb20"> | |
30 | + <label for="" class="title2">문제</label> | |
31 | + <input type="text" class="data-wrap"> | |
32 | + </div> | |
33 | + | |
34 | + <hr> | |
35 | + <div class="flex align-center"> | |
36 | + <label for="" class="title2">내용</label> | |
37 | + <textarea name="" id="" class="data-wrap"></textarea> | |
38 | + </div> | |
39 | + <hr> | |
40 | + <div class="flex align-center mb20"> | |
41 | + <label for="" class="title2">첨부파일</label> | |
42 | + <input type="file" ref="fileInput" @change="handleFileUpload" /> | |
43 | + </div> | |
44 | + <div class="flex align-center"> | |
45 | + <label for="" class="title2">답</label> | |
46 | + <input type="text" class="data-wrap"> | |
47 | + </div> | |
48 | + </div> | |
49 | + <div class="flex justify-between mt50"> | |
50 | + <button type="button" title="글쓰기" class="new-btn" @click="goToPage('C_ExamList')"> | |
51 | + 목록 | |
52 | + </button> | |
53 | + <div class="flex"> | |
54 | + <button type="button" title="글쓰기" class="new-btn mr10"> | |
55 | + 취소 | |
56 | + </button> | |
57 | + <button type="button" title="글쓰기" class="new-btn"> | |
58 | + 등록 | |
59 | + </button> | |
60 | + </div> | |
61 | + </div> | |
62 | +</template> | |
63 | + | |
64 | +<script> | |
65 | +import SvgIcon from '@jamescoyle/vue-icon'; | |
66 | +import { mdiMagnify } from '@mdi/js'; | |
67 | + | |
68 | + | |
69 | +export default { | |
70 | + data() { | |
71 | + return { | |
72 | + mdiMagnify: mdiMagnify, | |
73 | + } | |
74 | + }, | |
75 | + methods: { | |
76 | + goToPage(page) { | |
77 | + this.$router.push({ name: page }); | |
78 | + }, | |
79 | + }, | |
80 | + watch: { | |
81 | + | |
82 | + }, | |
83 | + computed: { | |
84 | + | |
85 | + }, | |
86 | + components: { | |
87 | + SvgIcon | |
88 | + }, | |
89 | + mounted() { | |
90 | + console.log('Main2 mounted'); | |
91 | + } | |
92 | +} | |
93 | +</script>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/teacher/C_ExamList.vue
... | ... | @@ -0,0 +1,150 @@ |
1 | +<template> | |
2 | + <div class="title-box flex justify-between mb40"> | |
3 | + <p class="title">평가</p> | |
4 | + <select name="" id=""> | |
5 | + <option value="">1단원</option> | |
6 | + </select> | |
7 | + </div> | |
8 | + <div class="search-wrap flex justify-end mb20"> | |
9 | + <select name="" id="" class="mr10 data-wrap"> | |
10 | + <option value="">중간</option> | |
11 | + <option value="">최종</option> | |
12 | + </select> | |
13 | + <select name="" id="" class="mr10 data-wrap"> | |
14 | + <option value="">전체</option> | |
15 | + </select> | |
16 | + <input type="text" placeholder="검색하세요."> | |
17 | + <button type="button" title="위원회 검색"> | |
18 | + <img src="../../../resources/img/look_t.png" alt=""> | |
19 | + </button> | |
20 | + </div> | |
21 | + <div class="table-wrap"> | |
22 | + <table> | |
23 | + <thead> | |
24 | + <td>No.</td> | |
25 | + <td>제목</td> | |
26 | + <td>중간/최종</td> | |
27 | + <td>작성자</td> | |
28 | + <td>문항</td> | |
29 | + <td>보기</td> | |
30 | + <td>등록일</td> | |
31 | + </thead> | |
32 | + <tbody> | |
33 | + <tr> | |
34 | + <td></td> | |
35 | + <td></td> | |
36 | + <td></td> | |
37 | + <td></td> | |
38 | + <td></td> | |
39 | + <td><button type="button" title="보기" class="new-btn" @click="goToPage('C_ExamDetail')"> | |
40 | + 보기 | |
41 | + </button></td> | |
42 | + <td></td> | |
43 | + </tr> | |
44 | + <!-- <tr :class="{ 'hidden-tr': !isRowVisible }" class="show-tr"> | |
45 | + <td colspan="7"> | |
46 | + <div> | |
47 | + <table> | |
48 | + <colgroup> | |
49 | + <col style="width: 10%;"> | |
50 | + <col style="width: 70%;"> | |
51 | + <col style="width: 20%;"> | |
52 | + </colgroup> | |
53 | + <thead> | |
54 | + <td>No.</td> | |
55 | + <td>문제</td> | |
56 | + <td></td> | |
57 | + </thead> | |
58 | + <tbody> | |
59 | + <tr> | |
60 | + <td>1</td> | |
61 | + <td>1</td> | |
62 | + <td><button type="button" title="수정" class="new-btn" @click="goToPage('ExamDetail')"> | |
63 | + 수정 | |
64 | + </button></td> | |
65 | + </tr> | |
66 | + </tbody> | |
67 | + </table> | |
68 | + </div> | |
69 | + </td> | |
70 | + </tr> --> | |
71 | + </tbody> | |
72 | + </table> | |
73 | + <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;"> | |
74 | + <button><img src="../../../resources/img/btn27_90t_normal.png" alt=""></button> | |
75 | + <button class="selected-btn">1</button> | |
76 | + <button>2</button> | |
77 | + <button>3</button> | |
78 | + <button><img src="../../../resources/img/btn28_90t_normal.png" alt=""></button> | |
79 | + </article> | |
80 | + <div class="flex justify-end "> | |
81 | + <button type="button" title="등록" class="new-btn" @click="goToPage('C_ExamInsert')"> | |
82 | + 등록 | |
83 | + </button> | |
84 | + </div> | |
85 | + </div> | |
86 | +</template> | |
87 | + | |
88 | +<script> | |
89 | +import SvgIcon from '@jamescoyle/vue-icon'; | |
90 | +import { mdiMagnify, mdiWindowClose} from '@mdi/js'; | |
91 | + | |
92 | + | |
93 | +export default { | |
94 | + data () { | |
95 | + return { | |
96 | + mdiMagnify: mdiMagnify, | |
97 | + mdiWindowClose: mdiWindowClose, | |
98 | + showModal: false, | |
99 | + searchOpen: false, | |
100 | + isRowVisible: false | |
101 | + } | |
102 | + }, | |
103 | + methods: { | |
104 | + toggleRow() { | |
105 | + this.isRowVisible = !this.isRowVisible; | |
106 | + }, | |
107 | + goToPage(page) { | |
108 | + this.$router.push({ name: page }); | |
109 | + }, | |
110 | + showConfirm(type) { | |
111 | + let message = ''; | |
112 | + if (type === 'cancel') { | |
113 | + message = '삭제하시겠습니까?'; | |
114 | + } else if (type === 'reset') { | |
115 | + message = '초기화하시겠습니까?'; | |
116 | + } else if (type === 'save') { | |
117 | + message = '등록하시겠습니까?'; | |
118 | + } | |
119 | + | |
120 | + if (confirm(message)) { | |
121 | + this.goBack(); | |
122 | + } | |
123 | + }, | |
124 | + | |
125 | + closeModal() { | |
126 | + this.showModal = false; | |
127 | + }, | |
128 | + buttonSearch() { | |
129 | + this.searchOpen = true; | |
130 | + }, | |
131 | + closeBtn() { | |
132 | + this.searchOpen = false; | |
133 | + | |
134 | + }, | |
135 | + | |
136 | + }, | |
137 | + watch: { | |
138 | + | |
139 | + }, | |
140 | + computed: { | |
141 | + | |
142 | + }, | |
143 | + components:{ | |
144 | + SvgIcon | |
145 | + }, | |
146 | + mounted() { | |
147 | + console.log('Main2 mounted'); | |
148 | + } | |
149 | +} | |
150 | +</script>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/teacher/C_QuestionInsert.vue
... | ... | @@ -0,0 +1,99 @@ |
1 | +<template> | |
2 | + <div class="title-box flex justify-between mb40"> | |
3 | + <p class="title">문제 등록</p> | |
4 | + </div> | |
5 | + <div class="board-wrap"> | |
6 | + <div class="flex align-center mb20"> | |
7 | + <label for="" class="title2">제목</label> | |
8 | + <input type="text" class="data-wrap"> | |
9 | + </div> | |
10 | + <hr> | |
11 | + <div class="flex align-center"> | |
12 | + <label for="" class="title2">내용</label> | |
13 | + <textarea name="" id="" class="data-wrap"></textarea> | |
14 | + </div> | |
15 | + <hr> | |
16 | + <div class="flex align-center mb20"> | |
17 | + <label for="" class="title2">첨부파일</label> | |
18 | + <input type="file" ref="fileInput" @change="handleFileUpload" /> | |
19 | + </div> | |
20 | + <div class="flex align-center mb20"> | |
21 | + <label for="" class="title2">답</label> | |
22 | + <input type="text" class="data-wrap"> | |
23 | + </div> | |
24 | + <div> | |
25 | + <label for="" class="title2">오답 학생</label> | |
26 | + <div class="table-wrap mt20"> | |
27 | + <table> | |
28 | + <thead> | |
29 | + <td>No.</td> | |
30 | + <td>이름</td> | |
31 | + <td>학년</td> | |
32 | + <td>반</td> | |
33 | + <td>오답</td> | |
34 | + </thead> | |
35 | + <tbody> | |
36 | + <tr @click="goToPage('noticeDetail')"> | |
37 | + <td></td> | |
38 | + <td></td> | |
39 | + <td></td> | |
40 | + <td></td> | |
41 | + <td></td> | |
42 | + </tr> | |
43 | + </tbody> | |
44 | + </table> | |
45 | + <!-- <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;"> | |
46 | + <button><img src="../../../resources/img/btn27_90t_normal.png" alt=""></button> | |
47 | + <button class="selected-btn">1</button> | |
48 | + <button>2</button> | |
49 | + <button>3</button> | |
50 | + <button><img src="../../../resources/img/btn28_90t_normal.png" alt=""></button> | |
51 | + </article> --> | |
52 | + </div> | |
53 | + </div> | |
54 | + </div> | |
55 | + <div class="flex justify-between mt50"> | |
56 | + <button type="button" title="글쓰기" class="new-btn" @click="goToPage('C_QuestionList')"> | |
57 | + 목록 | |
58 | + </button> | |
59 | + <div class="flex"> | |
60 | + <button type="button" title="글쓰기" class="new-btn mr10"> | |
61 | + 수정 | |
62 | + </button> | |
63 | + <button type="button" title="글쓰기" class="new-btn"> | |
64 | + 삭제 | |
65 | + </button> | |
66 | + </div> | |
67 | + </div> | |
68 | +</template> | |
69 | + | |
70 | +<script> | |
71 | +import SvgIcon from '@jamescoyle/vue-icon'; | |
72 | +import { mdiMagnify } from '@mdi/js'; | |
73 | + | |
74 | + | |
75 | +export default { | |
76 | + data() { | |
77 | + return { | |
78 | + mdiMagnify: mdiMagnify, | |
79 | + } | |
80 | + }, | |
81 | + methods: { | |
82 | + goToPage(page) { | |
83 | + this.$router.push({ name: page }); | |
84 | + }, | |
85 | + }, | |
86 | + watch: { | |
87 | + | |
88 | + }, | |
89 | + computed: { | |
90 | + | |
91 | + }, | |
92 | + components: { | |
93 | + SvgIcon | |
94 | + }, | |
95 | + mounted() { | |
96 | + console.log('Main2 mounted'); | |
97 | + } | |
98 | +} | |
99 | +</script>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/teacher/C_QuestionList.vue
... | ... | @@ -0,0 +1,97 @@ |
1 | +<template> | |
2 | + <div class="title-box flex justify-between mb40"> | |
3 | + <p class="title">문제</p> | |
4 | + <select name="" id=""> | |
5 | + <option value="">1단원</option> | |
6 | + </select> | |
7 | + </div> | |
8 | + <div class="search-wrap flex justify-end mb20"> | |
9 | + <select name="" id="" class="mr10 data-wrap"> | |
10 | + <option value="">전체</option> | |
11 | + </select> | |
12 | + <input type="text" placeholder="검색하세요."> | |
13 | + <button type="button" title="위원회 검색"> | |
14 | + <img src="../../../resources/img/look_t.png" alt=""> | |
15 | + </button> | |
16 | + </div> | |
17 | + <div class="table-wrap"> | |
18 | + <table> | |
19 | + <thead> | |
20 | + <td>No.</td> | |
21 | + <td>제목</td> | |
22 | + <td>문제</td> | |
23 | + <td>작성자</td> | |
24 | + <td>오답률</td> | |
25 | + <td>등록일</td> | |
26 | + </thead> | |
27 | + <tbody> | |
28 | + <tr @click="goToPage('C_QuestionInsert')"> | |
29 | + <td></td> | |
30 | + <td></td> | |
31 | + <td></td> | |
32 | + <td></td> | |
33 | + <td></td> | |
34 | + <td></td> | |
35 | + </tr> | |
36 | + </tbody> | |
37 | + </table> | |
38 | + <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;"> | |
39 | + <button><img src="../../../resources/img/btn27_90t_normal.png" alt=""></button> | |
40 | + <button class="selected-btn">1</button> | |
41 | + <button>2</button> | |
42 | + <button>3</button> | |
43 | + <button><img src="../../../resources/img/btn28_90t_normal.png" alt=""></button> | |
44 | + </article> | |
45 | + <div class="flex justify-end "> | |
46 | + <button type="button" title="등록" class="new-btn" @click="goToPage('C_QuestionInsert')"> | |
47 | + 등록 | |
48 | + </button> | |
49 | + </div> | |
50 | + </div> | |
51 | +</template> | |
52 | + | |
53 | +<script> | |
54 | +import SvgIcon from '@jamescoyle/vue-icon'; | |
55 | +import { mdiMagnify} from '@mdi/js'; | |
56 | + | |
57 | + | |
58 | +export default { | |
59 | + data () { | |
60 | + return { | |
61 | + mdiMagnify: mdiMagnify, | |
62 | + } | |
63 | + }, | |
64 | + methods: { | |
65 | + goToPage(page) { | |
66 | + this.$router.push({ name: page }); | |
67 | + }, | |
68 | + showConfirm(type) { | |
69 | + let message = ''; | |
70 | + if (type === 'cancel') { | |
71 | + message = '삭제하시겠습니까?'; | |
72 | + } else if (type === 'reset') { | |
73 | + message = '초기화하시겠습니까?'; | |
74 | + } else if (type === 'save') { | |
75 | + message = '등록하시겠습니까?'; | |
76 | + } | |
77 | + | |
78 | + if (confirm(message)) { | |
79 | + this.goBack(); | |
80 | + } | |
81 | + }, | |
82 | + | |
83 | + }, | |
84 | + watch: { | |
85 | + | |
86 | + }, | |
87 | + computed: { | |
88 | + | |
89 | + }, | |
90 | + components:{ | |
91 | + SvgIcon | |
92 | + }, | |
93 | + mounted() { | |
94 | + console.log('Main2 mounted'); | |
95 | + } | |
96 | +} | |
97 | +</script>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/teacher/C_TextBookDetail.vue
... | ... | @@ -0,0 +1,121 @@ |
1 | +<template> | |
2 | + <div class="title-box flex justify-between mb40"> | |
3 | + <p class="title">A반</p> | |
4 | + <select name="" id=""> | |
5 | + <option value="">A 교재</option> | |
6 | + </select> | |
7 | + </div> | |
8 | + <div class="board-wrap"> | |
9 | + <label for="" class="title2">단원</label> | |
10 | + <div class="table-pagination flex mt10"> | |
11 | + <button class="selected-btn">1</button> | |
12 | + <button>2</button> | |
13 | + <button>3</button> | |
14 | + </div> | |
15 | + <hr> | |
16 | + <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('C_TextList')"> | |
17 | + <label for="" class="title1">지문</label> | |
18 | + <div class="flex align-center " style="gap: 10px;"> | |
19 | + <p>00개</p> | |
20 | + <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button> | |
21 | + </div> | |
22 | + </div> | |
23 | + <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('C_QuestionList')"> | |
24 | + <label for="" class="title1">문제</label> | |
25 | + <div class="flex align-center " style="gap: 10px;"> | |
26 | + <p>00개</p> | |
27 | + <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button> | |
28 | + </div> | |
29 | + </div> | |
30 | + <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('C_Voca_List')"> | |
31 | + <label for="" class="title1">단어</label> | |
32 | + <div class="flex align-center " style="gap: 10px;"> | |
33 | + <p>00개</p> | |
34 | + <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button> | |
35 | + </div> | |
36 | + </div> | |
37 | + <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('C_ExamList')"> | |
38 | + <label for="" class="title1">중간 평가</label> | |
39 | + <div class="flex align-center " style="gap: 10px;"> | |
40 | + <p>00개</p> | |
41 | + <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button> | |
42 | + </div> | |
43 | + </div> | |
44 | + <div class="bookmanage-btn flex justify-between align-center" @click="goToPage('C_ExamList')"> | |
45 | + <label for="" class="title1">최종 평가</label> | |
46 | + <div class="flex align-center " style="gap: 10px;"> | |
47 | + <p>00개</p> | |
48 | + <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button> | |
49 | + </div> | |
50 | + </div> | |
51 | + </div> | |
52 | + <div class="flex justify-end mt30" style="gap: 10px;"> | |
53 | + <!-- <button type="button" title="" class="new-btn" @click="showConfirm('delete')"> | |
54 | + 추가 | |
55 | + </button> --> | |
56 | + <button type="button" title="" class="new-btn" @click="goToPage('RoadMap')"> | |
57 | + 로드맵 | |
58 | + </button> | |
59 | + <button type="button" title="" class="new-btn" @click="showConfirm('delete')"> | |
60 | + 삭제 | |
61 | + </button> | |
62 | + </div> | |
63 | +</template> | |
64 | + | |
65 | +<script> | |
66 | +import SvgIcon from '@jamescoyle/vue-icon'; | |
67 | +import { mdiMagnify, mdilArrowRight } from '@mdi/js'; | |
68 | +import ProgressBar from '../../component/ProgressBar.vue'; | |
69 | + | |
70 | + | |
71 | +export default { | |
72 | + data() { | |
73 | + return { | |
74 | + mdiMagnify: mdiMagnify, | |
75 | + mdilArrowRight: mdilArrowRight, | |
76 | + timer: "00:00", | |
77 | + progress: 20 | |
78 | + } | |
79 | + }, | |
80 | + methods: { | |
81 | + goToPage(page) { | |
82 | + this.$router.push({ name: page }); | |
83 | + }, | |
84 | + increaseProgress() { | |
85 | + if (this.progress < 100) { | |
86 | + this.progress += 10; | |
87 | + } | |
88 | + }, | |
89 | + showConfirm(type) { | |
90 | + let message = ''; | |
91 | + if (type === 'delete') { | |
92 | + message = '삭제하시겠습니까?'; | |
93 | + } else if (type === 'reset') { | |
94 | + message = '초기화하시겠습니까?'; | |
95 | + } else if (type === 'save') { | |
96 | + message = '등록하시겠습니까?'; | |
97 | + } | |
98 | + | |
99 | + if (confirm(message)) { | |
100 | + this.goBack(); | |
101 | + } | |
102 | + }, | |
103 | + }, | |
104 | + watch: { | |
105 | + | |
106 | + }, | |
107 | + computed: { | |
108 | + | |
109 | + }, | |
110 | + components: { | |
111 | + SvgIcon, | |
112 | + ProgressBar | |
113 | + }, | |
114 | + mounted() { | |
115 | + console.log('Main2 mounted'); | |
116 | + } | |
117 | +} | |
118 | +</script> | |
119 | +<style scoped> | |
120 | +.bookmanage-btn:hover{background-color: #FFF3D7;} | |
121 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/teacher/C_TextInsert.vue
... | ... | @@ -0,0 +1,64 @@ |
1 | +<template> | |
2 | + <div class="title-box flex justify-between mb40"> | |
3 | + <p class="title">지문 등록</p> | |
4 | + </div> | |
5 | + <div class="board-wrap"> | |
6 | + <div class="flex align-center mb20"> | |
7 | + <label for="" class="title2">제목</label> | |
8 | + <input type="text" class="data-wrap"> | |
9 | + </div> | |
10 | + <div class="flex align-center"> | |
11 | + <label for="" class="title2">URL</label> | |
12 | + <input type="text" class="data-wrap"> | |
13 | + </div> | |
14 | + <hr> | |
15 | + <div class="flex align-center"> | |
16 | + <label for="" class="title2">스크립트</label> | |
17 | + <textarea name="" id="" class="data-wrap"></textarea> | |
18 | + </div> | |
19 | + </div> | |
20 | + <div class="flex justify-between mt50"> | |
21 | + <button type="button" title="글쓰기" class="new-btn" @click="goToPage('C_TextList')"> | |
22 | + 목록 | |
23 | + </button> | |
24 | + <div class="flex"> | |
25 | + <button type="button" title="글쓰기" class="new-btn mr10" > | |
26 | + 수정 | |
27 | + </button> | |
28 | + <button type="button" title="글쓰기" class="new-btn" > | |
29 | + 삭제 | |
30 | + </button> | |
31 | + </div> | |
32 | + </div> | |
33 | +</template> | |
34 | + | |
35 | +<script> | |
36 | +import SvgIcon from '@jamescoyle/vue-icon'; | |
37 | +import { mdiMagnify} from '@mdi/js'; | |
38 | + | |
39 | + | |
40 | +export default { | |
41 | + data () { | |
42 | + return { | |
43 | + mdiMagnify: mdiMagnify, | |
44 | + } | |
45 | + }, | |
46 | + methods: { | |
47 | + goToPage(page) { | |
48 | + this.$router.push({ name: page }); | |
49 | + }, | |
50 | + }, | |
51 | + watch: { | |
52 | + | |
53 | + }, | |
54 | + computed: { | |
55 | + | |
56 | + }, | |
57 | + components:{ | |
58 | + SvgIcon | |
59 | + }, | |
60 | + mounted() { | |
61 | + console.log('Main2 mounted'); | |
62 | + } | |
63 | +} | |
64 | +</script>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/teacher/C_TextList .vue
... | ... | @@ -0,0 +1,95 @@ |
1 | +<template> | |
2 | + <div class="title-box flex justify-between mb40"> | |
3 | + <p class="title">지문</p> | |
4 | + <select name="" id=""> | |
5 | + <option value="">1단원</option> | |
6 | + </select> | |
7 | + </div> | |
8 | + <div class="search-wrap flex justify-end mb20"> | |
9 | + <select name="" id="" class="mr10 data-wrap"> | |
10 | + <option value="">전체</option> | |
11 | + </select> | |
12 | + <input type="text" placeholder="검색하세요."> | |
13 | + <button type="button" title="위원회 검색"> | |
14 | + <img src="../../../resources/img/look_t.png" alt=""> | |
15 | + </button> | |
16 | + </div> | |
17 | + <div class="table-wrap"> | |
18 | + <table> | |
19 | + <thead> | |
20 | + <td>No.</td> | |
21 | + <td>제목</td> | |
22 | + <td>내용</td> | |
23 | + <td>작성자</td> | |
24 | + <td>등록일</td> | |
25 | + </thead> | |
26 | + <tbody> | |
27 | + <tr @click="goToPage('C_TextInsert')"> | |
28 | + <td></td> | |
29 | + <td></td> | |
30 | + <td></td> | |
31 | + <td></td> | |
32 | + <td></td> | |
33 | + </tr> | |
34 | + </tbody> | |
35 | + </table> | |
36 | + <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;"> | |
37 | + <button><img src="../../../resources/img/btn27_90t_normal.png" alt=""></button> | |
38 | + <button class="selected-btn">1</button> | |
39 | + <button>2</button> | |
40 | + <button>3</button> | |
41 | + <button><img src="../../../resources/img/btn28_90t_normal.png" alt=""></button> | |
42 | + </article> | |
43 | + <div class="flex justify-end "> | |
44 | + <button type="button" title="등록" class="new-btn" @click="goToPage('C_TextInsert')"> | |
45 | + 등록 | |
46 | + </button> | |
47 | + </div> | |
48 | + </div> | |
49 | +</template> | |
50 | + | |
51 | +<script> | |
52 | +import SvgIcon from '@jamescoyle/vue-icon'; | |
53 | +import { mdiMagnify} from '@mdi/js'; | |
54 | + | |
55 | + | |
56 | +export default { | |
57 | + data () { | |
58 | + return { | |
59 | + mdiMagnify: mdiMagnify, | |
60 | + } | |
61 | + }, | |
62 | + methods: { | |
63 | + goToPage(page) { | |
64 | + this.$router.push({ name: page }); | |
65 | + }, | |
66 | + showConfirm(type) { | |
67 | + let message = ''; | |
68 | + if (type === 'cancel') { | |
69 | + message = '삭제하시겠습니까?'; | |
70 | + } else if (type === 'reset') { | |
71 | + message = '초기화하시겠습니까?'; | |
72 | + } else if (type === 'save') { | |
73 | + message = '등록하시겠습니까?'; | |
74 | + } | |
75 | + | |
76 | + if (confirm(message)) { | |
77 | + this.goBack(); | |
78 | + } | |
79 | + }, | |
80 | + | |
81 | + }, | |
82 | + watch: { | |
83 | + | |
84 | + }, | |
85 | + computed: { | |
86 | + | |
87 | + }, | |
88 | + components:{ | |
89 | + SvgIcon | |
90 | + }, | |
91 | + mounted() { | |
92 | + console.log('Main2 mounted'); | |
93 | + } | |
94 | +} | |
95 | +</script>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/teacher/C_Textbook.vue
... | ... | @@ -0,0 +1,115 @@ |
1 | +<template> | |
2 | + <div class="title-box flex justify-between mb40"> | |
3 | + <p class="title">교재</p> | |
4 | + <select name="" id=""> | |
5 | + <option value="">A반</option> | |
6 | + </select> | |
7 | + </div> | |
8 | + <div class="content-t"> | |
9 | + <div class=" flex " style="gap: 50px;"> | |
10 | + <div class="textbook"> | |
11 | + <div class="box " style="gap: 10px;" @click="goToPage('C_TextBookDetail')"> | |
12 | + </div> | |
13 | + <div class="text "> | |
14 | + <p class="title1" style="color: #fff;">A 교재</p> | |
15 | + <div class="btnGroup mt15 flex align-center justify-end" style="gap: 10px;"> | |
16 | + <button>수정</button><p>|</p> | |
17 | + <button @click="showConfirm('delete')">삭제</button> | |
18 | + </div> | |
19 | + </div> | |
20 | + </div> | |
21 | + | |
22 | + <div class="textbook-add"> | |
23 | + <button @click="buttonSearch"><img src="../../../resources/img/btn32_98t_normal.png" alt=""></button> | |
24 | + | |
25 | + </div> | |
26 | + </div> | |
27 | + </div> | |
28 | + <div v-show="searchOpen" class="popup-wrap"> | |
29 | + <div class="popup-box "> | |
30 | + <div class="flex justify-between mb30"> | |
31 | + <p class="popup-title">교재 이름</p> | |
32 | + <button type="button" class="popup-close-btn" @click="closeBtn"> | |
33 | + <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon> | |
34 | + | |
35 | + </button> | |
36 | + </div> | |
37 | + <div class="search-wrap mb30"> | |
38 | + <select v-model="selectedSearchOption" class="mr10 data-wrap"> | |
39 | + <option value="bbsTtl">제목</option> | |
40 | + <option value="bbsCnt">내용</option> | |
41 | + <option value="userNm">작성자</option> | |
42 | + <option value="bbsCls">카테고리</option> | |
43 | + </select> | |
44 | + </div> | |
45 | + <div class="flex justify-center "> | |
46 | + <button type="button" title="글쓰기" class="new-btn mr10"> | |
47 | + 취소 | |
48 | + </button> | |
49 | + <button type="button" title="글쓰기" class="new-btn"> | |
50 | + 등록 | |
51 | + </button> | |
52 | + </div> | |
53 | + </div> | |
54 | + </div> | |
55 | +</template> | |
56 | + | |
57 | +<script> | |
58 | +import SvgIcon from '@jamescoyle/vue-icon'; | |
59 | +import { mdiMagnify, mdiWindowClose } from '@mdi/js'; | |
60 | + | |
61 | +export default { | |
62 | + data () { | |
63 | + return { | |
64 | + mdiWindowClose: mdiWindowClose, | |
65 | + showModal: false, | |
66 | + searchOpen: false, | |
67 | + } | |
68 | + }, | |
69 | + methods: { | |
70 | + goToPage(page) { | |
71 | + this.$router.push({ name: page }); | |
72 | + }, | |
73 | + closeModal() { | |
74 | + this.showModal = false; | |
75 | + }, | |
76 | + buttonSearch() { | |
77 | + this.searchOpen = true; | |
78 | + }, | |
79 | + closeBtn() { | |
80 | + this.searchOpen = false; | |
81 | + | |
82 | + }, | |
83 | + showConfirm(type) { | |
84 | + let message = ''; | |
85 | + if (type === 'delete') { | |
86 | + message = '삭제하시겠습니까?'; | |
87 | + } else if (type === 'reset') { | |
88 | + message = '초기화하시겠습니까?'; | |
89 | + } else if (type === 'save') { | |
90 | + message = '등록하시겠습니까?'; | |
91 | + } | |
92 | + | |
93 | + if (confirm(message)) { | |
94 | + this.goBack(); | |
95 | + } | |
96 | + }, | |
97 | + | |
98 | + }, | |
99 | + watch: { | |
100 | + | |
101 | + }, | |
102 | + computed: { | |
103 | + | |
104 | + }, | |
105 | + components: { | |
106 | + SvgIcon | |
107 | + }, | |
108 | + mounted() { | |
109 | + console.log('Main2 mounted'); | |
110 | + } | |
111 | +} | |
112 | +</script> | |
113 | +<style scoped> | |
114 | +.textbook{width: 300px;} | |
115 | +</style>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/teacher/C_Voca_List.vue
... | ... | @@ -0,0 +1,184 @@ |
1 | +<template> | |
2 | + <div class="title-box flex justify-between mb40"> | |
3 | + <p class="title">단어장</p> | |
4 | + <select name="" id=""> | |
5 | + <option value="UNIT_000000000000001">1단원</option> | |
6 | + </select> | |
7 | + </div> | |
8 | + <div class="search-wrap flex justify-between mb20 align-center"> | |
9 | + <div class="title2 gray">?단원 전체 목록</div> | |
10 | + <div> | |
11 | + <select name="" id="" class="mr10 data-wrap"> | |
12 | + <option value="">지문</option> | |
13 | + <option value="">단어</option> | |
14 | + </select> | |
15 | + <input type="text" placeholder="검색하세요."> | |
16 | + <button type="button" title="단어장 검색"> | |
17 | + <img src="../../../resources/img/look_t.png" alt=""> | |
18 | + </button> | |
19 | + </div> | |
20 | + </div> | |
21 | + <div class="table-wrap"> | |
22 | + <table> | |
23 | + <thead> | |
24 | + <td>No.</td> | |
25 | + <td>지문</td> | |
26 | + <td>단어 목록</td> | |
27 | + <td>작성자</td> | |
28 | + <td>등록일</td> | |
29 | + </thead> | |
30 | + <tbody> | |
31 | + <tr v-for="(wordBook, index) in dataList" :key="wordBook.wdBookId" @click="goToViewPage('noticeDetail')"> | |
32 | + <td>{{ createNo(index) }}</td> | |
33 | + <td>{{ wordBook.textTtl }}</td> | |
34 | + <td>{{ wordBook.wordsPreview }}</td> | |
35 | + <td>{{ wordBook.userId }}</td> | |
36 | + <td>{{ '' }}</td> | |
37 | + </tr> | |
38 | + </tbody> | |
39 | + </table> | |
40 | + <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;"> | |
41 | + <button @click="goToPage(currentPage - 1)"> | |
42 | + <img src="../../../resources/img/btn27_90t_normal.png" alt=""> | |
43 | + </button> | |
44 | + <button v-for="page in paginationButtons" :key="page" @click="goToPage(page - 1)" :class="{ 'selected-btn': currentPage === page - 1 }"> | |
45 | + {{ page }} | |
46 | + </button> | |
47 | + <button @click="goToPage(currentPage + 1)"> | |
48 | + <img src="../../../resources/img/btn28_90t_normal.png" alt=""> | |
49 | + </button> | |
50 | + </article> | |
51 | + <div class="flex justify-end "> | |
52 | + <button type="button" title="등록" class="new-btn" @click="goToPage('noticeInsert')"> | |
53 | + 등록 | |
54 | + </button> | |
55 | + </div> | |
56 | + </div> | |
57 | +</template> | |
58 | + | |
59 | +<script> | |
60 | +import SvgIcon from '@jamescoyle/vue-icon'; | |
61 | +import { mdiMagnify } from '@mdi/js'; | |
62 | +import axios from "axios"; | |
63 | + | |
64 | + | |
65 | +export default { | |
66 | + data () { | |
67 | + return { | |
68 | + mdiMagnify: mdiMagnify, | |
69 | + dataList: [], | |
70 | + currentPage: 0, | |
71 | + itemsPerPage: 2, | |
72 | + totalPosts: 0, | |
73 | + unitId: "UNIT_000000000000001" | |
74 | + } | |
75 | + }, | |
76 | + methods: { | |
77 | + | |
78 | + dataSelectList() { | |
79 | + const vm = this; | |
80 | + axios({ | |
81 | + url: "/wordbook/findByUnitId.json", | |
82 | + method: "post", | |
83 | + headers: { | |
84 | + "Content-Type": "application/json; charset=UTF-8", | |
85 | + }, | |
86 | + data: { | |
87 | + unitId: vm.unitId, | |
88 | + page: vm.currentPage + 1, | |
89 | + pageSize: vm.itemsPerPage | |
90 | + }, | |
91 | + }) | |
92 | + .then(function (response) { | |
93 | + console.log("dataList - response: ", response.data); | |
94 | + const wordBooks = response.data.wordBooks; | |
95 | + vm.totalPosts = response.data.totalWordBooks; | |
96 | + | |
97 | + // 지문 제목 및 단어 목록 가져오기 | |
98 | + const fetchDataPromises = wordBooks.map(wordBook => { | |
99 | + const textTitlePromise = axios.post("/text/selectOneText.json", { | |
100 | + textId: wordBook.textId | |
101 | + }).then(textResponse => { | |
102 | + wordBook.textTtl = textResponse.data[0].text_ttl; | |
103 | + }).catch(error => { | |
104 | + console.error(`${wordBook.textId}으로 지문 제목 가져오기 실패: `, error); | |
105 | + wordBook.textTtl = '제목값없음'; // 오류 시 기본값 설정 | |
106 | + }); | |
107 | + | |
108 | + const wordsPromise = axios.post("/word/getWordsByBookId.json", { | |
109 | + wdBookId: wordBook.wdBookId | |
110 | + }).then(wordsResponse => { | |
111 | + const words = wordsResponse.data.map(word => word.wdNm); | |
112 | + wordBook.wordsPreview = vm.generateWordsPreview(words); | |
113 | + }).catch(error => { | |
114 | + console.error(`${wordBook.wdBookId}으로 단어 목록 가져오기 실패: `, error); | |
115 | + wordBook.wordsPreview = '단어값없음'; // 오류 시 기본값 설정 | |
116 | + }); | |
117 | + | |
118 | + return Promise.all([textTitlePromise, wordsPromise]); | |
119 | + }); | |
120 | + | |
121 | + // 모든 데이터 가져오기 작업이 완료되면 dataList에 데이터 설정 | |
122 | + Promise.all(fetchDataPromises).then(() => { | |
123 | + vm.dataList = wordBooks; | |
124 | + }); | |
125 | + }) | |
126 | + .catch(function (error) { | |
127 | + console.log("dataList - error: ", error); | |
128 | + alert("단어장 목록 조회에 오류가 발생했습니다."); | |
129 | + }); | |
130 | + }, | |
131 | + generateWordsPreview(words) { | |
132 | + const maxLength = 20; // 최대 표시 길이 설정 | |
133 | + const wordString = words.join(', '); | |
134 | + | |
135 | + if (wordString.length > maxLength) { | |
136 | + return wordString.substring(0, maxLength) + '...'; | |
137 | + } else { | |
138 | + return wordString; | |
139 | + } | |
140 | + }, | |
141 | + createNo(index) { | |
142 | + return this.totalPosts - (this.currentPage * this.itemsPerPage + index); | |
143 | + }, | |
144 | + goToPage(page) { | |
145 | + if (page < 0 || page >= this.totalPages) { | |
146 | + return; | |
147 | + } | |
148 | + this.currentPage = page; | |
149 | + this.dataSelectList(); | |
150 | + }, | |
151 | + goToViewPage(page) { | |
152 | + this.$router.push({ name: page }); | |
153 | + }, | |
154 | + }, | |
155 | + watch: { | |
156 | + | |
157 | + }, | |
158 | + computed: { | |
159 | + totalPages() { | |
160 | + return Math.ceil(this.totalPosts / this.itemsPerPage); | |
161 | + }, | |
162 | + paginationButtons() { | |
163 | + let start = Math.max(0, this.currentPage - 2); | |
164 | + let end = Math.min(start + 5, this.totalPages); | |
165 | + | |
166 | + if (end - start < 5) { | |
167 | + start = Math.max(0, end - 5); | |
168 | + } | |
169 | + | |
170 | + return Array.from({ length: end - start }, (_, i) => start + i + 1); | |
171 | + }, | |
172 | + startIndex() { | |
173 | + return this.currentPage * this.itemsPerPage; | |
174 | + } | |
175 | + }, | |
176 | + components:{ | |
177 | + SvgIcon | |
178 | + }, | |
179 | + mounted() { | |
180 | + console.log('Voca Book List Component mounted'); | |
181 | + this.dataSelectList(); | |
182 | + } | |
183 | +} | |
184 | +</script>(파일 끝에 줄바꿈 문자 없음) |
--- client/views/pages/teacher/TextBookDetail.vue
+++ client/views/pages/teacher/TextBookDetail.vue
... | ... | @@ -1,6 +1,6 @@ |
1 | 1 |
<template> |
2 | 2 |
<div class="title-box flex justify-between mb40"> |
3 |
- <p class="title">A반</p> |
|
3 |
+ <p class="title">A교재</p> |
|
4 | 4 |
<select name="" id=""> |
5 | 5 |
<option value="">A 교재</option> |
6 | 6 |
</select> |
... | ... | @@ -13,58 +13,170 @@ |
13 | 13 |
<button>3</button> |
14 | 14 |
</div> |
15 | 15 |
<hr> |
16 |
- <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('TextList')"> |
|
17 |
- <label for="" class="title1">지문</label> |
|
18 |
- <div class="flex align-center " style="gap: 10px;"> |
|
19 |
- <p>00개</p> |
|
20 |
- <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button> |
|
16 |
+ <div class="mb20 "> |
|
17 |
+ <div class="flex justify-between mb30 align-center"> |
|
18 |
+ <label for="" class="title1">지문</label> |
|
19 |
+ <div class="look-btn flex align-center" @click="goToPage('TextList')"> |
|
20 |
+ <p>자세히 보기 </p> |
|
21 |
+ <svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon> |
|
22 |
+ </div> |
|
23 |
+ </div> |
|
24 |
+ <div class="table-wrap"> |
|
25 |
+ <table> |
|
26 |
+ <thead> |
|
27 |
+ <td>No.</td> |
|
28 |
+ <td>제목</td> |
|
29 |
+ <td>내용</td> |
|
30 |
+ <td>작성자</td> |
|
31 |
+ <td>등록일</td> |
|
32 |
+ </thead> |
|
33 |
+ <tbody> |
|
34 |
+ <tr> |
|
35 |
+ <td></td> |
|
36 |
+ <td></td> |
|
37 |
+ <td></td> |
|
38 |
+ <td></td> |
|
39 |
+ <td></td> |
|
40 |
+ </tr> |
|
41 |
+ </tbody> |
|
42 |
+ </table> |
|
21 | 43 |
</div> |
22 | 44 |
</div> |
23 |
- <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('QuestionList')"> |
|
24 |
- <label for="" class="title1">문제</label> |
|
25 |
- <div class="flex align-center " style="gap: 10px;"> |
|
26 |
- <p>00개</p> |
|
27 |
- <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button> |
|
45 |
+ <hr> |
|
46 |
+ <div class="mb20" > |
|
47 |
+ <div class="flex justify-between mb30 align-center"> |
|
48 |
+ <label for="" class="title1">문제</label> |
|
49 |
+ <div class="look-btn flex align-center" @click="goToPage('QuestionList')"> |
|
50 |
+ <p>자세히 보기 </p> |
|
51 |
+ <svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon> |
|
52 |
+ </div> |
|
53 |
+ </div> |
|
54 |
+ <div class="table-wrap"> |
|
55 |
+ <table> |
|
56 |
+ <thead> |
|
57 |
+ <td>No.</td> |
|
58 |
+ <td>제목</td> |
|
59 |
+ <td>내용</td> |
|
60 |
+ <td>작성자</td> |
|
61 |
+ <td>등록일</td> |
|
62 |
+ </thead> |
|
63 |
+ <tbody> |
|
64 |
+ <tr> |
|
65 |
+ <td></td> |
|
66 |
+ <td></td> |
|
67 |
+ <td></td> |
|
68 |
+ <td></td> |
|
69 |
+ <td></td> |
|
70 |
+ </tr> |
|
71 |
+ </tbody> |
|
72 |
+ </table> |
|
28 | 73 |
</div> |
29 | 74 |
</div> |
30 |
- <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('VocaList')"> |
|
31 |
- <label for="" class="title1">단어</label> |
|
32 |
- <div class="flex align-center " style="gap: 10px;"> |
|
33 |
- <p>00개</p> |
|
34 |
- <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button> |
|
75 |
+ <hr> |
|
76 |
+ <div class="mb20" > |
|
77 |
+ <div class="flex justify-between mb30 align-center"> |
|
78 |
+ <label for="" class="title1">단어</label> |
|
79 |
+ <div class="look-btn flex align-center" @click="goToPage('VocaList')"> |
|
80 |
+ <p>자세히 보기 </p> |
|
81 |
+ <svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon> |
|
82 |
+ </div> |
|
83 |
+ </div> |
|
84 |
+ <div class="table-wrap"> |
|
85 |
+ <table> |
|
86 |
+ <thead> |
|
87 |
+ <td>No.</td> |
|
88 |
+ <td>단어</td> |
|
89 |
+ <td>뜻</td> |
|
90 |
+ <td>작성자</td> |
|
91 |
+ <td>등록일</td> |
|
92 |
+ </thead> |
|
93 |
+ <tbody> |
|
94 |
+ <tr> |
|
95 |
+ <td></td> |
|
96 |
+ <td></td> |
|
97 |
+ <td></td> |
|
98 |
+ <td></td> |
|
99 |
+ <td></td> |
|
100 |
+ </tr> |
|
101 |
+ </tbody> |
|
102 |
+ </table> |
|
35 | 103 |
</div> |
36 | 104 |
</div> |
37 |
- <div class="bookmanage-btn mb20 flex justify-between align-center" @click="goToPage('ExamList')"> |
|
38 |
- <label for="" class="title1">중간 평가</label> |
|
39 |
- <div class="flex align-center " style="gap: 10px;"> |
|
40 |
- <p>00개</p> |
|
41 |
- <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button> |
|
105 |
+ <hr> |
|
106 |
+ <div class="mb20" > |
|
107 |
+ <div class="flex justify-between mb30 align-center"> |
|
108 |
+ <label for="" class="title1">중간 평가</label> |
|
109 |
+ <div class="look-btn flex align-center" @click="goToPage('ExamList')"> |
|
110 |
+ <p>자세히 보기 </p> |
|
111 |
+ <svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon> |
|
112 |
+ </div> |
|
113 |
+ </div> |
|
114 |
+ <div class="table-wrap"> |
|
115 |
+ <table> |
|
116 |
+ <thead> |
|
117 |
+ <td>No.</td> |
|
118 |
+ <td>제목</td> |
|
119 |
+ <td>내용</td> |
|
120 |
+ <td>작성자</td> |
|
121 |
+ <td>등록일</td> |
|
122 |
+ </thead> |
|
123 |
+ <tbody> |
|
124 |
+ <tr> |
|
125 |
+ <td></td> |
|
126 |
+ <td></td> |
|
127 |
+ <td></td> |
|
128 |
+ <td></td> |
|
129 |
+ <td></td> |
|
130 |
+ </tr> |
|
131 |
+ </tbody> |
|
132 |
+ </table> |
|
42 | 133 |
</div> |
43 | 134 |
</div> |
44 |
- <div class="bookmanage-btn flex justify-between align-center" @click="goToPage('ExamList')"> |
|
45 |
- <label for="" class="title1">최종 평가</label> |
|
46 |
- <div class="flex align-center " style="gap: 10px;"> |
|
47 |
- <p>00개</p> |
|
48 |
- <button><img src="../../../resources/img/btn33_101t_normal.png" alt=""></button> |
|
135 |
+ <hr> |
|
136 |
+ <div > |
|
137 |
+ <div class="flex justify-between mb30 align-center"> |
|
138 |
+ <label for="" class="title1">최종 평가</label> |
|
139 |
+ <div class="look-btn flex align-center" @click="goToPage('ExamList')"> |
|
140 |
+ <p>자세히 보기 </p> |
|
141 |
+ <svg-icon type="mdi" :path="mdilArrowRight" class=" ml10"></svg-icon> |
|
142 |
+ </div> |
|
143 |
+ </div> |
|
144 |
+ <div class="table-wrap"> |
|
145 |
+ <table> |
|
146 |
+ <thead> |
|
147 |
+ <td>No.</td> |
|
148 |
+ <td>제목</td> |
|
149 |
+ <td>내용</td> |
|
150 |
+ <td>작성자</td> |
|
151 |
+ <td>등록일</td> |
|
152 |
+ </thead> |
|
153 |
+ <tbody> |
|
154 |
+ <tr> |
|
155 |
+ <td></td> |
|
156 |
+ <td></td> |
|
157 |
+ <td></td> |
|
158 |
+ <td></td> |
|
159 |
+ <td></td> |
|
160 |
+ </tr> |
|
161 |
+ </tbody> |
|
162 |
+ </table> |
|
49 | 163 |
</div> |
50 | 164 |
</div> |
51 | 165 |
</div> |
52 |
- <div class="flex justify-end mt30" style="gap: 10px;"> |
|
53 |
- <!-- <button type="button" title="" class="new-btn" @click="showConfirm('delete')"> |
|
54 |
- 추가 |
|
55 |
- </button> --> |
|
166 |
+ <!-- <div class="flex justify-end mt30" style="gap: 10px;"> |
|
56 | 167 |
<button type="button" title="" class="new-btn" @click="goToPage('RoadMap')"> |
57 | 168 |
로드맵 |
58 | 169 |
</button> |
59 | 170 |
<button type="button" title="" class="new-btn" @click="showConfirm('delete')"> |
60 | 171 |
삭제 |
61 | 172 |
</button> |
62 |
- </div> |
|
173 |
+ </div> --> |
|
63 | 174 |
</template> |
64 | 175 |
|
65 | 176 |
<script> |
66 | 177 |
import SvgIcon from '@jamescoyle/vue-icon'; |
67 |
-import { mdiMagnify, mdilArrowRight } from '@mdi/js'; |
|
178 |
+import { mdiMagnify, } from '@mdi/js'; |
|
179 |
+import { mdilArrowRight } from '@mdi/light-js'; |
|
68 | 180 |
import ProgressBar from '../../component/ProgressBar.vue'; |
69 | 181 |
|
70 | 182 |
|
... | ... | @@ -115,4 +227,5 @@ |
115 | 227 |
console.log('Main2 mounted'); |
116 | 228 |
} |
117 | 229 |
} |
118 |
-</script>(파일 끝에 줄바꿈 문자 없음) |
|
230 |
+</script> |
|
231 |
+<style scoped></style>(파일 끝에 줄바꿈 문자 없음) |
--- client/views/pages/teacher/textbook.vue
+++ client/views/pages/teacher/textbook.vue
... | ... | @@ -1,9 +1,9 @@ |
1 | 1 |
<template> |
2 | 2 |
<div class="title-box flex justify-between mb40"> |
3 |
- <p class="title">교재</p> |
|
4 |
- <select name="" id=""> |
|
3 |
+ <p class="title">교재 관리</p> |
|
4 |
+ <!-- <select name="" id=""> |
|
5 | 5 |
<option value="">A반</option> |
6 |
- </select> |
|
6 |
+ </select> --> |
|
7 | 7 |
</div> |
8 | 8 |
<div class="content-t"> |
9 | 9 |
<div class=" flex " style="gap: 50px;"> |
... | ... | @@ -36,9 +36,9 @@ |
36 | 36 |
</div> |
37 | 37 |
<div class="search-wrap mb30"> |
38 | 38 |
<input type="text" class="data-wrap" placeholder=""> |
39 |
- <button type="button" title="교재 검색"> |
|
39 |
+ <!-- <button type="button" title="교재 검색"> |
|
40 | 40 |
<img src="../../../resources/img/look_t.png" alt=""> |
41 |
- </button> |
|
41 |
+ </button> --> |
|
42 | 42 |
</div> |
43 | 43 |
<div class="flex justify-center "> |
44 | 44 |
<button type="button" title="글쓰기" class="new-btn mr10"> |
... | ... | @@ -107,4 +107,7 @@ |
107 | 107 |
console.log('Main2 mounted'); |
108 | 108 |
} |
109 | 109 |
} |
110 |
-</script>(파일 끝에 줄바꿈 문자 없음) |
|
110 |
+</script> |
|
111 |
+<style scoped> |
|
112 |
+.textbook{width: 300px;} |
|
113 |
+</style>(파일 끝에 줄바꿈 문자 없음) |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?