From 83aab6fb11d55f47c1ef25611c867006f6af05aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Tue, 11 Jan 2022 15:39:34 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EB=B6=84?= =?UTF-8?q?=EB=A5=98=20=EA=B4=80=EB=A6=AC=20=ED=8E=B8=EC=9D=98=EC=84=B1=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0=20=EC=9E=91=EC=97=85=20=EC=A2=85=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kcgfilemanager/model/BoardCategory.java | 2 + .../repository/BoardCategoryRepository.java | 2 +- .../repository/BoardRepository.java | 4 +- .../service/BoardCategoryService.java | 28 +++++++++--- .../kcgfilemanager/service/BoardService.java | 24 +++------- .../service/FileInfoService.java | 29 ++++++++++++ .../resources/static/js/admin/categoryMgt2.js | 45 +++++++++++-------- .../templates/admin/categoryMgt2.html | 22 +++++++-- 8 files changed, 109 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/dbnt/kcgfilemanager/service/FileInfoService.java diff --git a/src/main/java/com/dbnt/kcgfilemanager/model/BoardCategory.java b/src/main/java/com/dbnt/kcgfilemanager/model/BoardCategory.java index db54a6d..459bf8e 100644 --- a/src/main/java/com/dbnt/kcgfilemanager/model/BoardCategory.java +++ b/src/main/java/com/dbnt/kcgfilemanager/model/BoardCategory.java @@ -28,6 +28,8 @@ public class BoardCategory { private Integer parentSeq; @Column(name = "CATEGORY_NAME", nullable = false) private String categoryName; + @Column(name = "SORT_CNT") + private Integer sortCnt; @Transient private List childCategoryList; @Transient diff --git a/src/main/java/com/dbnt/kcgfilemanager/repository/BoardCategoryRepository.java b/src/main/java/com/dbnt/kcgfilemanager/repository/BoardCategoryRepository.java index 4ed5726..de11d88 100644 --- a/src/main/java/com/dbnt/kcgfilemanager/repository/BoardCategoryRepository.java +++ b/src/main/java/com/dbnt/kcgfilemanager/repository/BoardCategoryRepository.java @@ -7,6 +7,6 @@ import java.util.List; public interface BoardCategoryRepository extends JpaRepository { - List findByParentSeqAndDepth(Integer parentSeq, Integer depth); + List findByParentSeqAndDepthOrderBySortCntDesc(Integer parentSeq, Integer depth); List findByParentSeq(Integer parentSeq); } diff --git a/src/main/java/com/dbnt/kcgfilemanager/repository/BoardRepository.java b/src/main/java/com/dbnt/kcgfilemanager/repository/BoardRepository.java index eee9b7e..8dddd43 100644 --- a/src/main/java/com/dbnt/kcgfilemanager/repository/BoardRepository.java +++ b/src/main/java/com/dbnt/kcgfilemanager/repository/BoardRepository.java @@ -3,6 +3,8 @@ package com.dbnt.kcgfilemanager.repository; import com.dbnt.kcgfilemanager.model.Board; import org.springframework.data.jpa.repository.JpaRepository; -public interface BoardRepository extends JpaRepository { +import java.util.List; +public interface BoardRepository extends JpaRepository { + List findByCategorySeq(int categorySeq); } diff --git a/src/main/java/com/dbnt/kcgfilemanager/service/BoardCategoryService.java b/src/main/java/com/dbnt/kcgfilemanager/service/BoardCategoryService.java index b9ccffb..0db5aff 100644 --- a/src/main/java/com/dbnt/kcgfilemanager/service/BoardCategoryService.java +++ b/src/main/java/com/dbnt/kcgfilemanager/service/BoardCategoryService.java @@ -1,9 +1,11 @@ package com.dbnt.kcgfilemanager.service; +import com.dbnt.kcgfilemanager.model.Board; import com.dbnt.kcgfilemanager.model.BoardCategory; import com.dbnt.kcgfilemanager.model.CategoryRole; import com.dbnt.kcgfilemanager.model.ContentPosition; import com.dbnt.kcgfilemanager.repository.BoardCategoryRepository; +import com.dbnt.kcgfilemanager.repository.BoardRepository; import com.dbnt.kcgfilemanager.repository.CategoryRoleRepository; import com.dbnt.kcgfilemanager.repository.ContentPositionRepository; import lombok.RequiredArgsConstructor; @@ -18,17 +20,20 @@ import java.util.Objects; @RequiredArgsConstructor public class BoardCategoryService { + private final FileInfoService fileInfoService; + + private final BoardRepository boardRepository; private final BoardCategoryRepository boardCategoryRepository; private final CategoryRoleRepository categoryRoleRepository; private final ContentPositionRepository contentPositionRepository; public List selectBoardCategory(Integer parentSeq, Integer depth) { - return boardCategoryRepository.findByParentSeqAndDepth(parentSeq, depth); + return boardCategoryRepository.findByParentSeqAndDepthOrderBySortCntDesc(parentSeq, depth); } public List selectBoardCategoryAll(Integer parentSeq, Integer depth){ - List categoryList = boardCategoryRepository.findByParentSeqAndDepth(parentSeq, depth); + List categoryList = boardCategoryRepository.findByParentSeqAndDepthOrderBySortCntDesc(parentSeq, depth); for(BoardCategory category: categoryList){ category.setChildCategoryList(selectBoardCategoryAll(category.getCategorySeq(), depth+1)); } @@ -96,6 +101,8 @@ public class BoardCategoryService { for(BoardCategory category: categoryList){ switch (category.getStatus()){ case "deleted": + /*게시물 삭제 로직 필요.*/ + deleteContentToCategorySeq(category.getCategorySeq()); boardCategoryRepository.delete(category); break; case "modified": @@ -104,9 +111,12 @@ public class BoardCategoryService { case "added": category.setTempSeq(category.getCategorySeq()); category.setCategorySeq(null); - for(BoardCategory temp : categoryList){ - if(Objects.equals(temp.getTempSeq(), category.getParentSeq())){ - category.setParentSeq(temp.getCategorySeq()); + if(category.getDepth()!=1){ + for(BoardCategory temp : categoryList){ + if(Objects.equals(temp.getTempSeq(), category.getParentSeq())){ + category.setParentSeq(temp.getCategorySeq()); + break; + } } } boardCategoryRepository.saveAndFlush(category); @@ -114,4 +124,12 @@ public class BoardCategoryService { } } } + + private void deleteContentToCategorySeq(Integer categorySeq) { + List deleteContentList = boardRepository.findByCategorySeq(categorySeq); + for(Board deleteContent: deleteContentList){ + fileInfoService.deleteFileInfoAll(deleteContent.getContentSeq()); + boardRepository.delete(deleteContent); + } + } } diff --git a/src/main/java/com/dbnt/kcgfilemanager/service/BoardService.java b/src/main/java/com/dbnt/kcgfilemanager/service/BoardService.java index ed96441..d77ef50 100644 --- a/src/main/java/com/dbnt/kcgfilemanager/service/BoardService.java +++ b/src/main/java/com/dbnt/kcgfilemanager/service/BoardService.java @@ -17,12 +17,13 @@ import java.util.*; @RequiredArgsConstructor public class BoardService { - private final BoardMapper boardMapper; - private final BoardRepository boardRepository; - - private final BoardCategoryRepository boardCategoryRepository; + private final FileInfoService fileInfoService; private final BoardCategoryService boardCategoryService; + private final BoardMapper boardMapper; + + private final BoardRepository boardRepository; + private final BoardCategoryRepository boardCategoryRepository; private final BoardLogRepository boardLogRepository; private final FileInfoRepository fileInfoRepository; private final HashTagRepository hashTagRepository; @@ -221,7 +222,7 @@ public class BoardService { content.setStatus("D"); saveBoardLog(contentSeq, LogStatus.DELETE, null, user.getUserId()); deleteHashTagLink(contentSeq); - deleteFileInfoAll(contentSeq); + fileInfoService.deleteFileInfoAll(contentSeq); return contentSeq; } @@ -254,29 +255,18 @@ public class BoardService { List tagLinkList = hashTagLinkRepository.findByContentSeq(contentSeq); hashTagLinkRepository.deleteAll(tagLinkList); } - private void deleteFileInfoAll(int contentSeq){ - List fileInfoList = fileInfoRepository.findByContentSeqOrderByFileSeqAsc(contentSeq); - for(FileInfo fileInfo: fileInfoList){ - deleteStoredFile(fileInfo.getSavePath(), fileInfo.getConversionName()); - } - fileInfoRepository.deleteAll(fileInfoList); - } private void deleteFileInfo(Integer contentSeq, List fileSeqList, String userId){ List fileInfoList = fileInfoRepository.findByContentSeqOrderByFileSeqAsc(contentSeq); for(FileInfo fileInfo: fileInfoList){ if(fileSeqList.contains(fileInfo.getFileSeq())){ - deleteStoredFile(fileInfo.getSavePath(), fileInfo.getConversionName()); + fileInfoService.deleteStoredFile(fileInfo.getSavePath(), fileInfo.getConversionName()); saveBoardLog(contentSeq, LogStatus.FILE_REMOVE, fileInfo.getFullName(), userId); fileInfoRepository.delete(fileInfo); } } } - private void deleteStoredFile(String savePath, String conversionName){ - File deleteFile = new File(savePath, conversionName); - deleteFile.delete(); - } private String calculationSize(double fileSize){ String[] units = {"bytes", "KB", "MB", "GB", "TB", "PB"}; double unitSelector = Math.floor(Math.log(fileSize)/Math.log(1024)); diff --git a/src/main/java/com/dbnt/kcgfilemanager/service/FileInfoService.java b/src/main/java/com/dbnt/kcgfilemanager/service/FileInfoService.java new file mode 100644 index 0000000..965f665 --- /dev/null +++ b/src/main/java/com/dbnt/kcgfilemanager/service/FileInfoService.java @@ -0,0 +1,29 @@ +package com.dbnt.kcgfilemanager.service; + +import com.dbnt.kcgfilemanager.config.LogStatus; +import com.dbnt.kcgfilemanager.model.FileInfo; +import com.dbnt.kcgfilemanager.repository.FileInfoRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class FileInfoService { + private final FileInfoRepository fileInfoRepository; + + public void deleteFileInfoAll(int contentSeq){ + List fileInfoList = fileInfoRepository.findByContentSeqOrderByFileSeqAsc(contentSeq); + for(FileInfo fileInfo: fileInfoList){ + deleteStoredFile(fileInfo.getSavePath(), fileInfo.getConversionName()); + } + fileInfoRepository.deleteAll(fileInfoList); + } + + public void deleteStoredFile(String savePath, String conversionName){ + File deleteFile = new File(savePath, conversionName); + deleteFile.delete(); + } +} diff --git a/src/main/resources/static/js/admin/categoryMgt2.js b/src/main/resources/static/js/admin/categoryMgt2.js index 75f5f0d..4670785 100644 --- a/src/main/resources/static/js/admin/categoryMgt2.js +++ b/src/main/resources/static/js/admin/categoryMgt2.js @@ -1,5 +1,5 @@ let categoryList = [] -let maxSeq = 0; +let maxSeq = 1; $(function (){ getCategoryList(); }) @@ -9,16 +9,20 @@ $(document).on('click', '.categoryTr', function (){ chooseTr.find(".trCheckBox").prop("checked", true); setCategoryTable(Number(chooseTr.attr("data-depth"))+1, Number(chooseTr.attr("data-categoryseq"))); }) -$(document).on('change', '.categoryName', function (){ +$(document).on('change', '.categoryName, .sortCnt', function (){ const categoryInfo = $(this).parents("tr"); - const changedName = this.value; - if(changedName !== categoryInfo.attr("data-categoryname")){ + const changedValue = this.value; + let sortCntFlag = this.className.includes("sortCnt")&&(changedValue !== categoryInfo.attr("data-sortcnt")); + let categoryNameFlag = this.className.includes("categoryName")&&(changedValue !== categoryInfo.attr("data-categoryname")); + if(sortCntFlag || categoryNameFlag){ categoryList.forEach(function (category){ if(category.categorySeq === Number(categoryInfo.attr("data-categoryseq"))){ - category.categoryName = changedName; - if(category.status !== "added"){ + if(categoryNameFlag) + category.categoryName = changedValue; + if(sortCntFlag) + category.sortCnt = changedValue; + if(category.status !== "added") category.status = "modified"; - } } }) categoryInfo[0].className += "bg-warning bg-opacity-25"; @@ -27,7 +31,9 @@ $(document).on('change', '.categoryName', function (){ $(document).on('click', '.addCategoryBtn', function (){ const depth = Number($(this).attr("data-depth")); const parentCategory = $("#depth"+(depth-1)+"Tbody").find(".trCheckBox:checked").parents("tr"); - if(parentCategory.attr("data-status")==="deleted"){ + if(depth!==1 && parentCategory.length===0){ + alert("상위 분류를 선택해 주세요."); + }else if(parentCategory.attr("data-status")==="deleted"){ alert("삭제될 상위 분류에는 추가할 수 없습니다."); }else{ const parentSeq = parentCategory.attr("data-categoryseq"); @@ -35,6 +41,7 @@ $(document).on('click', '.addCategoryBtn', function (){ categorySeq: maxSeq++, parentSeq: depth===1?null:Number(parentSeq), categoryName: "신규", + sortCnt: 0, depth: depth, status: "added" }) @@ -52,6 +59,7 @@ $(document).on('click', '.copyCategory', function (){ parentSeq: depth===1?null:Number(parentSeq), categoryName: "복사된 분류", depth: depth, + sortCnt: 0, status: "added" }]; copyList = copyList.concat(getCopyData(depth+1, Number(copyInfo.attr("data-categoryseq")), lastSeq)); @@ -64,7 +72,7 @@ $(document).on('click', '.deleteCategory', function (){ const categoryInfo = $(this).parents("tr"); const categorySeq = categoryInfo.attr("data-categoryseq"); if(categoryInfo.attr("data-status") !== "deleted"){ - if(confirm("선택된 분류와 하위 분류를 삭제하시겠습니까?")){ + if(confirm("선택된 분류와 하위 분류를 삭제하시겠습니까?\n등록된 자료가 모두 삭제됩니다.")){ statusChange("deleted", Number(categorySeq)); } }else{ @@ -122,6 +130,7 @@ function getCategoryList(){ categoryName: category.categoryName, originalName: category.categoryName, depth: category.depth, + sortCnt: category.sortCnt, status: "saved", }) if(maxSeq<=category.categorySeq){ @@ -147,10 +156,11 @@ function setCategoryTable(depth, parentSeq){ case "deleted": statusColor = "bg-danger bg-opacity-25"; break; } tbody += ""; + " data-parentseq='"+data.parentSeq+"' data-categoryname='"+data.categoryName+"'" + + " data-depth='"+data.depth+"' data-sortcnt='"+data.sortCnt+"' data-status='"+data.status+"'>"; tbody += "" tbody += "" + tbody += "" tbody += ""; tbody += ""; tbody += ""; @@ -163,15 +173,11 @@ function getCopyData(depth, parentSeq, lastSeq){ let copyList = getTableData(categoryList, depth, parentSeq); let childList = []; copyList.forEach(function (category){ - const tempList = getCopyData(category.depth+1, category.categorySeq) - category.categorySeq = maxSeq++; + const tempSeq = maxSeq++; + const tempList = getCopyData(category.depth+1, category.categorySeq, tempSeq) + category.categorySeq = tempSeq; category.parentSeq = lastSeq; category.status = "added"; - tempList.forEach(function (child){ - child.parentSeq = category.categorySeq; - child.categorySeq = maxSeq++; - child.status = "added"; - }) childList = childList.concat(tempList); }) copyList = copyList.concat(childList); @@ -184,9 +190,10 @@ function getTableData(categoryList, depth, parentSeq){ if(category.depth===depth && category.parentSeq===parentSeq){ targetList.push({ categorySeq: category.categorySeq, - categoryName: category.categoryName, parentSeq: category.parentSeq, + categoryName: category.categoryName, depth: category.depth, + sortCnt: category.sortCnt, status: category.status }) } diff --git a/src/main/resources/templates/admin/categoryMgt2.html b/src/main/resources/templates/admin/categoryMgt2.html index 64759e5..d361d12 100644 --- a/src/main/resources/templates/admin/categoryMgt2.html +++ b/src/main/resources/templates/admin/categoryMgt2.html @@ -2,6 +2,16 @@ + + + @@ -23,7 +33,8 @@ - 대분류 + 대분류 + 순서 @@ -44,7 +55,8 @@ - 연도 + 연도 + 순서 @@ -65,7 +77,8 @@ - 중분류 + 중분류 + 순서 @@ -86,7 +99,8 @@ - 소분류 + 소분류 + 순서