jichoi / lms_front star
PsHooN7979 2024-08-08
240808 박세훈 게시판 상세화면 페이지
@ba5e61fce676b8c347244844cdad82ca5b98d0bc
client/views/layout/Header.vue
--- client/views/layout/Header.vue
+++ client/views/layout/Header.vue
@@ -102,7 +102,7 @@
 
       // 페이징 정보
       page: 1,
-      pageSize: 3,
+      pageSize: 2,
       totalpages: null,
 
       // 사용자 정보
client/views/pages/teacher/Board.vue
--- client/views/pages/teacher/Board.vue
+++ client/views/pages/teacher/Board.vue
@@ -38,7 +38,7 @@
           :class="{ 'selected-row': selectedRow == item.dataList }"
           @click="[goToPage('noticeDetail'), selectBoardList(item)]"
         >
-          <td>{{ totalBoard - index }}</td>
+          <td>{{ createNo(index) }}</td>
           <td>{{ item.bbsTtl }}</td>
           <td>{{ item.bbsCls }}</td>
           <td>{{ userNm }}</td>
@@ -50,22 +50,19 @@
       class="table-pagination flex justify-center align-center mb20 mt30"
       style="gap: 10px"
     >
-      <button>
-        <img
-          src="../../../resources/img/btn27_90t_normal.png"
-          alt=""
-          @click="previousPage"
-          :disabled="page === 1"
-        />
+      <button @click="goToPagination(currentPage - 1)">
+        <img src="../../../resources/img/btn27_90t_normal.png" alt="" />
       </button>
-      <button class="selected-btn">{{ page }}</button>
-      <button>
-        <img
-          src="../../../resources/img/btn28_90t_normal.png"
-          alt=""
-          @click="nextPage"
-          :disabled="page === totalPages"
-        />
+      <button
+        v-for="page in paginationButtons"
+        :key="page"
+        @click="goToPagination(page - 1)"
+        :class="{ 'selected-btn': currentPage === page - 1 }"
+      >
+        {{ page }}
+      </button>
+      <button @click="goToPagination(currentPage + 1)">
+        <img src="../../../resources/img/btn28_90t_normal.png" alt="" />
       </button>
     </article>
     <div class="flex justify-end">
@@ -93,13 +90,12 @@
 
       // 게시글 정보
       dataList: [],
-      totalBoard: null,
+      totalPosts: 0,
       selectedRow: "",
 
       // 페이징
-      page: 1,
-      pageSize: 8,
-      totalPages: null,
+      currentPage: 0,
+      itemsPerPage: 8,
 
       // 반 아이디 (추후 세션에서 받는걸로 수정)
       sclsId: "1",
@@ -137,21 +133,22 @@
         headers: {
           "Content-Type": "application/json; charset=UTF-8",
         },
-        data: { page: vm.page, pageSize: vm.pageSize, sclsId: vm.sclsId },
+        data: {
+          page: vm.currentPage + 1,
+          pageSize: vm.itemsPerPage,
+          sclsId: vm.sclsId,
+        },
       })
         .then(function (res) {
           console.log("dataList - response : ", res.data);
-          console.log(res.data.result[0].boardClass[0].board);
 
           vm.dataList = res.data.result[0].boardClass[0].board;
           vm.userNm = res.data.result[0].userNm;
           vm.userId = res.data.result[0].userId;
-          vm.totalBoard = res.data.totalBoard;
-          vm.totalPages = Math.ceil(vm.totalBoard / vm.pageSize);
+          vm.totalPosts = res.data.totalBoard;
         })
         .catch(function (error) {
           console.log("result - error : ", error);
-          alert("비상 비상!");
         });
     },
 
@@ -171,8 +168,8 @@
       let searchPayload = {
         keyword: vm.searchKeyword,
         option: vm.selectedSearchOption,
-        page: vm.page,
-        pageSize: vm.pageSize,
+        page: vm.currentPage,
+        pageSize: vm.itemsPerPage,
         sclsId: vm.sclsId,
       };
       axios({
@@ -188,7 +185,7 @@
           vm.dataList = res.data.result[0].boardClass[0].board;
           vm.userNm = res.data.result[0].userNm;
           vm.userId = res.data.result[0].userId;
-          vm.totalBoard = res.data.totalBoard;
+          vm.totalPosts = res.data.totalBoard;
         })
         .catch(function (error) {
           console.log("dataSearch - error : ", error);
@@ -196,22 +193,37 @@
         });
     },
 
