From 32335a2ae59a6792e3c4ea4f584724ddf46ac93c Mon Sep 17 00:00:00 2001 From: KNKIM Date: Tue, 14 Sep 2021 16:43:08 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=EA=B3=B5=EC=A7=80=EC=82=AC=ED=95=AD=20:=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D,=20=EC=83=81=EC=84=B8=EC=A1=B0=ED=9A=8C=20DB?= =?UTF-8?q?=EC=97=B0=EB=8F=99=20=EB=B3=80=ED=99=98=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nlib/bbs/service/ArticleVO.java | 73 ++++++++++- .../java/nlib/bbs/service/impl/AncmntDAO.java | 30 +---- .../bbs/service/impl/AncmntServiceImpl.java | 49 ++------ .../java/nlib/bbs/service/impl/BoardDAO.java | 14 ++- ...viceImpl.java => BoardServiceImplApi.java} | 4 +- .../java/nlib/bbs/web/AncmntController.java | 92 +++++--------- .../cmm/fileupload/FileUploadController.java | 27 ++-- .../java/nlib/cmm/service/NotificationVO.java | 7 ++ src/main/java/nlib/cmm/service/PagingVO.java | 10 +- .../nlib/col/service/impl/CollectionDAO.java | 2 +- .../nlib/col/web/CollectionController.java | 3 - src/main/java/nlib/util/StringUtil.java | 10 ++ .../mapper/config/mapper-config.xml | 2 + .../mapper/nlib/bbs/AncmntDAO_SQL.xml | 115 +++++++++++++----- .../mapper/nlib/cmm/NotificationDAO_SQL.xml | 2 + src/main/resources/nlib/nlib.properties | 1 + .../WEB-INF/jsp/nlib/bbs/listAncmnts.jsp | 75 +++++------- src/main/webapp/WEB-INF/tiles/inc/menu.jsp | 2 +- src/main/webapp/temp/test.html | 2 + 19 files changed, 283 insertions(+), 237 deletions(-) rename src/main/java/nlib/bbs/service/impl/{BoardServiceImpl.java => BoardServiceImplApi.java} (94%) diff --git a/src/main/java/nlib/bbs/service/ArticleVO.java b/src/main/java/nlib/bbs/service/ArticleVO.java index 2109d092..7110efe5 100644 --- a/src/main/java/nlib/bbs/service/ArticleVO.java +++ b/src/main/java/nlib/bbs/service/ArticleVO.java @@ -1,12 +1,17 @@ package nlib.bbs.service; +import java.util.List; + import nlib.cmm.service.PagingVO; +import nlib.util.StringUtil; public class ArticleVO extends PagingVO { private String articleId; /* 게시글ID */ private String mngOrgCd; /* 관리문화원코드 */ + private String mngOrgNm; /* 관리문화원명 */ private String bdType; /* 게시판유형 */ + private String bdTypeName; /* 게시판유형명 */ private String title; /* 제목 */ private String content; /* 내용 */ @@ -18,12 +23,27 @@ public class ArticleVO extends PagingVO { private int viewCnt; /* 조회수 */ private String bdAttachFileId; /* 첨부파일아이디 */ + private String attachYn; /* 첨부파일존재여부 */ private String regId; /* 등록자아이디 */ + private String regNm; /* 등록자명 */ private String regDd; /* 등록일자 */ private String modId; /* 등록자아이디 */ private String modDd; /* 등록일자 */ + private int rno; /* 글번호 */ + + // 검색관련 + private String searchType; /* 검색대상구분 */ + private String searchKeyword; /* 검색어 */ + + // 첨부파일 + private List attachFiles = null; /* 첨부파일목록 */ + + public int getAttachFileCnt() { + if(attachFiles == null) return 0; + return attachFiles.size(); + } public String getArticleId() { return articleId; @@ -115,6 +135,57 @@ public class ArticleVO extends PagingVO { public void setModDd(String modDd) { this.modDd = modDd; } - + public String getRegNm() { + return regNm; + } + public void setRegNm(String regNm) { + this.regNm = regNm; + } + public int getRno() { + return rno; + } + public void setRno(int rno) { + this.rno = rno; + } + public String getSearchType() { + return searchType; + } + public void setSearchType(String searchType) { + this.searchType = searchType; + } + public String getSearchKeyword() { + return searchKeyword; + } + public String getEscapeSearchKeyword() { + return StringUtil.getSqlSearchKeyword(searchKeyword); + } + public void setSearchKeyword(String searchKeyword) { + this.searchKeyword = searchKeyword; + } + public String getAttachYn() { + return attachYn; + } + public void setAttachYn(String attachYn) { + this.attachYn = attachYn; + } + public String getMngOrgNm() { + return mngOrgNm; + } + public void setMngOrgNm(String mngOrgNm) { + this.mngOrgNm = mngOrgNm; + } + public String getBdTypeName() { + return bdTypeName; + } + public void setBdTypeName(String bdTypeName) { + this.bdTypeName = bdTypeName; + } + public List getAttachFiles() { + return attachFiles; + } + public void setAttachFiles(List attachFiles) { + this.attachFiles = attachFiles; + } + } diff --git a/src/main/java/nlib/bbs/service/impl/AncmntDAO.java b/src/main/java/nlib/bbs/service/impl/AncmntDAO.java index 721ce74c..cd22f369 100644 --- a/src/main/java/nlib/bbs/service/impl/AncmntDAO.java +++ b/src/main/java/nlib/bbs/service/impl/AncmntDAO.java @@ -37,34 +37,10 @@ import nlib.util.StringUtil; * */ @Mapper("ancmntDAO") -public interface AncmntDAO { +public interface AncmntDAO extends BoardDAO { - /* - * 게시글 목록을 조회한다. + /* + * BoardDAO 상속 내용과 동일 */ - public List listArticles(ArticleVO ArticleVO) throws Exception; - - - /** - * 게시글 건수를 조회한다. - */ - public int countArticles(ArticleVO ArticleVO) throws Exception; - /** - * 조회수를 증가시킨다. - * - * @param - * @return - * @throws Exception - */ - public int updateRead(ArticleVO notiVO) throws Exception; - - /** - * 게시글 상세 내용을 조회한다. - * - * @param - * @return - * @throws Exception - */ - public ArticleVO selectArticle(ArticleVO notiVO) throws Exception; } diff --git a/src/main/java/nlib/bbs/service/impl/AncmntServiceImpl.java b/src/main/java/nlib/bbs/service/impl/AncmntServiceImpl.java index 077c2952..3e179132 100644 --- a/src/main/java/nlib/bbs/service/impl/AncmntServiceImpl.java +++ b/src/main/java/nlib/bbs/service/impl/AncmntServiceImpl.java @@ -10,54 +10,19 @@ import org.springframework.stereotype.Service; import nlib.bbs.service.ArticleVO; import nlib.bbs.service.BoardService; +import nlib.util.StringUtil; @Service("ancmntService") -public class AncmntServiceImpl implements BoardService +public class AncmntServiceImpl extends BoardServiceImpl { - private static final Logger log = LoggerFactory.getLogger(AncmntServiceImpl.class); + static Logger log = LoggerFactory.getLogger(AncmntServiceImpl.class); @Resource(name="ancmntDAO") - private AncmntDAO ancmntDAO; + AncmntDAO ancmntDAO; - - /* - * 게시글 목록을 조회한다. - */ - public List listArticles(ArticleVO articleVO) throws Exception { - - return ancmntDAO.listArticles(articleVO); + @Override + public BoardDAO getBoardDAO() { + return ancmntDAO; } - - /** - * 게시글 건수를 조회한다. - */ - public int countArticles(ArticleVO articleVO) throws Exception { - - return ancmntDAO.countArticles(articleVO); - } - - /** - * 조회수를 증가시킨다. - * - * @param - * @return - * @throws Exception - */ - public int updateRead(ArticleVO articleVO) throws Exception { - return ancmntDAO.updateRead(articleVO); - } - - /** - * 게시글 상세 내용을 조회한다. - * - * @param - * @return - * @throws Exception - */ - public ArticleVO selectArticle(ArticleVO articleVO) throws Exception { - updateRead(articleVO); - return ancmntDAO.selectArticle(articleVO); - } - } \ No newline at end of file diff --git a/src/main/java/nlib/bbs/service/impl/BoardDAO.java b/src/main/java/nlib/bbs/service/impl/BoardDAO.java index 13b8ee7f..0372bc77 100644 --- a/src/main/java/nlib/bbs/service/impl/BoardDAO.java +++ b/src/main/java/nlib/bbs/service/impl/BoardDAO.java @@ -10,13 +10,14 @@ import egovframework.com.cmm.service.impl.EgovComAbstractDAO; import egovframework.rte.psl.dataaccess.mapper.Mapper; import nlib.cmm.service.NotificationVO; import nlib.bbs.service.ArticleVO; +import nlib.bbs.service.AttachFileVO; import nlib.cmm.service.NlibProperty; import nlib.user.service.NlibLoginVO; import nlib.util.StringUtil; /** *
- * @Class Name : AncmntDAO.java
+ * @Class Name : BoardDAO.java
  * 
  * @Description : 공지사항 정보 제공 DAO 
  * 
@@ -67,4 +68,15 @@ public interface BoardDAO {
 	 * @throws Exception
 	 */
 	public ArticleVO selectArticle(ArticleVO notiVO) throws Exception;
+	
+
+	/**
+	 * 첨부파일 목록을 조회한다.  
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 */
+	public List listAttachFiles(String attachFileId) throws Exception;
+	
 }
diff --git a/src/main/java/nlib/bbs/service/impl/BoardServiceImpl.java b/src/main/java/nlib/bbs/service/impl/BoardServiceImplApi.java
similarity index 94%
rename from src/main/java/nlib/bbs/service/impl/BoardServiceImpl.java
rename to src/main/java/nlib/bbs/service/impl/BoardServiceImplApi.java
index b36d88cb..058c263d 100644
--- a/src/main/java/nlib/bbs/service/impl/BoardServiceImpl.java
+++ b/src/main/java/nlib/bbs/service/impl/BoardServiceImplApi.java
@@ -12,9 +12,9 @@ import nlib.restful.service.DataApiReqVO;
 import nlib.restful.service.DataApiResVO;
 
 @Service("boardService")
-public class BoardServiceImpl implements BoardServiceApi
+public class BoardServiceImplApi implements BoardServiceApi
 {
-	private static final Logger log = LoggerFactory.getLogger(BoardServiceImpl.class);
+	private static final Logger log = LoggerFactory.getLogger(BoardServiceImplApi.class);
 	
 	@Resource(name = "boardDAO")
 	private BoardDAOApi boardDAO;
diff --git a/src/main/java/nlib/bbs/web/AncmntController.java b/src/main/java/nlib/bbs/web/AncmntController.java
index fac6d034..7639cdd2 100644
--- a/src/main/java/nlib/bbs/web/AncmntController.java
+++ b/src/main/java/nlib/bbs/web/AncmntController.java
@@ -47,23 +47,11 @@ public class AncmntController extends NlibCommonController
 	public String listAncmnts(
 			HttpServletRequest req, 
 			@RequestParam Map paramMap,
-			ArticleVO articleVO,
+			ArticleVO searchArticleVO,
 			ModelMap model
 			) throws Exception {
 
-		int pageIndex = StringUtil.toNumber(paramMap.get("pageIndex"), 1);
-		int pageSize  = StringUtil.toNumber(paramMap.get("pageSize"), DEFUALT_PAGE_SIZE);
-		
-		log.debug("listAncmnt > pageIndex = " + pageIndex);
-		log.debug("listAncmnt > pageSize = " + pageSize);
-    	
-		ArticleVO searchArticleVO = new ArticleVO();
-		searchArticleVO.setPageIndex(pageIndex);
-		searchArticleVO.setPageSize(pageSize);
-		
-		model.addAttribute("searchArticleVO", searchArticleVO);
-		model.addAttribute("pageSize", pageSize);
-		model.addAttribute("pageIndex", pageIndex);
+		model.addAttribute("searchArticle", searchArticleVO);
     	
     	return "nlib/bbs/listAncmnts";
 	}
@@ -75,22 +63,17 @@ public class AncmntController extends NlibCommonController
 	 * @return
 	 */
 	@RequestMapping(value="/bbs/listAncmntsAjax.do")
-	public ResponseEntity listAncmntsAjax(HttpServletRequest req, 
-			Authentication authentication, @RequestBody Map paramMap) throws Exception {
+	public ResponseEntity listAncmntsAjax(
+			HttpServletRequest req, 
+			Authentication authentication,
+			@RequestBody ArticleVO searchArticleVO) throws Exception {
 
-		int pageIndex = StringUtil.toNumber(paramMap.get("pageIndex"), 1);
-		int pageSize  = StringUtil.toNumber(paramMap.get("pageSize"), DEFUALT_PAGE_SIZE);
+		if(searchArticleVO.getPageIndex() < 1) searchArticleVO.setPageIndex(1);
+		if(searchArticleVO.getPageSize() < 1) searchArticleVO.setPageSize(DEFUALT_PAGE_SIZE);
 		
-		log.debug("listNotificationsAjax > pageIndex = " + pageIndex);
-		log.debug("listNotificationsAjax > pageSize = " + pageSize);
+		List list = ancmntService.listArticles(searchArticleVO);
 		
-
-		ArticleVO searchNotificationtVO = new ArticleVO();
-		searchNotificationtVO.setPageIndex(pageIndex);
-		searchNotificationtVO.setPageSize(pageSize);
-		List list = ancmntService.listArticles(searchNotificationtVO);
-		
-		int totRecordCount = ancmntService.countArticles(searchNotificationtVO);
+		int totRecordCount = ancmntService.countArticles(searchArticleVO);
 		
 		//-------------------------------
 		// JSON변환 응답 처리
@@ -107,41 +90,22 @@ public class AncmntController extends NlibCommonController
 	}
 
 
-//	/**
-//	 * 알림 상세 내용 조회한다.
-//	 * 
-//	 * @param req
-//	 * @return
-//	 */
-//	@RequestMapping("/cmm/selectNotificationAjax.do")
-//	public ResponseEntity selectNotificationAjax(HttpServletRequest req, Authentication authentication, @RequestBody Map paramMap) throws Exception {
-//
-//		String notiId = paramMap.get("notiId"); // 알림ID 
-//		String pageIndex = paramMap.get("pageIndex");
-//		String pageSize = paramMap.get("pageSize");
-//		
-//		log.debug("selectNotificationAjax > notiId = " + notiId);
-//		
-//		ArticleVO paramNotiVO = new ArticleVO();
-//		paramNotiVO.setNotiId(notiId);
-//		paramNotiVO.setRecvUserId(getMbInfoId(req));
-//		paramNotiVO.setPageIndex(pageIndex);
-//		paramNotiVO.setPageSize(pageSize);
-//		
-//		// 읽음처리 및 상세내용 조회 
-//		ArticleVO articleVO = ancmntService.selectNotification(paramNotiVO);
-//
-//		//-------------------------------
-//		// JSON변환 응답 처리
-//		//-------------------------------
-//    	// JS-GRID 페이징 처리를 포함한 응답값 처리
-//    	// {data: [{...}], 
-//    	//  itemsCount: 255
-//    	// }
-//    	HashMap retMap = new HashMap();
-//    	retMap.put("data", articleVO);
-//    	
-//    	return makeResponseEntityJson(retMap);
-//	}
-//	
+	/**
+	 * 알림 상세 내용 조회한다.
+	 * 
+	 * @param req
+	 * @return
+	 */
+	@RequestMapping("/bbs/selectAncmntArticle.do")
+	public String selectAncmntArticle(HttpServletRequest req, Authentication authentication, ArticleVO searchArticleVO, ModelMap model) throws Exception {
+
+		// 읽음처리 및 상세내용 조회 
+		ArticleVO articleVO = ancmntService.selectArticle(searchArticleVO);
+
+		model.addAttribute("searchArticle", searchArticleVO);
+		model.addAttribute("article", articleVO);
+    	
+    	return "nlib/bbs/selectAncmntArticle";
+	}
+	
 }
\ No newline at end of file
diff --git a/src/main/java/nlib/cmm/fileupload/FileUploadController.java b/src/main/java/nlib/cmm/fileupload/FileUploadController.java
index a4e65e58..0bcf8ecb 100644
--- a/src/main/java/nlib/cmm/fileupload/FileUploadController.java
+++ b/src/main/java/nlib/cmm/fileupload/FileUploadController.java
@@ -2,7 +2,6 @@ package nlib.cmm.fileupload;
 
 import java.io.File;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -13,7 +12,6 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -28,8 +26,8 @@ import org.springframework.web.servlet.ModelAndView;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
-import egovframework.com.cmm.EgovWebUtil;
 import egovframework.com.cmm.service.FileVO;
+import nlib.bbs.service.AttachFileVO;
 import nlib.cmm.exception.ErrorMessage;
 import nlib.cmm.service.NlibProperty;
 import nlib.util.FileUtil;
@@ -63,19 +61,16 @@ public class FileUploadController {
 
 	private static final Logger log = LoggerFactory.getLogger(FileUploadController.class);
 
-	@Resource(name="nlibProperty")
-	NlibProperty nlibProperty;
-	
 	
 	/**
 	 * 첨부파일이 저장되는 최상위 위치 
 	 */
-	private String FILEUPLOAD_BASE_PATH = nlibProperty.getProperty("fileupload.base.path");
+	private String FILEUPLOAD_BASE_PATH = NlibProperty.getProperty("fileupload.base.path");
 	
 	/**
 	 * 첨부파일 임시 저장 위치 
 	 */
-	private String FILEUPLOAD_TEMP_SUBPATH = nlibProperty.getProperty("fileupload.temp.subpath");
+	private String FILEUPLOAD_TEMP_SUBPATH = NlibProperty.getProperty("fileupload.temp.subpath");
 
 	/**
 	 * 경로 부적합 오류 메시지 
@@ -121,7 +116,7 @@ public class FileUploadController {
 				ErrorMessage errorMessage = new ErrorMessage("ERROR", message);
 				return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorMessage);
 			}
-			String subPath = nlibProperty.getProperty(subPathKey);
+			String subPath = NlibProperty.getProperty(subPathKey);
 			if(StringUtil.isEmpty(subPath)) {
 				message = "첨부파일이 저장되는 하위 위치정보값을 찾을 수 없습니다.";
 				log.error(message + " : 매개변수 subPathKey의 속성값 부재");
@@ -222,16 +217,16 @@ public class FileUploadController {
 	 * @return
 	 * @throws Exception
 	 */
-	@RequestMapping(value="/fileupload/downloadFiles.do")
-	public ModelAndView download(@RequestParam HashMap params, ModelAndView mv) throws Exception {
+	@RequestMapping(value="/fileupload/downloadAttachFile.do")
+	public ModelAndView downloadAttachFile(AttachFileVO attachFileVO, ModelAndView mv) throws Exception {
 		
 		// TODO 권한 설정 기능 추가 필요 
 		
-		String fid = (String) params.get("fid");
-		String fname = (String) params.get("fname");
-		String subPath = nlibProperty.getProperty((String) params.get("subPathKey"));
+		String subPath = NlibProperty.getProperty(attachFileVO.getSubPathKey());
+		String fullPath = FILEUPLOAD_BASE_PATH + "/" + subPath + "/" + attachFileVO.getFileId() + "-" + attachFileVO.getFileSeq();
+		
+		log.debug("downloadAttachFile > fullPath = " + fullPath);
 		
-		String fullPath = FILEUPLOAD_BASE_PATH + "/" + subPath + "/" + fid;
 		if(FileUtil.isNotValid(fullPath)) {
 			throw new Exception(MSG_NOT_VALID_FILE_PATH);
 		}
@@ -243,7 +238,7 @@ public class FileUploadController {
 		
 		mv.setViewName("downloadView"); // dispatcher-servlet.xml내 BeanNameViewResolver 정의 
 		mv.addObject("downloadFile", file);
-		mv.addObject("fname", fname);
+		mv.addObject("fname", attachFileVO.getFileName());
 		
 		return mv;
 	}
diff --git a/src/main/java/nlib/cmm/service/NotificationVO.java b/src/main/java/nlib/cmm/service/NotificationVO.java
index 4067fef2..57dd86b4 100644
--- a/src/main/java/nlib/cmm/service/NotificationVO.java
+++ b/src/main/java/nlib/cmm/service/NotificationVO.java
@@ -15,6 +15,7 @@ public class NotificationVO extends PagingVO {
 	private String recvUserId; 	/* 알림대상자 회원아이디 */
 	private String readYn;      /* 알림확인여부 */
 	private int    totCnt = 0;  /* 알림건수(최근1개월) */
+	private int    rno = 0;     /* 행번호 */
 	
 	public String getNotiId() {
 		return notiId;
@@ -88,5 +89,11 @@ public class NotificationVO extends PagingVO {
 	public void setNotiTypeNm(String notiTypeNm) {
 		this.notiTypeNm = notiTypeNm;
 	}
+	public int getRno() {
+		return rno;
+	}
+	public void setRno(int rno) {
+		this.rno = rno;
+	}
 	
 }
diff --git a/src/main/java/nlib/cmm/service/PagingVO.java b/src/main/java/nlib/cmm/service/PagingVO.java
index d16e97c5..a14e66ad 100644
--- a/src/main/java/nlib/cmm/service/PagingVO.java
+++ b/src/main/java/nlib/cmm/service/PagingVO.java
@@ -2,8 +2,10 @@ package nlib.cmm.service;
 
 public class PagingVO {
 
+	public final int DEFAULT_PAGE_SIZE = NlibProperty.getInt("list.paging.page.size", 10);
+	
 	int pageIndex = 1; 		/* 페이지 번호 */
-	int pageSize = NlibProperty.getInt("list.paging.page.size", 10); /* 페이지 크기 (1페이지당 보여줄 자료건수) */
+	int pageSize = DEFAULT_PAGE_SIZE; /* 페이지 크기 (1페이지당 보여줄 자료건수) */
 	int totRecordCount;	/* 총건수 */
 	
 	public int getPageIndex() {
@@ -11,7 +13,8 @@ public class PagingVO {
 	}
 	
 	public void setPageIndex(int pageIndex) {
-		this.pageIndex = pageIndex;
+		if(pageIndex < 1) pageIndex = 1;
+		else this.pageIndex = pageIndex;
 	}
 	
 	public void setPageIndex(String sPageIndex) {
@@ -27,7 +30,8 @@ public class PagingVO {
 	}
 	
 	public void setPageSize(int pageSize) {
-		this.pageSize = pageSize;
+		if(pageSize < 1) pageSize = DEFAULT_PAGE_SIZE;
+		else this.pageSize = pageSize;
 	}
 	
 	public void setPageSize(String sPageSize) {
diff --git a/src/main/java/nlib/col/service/impl/CollectionDAO.java b/src/main/java/nlib/col/service/impl/CollectionDAO.java
index 3fc9fdc8..b4d9ff11 100644
--- a/src/main/java/nlib/col/service/impl/CollectionDAO.java
+++ b/src/main/java/nlib/col/service/impl/CollectionDAO.java
@@ -5,7 +5,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Repository;
 
-import nlib.bbs.service.impl.BoardDAO;
+import nlib.bbs.service.impl.BoardDAOApi;
 import nlib.restful.DataApi;
 import nlib.restful.service.DataApiReqVO;
 import nlib.restful.service.DataApiResVO;
diff --git a/src/main/java/nlib/col/web/CollectionController.java b/src/main/java/nlib/col/web/CollectionController.java
index 0120b648..a9504b53 100644
--- a/src/main/java/nlib/col/web/CollectionController.java
+++ b/src/main/java/nlib/col/web/CollectionController.java
@@ -79,7 +79,6 @@ public class CollectionController extends NlibCommonController
 		// REQ VO 구성 
 		//-------------------------------
     	DataApiReqVO reqVO = new DataApiReqVO();
-    	reqVO.setAuthKey(createAuthKey(req, authentication));
     	reqVO.setPageIndex(pageIndex);
     	reqVO.setPageSize(pageSize);
     	reqVO.addInfoItem("searchKeyword", searchKeyword);
@@ -143,7 +142,6 @@ public class CollectionController extends NlibCommonController
 				// REQ VO 구성 
 				//-------------------------------
 		    	DataApiReqVO reqVO = new DataApiReqVO();
-		    	reqVO.setAuthKey(createAuthKey(req, authentication));
 		    	reqVO.setPageIndex(pageIndex);
 		    	reqVO.setPageSize(pageSize);
 		    	reqVO.addInfoItem("boardNo", "QNA");       // 게시판ID
@@ -203,7 +201,6 @@ public class CollectionController extends NlibCommonController
 		// REQ VO 구성 
 		//-------------------------------
     	DataApiReqVO reqVO = new DataApiReqVO();
-    	reqVO.setAuthKey(createAuthKey(req, authentication));
     	reqVO.setPageIndex(pageIndex);
     	reqVO.setPageSize(pageSize);
     	reqVO.addInfoItem("searchKeyword", searchKeyword);
diff --git a/src/main/java/nlib/util/StringUtil.java b/src/main/java/nlib/util/StringUtil.java
index 5882e9bd..a8a921e1 100644
--- a/src/main/java/nlib/util/StringUtil.java
+++ b/src/main/java/nlib/util/StringUtil.java
@@ -181,4 +181,14 @@ public class StringUtil extends StringUtils {
 		
 		return url + delim + name + "=" + getString(value, "");
 	}
+	
+	public static String getSqlSearchKeyword(String str) {
+
+		if(isNotEmpty(str)) {
+			String ret = str.replaceAll("\\%", "\\\\%");
+			return ret.replaceAll("_", "\\\\_");
+	    }
+		
+		return str;
+	}
 }
diff --git a/src/main/resources/egovframework/mapper/config/mapper-config.xml b/src/main/resources/egovframework/mapper/config/mapper-config.xml
index 51a0648a..e1f3607a 100644
--- a/src/main/resources/egovframework/mapper/config/mapper-config.xml
+++ b/src/main/resources/egovframework/mapper/config/mapper-config.xml
@@ -18,6 +18,8 @@
         
         
         
+        
+        
     
     
 
\ No newline at end of file
diff --git a/src/main/resources/egovframework/mapper/nlib/bbs/AncmntDAO_SQL.xml b/src/main/resources/egovframework/mapper/nlib/bbs/AncmntDAO_SQL.xml
index 3bb6ae60..24251c6b 100644
--- a/src/main/resources/egovframework/mapper/nlib/bbs/AncmntDAO_SQL.xml
+++ b/src/main/resources/egovframework/mapper/nlib/bbs/AncmntDAO_SQL.xml
@@ -3,12 +3,68 @@
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
 
+    
+        
+        
+        
+            
+            AND S.TITLE LIKE CONCAT('%', #{escapeSearchKeyword}, '%')
+            
+        
+        
+            
+            AND S.CONTENT LIKE CONCAT('%', #{escapeSearchKeyword}, '%')
+            
+        
+        
+    
+    
  	
+ 	
+    
+ 	
+    
- 	
-    
- 	
-    
+        SELECT 
+              A.FILE_MASK
+            , A.FILE_ID
+            , A.FILE_SEQ
+            , A.FILE_NAME
+            , A.FILE_SIZE
+            , A.FILE_TYPE_CD
+            , A.DOWNLOAD_COUNT
+            , A.DOWNLOAD_EXPIRE_DATE
+            , A.DOWNLOAD_LIMIT_COUNT
+            , DATE_FORMAT(A.REG_DATE, '%Y-%m-%d') AS REG_DD
+            , A.DELETE_YN
+            , A.STREAMING_URL
+            , A.CONTENT
+            , A.ATCH_TYPE_CD
+        FROM J_ATTACHFILE A
+        WHERE A.FILE_ID = #{attachFileId}
+        ORDER BY A.FILE_SEQ
     
     
     
diff --git a/src/main/resources/egovframework/mapper/nlib/cmm/NotificationDAO_SQL.xml b/src/main/resources/egovframework/mapper/nlib/cmm/NotificationDAO_SQL.xml
index 50d68f5c..830b377f 100644
--- a/src/main/resources/egovframework/mapper/nlib/cmm/NotificationDAO_SQL.xml
+++ b/src/main/resources/egovframework/mapper/nlib/cmm/NotificationDAO_SQL.xml
@@ -40,9 +40,11 @@
             , IF(A.READ_DD IS NULL, 'N', 'Y') AS READ_YN
             , DATE_FORMAT(A.REG_DD, '%Y-%M-%D') AS REG_DD
             , COUNT(A.NOTI_ID) OVER(PARTITION BY 1) AS TOT_CNT 
+            , A2.RNO
         FROM SM_NOTIFICATION A
         INNER JOIN (
             SELECT S.NOTI_ID
+                 , ROW_NUMBER() OVER() AS RNO
             FROM SM_NOTIFICATION S
             WHERE S.RECV_USER_ID = #{recvUserId}
             AND S.REG_DD > DATE_SUB(NOW(), INTERVAL 1 MONTH)
diff --git a/src/main/resources/nlib/nlib.properties b/src/main/resources/nlib/nlib.properties
index fd365f3f..3b2d31a0 100644
--- a/src/main/resources/nlib/nlib.properties
+++ b/src/main/resources/nlib/nlib.properties
@@ -83,6 +83,7 @@ fileupload.temp.subpath = /temp
 
 # \ubb3b\uace0\ub2f5\ud558\uae30 \uac8c\uc2dc\ud310 \uc11c\ube0c\uc704\uce58 : \ucca8\ubd80\ud30c\uc77c \ucd5c\uc0c1\uc704 \uc704\uce58 \uc774\ud558\uc758 \uc704\uce58 \uc815\ubcf4\ub97c \uc124\uc815 
 fileupload.bbs.qna.subpath = /bbs/qna
+fileupload.bbs.ancmnt.subpath = /bbs/ancmnt
 
 # \uba54\uc77c \uacbd\ub85c
 mailing.sender.membership.template = C:/iams/workspace/nlib/src/main/webapp/mail/mail_template.html
diff --git a/src/main/webapp/WEB-INF/jsp/nlib/bbs/listAncmnts.jsp b/src/main/webapp/WEB-INF/jsp/nlib/bbs/listAncmnts.jsp
index 17d04529..bbed5b1a 100644
--- a/src/main/webapp/WEB-INF/jsp/nlib/bbs/listAncmnts.jsp
+++ b/src/main/webapp/WEB-INF/jsp/nlib/bbs/listAncmnts.jsp
@@ -63,11 +63,19 @@
                  var pageIndex = ( filter && filter.pageIndex ? filter.pageIndex : $("#pageIndex").val());
                  var pageSize  = ( filter && filter.pageSize  ? filter.pageSize  : $("#pageSize").val());
                  
+                 var searchType = $("#searchType").val();
+                 var searchKeyword = $("#searchKeyword").val();
+                 
+                 
                  $("#pageIndex").val(pageIndex);
+                 
 
                  var inputData = {
-                           "pageIndex" : pageIndex
-                         , "pageSize": pageSize};
+                           "pageIndex"  : pageIndex
+                         , "pageSize"   : pageSize
+                         , "searchType" : searchType
+                         , "searchKeyword"    : searchKeyword
+                     };
                  
                  
                  //--------------------------------------
@@ -116,12 +124,11 @@
          //======================================
          fields: [
              { title:"ID",   name: "articleId" , type: "text", width: 200, align: "left" },
-             { title:"알림방법",   name: "notiMethod" , type: "text", width: 100, align: "center"},
-             { title:"구분코드",   name: "notiTypeCd" , type: "text", width: 100, align: "center"},
-             { title:"구분",   name: "notiTypeNm" , type: "text", width: 100, align: "center"},
+             { title:"번호",   name: "rno" , type: "text", width: 200, align: "center" },
              { title:"제목",   name: "title"      , type: "text", width: 200, align: "left" },
-             { title:"확인여부",   name: "readYn"      , type: "text", width: 100, align: "center"},
-             { title:"날짜",   name: "regDd"      , type: "text", width: 100, align: "center"}
+             { title:"등록자",   name: "regNm"      , type: "text", width: 100, align: "center"},
+             { title:"등록일",   name: "regDd"      , type: "text", width: 100, align: "center"},
+             { title:"첨부",   name: "bdAttachFileId"      , type: "text", width: 100, align: "center"}
          ]
      });
 
@@ -137,47 +144,17 @@
 
 
  // 선택한 글 상세 보기로 이동
- function fn_viewDetail(articleId, selectedRow) {
+ function fn_viewDetail(articleId) {
 
-     var $selectedRow = $(selectedRow);
-     var reqUrl = "${pageContext.request.contextPath}/bbs/selectAncmntAjax.do";
-     var inputData = { "articleId" : articleId };
-     
-     //--------------------------------------
-     // 요청 처리 
-     //--------------------------------------
-     $.ajax({
-         type: "post",
-         contentType: "application/json; charset=utf-8",
-         url: reqUrl,
-         dataType: "json",
-         data: JSON.stringify(inputData),
-     }).done(function(response){
-         var jsonObj = JSON.parse(response);
-         $("#jsGrid").find('table tr.answer').remove();
-         //alert("DDDDDDDD remove = " + $("#jsGrid")[0].scrollHeight);
-         
-        $("#jsGrid").jsGrid("rowByItem", $selectedRow).data("JSGridItem")["readYn"] = jsonObj.data.readYn;
-        $selectedRow.find('td').eq(GRID_INDEX_OF_READYN).text(jsonObj.data.readYn);
-        
-        $selectedRow.after("" + jsonObj.data.content
-                 + "
" + jsonObj.data.content - + "
" + jsonObj.data.content - + "
" + jsonObj.data.content - + "
알림확인여부=" + jsonObj.data.readYn - + "
알림일자=" + jsonObj.data.regDd - + ""); - }); - - $("#jsGrid").closest('.ui-jqgrid-bdiv').width($("#jsGrid").closest('.ui-jqgrid-bdiv').width() + 1); - + $("#articleId").val(articleId); + $("#articleForm").submit(); } // 그리드 데이터 조회 호출 function fn_searchArticle(pageSize, pageIndex) { $("#jsGrid").jsGrid("search" - , {'pageSize' : (pageSize ? pageSize : fn_getIntValue("pageSize", ${pageSize}) ), - 'pageIndex' : (pageIndex ? pageIndex : fn_getIntValue("pageIndex", ${pageIndex})) + , {'pageSize' : (pageSize ? pageSize : fn_getIntValue("pageSize", ${searchArticle.pageSize}) ), + 'pageIndex' : (pageIndex ? pageIndex : fn_getIntValue("pageIndex", ${searchArticle.pageIndex})) } ); } @@ -193,15 +170,21 @@  
-
+ - + - - + + + + +
diff --git a/src/main/webapp/WEB-INF/tiles/inc/menu.jsp b/src/main/webapp/WEB-INF/tiles/inc/menu.jsp index 20dcb569..139299e3 100644 --- a/src/main/webapp/WEB-INF/tiles/inc/menu.jsp +++ b/src/main/webapp/WEB-INF/tiles/inc/menu.jsp @@ -6,7 +6,7 @@
  • 인사말
  • 이용안내
  • 공지사항
  • -
  • 공지사항(DB)
  • +
  • 공지사항(DB)
  • 자주하는질문
  • 묻고답하기
  • 찾아오시는길
  • diff --git a/src/main/webapp/temp/test.html b/src/main/webapp/temp/test.html index b8ff83a1..5b8c364f 100644 --- a/src/main/webapp/temp/test.html +++ b/src/main/webapp/temp/test.html @@ -8,8 +8,10 @@ + From 7bb4bab7995e0474979f374f24971c55a480e765 Mon Sep 17 00:00:00 2001 From: KNKIM Date: Tue, 14 Sep 2021 16:43:53 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=EA=B3=B5=EC=A7=80=EC=82=AC=ED=95=AD,=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EC=A1=B0=ED=9A=8C=20:=20DB=20=EC=97=B0?= =?UTF-8?q?=EB=8F=99=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UR-1D9F07B0D8F84938887817B05FC83E90-4 | Bin 0 -> 26391 bytes .../java/nlib/bbs/service/AttachFileVO.java | 167 ++++++++++++++++++ .../bbs/service/impl/BoardServiceImpl.java | 68 +++++++ src/main/java/nlib/cmm/fileupload/FileVO.java | 64 +++++++ .../jsp/nlib/bbs/selectAncmntArticle.jsp | 155 ++++++++++++++++ src/main/webapp/temp/date.txt | 1 + src/main/webapp/temp/test.js | 0 7 files changed, 455 insertions(+) create mode 100644 data/fileupload/bbs/ancmnt/UR-1D9F07B0D8F84938887817B05FC83E90-4 create mode 100644 src/main/java/nlib/bbs/service/AttachFileVO.java create mode 100644 src/main/java/nlib/bbs/service/impl/BoardServiceImpl.java create mode 100644 src/main/java/nlib/cmm/fileupload/FileVO.java create mode 100644 src/main/webapp/WEB-INF/jsp/nlib/bbs/selectAncmntArticle.jsp create mode 100644 src/main/webapp/temp/date.txt create mode 100644 src/main/webapp/temp/test.js diff --git a/data/fileupload/bbs/ancmnt/UR-1D9F07B0D8F84938887817B05FC83E90-4 b/data/fileupload/bbs/ancmnt/UR-1D9F07B0D8F84938887817B05FC83E90-4 new file mode 100644 index 0000000000000000000000000000000000000000..b4f8308f180ccf5be6097d70b360e6cc9ba0ffeb GIT binary patch literal 26391 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 bh5r$F@gg4mDVski#DAD<>^@U2NZRs0#}V_= literal 0 HcmV?d00001 diff --git a/src/main/java/nlib/bbs/service/AttachFileVO.java b/src/main/java/nlib/bbs/service/AttachFileVO.java new file mode 100644 index 00000000..169d94d9 --- /dev/null +++ b/src/main/java/nlib/bbs/service/AttachFileVO.java @@ -0,0 +1,167 @@ +package nlib.bbs.service; + +/** + *
    + * @Class Name : AttachFileVO.java
    + * 
    + * @Description : 첨부파일 정보 VO 
    + * 
    + * 
    + * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
    + *
    + * 
    + * + * @ ------------ -------- --------------------------- + * @ 수정일 수정자 수정내용 + * @ ------------ -------- --------------------------- + * @ 2021. 9. 14. KNKIM 최초 생성 + * + * + * @author 이씨플라자 * DIGITALSHIP KNKIM + * @since 2021. 9. 14. + * @version 1.0 + * + */ +public class AttachFileVO { + + private String subPathKey; /* 첨부파일서브경로 */ + + private String fileMask; /* 첨부파일아이디 */ + private String fileId; /* 업무 아이디 */ + private int fileSeq; /* 파일 번호 */ + private String fileName; /* 파일 이름 */ + private int fileSize; /* 파일 사이즈 */ + private String fileTypeCd; /* 파일 유형(디지털화사용) */ + private int downloadCount; /* 파일 다운로드 횟수 */ + private String downloadExpireDate; /* 파일 만료 날짜 */ + private int downloadLimitCount; /* 파일 다운로드 제한 횟수 */ + + private String deleteYn; /* 삭제 여부 */ + private String streamingUrl; /* 스트리밍URL */ + private String content; /* 내용주기 */ + private String atchTypeCd; /* 첨부파일유형 */ + + private String regDd; /* 등록 날짜 */ + + + public String getFileMask() { + return fileMask; + } + + public void setFileMask(String fileMask) { + this.fileMask = fileMask; + } + + public String getFileId() { + return fileId; + } + + public void setFileId(String fileId) { + this.fileId = fileId; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileTypeCd() { + return fileTypeCd; + } + + public void setFileTypeCd(String fileTypeCd) { + this.fileTypeCd = fileTypeCd; + } + + public String getDownloadExpireDate() { + return downloadExpireDate; + } + + public void setDownloadExpireDate(String downloadExpireDate) { + this.downloadExpireDate = downloadExpireDate; + } + + public String getDeleteYn() { + return deleteYn; + } + + public void setDeleteYn(String deleteYn) { + this.deleteYn = deleteYn; + } + + public String getStreamingUrl() { + return streamingUrl; + } + + public void setStreamingUrl(String streamingUrl) { + this.streamingUrl = streamingUrl; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getAtchTypeCd() { + return atchTypeCd; + } + + public void setAtchTypeCd(String atchTypeCd) { + this.atchTypeCd = atchTypeCd; + } + + public String getRegDd() { + return regDd; + } + + public void setRegDd(String regDd) { + this.regDd = regDd; + } + + public int getFileSeq() { + return fileSeq; + } + + public void setFileSeq(int fileSeq) { + this.fileSeq = fileSeq; + } + + public int getFileSize() { + return fileSize; + } + + public void setFileSize(int fileSize) { + this.fileSize = fileSize; + } + + public int getDownloadCount() { + return downloadCount; + } + + public void setDownloadCount(int downloadCount) { + this.downloadCount = downloadCount; + } + + public int getDownloadLimitCount() { + return downloadLimitCount; + } + + public void setDownloadLimitCount(int downloadLimitCount) { + this.downloadLimitCount = downloadLimitCount; + } + + public String getSubPathKey() { + return subPathKey; + } + + public void setSubPathKey(String subPathKey) { + this.subPathKey = subPathKey; + } + +} diff --git a/src/main/java/nlib/bbs/service/impl/BoardServiceImpl.java b/src/main/java/nlib/bbs/service/impl/BoardServiceImpl.java new file mode 100644 index 00000000..84b4508b --- /dev/null +++ b/src/main/java/nlib/bbs/service/impl/BoardServiceImpl.java @@ -0,0 +1,68 @@ +package nlib.bbs.service.impl; + +import java.util.List; + +import javax.annotation.Resource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import nlib.bbs.service.ArticleVO; +import nlib.bbs.service.BoardService; +import nlib.util.StringUtil; + +public abstract class BoardServiceImpl implements BoardService +{ + static Logger log = LoggerFactory.getLogger(BoardServiceImpl.class); + + public abstract BoardDAO getBoardDAO(); + + /* + * 게시글 목록을 조회한다. + */ + public List listArticles(ArticleVO articleVO) throws Exception { + + return getBoardDAO().listArticles(articleVO); + } + + /** + * 게시글 건수를 조회한다. + */ + public int countArticles(ArticleVO articleVO) throws Exception { + + return getBoardDAO().countArticles(articleVO); + } + + + /** + * 조회수를 증가시킨다. + * + * @param + * @return + * @throws Exception + */ + public int updateRead(ArticleVO articleVO) throws Exception { + return getBoardDAO().updateRead(articleVO); + } + + /** + * 게시글 상세 내용을 조회한다. + * + * @param + * @return + * @throws Exception + */ + public ArticleVO selectArticle(ArticleVO articleVO) throws Exception { + + // 게시글 조회 + ArticleVO retVO = getBoardDAO().selectArticle(articleVO); + // 첨부파일 조회 + if(StringUtil.isNotEmpty(retVO.getBdAttachFileId())) retVO.setAttachFiles(getBoardDAO().listAttachFiles(retVO.getBdAttachFileId())); + // 조회수 증가 + updateRead(articleVO); + + return retVO; + } + +} \ No newline at end of file diff --git a/src/main/java/nlib/cmm/fileupload/FileVO.java b/src/main/java/nlib/cmm/fileupload/FileVO.java new file mode 100644 index 00000000..874e1046 --- /dev/null +++ b/src/main/java/nlib/cmm/fileupload/FileVO.java @@ -0,0 +1,64 @@ +package nlib.cmm.fileupload; + +/** + *
    + * @Class Name : AttachFileVO.java
    + * 
    + * @Description : 첨부파일 정보 VO 
    + * 
    + * 
    + * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
    + *
    + * 
    + * + * @ ------------ -------- --------------------------- + * @ 수정일 수정자 수정내용 + * @ ------------ -------- --------------------------- + * @ 2021. 9. 14. KNKIM 최초 생성 + * + * + * @author 이씨플라자 * DIGITALSHIP KNKIM + * @since 2021. 9. 14. + * @version 1.0 + * + */ +public class FileVO { + + private String subPathKey; /* 첨부파일서브경로 */ + private String fileMask; /* 첨부파일아이디 */ + private String fileId; /* 업무 아이디 */ + private int fileSeq; /* 파일 번호 */ + private String fileName; /* 파일 이름 */ + + public String getSubPathKey() { + return subPathKey; + } + public void setSubPathKey(String subPathKey) { + this.subPathKey = subPathKey; + } + public String getFileMask() { + return fileMask; + } + public void setFileMask(String fileMask) { + this.fileMask = fileMask; + } + public String getFileId() { + return fileId; + } + public void setFileId(String fileId) { + this.fileId = fileId; + } + public int getFileSeq() { + return fileSeq; + } + public void setFileSeq(int fileSeq) { + this.fileSeq = fileSeq; + } + public String getFileName() { + return fileName; + } + public void setFileName(String fileName) { + this.fileName = fileName; + } + +} diff --git a/src/main/webapp/WEB-INF/jsp/nlib/bbs/selectAncmntArticle.jsp b/src/main/webapp/WEB-INF/jsp/nlib/bbs/selectAncmntArticle.jsp new file mode 100644 index 00000000..cb35059b --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/nlib/bbs/selectAncmntArticle.jsp @@ -0,0 +1,155 @@ +<% +/** + *
    + * @Class Name : selectAncmntArticle.jsp
    + * 
    + * @Description : 공지사항 상세내용을 조회한다.
    + * 
    + * 
    + * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
    + *
    + * 
    + * + * @ ------------ -------- --------------------------- + * @ 수정일 수정자 수정내용 + * @ ------------ -------- --------------------------- + * @ 2021. 9. 14. KNKIM 최초 생성 + * + * + * @author 이씨플라자 * DIGITALSHIP KNKIM + * @since 2021. 9. 14. + * @version 1.0 + * + */ + %> +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %> + +공지사항 - 상세조회 + + + + +${pageTitle} + + + + + + + +

    ${pageTitle }

    + +메시지 : ${message } +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    유형 + 공지 + 일반 + + 작성일${article.regDd }
    제목${article.title}
    질문내용${article.content}
    + <% + // 파일정보 : 저장파일ID=원파일명 + %> + + ${attachFile.fileName} (${attachFile.fileSize} byte(s))
    +
    +
    첨부파일 없음 +
    + +
    + + + + + + +
    + + +
    + + + + +
    + + + diff --git a/src/main/webapp/temp/date.txt b/src/main/webapp/temp/date.txt new file mode 100644 index 00000000..5aab76d2 --- /dev/null +++ b/src/main/webapp/temp/date.txt @@ -0,0 +1 @@ +Tue Sep 14 2021 08:25:17 GMT+0900 (대한민국 표준시) \ No newline at end of file diff --git a/src/main/webapp/temp/test.js b/src/main/webapp/temp/test.js new file mode 100644 index 00000000..e69de29b From 56caa3dc327290459fca422c570b561cd8c91779 Mon Sep 17 00:00:00 2001 From: KNKIM Date: Wed, 15 Sep 2021 09:16:06 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=ED=8C=8C=EB=B9=84=EC=BD=98=20=EC=97=86?= =?UTF-8?q?=EC=9D=8C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/webapp/WEB-INF/tiles/tiles-layout.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/WEB-INF/tiles/tiles-layout.jsp b/src/main/webapp/WEB-INF/tiles/tiles-layout.jsp index d720d19f..825e1ff8 100644 --- a/src/main/webapp/WEB-INF/tiles/tiles-layout.jsp +++ b/src/main/webapp/WEB-INF/tiles/tiles-layout.jsp @@ -11,7 +11,7 @@ - + From 80391c555ed45f69ebb04a08b4fbbf06c7ec2f23 Mon Sep 17 00:00:00 2001 From: KNKIM Date: Wed, 15 Sep 2021 09:21:19 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=EC=9E=84=EC=8B=9C=20=ED=8C=8C=EB=B9=84?= =?UTF-8?q?=EC=BD=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/webapp/favicon.ico | Bin 0 -> 15406 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/webapp/favicon.ico diff --git a/src/main/webapp/favicon.ico b/src/main/webapp/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..81800f7fb06a395808a68bbb63fbfa1224379148 GIT binary patch literal 15406 zcmeHNX>3$g6n+Q_2`riZ zzq_4x&ry^%+A9fjm*ZXk;-hjX2)jLPhJ)GVIinqPmOY)!RZI#bKT zX?@b${A@+SibvMaJnST`gS_t?p z4cW}GDryQF&tltv>r2^I;^@Tgwa=g#Ze%&V-0OR%EPCzEW@H zSGHR+AQ_Mh^dttbKcUb_|a90a^$0`1s z=u%Z2U9C-KTP3|RrrSMsSNeP!Z|Xx~dD~duslq*czdK_g-)~A8&-ZvopJ5-sK0(># z>IAl7CYt)OtpwW$<*=Lnw*1NU`1^t;b=l%~=KXj~2c$w=;EeqGH^!l&rKc2gp$LgW%bwTPM z!Th7oKaP5s>r&^Em*N{Ys($pbF_`9`8qT`Wk3VHDWnO*hSJ$6XdoE>FCD1RI zmWgY;Ceu~>_3ID5VKDzO{_uT(_M=a+E(Mdi(tjl9Yq8EPp;B9}w*IK&KNy{Q*{<|2 zjD3=M24DL2>%Rx}b=}H;yZAn>b(NB{+2$pV`JG&POssYLsLoZ+-?7`$rqj>e^tV?f z@gq8SRU~fzh{TC%-Q0DlwF-f-zL9Di^ZAzzO3cK=aC;! z8)}>uS{OT$&)jg%kGKvbkHEh*ZJKuG2|oxD&V3Otfpbt_d1LZ8vbk$%OX^hZohb7z zmghJR)7@M?DXc$D3%_4`XT0ey+LZi0)j7-gU4MT5OZ@P~%#RsP^F+MIq_FljO+GPz zBJ#fXyAOiJKR5a@?mzUQnsNSZZ>sN>|HZLSQHkvu_qpoZL7#pe_uNfqqrUng82mWb zhc6B>H=Q%)Pj};I)!A2B4s%$IpHasod|Cda;P4Ni+`3dlHNfOAepKM`w9=OeFKKfD zbK9TPQ}Cm`J1)%8@E^(9;MW}RiC^%c=g(;U!Cbpt{DbSA7w2jC;WI;U#+k{liLmd_wx95Uo_fqXYjwm^A{Y$7xQV%6B_=E z%GmCx=jVF-6U6?pEbe)VEZ9YRGM0$=!hu{L)|vE*7=B;Be+4^!;NQF;{J<4g*K8^d0$?uAI z&Ze$lYtQufQOAMHtG)L0i9*Njj70?BJ<{#Ozx4DowB?^E0(U#_;A)PD(S*;{pScS> zo$WXH{V-O(IX8}$o_UrIWUZnaM~PNnAoz{!H@*FX{R{RY{NkU9w!pWaRC1JB{Nx_^ zjS_4(*tAx6v*l#sc%YqS0*Fd~m%vbqd?Y zu#e-54)h587@vq^M+^nBuki}}_|`)EkTIW7hJ7)z;0KDx-y!0#j{1~0Bt;fV1|$QL Y0m*=5Kr$d1=!Fc3@F1Ba1Gmh;ztdp-)c^nh literal 0 HcmV?d00001 From 78dc5c322999a8b4bb623b33073fe8ba3017db2b Mon Sep 17 00:00:00 2001 From: KNKIM Date: Wed, 15 Sep 2021 09:31:03 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=EC=9E=84=EC=8B=9C=20=ED=8C=8C=EB=B9=84?= =?UTF-8?q?=EC=BD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webapp/favicon/android-chrome-192x192.png | Bin 0 -> 5830 bytes .../webapp/favicon/android-chrome-512x512.png | Bin 0 -> 21758 bytes src/main/webapp/favicon/apple-touch-icon.png | Bin 0 -> 5231 bytes src/main/webapp/favicon/favicon-16x16.png | Bin 0 -> 431 bytes src/main/webapp/favicon/favicon-32x32.png | Bin 0 -> 746 bytes src/main/webapp/favicon/favicon.ico | Bin 0 -> 15406 bytes src/main/webapp/favicon/site.webmanifest | 1 + 7 files changed, 1 insertion(+) create mode 100644 src/main/webapp/favicon/android-chrome-192x192.png create mode 100644 src/main/webapp/favicon/android-chrome-512x512.png create mode 100644 src/main/webapp/favicon/apple-touch-icon.png create mode 100644 src/main/webapp/favicon/favicon-16x16.png create mode 100644 src/main/webapp/favicon/favicon-32x32.png create mode 100644 src/main/webapp/favicon/favicon.ico create mode 100644 src/main/webapp/favicon/site.webmanifest diff --git a/src/main/webapp/favicon/android-chrome-192x192.png b/src/main/webapp/favicon/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..68ecc1b5114474c88fe8d0c10306893cca84f7e9 GIT binary patch literal 5830 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 MOZ#Slvc-%42Yr9StN;K2 literal 0 HcmV?d00001 diff --git a/src/main/webapp/favicon/apple-touch-icon.png b/src/main/webapp/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2117567f7f376d7fc12b8a1f11eb348c980b8d GIT binary patch literal 5231 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 Z005j+($PvF`K$l{002ovPDHLkV1nx4wGjXS literal 0 HcmV?d00001 diff --git a/src/main/webapp/favicon/favicon-32x32.png b/src/main/webapp/favicon/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..06bdee2169149d37ebdbc124543c8385b620d1b5 GIT binary patch literal 746 zcmVPx%q)9|UR9HvtmfcHJVI0T5=jekm8`;7j}woFdr_>&M*a#dr*Sa@#?kk1 z`6jSAJ`LV!Ul5=x?=sqK2FPdz$5VYR69T-> zzlM!6<)Q$ay3gT_YY>5fYLS8ikWxY{qeZZK9Nf^8svx;MAH*5;9@Krfhf9|GIHoMb zO}B$&2c z2TfAZ0nF{y-YpHNG`EKVuwWq|NN$};5V)Ip8YM}23-`cG5p9sHhFY8m+k^uqw-qWT zflF?W)50Zr?#W-SMZen?ETVuNgQE{pis6dq&QLds6%!iJh~9!f@$bq5@CJAT cyaC?8FD8W$zusOUUH||907*qoM6N<$f;hfZEdT%j literal 0 HcmV?d00001 diff --git a/src/main/webapp/favicon/favicon.ico b/src/main/webapp/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..81800f7fb06a395808a68bbb63fbfa1224379148 GIT binary patch literal 15406 zcmeHNX>3$g6n+Q_2`riZ zzq_4x&ry^%+A9fjm*ZXk;-hjX2)jLPhJ)GVIinqPmOY)!RZI#bKT zX?@b${A@+SibvMaJnST`gS_t?p z4cW}GDryQF&tltv>r2^I;^@Tgwa=g#Ze%&V-0OR%EPCzEW@H zSGHR+AQ_Mh^dttbKcUb_|a90a^$0`1s z=u%Z2U9C-KTP3|RrrSMsSNeP!Z|Xx~dD~duslq*czdK_g-)~A8&-ZvopJ5-sK0(># z>IAl7CYt)OtpwW$<*=Lnw*1NU`1^t;b=l%~=KXj~2c$w=;EeqGH^!l&rKc2gp$LgW%bwTPM z!Th7oKaP5s>r&^Em*N{Ys($pbF_`9`8qT`Wk3VHDWnO*hSJ$6XdoE>FCD1RI zmWgY;Ceu~>_3ID5VKDzO{_uT(_M=a+E(Mdi(tjl9Yq8EPp;B9}w*IK&KNy{Q*{<|2 zjD3=M24DL2>%Rx}b=}H;yZAn>b(NB{+2$pV`JG&POssYLsLoZ+-?7`$rqj>e^tV?f z@gq8SRU~fzh{TC%-Q0DlwF-f-zL9Di^ZAzzO3cK=aC;! z8)}>uS{OT$&)jg%kGKvbkHEh*ZJKuG2|oxD&V3Otfpbt_d1LZ8vbk$%OX^hZohb7z zmghJR)7@M?DXc$D3%_4`XT0ey+LZi0)j7-gU4MT5OZ@P~%#RsP^F+MIq_FljO+GPz zBJ#fXyAOiJKR5a@?mzUQnsNSZZ>sN>|HZLSQHkvu_qpoZL7#pe_uNfqqrUng82mWb zhc6B>H=Q%)Pj};I)!A2B4s%$IpHasod|Cda;P4Ni+`3dlHNfOAepKM`w9=OeFKKfD zbK9TPQ}Cm`J1)%8@E^(9;MW}RiC^%c=g(;U!Cbpt{DbSA7w2jC;WI;U#+k{liLmd_wx95Uo_fqXYjwm^A{Y$7xQV%6B_=E z%GmCx=jVF-6U6?pEbe)VEZ9YRGM0$=!hu{L)|vE*7=B;Be+4^!;NQF;{J<4g*K8^d0$?uAI z&Ze$lYtQufQOAMHtG)L0i9*Njj70?BJ<{#Ozx4DowB?^E0(U#_;A)PD(S*;{pScS> zo$WXH{V-O(IX8}$o_UrIWUZnaM~PNnAoz{!H@*FX{R{RY{NkU9w!pWaRC1JB{Nx_^ zjS_4(*tAx6v*l#sc%YqS0*Fd~m%vbqd?Y zu#e-54)h587@vq^M+^nBuki}}_|`)EkTIW7hJ7)z;0KDx-y!0#j{1~0Bt;fV1|$QL Y0m*=5Kr$d1=!Fc3@F1Ba1Gmh;ztdp-)c^nh literal 0 HcmV?d00001 diff --git a/src/main/webapp/favicon/site.webmanifest b/src/main/webapp/favicon/site.webmanifest new file mode 100644 index 00000000..45dc8a20 --- /dev/null +++ b/src/main/webapp/favicon/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file