From 0d2f7b92ab5fc620e1120746a9430643d665ccba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Wed, 15 Dec 2021 16:07:35 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EC=9E=91=EC=97=85=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=9E=91=EC=97=85=EC=A4=91.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BoardController.java | 16 +- .../controller/adminController.java | 2 +- .../kcgfilemanager/mapper/BoardMapper.java | 12 ++ .../com/dbnt/kcgfilemanager/model/Board.java | 4 +- .../repository/FileInfoRepository.java | 4 +- .../service/BoardCategoryService.java | 1 - .../kcgfilemanager/service/BoardService.java | 118 ++++++++++---- src/main/resources/application.properties | 4 + .../resources/mybatisMapper/BoardMapper.xml | 37 +++++ .../resources/static/js/board/contentList.js | 0 .../resources/static/js/board/contentWrite.js | 71 ++++++--- .../templates/board/contentList.html | 145 ++++++++++++++++++ .../templates/board/contentWrite.html | 10 +- .../templates/fragments/leftMenu.html | 2 +- 14 files changed, 365 insertions(+), 61 deletions(-) create mode 100644 src/main/java/com/dbnt/kcgfilemanager/mapper/BoardMapper.java create mode 100644 src/main/resources/mybatisMapper/BoardMapper.xml create mode 100644 src/main/resources/static/js/board/contentList.js create mode 100644 src/main/resources/templates/board/contentList.html diff --git a/src/main/java/com/dbnt/kcgfilemanager/controller/BoardController.java b/src/main/java/com/dbnt/kcgfilemanager/controller/BoardController.java index d8e07a0..c9136bd 100644 --- a/src/main/java/com/dbnt/kcgfilemanager/controller/BoardController.java +++ b/src/main/java/com/dbnt/kcgfilemanager/controller/BoardController.java @@ -3,17 +3,13 @@ package com.dbnt.kcgfilemanager.controller; import com.dbnt.kcgfilemanager.model.Board; import com.dbnt.kcgfilemanager.model.UserInfo; import com.dbnt.kcgfilemanager.service.BoardService; -import com.dbnt.kcgfilemanager.service.UserInfoService; import lombok.RequiredArgsConstructor; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; import java.security.Principal; -import java.time.LocalDateTime; -import java.util.List; @RestController @RequiredArgsConstructor @@ -36,4 +32,16 @@ public class BoardController { content.setFileList(request.getMultiFileMap().get("uploadFiles")); return boardService.saveContent(content); } + + @GetMapping("/contentList") + public ModelAndView contentList(Board board){ + ModelAndView mav = new ModelAndView("board/contentList"); + mav.addObject("pageTitle", boardService.getPageTitle(board.getCategorySeq())); + board.setQueryInfo(); + mav.addObject("contentList", boardService.selectContentList(board)); + board.setContentCnt(boardService.selectContentListCnt(board)); + board.setPaginationInfo(); + mav.addObject("searchParams", board); + return mav; + } } diff --git a/src/main/java/com/dbnt/kcgfilemanager/controller/adminController.java b/src/main/java/com/dbnt/kcgfilemanager/controller/adminController.java index 82e4e7d..7c8ecce 100644 --- a/src/main/java/com/dbnt/kcgfilemanager/controller/adminController.java +++ b/src/main/java/com/dbnt/kcgfilemanager/controller/adminController.java @@ -60,8 +60,8 @@ public class adminController { } @GetMapping("/userMgt") public ModelAndView userMgt(UserInfo userInfo) { - userInfo.setQueryInfo(); ModelAndView mav = new ModelAndView("admin/userMgt"); + userInfo.setQueryInfo(); mav.addObject("userInfoList", userInfoService.selectUserInfoList(userInfo)); userInfo.setContentCnt(userInfoService.selectUserInfoListCnt(userInfo)); userInfo.setPaginationInfo(); diff --git a/src/main/java/com/dbnt/kcgfilemanager/mapper/BoardMapper.java b/src/main/java/com/dbnt/kcgfilemanager/mapper/BoardMapper.java new file mode 100644 index 0000000..014e8ce --- /dev/null +++ b/src/main/java/com/dbnt/kcgfilemanager/mapper/BoardMapper.java @@ -0,0 +1,12 @@ +package com.dbnt.kcgfilemanager.mapper; + +import com.dbnt.kcgfilemanager.model.Board; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface BoardMapper { + List selectContentList(Board board); + Integer selectContentListCnt(Board board); +} diff --git a/src/main/java/com/dbnt/kcgfilemanager/model/Board.java b/src/main/java/com/dbnt/kcgfilemanager/model/Board.java index 4f1e25e..152c111 100644 --- a/src/main/java/com/dbnt/kcgfilemanager/model/Board.java +++ b/src/main/java/com/dbnt/kcgfilemanager/model/Board.java @@ -38,9 +38,9 @@ public class Board extends BaseModel{ private LocalDateTime createDate; @Transient - private List childFiles; + private String createName; @Transient - private List hashTags; + private Integer fileCnt; @Transient private String hashTagStr; diff --git a/src/main/java/com/dbnt/kcgfilemanager/repository/FileInfoRepository.java b/src/main/java/com/dbnt/kcgfilemanager/repository/FileInfoRepository.java index ae670cb..f1fbf4b 100644 --- a/src/main/java/com/dbnt/kcgfilemanager/repository/FileInfoRepository.java +++ b/src/main/java/com/dbnt/kcgfilemanager/repository/FileInfoRepository.java @@ -3,6 +3,8 @@ package com.dbnt.kcgfilemanager.repository; import com.dbnt.kcgfilemanager.model.FileInfo; import org.springframework.data.jpa.repository.JpaRepository; -public interface FileInfoRepository extends JpaRepository { +import java.util.Optional; +public interface FileInfoRepository extends JpaRepository { + Optional findTopByContentSeqOrderByFileSeqDesc(Integer contentSeq); } diff --git a/src/main/java/com/dbnt/kcgfilemanager/service/BoardCategoryService.java b/src/main/java/com/dbnt/kcgfilemanager/service/BoardCategoryService.java index 50eac7b..2f0f9a8 100644 --- a/src/main/java/com/dbnt/kcgfilemanager/service/BoardCategoryService.java +++ b/src/main/java/com/dbnt/kcgfilemanager/service/BoardCategoryService.java @@ -29,7 +29,6 @@ public class BoardCategoryService { } return categoryList; } - @Transactional public void insertBoardCategory(List categoryList){ boardCategoryRepository.saveAll(categoryList); diff --git a/src/main/java/com/dbnt/kcgfilemanager/service/BoardService.java b/src/main/java/com/dbnt/kcgfilemanager/service/BoardService.java index be503d4..6afdf80 100644 --- a/src/main/java/com/dbnt/kcgfilemanager/service/BoardService.java +++ b/src/main/java/com/dbnt/kcgfilemanager/service/BoardService.java @@ -1,39 +1,41 @@ package com.dbnt.kcgfilemanager.service; -import com.dbnt.kcgfilemanager.model.Board; -import com.dbnt.kcgfilemanager.model.BoardLog; -import com.dbnt.kcgfilemanager.model.HashTag; -import com.dbnt.kcgfilemanager.model.HashTagLink; -import com.dbnt.kcgfilemanager.repository.BoardLogRepository; -import com.dbnt.kcgfilemanager.repository.BoardRepository; -import com.dbnt.kcgfilemanager.repository.HashTagLinkRepository; -import com.dbnt.kcgfilemanager.repository.HashTagRepository; +import com.dbnt.kcgfilemanager.mapper.BoardMapper; +import com.dbnt.kcgfilemanager.model.*; +import com.dbnt.kcgfilemanager.repository.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import java.io.File; +import java.io.IOException; import java.util.List; +import java.util.Objects; +import java.util.UUID; @Service @RequiredArgsConstructor public class BoardService { - private BoardRepository boardRepository; - private BoardLogRepository boardLogRepository; - private HashTagRepository hashTagRepository; - private HashTagLinkRepository hashTagLinkRepository; + private final BoardRepository boardRepository; + private final BoardLogRepository boardLogRepository; + private final HashTagRepository hashTagRepository; + private final HashTagLinkRepository hashTagLinkRepository; + private final FileInfoRepository fileInfoRepository; + private final BoardCategoryRepository boardCategoryRepository; + private final BoardMapper boardMapper; @Transactional public Integer saveContent(Board content){ - boardRepository.save(content); - saveBoardLog(content.getContentSeq(), "I", null, content.getCreateId()); - saveHashTagLink(content.getContentSeq(), content.getHashTagStr()); - saveUploadFiles(content.getContentSeq(), content.getFileList()); - return content.getContentSeq(); + Integer contentSeq = boardRepository.save(content).getContentSeq(); + saveBoardLog(contentSeq, "I", null, content.getCreateId()); + saveHashTagLink(contentSeq, content.getHashTagStr()); + saveUploadFiles(contentSeq, content.getCategorySeq(), content.getFileList()); + return contentSeq; } - public void saveBoardLog(Integer contentSeq, String status, String description, String createId){ + private void saveBoardLog(Integer contentSeq, String status, String description, String createId){ BoardLog lastLog = boardLogRepository.findTopByContentSeqOrderByLogSeqDesc(contentSeq).orElse(null); BoardLog log = new BoardLog(); log.setContentSeq(contentSeq); @@ -43,26 +45,86 @@ public class BoardService { log.setCreateId(createId); boardLogRepository.save(log); } - public HashTag saveHashTag(String tagName){ + + private HashTag saveHashTag(String tagName){ HashTag tag = new HashTag(); tag.setTagName(tagName); return hashTagRepository.save(tag); } - public void saveHashTagLink(Integer contentSeq, String hashTagStr){ + + private void saveHashTagLink(Integer contentSeq, String hashTagStr){ String[] hashTagAry = hashTagStr.trim().replaceAll(",", "").split("#"); for(String tagName : hashTagAry){ - HashTag tag = hashTagRepository.findByTagName(tagName).orElse(null); - if(tag==null){ - tag = saveHashTag(tagName); + if(!tagName.equals("")){ + HashTag tag = hashTagRepository.findByTagName(tagName).orElse(null); + if(tag==null){ + tag = saveHashTag(tagName); + } + HashTagLink link = new HashTagLink(); + link.setContentSeq(contentSeq); + link.setTagSeq(tag.getTagSeq()); + hashTagLinkRepository.save(link); } - HashTagLink link = new HashTagLink(); - link.setContentSeq(contentSeq); - link.setTagSeq(tag.getTagSeq()); - hashTagLinkRepository.save(link); } } - public void saveUploadFiles(Integer contentSeq, List files){ + private void saveUploadFiles(Integer contentSeq, Integer categorySeq, List files){ + FileInfo lastFileInfo = fileInfoRepository.findTopByContentSeqOrderByFileSeqDesc(contentSeq).orElse(null); + int fileSeq = lastFileInfo==null?1:(lastFileInfo.getFileSeq()+1); + for(MultipartFile file : files){ + System.out.println(file.getName()); + String saveName = UUID.randomUUID().toString(); + String path = makeFilePath(categorySeq); + File saveFile = new File(path+"\\"+saveName); + if(file.getSize()!=0){ // 저장될 파일 확인 + if(!saveFile.exists()){ // 저장될 경로 확인 + if(saveFile.getParentFile().mkdirs()){ + try{ + saveFile.createNewFile(); + }catch (IOException e){ + e.printStackTrace(); + } + } + } + try { + file.transferTo(saveFile); + }catch (IllegalStateException | IOException e){ + e.printStackTrace(); + } + } + + String[] originalFilename = Objects.requireNonNull(file.getOriginalFilename()).split("\\."); + FileInfo fileInfo = new FileInfo(); + fileInfo.setContentSeq(contentSeq); + fileInfo.setFileSeq(fileSeq++); + fileInfo.setOriginalName(originalFilename[0]); + fileInfo.setExtention(originalFilename[1]); + fileInfo.setConversionName(saveName); + fileInfo.setSavePath(path); + fileInfoRepository.save(fileInfo); + } } + public String getPageTitle(Integer categorySeq) { + BoardCategory category = boardCategoryRepository.findById(categorySeq).orElse(null); + if(category.getParentSeq()==null){ + return category.getCategoryName(); + } + return getPageTitle(category.getParentSeq())+" > "+category.getCategoryName(); + } + + public String makeFilePath(Integer categorySeq){ + BoardCategory category = boardCategoryRepository.findById(categorySeq).orElse(null); + if(category.getParentSeq()==null){ + return "D:\\kcgFileManager\\"+category.getCategoryName(); + } + return makeFilePath(category.getParentSeq())+"\\"+category.getCategoryName(); + } + + public List selectContentList(Board board) { + return boardMapper.selectContentList(board); + } + public Integer selectContentListCnt(Board board) { + return boardMapper.selectContentListCnt(board); + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c9b4900..0042edd 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,5 +1,9 @@ spring.devtools.livereload.enabled=true +#?? ??? ?? ??. +spring.servlet.multipart.max-file-size=20MB +spring.servlet.multipart.max-request-size=100MB + #thymeleaf spring.thymeleaf.prefix=classpath:templates/ spring.thymeleaf.check-template-location=true diff --git a/src/main/resources/mybatisMapper/BoardMapper.xml b/src/main/resources/mybatisMapper/BoardMapper.xml new file mode 100644 index 0000000..d4d94ce --- /dev/null +++ b/src/main/resources/mybatisMapper/BoardMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/js/board/contentList.js b/src/main/resources/static/js/board/contentList.js new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/js/board/contentWrite.js b/src/main/resources/static/js/board/contentWrite.js index d16eda4..a849bbb 100644 --- a/src/main/resources/static/js/board/contentWrite.js +++ b/src/main/resources/static/js/board/contentWrite.js @@ -49,24 +49,31 @@ $(document).on('click', '.fileDelete', function (){ } }) $(document).on('click', '#saveBtn', function (){ - const formData = new FormData($("#contentForm")[0]); - for(const file of files) { - if(!file.isDelete) - formData.append('uploadFiles', file, file.name); - } - $.ajax({ - type : 'POST', - data : formData, - url : "/board/saveContent", - processData: false, - contentType: false, - success : function(data) { - $("#contentSeq").val(data); - }, - error : function(xhr, status) { + if(contentCheck()){ + if(confirm("저장하시겠습니까?")){ + const formData = new FormData($("#contentForm")[0]); + for(const file of files) { + if(!file.isDelete) + formData.append('uploadFiles', file, file.name); + } + $.ajax({ + type : 'POST', + data : formData, + url : "/board/saveContent", + processData: false, + contentType: false, + success : function(result) { + if(result>0){ + alert("저장되었습니다."); + location.href = "/board/contentList?categorySeq="+$("#categorySeq").val(); + } + }, + error : function(xhr, status) { + } + }) } - }) + } }) $(document).on('change', '.categorySelector', function (){ @@ -117,13 +124,41 @@ function setFileDiv(file, idx){ uploadDiv.append(fileInfo); } +function contentCheck(){ + let flag = true; + if(!$("#categorySeq").val()){ + alert("분류 선택이 되지 않았습니다.") + flag = false; + } + if(!$("#title").val()){ + alert("제목을 입력해주세요.") + flag = false; + } + if($(".fileDelete ").length===0){ + alert("업로드 할 파일이 없습니다.") + flag = false; + } + let totalSize = 0; + for(const file of files) { + if(!file.isDelete){ + totalSize+=file.size; + if(file.size>20971520){ + alert("파일당 사이즈는 20MB을 넘길 수 없습니다.") + } + } + } + if(totalSize>104857600){ + alert("첨부파일의 용량 합은 100MB를 넘길 수 없습니다.") + } + return flag; +} + function byteCalculation(size) { const bytes = parseInt(size); const s = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB']; const e = Math.floor(Math.log(bytes)/Math.log(1024)); if(e === "-Infinity") return "0 "+s[0]; - else - return (bytes/Math.pow(1024, Math.floor(e))).toFixed(2)+" "+s[e]; + else return (bytes/Math.pow(1024, Math.floor(e))).toFixed(2)+" "+s[e]; } \ No newline at end of file diff --git a/src/main/resources/templates/board/contentList.html b/src/main/resources/templates/board/contentList.html new file mode 100644 index 0000000..0d78771 --- /dev/null +++ b/src/main/resources/templates/board/contentList.html @@ -0,0 +1,145 @@ + + + + + +
+
+

+
+
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
제목파일 수작성자작성일
+ +
+
+
+
+ +
+
+
+
+ +
+
+

왼쪽 목록에서 선택해주세요.

+
+
+
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/src/main/resources/templates/board/contentWrite.html b/src/main/resources/templates/board/contentWrite.html index f1a10d7..30076c9 100644 --- a/src/main/resources/templates/board/contentWrite.html +++ b/src/main/resources/templates/board/contentWrite.html @@ -30,7 +30,7 @@
- + @@ -48,7 +48,7 @@
- + diff --git a/src/main/resources/templates/fragments/leftMenu.html b/src/main/resources/templates/fragments/leftMenu.html index fba1dc8..981bd00 100644 --- a/src/main/resources/templates/fragments/leftMenu.html +++ b/src/main/resources/templates/fragments/leftMenu.html @@ -50,7 +50,7 @@
    -
  • +
  • 등록된 소분류가 없습니다.