jichoi / lms_front star
dajeong 2024-08-08
240808 정다정 교사 마이페이지 반 CRUD
@f3fda4d62f26fd479d0c2c0e320969aa67985660
client/views/pages/teacher/Home.vue
--- client/views/pages/teacher/Home.vue
+++ client/views/pages/teacher/Home.vue
@@ -1,33 +1,31 @@
 <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="class">
-                <div class="box gd-col2" style="gap: 10px;" @click="goToPage('ClassDetail')">
+        <div class=" flex " style="gap: 50px;" :style="{flexWrap: 'wrap'}">
+            <div class="class" v-for="classItem in classesList" :key="classItem.sclsId">
+                <div class="box gd-col2" style="gap: 10px;" @click="goToPage('ClassDetail', classItem.sclsId)">
                     <div><img src="../../../resources/img/img176_82t.png" alt=""></div>
                     <div><img src="../../../resources/img/img176_82t.png" alt=""></div>
                     <div><img src="../../../resources/img/img176_82t.png" alt=""></div>
                     <div><img src="../../../resources/img/img176_82t.png" alt=""></div>
                 </div>
                 <div class="text flex justify-between mt20">
-                    <p class="title1">A반</p>
-                    <span class="member">20명</span>
+                    <p class="title1">{{ classItem.sclsNm }}</p>
+                    <span class="member">{{ classItem. studentCount}}</span>
                 </div>
                 <div class="btnGroup mt15 flex align-center justify-end" style="gap: 10px;">
-                    <button @click="showConfirm('edit')">수정</button>
+                    <button @click="editModeModal(classItem.sclsId)">수정</button>
                     <p>&#124;</p>
-                    <button @click="showConfirm('delete')">삭제</button>
+                    <button @click="deleteClass(classItem.sclsId)">삭제</button>
                 </div>
             </div>
             <div class="textbook-add">
-                <button @click="buttonSearch"><img src="../../../resources/img/btn32_98t_normal.png" alt=""></button>
+                <button @click="addModeModal"><img src="../../../resources/img/btn32_98t_normal.png" alt=""></button>
 
             </div>
+            <!-- 팝업창 -->
             <div v-show="searchOpen" class="popup-wrap">
                 <div class="popup-box ">
                     <div class="flex justify-between mb30">
@@ -38,17 +36,17 @@
                         </button>
                     </div>
                     <div class="search-wrap mb30">
-                        <input type="text" class="data-wrap" placeholder="">
+                        <input type="text" v-model="createClassName"  class="data-wrap" placeholder="">
                         <!-- <button type="button" >
                             <img src="../../../resources/img/look_t.png" alt="">
                         </button> -->
                     </div>
                     <div class="flex justify-center ">
-                        <button type="button" title="글쓰기" class="new-btn mr10">
+                        <button type="button" title="글쓰기" class="new-btn mr10" @click="closeBtn">
                             취소
                         </button>
-                        <button type="button" title="글쓰기" class="new-btn">
-                            생성
+                        <button type="button" title="등록" class="new-btn" @click="isEditMode ? updateClass() : insertClass()">
+                            {{ isEditMode ? '수정' : '등록' }}
                         </button>
                     </div>
                 </div>
@@ -58,6 +56,7 @@
 </template>
 
 <script>
