This commit is contained in:
JSYOO 2021-09-16 14:45:22 +09:00
commit 2a34ac44e3
22 changed files with 1323 additions and 827 deletions

View File

@ -21,6 +21,13 @@ public class ArticleVO extends PagingVO {
private String postStartDate; /* 게시시작일자 */ private String postStartDate; /* 게시시작일자 */
private String postEndDate; /* 게시종료일자 */ private String postEndDate; /* 게시종료일자 */
// FAQ, QNA관련
private String answer; /* 답변 */
private String answerYn; /* 답변여부 */
private String useYn; /* 사용여부 */
private String questionType; /* 질문유형 */
private String questionTypeName; /* 질문유형명 */
private int viewCnt; /* 조회수 */ private int viewCnt; /* 조회수 */
private String bdAttachFileId; /* 첨부파일아이디 */ private String bdAttachFileId; /* 첨부파일아이디 */
private String attachYn; /* 첨부파일존재여부 */ private String attachYn; /* 첨부파일존재여부 */
@ -36,10 +43,15 @@ public class ArticleVO extends PagingVO {
// 검색관련 // 검색관련
private String searchType; /* 검색대상구분 */ private String searchType; /* 검색대상구분 */
private String searchKeyword; /* 검색어 */ private String searchKeyword; /* 검색어 */
private String searchQuestionType; /* 검색FAQ유형 */
// 첨부파일 // 첨부파일
private List<AttachFileVO> attachFiles = null; /* 첨부파일목록 */ private List<AttachFileVO> attachFiles = null; /* 첨부파일목록 */
// SETTER & GETTER
public int getAttachFileCnt() { public int getAttachFileCnt() {
if(attachFiles == null) return 0; if(attachFiles == null) return 0;
return attachFiles.size(); return attachFiles.size();
@ -186,6 +198,53 @@ public class ArticleVO extends PagingVO {
public void setAttachFiles(List<AttachFileVO> attachFiles) { public void setAttachFiles(List<AttachFileVO> attachFiles) {
this.attachFiles = attachFiles; this.attachFiles = attachFiles;
} }
public String getAnswerYn() {
return answerYn;
}
public void setAnswerYn(String answerYn) {
this.answerYn = answerYn;
}
public String getUseYn() {
return useYn;
}
public void setUseYn(String useYn) {
this.useYn = useYn;
}
public String getQuestionType() {
return questionType;
}
public void setQuestionType(String questionType) {
this.questionType = questionType;
}
public String getQuestionTypeName() {
return questionTypeName;
}
public void setQuestionTypeName(String questionTypeName) {
this.questionTypeName = questionTypeName;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public String getSearchQuestionType() {
return searchQuestionType;
}
public void setSearchQuestionType(String searchQuestionType) {
this.searchQuestionType = searchQuestionType;
}
} }

View File

@ -2,13 +2,11 @@ package nlib.bbs.service.impl;
import java.util.List; import java.util.List;
import javax.annotation.Resource;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import nlib.bbs.service.ArticleVO; import nlib.bbs.service.ArticleVO;
import nlib.bbs.service.AttachFileVO;
import nlib.bbs.service.BoardService; import nlib.bbs.service.BoardService;
import nlib.util.StringUtil; import nlib.util.StringUtil;
@ -55,10 +53,16 @@ public abstract class BoardServiceImpl implements BoardService
*/ */
public ArticleVO selectArticle(ArticleVO articleVO) throws Exception { public ArticleVO selectArticle(ArticleVO articleVO) throws Exception {
if(StringUtil.isEmpty(articleVO.getArticleId())) return null;
// 게시글 조회 // 게시글 조회
ArticleVO retVO = getBoardDAO().selectArticle(articleVO); ArticleVO retVO = getBoardDAO().selectArticle(articleVO);
// 첨부파일 조회 // 첨부파일 조회
if(StringUtil.isNotEmpty(retVO.getBdAttachFileId())) retVO.setAttachFiles(getBoardDAO().listAttachFiles(retVO.getBdAttachFileId())); if(StringUtil.isNotEmpty(retVO.getBdAttachFileId())) {
String attachFileId = retVO.getBdAttachFileId();
List<AttachFileVO> listFile = getBoardDAO().listAttachFiles(attachFileId);
retVO.setAttachFiles(listFile);
}
// 조회수 증가 // 조회수 증가
updateRead(articleVO); updateRead(articleVO);

View File

@ -0,0 +1,12 @@
package nlib.bbs.service.impl;
import egovframework.rte.psl.dataaccess.mapper.Mapper;
@Mapper("faqDAO")
public interface FaqDAO extends BoardDAO {
/*
* BoardDAO 상속 내용과 동일
*/
}

View File

@ -0,0 +1,28 @@
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;
@Service("faqService")
public class FaqServiceImpl extends BoardServiceImpl
{
static Logger log = LoggerFactory.getLogger(FaqServiceImpl.class);
@Resource(name="faqDAO")
FaqDAO faqDAO;
@Override
public BoardDAO getBoardDAO() {
return faqDAO;
}
}

View File

@ -0,0 +1,12 @@
package nlib.bbs.service.impl;
import egovframework.rte.psl.dataaccess.mapper.Mapper;
@Mapper("qnaDAO")
public interface QnaDAO extends BoardDAO {
/*
* BoardDAO 상속 내용과 동일
*/
}

View File

@ -0,0 +1,21 @@
package nlib.bbs.service.impl;
import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service("qnaService")
public class QnaServiceImpl extends BoardServiceImpl
{
static Logger log = LoggerFactory.getLogger(QnaServiceImpl.class);
@Resource(name="qnaDAO")
QnaDAO qnaDAO;
@Override
public BoardDAO getBoardDAO() {
return qnaDAO;
}
}

View File

@ -34,9 +34,9 @@ import nlib.user.service.NlibLoginVO;
import nlib.util.StringUtil; import nlib.util.StringUtil;
@Controller @Controller
public class BoardController extends NlibCommonController public class BoardControllerApi extends NlibCommonController
{ {
private static final Logger log = LoggerFactory.getLogger(BoardController.class); private static final Logger log = LoggerFactory.getLogger(BoardControllerApi.class);
static final String DEFUALT_PAGE_SIZE = NlibProperty.getProperty("list.paging.page.size"); static final String DEFUALT_PAGE_SIZE = NlibProperty.getProperty("list.paging.page.size");

View File

@ -22,12 +22,15 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.support.RequestContextUtils; import org.springframework.web.servlet.support.RequestContextUtils;
import nlib.bbs.service.ArticleVO;
import nlib.bbs.service.BoardService;
import nlib.bbs.service.BoardServiceApi; import nlib.bbs.service.BoardServiceApi;
import nlib.cmm.NlibCommonController; import nlib.cmm.NlibCommonController;
import nlib.cmm.crypto.AriaCrypto; import nlib.cmm.crypto.AriaCrypto;
import nlib.cmm.crypto.NlibPasswordEncoder; import nlib.cmm.crypto.NlibPasswordEncoder;
import nlib.cmm.service.CodeService; import nlib.cmm.service.CodeService;
import nlib.cmm.service.NlibProperty; import nlib.cmm.service.NlibProperty;
import nlib.cmm.service.NotificationVO;
import nlib.restful.service.DataApiReqVO; import nlib.restful.service.DataApiReqVO;
import nlib.restful.service.DataApiResVO; import nlib.restful.service.DataApiResVO;
import nlib.user.service.NlibLoginVO; import nlib.user.service.NlibLoginVO;
@ -36,150 +39,94 @@ import nlib.util.StringUtil;
@Controller @Controller
public class FaqController extends NlibCommonController { public class FaqController extends NlibCommonController {
// private static final Logger log = LoggerFactory.getLogger(FaqController.class); private static final Logger log = LoggerFactory.getLogger(FaqController.class);
//
// static final String DEFUALT_PAGE_SIZE = NlibProperty.getProperty("list.paging.page.size"); static final int DEFUALT_PAGE_SIZE = NlibProperty.getInt("list.paging.page.size", 10);
//
// @Resource(name = "boardService") @Resource(name = "faqService")
// private BoardService boardService; private BoardService faqService;
//
// @Resource(name = "nlibPasswordEncoder") @Resource(name="codeService")
// private NlibPasswordEncoder nlibPasswordEncoder; private CodeService codeService;
//
// @Resource(name = "ariaCrypto")
// private AriaCrypto ariaCrypto;
//
// @Resource(name = "codeService")
// private CodeService codeService;
//
//
// @Autowired
// private AuthenticationManager authenticationManager;
//
// /**
// * FAQ 목록 화면을 표출한다.
// *
// * @param req
// * @return
// */
// @RequestMapping("/board/listFAQs.do")
// public String listFAQs(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception {
//
// String searchKeyword = paramMap.get("searchKeyword");
// String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
// String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
// String message = paramMap.get("message");
// String faqType = paramMap.get("faqType");
//
// log.debug("listFAQs > pageIndex = " + pageIndex);
// log.debug("listFAQs > pageSize = " + pageSize);
// log.debug("listFAQs > searchKeyword = " + searchKeyword);
// log.debug("listFAQs > message = " + message);
// log.debug("listFAQs > faqType = " + faqType);
//
// DataApiReqVO reqVOforCode = new DataApiReqVO();
// reqVOforCode.setPageIndex(0);
// reqVOforCode.setPageSize(0);
//
//
// // 페이징 사이즈 코드 목록 조회
// List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION");
//
// // 유형 코드 목록 조회
// List<HashMap<String,String>> articleTypeCodes = codeService.listCodes("FAQ_TYPE");
//
// // 반환 정보
// model.addAttribute("pageIndex" , pageIndex);
// model.addAttribute("pageSize" , pageSize);
// model.addAttribute("searchKeyword", searchKeyword);
// model.addAttribute("pageSizeCodes", pageSizeCodes);
// model.addAttribute("faqTypeCodes" , articleTypeCodes);
// model.addAttribute("message" , message);
// model.addAttribute("faqType" , faqType);
// model.addAttribute("faqType" , faqType);
//
// return "nlib/board/listFAQs";
// }
//
//
// /**
// * FAQ 목록 조회한다.
// *
// * @param req
// * @return
// */
// @RequestMapping(value="/board/listFAQsAjax.do")
// public ResponseEntity<String> listFAQsAjax(HttpServletRequest req,
// Authentication authentication, @RequestBody Map<String, String> paramMap) throws Exception {
//
// String searchKeyword = paramMap.get("searchKeyword");
// String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
// String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
// String faqType = paramMap.get("faqType");
//
// log.debug("listFAQsAjax > pageIndex = " + pageIndex);
// log.debug("listFAQsAjax > pageSize = " + pageSize);
// log.debug("listFAQsAjax > searchKeyword = " + searchKeyword);
// log.debug("listFAQsAjax > faqType = " + faqType);
//
// //-------------------------------
// // REQ VO 구성
// //-------------------------------
// DataApiReqVO reqVO = new DataApiReqVO();
// reqVO.setPageIndex(pageIndex);
// reqVO.setPageSize(pageSize);
// reqVO.addInfoItem("searchKeyword", searchKeyword);
// reqVO.addInfoItem("faqType", faqType);
//
// // 요청
// DataApiResVO resVO = boardService.listFAQs(reqVO);
//
// //-------------------------------
// // JSON변환 응답 처리
// //-------------------------------
// // JS-GRID 페이징 처리를 포함한 응답값 처리
// // {data: [{...}],
// // itemsCount: 255
// // }
// HashMap<String, Object> retMap = new HashMap<String, Object>();
// retMap.put("data", resVO.getList());
// retMap.put("itemsCount", resVO.getRecordTotCount());
//
// return makeResponseEntityJson(retMap);
// }
//
//
// /**
// * 묻고답하기 상세 내용 조회한다.
// *
// * @param req
// * @return
// */
// @RequestMapping("/board/selectFAQAjax.do")
// public ResponseEntity<String> selectFAQAjax(HttpServletRequest req, Authentication authentication, @RequestBody Map<String, String> paramMap) throws Exception {
//
// // 게시물 번호
// String articleNo = paramMap.get("articleNo");
//
// log.debug("selectQnA > articleNo = " + articleNo);
//
// //-------------------------------
// // REQ VO 구성
// //-------------------------------
// DataApiReqVO reqVO = new DataApiReqVO();
// reqVO.addInfoItem("boardNo", "FAQ"); // 게시판ID
// reqVO.addInfoItem("articleNo", articleNo); // 게시물번호
//
// // 요청
// DataApiResVO resVO = boardService.selectFAQ(reqVO);
//
// // 반환 정보
// return makeResponseEntityJson(resVO.getInfo());
// }
//
// @RequestMapping("/board/verifyWriter.do")
// public String verifyWriter(HttpServletRequest req) throws Exception {
// return "nlib/board/verifyWriter";
// }
/**
* 목록 화면을 표시한다.
*
* @param req
* @return
*/
@RequestMapping("/bbs/listFaqs.do")
public String listFaqs(
HttpServletRequest req,
@RequestParam Map<String, String> paramMap,
ArticleVO searchArticleVO,
ModelMap model
) throws Exception {
List<HashMap<String, String>> questionTypeList = codeService.listCodes("FAQ_TYPE_CD");
model.addAttribute("questionTypeList", questionTypeList);
model.addAttribute("searchArticle", searchArticleVO);
return "nlib/bbs/listFaqs";
}
/**
* 목록 조회한다.
*
* @param req
* @return
*/
@RequestMapping(value="/bbs/listFaqsAjax.do")
public ResponseEntity<String> listFaqsAjax(
HttpServletRequest req,
Authentication authentication,
@RequestBody ArticleVO searchArticleVO) throws Exception {
if(searchArticleVO.getPageIndex() < 1) searchArticleVO.setPageIndex(1);
if(searchArticleVO.getPageSize() < 1) searchArticleVO.setPageSize(DEFUALT_PAGE_SIZE);
List<ArticleVO> list = faqService.listArticles(searchArticleVO);
int totRecordCount = faqService.countArticles(searchArticleVO);
//-------------------------------
// JSON변환 응답 처리
//-------------------------------
// JS-GRID 페이징 처리를 포함한 응답값 처리
// {data: [{...}],
// itemsCount: 255
// }
HashMap<String, Object> retMap = new HashMap<String, Object>();
retMap.put("data", list);
retMap.put("itemsCount", totRecordCount);
return makeResponseEntityJson(retMap);
}
/**
* 알림 상세 내용 조회한다.
*
* @param req
* @return
*/
@RequestMapping("/bbs/selectFaqArticleAjax.do")
public ResponseEntity<String> selectFaqArticleAjax(HttpServletRequest req, Authentication authentication, @RequestBody ArticleVO searchArticleVO) throws Exception {
// 읽음처리 상세내용 조회
ArticleVO articleVO = faqService.selectArticle(searchArticleVO);
//-------------------------------
// JSON변환 응답 처리
//-------------------------------
// JS-GRID 페이징 처리를 포함한 응답값 처리
// {data: [{...}],
// itemsCount: 255
// }
HashMap<String, Object> retMap = new HashMap<String, Object>();
retMap.put("data", articleVO);
return makeResponseEntityJson(retMap);
}
} }

View File

@ -22,6 +22,8 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.support.RequestContextUtils; import org.springframework.web.servlet.support.RequestContextUtils;
import nlib.bbs.service.ArticleVO;
import nlib.bbs.service.BoardService;
import nlib.bbs.service.BoardServiceApi; import nlib.bbs.service.BoardServiceApi;
import nlib.cmm.NlibCommonController; import nlib.cmm.NlibCommonController;
import nlib.cmm.crypto.AriaCrypto; import nlib.cmm.crypto.AriaCrypto;
@ -36,150 +38,81 @@ import nlib.util.StringUtil;
@Controller @Controller
public class QnaController extends NlibCommonController public class QnaController extends NlibCommonController
{ {
// private static final Logger log = LoggerFactory.getLogger(QnaController.class); private static final Logger log = LoggerFactory.getLogger(QnaController.class);
//
// static final String DEFUALT_PAGE_SIZE = NlibProperty.getProperty("list.paging.page.size"); static final int DEFUALT_PAGE_SIZE = NlibProperty.getInt("list.paging.page.size", 10);
//
// @Resource(name = "boardService") @Resource(name = "qnaService")
// private BoardService boardService; private BoardService qnaService;
//
// @Resource(name = "nlibPasswordEncoder") /**
// private NlibPasswordEncoder nlibPasswordEncoder; * 목록 화면을 표시한다.
// *
// @Resource(name = "ariaCrypto") * @param req
// private AriaCrypto ariaCrypto; * @return
// */
// @Resource(name = "codeService") @RequestMapping("/bbs/listQnas.do")
// private CodeService codeService; public String listQnas(
// HttpServletRequest req,
// @RequestParam Map<String, String> paramMap,
// @Autowired ArticleVO searchArticleVO,
// private AuthenticationManager authenticationManager; ModelMap model
// ) throws Exception {
// /**
// * FAQ 목록 화면을 표출한다.
// *
// * @param req
// * @return
// */
// @RequestMapping("/board/listFAQs.do")
// public String listFAQs(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception {
//
// String searchKeyword = paramMap.get("searchKeyword");
// String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
// String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
// String message = paramMap.get("message");
// String faqType = paramMap.get("faqType");
//
// log.debug("listFAQs > pageIndex = " + pageIndex);
// log.debug("listFAQs > pageSize = " + pageSize);
// log.debug("listFAQs > searchKeyword = " + searchKeyword);
// log.debug("listFAQs > message = " + message);
// log.debug("listFAQs > faqType = " + faqType);
//
// DataApiReqVO reqVOforCode = new DataApiReqVO();
// reqVOforCode.setPageIndex(0);
// reqVOforCode.setPageSize(0);
//
//
// // 페이징 사이즈 코드 목록 조회
// List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION");
//
// // 유형 코드 목록 조회
// List<HashMap<String,String>> articleTypeCodes = codeService.listCodes("FAQ_TYPE");
//
// // 반환 정보
// model.addAttribute("pageIndex" , pageIndex);
// model.addAttribute("pageSize" , pageSize);
// model.addAttribute("searchKeyword", searchKeyword);
// model.addAttribute("pageSizeCodes", pageSizeCodes);
// model.addAttribute("faqTypeCodes" , articleTypeCodes);
// model.addAttribute("message" , message);
// model.addAttribute("faqType" , faqType);
// model.addAttribute("faqType" , faqType);
//
// return "nlib/board/listFAQs";
// }
//
//
// /**
// * FAQ 목록 조회한다.
// *
// * @param req
// * @return
// */
// @RequestMapping(value="/board/listFAQsAjax.do")
// public ResponseEntity<String> listFAQsAjax(HttpServletRequest req,
// Authentication authentication, @RequestBody Map<String, String> paramMap) throws Exception {
//
// String searchKeyword = paramMap.get("searchKeyword");
// String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
// String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
// String faqType = paramMap.get("faqType");
//
// log.debug("listFAQsAjax > pageIndex = " + pageIndex);
// log.debug("listFAQsAjax > pageSize = " + pageSize);
// log.debug("listFAQsAjax > searchKeyword = " + searchKeyword);
// log.debug("listFAQsAjax > faqType = " + faqType);
//
// //-------------------------------
// // REQ VO 구성
// //-------------------------------
// DataApiReqVO reqVO = new DataApiReqVO();
// reqVO.setPageIndex(pageIndex);
// reqVO.setPageSize(pageSize);
// reqVO.addInfoItem("searchKeyword", searchKeyword);
// reqVO.addInfoItem("faqType", faqType);
//
// // 요청
// DataApiResVO resVO = boardService.listFAQs(reqVO);
//
// //-------------------------------
// // JSON변환 응답 처리
// //-------------------------------
// // JS-GRID 페이징 처리를 포함한 응답값 처리
// // {data: [{...}],
// // itemsCount: 255
// // }
// HashMap<String, Object> retMap = new HashMap<String, Object>();
// retMap.put("data", resVO.getList());
// retMap.put("itemsCount", resVO.getRecordTotCount());
//
// return makeResponseEntityJson(retMap);
// }
//
//
// /**
// * 묻고답하기 상세 내용 조회한다.
// *
// * @param req
// * @return
// */
// @RequestMapping("/board/selectFAQAjax.do")
// public ResponseEntity<String> selectFAQAjax(HttpServletRequest req, Authentication authentication, @RequestBody Map<String, String> paramMap) throws Exception {
//
// // 게시물 번호
// String articleNo = paramMap.get("articleNo");
//
// log.debug("selectQnA > articleNo = " + articleNo);
//
// //-------------------------------
// // REQ VO 구성
// //-------------------------------
// DataApiReqVO reqVO = new DataApiReqVO();
// reqVO.addInfoItem("boardNo", "FAQ"); // 게시판ID
// reqVO.addInfoItem("articleNo", articleNo); // 게시물번호
//
// // 요청
// DataApiResVO resVO = boardService.selectFAQ(reqVO);
//
// // 반환 정보
// return makeResponseEntityJson(resVO.getInfo());
// }
//
// @RequestMapping("/board/verifyWriter.do")
// public String verifyWriter(HttpServletRequest req) throws Exception {
// return "nlib/board/verifyWriter";
// }
model.addAttribute("searchArticle", searchArticleVO);
return "nlib/bbs/listQnas";
}
/**
* 목록 조회한다.
*
* @param req
* @return
*/
@RequestMapping(value="/bbs/listQnasAjax.do")
public ResponseEntity<String> listQnasAjax(
HttpServletRequest req,
Authentication authentication,
@RequestBody ArticleVO searchArticleVO) throws Exception {
if(searchArticleVO.getPageIndex() < 1) searchArticleVO.setPageIndex(1);
if(searchArticleVO.getPageSize() < 1) searchArticleVO.setPageSize(DEFUALT_PAGE_SIZE);
List<ArticleVO> list = qnaService.listArticles(searchArticleVO);
int totRecordCount = qnaService.countArticles(searchArticleVO);
//-------------------------------
// JSON변환 응답 처리
//-------------------------------
// JS-GRID 페이징 처리를 포함한 응답값 처리
// {data: [{...}],
// itemsCount: 255
// }
HashMap<String, Object> retMap = new HashMap<String, Object>();
retMap.put("data", list);
retMap.put("itemsCount", totRecordCount);
return makeResponseEntityJson(retMap);
}
/**
* 알림 상세 내용 조회한다.
*
* @param req
* @return
*/
@RequestMapping("/bbs/selectQnaArticle.do")
public String selectQnaArticle(HttpServletRequest req, Authentication authentication, ArticleVO searchArticleVO, ModelMap model) throws Exception {
// 읽음처리 상세내용 조회
ArticleVO articleVO = qnaService.selectArticle(searchArticleVO);
model.addAttribute("searchArticle", searchArticleVO);
model.addAttribute("article", articleVO);
return "nlib/bbs/selectQnaArticle";
}
} }

View File

@ -1,422 +1,422 @@
package nlib.col.web; package nlib.col.web;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import nlib.cmm.NlibCommonController; import nlib.cmm.NlibCommonController;
import nlib.cmm.service.CodeService; import nlib.cmm.service.CodeService;
import nlib.cmm.service.NlibProperty; import nlib.cmm.service.NlibProperty;
import nlib.col.service.RentService; import nlib.col.service.RentService;
import nlib.restful.service.DataApiReqVO; import nlib.restful.service.DataApiReqVO;
import nlib.restful.service.DataApiResVO; import nlib.restful.service.DataApiResVO;
import nlib.util.StringUtil; import nlib.util.StringUtil;
/** /**
* <pre> * <pre>
* @Class Name : RentController.java * @Class Name : RentController.java
* *
* @Description : 대출 Controller * @Description : 대출 Controller
* *
* *
* @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021) * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
* *
* </pre> * </pre>
* *
* @ ------------ -------- --------------------------- * @ ------------ -------- ---------------------------
* @ 수정일 수정자 수정내용 * @ 수정일 수정자 수정내용
* @ ------------ -------- --------------------------- * @ ------------ -------- ---------------------------
* @ 2021. 7. 21. JSYOO 최초 생성 * @ 2021. 7. 21. JSYOO 최초 생성
* *
* *
* @author 이씨플라자 * DIGITALSHIP JSYOO * @author 이씨플라자 * DIGITALSHIP JSYOO
* @since 2021. 7. 21. * @since 2021. 7. 21.
* @version 1.0 * @version 1.0
* *
*/ */
@Controller @Controller
public class RentController extends NlibCommonController public class RentController extends NlibCommonController
{ {
private static final Logger log = LoggerFactory.getLogger(RentController.class); private static final Logger log = LoggerFactory.getLogger(RentController.class);
static final String DEFUALT_PAGE_SIZE = NlibProperty.getProperty("list.paging.page.size"); static final String DEFUALT_PAGE_SIZE = NlibProperty.getProperty("list.paging.page.size");
@Resource(name = "rentService") @Resource(name = "rentService")
private RentService rentService; private RentService rentService;
@Resource(name = "codeService") @Resource(name = "codeService")
private CodeService codeService; private CodeService codeService;
/** 대출 목록 화면을 호출한다. /** 대출 목록 화면을 호출한다.
* @param req * @param req
* @return * @return
*/ */
@RequestMapping("/rent/listRentItems.do") @RequestMapping("/rent/listRentItems.do")
public String listRentItems(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception { public String listRentItems(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception {
String searchKeyword = paramMap.get("searchKeyword"); String searchKeyword = paramMap.get("searchKeyword");
String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1"); String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE); String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
// 페이징 사이즈 코드 목록 조회 (DB방식으로 변경 2021.08.06 KNKIM) // 페이징 사이즈 코드 목록 조회 (DB방식으로 변경 2021.08.06 KNKIM)
List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION"); List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION");
// 반환 정보 // 반환 정보
model.addAttribute("pageIndex" , pageIndex); model.addAttribute("pageIndex" , pageIndex);
model.addAttribute("pageSize" , pageSize); model.addAttribute("pageSize" , pageSize);
model.addAttribute("searchKeyword", searchKeyword); model.addAttribute("searchKeyword", searchKeyword);
model.addAttribute("pageSizeCodes", pageSizeCodes); model.addAttribute("pageSizeCodes", pageSizeCodes);
return "nlib/rent/listRentItems"; return "nlib/rent/listRentItems";
} }
/** /**
* 대출 목록을 조회한다. * 대출 목록을 조회한다.
* *
* @param req * @param req
* @return * @return
*/ */
@RequestMapping(value="/rent/listRentItemsAjax.do") @RequestMapping(value="/rent/listRentItemsAjax.do")
public ResponseEntity<String> listRentItemsAjax(HttpServletRequest req, public ResponseEntity<String> listRentItemsAjax(HttpServletRequest req,
Authentication authentication, @RequestBody Map<String, String> paramMap) { Authentication authentication, @RequestBody Map<String, String> paramMap) {
String searchKeyword = paramMap.get("searchKeyword"); String searchKeyword = paramMap.get("searchKeyword");
String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1"); String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE); String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
//------------------------------- //-------------------------------
// REQ VO 구성 // REQ VO 구성
//------------------------------- //-------------------------------
DataApiReqVO reqVO = new DataApiReqVO(); DataApiReqVO reqVO = new DataApiReqVO();
reqVO.setPageIndex(pageIndex); reqVO.setPageIndex(pageIndex);
reqVO.setPageSize(pageSize); reqVO.setPageSize(pageSize);
reqVO.addInfoItem("searchKeyword", searchKeyword); reqVO.addInfoItem("searchKeyword", searchKeyword);
// 요청 // 요청
DataApiResVO resVO = rentService.listRentItems(reqVO); DataApiResVO resVO = rentService.listRentItems(reqVO);
//------------------------------- //-------------------------------
// JSON변환 응답 처리 // JSON변환 응답 처리
//------------------------------- //-------------------------------
// JS-GRID 페이징 처리를 포함한 응답값 처리 // JS-GRID 페이징 처리를 포함한 응답값 처리
// {data: [{...}], // {data: [{...}],
// itemsCount: 255 // itemsCount: 255
// } // }
HashMap<String, Object> retMap = new HashMap<String, Object>(); HashMap<String, Object> retMap = new HashMap<String, Object>();
retMap.put("data", resVO.getList()); retMap.put("data", resVO.getList());
retMap.put("itemsCount", resVO.getRecordTotCount()); retMap.put("itemsCount", resVO.getRecordTotCount());
return makeResponseEntityJson(retMap); return makeResponseEntityJson(retMap);
} }
/** 대출 목록 화면을 호출한다. /** 대출 목록 화면을 호출한다.
* @param req * @param req
* @return * @return
*/ */
@RequestMapping("/rent/listCanceledRentItems.do") @RequestMapping("/rent/listCanceledRentItems.do")
public String listCanceledRentItems(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception { public String listCanceledRentItems(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception {
String searchKeyword = paramMap.get("searchKeyword"); String searchKeyword = paramMap.get("searchKeyword");
String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1"); String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE); String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
// 페이징 사이즈 코드 목록 조회 (DB방식으로 변경 2021.08.06 KNKIM) // 페이징 사이즈 코드 목록 조회 (DB방식으로 변경 2021.08.06 KNKIM)
List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION"); List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION");
// 반환 정보 // 반환 정보
model.addAttribute("pageIndex" , pageIndex); model.addAttribute("pageIndex" , pageIndex);
model.addAttribute("pageSize" , pageSize); model.addAttribute("pageSize" , pageSize);
model.addAttribute("searchKeyword", searchKeyword); model.addAttribute("searchKeyword", searchKeyword);
model.addAttribute("pageSizeCodes", pageSizeCodes); model.addAttribute("pageSizeCodes", pageSizeCodes);
return "nlib/rent/listCanceledRentItems"; return "nlib/rent/listCanceledRentItems";
} }
/** /**
* 대출 취소 목록을 조회한다. * 대출 취소 목록을 조회한다.
* *
* @param req * @param req
* @return * @return
*/ */
@RequestMapping(value="/rent/listCanceledRentItemsAjax.do") @RequestMapping(value="/rent/listCanceledRentItemsAjax.do")
public ResponseEntity<String> listCanceledRentItemsAjax(HttpServletRequest req, public ResponseEntity<String> listCanceledRentItemsAjax(HttpServletRequest req,
Authentication authentication, @RequestBody Map<String, String> paramMap) { Authentication authentication, @RequestBody Map<String, String> paramMap) {
String searchKeyword = paramMap.get("searchKeyword"); String searchKeyword = paramMap.get("searchKeyword");
String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1"); String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE); String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
//------------------------------- //-------------------------------
// REQ VO 구성 // REQ VO 구성
//------------------------------- //-------------------------------
DataApiReqVO reqVO = new DataApiReqVO(); DataApiReqVO reqVO = new DataApiReqVO();
reqVO.setPageIndex(pageIndex); reqVO.setPageIndex(pageIndex);
reqVO.setPageSize(pageSize); reqVO.setPageSize(pageSize);
reqVO.addInfoItem("searchKeyword", searchKeyword); reqVO.addInfoItem("searchKeyword", searchKeyword);
// 요청 // 요청
DataApiResVO resVO = rentService.listCanceledRentItems(reqVO); DataApiResVO resVO = rentService.listCanceledRentItems(reqVO);
//------------------------------- //-------------------------------
// JSON변환 응답 처리 // JSON변환 응답 처리
//------------------------------- //-------------------------------
// JS-GRID 페이징 처리를 포함한 응답값 처리 // JS-GRID 페이징 처리를 포함한 응답값 처리
// {data: [{...}], // {data: [{...}],
// itemsCount: 255 // itemsCount: 255
// } // }
HashMap<String, Object> retMap = new HashMap<String, Object>(); HashMap<String, Object> retMap = new HashMap<String, Object>();
retMap.put("data", resVO.getList()); retMap.put("data", resVO.getList());
retMap.put("itemsCount", resVO.getRecordTotCount()); retMap.put("itemsCount", resVO.getRecordTotCount());
return makeResponseEntityJson(retMap); return makeResponseEntityJson(retMap);
} }
/** 반납 연기 화면을 호출한다. /** 반납 연기 화면을 호출한다.
* @param req * @param req
* @return * @return
*/ */
@RequestMapping("/rent/listPostpones.do") @RequestMapping("/rent/listPostpones.do")
public String listPostpones(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception { public String listPostpones(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception {
String searchKeyword = paramMap.get("searchKeyword"); String searchKeyword = paramMap.get("searchKeyword");
String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1"); String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE); String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
// 페이징 사이즈 코드 목록 조회 (DB방식으로 변경 2021.08.06 KNKIM) // 페이징 사이즈 코드 목록 조회 (DB방식으로 변경 2021.08.06 KNKIM)
List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION"); List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION");
// 반환 정보 // 반환 정보
model.addAttribute("pageIndex" , pageIndex); model.addAttribute("pageIndex" , pageIndex);
model.addAttribute("pageSize" , pageSize); model.addAttribute("pageSize" , pageSize);
model.addAttribute("searchKeyword", searchKeyword); model.addAttribute("searchKeyword", searchKeyword);
model.addAttribute("pageSizeCodes", pageSizeCodes); model.addAttribute("pageSizeCodes", pageSizeCodes);
return "nlib/rent/listPostpones"; return "nlib/rent/listPostpones";
} }
/** /**
* 반납 연기 목록을 조회한다. * 반납 연기 목록을 조회한다.
* *
* @param req * @param req
* @return * @return
*/ */
@RequestMapping(value="/rent/listPostponesAjax.do") @RequestMapping(value="/rent/listPostponesAjax.do")
public ResponseEntity<String> listPostponesAjax(HttpServletRequest req, public ResponseEntity<String> listPostponesAjax(HttpServletRequest req,
Authentication authentication, @RequestBody Map<String, String> paramMap) { Authentication authentication, @RequestBody Map<String, String> paramMap) {
String searchKeyword = paramMap.get("searchKeyword"); String searchKeyword = paramMap.get("searchKeyword");
String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1"); String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE); String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
//------------------------------- //-------------------------------
// REQ VO 구성 // REQ VO 구성
//------------------------------- //-------------------------------
DataApiReqVO reqVO = new DataApiReqVO(); DataApiReqVO reqVO = new DataApiReqVO();
reqVO.setPageIndex(pageIndex); reqVO.setPageIndex(pageIndex);
reqVO.setPageSize(pageSize); reqVO.setPageSize(pageSize);
reqVO.addInfoItem("searchKeyword", searchKeyword); reqVO.addInfoItem("searchKeyword", searchKeyword);
// 요청 // 요청
DataApiResVO resVO = rentService.listPostpones(reqVO); DataApiResVO resVO = rentService.listPostpones(reqVO);
//------------------------------- //-------------------------------
// JSON변환 응답 처리 // JSON변환 응답 처리
//------------------------------- //-------------------------------
// JS-GRID 페이징 처리를 포함한 응답값 처리 // JS-GRID 페이징 처리를 포함한 응답값 처리
// {data: [{...}], // {data: [{...}],
// itemsCount: 255 // itemsCount: 255
// } // }
HashMap<String, Object> retMap = new HashMap<String, Object>(); HashMap<String, Object> retMap = new HashMap<String, Object>();
retMap.put("data", resVO.getList()); retMap.put("data", resVO.getList());
retMap.put("itemsCount", resVO.getRecordTotCount()); retMap.put("itemsCount", resVO.getRecordTotCount());
return makeResponseEntityJson(retMap); return makeResponseEntityJson(retMap);
} }
public ModelMap listCanceledRentItems(HttpServletRequest req) { public ModelMap listCanceledRentItems(HttpServletRequest req) {
return null; return null;
} }
/** 대출 예약 화면을 호출한다. /** 대출 예약 화면을 호출한다.
* @param req * @param req
* @return * @return
*/ */
@RequestMapping("/rent/listReservations.do") @RequestMapping("/rent/listReservations.do")
public String listReservations(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception { public String listReservations(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception {
String searchKeyword = paramMap.get("searchKeyword"); String searchKeyword = paramMap.get("searchKeyword");
String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1"); String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE); String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
// 페이징 사이즈 코드 목록 조회 (DB방식으로 변경 2021.08.06 KNKIM) // 페이징 사이즈 코드 목록 조회 (DB방식으로 변경 2021.08.06 KNKIM)
List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION"); List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION");
// 반환 정보 // 반환 정보
model.addAttribute("pageIndex" , pageIndex); model.addAttribute("pageIndex" , pageIndex);
model.addAttribute("pageSize" , pageSize); model.addAttribute("pageSize" , pageSize);
model.addAttribute("searchKeyword", searchKeyword); model.addAttribute("searchKeyword", searchKeyword);
model.addAttribute("pageSizeCodes", pageSizeCodes); model.addAttribute("pageSizeCodes", pageSizeCodes);
return "nlib/rent/listReservations"; return "nlib/rent/listReservations";
} }
/** /**
* 대출 예약 목록을 조회한다. * 대출 예약 목록을 조회한다.
* *
* @param req * @param req
* @return * @return
*/ */
@RequestMapping(value="/rent/listReservationsAjax.do") @RequestMapping(value="/rent/listReservationsAjax.do")
public ResponseEntity<String> listReservationsAjax(HttpServletRequest req, public ResponseEntity<String> listReservationsAjax(HttpServletRequest req,
Authentication authentication, @RequestBody Map<String, String> paramMap) { Authentication authentication, @RequestBody Map<String, String> paramMap) {
String searchKeyword = paramMap.get("searchKeyword"); String searchKeyword = paramMap.get("searchKeyword");
String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1"); String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE); String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
//------------------------------- //-------------------------------
// REQ VO 구성 // REQ VO 구성
//------------------------------- //-------------------------------
DataApiReqVO reqVO = new DataApiReqVO(); DataApiReqVO reqVO = new DataApiReqVO();
reqVO.setPageIndex(pageIndex); reqVO.setPageIndex(pageIndex);
reqVO.setPageSize(pageSize); reqVO.setPageSize(pageSize);
reqVO.addInfoItem("searchKeyword", searchKeyword); reqVO.addInfoItem("searchKeyword", searchKeyword);
// 요청 // 요청
DataApiResVO resVO = rentService.listReservations(reqVO); DataApiResVO resVO = rentService.listReservations(reqVO);
//------------------------------- //-------------------------------
// JSON변환 응답 처리 // JSON변환 응답 처리
//------------------------------- //-------------------------------
// JS-GRID 페이징 처리를 포함한 응답값 처리 // JS-GRID 페이징 처리를 포함한 응답값 처리
// {data: [{...}], // {data: [{...}],
// itemsCount: 255 // itemsCount: 255
// } // }
HashMap<String, Object> retMap = new HashMap<String, Object>(); HashMap<String, Object> retMap = new HashMap<String, Object>();
retMap.put("data", resVO.getList()); retMap.put("data", resVO.getList());
retMap.put("itemsCount", resVO.getRecordTotCount()); retMap.put("itemsCount", resVO.getRecordTotCount());
return makeResponseEntityJson(retMap); return makeResponseEntityJson(retMap);
} }
public ModelMap cancelReservations(HttpServletRequest req) { public ModelMap cancelReservations(HttpServletRequest req) {
return null; return null;
} }
/** /**
* 열람 요청 화면을 호출한다. * 열람 요청 화면을 호출한다.
* *
* @param req * @param req
* @return * @return
*/ */
@RequestMapping("/rent/listRequestsForViewingItem.do") @RequestMapping("/rent/listRequestsForViewingItem.do")
public String listRequestsForViewingItem(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception { public String listRequestsForViewingItem(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception {
String searchKeyword = paramMap.get("searchKeyword"); String searchKeyword = paramMap.get("searchKeyword");
String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1"); String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE); String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
// 페이징 사이즈 코드 목록 조회 (DB방식으로 변경 2021.08.06 KNKIM) // 페이징 사이즈 코드 목록 조회 (DB방식으로 변경 2021.08.06 KNKIM)
List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION"); List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION");
// 반환 정보 // 반환 정보
model.addAttribute("pageIndex" , pageIndex); model.addAttribute("pageIndex" , pageIndex);
model.addAttribute("pageSize" , pageSize); model.addAttribute("pageSize" , pageSize);
model.addAttribute("searchKeyword", searchKeyword); model.addAttribute("searchKeyword", searchKeyword);
model.addAttribute("pageSizeCodes", pageSizeCodes); model.addAttribute("pageSizeCodes", pageSizeCodes);
return "nlib/rent/listRequestsForViewingItem"; return "nlib/rent/listRequestsForViewingItem";
} }
/** /**
* 열람 요청 목록을 조회한다. * 열람 요청 목록을 조회한다.
* *
* @param req * @param req
* @return * @return
*/ */
@RequestMapping(value="/rent/listRequestsForViewingItemAjax.do") @RequestMapping(value="/rent/listRequestsForViewingItemAjax.do")
public ResponseEntity<String> listRequestsForViewingItemAjax(HttpServletRequest req, public ResponseEntity<String> listRequestsForViewingItemAjax(HttpServletRequest req,
Authentication authentication, @RequestBody Map<String, String> paramMap) { Authentication authentication, @RequestBody Map<String, String> paramMap) {
String searchKeyword = paramMap.get("searchKeyword"); String searchKeyword = paramMap.get("searchKeyword");
String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1"); String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE); String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
//------------------------------- //-------------------------------
// REQ VO 구성 // REQ VO 구성
//------------------------------- //-------------------------------
DataApiReqVO reqVO = new DataApiReqVO(); DataApiReqVO reqVO = new DataApiReqVO();
reqVO.setPageIndex(pageIndex); reqVO.setPageIndex(pageIndex);
reqVO.setPageSize(pageSize); reqVO.setPageSize(pageSize);
reqVO.addInfoItem("searchKeyword", searchKeyword); reqVO.addInfoItem("searchKeyword", searchKeyword);
// 요청 // 요청
DataApiResVO resVO = rentService.listRequestsForViewingItem(reqVO); DataApiResVO resVO = rentService.listRequestsForViewingItem(reqVO);
//------------------------------- //-------------------------------
// JSON변환 응답 처리 // JSON변환 응답 처리
//------------------------------- //-------------------------------
// JS-GRID 페이징 처리를 포함한 응답값 처리 // JS-GRID 페이징 처리를 포함한 응답값 처리
// {data: [{...}], // {data: [{...}],
// itemsCount: 255 // itemsCount: 255
// } // }
HashMap<String, Object> retMap = new HashMap<String, Object>(); HashMap<String, Object> retMap = new HashMap<String, Object>();
retMap.put("data", resVO.getList()); retMap.put("data", resVO.getList());
retMap.put("itemsCount", resVO.getRecordTotCount()); retMap.put("itemsCount", resVO.getRecordTotCount());
return makeResponseEntityJson(retMap); return makeResponseEntityJson(retMap);
} }
/** /**
* 묻고답하기 상세 내용 조회한다. * 묻고답하기 상세 내용 조회한다.
* *
* @param req * @param req
* @return * @return
*/ */
@RequestMapping("/rent/selectRequestInfoForViewingItem.do") @RequestMapping("/rent/selectRequestInfoForViewingItem.do")
public String selectRequestInfoForViewingItem(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) { public String selectRequestInfoForViewingItem(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) {
// 목록 이동시 전달할 매개변수 // 목록 이동시 전달할 매개변수
String searchKeyword = paramMap.get("searchKeyword"); String searchKeyword = paramMap.get("searchKeyword");
String pageIndex = paramMap.get("pageIndex"); String pageIndex = paramMap.get("pageIndex");
String pageSize = paramMap.get("pageSize"); String pageSize = paramMap.get("pageSize");
String message = paramMap.get("message"); String message = paramMap.get("message");
// 게시물 번호 // 게시물 번호
String articleNo = paramMap.get("articleNo"); String articleNo = paramMap.get("articleNo");
log.debug("selectRequestInfoForViewingItem > pageIndex = " + pageIndex); log.debug("selectRequestInfoForViewingItem > pageIndex = " + pageIndex);
log.debug("selectRequestInfoForViewingItem > pageSize = " + pageSize); log.debug("selectRequestInfoForViewingItem > pageSize = " + pageSize);
log.debug("selectRequestInfoForViewingItem > searchKeyword = " + searchKeyword); log.debug("selectRequestInfoForViewingItem > searchKeyword = " + searchKeyword);
log.debug("selectRequestInfoForViewingItem > articleNo = " + articleNo); log.debug("selectRequestInfoForViewingItem > articleNo = " + articleNo);
log.debug("selectRequestInfoForViewingItem > message = " + message); log.debug("selectRequestInfoForViewingItem > message = " + message);
//------------------------------- //-------------------------------
// REQ VO 구성 // REQ VO 구성
//------------------------------- //-------------------------------
DataApiReqVO reqVO = new DataApiReqVO(); DataApiReqVO reqVO = new DataApiReqVO();
reqVO.setPageIndex(pageIndex); reqVO.setPageIndex(pageIndex);
reqVO.setPageSize(pageSize); reqVO.setPageSize(pageSize);
reqVO.addInfoItem("boardNo", "QNA"); // 게시판ID reqVO.addInfoItem("boardNo", "QNA"); // 게시판ID
reqVO.addInfoItem("articleNo", articleNo); // 게시물번호 reqVO.addInfoItem("articleNo", articleNo); // 게시물번호
// 요청 // 요청
DataApiResVO resVO = rentService.selectRequestInfoForViewingItem(reqVO); DataApiResVO resVO = rentService.selectRequestInfoForViewingItem(reqVO);
// 반환 정보 // 반환 정보
model.addAttribute("articleNo" , articleNo); model.addAttribute("articleNo" , articleNo);
model.addAttribute("article" , resVO.getInfo()); // 게시물 상세 model.addAttribute("article" , resVO.getInfo()); // 게시물 상세
model.addAttribute("preArticle" , resVO.getList().get(0)); // 이전글 정보 model.addAttribute("preArticle" , resVO.getList().get(0)); // 이전글 정보
model.addAttribute("nextArticle" , resVO.getList().get(1)); // 다음글 정보 model.addAttribute("nextArticle" , resVO.getList().get(1)); // 다음글 정보
model.addAttribute("message" , message); model.addAttribute("message" , message);
model.addAttribute("pageIndex" , pageIndex); model.addAttribute("pageIndex" , pageIndex);
model.addAttribute("pageSize" , pageSize); model.addAttribute("pageSize" , pageSize);
model.addAttribute("searchKeyword", searchKeyword); model.addAttribute("searchKeyword", searchKeyword);
return "nlib/rent/selectRequestInfoForViewingItem"; return "nlib/rent/selectRequestInfoForViewingItem";
} }
} }

View File

@ -1,45 +1,45 @@
package nlib.mail; package nlib.mail;
import java.io.Reader; import java.io.Reader;
import java.util.Properties; import java.util.Properties;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType; import javax.mail.internet.MimeMessage.RecipientType;
import org.apache.ibatis.io.Resources; import org.apache.ibatis.io.Resources;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import nlib.mail.service.EmailVO; import nlib.mail.service.EmailVO;
@Component @Component
public class EmailSender { public class EmailSender {
@Autowired @Autowired
protected JavaMailSender mailSender; protected JavaMailSender mailSender;
public void SendEmail(EmailVO email) throws Exception { public void SendEmail(EmailVO email) throws Exception {
String resource = "egovframework/egovProps/globals.properties"; String resource = "egovframework/egovProps/globals.properties";
Properties properties = new Properties(); Properties properties = new Properties();
Reader reader = Resources.getResourceAsReader(resource); Reader reader = Resources.getResourceAsReader(resource);
properties.load(reader); properties.load(reader);
String senderName = properties.getProperty("system.notification.email.sender.name"); String senderName = properties.getProperty("system.notification.email.sender.name");
String sender = properties.getProperty("system.notification.email.sender"); String sender = properties.getProperty("system.notification.email.sender");
MimeMessage msg = mailSender.createMimeMessage(); MimeMessage msg = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(msg, true, "utf-8"); MimeMessageHelper helper = new MimeMessageHelper(msg, true, "utf-8");
helper.setText(email.getContent(), true); //***HTML 적용 helper.setText(email.getContent(), true); //***HTML 적용
helper.setTo(email.getReciver()); helper.setTo(email.getReciver());
helper.setSubject(email.getSubject()); helper.setSubject(email.getSubject());
helper.setFrom(sender,senderName); helper.setFrom(sender,senderName);
mailSender.send(msg); mailSender.send(msg);
} }
} }

View File

@ -34,24 +34,27 @@
, A.POST_START_DATE , A.POST_START_DATE
, A.POST_END_DATE , A.POST_END_DATE
, A.VIEW_CNT , A.VIEW_CNT
, CASE WHEN A.BD_ATTACH_FILE_ID IS NOT NULL OR A.BD_ATTACH_FILE_ID != '' THEN 'N' ELSE 'Y' END AS ATTACH_YN , CASE WHEN A.BD_ATTACH_FILE_ID IS NULL OR A.BD_ATTACH_FILE_ID = '' THEN 'N' ELSE 'Y' END AS ATTACH_YN
, DATE_FORMAT(A.REG_DD, '%Y-%m-%d') AS REG_DD , DATE_FORMAT(A.REG_DD, '%Y-%m-%d') AS REG_DD
, A2.RNO , A2.RNO
, C.USER_NM AS REG_NM , C.USER_NM AS REG_NM
FROM BD_NLIB_ANCMNT A FROM BD_NLIB_ANCMNT A
INNER JOIN ( INNER JOIN (
SELECT S.ANCMNT_ID SELECT ANCMNT_ID, RNO
, ROW_NUMBER() OVER() AS RNO FROM (
<include refid="search_condition" /> SELECT S.ANCMNT_ID
ORDER BY S.REG_DD DESC , ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY S.REG_DD, S.TITLE) AS RNO
LIMIT #{pageStartRowNum}, #{pageSize} , ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY S.REG_DD DESC, S.TITLE DESC) AS ONO
<include refid="search_condition" />
) S2
WHERE ONO BETWEEN (#{pageStartRowNum} + 1) AND (#{pageStartRowNum} + #{pageSize})
) AS A2 ) AS A2
USING(ANCMNT_ID) USING(ANCMNT_ID)
JOIN SM_DEPT B JOIN SM_DEPT B
ON B.ORG_CD = A.MNG_ORG_CD ON B.ORG_CD = A.MNG_ORG_CD
LEFT OUTER JOIN SM_USER C LEFT OUTER JOIN SM_USER C
ON A.REG_ID = C.USER_ID ON A.REG_ID = C.USER_ID
ORDER BY A.REG_DD DESC ORDER BY RNO DESC
</select> </select>
<select id="countArticles" parameterType="ArticleVO" resultType="Integer"> <select id="countArticles" parameterType="ArticleVO" resultType="Integer">
@ -72,7 +75,7 @@
, A.POST_START_DATE , A.POST_START_DATE
, A.POST_END_DATE , A.POST_END_DATE
, A.VIEW_CNT , A.VIEW_CNT
, CASE WHEN A.BD_ATTACH_FILE_ID IS NOT NULL OR A.BD_ATTACH_FILE_ID != '' THEN 'N' ELSE 'Y' END AS ATTACH_YN , CASE WHEN A.BD_ATTACH_FILE_ID IS NULL OR A.BD_ATTACH_FILE_ID = '' THEN 'N' ELSE 'Y' END AS ATTACH_YN
, A.BD_ATTACH_FILE_ID , A.BD_ATTACH_FILE_ID
, DATE_FORMAT(A.REG_DD, '%Y-%m-%d') AS REG_DD , DATE_FORMAT(A.REG_DD, '%Y-%m-%d') AS REG_DD
, C.USER_NM AS REG_NM , C.USER_NM AS REG_NM

View File

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?><!--Converted at: Wed May 11 15:49:38 KST 2016-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="nlib.bbs.service.impl.FaqDAO">
<sql id="search_condition">
<![CDATA[
FROM BD_QNA S
WHERE S.USE_YN = 'Y'
AND S.ANSWER_YN = 'Y'
AND S.BD_TYPE = 'FAQ'
]]>
<if test='searchType != null and searchType.equals("T")'>
<if test="searchKeyword != null and !searchKeyword.equals('')">
AND S.TITLE LIKE CONCAT('%', #{escapeSearchKeyword}, '%')
</if>
</if>
<if test='searchType != null and searchType.equals("C")'>
<if test="searchKeyword != null and !searchKeyword.equals('')">
AND CONCAT(S.CONTENT, S.ANSWER) LIKE CONCAT('%', #{escapeSearchKeyword}, '%')
</if>
</if>
<if test='searchQuestionType != null and !searchQuestionType.equals("")'>
AND S.QUESTION_TYPE = #{searchQuestionType}
</if>
</sql>
<select id="listArticles" parameterType="ArticleVO" resultType="ArticleVO">
SELECT
A.QNA_ID AS ARTICLE_ID
, A.MNG_ORG_CD
, B.DEPT_NM AS MNG_ORG_NM
, A.QUESTION_TYPE
, D.S_CODE_NM AS QUESTION_TYPE_NAME
, A.TITLE
, A.ANSWER_YN
, A.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
, DATE_FORMAT(A.REG_DD, '%Y-%m-%d') AS REG_DD
, A2.RNO
, C.USER_NM AS REG_NM
FROM BD_QNA A
INNER JOIN (
SELECT QNA_ID, RNO
FROM (
SELECT S.QNA_ID
, ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY S.REG_DD, S.TITLE) AS RNO
, ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY S.REG_DD DESC, S.TITLE DESC) AS ONO
<include refid="search_condition" />
) S2
WHERE ONO BETWEEN (#{pageStartRowNum} + 1) AND (#{pageStartRowNum} + #{pageSize})
) AS A2
USING(QNA_ID)
JOIN SM_DEPT B
ON B.ORG_CD = A.MNG_ORG_CD
LEFT OUTER JOIN SM_USER C
ON A.REG_ID = C.USER_ID
LEFT OUTER JOIN SM_CODE_S D
ON A.QUESTION_TYPE = D.S_CODE_ID
WHERE D.L_CODE_ID = 'FAQ_TYPE_CD'
AND D.USE_YN = 'Y'
ORDER BY RNO DESC
</select>
<select id="countArticles" parameterType="ArticleVO" resultType="Integer">
SELECT COUNT(1)
<include refid="search_condition" />
</select>
<select id="selectArticle" parameterType="ArticleVO" resultType="ArticleVO">
<![CDATA[
SELECT
A.QNA_ID AS ARTICLE_ID
, A.MNG_ORG_CD
, B.DEPT_NM AS MNG_ORG_NM
, A.QUESTION_TYPE
, D.S_CODE_NM AS QUESTION_TYPE_NAME
, A.TITLE
, A.CONTENT
, A.ANSWER_YN
, A.ANSWER
, A.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
, DATE_FORMAT(A.REG_DD, '%Y-%m-%d') AS REG_DD
, C.USER_NM AS REG_NM
FROM BD_QNA A
LEFT OUTER JOIN SM_DEPT B
ON B.ORG_CD = A.MNG_ORG_CD
LEFT OUTER JOIN SM_USER C
ON A.REG_ID = C.USER_ID
LEFT OUTER JOIN SM_CODE_S D
ON A.QUESTION_TYPE = D.S_CODE_ID
WHERE A.QNA_ID = #{articleId}
AND D.L_CODE_ID = 'FAQ_TYPE_CD'
AND D.USE_YN = 'Y'
ORDER BY A.REG_DD DESC
]]>
</select>
<select id="listAttachFiles" parameterType="String" resultType="AttachFileVO">
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
</select>
<update id="updateRead" parameterType="ArticleVO">
<![CDATA[
UPDATE BD_QNA
SET VIEW_CNT = VIEW_CNT + 1
WHERE QNA_ID = #{articleId}
]]>
</update>
</mapper>

View File

@ -7,7 +7,7 @@
SELECT B.S_CODE_ID SELECT B.S_CODE_ID
, B.S_CODE_NM , B.S_CODE_NM
FROM SM_CODE_M A, FROM SM_CODE_M A,
SM_CODE_S B SM_CODE_S B
WHERE A.L_CODE_ID = #{lCodeId} WHERE A.L_CODE_ID = #{lCodeId}
AND A.L_CODE_ID = B.L_CODE_ID AND A.L_CODE_ID = B.L_CODE_ID
AND A.USE_YN = 'Y' AND A.USE_YN = 'Y'

View File

@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<!-- <bean id="egov.propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <!-- <bean id="egov.propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations"> <property name="locations">
<list> <list>
<value>classpath:/egovframework/egovProps/globals.properties</value> <value>classpath:/egovframework/egovProps/globals.properties</value>
value>file:/product/jeus/egovProps/globals.properties</value value>file:/product/jeus/egovProps/globals.properties</value
</list> </list>
</property> </property>
</bean> --> </bean> -->
<!-- 이메일 발송 --> <!-- 이메일 발송 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl" <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"
p:host="smtp.gmail.com" p:host="smtp.gmail.com"
p:port="587" p:port="587"
p:protocol="smtp" p:protocol="smtp"
p:username="${system.notification.email.sender}" p:username="${system.notification.email.sender}"
p:password="${system.notification.email.sender.password}"> p:password="${system.notification.email.sender.password}">
<property name="javaMailProperties"> <property name="javaMailProperties">
<props> <props>
<prop key="mail.smtp.starttls.enable">true</prop> <prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.smtp.auth">true </prop> <prop key="mail.smtp.auth">true </prop>
<prop key="mail.debug">true</prop> <prop key="mail.debug">true</prop>
<prop key="mail.smtp.ssl.trust">smtp.gmail.com</prop> <prop key="mail.smtp.ssl.trust">smtp.gmail.com</prop>
<prop key="mail.smtp.ssl.protocols">TLSv1.2</prop> <prop key="mail.smtp.ssl.protocols">TLSv1.2</prop>
</props> </props>
</property> </property>
</bean> </bean>
</beans> </beans>

View File

@ -31,7 +31,7 @@
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %> <%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
<c:set var="pageTitle">공지사항</c:set> <c:set var="pageTitle">공지사항(DB)</c:set>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="ko"> <html lang="ko">
@ -97,8 +97,24 @@
//$("#itemsCount").val(jsonOjb.itemsCount); //$("#itemsCount").val(jsonOjb.itemsCount);
console.log(jsonObj.itemsCount); console.log(jsonObj.itemsCount);
if(jsonObj.itemsCount == undefined) $("#itemsCount").val("0"); if(jsonObj.itemsCount == undefined) {
else $("#itemsCount").val(jsonObj.itemsCount); $("#itemsCount").text("0");
$("#searchItemsCount").text("0");
}
else {
$("#itemsCount").text(jsonObj.itemsCount);
$("#searchItemsCount").text(jsonObj.itemsCount);
}
if($("#searchKeyword").val() != "") {
$("#searchKeywordPrt").text($("#searchKeyword").val());
$("#listResult").hide();
$("#searchResult").show();
}
else {
$("#listResult").show();
$("#searchResult").hide();
}
data.resolve(jsonObj); data.resolve(jsonObj);
}); });
@ -113,10 +129,9 @@
// 추출할 컬럼의 데이터 가져오기 // 추출할 컬럼의 데이터 가져오기
var articleId = getData["articleId"]; var articleId = getData["articleId"];
var selectedRow = $("#jsGrid").find('table tr.jsgrid-selected-row');
// 상세 내용 보기 // 상세 내용 보기
fn_viewDetail(articleId, selectedRow); fn_viewDetail(articleId);
}, },
//====================================== //======================================
@ -128,7 +143,7 @@
{ title:"제목", name: "title" , type: "text", width: 200, align: "left" }, { title:"제목", name: "title" , type: "text", width: 200, align: "left" },
{ title:"등록자", name: "regNm" , 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: "regDd" , type: "text", width: 100, align: "center"},
{ title:"첨부", name: "bdAttachFileId" , type: "text", width: 100, align: "center"} { title:"첨부", name: "attachYn" , type: "text", width: 100, align: "center"}
] ]
}); });
@ -168,13 +183,19 @@
메시지 : ${message} 메시지 : ${message}
<div name="listResult" id="listResult">
총 <span name="itemsCount" id="itemsCount"></span>건<br>
</div>
<div style="display:none;" name="searchResult" id="searchResult">
'<span name="searchKeywordPrt" id="searchKeywordPrt"></span>' 에 대한 검색결과는 총 <span name="searchItemsCount" id="searchItemsCount"></span>건 입니다.<br>
</div>
&nbsp;<br/> &nbsp;<br/>
<form name="articleForm" id="articleForm" method="post" action="${pageContext.request.contextPath}/bbs/selectAncmntArticle.do"> <form name="articleForm" id="articleForm" method="post" action="${pageContext.request.contextPath}/bbs/selectAncmntArticle.do">
<!-- 검색조건 --> <!-- 검색조건 -->
<input type="text" name="pageSize" id="pageSize" value="${searchArticle.pageSize }" /> <input type="text" name="pageSize" id="pageSize" value="${searchArticle.pageSize }" />
<input type="text" name="itemsCount" id="itemsCount" value="0" />
<input type="text" name="pageIndex" id="pageIndex" title="페이지번호" value="${searchArticle.pageIndex }" size="5" maxlength="5" /> <input type="text" name="pageIndex" id="pageIndex" title="페이지번호" value="${searchArticle.pageIndex }" size="5" maxlength="5" />

View File

@ -0,0 +1,314 @@
<%
/**
* <pre>
* @Class Name : listFaqs.jsp
*
* @Description : 자주하는질문 목록 화면을 표출한다.
*
*
* @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
*
* </pre>
*
* @ ------------ -------- ---------------------------
* @ 수정일 수정자 수정내용
* @ ------------ -------- ---------------------------
* @ 2021. 9. 15. KNKIM 최초 생성
*
*
* @author 이씨플라자 * DIGITALSHIP KNKIM
* @since 2021. 9. 15.
* @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" %>
<c:set var="pageTitle">자주하는질문(DB)</c:set>
<!DOCTYPE html>
<html lang="ko">
<head>
<title>${pageTitle}</title>
<!-- GRID -->
<link type="text/css" rel="stylesheet" href="/nlib/js/jsgrid/nlib-jsgrid.css" />
<link type="text/css" rel="stylesheet" href="/nlib/js/jsgrid/nlib-jsgrid-theme.css" />
<script src="/nlib/js/jsgrid/nlib-jsgrid.js"></script>
<script type="text/javaScript" language="javascript">
$( document ).ready(function() {
//=======================================================
// 그리드 생성 환경설정
//=======================================================
$("#jsGrid").jsGrid({
pageSize : $("#pageSize").val(),
scrollOffset:0,
controller: {
loadData: function (filter) { // 그리드에 데이터를 가져올 때 실팽되는 함수
var data = $.Deferred();
//======================================
// 요청 정보 구성 : 시작 (각 요청에 맞게 조정)
//======================================
var reqUrl = "${pageContext.request.contextPath}/bbs/listFaqsAjax.do";
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();
var searchQuestionType = $("#searchQuestionType").val();
$("#pageIndex").val(pageIndex);
var inputData = {
"pageIndex" : pageIndex
, "pageSize" : pageSize
, "searchType" : searchType
, "searchKeyword" : searchKeyword
, "searchQuestionType" : searchQuestionType
};
//--------------------------------------
// 요청 처리
//--------------------------------------
$.ajax({
type: "post",
contentType: "application/json; charset=utf-8",
url: reqUrl,
dataType: "json",
data: JSON.stringify(inputData),
}).done(function(response){
<%
// 그리드 데이터 예시 :
// (1) 페이징 클라이언트에서 수행하는 경우(pageloading = false) : [{ "articleNo": 1, "articleType": "01" }, { "articleNo": 2, "articleType": "02" }]
// (2) 페이징 서버에서 수행하는 경우(pageloading = true) : {data: [{...}], itemsCount: 255}
%>
var jsonObj = JSON.parse(response);
//$("#itemsCount").val(jsonOjb.itemsCount);
console.log(jsonObj.itemsCount);
if(jsonObj.itemsCount == undefined) {
$("#itemsCount").text("0");
$("#searchItemsCount").text("0");
}
else {
$("#itemsCount").text(jsonObj.itemsCount);
$("#searchItemsCount").text(jsonObj.itemsCount);
}
if($("#searchKeyword").val() != "") {
$("#searchKeywordPrt").text($("#searchKeyword").val());
$("#listResult").hide();
$("#searchResult").show();
}
else {
$("#listResult").show();
$("#searchResult").hide();
}
data.resolve(jsonObj);
});
return data.promise();
} // loadData
},
rowClick: function(args) { // 행 클릭 시, 실행되는 이벤트 함수
// 클릭된 행의 자료 객체
var getData = args.item;
// 추출할 컬럼의 데이터 가져오기
var articleId = getData["articleId"];
var selectedRow = $("#jsGrid").find('table tr.jsgrid-selected-row');
// 상세 내용 보기
fn_viewDetail(articleId, selectedRow);
},
//======================================
// 그리드 컬럼 정의 (각 요청에 맞게 조정)
//======================================
fields: [
{ title:"TYPE", name: "faqType" , type: "text", width: 30, align: "left", itemTemplate: function(value, item) {return "Q";}},
{ title:"ID", name: "articleId" , type: "text", width: 160, align: "left" },
{ title:"유형", name: "questionTypeName" , type: "text", width: 100, align: "left" },
{ title:"제목", name: "title" , type: "text", width: 200, align: "left" },
{ title:"첨부", name: "attachYn" , type: "text", width: 100, align: "center"}
]
});
// 검색 버튼 클릭
$("#btnSearch").on("click", function(e) {
fn_searchArticle($("#pageSize").val(), 1);
});
//초기 자료 조회
fn_searchArticle();
}); // document ready
// 선택한 글 상세 보기로 이동
function fn_viewDetail(articleId, selectedRow) {
var $selectedRow = $(selectedRow);
var reqUrl = "${pageContext.request.contextPath}/bbs/selectFaqArticleAjax.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();
var answerHtml = "<tr class='answer'><td>A</td><td colspan='4'>" +
+ "<br/>" + jsonObj.data.answer;
if(jsonObj.data.attachFileCnt > 0) {
answerHtml += "<br/>[첨부파일]<br/>";
for(var i=0; i<jsonObj.data.attachFileCnt; i++) {
answerHtml += "<a href=\"javascript:void(0);\" onclick=\"fn_downloadFile('" +
jsonObj.data.attachFiles[i].fileId + "', " +
jsonObj.data.attachFiles[i].fileSeq + ", '" +
jsonObj.data.attachFiles[i].fileName + "')\">" +
jsonObj.data.attachFiles[i].fileName + " (" +
jsonObj.data.attachFiles[i].fileSize + " byte(s))</a><br/>";
}
}
answerHtml += "</td></tr>";
$selectedRow.after(answerHtml);
});
$("#jsGrid").closest('.ui-jqgrid-bdiv').width($("#jsGrid").closest('.ui-jqgrid-bdiv').width() + 1);
}
// 그리드 데이터 조회 호출
function fn_searchArticle(pageSize, pageIndex) {
$("#jsGrid").jsGrid("search"
, {'pageSize' : (pageSize ? pageSize : fn_getIntValue("pageSize", ${searchArticle.pageSize}) ),
'pageIndex' : (pageIndex ? pageIndex : fn_getIntValue("pageIndex", ${searchArticle.pageIndex}))
}
);
}
//파일 다운로드
function fn_downloadFile(fileId, fileSeq, fileName) {
if(fileId == null || fileId.trim().length < 1) {
alert("파일정보를 확인해 주시기 바랍니다.[1]");
return;
}
if(fileSeq < 1) {
alert("파일정보를 확인해 주시기 바랍니다.[2]");
return;
}
if(fileName == null || fileName.trim().length < 1) {
alert("파일정보를 확인해 주시기 바랍니다.[3]");
return;
}
$("#fileId").val(fileId);
$("#fileSeq").val(fileSeq);
$("#fileName").val(fileName);
$("#downloadFileForm").submit();
}
function fn_changeQuestionType(searchQuestionType) {
$("#searchQuestionType").val(searchQuestionType);
fn_searchArticle($("#pageSize").val(), 1);
}
</script>
</head>
<body>
<h1>${pageTitle }</h1>
메시지 : ${message}
<div name="listResult" id="listResult">
총 <span name="itemsCount" id="itemsCount"></span>건<br>
</div>
<div style="display:none;" name="searchResult" id="searchResult">
'<span name="searchKeywordPrt" id="searchKeywordPrt"></span>' 에 대한 검색결과는 총 <span name="searchItemsCount" id="searchItemsCount"></span>건 입니다.<br>
</div>
&nbsp;<br/>
<!-- 유형선택 -->
<table>
<tr>
<td><a href="javascript:void(0);" onclick="fn_changeQuestionType('')">전체</a></td>
<c:forEach var="qTypeItem" items="${questionTypeList }">
<td><a href="javascript:void(0);" onclick="fn_changeQuestionType('${qTypeItem.sCodeId}')">${qTypeItem.sCodeNm}</a></td>
</c:forEach>
</tr>
</table>
<br>
<form name="articleForm" id="articleForm" method="post" action="${pageContext.request.contextPath}/bbs/selectFaqArticle.do">
<!-- 검색조건 -->
<input type="text" name="pageSize" id="pageSize" value="${searchArticle.pageSize }" />
<input type="text" name="pageIndex" id="pageIndex" title="페이지번호" value="${searchArticle.pageIndex }" size="5" maxlength="5" />
<select name="searchType" id="searchType">
<option value="T" <c:if test='${searchArticle.searchType == "T" }'>selected</c:if> >제목</option>
<option value="C" <c:if test='${searchArticle.searchType == "C" }'>selected</c:if> >내용</option>
</select>
<input type="text" name="searchKeyword" id="searchKeyword" title="검색어" value="${searchArticle.searchKeyword }" maxlength="20" />
<input type="text" name="articleId" id="articleId" title="게시글번호" value="" readonly />
<input type="button" name="btnSearch" id="btnSearch" title="검색" value="검색" />
<br/>
<div id="jsGrid" name="jsGrid" style="height: 100%"></div>
<input type="text" name="searchQuestionType" id="searchQuestionType" value="" title="유형코드" readonly />
<input type="text" name="articleNo" id="articleNo" value="" title="선택글번호" readonly />
</form>
<!-- 첨부파일 다운로드용 폼 -->
<form name="downloadFileForm" id="downloadFileForm"
action="${pageContext.request.contextPath}/fileupload/downloadAttachFile.do"
method="post">
<input type="text" name="subPathKey" id="subPathKey" value="fileupload.bbs.ancmnt.subpath" readonly />
<input type="text" name="fileId" id="fileId" value="" readonly />
<input type="text" name="fileSeq" id="fileSeq" value="" readonly />
<input type="text" name="fileName" id="fileName" value="" readonly />
</form>
</body>
</html>

View File

@ -42,33 +42,32 @@
// 목록으로 이동 // 목록으로 이동
function fn_list() { function fn_list() {
$("#articleForm").attr("action", "${pageContext.request.contextPath}/bbs/listAncmnts.do");
$("#articleForm").submit(); $("#articleForm").submit();
} }
// 파일 다운로드 // 파일 다운로드
function fn_downloadFile(fileId, fileSeq, fileName) { function fn_downloadFile(fileId, fileSeq, fileName) {
if(fileId == null || fileId.trim().length < 1) { if(fileId == null || fileId.trim().length < 1) {
alert("파일정보를 확인해 주시기 바랍니다.[1]"); alert("파일정보를 확인해 주시기 바랍니다.[1]");
return; return;
} }
if(fileSeq < 1) { if(fileSeq < 1) {
alert("파일정보를 확인해 주시기 바랍니다.[2]"); alert("파일정보를 확인해 주시기 바랍니다.[2]");
return; return;
} }
if(fileName == null || fileName.trim().length < 1) { if(fileName == null || fileName.trim().length < 1) {
alert("파일정보를 확인해 주시기 바랍니다.[3]"); alert("파일정보를 확인해 주시기 바랍니다.[3]");
return; return;
} }
$("#fileId").val(fileId); $("#fileId").val(fileId);
$("#fileSeq").val(fileSeq); $("#fileSeq").val(fileSeq);
$("#fileName").val(fileName); $("#fileName").val(fileName);
$("#downloadFileForm").submit(); $("#downloadFileForm").submit();
} }
</script> </script>
@ -82,13 +81,13 @@ function fn_downloadFile(fileId, fileSeq, fileName) {
<br /> <br />
<form name="articleForm" id="articleForm" <form name="articleForm" id="articleForm"
action="${pageContext.request.contextPath}/board/listNotices.do" action="${pageContext.request.contextPath}/bbs/listAncmnts.do"
method="post"> method="post">
<!-- HIDDEN 영역 : 시작 --> <!-- HIDDEN 영역 : 시작 -->
<input type="text" name="pageIndex" id="pageIndex" title="페이지번호" value="${searchArticle.pageIndex}" readonly /> <input type="text" name="pageIndex" id="pageIndex" title="페이지번호" value="${searchArticle.pageIndex}" readonly />
<input type="text" name="pageSize" id="pageSize" title="목록에 보여줄 글개수" value="${searchArticle.pageSize}" readonly /> <input type="text" name="pageSize" id="pageSize" title="목록에 보여줄 글개수" value="${searchArticle.pageSize}" readonly />
<input type="text" name="searchType" id="searchType" title="검색구분" value="${searchArticle.searchType}" readonly /> <input type="text" name="searchType" id="searchType" title="검색구분" value="${searchArticle.searchType}" readonly />
<input type="text" name="searchKeyword" id="searchKeyword" title="검색어" value="${searchArticle.searchKeyword}" readonly /> <input type="text" name="searchKeyword" id="searchKeyword" title="검색어" value="${searchArticle.searchKeyword}" readonly />
<input type="text" name="articleId" id="articleId" title="선택글번호" value="${searchArticle.articleId}" readonly /> <input type="text" name="articleId" id="articleId" title="선택글번호" value="${searchArticle.articleId}" readonly />
<!-- HIDDEN 영역 : 종료 --> <!-- HIDDEN 영역 : 종료 -->

View File

@ -44,6 +44,9 @@
<script src="/nlib/js/jsgrid/nlib-jsgrid.js"></script> <script src="/nlib/js/jsgrid/nlib-jsgrid.js"></script>
<script type="text/javaScript" language="javascript"> <script type="text/javaScript" language="javascript">
$(function() {
alert("ok");
});
$( document ).ready(function() { $( document ).ready(function() {

View File

@ -39,6 +39,9 @@
<title>${pageTitle}</title> <title>${pageTitle}</title>
<script type="text/javaScript" language="javascript"> <script type="text/javaScript" language="javascript">
$(function() {
alert("ok");
});
// 이전글/다음글 상세 보기로 이동 // 이전글/다음글 상세 보기로 이동
function fn_view_detail(articleNo) { function fn_view_detail(articleNo) {

View File

@ -8,6 +8,7 @@
<li><a href="#" onclick="javascript:location.href='${pageContext.request.contextPath}/board/listNotices.do';">공지사항</a></li> <li><a href="#" onclick="javascript:location.href='${pageContext.request.contextPath}/board/listNotices.do';">공지사항</a></li>
<li><a href="#" onclick="javascript:location.href='${pageContext.request.contextPath}/bbs/listAncmnts.do';">공지사항(DB)</a></li> <li><a href="#" onclick="javascript:location.href='${pageContext.request.contextPath}/bbs/listAncmnts.do';">공지사항(DB)</a></li>
<li><a href="#" onclick="javascript:location.href='${pageContext.request.contextPath}/board/listFAQs.do';">자주하는질문</a></li> <li><a href="#" onclick="javascript:location.href='${pageContext.request.contextPath}/board/listFAQs.do';">자주하는질문</a></li>
<li><a href="#" onclick="javascript:location.href='${pageContext.request.contextPath}/bbs/listFaqs.do';">자주하는질문(DB)</a></li>
<li><a href="#" onclick="javascript:location.href='${pageContext.request.contextPath}/bbs/listQnAs.do';">묻고답하기</a></li> <li><a href="#" onclick="javascript:location.href='${pageContext.request.contextPath}/bbs/listQnAs.do';">묻고답하기</a></li>
<li><a href="#" onclick="javascript:location.href='${pageContext.request.contextPath}/inform/selectNCultureLocationInfo.do';">찾아오시는길</a></li> <li><a href="#" onclick="javascript:location.href='${pageContext.request.contextPath}/inform/selectNCultureLocationInfo.do';">찾아오시는길</a></li>

View File

@ -11,7 +11,8 @@
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<link rel="shortcut icon" href="#"> <!-- <link rel="shortcut icon" href=""> -->
<link href="${pageContext.request.contextPath}/css/nlib.css" rel="stylesheet" type="text/css" /> <link href="${pageContext.request.contextPath}/css/nlib.css" rel="stylesheet" type="text/css" />
<script src="${pageContext.request.contextPath}/js/jquery/jquery.min.js"></script> <script src="${pageContext.request.contextPath}/js/jquery/jquery.min.js"></script>
<script src="${pageContext.request.contextPath}/js/nlib.js"></script> <script src="${pageContext.request.contextPath}/js/nlib.js"></script>