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 4e6d3fc..49865e2 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 @@ -8,9 +8,10 @@ import CODE from 'constants/code'; import {default as EgovLeftNav} from 'components/leftmenu/EgovLeftNavAdmin'; import EgovRadioButtonGroup from 'components/EgovRadioButtonGroup'; +import {Form} from "react-bootstrap"; -function EgovAdminBoardEdit(props) { +function EgovAdminBoardEdit({props, reloadFunction}) { console.group("EgovAdminBoardEdit"); console.log("[Start] EgovAdminBoardEdit ------------------------------"); console.log("EgovAdminBoardEdit [props] : ", props); @@ -21,193 +22,58 @@ function EgovAdminBoardEdit(props) { 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개"}]; - let item = null; - item = props.props; + item = props; console.log("@@@ item : " + JSON.stringify(item)); - - - const [modeInfo, setModeInfo] = useState(item != null ? {mode: props.props.mode} : {mode: CODE.MODE_CREATE}); + const [modeInfo, setModeInfo] = useState(item != null ? {mode: props.mode} : {mode: CODE.MODE_CREATE}); const [boardDetail, setBoardDetail] = useState({}); console.log("@@@ mode : " + modeInfo.mode); - const initMode = () => { - retrieveDetail(); - } - - const retrieveDetail = () => { - if (modeInfo.mode === CODE.MODE_CREATE) {// 조회/등록이면 조회 안함 - return; - } - - - const retrieveDetailURL = '/admin/boards/board'; - - const requestOptions = { - method: "GET", - headers: { - 'Content-type': 'application/json', - - } - } - - EgovNet.requestFetch(retrieveDetailURL, - requestOptions, - function (resp) { - // 수정모드일 경우 조회값 세팅 - if (modeInfo.mode === CODE.MODE_MODIFY) { - setBoardDetail(item); - } - } - ); - } - - const formValidator = (formData) => { - if (formData.get('bbsTitle') === null || formData.get('bbsTitle') === "") { - alert("게시판명은 필수 값입니다."); - return false; - } - if (formData.get('bbsDesc') === null || formData.get('bbsDesc') === "") { - alert("게시판 소개는 필수 값입니다."); - return false; - } - if (formData.get('bbsTyCode') === null || formData.get('bbsTyCode') === "") { - alert("게시판 유형은 필수 값입니다."); - return false; - } - if (formData.get('bbsAttrbCode') === null || formData.get('bbsAttrbCode') === "") { - alert("게시판 속성은 필수 값입니다."); - return false; - } - if (formData.get('posblAtchFileNumber') === null || formData.get('posblAtchFileNumber') === "") { - alert("첨부파일 가능 숫자는 필수 값입니다."); - return false; - } - return true; - }; - - const formObjValidator = (checkRef) => { - if (checkRef.current[0].value === "") { - alert("게시판명은 필수 값입니다."); - return false; - } - if (checkRef.current[1].value === "") { - alert("게시판 소개는 필수 값입니다."); - return false; - } - if (checkRef.current[2].value === "0") { - alert("첨부파일 가능 숫자는 필수 값입니다."); - return false; - } - return true; - }; - - const updateBoard = () => { - - let modeStr = modeInfo.mode === CODE.MODE_CREATE ? "POST" : "PUT"; - - 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]); - } - - 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}}); - } - } - ); - } - ; - - } else { - if (formObjValidator(checkRef)) { - - requestOptions = { - method: modeStr, - headers: { - 'Content-type': 'application/json', - - }, - body: JSON.stringify({...boardDetail}) - } - - 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}}); - } - } - ); - } - } - }; - - const deleteBoardArticle = (bbsId) => { - const deleteBoardURL = `/cop/bbs/deleteBBSMasterInfAPI/${bbsId}.do`; - - const requestOptions = { - method: "PUT", - headers: { - 'Content-type': 'application/json', - - }, - body: JSON.stringify({ - bbsId: bbsId - }) - } - - EgovNet.requestFetch(deleteBoardURL, - requestOptions, - (resp) => { - console.log("====>>> board delete= ", resp); - if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { - alert("게시글이 삭제되었습니다.") - navigate(URL.ADMIN_BOARD, {replace: true}); - } else { - alert("ERR : " + resp.resultMessage); - } - } - ); - } - - const getSelectedLabel = (objArray, findLabel = "") => { - let foundValueLabelObj = objArray.find(o => o['value'] === findLabel); - return foundValueLabelObj['label']; - } - useEffect(() => { initMode(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const initMode = () => { + if (modeInfo.mode === CODE.MODE_MODIFY) { + setBoardDetail(item); + } + } + + function editBoard(e) { + e.preventDefault(); + e.stopPropagation(); + const form = e.target; + const info = { + bbsId: form.bbsId.value, + bbsTitle: form.bbsTitle.value, + bbsDesc: form.bbsDesc.value + } + if (modeInfo.mode === CODE.MODE_MODIFY) { + info.bbsSeq = props.bbsSeq; + } + EgovNet.requestFetch( + '/admin/boards/board-mgt', + { + method: "PUT", + headers: { + 'Content-type': 'application/json' + }, + body: JSON.stringify(info) + }, + (resp) => { + if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { + alert("저장되었습니다.") + } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { + console.log("토큰 갱신중.") + } else { + alert(resp.result.resultMessage) + } + } + ) + } + console.log("------------------------------EgovAdminBoardEdit [End]"); console.groupEnd("EgovAdminBoardEdit"); @@ -223,55 +89,45 @@ function EgovAdminBoardEdit(props) {
-
-
필수
-
- setBoardDetail({...boardDetail, bbsId: e.target.value})} - ref={el => (checkRef.current[0] = el)} - /> -
-
-
-
필수
-
- setBoardDetail({...boardDetail, bbsTitle: e.target.value})} - ref={el => (checkRef.current[0] = el)} - /> -
-
-
-
필수
-
- -
-
+
{editBoard(e)}} noValidate> +
+
필수
+
+ +
+
+
+
필수
+
+ +
+
+
+
필수
+
+ +
+
- {/* */} -
-
- - {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 460f91b..5f2f31b 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 @@ -90,7 +90,7 @@ function EgovAdminBoardList(props) { if(item != undefined) { item.mode = CODE.MODE_MODIFY; } - setModalBody() + setModalBody() } console.log("------------------------------EgovAdminBoardList [End]"); 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 ac9c550..e8fbe2a 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 @@ -2,7 +2,10 @@ 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.admin.config.entity.TcMenu; +import com.dbnt.kcscbackend.auth.entity.LoginVO; import com.dbnt.kcscbackend.config.common.BaseController; +import com.dbnt.kcscbackend.config.common.ResponseCode; import com.dbnt.kcscbackend.config.common.ResultVO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -10,17 +13,22 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.validation.Errors; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import javax.validation.Valid; import java.util.HashMap; import java.util.Map; @RestController @RequiredArgsConstructor @RequestMapping("/admin/boards") -@Tag(name="AdminBoardsController", description = "사이트관리 게시판현황") +@Tag(name = "AdminBoardsController", description = "사이트관리 게시판현황") public class AdminBoardsController extends BaseController { private final AdminBoardsService adminBoardsService; @@ -45,23 +53,34 @@ public class AdminBoardsController extends BaseController { } @Operation( - summary = "게시판 단건 조회", - description = "게시판 단건 조회", - tags = {"AdminBoardsController"} + summary = "게시판 저장", + description = "게시판 저장", + tags = {"AdminConfigController"} ) @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "조회 성공"), + @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 { + @RequestMapping(method = RequestMethod.PUT, value = "/board-mgt") + public ResultVO saveBoardMgt(@RequestBody @Valid TnBbs bbs, Errors errors, @AuthenticationPrincipal LoginVO user) { ResultVO resultVO = new ResultVO(); - Map resultMap = new HashMap<>(); - - System.out.println("@@@ : " + tnBbs.getBbsSeq()); - - resultMap.put("board", adminBoardsService.selectBoard(tnBbs.getBbsSeq())); - resultVO.setResult(resultMap); + if (user == null) { + resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); + } else { + if (errors.hasErrors()) { + StringBuilder msg = new StringBuilder(); + for (FieldError error : errors.getFieldErrors()) { + msg.append(error.getDefaultMessage()); + msg.append("\n"); + } + resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); + resultVO.setResultMessage(msg.toString()); + } else { + System.out.println("@@@ bbs.getBbsSeq() : " + bbs.getBbsSeq()); + adminBoardsService.saveBoard(bbs, user.getId()); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + } + } return resultVO; } } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/entity/TnBbs.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/entity/TnBbs.java index 8f6a699..f91277a 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/entity/TnBbs.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/entity/TnBbs.java @@ -6,7 +6,8 @@ import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; import javax.persistence.*; -import java.time.LocalDate; +import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; @Getter @Setter @@ -22,22 +23,25 @@ public class TnBbs { private Long bbsSeq; @Column(name = "bbs_id", nullable = false) + @NotBlank(message = "게시판 ID를 입력해주세요.") private String bbsId; @Column(name = "bbs_title", nullable = false) + @NotBlank(message = "게시판 이름을 입력해주세요.") private String bbsTitle; @Column(name = "bbs_desc") + @NotBlank(message = "게시판 설명을 입력해주세요.") private String bbsDesc; @Column(name = "bbs_type") private String bbsType; @Column(name = "bbs_ans_yn", nullable = false) - private char bbsAnsYn; + private String bbsAnsYn; @Column(name = "bbs_repl_yn", nullable = false) - private char bbsReplYn; + private String bbsReplYn; @Column(name = "read_role_grp_id") private String readRoleGrpId; @@ -52,16 +56,16 @@ public class TnBbs { private String frstCrtId; @Column(name = "frst_crt_dt", nullable = false) - private LocalDate frstCrtDt; + private LocalDateTime frstCrtDt; @Column(name = "last_chg_id") private String lastChgId; @Column(name = "last_chg_dt") - private LocalDate lastChgDt; + private LocalDateTime lastChgDt; @Column(name = "use_yn", nullable = false) - private char useYn; + private String useYn; @Column(name = "oldd_seq") private Long olddSeq; diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/repository/TnBbsRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/repository/TnBbsRepository.java index b907b98..b700de4 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/repository/TnBbsRepository.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/repository/TnBbsRepository.java @@ -3,6 +3,10 @@ package com.dbnt.kcscbackend.admin.boards.repository; import com.dbnt.kcscbackend.admin.boards.entity.TnBbs; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface TnBbsRepository extends JpaRepository { + List findAllByOrderByBbsSeqDesc(); + } 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 0255850..39c25a1 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 @@ -5,7 +5,9 @@ import com.dbnt.kcscbackend.admin.boards.repository.TnBbsRepository; import lombok.RequiredArgsConstructor; import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -15,8 +17,30 @@ public class AdminBoardsService extends EgovAbstractServiceImpl { private final TnBbsRepository tnBbsRepository; - public List selectBoardList() { return tnBbsRepository.findAll(); } + public List selectBoardList() { return tnBbsRepository.findAllByOrderByBbsSeqDesc(); } public Optional selectBoard(Long bbsSeq) { return tnBbsRepository.findById(bbsSeq); } + @Transactional + public void saveBoard(TnBbs bbs, String userId) { + + if (bbs.getBbsSeq() == null) { + bbs.setFrstCrtDt(LocalDateTime.now()); + bbs.setFrstCrtId(userId); + bbs.setBbsAnsYn("N"); + bbs.setBbsReplYn("N"); + bbs.setUseYn("Y"); + tnBbsRepository.save(bbs); + } else { + TnBbs savedBoard = tnBbsRepository.findById(bbs.getBbsSeq()).orElse(null); + savedBoard.setBbsId(bbs.getBbsId()); + savedBoard.setBbsTitle(bbs.getBbsTitle()); + savedBoard.setBbsDesc(bbs.getBbsDesc()); + //savedBoard.setUseYn("Y"); + savedBoard.setLastChgId(userId); + savedBoard.setLastChgDt(LocalDateTime.now()); + tnBbsRepository.save(savedBoard); + } + } + }