+import axios from 'axios';
 import SvgIcon from '@jamescoyle/vue-icon';
 import { mdiMagnify, mdiWindowClose } from '@mdi/js';
 export default {
@@ -66,23 +65,38 @@
             mdiWindowClose: mdiWindowClose,
             showModal: false,
             searchOpen: false,
+
+            classesList : [], // 불러온 반 정보
+            user_id : '2', //유저 아이디 : 현재는 고정
+            createClassName : "", // 생성 또는 수정할 반 이름
+
+            isEditMode: false, // 추가 모드인지 수정 모드인지 구분하는 변수
+            current_editId : '', // 현재 수정할 반 id
         }
     },
     methods: {
-        goToPage(page) {
-            this.$router.push({ name: page });
+        goToPage(page, sclsId) {
+            //console.log(`sclsId : ${sclsId}`); // 쿼리 확인
+            this.$router.push({ name: page , query : {sclsId : sclsId}});
         },
         closeModal() {
             this.showModal = false;
         },
-        buttonSearch() {
+        editModeModal(sclsId) {
             this.searchOpen = true;
+            this.isEditMode = true; // 수정 모드로 설정
+            this.current_editId = sclsId
+        },
+        addModeModal() {
+            this.searchOpen = true;
+            this.isEditMode = false; // 추가 모드로 설정
         },
         closeBtn() {
             this.searchOpen = false;
+            this.createClassName = ""; // 팝업 닫을 때 반 이름 초기화
 
         },
-        showConfirm(type) {
+        showConfirm(type, callback) {
             let message = '';
             if (type === 'delete') {
                 message = '삭제하시겠습니까?';
@@ -90,13 +104,143 @@
                 message = '초기화하시겠습니까?';
             } else if (type === 'save') {
                 message = '등록하시겠습니까?';
+            } else if (type === 'edit'){
+                message = '수정하시겠습니까?';
             }
+
 
             if (confirm(message)) {
-                this.goBack();
+                if (callback) callback(); // 콜백 함수 호출
             }
         },
-
+        // 조회
+        selectClass() {
+            axios({
+                url: "/classes/selectClass.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: {
+                    userId: this.user_id
+                },
+            })
+            .then((res) => {
+                if (res.data.status === "success") {
+                    console.log("classesList - response(조회) : ", res.data.data);
+                    this.classesList = res.data.data;
+                } else {
+                    console.log("조회에 실패했습니다: ", res.data);
+                    alert("조회에 실패했습니다.");
+                }
+            })
+            .catch((err) => {
+                console.log("classesList - error(조회) : ", err);
+                alert("조회에 오류가 발생했습니다.");
+            });
+        },
+        // 추가
+        insertClass() {
+            if(this.createClassName.trim() === ""){
+                alert("반 이름을 입력해주세요");
+            }
+            else{
+                this.showConfirm('save', () => {
+                axios({
+                    url: "/classes/insertClass.json",
+                    method: "post",
+                    headers: {
+                        "Content-Type": "application/json; charset=UTF-8",
+                    },
+                    data: {
+                        userId: this.user_id,
+                        sclsNm: this.createClassName
+                    },
+                })
+                    .then((res) => {
+                        if (res.data.status === "success") {
+                            console.log("classesList - response(추가) : ", res.data.data);
+                            this.selectClass();
+                            this.createClassName = ""; // 반 이름 초기화
+                            this.closeBtn(); // 생성 모달 닫기
+                        } else {
+                            console.log("추가에 실패했습니다: ", res.data);
+                            alert("추가에 실패했습니다.");
+                        }
+                    })
+                    .catch((err) => {
+                        console.log("classesList - error(추가) : ", err);
+                        alert("추가에 오류가 발생했습니다.");
+                    });
+                });
+            }
+            
+        },
+        // 삭제
+        deleteClass(sclsId) {
+            this.showConfirm('delete', () => {
+                axios({
+                    url: "/classes/deleteClass.json",
+                    method: "post",
+                    headers: {
+                        "Content-Type": "application/json; charset=UTF-8",
+                    },
+                    data: {
+                        sclsId: sclsId
+                    },
+                })
+                .then((res) => {
+                    if (res.data.status === "success") {
+                        console.log("classesList - response(삭제) : ", res.data.data);
+                        this.selectClass();
+                    } else {
+                        console.log("삭제에 실패했습니다: ", res.data);
+                        alert("삭제에 실패했습니다.");
+                    }
+                })
+                .catch((err) => {
+                    console.log("classesList - error(삭제) : ", err);
+                    alert("삭제에 오류가 발생했습니다.");
+                });
+            });
+        },
+        // 수정
+        updateClass() {
+            if(this.createClassName.trim() === ""){
+                alert("반 이름을 입력해주세요");
+            }
+            else{
+                this.showConfirm('edit', () => {
+                    axios({
+                        url: "/classes/updateClass.json",
+                        method: "post",
+                        headers: {
+                            "Content-Type": "application/json; charset=UTF-8",
+                        },
+                        data: {
+                            sclsId: this.current_editId,
+                            sclsNm: this.createClassName
+                        },
+                    })
+                    .then((res) => {
+                        if (res.data.status === "success") {
+                            console.log("classesList - response(수정) : ", res.data.data);
+                            this.selectClass();
+                            this.createClassName = ""; // 반 이름 초기화
+                            this.current_editId = ""; // 반 Id 초기화
+                            this.closeBtn(); // 팝업 닫기
+                        } else {
+                            console.log("수정에 실패했습니다: ", res.data);
+                            alert("수정에 실패했습니다.");
+                        }
+                    })
+                    .catch((err) => {
+                        console.log("classesList - error(수정) : ", err);
+                        alert("수정에 오류가 발생했습니다.");
+                    });
+                });
+            }
+        }
     },
     watch: {
 
@@ -109,6 +253,15 @@
     },
     mounted() {
         console.log('Main2 mounted');
+        this.selectClass();
     }
 }
-</script>
(No newline at end of file)
+</script>
+
+<style>
+.content-t {
+    flex-wrap: wrap; 
+    height: 90%;
+    overflow-y: scroll;
+}
+</style>
(No newline at end of file)
Add a comment
List