From 56c5db686fc7e87bc19891960fa86c578cc142f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Wed, 28 Feb 2024 09:08:26 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B4=80=EB=A0=A8=EC=82=AC=EC=9D=B4=ED=8A=B8?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=20=EC=9E=91=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/admin/board/AdminPostMgtList.jsx | 8 +- .../src/pages/admin/boards/Keywords.jsx | 154 ++++++++++++++- .../src/pages/admin/boards/List.jsx | 4 +- .../src/pages/admin/config/AboutSiteMgt.jsx | 144 +++++++++++++- .../config/aboutSiteMgt/AboutSiteModal.jsx | 178 ++++++++++++++++++ .../src/routes/index.jsx | 3 +- .../admin/boards/AdminBoardsController.java | 1 + .../admin/config/AdminConfigController.java | 20 ++ .../admin/config/entity/TnPartnerSite.java | 41 ++++ .../repository/TnPartnerSiteRepository.java | 13 ++ .../config/service/AdminConfigService.java | 9 + 11 files changed, 562 insertions(+), 13 deletions(-) create mode 100644 egovframe-template-simple-react-contribution/src/pages/admin/config/aboutSiteMgt/AboutSiteModal.jsx create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/entity/TnPartnerSite.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/repository/TnPartnerSiteRepository.java diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtList.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtList.jsx index cb7bf47..36b6e2b 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtList.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtList.jsx @@ -9,7 +9,7 @@ import EgovPaging from 'components/EgovPaging'; import { itemIdxByPage } from 'utils/calc'; -function EgovAdminBoardList(props) { +function AdminPostMgtList(props) { console.group("EgovAdminBoardList"); console.log("[Start] EgovAdminBoardList ------------------------------"); console.log("EgovAdminBoardList [props] : ", props); @@ -100,7 +100,7 @@ function EgovAdminBoardList(props) { {/* */} @@ -117,7 +117,7 @@ function EgovAdminBoardList(props) {

사이트관리

-

게시판생성 관리

+

게시물 관리

{/* */}
@@ -196,4 +196,4 @@ function EgovAdminBoardList(props) { ); } -export default EgovAdminBoardList; \ No newline at end of file +export default AdminPostMgtList; \ No newline at end of file diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/boards/Keywords.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/boards/Keywords.jsx index 4968282..c485536 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/boards/Keywords.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/boards/Keywords.jsx @@ -1,13 +1,90 @@ -import React, { useState, useEffect, useCallback } from 'react'; -import { Link, useLocation } from 'react-router-dom'; +import React, {useState, useEffect, useCallback} from 'react'; +import {Link, useLocation} from 'react-router-dom'; import * as EgovNet from 'api/egovFetch'; import URL from 'constants/url'; -import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin'; +import {default as EgovLeftNav} from 'components/leftmenu/EgovLeftNavAdmin'; +import Modal from "react-bootstrap/Modal"; +import CODE from "../../../constants/code"; +import EgovAdminBoardEdit from "../board/EgovAdminBoardEdit"; +import {format} from "date-fns"; function StandardCodeMgt(props) { + const location = useLocation(); + + 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'; + + const requestOptions = { + method: "GET", + headers: { + 'Content-type': 'application/json', + + }, + body: JSON.stringify() + } + + EgovNet.requestFetch(retrieveListURL, + requestOptions, + (resp) => { + + let mutListTag = []; + listTag.push(

검색된 결과가 없습니다.

); // 게시판 목록 초기값 + + // 리스트 항목 구성 + resp.result.boardList.forEach(function (item, index) { + if (index === 0) mutListTag = []; // 목록 초기화 + + mutListTag.push( +
+
{item.bbsSeq}
+
{item.bbsId}
+
{item.bbsTitle}
+
{item.frstCrtId}
+
{item.frstCrtDt ? format(item.frstCrtDt, "yyyy-MM-dd HH:mm") : ""}
+
{item.lastChgDt ? format(item.lastChgDt, "yyyy-MM-dd HH:mm") : ""}
+
+
+ ); + }); + + setListTag(mutListTag); + console.log("@@@ resp : "); + }, + function (resp) { + console.log("err response : ", resp); + } + ); + console.groupEnd("EgovAdminBoardList.retrieveList()"); + },[]); + + useEffect(() => { + retrieveList(searchCondition); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + function editBoard(item){ + handleShow(); + if(item != undefined) { + item.mode = CODE.MODE_MODIFY; + } + setModalBody() + } + return (
@@ -15,7 +92,7 @@ function StandardCodeMgt(props) {
  • Home
  • -
  • 사이트관리
  • +
  • 사이트관리
  • 게시판현황
  • 키워드 관리
@@ -29,11 +106,78 @@ function StandardCodeMgt(props) {
-

키워드 관리

+

사이트관리

+

키워드 관리

+ {/* */} + {/*
+
    +
  • + 검색유형선택 + +
  • +
  • + 검색어 + + { + wrdRef.current.value = e.target.value; + }} + /> + + +
  • +
  • + 등록 +
  • +
+
*/} + {/* */} + + {/* */} +
+
+ 번호 + 아이디 + 제목 + 작성자 + 작성일 + 수정일 + +
+
+ {listTag} +
+
+ {/* */} + +
+ {/* */} + {/* { + retrieveList({ ...searchCondition, pageIndex: passedPage, searchCnd: cndRef.current.value, searchWrd: wrdRef.current.value }) + }} />*/} + {/* */} +
+ + {/* */}
+ + {modalBody} +
); } 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 62486d4..fe4318e 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 @@ -100,7 +100,7 @@ function EgovAdminBoardList(props) {
  • Home
  • 사이트관리
  • -
  • 게시판생성 관리
  • +
  • 게시판 관리
{/* */} @@ -117,7 +117,7 @@ function EgovAdminBoardList(props) {

사이트관리

-

게시판생성 관리

+

게시판 관리

{/* */} {/*
diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/config/AboutSiteMgt.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/config/AboutSiteMgt.jsx index 82c04d1..0003462 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/config/AboutSiteMgt.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/config/AboutSiteMgt.jsx @@ -5,9 +5,85 @@ import * as EgovNet from 'api/egovFetch'; import URL from 'constants/url'; import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin'; +import CODE from "../../../constants/code"; +import Modal from "react-bootstrap/Modal"; +import AboutSiteModal from "./aboutSiteMgt/AboutSiteModal"; function StandardCodeMgt(props) { + const location = useLocation(); + + 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("AdminPartnerSiteList.retrieveList()"); + + const retrieveListURL = '/admin/config/partner-site-list'; + + const requestOptions = { + method: "GET", + headers: { + 'Content-type': 'application/json', + + }, + body: JSON.stringify() + } + + EgovNet.requestFetch(retrieveListURL, + requestOptions, + (resp) => { + + let mutListTag = []; + listTag.push(

검색된 결과가 없습니다.

); // 게시판 목록 초기값 + + // 리스트 항목 구성 + resp.result.partnerSiteList.forEach(function (item, index) { + if (index === 0) mutListTag = []; // 목록 초기화 + + mutListTag.push( +
+
{item.siteSeq}
+
{item.siteTitle}
+
{item.siteUrl}
+
{item.fileGrpId}
+
{item.siteOrder}
+
{item.useYn}
+
+
+ ); + }); + + setListTag(mutListTag); + console.log("@@@ resp : "); + }, + function (resp) { + console.log("err response : ", resp); + } + ); + console.groupEnd("EgovAdminBoardList.retrieveList()"); + },[]); + + useEffect(() => { + retrieveList(searchCondition); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + function editBoard(item){ + handleShow(); + if(item != undefined) { + item.mode = CODE.MODE_MODIFY; + } + setModalBody() + } + return (
@@ -15,7 +91,7 @@ function StandardCodeMgt(props) {
  • Home
  • -
  • 사이트관리
  • +
  • 사이트관리
  • 환경설정
  • 관련사이트 관리
@@ -31,9 +107,75 @@ function StandardCodeMgt(props) {

관련사이트 관리

+ {/* */} + {/*
+
    +
  • + 검색유형선택 + +
  • +
  • + 검색어 + + { + wrdRef.current.value = e.target.value; + }} + /> + + +
  • +
  • + 등록 +
  • +
+
*/} + {/* */} + + {/* */} +
+
+ 번호 + 사이트명 + URL + 배너이미지 + 정렬순서 + 사용여부 + +
+
+ {listTag} +
+
+ {/* */} + +
+ {/* */} + {/* { + retrieveList({ ...searchCondition, pageIndex: passedPage, searchCnd: cndRef.current.value, searchWrd: wrdRef.current.value }) + }} />*/} + {/* */} +
+ + {/* */}
+ + {modalBody} +
); } diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/config/aboutSiteMgt/AboutSiteModal.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/config/aboutSiteMgt/AboutSiteModal.jsx new file mode 100644 index 0000000..0f9e22e --- /dev/null +++ b/egovframe-template-simple-react-contribution/src/pages/admin/config/aboutSiteMgt/AboutSiteModal.jsx @@ -0,0 +1,178 @@ +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 EgovRadioButtonGroup from 'components/EgovRadioButtonGroup'; +import {Form} from "react-bootstrap"; + + +function AboutSiteModal({props, reloadFunction}) { + console.group("AboutSiteModal"); + console.log("[Start] AboutSiteModal ------------------------------"); + console.log("AboutSiteModal [props] : ", props); + + const navigate = useNavigate(); + const location = useLocation(); + const checkRef = useRef([]); + + console.log("AboutSiteModal [location] : ", location); + + let item = null; + item = props; + console.log("@@@ item : " + JSON.stringify(item)); + + const [modeInfo, setModeInfo] = useState(item != null ? {mode: props.mode} : {mode: CODE.MODE_CREATE}); + const [boardDetail, setBoardDetail] = useState({}); + console.log("@@@ mode : " + modeInfo.mode); + + 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("저장되었습니다."); + reloadFunction(); + } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { + console.log("토큰 갱신중.") + } else { + alert(resp.result.resultMessage) + } + } + ) + } + + function deleteBoard(bbs){ + if(window.confirm("삭제하시겠습니까?")) { + EgovNet.requestFetch( + '/admin/boards/board-mgt', + { + method: "DELETE", + headers: { + 'Content-type': 'application/json' + }, + body: JSON.stringify(bbs) + }, + (resp) => { + if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { + alert("삭제되었습니다.") + reloadFunction(); + } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { + console.log("토큰 갱신중.") + } else { + alert(resp.result.resultMessage) + } + } + ) + } + } + + console.log("------------------------------AboutSiteModal [End]"); + console.groupEnd("AboutSiteModal"); + + return ( + <> + {/* */} + + + {modeInfo.mode === CODE.MODE_CREATE && '관련사이트 생성'} + {modeInfo.mode === CODE.MODE_MODIFY && '관련사이트 수정'} + + + + +
+
{editBoard(e)}} noValidate> +
+
필수
+
+ +
+
+
+
필수
+
+ +
+
+
+
필수
+
+ +
+
+
+
필수
+
+ +
+
+
+
필수
+
+ +
+
+ + {/* */} +
+
+ + {modeInfo.mode === CODE.MODE_MODIFY && + + } +
+ +
+ +
+
+ {/* */} +
+
+
+ + + ); +} + +export default AboutSiteModal; \ No newline at end of file diff --git a/egovframe-template-simple-react-contribution/src/routes/index.jsx b/egovframe-template-simple-react-contribution/src/routes/index.jsx index 2f69395..d3dc967 100644 --- a/egovframe-template-simple-react-contribution/src/routes/index.jsx +++ b/egovframe-template-simple-react-contribution/src/routes/index.jsx @@ -117,6 +117,7 @@ import StandardCodeInfo from "../pages/standardCode/info/StandardCodeInfo"; import * as EgovNet from 'api/egovFetch'; // jwt토큰 위조 검사 때문에 추가 import initPage from 'js/ui'; +import AdminPostMgtList from "../pages/admin/board/AdminPostMgtList"; const RootRoutes = () => { //useLocation객체를 이용하여 정규표현식을 사용한 /admin/~ 으로 시작하는 경로와 비교에 사용(아래 1줄) */} @@ -291,7 +292,7 @@ const SecondRoutes = () => { {/* 관리자 - 게시판 현황 */} } /> - } /> + } /> } /> {/* 관리자 - 건설기준 관리 */} 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 d3769ed..9215a7b 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 @@ -130,4 +130,5 @@ public class AdminBoardsController extends BaseController { resultVO.setResult(resultMap); return resultVO; } + } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/AdminConfigController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/AdminConfigController.java index 9f36621..4b5b478 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/AdminConfigController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/AdminConfigController.java @@ -402,4 +402,24 @@ public class AdminConfigController extends BaseController { return resultVO; } + /* ---- 관련사이트 관리 ----- */ + @Operation( + summary = "관련사이트 목록 조회", + description = "관련사이트 목록 조회", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.GET, value = "/partner-site-list", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO getPartnerSiteList() throws Exception { + ResultVO resultVO = new ResultVO(); + Map resultMap = new HashMap<>(); + + resultMap.put("partnerSiteList", adminConfigService.selectPartnerSiteList()); + resultVO.setResult(resultMap); + return resultVO; + } + } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/entity/TnPartnerSite.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/entity/TnPartnerSite.java new file mode 100644 index 0000000..84e2347 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/entity/TnPartnerSite.java @@ -0,0 +1,41 @@ +package com.dbnt.kcscbackend.admin.config.entity; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.*; +import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@NoArgsConstructor +@DynamicInsert +@DynamicUpdate +@Table(name = "tn_partner_site") +public class TnPartnerSite { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "site_seq") + private int siteSeq; + + @Column(name = "site_title", nullable = false, length = 500) + private String siteTitle; + + @Column(name = "site_url", nullable = false, length = 500) + private String siteUrl; + + @Column(name = "file_grp_id", length = 255) + private String fileGrpId; + + @Column(name = "site_order", nullable = false) + private int siteOrder; + + @Column(name = "use_yn", nullable = false, length = 1) + private char useYn; +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/repository/TnPartnerSiteRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/repository/TnPartnerSiteRepository.java new file mode 100644 index 0000000..955bf17 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/repository/TnPartnerSiteRepository.java @@ -0,0 +1,13 @@ +package com.dbnt.kcscbackend.admin.config.repository; + +import com.dbnt.kcscbackend.admin.config.entity.TnPartnerSite; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +public interface TnPartnerSiteRepository extends JpaRepository { + + List findAllByOrderBySiteOrder(); + +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/service/AdminConfigService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/service/AdminConfigService.java index 0c5fd44..8ee4045 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/service/AdminConfigService.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/service/AdminConfigService.java @@ -1,10 +1,13 @@ package com.dbnt.kcscbackend.admin.config.service; +import com.dbnt.kcscbackend.admin.boards.entity.TnBbs; import com.dbnt.kcscbackend.admin.config.entity.TbMenuRole; import com.dbnt.kcscbackend.admin.config.entity.TcMenu; +import com.dbnt.kcscbackend.admin.config.entity.TnPartnerSite; import com.dbnt.kcscbackend.admin.config.mapper.TcMenuMapper; import com.dbnt.kcscbackend.admin.config.repository.TbMenuRoleRepository; import com.dbnt.kcscbackend.admin.config.repository.TcMenuRepository; +import com.dbnt.kcscbackend.admin.config.repository.TnPartnerSiteRepository; import com.dbnt.kcscbackend.commonCode.entity.TcCodeGrp; import com.dbnt.kcscbackend.commonCode.entity.TcCodeItem; import com.dbnt.kcscbackend.commonCode.repository.TcCodeGrpRepository; @@ -27,6 +30,7 @@ public class AdminConfigService extends EgovAbstractServiceImpl { private final TcMenuRepository menuRepository; private final TbMenuRoleRepository menuRoleRepository; private final TcMenuMapper menuMapper; + private final TnPartnerSiteRepository tnPartnerSiteRepository; public List selectCodeGrpList(){ return codeGrpRepository.findByUseYn("Y"); @@ -165,4 +169,9 @@ public class AdminConfigService extends EgovAbstractServiceImpl { } menuRoleRepository.saveAll(roleList); } + + public List selectPartnerSiteList() { + return tnPartnerSiteRepository.findAllByOrderBySiteOrder(); + } + }