diff --git a/src/main/java/nlib/bbs/service/AttachFileService.java b/src/main/java/nlib/bbs/service/AttachFileService.java index bd8ddd33..0a94d514 100644 --- a/src/main/java/nlib/bbs/service/AttachFileService.java +++ b/src/main/java/nlib/bbs/service/AttachFileService.java @@ -69,7 +69,7 @@ public interface AttachFileService * @return * @throws Exception */ - public int deleteAttachFileGroup(AttachFileVO attachFileVO) throws Exception; + public int deleteAttachFileGroup(String attachFileId) throws Exception; /** * 첨부파일 삭제한다. diff --git a/src/main/java/nlib/bbs/service/QnaService.java b/src/main/java/nlib/bbs/service/QnaService.java index b006d5b7..f50c42dd 100644 --- a/src/main/java/nlib/bbs/service/QnaService.java +++ b/src/main/java/nlib/bbs/service/QnaService.java @@ -8,6 +8,7 @@ import java.util.Map; import nlib.restful.service.DataApiReqVO; import nlib.restful.service.DataApiResVO; import nlib.user.service.NlibLoginVO; +import nlib.util.StringUtil; public interface QnaService extends BoardService { @@ -45,5 +46,24 @@ public interface QnaService extends BoardService */ public int deleteArticle(ArticleVO articleVO) throws Exception; + + /** + * 해당 QNA 글을 변경할 수 있는지 여부를 확인한다. + * + * @param articleVO + * @return + * @throws Exception + */ + public String canModify(ArticleVO articleVO) throws Exception; + + /** + * 해당 QNA 글을 읽을 수 있는지 여부를 확인한다. + * + * @param articleVO + * @return + * @throws Exception + */ + public String canRead(ArticleVO articleVO) throws Exception; + } diff --git a/src/main/java/nlib/bbs/service/impl/AttachFileDAO.java b/src/main/java/nlib/bbs/service/impl/AttachFileDAO.java index 0c1d77b5..f9767e82 100644 --- a/src/main/java/nlib/bbs/service/impl/AttachFileDAO.java +++ b/src/main/java/nlib/bbs/service/impl/AttachFileDAO.java @@ -76,7 +76,16 @@ public interface AttachFileDAO { * @return * @throws Exception */ - public int deleteAttachFileGroup(AttachFileVO attachFileVO) throws Exception; + public int deleteAttachFileGroup(String attachFileId) throws Exception; + + /** + * 첨부파일그룹에 속한 모든 파일을 삭제한다. + * + * @param attachFileVO + * @return + * @throws Exception + */ + public int deleteAllFilesOfAttachFileGroup(String attachFileId) throws Exception; /** * 첨부파일 삭제한다. diff --git a/src/main/java/nlib/bbs/service/impl/AttachFileServiceImpl.java b/src/main/java/nlib/bbs/service/impl/AttachFileServiceImpl.java index e6482807..388d9d17 100644 --- a/src/main/java/nlib/bbs/service/impl/AttachFileServiceImpl.java +++ b/src/main/java/nlib/bbs/service/impl/AttachFileServiceImpl.java @@ -8,8 +8,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import nlib.bbs.service.ArticleVO; import nlib.bbs.service.AttachFileService; import nlib.bbs.service.AttachFileVO; +import nlib.bbs.service.QnaService; import nlib.util.StringUtil; /** @@ -42,6 +44,9 @@ public class AttachFileServiceImpl implements AttachFileService @Resource(name="attachFileDAO") AttachFileDAO attachFileDAO; + @Resource(name = "qnaService") + private QnaService qnaService; + /** * 첨부파일 목록을 조회한다. * @@ -86,8 +91,10 @@ public class AttachFileServiceImpl implements AttachFileService * @throws Exception */ @Override - public int deleteAttachFileGroup(AttachFileVO attachFileVO) throws Exception { - return attachFileDAO.deleteAttachFileGroup(attachFileVO); + public int deleteAttachFileGroup(String attachFileId) throws Exception { + int ret = attachFileDAO.deleteAttachFileGroup(attachFileId); + attachFileDAO.deleteAllFilesOfAttachFileGroup(attachFileId); + return ret; } /** @@ -120,7 +127,6 @@ public class AttachFileServiceImpl implements AttachFileService return attachFileDAO.selectAttachFile(attachFileVO); } - /** * 다운로드 가능 여부를 확인하다. * @@ -129,10 +135,13 @@ public class AttachFileServiceImpl implements AttachFileService * @throws Exception */ public boolean checkAttachFileDownload(AttachFileVO attachFileVO) throws Exception { - String ret = attachFileDAO.checkAttachFileDownload(attachFileVO); - if(StringUtil.isEmpty(ret)) return false; + String bdType = attachFileVO.getBdType(); + if(StringUtil.isEmpty(bdType)) return false; - return ret.charAt(0) == 'Y'; + String ret = "Y"; + ret = attachFileDAO.checkAttachFileDownload(attachFileVO); + + return StringUtil.isEmpty(ret) ? false : (ret.charAt(0) == 'Y'); } } \ No newline at end of file diff --git a/src/main/java/nlib/bbs/service/impl/QnaServiceImpl.java b/src/main/java/nlib/bbs/service/impl/QnaServiceImpl.java index 445af779..d48614dd 100644 --- a/src/main/java/nlib/bbs/service/impl/QnaServiceImpl.java +++ b/src/main/java/nlib/bbs/service/impl/QnaServiceImpl.java @@ -159,8 +159,55 @@ public class QnaServiceImpl extends BoardServiceImpl implements QnaService * @param reqVO * @return */ - public int deleteArticle(ArticleVO articleVO) { - return qnaDAO.deleteArticle(articleVO); + public int deleteArticle(ArticleVO articleVO) throws Exception { + int ret = qnaDAO.deleteArticle(articleVO); + attachFileService.deleteAttachFileGroup(articleVO.getBdAttachFileId()); + return ret; } + /** + * 해당 QNA 글을 변경할 수 있는지 여부를 확인한다. + * + * @param articleVO + * @return + * @throws Exception + */ + public String canModify(ArticleVO articleVO) throws Exception { + + if(StringUtil.isEmpty(articleVO.getLoginedMbInfoId())) { + return "로그인 후, 이용하실 수 있습니다."; + } + + ArticleVO savedArticleVO = selectArticle(articleVO); + + if(!"Y".equals(savedArticleVO.getMyQnaYn())) { + return "본인의 글만 변경할 수 있습니다."; + } + + if("Y".equals(savedArticleVO.getAnswerYn())) { + return "이미 답변완료된 글은 변경할 수 없습니다."; + } + + return null; + } + + /** + * 해당 QNA 글을 읽을 수 있는지 여부를 확인한다. + * + * @param articleVO + * @return + * @throws Exception + */ + public String canRead(ArticleVO articleVO) throws Exception { + + ArticleVO savedArticleVO = selectArticle(articleVO); + + if("Y".equals(savedArticleVO.getMyQnaYn())) return null; + + if("Y".equals(savedArticleVO.getSecretYn())) { + return "다른 사용자의 비밀글은 조회할 수 없습니다."; + } + + return null; + } } \ No newline at end of file diff --git a/src/main/java/nlib/bbs/web/QnaController.java b/src/main/java/nlib/bbs/web/QnaController.java index 093017b7..12890648 100644 --- a/src/main/java/nlib/bbs/web/QnaController.java +++ b/src/main/java/nlib/bbs/web/QnaController.java @@ -146,8 +146,16 @@ public class QnaController extends NlibCommonController { // 읽음처리 및 상세내용 조회 searchArticleVO.setLoginedMbInfoId(getMbInfoId(request)); - ArticleVO articleVO = qnaService.selectArticle(searchArticleVO); - + ArticleVO articleVO = null; + + String canRead = qnaService.canRead(searchArticleVO); + if(canRead != null) { + model.addAttribute("message", canRead); + articleVO = searchArticleVO; + } else { + articleVO = qnaService.selectArticle(searchArticleVO); + } + model.addAttribute("searchArticle", searchArticleVO); model.addAttribute("article", articleVO); @@ -228,7 +236,7 @@ public class QnaController extends NlibCommonController { //--------------------------- // 기본 정보 설정 //--------------------------- - articleVO.setRegDd(loginVO.getMbInfoId()); + articleVO.setRegId(loginVO.getMbInfoId()); articleVO.setMngOrgCd(getCurCouncilCd(request)); // 문화원코드 articleVO.setBdType(BD_TYPE_QNA); articleVO.setAnswerYn("N"); @@ -333,7 +341,7 @@ public class QnaController extends NlibCommonController { HttpServletRequest request , ArticleVO articleVO , String fileList - , String removedfile + , String delFileList , RedirectAttributes redirectAttrs , ModelMap model) throws Exception { @@ -341,13 +349,15 @@ public class QnaController extends NlibCommonController { // 권한 및 변경 가능 상태 체크 articleVO.setLoginedMbInfoId(getMbInfoId(request)); - String message = canModify(articleVO); + String message = qnaService.canModify(articleVO); if(message != null) { redirectAttrs.addFlashAttribute("searchArticle", articleVO); redirectAttrs.addFlashAttribute("message", message); - return "redirect:/bbs/insertQnaForm.do"; + return "redirect:/bbs/listQnas.do"; } + articleVO.setModId(nlibLoginVO.getMbInfoId()); + //--------------------------- // 첨부파일 정보 설정 @@ -388,7 +398,7 @@ public class QnaController extends NlibCommonController { } if(StringUtil.isNotEmpty(attachFileId)) { - articleVO.setBdAttachFileId(attachFileId); + if(StringUtil.isNotEmpty(articleVO.getBdAttachFileId())) articleVO.setBdAttachFileId(attachFileId); String fileSStreCours = NlibProperty.getProperty("fileupload.base.path") + NlibProperty.getProperty("fileupload.bbs.qna.subpath") + "/"; List attachFiles = new ArrayList(); @@ -417,9 +427,9 @@ public class QnaController extends NlibCommonController { } // 첨부파일 삭제 - if(StringUtil.isNotEmpty(removedfile)) { + if(StringUtil.isNotEmpty(delFileList)) { - String removedFileListJsonStr = removedfile; + String removedFileListJsonStr = delFileList; if(removedFileListJsonStr.startsWith("&")) removedFileListJsonStr = StringEscapeUtils.unescapeHtml(removedFileListJsonStr); if(removedFileListJsonStr.startsWith("\"")) removedFileListJsonStr = removedFileListJsonStr.substring(1); if(removedFileListJsonStr.endsWith("\"")) removedFileListJsonStr = removedFileListJsonStr.substring(0, removedFileListJsonStr.length()-1); @@ -452,10 +462,10 @@ public class QnaController extends NlibCommonController { log.error("첨부파일 아이디(attachFileId) 값은 필수 항목입니다. 첨부파일 삭제에 실패하였습니다. 그러나, 게시물 등록은 계속 진행됩니다."); } - if(StringUtil.isNotEmpty(attachFileId)) { - articleVO.setBdAttachFileId(attachFileId); + if(StringUtil.isNotEmpty(attachFileId) && attachFileId.equals(articleVO.getBdAttachFileId())) { + //articleVO.setBdAttachFileId(attachFileId); - String fileSStreCours = NlibProperty.getProperty("fileupload.base.path") + NlibProperty.getProperty("fileupload.bbs.qna.subpath") + "/"; + //String fileSStreCours = NlibProperty.getProperty("fileupload.base.path") + NlibProperty.getProperty("fileupload.bbs.qna.subpath") + "/"; List removedAttachFiles = new ArrayList(); for(int i=0; i 0 THEN 'Y' ELSE 'N' END AS ATTACH_YN , DATE_FORMAT(A.REG_DD, '%Y-%m-%d') AS REG_DD , A2.RNO , IF(IFNULL(C.USER_NM,'') = '', '관리자', C.USER_NM) AS REG_NM @@ -77,7 +77,7 @@ , A.POST_START_DATE , A.POST_END_DATE , A.VIEW_CNT - , CASE WHEN A.BD_ATTACH_FILE_ID IS NULL OR A.BD_ATTACH_FILE_ID = '' THEN 'N' ELSE 'Y' END AS ATTACH_YN + , CASE WHEN IFNULL((SELECT COUNT(1) FROM BD_FILE F1 LEFT OUTER JOIN BD_FILEDETAIL F2 ON F1.ATTACH_FILE_ID = F2.ATTACH_FILE_ID WHERE F1.ATTACH_FILE_ID = A.BD_ATTACH_FILE_ID AND F1.USE_AT = 'Y' AND F2.USE_AT = 'Y'),0) > 0 THEN 'Y' ELSE 'N' END AS ATTACH_YN , A.BD_ATTACH_FILE_ID , DATE_FORMAT(A.REG_DD, '%Y-%m-%d') AS REG_DD , IF(IFNULL(C.USER_NM,'') = '', '관리자', C.USER_NM) AS REG_NM diff --git a/src/main/resources/egovframework/mapper/nlib/bbs/AttachFileDAO_SQL.xml b/src/main/resources/egovframework/mapper/nlib/bbs/AttachFileDAO_SQL.xml index e793c5d8..e4f1513f 100644 --- a/src/main/resources/egovframework/mapper/nlib/bbs/AttachFileDAO_SQL.xml +++ b/src/main/resources/egovframework/mapper/nlib/bbs/AttachFileDAO_SQL.xml @@ -43,14 +43,14 @@ SELECT 'Y' AS checkResult FROM BD_NLIB_QNA - WHERE BD_TYPE = 'QNA' + WHERE UPPER(BD_TYPE) = 'QNA' AND BD_ATTACH_FILE_ID = #{attachFileId} - AND (SECRET_YN = 'N' OR REG_ID = #{mbInfoId}) + AND (IFNULL(SECRET_YN,'N') = 'N' OR REG_ID = #{mbInfoId}) AND IFNULL(USE_YN,'Y') = 'Y' FROM BD_NLIB_QNA - WHERE BD_TYPE = UPPER('FAQ') + WHERE UPPER(BD_TYPE) = 'FAQ' AND BD_ATTACH_FILE_ID = #{attachFileId} AND IFNULL(USE_YN,'Y') = 'Y' @@ -61,6 +61,7 @@ AND IFNULL(DELETE_YN, 'N') = 'N' AND DATE_FORMAT(NOW(), '%Y%m%d') BETWEEN IFNULL(POST_START_DATE,'00010101') AND IFNULL(POST_END_DATE, '99991231') + LIMIT 1 @@ -74,7 +75,7 @@ , 'Y' ) ON DUPLICATE KEY - UPDATE REG_DD = REG_DD; + UPDATE USE_AT = 'Y'; @@ -106,9 +107,16 @@ ) - + UPDATE BD_FILE SET USE_AT = 'N' WHERE ATTACH_FILE_ID = #{attachFileId} + AND IFNULL(USE_AT, 'Y') = 'Y' + + + + UPDATE BD_FILEDETAIL SET USE_AT = 'N' + WHERE ATTACH_FILE_ID = #{attachFileId} + AND IFNULL(USE_AT, 'Y') = 'Y' diff --git a/src/main/resources/egovframework/mapper/nlib/bbs/FaqDAO_SQL.xml b/src/main/resources/egovframework/mapper/nlib/bbs/FaqDAO_SQL.xml index 745e01c9..0bdd7175 100644 --- a/src/main/resources/egovframework/mapper/nlib/bbs/FaqDAO_SQL.xml +++ b/src/main/resources/egovframework/mapper/nlib/bbs/FaqDAO_SQL.xml @@ -39,7 +39,7 @@ , IFNULL(A.ANSWER_YN, 'N') AS ANSWER_YN , IFNULL(A.USE_YN,'Y') AS USE_YN , A.VIEW_CNT - , CASE WHEN A.BD_ATTACH_FILE_ID IS NULL OR A.BD_ATTACH_FILE_ID = '' THEN 'N' ELSE 'Y' END AS ATTACH_YN + , CASE WHEN IFNULL((SELECT COUNT(1) FROM BD_FILE F1 LEFT OUTER JOIN BD_FILEDETAIL F2 ON F1.ATTACH_FILE_ID = F2.ATTACH_FILE_ID WHERE F1.ATTACH_FILE_ID = A.BD_ATTACH_FILE_ID AND F1.USE_AT = 'Y' AND F2.USE_AT = 'Y'),0) > 0 THEN 'Y' ELSE 'N' END AS ATTACH_YN , DATE_FORMAT(A.REG_DD, '%Y-%m-%d') AS REG_DD , A2.RNO , C.USER_NM AS REG_NM @@ -86,7 +86,7 @@ , IFNULL(A.USE_YN, 'Y') AS USE_YN , A.VIEW_CNT , A.BD_ATTACH_FILE_ID - , CASE WHEN A.BD_ATTACH_FILE_ID IS NULL OR A.BD_ATTACH_FILE_ID = '' THEN 'N' ELSE 'Y' END AS ATTACH_YN + , CASE WHEN IFNULL((SELECT COUNT(1) FROM BD_FILE F1 LEFT OUTER JOIN BD_FILEDETAIL F2 ON F1.ATTACH_FILE_ID = F2.ATTACH_FILE_ID WHERE F1.ATTACH_FILE_ID = A.BD_ATTACH_FILE_ID AND F1.USE_AT = 'Y' AND F2.USE_AT = 'Y'),0) > 0 THEN 'Y' ELSE 'N' END AS ATTACH_YN , DATE_FORMAT(A.REG_DD, '%Y-%m-%d') AS REG_DD , C.USER_NM AS REG_NM FROM BD_NLIB_QNA A diff --git a/src/main/resources/egovframework/mapper/nlib/bbs/QnaDAO_SQL.xml b/src/main/resources/egovframework/mapper/nlib/bbs/QnaDAO_SQL.xml index 79df2a89..2a01a66b 100644 --- a/src/main/resources/egovframework/mapper/nlib/bbs/QnaDAO_SQL.xml +++ b/src/main/resources/egovframework/mapper/nlib/bbs/QnaDAO_SQL.xml @@ -38,7 +38,7 @@ , IFNULL(A.SECRET_YN, 'N') AS SECRET_YN , IFNULL(A.EMAIL_RECV_YN, 'N') AS EMAIL_RECV_YN , A.VIEW_CNT - , CASE WHEN A.BD_ATTACH_FILE_ID IS NULL OR A.BD_ATTACH_FILE_ID = '' THEN 'N' ELSE 'Y' END AS ATTACH_YN + , CASE WHEN IFNULL((SELECT COUNT(1) FROM BD_FILE F1 LEFT OUTER JOIN BD_FILEDETAIL F2 ON F1.ATTACH_FILE_ID = F2.ATTACH_FILE_ID WHERE F1.ATTACH_FILE_ID = A.BD_ATTACH_FILE_ID AND F1.USE_AT = 'Y' AND F2.USE_AT = 'Y'),0) > 0 THEN 'Y' ELSE 'N' END AS ATTACH_YN , DATE_FORMAT(A.REG_DD, '%Y-%m-%d') AS REG_DD , A2.RNO , C.USER_NM AS REG_NM @@ -94,7 +94,7 @@ , IFNULL(A.SECRET_YN, 'N') AS SECRET_YN , A.VIEW_CNT , A.BD_ATTACH_FILE_ID - , CASE WHEN A.BD_ATTACH_FILE_ID IS NULL OR A.BD_ATTACH_FILE_ID = '' THEN 'N' ELSE 'Y' END AS ATTACH_YN + , CASE WHEN IFNULL((SELECT COUNT(1) FROM BD_FILE F1 LEFT OUTER JOIN BD_FILEDETAIL F2 ON F1.ATTACH_FILE_ID = F2.ATTACH_FILE_ID WHERE F1.ATTACH_FILE_ID = A.BD_ATTACH_FILE_ID AND F1.USE_AT = 'Y' AND F2.USE_AT = 'Y'),0) > 0 THEN 'Y' ELSE 'N' END AS ATTACH_YN , DATE_FORMAT(A.REG_DD, '%Y-%m-%d') AS REG_DD , DATE_FORMAT(A.MOD_DD, '%Y-%m-%d') AS MOD_DD , C.USER_NM AS REG_NM @@ -182,6 +182,7 @@ , MOD_DD = NOW() WHERE QNA_ID = #{articleId} AND BD_TYPE = 'QNA' + AND REG_ID = #{modId} /* 본인글만 삭제 */ AND IFNULL(ANSWER_YN, 'N') = 'N' AND IFNULL(USE_YN, 'Y') = 'Y' ]]> diff --git a/src/main/webapp/WEB-INF/jsp/nlib/bbs/insertQnaForm.jsp b/src/main/webapp/WEB-INF/jsp/nlib/bbs/insertQnaForm.jsp index cc1dac1c..183a4506 100644 --- a/src/main/webapp/WEB-INF/jsp/nlib/bbs/insertQnaForm.jsp +++ b/src/main/webapp/WEB-INF/jsp/nlib/bbs/insertQnaForm.jsp @@ -85,8 +85,8 @@ $(window.document).ready(function() { url: "${pageContext.request.contextPath}/fileupload/uploadFilesAjax.do?subPathKey=fileupload.bbs.qna.subpath&attachFileId=${searchArticle.bdAttachFileId}" }); - // 기존 첨부파일 출력 + var re = /(?:\.([^.]+))?$/; myDropzone.addFile({ @@ -146,7 +146,7 @@ $(window.document).ready(function() { var targetCnt = this.getAcceptedFiles().length; var uploadCnt = fileList.length; var queuedCnt = this.getQueuedFiles(); - + if(uploadCnt > 0) { $("#fileList").val(JSON.stringify(JSON.stringify(fileList))); } @@ -253,6 +253,25 @@ function fn_saveSubmit() { $("#articleForm").submit(); } + +//파일 다운로드 +function fn_downloadFile(attachFileId, fileSn) { + + if(attachFileId == null || attachFileId.trim().length < 1) { + alert("파일정보를 확인해 주시기 바랍니다.[1]"); + return; + } + + if(fileSn < 1) { + alert("파일정보를 확인해 주시기 바랍니다.[3]"); + return; + } + $("#attachFileId").val(attachFileId); + $("#fileSn").val(fileSn); + + $("#downloadFileForm").submit(); + +} @@ -288,17 +307,14 @@ function fn_saveSubmit() { - - - - + + + +
  • 제목
    - delFileList : - bdAttachFileId : -
  • @@ -354,4 +370,14 @@ function fn_saveSubmit() { - + + +
    + + + + + +
    diff --git a/src/main/webapp/WEB-INF/jsp/nlib/bbs/listQnas.jsp b/src/main/webapp/WEB-INF/jsp/nlib/bbs/listQnas.jsp index 4325d5c9..e9c2cc13 100644 --- a/src/main/webapp/WEB-INF/jsp/nlib/bbs/listQnas.jsp +++ b/src/main/webapp/WEB-INF/jsp/nlib/bbs/listQnas.jsp @@ -37,11 +37,6 @@