jichoi / lms_front star
PsHooN7979 08-13
240813 박세훈 게시판 오류 수정
@c0b10145043749954b06a68a1d1d899491975c02
client/views/pages/teacher/Board.vue
--- client/views/pages/teacher/Board.vue
+++ client/views/pages/teacher/Board.vue
@@ -1,87 +1,87 @@
 <template>
-  <div class="title-box flex justify-between mb40">
-    <p class="title">게시판</p>
-    <select v-model="sclsId" @change="handleClassId()">
-      <option
-        v-for="(item, index) in classList"
-        :key="index"
-        :value="item.sclsId"
-      >
-        {{ item.sclsNm }}
-      </option>
-    </select>
-  </div>
-  <div class="search-wrap flex justify-end mb20">
-    <select v-model="selectedSearchOption" class="mr10 data-wrap">
-      <option value="bbsTtl">제목</option>
-      <option value="bbsCnt">내용</option>
-      <option value="userNm">작성자</option>
-      <option value="bbsCls">카테고리</option>
-    </select>
-    <input
-      v-model="searchKeyword"
-      type="text"
-      placeholder="검색하세요."
-      @keyup.enter="boardDataSearch"
-    />
-    <button type="button" @click="boardDataSearch()" title="게시글 검색">
-      <img src="../../../resources/img/look_t.png" alt="" />
-    </button>
-  </div>
-  <div class="table-wrap">
-    <table>
-      <thead>
-        <td>No.</td>
-        <td>제목</td>
-        <td>카테고리</td>
-        <td>작성자</td>
-        <td>등록일</td>
-      </thead>
-      <tbody>
-        <tr
-          v-for="(item, index) in dataList"
-          :key="item.id"
-          :class="{ 'selected-row': selectedRow == item.dataList }"
-          @click="[goToPage('noticeDetail'), selectBoardList(item)]"
-        >
-          <td>{{ createNo(index) }}</td>
-          <td>{{ item.bbsTtl }}</td>
-          <td>{{ item.bbsCls }}</td>
-          <td>{{ userNm }}</td>
-          <td>{{ item.bbsTm.substr(0, 16) }}</td>
-        </tr>
-      </tbody>
-    </table>
-    <article
-      class="table-pagination flex justify-center align-center mb20 mt30"
-      style="gap: 10px"
-    >
-      <button @click="goToPagination(currentPage - 1)">
-        <img src="../../../resources/img/btn27_90t_normal.png" alt="" />
-      </button>
-      <button
-        v-for="page in paginationButtons"
-        :key="page"
-        @click="goToPagination(page - 1)"
-        :class="{ 'selected-btn': currentPage === page - 1 }"
-      >
-        {{ page }}
-      </button>
-      <button @click="goToPagination(currentPage + 1)">
-        <img src="../../../resources/img/btn28_90t_normal.png" alt="" />
-      </button>
-    </article>
-    <div class="flex justify-end">
-      <button
-        type="button"
-        title="글쓰기"
-        class="new-btn"
-        @click="goToPage('noticeInsert')"
-      >
-        글쓰기
-      </button>
+    <div class="title-box flex justify-between mb40">
+        <p class="title">게시판</p>
+        <select v-model="sclsId" @change="handleClassId()">
+            <option
+                v-for="(item, index) in classList"
+                :key="index"
+                :value="item.sclsId"
+            >
+                {{ item.sclsNm }}
+            </option>
+        </select>
     </div>
-  </div>
+    <div class="search-wrap flex justify-end mb20">
+        <select v-model="selectedSearchOption" class="mr10 data-wrap">
+            <option value="bbsTtl">제목</option>
+            <option value="bbsCnt">내용</option>
+            <option value="userNm">작성자</option>
+            <option value="bbsCls">카테고리</option>
+        </select>
+        <input
+            v-model="searchKeyword"
+            type="text"
+            placeholder="검색하세요."
+            @keyup.enter="boardDataSearch"
+        />
+        <button type="button" @click="boardDataSearch()" title="게시글 검색">
+            <img src="../../../resources/img/look_t.png" alt="" />
+        </button>
+    </div>
+    <div class="table-wrap">
+        <table>
+            <thead>
+                <td>No.</td>
+                <td>제목</td>
+                <td>카테고리</td>
+                <td>작성자</td>
+                <td>등록일</td>
+            </thead>
+            <tbody>
+                <tr
+                    v-for="(item, index) in dataList"
+                    :key="item.id"
+                    :class="{ 'selected-row': selectedRow == item.dataList }"
+                    @click="[goToPage('noticeDetail'), selectBoardList(item)]"
+                >
+                    <td>{{ createNo(index) }}</td>
+                    <td>{{ item.bbsTtl }}</td>
+                    <td>{{ item.bbsCls }}</td>
+                    <td>{{ userNm }}</td>
+                    <td>{{ item.bbsTm.substr(0, 16) }}</td>
+                </tr>
+            </tbody>
+        </table>
+        <article
+            class="table-pagination flex justify-center align-center mb20 mt30"
+            style="gap: 10px"
+        >
+            <button @click="goToPagination(currentPage - 1)">
+                <img src="../../../resources/img/btn27_90t_normal.png" alt="" />
+            </button>
+            <button
+                v-for="page in paginationButtons"
+                :key="page"
+                @click="goToPagination(page - 1)"
+                :class="{ 'selected-btn': currentPage === page - 1 }"
+            >
+                {{ page }}
+            </button>
+            <button @click="goToPagination(currentPage + 1)">
+                <img src="../../../resources/img/btn28_90t_normal.png" alt="" />
+            </button>
+        </article>
+        <div class="flex justify-end">
+            <button
+                type="button"
+                title="글쓰기"
+                class="new-btn"
+                @click="goToPage('noticeInsert')"
+            >
+                글쓰기
+            </button>
+        </div>
+    </div>
 </template>
 
 <script>