-    previousPage() {
-      if (this.page > 1) {
-        this.page -= 1;
-        this.boardList();
-      }
+    createNo(index) {
+      return this.totalPosts - (this.currentPage * this.itemsPerPage + index);
     },
 
-    nextPage() {
-      if (this.page < this.totalPages) {
-        this.page += 1;
-        this.boardList();
+    goToPagination(page) {
+      if (page < 0 || page >= this.totalPages) {
+        return;
       }
+      this.currentPage = page;
+      this.boardList();
     },
   },
   watch: {},
-  computed: {},
+  computed: {
+    totalPages() {
+      return Math.ceil(this.totalPosts / this.itemsPerPage);
+    },
+    paginationButtons() {
+      let start = Math.max(0, this.currentPage - 2);
+      let end = Math.min(start + 5, this.totalPages);
+
+      if (end - start < 5) {
+        start = Math.max(0, end - 5);
+      }
+
+      return Array.from({ length: end - start }, (_, i) => start + i + 1);
+    },
+    startIndex() {
+      return this.currentPage * this.itemsPerPage;
+    },
+  },
   components: {
     SvgIcon,
   },
client/views/pages/teacher/noticeDetail.vue
--- client/views/pages/teacher/noticeDetail.vue
+++ client/views/pages/teacher/noticeDetail.vue
@@ -1,78 +1,200 @@
 <template>
-    <div class="title-box flex justify-between mb40">
-        <p class="title">공지 등록</p>
+  <div class="title-box flex justify-between mb40">
+    <p class="title">{{ dataList.bbsCls }}</p>
+  </div>
+  <div class="board-wrap">
+    <div class="flex align-center">
+      <label for="" class="title2">{{ dataList.bbsTtl }}</label>
     </div>
-        <div class="board-wrap">
-            <div class="flex align-center">
-                <label for="" class="title2">제목</label>
-                <input type="text" class="data-wrap">
-            </div>
-            <hr>
-            <textarea name="" id=""></textarea>
-            <hr>
-            <div class="flex align-center">
-                <label for="" class="title2">첨부파일</label>
-                <input type="file" ref="fileInput" @change="handleFileUpload" />
-            </div>
-            <hr>
-            <div class="flex justify-between">
-                <button type="button" class="flex align-center">
-                            <svg-icon type="mdi" :path="mdilChevronLeft" ></svg-icon>
-                   <p> 이전글</p>
-                        </button>
-                <button type="button" class="flex align-center"><p>다음글</p>
-                            <svg-icon type="mdi" :path="mdilChevronRight" ></svg-icon>
-
-                        </button>
-
-
-            </div>
-        </div>
-        <div class="flex justify-between mt50">
-                <button type="button" title="글쓰기" class="new-btn"  @click="goToPage('Board')">
-                    목록
-                </button>
-               <div class="flex">
-                    <button type="button" title="글쓰기" class="new-btn mr10"  >
-                        수정
-                    </button>
-                    <button type="button" title="글쓰기" class="new-btn"  >
-                        삭제
-                    </button>
-               </div>
-        </div>
+    <hr />
+    <textarea readonly name="" id="">{{ dataList.bbsCnt }}</textarea>
+    <hr />
+    <div class="flex align-center">
+      <label for="" class="title2">첨부파일</label>
+      <label for="" class="title2" v-if="file">{{ file.fileNm }}</label>
+    </div>
+    <hr />
+    <div class="flex justify-between">
+      <button type="button" class="flex align-center" @click="prevBoard()">
+        <svg-icon type="mdi" :path="mdilChevronLeft"></svg-icon>
+        <p>이전글</p>
+      </button>
+      <button type="button" class="flex align-center" @click="nextBoard()">
+        <p>다음글</p>
+        <svg-icon type="mdi" :path="mdilChevronRight"></svg-icon>
+      </button>
+    </div>
+  </div>
+  <div class="flex justify-between mt50">
+    <button
+      type="button"
+      title="글쓰기"
+      class="new-btn"
+      @click="goToPage('Board')"
+    >
+      목록
+    </button>
+    <div class="flex">
+      <button type="button" title="글쓰기" class="new-btn mr10">수정</button>
+      <button
+        type="button"
+        title="글쓰기"
+        class="new-btn"
+        @click="[deleteBoard(), goToPage('Board')]"
+      >
+        삭제
+      </button>
+    </div>
+  </div>
 </template>
 
 <script>
-import SvgIcon from '@jamescoyle/vue-icon';
-import { mdiMagnify } from '@mdi/js';
-import { mdilChevronRight,mdilChevronLeft } from '@mdi/light-js';
-
+import SvgIcon from "@jamescoyle/vue-icon";
+import { mdiMagnify } from "@mdi/js";
+import { mdilChevronRight, mdilChevronLeft } from "@mdi/light-js";
+import axios from "axios";
 
 export default {
-    data () {
-        return {
-            mdiMagnify: mdiMagnify,
-            mdilChevronRight: mdilChevronRight ,
-            mdilChevronLeft:mdilChevronLeft,
-        }
-    },
-    methods: {
-        goToPage(page) {
-         this.$router.push({ name: page });
-      },
-    },
-    watch: {
+  data() {
+    return {
+      mdiMagnify: mdiMagnify,
+      mdilChevronRight: mdilChevronRight,
+      mdilChevronLeft: mdilChevronLeft,
 
+      dataList: null,
+      sclsId: "",
+
+      title: "",
+      content: "",
+      category: "",
+      file: "",
+      user: "",
+    };
+  },
+  methods: {
+    goToPage(page) {
+      this.$router.push({ name: page });
     },
-    computed: {
-       
+    created() {
+      const vm = this;
+      const seletedBoardList = JSON.parse(
+        sessionStorage.getItem("selectedBoardList")
+      );
+
+      if (seletedBoardList) {
+        vm.dataList = seletedBoardList;
+      }
+      console.log(vm.dataList);
     },
-    components:{
-        SvgIcon
+
+    findFile() {
+      const vm = this;
+      axios({
+        url: "/file/find.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          file_mng_id: vm.dataList.fileMngId,
+        },
+      })
+        .then(function (res) {
+          console.log("fileInfo - response : ", res.data.list[0]);
+          vm.file = res.data.list[0];
+        })
+        .catch(function (error) {
+          console.log("result - error : ", error);
+        });
     },
-    mounted() {
-        console.log('Main2 mounted');
-    }
-}
-</script>
(No newline at end of file)
+
+    prevBoard() {
+      const vm = this;
+      axios({
+        url: "/board/prevBoard.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          sclsId: vm.dataList.sclsId,
+          bbsId: vm.dataList.bbsId,
+        },
+      })
+        .then(function (res) {
+          console.log("dataList - response : ", res.data);
+          vm.dataList = res.data[0].boardClass[0].board[0];
+          sessionStorage.setItem(
+            "selectedBoardList",
+            JSON.stringify(vm.dataList)
+          );
+          vm.findFile();
+          console.log(vm.dataList);
+        })
+        .catch(function (error) {
+          console.log("result - error : ", error);
+          alert("첫번째 글 입니다.");
+        });
+    },
+
+    nextBoard() {
+      const vm = this;
+      axios({
+        url: "/board/nextBoard.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          sclsId: vm.dataList.sclsId,
+          bbsId: vm.dataList.bbsId,
+        },
+      })
+        .then(function (res) {
+          console.log("dataList - response : ", res.data);
+          vm.dataList = res.data[0].boardClass[0].board[0];
+          sessionStorage.setItem(
+            "selectedBoardList",
+            JSON.stringify(vm.dataList)
+          );
+          vm.findFile();
+          console.log(vm.dataList);
+        })
+        .catch(function (error) {
+          console.log("result - error : ", error);
+          alert("가장 최신 글 입니다.");
+        });
+    },
+    deleteBoard() {
+      const vm = this;
+      axios({
+        url: "/board/delete.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: {
+          bbsId: vm.dataList.bbsId,
+        },
+      })
+        .then(function (res) {
+          console.log("delete - response : ", res.data);
+          alert("삭제 되었습니다.");
+        })
+        .catch(function (error) {
+          console.log("rssult - error : ", error);
+        });
+    },
+  },
+  watch: {},
+  computed: {},
+  components: {
+    SvgIcon,
+  },
+  mounted() {
+    console.log("Main2 mounted");
+    this.created();
+    this.findFile();
+  },
+};
+</script>
Add a comment
List