From 1cd9cf82025477638e7e0753e0ff01466b9aa12b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Mon, 5 Feb 2024 14:51:06 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80/=EC=88=98=EC=A0=95=20=EB=AA=A8=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/admin/board/EgovAdminBoardEdit.jsx | 388 ++++++------------ .../src/pages/admin/boards/List.jsx | 28 +- .../admin/boards/AdminBoardsController.java | 22 + .../boards/service/AdminBoardsService.java | 3 + 4 files changed, 169 insertions(+), 272 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/board/EgovAdminBoardEdit.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/board/EgovAdminBoardEdit.jsx index 6551f96..4e6d3fc 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/board/EgovAdminBoardEdit.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/board/EgovAdminBoardEdit.jsx @@ -1,11 +1,12 @@ -import React, { useState, useEffect, useRef } from 'react'; -import { Link, useNavigate, useLocation } from 'react-router-dom'; +import React, {useState, useEffect, useRef} from 'react'; +import {Link, useNavigate, useLocation, useParams} from 'react-router-dom'; +import Modal from "react-bootstrap/Modal"; import * as EgovNet from 'api/egovFetch'; import URL from 'constants/url'; import CODE from 'constants/code'; -import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin'; +import {default as EgovLeftNav} from 'components/leftmenu/EgovLeftNavAdmin'; import EgovRadioButtonGroup from 'components/EgovRadioButtonGroup'; @@ -16,64 +17,44 @@ function EgovAdminBoardEdit(props) { const navigate = useNavigate(); const location = useLocation(); - const checkRef = useRef([]); - + const checkRef = useRef([]); + console.log("EgovAdminBoardEdit [location] : ", location); - const replyPosblAtRadioGroup = [{ value: "Y", label: "가능" }, { value: "N", label: "불가능" }]; - const fileAtchPosblAtRadioGroup = [{ value: "Y", label: "가능" }, { value: "N", label: "불가능" }]; - const bbsTyCodeOptions = [{ value: "", label: "선택" }, { value: "BBST01", label: "일반게시판" }, { value: "BBST03", label: "공지게시판" }]; - const bbsAttrbCodeOptions = [{ value: "", label: "선택" }, { value: "BBSA02", label: "갤러리" }, { value: "BBSA03", label: "일반게시판" }]; - const posblAtchFileNumberOptions = [{ value: 0, label: "선택하세요" }, { value: 1, label: "1개" }, { value: 2, label: "2개" }, { value: 3, label: "3개" }]; - const bbsId = location.state?.bbsId || ""; + const replyPosblAtRadioGroup = [{value: "Y", label: "가능"}, {value: "N", label: "불가능"}]; + const fileAtchPosblAtRadioGroup = [{value: "Y", label: "가능"}, {value: "N", label: "불가능"}]; + const bbsTyCodeOptions = [{value: "", label: "선택"}, {value: "BBST01", label: "일반게시판"}, {value: "BBST03", label: "공지게시판"}]; + const bbsAttrbCodeOptions = [{value: "", label: "선택"}, {value: "BBSA02", label: "갤러리"}, {value: "BBSA03", label: "일반게시판"}]; + const posblAtchFileNumberOptions = [{value: 0, label: "선택하세요"}, {value: 1, label: "1개"}, {value: 2, label: "2개"}, {value: 3, label: "3개"}]; - const [modeInfo, setModeInfo] = useState({ mode: props.mode }); + let item = null; + item = props.props; + console.log("@@@ item : " + JSON.stringify(item)); + + + + const [modeInfo, setModeInfo] = useState(item != null ? {mode: props.props.mode} : {mode: CODE.MODE_CREATE}); const [boardDetail, setBoardDetail] = useState({}); + console.log("@@@ mode : " + modeInfo.mode); const initMode = () => { - switch (props.mode) { - case CODE.MODE_CREATE: - setModeInfo({ - ...modeInfo, - modeTitle: "등록", - editURL: '/cop/bbs/insertBBSMasterInfAPI.do' - }); - break; - - case CODE.MODE_MODIFY: - setModeInfo({ - ...modeInfo, - modeTitle: "수정", - editURL: `/cop/bbs/updateBBSMasterInfAPI/${bbsId}.do` - }); - break; - default: - navigate({pathname: URL.ERROR}, {state: {msg : ""}}); - } retrieveDetail(); } const retrieveDetail = () => { if (modeInfo.mode === CODE.MODE_CREATE) {// 조회/등록이면 조회 안함 - setBoardDetail({ - tmplatId: "TMPLAT_BOARD_DEFAULT", //Template 고정 - replyPosblAt: "Y", //답장가능여부 초기값 - fileAtchPosblAt: "Y" //파일첨부가능여부 초기값 - }); return; } - const retrieveDetailURL = '/cop/bbs/selectBBSMasterInfAPI.do'; - + + const retrieveDetailURL = '/admin/boards/board'; + const requestOptions = { - method: "POST", + method: "GET", headers: { 'Content-type': 'application/json', - - }, - body: JSON.stringify({ - bbsId: bbsId - }) + + } } EgovNet.requestFetch(retrieveDetailURL, @@ -81,18 +62,18 @@ function EgovAdminBoardEdit(props) { function (resp) { // 수정모드일 경우 조회값 세팅 if (modeInfo.mode === CODE.MODE_MODIFY) { - setBoardDetail(resp.result.boardMasterVO); + setBoardDetail(item); } } ); } - const formValidator = (formData) => { - if (formData.get('bbsNm') === null || formData.get('bbsNm') === "") { + const formValidator = (formData) => { + if (formData.get('bbsTitle') === null || formData.get('bbsTitle') === "") { alert("게시판명은 필수 값입니다."); return false; } - if (formData.get('bbsIntrcn') === null || formData.get('bbsIntrcn') === "") { + if (formData.get('bbsDesc') === null || formData.get('bbsDesc') === "") { alert("게시판 소개는 필수 값입니다."); return false; } @@ -112,15 +93,15 @@ function EgovAdminBoardEdit(props) { }; const formObjValidator = (checkRef) => { - if(checkRef.current[0].value === ""){ + if (checkRef.current[0].value === "") { alert("게시판명은 필수 값입니다."); return false; } - if(checkRef.current[1].value === ""){ + if (checkRef.current[1].value === "") { alert("게시판 소개는 필수 값입니다."); return false; } - if(checkRef.current[2].value === "0"){ + if (checkRef.current[2].value === "0") { alert("첨부파일 가능 숫자는 필수 값입니다."); return false; } @@ -131,38 +112,37 @@ function EgovAdminBoardEdit(props) { let modeStr = modeInfo.mode === CODE.MODE_CREATE ? "POST" : "PUT"; - let requestOptions ={}; + let requestOptions = {}; if (modeStr === "POST") { const formData = new FormData(); - for (let key in boardDetail) { - formData.append(key, boardDetail[key]); - //console.log("boardDetail [%s] ", key, boardDetail[key]); + for (let key in boardDetail) { + formData.append(key, boardDetail[key]); + //console.log("boardDetail [%s] ", key, boardDetail[key]); + } + + if (formValidator(formData)) { + + requestOptions = { + method: modeStr, + headers: {}, + body: formData } - if (formValidator(formData)) { - - requestOptions = { - method: modeStr, - headers: { - - }, - body: formData - } - - EgovNet.requestFetch(modeInfo.editURL, - requestOptions, - (resp) => { - if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { - navigate({ pathname: URL.ADMIN_BOARD }); - } else { - navigate({pathname: URL.ERROR}, {state: {msg : resp.resultMessage}}); - } + EgovNet.requestFetch(modeInfo.editURL, + requestOptions, + (resp) => { + if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { + navigate({pathname: URL.ADMIN_BOARD}); + } else { + navigate({pathname: URL.ERROR}, {state: {msg: resp.resultMessage}}); } - ); - }; + } + ); + } + ; } else { if (formObjValidator(checkRef)) { @@ -171,7 +151,7 @@ function EgovAdminBoardEdit(props) { method: modeStr, headers: { 'Content-type': 'application/json', - + }, body: JSON.stringify({...boardDetail}) } @@ -180,24 +160,24 @@ function EgovAdminBoardEdit(props) { requestOptions, (resp) => { if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { - navigate({ pathname: URL.ADMIN_BOARD }); + navigate({pathname: URL.ADMIN_BOARD}); } else { - navigate({pathname: URL.ERROR}, {state: {msg : resp.resultMessage}}); + navigate({pathname: URL.ERROR}, {state: {msg: resp.resultMessage}}); } } ); - } + } } }; const deleteBoardArticle = (bbsId) => { const deleteBoardURL = `/cop/bbs/deleteBBSMasterInfAPI/${bbsId}.do`; - + const requestOptions = { method: "PUT", headers: { 'Content-type': 'application/json', - + }, body: JSON.stringify({ bbsId: bbsId @@ -210,7 +190,7 @@ function EgovAdminBoardEdit(props) { console.log("====>>> board delete= ", resp); if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { alert("게시글이 삭제되었습니다.") - navigate(URL.ADMIN_BOARD, { replace: true }); + navigate(URL.ADMIN_BOARD, {replace: true}); } else { alert("ERR : " + resp.resultMessage); } @@ -225,206 +205,76 @@ function EgovAdminBoardEdit(props) { useEffect(() => { initMode(); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); console.log("------------------------------EgovAdminBoardEdit [End]"); console.groupEnd("EgovAdminBoardEdit"); return ( -
-
- {/* */} -
-
    -
  • Home
  • -
  • 사이트관리
  • -
  • 게시판생성 관리
  • -