@@ -90,188 +90,201 @@
 import axios from "axios";
 
 export default {
-  data() {
-    return {
-      mdiMagnify: mdiMagnify,
+    data() {
+        return {
+            mdiMagnify: mdiMagnify,
 
-      // 게시글 정보
-      dataList: [],
-      totalPosts: 0,
-      selectedRow: "",
-      bbsTm: "",
+            // 게시글 정보
+            dataList: [],
+            totalPosts: 0,
+            selectedRow: "",
+            bbsTm: "",
 
-      // 페이징
-      currentPage: 0,
-      itemsPerPage: 8,
+            // 페이징
+            currentPage: 0,
+            itemsPerPage: 8,
 
-      // 반 아이디 (추후 세션에서 받는걸로 수정)
-      sclsId: "",
-      classList: [],
+            // 반 아이디 (추후 세션에서 받는걸로 수정)
+            sclsId: "",
+            classList: [],
 
-      userId: "",
-      // 검색어
-      searchKeyword: "",
-      selectedSearchOption: "bbsTtl",
+            userId: "",
+            // 검색어
+            searchKeyword: "",
+            selectedSearchOption: "bbsTtl",
 
-      selected: null,
-    };
-  },
-  methods: {
-    goToPage(page) {
-      this.$router.push({ name: page });
+            selected: null,
+        };
     },
-    showConfirm(type) {
-      let message = "";
-      if (type === "cancel") {
-        message = "삭제하시겠습니까?";
-      } else if (type === "reset") {
-        message = "초기화하시겠습니까?";
-      } else if (type === "save") {
-        message = "등록하시겠습니까?";
-      }
-
-      if (confirm(message)) {
-        this.goBack();
-      }
-    },
-
-    // 게시글 전체 조회
-    boardList() {
-      const vm = this;
-      vm.sclsId = JSON.parse(sessionStorage.getItem("sclsId"));
-      axios({
-        url: "/board/findAll.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
+    methods: {
+        goToPage(page) {
+            this.$router.push({ name: page });
         },
-        data: {
-          page: vm.currentPage + 1,
-          pageSize: vm.itemsPerPage,
-          sclsId: vm.sclsId,
+        showConfirm(type) {
+            let message = "";
+            if (type === "cancel") {
+                message = "삭제하시겠습니까?";
+            } else if (type === "reset") {
+                message = "초기화하시겠습니까?";
+            } else if (type === "save") {
+                message = "등록하시겠습니까?";
+            }
+
+            if (confirm(message)) {
+                this.goBack();
+            }
         },
-      })
-        .then(function (res) {
-          console.log("dataList - response : ", res.data);
-          if (res.data.result.length !== 0) {
-            vm.dataList = res.data.result[0].boardClass[0].board;
-            vm.userNm = res.data.result[0].userNm;
-            vm.userId = res.data.result[0].userId;
-            vm.totalPosts = res.data.totalBoard;
-            vm.selectClass();
-            sessionStorage.removeItem("bbsId");
-            sessionStorage.removeItem("file");
-          } else {
-            vm.selectClass();
-          }
-        })
-        .catch(function (error) {
-          console.log("boardListError - error : ", error);
-        });
-    },
 
-    // 게시글 정보 세션에 저장
-    selectBoardList(item) {
-      sessionStorage.setItem("bbsId", JSON.stringify(item.bbsId));
-    },
+        // 게시글 전체 조회
+        boardList() {
+            const vm = this;
+            vm.sclsId = JSON.parse(sessionStorage.getItem("sclsId"));
+            axios({
+                url: "/board/findAll.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: {
+                    page: vm.currentPage + 1,
+                    pageSize: vm.itemsPerPage,
+                    sclsId: vm.sclsId,
+                },
+            })
+                .then(function (res) {
+                    console.log("dataList - response : ", res.data);
+                    if (res.data.result && res.data.result.length > 0) {
+                        const boardClass = res.data.result[0].boardClass;
+                        if (boardClass && boardClass.length > 0) {
+                            vm.dataList = boardClass[0].board || []; // Default to an empty array if `board` is not present
+                        } else {
+                            vm.dataList = []; // No `boardClass` found
+                        }
+                        vm.userNm = res.data.result[0].userNm || ""; // Default to empty string if `userNm` is not present
+                        vm.userId = res.data.result[0].userId || ""; // Default to empty string if `userId` is not present
+                        vm.totalPosts = res.data.totalBoard || 0; // Default to 0 if `totalBoard` is not present
+                    } else {
+                        vm.dataList = []; // No results found
+                        vm.userNm = "";
+                        vm.userId = "";
+                        vm.totalPosts = 0;
+                    }
 
-    // 반 아이디 세션에 저장
+                    vm.selectClass();
 
-    // 게시글 검색
-    boardDataSearch() {
-      const vm = this;
-      let searchPayload = {
-        keyword: vm.searchKeyword,
-        option: vm.selectedSearchOption,
-        page: vm.currentPage,
-        pageSize: vm.itemsPerPage,
-        sclsId: vm.sclsId,
-      };
-      axios({
-        url: "/board/search.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
+                    // Clean up session storage
+                    sessionStorage.removeItem("bbsId");
+                    sessionStorage.removeItem("file");
+                })
+                .catch(function (error) {
+                    console.log("boardListError - error : ", error);
+                });
         },
-        data: searchPayload,
-      })
-        .then(function (res) {
-          console.log("boardDataSearch - response : ", res.data);
-          vm.dataList = res.data.result[0].boardClass[0].board;
-          vm.userNm = res.data.result[0].userNm;
-          vm.userId = res.data.result[0].userId;
-          vm.totalPosts = res.data.totalBoard;
-        })
-        .catch(function (error) {
-          console.log("dataSearch - error : ", error);
-          alert("게시글이 존재하지 않습니다.");
-        });
-    },
 
-    // 반 조회
-    selectClass() {
-      const vm = this;
-      axios({
-        url: "/classes/selectClass.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
+        // 게시글 정보 세션에 저장
+        selectBoardList(item) {
+            sessionStorage.setItem("bbsId", JSON.stringify(item.bbsId));
         },
-        data: {
-          userId: vm.userId,
+
+        // 반 아이디 세션에 저장
+
+        // 게시글 검색
+        boardDataSearch() {
+            const vm = this;
+            let searchPayload = {
+                keyword: vm.searchKeyword,
+                option: vm.selectedSearchOption,
+                page: vm.currentPage,
+                pageSize: vm.itemsPerPage,
+                sclsId: vm.sclsId,
+            };
+            axios({
+                url: "/board/search.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: searchPayload,
+            })
+                .then(function (res) {
+                    console.log("boardDataSearch - response : ", res.data);
+                    vm.dataList = res.data.result[0].boardClass[0].board;
+                    vm.userNm = res.data.result[0].userNm;
+                    vm.userId = res.data.result[0].userId;
+                    vm.totalPosts = res.data.totalBoard;
+                })
+                .catch(function (error) {
+                    console.log("dataSearch - error : ", error);
+                    alert("게시글이 존재하지 않습니다.");
+                });
         },
-      })
-        .then(function (res) {
-          console.log("classData - response : ", res.data);
-          vm.classList = res.data.data;
-          vm.selected = res.data.data.sclsId;
-        })
-        .catch(function (error) {
-          console.log("classData - error : ", error);
-        });
-    },
-    handleClassId() {
-      sessionStorage.setItem("sclsId", JSON.stringify(this.sclsId));
-      this.boardList();
-    },
 
-    createNo(index) {
-      return this.totalPosts - (this.currentPage * this.itemsPerPage + index);
-    },
+        // 반 조회
+        selectClass() {
+            const vm = this;
+            axios({
+                url: "/classes/selectClass.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: {
+                    userId: vm.userId,
+                },
+            })
+                .then(function (res) {
+                    console.log("classData - response : ", res.data);
+                    vm.classList = res.data.data;
+                    vm.selected = res.data.data.sclsId;
+                })
+                .catch(function (error) {
+                    console.log("classData - error : ", error);
+                });
+        },
+        handleClassId() {
+            sessionStorage.setItem("sclsId", JSON.stringify(this.sclsId));
+            this.boardList();
+        },
 
-    goToPagination(page) {
-      if (page < 0 || page >= this.totalPages) {
-        return;
-      }
-      this.currentPage = page;
-      this.boardList();
-    },
-  },
-  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);
+        createNo(index) {
+            return (
+                this.totalPosts - (this.currentPage * this.itemsPerPage + index)
+            );
+        },
 
-      if (end - start < 5) {
-        start = Math.max(0, end - 5);
-      }
+        goToPagination(page) {
+            if (page < 0 || page >= this.totalPages) {
+                return;
+            }
+            this.currentPage = page;
+            this.boardList();
+        },
+    },
+    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);
 
-      return Array.from({ length: end - start }, (_, i) => start + i + 1);
+            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;
+        },
     },
-    startIndex() {
-      return this.currentPage * this.itemsPerPage;
+    components: {
+        SvgIcon,
     },
-  },
-  components: {
-    SvgIcon,
-  },
-  mounted() {
-    console.log("Main2 mounted");
-    this.boardList();
-  },
+    mounted() {
+        console.log("Main2 mounted");
+        this.boardList();
+    },
 };
 </script>
Add a comment
List