jichoi / lms_front star
woals 2024-08-12
240812 권민수 단어장 검색 기능 추가 조회 메시지 추가
@d4856fa7cb4c0faae4485c6624383a0c87e979b9
client/views/pages/teacher/VocaList.vue
--- client/views/pages/teacher/VocaList.vue
+++ client/views/pages/teacher/VocaList.vue
@@ -14,14 +14,14 @@
         </button>
     </div>
     <div class="search-wrap flex justify-between mb20 align-center">
-        <div class="title2 gray flex"><div class="black">[{{ selectedUnitName }}]</div>단원 전체 목록</div>
+        <div class="title2 gray flex">{{ titleMessage }}</div>
         <div>
-            <select name="" id="" class="mr10 data-wrap">
-                <option value="">지문</option>
-                <option value="">단어</option>
+            <select v-model="searchType" class="mr10 data-wrap">
+                <option value="text">지문</option>
+                <option value="word">단어</option>
             </select>
-            <input  type="text" placeholder="검색하세요.">
-            <button type="button" title="단어장 검색">
+            <input v-model="searchQuery" type="text" placeholder="검색하세요.">
+            <button type="button" title="단어장 검색" @click="searchWordBooks">
                 <img src="../../../resources/img/look_t.png" alt="">
             </button>
         </div>
@@ -77,10 +77,13 @@
             selectedBookId: null, // 선택된 책 ID 저장 변수
             selectedUnitId: null, // 선택된 단원 ID 저장 변수
             selectedUnitName: '', // 선택된 단원의 이름 저장 변수
+            titleMessage: '', // 타이틀 메시지 변수
             dataList: [],
             currentPage: 0,
             itemsPerPage: 2,
-            totalPosts: 0
+            totalPosts: 0,
+            searchType: 'text', // 검색 종류를 저장할 변수
+            searchQuery: '' // 검색어를 저장할 변수
         }
     },
     methods: {
@@ -119,6 +122,8 @@
             this.selectedUnitId = unitId;
             const selectedUnit = this.units.find(unit => unit.unitId === unitId);
             this.selectedUnitName = selectedUnit ? selectedUnit.unitName : '';
+            this.searchQuery = ''; 
+            this.titleMessage = `[${this.selectedUnitName}] 단원 전체 목록`;
             this.dataSelectList(); // 단어장 목록 조회
         },
 
@@ -207,14 +212,85 @@
         goToViewPage(page) {
             this.$router.push({ name: page });
         },
+
+        // 검색 메서드 추가
+        searchWordBooks() {
+            const vm = this;
+            let url = '';
+            let data = {};
+
+            if (this.searchType === 'text') {
+                // 지문으로 검색
+                url = '/wordbook/findByTextTitle.json';
+                data = {
+                    unitId: vm.selectedUnitId,
+                    textTitle: vm.searchQuery,
+                    page: vm.currentPage + 1,
+                    pageSize: vm.itemsPerPage
+                };
+                this.titleMessage = `[${vm.searchQuery}]의 지문 검색 결과`;
+            } else if (this.searchType === 'word') {
+                // 단어로 검색
+                url = '/wordbook/findByWord.json';
+                data = {
+                    unitId: vm.selectedUnitId,
+                    word: vm.searchQuery,
+                    page: vm.currentPage + 1,
+                    pageSize: vm.itemsPerPage
+                };
+                this.titleMessage = `[${vm.searchQuery}]의 단어 검색 결과`;
+            }
+
+            axios.post(url, data)
+            .then(function (response) {
+                console.log("searchWordBooks - 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("searchWordBooks - error: ", error);
+                alert("단어장 검색에 오류가 발생했습니다.");
+            });
+        },
     },
     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);
@@ -225,9 +301,11 @@
 
             return Array.from({ length: end - start }, (_, i) => start + i + 1);
         },
+
         startIndex() {
             return this.currentPage * this.itemsPerPage;
         }
+
     },
     components:{
         SvgIcon
Add a comment
List