-
- {/* */} + <> + {/* */} + + + {modeInfo.mode === CODE.MODE_CREATE && '게시판 생성'} + {modeInfo.mode === CODE.MODE_MODIFY && '게시판 수정'} + + -
- {/* */} - - {/* */} - -
- {/* */} - -
-

사이트관리

-
- - {modeInfo.mode === CODE.MODE_CREATE && -

게시판 생성

- } - - {modeInfo.mode === CODE.MODE_MODIFY && -

게시판 수정

- } - -
-
-
필수
-
- setBoardDetail({ ...boardDetail, bbsNm: e.target.value })} - ref={el => (checkRef.current[0] = el)} - /> -
-
-
-
필수
-
- -
-
-
-
게시판 유형필수
-
- {/* 수정/조회 일때 변경 불가 */} - {modeInfo.mode === CODE.MODE_CREATE && - - } - {modeInfo.mode === CODE.MODE_MODIFY && - - {boardDetail.bbsTyCode && getSelectedLabel(bbsTyCodeOptions, boardDetail.bbsTyCode)} - - } +
+
- - -
-
게시판 속성필수
-
- {/* 등록 일때 변경 가능 */} - {modeInfo.mode === CODE.MODE_CREATE && - - } - {/* 수정/조회 일때 변경 불가 */} - {modeInfo.mode === CODE.MODE_MODIFY && - - {boardDetail.bbsAttrbCode && getSelectedLabel(bbsAttrbCodeOptions, boardDetail.bbsAttrbCode)} - - } -
-
-
-
답장가능여부필수
-
- {/* 등록 일때 변경 가능 */} - {modeInfo.mode === CODE.MODE_CREATE && - setBoardDetail({ ...boardDetail, replyPosblAt: v })} /> - } - {/* 수정/조회 일때 변경 불가 */} - {modeInfo.mode === CODE.MODE_MODIFY && - - {boardDetail.replyPosblAt && getSelectedLabel(replyPosblAtRadioGroup, boardDetail.replyPosblAt)} - - } -
-
-
-
파일첨부가능여부필수
-
- setBoardDetail({ ...boardDetail, fileAtchPosblAt: v })} /> -
-
-
-
필수
-
- -
-
- - {/* */} -
-
- - {modeInfo.mode === CODE.MODE_MODIFY && - - } -
- -
- 목록 -
-
- {/* */} + {/* */} +
+
+ + {modeInfo.mode === CODE.MODE_MODIFY && + + }
- {/* */} +
+ 목록 +
+ {/* */}
-
-
+ + ); } diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/boards/List.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/boards/List.jsx index bf22d7d..460f91b 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/boards/List.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/boards/List.jsx @@ -3,11 +3,15 @@ import { Link, useLocation } from 'react-router-dom'; import * as EgovNet from 'api/egovFetch'; import URL from 'constants/url'; +import CODE from 'constants/code'; import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin'; import EgovPaging from 'components/EgovPaging'; import { itemIdxByPage } from 'utils/calc'; +import MenuModal from "../config/menuMgt/MenuModal"; +import Modal from "react-bootstrap/Modal"; +import EgovAdminBoardEdit from "../board/EgovAdminBoardEdit"; function EgovAdminBoardList(props) { console.group("EgovAdminBoardList"); @@ -20,10 +24,15 @@ function EgovAdminBoardList(props) { // eslint-disable-next-line no-unused-vars const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { pageIndex: 1, searchCnd: '0', searchWrd: '' });// 기존 조회에서 접근 했을 시 || 신규로 접근 했을 시 const [paginationInfo, setPaginationInfo] = useState({}); - const [listTag, setListTag] = useState([]); + const [show, setShow] = useState(false); + const [modalBody, setModalBody] = useState(); + const handleClose = () => setShow(false); + const handleShow = () => setShow(true); + const retrieveList = useCallback(() => { + handleClose(); console.groupCollapsed("AdminBoardList.retrieveList()"); const retrieveListURL = '/admin/boards/board-list'; @@ -49,14 +58,15 @@ function EgovAdminBoardList(props) { if (index === 0) mutListTag = []; // 목록 초기화 mutListTag.push( - +
{item.bbsSeq}
{item.bbsId}
{item.bbsTitle}
{item.frstCrtId}
{item.frstCrtDt}
{item.lastChgDt}
- +
+
); }); @@ -75,6 +85,14 @@ function EgovAdminBoardList(props) { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + function editBoard(item){ + handleShow(); + if(item != undefined) { + item.mode = CODE.MODE_MODIFY; + } + setModalBody() + } + console.log("------------------------------EgovAdminBoardList [End]"); console.groupEnd("EgovAdminBoardList"); return ( @@ -150,6 +168,7 @@ function EgovAdminBoardList(props) { 작성자 작성일 수정일 +
{listTag} @@ -169,6 +188,9 @@ function EgovAdminBoardList(props) {
+ + {modalBody} + diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/AdminBoardsController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/AdminBoardsController.java index 0d89bb4..ac9c550 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/AdminBoardsController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/AdminBoardsController.java @@ -1,5 +1,6 @@ package com.dbnt.kcscbackend.admin.boards; +import com.dbnt.kcscbackend.admin.boards.entity.TnBbs; import com.dbnt.kcscbackend.admin.boards.service.AdminBoardsService; import com.dbnt.kcscbackend.config.common.BaseController; import com.dbnt.kcscbackend.config.common.ResultVO; @@ -42,4 +43,25 @@ public class AdminBoardsController extends BaseController { resultVO.setResult(resultMap); return resultVO; } + + @Operation( + summary = "게시판 단건 조회", + description = "게시판 단건 조회", + tags = {"AdminBoardsController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.GET, value = "/board", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO getBoard(TnBbs tnBbs) throws Exception { + ResultVO resultVO = new ResultVO(); + Map resultMap = new HashMap<>(); + + System.out.println("@@@ : " + tnBbs.getBbsSeq()); + + resultMap.put("board", adminBoardsService.selectBoard(tnBbs.getBbsSeq())); + resultVO.setResult(resultMap); + return resultVO; + } } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/service/AdminBoardsService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/service/AdminBoardsService.java index c8c1d70..0255850 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/service/AdminBoardsService.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/service/AdminBoardsService.java @@ -7,6 +7,7 @@ import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Optional; @Service @RequiredArgsConstructor @@ -16,4 +17,6 @@ public class AdminBoardsService extends EgovAbstractServiceImpl { public List selectBoardList() { return tnBbsRepository.findAll(); } + public Optional selectBoard(Long bbsSeq) { return tnBbsRepository.findById(bbsSeq); } + }