From 5f0bed4df0823a24d3d4cff5657f8b1dddfa91d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Tue, 26 Mar 2024 18:00:33 +0900 Subject: [PATCH 01/50] =?UTF-8?q?=EA=B4=80=EB=A0=A8=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=93=9C=EB=9E=98?= =?UTF-8?q?=EA=B7=B8=EC=95=A4=EB=93=9C=EB=A1=AD=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C,=20=EC=A7=81=EC=A0=91=EC=84=A0=ED=83=9D=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C,=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/css/component.css | 75 ++++++++++ .../config/aboutSiteMgt/AboutSiteModal.jsx | 138 +++++++++++++++--- .../admin/config/AdminConfigController.java | 11 +- .../config/service/AdminConfigService.java | 42 +++++- 4 files changed, 242 insertions(+), 24 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/css/component.css b/egovframe-template-simple-react-contribution/src/css/component.css index 1dc342c..23837cf 100644 --- a/egovframe-template-simple-react-contribution/src/css/component.css +++ b/egovframe-template-simple-react-contribution/src/css/component.css @@ -332,4 +332,79 @@ select::-ms-expand {display:none;} .recharts-legend-item-text { font-size: 11px; +} + +.uploadIcon { + width: 100px; + height: 100px; + pointer-events: none; +} + +.file { + display: none; +} + +.file::file-selector-button { + font-size: 14px; + background: #fff; + border: 1px solid #111; + border-radius: 12px; + padding: 4px 32px; + cursor: pointer; +} + +.preview { + width: 400px; + height: 350px; + margin: auto; + background-color: #fff; + border-radius: 5px; + border: 3px dashed #eee; + padding: 70px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + cursor: pointer; +} + +.preview_image { + max-width: 100%; + max-height: 100%; + object-fit: contain; +} + +.preview:hover { + border-color: #111; +} + +.preview_msg { + font-weight: 500; + font-size: 18px; + margin: 20px 0 10px; +} + +.preview_desc { + margin: 0; + font-size: 14px; +} + +.preview_info { + width: 100%; + list-style: none; + padding: 0; + gap: 16px; + display: flex; + flex-direction: column; +} + +.preview_info .info_key { + display: block; + font-weight: 500; + font-size: 12px; + margin-bottom: 4px; +} + +.preview_info .info_value { + font-size: 14px; } \ No newline at end of file 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 index 371d331..3a0044e 100644 --- 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 @@ -19,6 +19,7 @@ function AboutSiteModal({props, reloadFunction}) { const navigate = useNavigate(); const location = useLocation(); const checkRef = useRef([]); + const fileInputRef = useRef(null); console.log("AboutSiteModal [location] : ", location); @@ -32,7 +33,18 @@ function AboutSiteModal({props, reloadFunction}) { useEffect(() => { initMode(); - // eslint-disable-next-line react-hooks/exhaustive-deps + const fileDOM = document.querySelector('#file'); + const preview = document.querySelector('.preview'); + + if(fileDOM) { + fileDOM.addEventListener('change', () => { + const reader = new FileReader(); + reader.onload = ({target}) => { + preview.src = target.result; + }; + reader.readAsDataURL(fileDOM.files[0]); + }); + } }, []); const initMode = () => { @@ -45,24 +57,22 @@ function AboutSiteModal({props, reloadFunction}) { e.preventDefault(); e.stopPropagation(); const form = e.target; - const info = { - siteTitle: form.siteTitle.value, - siteUrl: form.siteUrl.value, - fileGrpId: form.fileGrpId.value, - siteOrder: form.siteOrder.value, - useYn: form.useYn.value - } + const formData = new FormData(form); // 새 FormData 객체 생성 + + // FormData 객체에 파일 데이터 추가 + console.log("@@@ current : " + fileInputRef.current); + console.log("@@@ file : " + fileInputRef.current.files[0]); + formData.append('file', currentFile); + formData.append('fileGrpId', props.fileGrpId); + if (modeInfo.mode === CODE.MODE_MODIFY) { - info.siteSeq = props.siteSeq; + formData.append('siteSeq', props.siteSeq); // 수정 모드일 때 필요한 추가 정보 추가 } EgovNet.requestFetch( '/admin/config/partner-site-mgt', { method: "PUT", - headers: { - 'Content-type': 'application/json' - }, - body: JSON.stringify(info) + body: formData }, (resp) => { if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { @@ -102,6 +112,100 @@ function AboutSiteModal({props, reloadFunction}) { } } + const Logo = () => ( + + + + + ) + + const [currentFile, setCurrentFile] = useState(null); + const [uploadedInfo, setUploadedInfo] = useState(null); + const [previewImage, setPreviewImage] = useState(null); + + const UploadBox = () => { + const [isActive, setActive] = useState(false); + + const onDragEnter = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + }; + const onDragLeave = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + }; + const onDragOver = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + }; + + const setFileInfo = (file) => { + const { name, size: byteSize, type } = file; + const isImage = type.includes('image'); + const size = (byteSize / (1024 * 1024)).toFixed(2) + 'mb'; + setUploadedInfo({ name, size, type }); // name, size, type 정보를 uploadedInfo에 저장 + + if (!isImage) { + setUploadedInfo({ name, size, type }); + return; + } + const reader = new FileReader(); + reader.onload = () => { + setPreviewImage(reader.result); + setUploadedInfo({ name, size, type, imageUrl: String(reader.result) }); + }; + reader.readAsDataURL(file); + }; + + const onDrop = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + setActive(false); + + const droppedFile = e.dataTransfer.files[0]; + console.log("@@@ handleDrop file : " + droppedFile); + if (droppedFile.type.startsWith('image/')) { + setCurrentFile(droppedFile); + setFileInfo(droppedFile); + } else { + // 이미지 파일이 아닌 경우에 대한 처리 + alert('이미지 파일만 업로드할 수 있습니다.'); + } + }; + + const handleUpload = (e: ChangeEvent) => { + const file = e.target.files[0]; + console.log("@@@ handleUpload file : " + file); + if (file.type.startsWith('image/')) { + setCurrentFile(file); + setFileInfo(file); + } else { + // 이미지 파일이 아닌 경우에 대한 처리 + alert('이미지 파일만 업로드할 수 있습니다.'); + } + }; + + return ( + + ); + }; + console.log("------------------------------AboutSiteModal [End]"); console.groupEnd("AboutSiteModal"); @@ -118,6 +222,7 @@ function AboutSiteModal({props, reloadFunction}) { +
{editPartnerSite(e)}} noValidate>
@@ -134,13 +239,6 @@ function AboutSiteModal({props, reloadFunction}) { defaultValue={props?.siteUrl}/>
-
-
필수
-
- -
-
필수
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 92412e5..5ff7f7f 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 @@ -24,6 +24,7 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.Errors; import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -516,7 +517,12 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) @RequestMapping(method = RequestMethod.PUT, value = "/partner-site-mgt") - public ResultVO savePartnerSite(@RequestBody @Valid TnPartnerSite tnPartnerSite, Errors errors, @AuthenticationPrincipal LoginVO user) { + public ResultVO savePartnerSite( + @Valid TnPartnerSite tnPartnerSite, + HttpServletRequest request, + Errors errors, + @RequestParam(required = false) MultipartFile[] file, + @AuthenticationPrincipal LoginVO user) throws Exception { ResultVO resultVO = new ResultVO(); if (user == null) { resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); @@ -531,7 +537,8 @@ public class AdminConfigController extends BaseController { resultVO.setResultMessage(msg.toString()); } else { System.out.println("@@@ bbs.getBbsSeq() : " + tnPartnerSite.getSiteSeq()); - adminConfigService.savePartnerSite(tnPartnerSite, user.getId()); + System.out.println("@@@ file : " + file); + adminConfigService.savePartnerSite(tnPartnerSite, request, user, file); resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); } } 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 ba9a1a8..bc1ed0f 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 @@ -8,17 +8,24 @@ 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.auth.entity.LoginVO; import com.dbnt.kcscbackend.commonCode.entity.TcCodeGrp; import com.dbnt.kcscbackend.commonCode.entity.TcCodeItem; import com.dbnt.kcscbackend.commonCode.repository.TcCodeGrpRepository; import com.dbnt.kcscbackend.commonCode.repository.TcCodeItemRepository; +import com.dbnt.kcscbackend.file.entity.TnAttachFile; +import com.dbnt.kcscbackend.file.service.FileService; import lombok.RequiredArgsConstructor; import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; +import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Optional; @@ -32,6 +39,7 @@ public class AdminConfigService extends EgovAbstractServiceImpl { private final TbMenuRoleRepository menuRoleRepository; private final TcMenuMapper menuMapper; private final TnPartnerSiteRepository tnPartnerSiteRepository; + private final FileService fileService; public List selectCodeGrpList(){ return codeGrpRepository.findByUseYn("Y"); @@ -175,17 +183,47 @@ public class AdminConfigService extends EgovAbstractServiceImpl { return tnPartnerSiteRepository.findAllByOrderBySiteOrder(); } - @Transactional - public void savePartnerSite(TnPartnerSite tnPartnerSite, String userId) { + /** + * 파일이 저장될 중간 경로를 생성한다. + * D:/kcscUploadFiles/XXXX/abc.jpg XXXX에 해당하는 경로다. + * + * @return 중간 경로 + */ + private String getMiddlePath() { + //파일이 저장될 경로를 생성한다. + String domainPath = "partnerSite"; + Date nowDate = new Date(); + String strNowYyyy = new SimpleDateFormat("yyyy").format(nowDate); + String strNowYyyyMmdd = new SimpleDateFormat("yyyyMMdd").format(nowDate); + String middlePath = domainPath + "/" + strNowYyyy + "/" + strNowYyyyMmdd + "/"; + + return middlePath; + } + + public void savePartnerSite(TnPartnerSite tnPartnerSite, HttpServletRequest request, LoginVO user, MultipartFile[] file) throws Exception { if (tnPartnerSite.getSiteSeq() == null) { + String fileGrpId = fileService.addTnAttachFile(request, user, file, this.getMiddlePath()); + tnPartnerSite.setFileGrpId(fileGrpId); tnPartnerSiteRepository.save(tnPartnerSite); } else { + String fileGrpId = tnPartnerSite.getFileGrpId(); + System.out.println("@@@ fileGrpId : " + fileGrpId); + if (file != null && file.length > 0) { + List tnAttachFileList = fileService.findByFileGrpId(fileGrpId); + if (tnAttachFileList != null) { + for (TnAttachFile item : tnAttachFileList) { + fileService.deleteTnAttachFile(request, user, item.getFileSeq().longValue()); + } + } + fileGrpId = fileService.addTnAttachFile(request, user, file, this.getMiddlePath()); + } TnPartnerSite savedPartnerSite = tnPartnerSiteRepository.findById(tnPartnerSite.getSiteSeq()).orElse(null); savedPartnerSite.setSiteTitle(tnPartnerSite.getSiteTitle()); savedPartnerSite.setSiteUrl(tnPartnerSite.getSiteUrl()); savedPartnerSite.setFileGrpId(tnPartnerSite.getFileGrpId()); savedPartnerSite.setSiteOrder(tnPartnerSite.getSiteOrder()); savedPartnerSite.setUseYn(tnPartnerSite.getUseYn()); + savedPartnerSite.setFileGrpId(fileGrpId); tnPartnerSiteRepository.save(savedPartnerSite); } } From 9c7651f2cd2ddff7da344a1cf141c4ae7fbcc348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Fri, 29 Mar 2024 15:38:36 +0900 Subject: [PATCH 02/50] =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/config/AboutSiteMgt.jsx | 2 +- .../admin/config/AdminConfigController.java | 13 +++++++++++-- .../admin/config/entity/TnPartnerSite.java | 3 +++ 3 files changed, 15 insertions(+), 3 deletions(-) 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 3bf6bab..bf4c533 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 @@ -53,7 +53,7 @@ function StandardCodeMgt(props) {
{item.siteTitle}
{item.siteUrl}
-
{item.fileGrpId}
+
{item.filePath}
{item.siteOrder}
{item.useYn}
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 5ff7f7f..56ce9a0 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 @@ -13,6 +13,8 @@ import com.dbnt.kcscbackend.commonCode.service.CommonCodeService; import com.dbnt.kcscbackend.config.common.BaseController; import com.dbnt.kcscbackend.config.common.ResponseCode; import com.dbnt.kcscbackend.config.common.ResultVO; +import com.dbnt.kcscbackend.file.entity.TnAttachFile; +import com.dbnt.kcscbackend.file.service.FileService; import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -31,6 +33,7 @@ import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.time.LocalDateTime; import java.util.HashMap; +import java.util.List; import java.util.Map; @RestController @@ -41,6 +44,7 @@ public class AdminConfigController extends BaseController { private final AdminConfigService adminConfigService; private final CommonCodeService commonCodeService; + private final FileService fileService; @Resource(name = "adminCommitteeCodeManagementService") private AdminCommitteeCodeManagementService adminCommitteeCodeManagementService; @@ -501,8 +505,13 @@ public class AdminConfigController extends BaseController { public ResultVO getPartnerSiteList() throws Exception { ResultVO resultVO = new ResultVO(); Map resultMap = new HashMap<>(); - - resultMap.put("partnerSiteList", adminConfigService.selectPartnerSiteList()); + List tnPartnerSite = adminConfigService.selectPartnerSiteList(); + for (TnPartnerSite partnerSite : tnPartnerSite) { + String fileGrpId = partnerSite.getFileGrpId(); + String filePath = fileService.findByFileGrpId(fileGrpId).get(0).getFilePath(); + partnerSite.setFilePath(filePath); + } + resultMap.put("partnerSiteList", tnPartnerSite); 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 index 3f5b1a8..aecd812 100644 --- 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 @@ -35,4 +35,7 @@ public class TnPartnerSite { @Column(name = "use_yn", nullable = false, length = 1) private String useYn; + + @Transient + private String filePath; } From e51a2006e246502cfbdbac8390d94bf45caec8cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Mon, 1 Apr 2024 11:45:31 +0900 Subject: [PATCH 03/50] =?UTF-8?q?=EA=B4=80=EB=A0=A8=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/config/AboutSiteMgt.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 bf4c533..8b47b93 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 @@ -53,7 +53,7 @@ function StandardCodeMgt(props) {
{item.siteTitle}
{item.siteUrl}
-
{item.filePath}
+
이미지
{item.siteOrder}
{item.useYn}
From 28bb4a6075fbef4d37d7e2824995759539c3a6e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Mon, 1 Apr 2024 16:31:14 +0900 Subject: [PATCH 04/50] =?UTF-8?q?=EA=B4=80=EB=A0=A4=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/config/AboutSiteMgt.jsx | 2 +- kcsc-back-end/src/main/resources/application-prod.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 8b47b93..362e459 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 @@ -53,7 +53,7 @@ function StandardCodeMgt(props) {
{item.siteTitle}
{item.siteUrl}
-
이미지
+
이미지 window.open(item.filePath)}/>
{item.siteOrder}
{item.useYn}
diff --git a/kcsc-back-end/src/main/resources/application-prod.properties b/kcsc-back-end/src/main/resources/application-prod.properties index f83f0aa..c2e9161 100644 --- a/kcsc-back-end/src/main/resources/application-prod.properties +++ b/kcsc-back-end/src/main/resources/application-prod.properties @@ -34,5 +34,5 @@ logging.level.com.atoz_develop.mybatissample.repository=info # File Config Globals.posblAtchFileSize=5242880 -Globals.fileStorePath=D:\\kcscUploadFiles +Globals.fileStorePath=/kcscUploadFiles Globals.addedOptions=false From 70f10678846e3f976813461d3c03f1ad519a7b21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Tue, 2 Apr 2024 17:54:52 +0900 Subject: [PATCH 05/50] =?UTF-8?q?=EA=B4=80=EB=A0=A8=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/config/AboutSiteMgt.jsx | 3 +- .../admin/config/AdminConfigController.java | 52 +++++++++++++++++++ .../config/security/SecurityConfig.java | 5 +- 3 files changed, 58 insertions(+), 2 deletions(-) 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 362e459..e2b01c2 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 @@ -8,6 +8,7 @@ import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin'; import CODE from "../../../constants/code"; import Modal from "react-bootstrap/Modal"; import AboutSiteModal from "./aboutSiteMgt/AboutSiteModal"; +import {Image} from "react-bootstrap"; function StandardCodeMgt(props) { @@ -53,7 +54,7 @@ function StandardCodeMgt(props) {
{item.siteTitle}
{item.siteUrl}
-
이미지 window.open(item.filePath)}/>
+
이미지 window.open(e.target.src)}/>
{item.siteOrder}
{item.useYn}
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 56ce9a0..833b460 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 @@ -30,7 +30,12 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; @@ -516,6 +521,53 @@ 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 = "/get-site-image") + public void getSiteImage(HttpServletResponse response, @RequestParam String fileGrpId) throws Exception { + System.out.println("@@@ in : "); + List dbImgList = fileService.findByFileGrpId(fileGrpId); + String realFile = dbImgList.get(0).getFilePath(); + String fileNm = dbImgList.get(0).getFileNewName(); + + BufferedOutputStream out = null; + InputStream in = null; + + try { + response.setContentType("image/jpeg;charset=UTF-8"); + response.setHeader("Content-Disposition", "inline;filename=\"" + fileNm + "\""); + File file = new File(realFile); + if (file.exists()) { + in = new FileInputStream(file); + out = new BufferedOutputStream(response.getOutputStream()); + int len; + byte[] buf = new byte[1024]; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + } + } catch (Exception e) { + + } finally { + if (out != null) { + out.flush(); + } + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } + } + @Operation( summary = "관련사이트 저장", description = "관련사이트 저장", diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java index 85a7126..46b0af1 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java @@ -87,7 +87,10 @@ public class SecurityConfig { "/swagger-ui/**", /*기준코드 조회*/ - "/standardCode/**" + "/standardCode/**", + + /*임시 20240402 */ + "/admin/**" }; private static final String[] ORIGINS_WHITELIST = { "http://localhost:3000", From 487e3946d673cf54a79433b9370b73b6fc0b244c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Tue, 2 Apr 2024 18:01:57 +0900 Subject: [PATCH 06/50] =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dbnt/kcscbackend/config/security/SecurityConfig.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java index 46b0af1..85a7126 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java @@ -87,10 +87,7 @@ public class SecurityConfig { "/swagger-ui/**", /*기준코드 조회*/ - "/standardCode/**", - - /*임시 20240402 */ - "/admin/**" + "/standardCode/**" }; private static final String[] ORIGINS_WHITELIST = { "http://localhost:3000", From 961f0abf673f46e3ada1ba6078f775c03e8fc0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Wed, 3 Apr 2024 10:14:05 +0900 Subject: [PATCH 07/50] =?UTF-8?q?=EA=B4=80=EB=A0=A8=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/config/AboutSiteMgt.jsx | 2 +- .../src/pages/admin/config/aboutSiteMgt/AboutSiteModal.jsx | 2 +- .../dbnt/kcscbackend/config/security/SecurityConfig.java | 7 +++++-- 3 files changed, 7 insertions(+), 4 deletions(-) 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 e2b01c2..9c759cc 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 @@ -54,7 +54,7 @@ function StandardCodeMgt(props) {
{item.siteTitle}
{item.siteUrl}
-
이미지 window.open(e.target.src)}/>
+
이미지 window.open(e.target.src)}/>
{item.siteOrder}
{item.useYn}
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 index 3a0044e..bc94b97 100644 --- 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 @@ -63,10 +63,10 @@ function AboutSiteModal({props, reloadFunction}) { console.log("@@@ current : " + fileInputRef.current); console.log("@@@ file : " + fileInputRef.current.files[0]); formData.append('file', currentFile); - formData.append('fileGrpId', props.fileGrpId); if (modeInfo.mode === CODE.MODE_MODIFY) { formData.append('siteSeq', props.siteSeq); // 수정 모드일 때 필요한 추가 정보 추가 + formData.append('fileGrpId', props.fileGrpId); } EgovNet.requestFetch( '/admin/config/partner-site-mgt', diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java index 85a7126..5f1a557 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java @@ -86,8 +86,11 @@ public class SecurityConfig { "/swagger-ui.html", "/swagger-ui/**", - /*기준코드 조회*/ - "/standardCode/**" + /* 기준코드 조회 */ + "/standardCode/**", + + /* 관련사이트 이미지 조회 */ + "/admin/config/get-site-image/**" }; private static final String[] ORIGINS_WHITELIST = { "http://localhost:3000", From 10a2b0da22ce167b37ab301c46096b1ff46d4023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Wed, 3 Apr 2024 10:30:23 +0900 Subject: [PATCH 08/50] =?UTF-8?q?=EA=B4=80=EB=A0=A8=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/config/AboutSiteMgt.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 9c759cc..e641012 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 @@ -54,7 +54,7 @@ function StandardCodeMgt(props) {
{item.siteTitle}
{item.siteUrl}
-
이미지 window.open(e.target.src)}/>
+
이미지 window.open(e.target.src)}/>
{item.siteOrder}
{item.useYn}
From 182186dc263bc796f1dd2a6b7b095f56508707da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Fri, 5 Apr 2024 16:09:26 +0900 Subject: [PATCH 09/50] =?UTF-8?q?=EC=98=A4=ED=94=88=EC=84=9C=EC=B9=98=20?= =?UTF-8?q?=EC=9D=B8=EB=8D=B1=EC=8B=B1,=20=EA=B2=80=EC=83=89=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kcsc-opensearch/.gitignore | 37 +++ kcsc-opensearch/build.gradle | 35 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + kcsc-opensearch/gradlew | 249 ++++++++++++++++++ kcsc-opensearch/gradlew.bat | 92 +++++++ kcsc-opensearch/settings.gradle | 1 + .../KcscOpensearchApplication.java | 16 ++ .../config/KcscDatabaseConfig.java | 61 +++++ .../config/OpensearchConfig.java | 43 +++ .../kcsc/docView/model/DocContentView.java | 30 +++ .../kcsc/docView/model/DocIndexView.java | 28 ++ .../kcsc/docView/model/DocTitleView.java | 22 ++ .../repository/DocContentViewRepository.java | 10 + .../repository/DocIndexViewRepository.java | 10 + .../repository/DocTitleViewRepository.java | 10 + .../kcsc/docView/service/DocViewService.java | 42 +++ .../model/TnDocumentGroup.java | 61 +++++ .../repository/TnDocumentGroupRepository.java | 16 ++ .../service/TnDocumentGroupService.java | 27 ++ .../docSearch/DocSearchController.java | 34 +++ .../docSearch/model/DocContent.java | 39 +++ .../opensearch/docSearch/model/DocIndex.java | 36 +++ .../opensearch/docSearch/model/DocTitle.java | 33 +++ .../repository/DocContentRepository.java | 13 + .../repository/DocIndexRepository.java | 13 + .../repository/DocTitleRepository.java | 13 + .../docSearch/service/DocSearchService.java | 136 ++++++++++ .../DocumentGroupController.java | 26 ++ .../documentGroup/model/DocumentGroup.java | 87 ++++++ .../repository/DocumentGroupRepository.java | 13 + .../service/DocumentGroupService.java | 25 ++ .../scheduler/IndexingScheduler.java | 91 +++++++ .../src/main/resources/application.properties | 16 ++ 34 files changed, 1372 insertions(+) create mode 100644 kcsc-opensearch/.gitignore create mode 100644 kcsc-opensearch/build.gradle create mode 100644 kcsc-opensearch/gradle/wrapper/gradle-wrapper.jar create mode 100644 kcsc-opensearch/gradle/wrapper/gradle-wrapper.properties create mode 100644 kcsc-opensearch/gradlew create mode 100644 kcsc-opensearch/gradlew.bat create mode 100644 kcsc-opensearch/settings.gradle create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/KcscOpensearchApplication.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/config/KcscDatabaseConfig.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/config/OpensearchConfig.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/model/DocContentView.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/model/DocIndexView.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/model/DocTitleView.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/repository/DocContentViewRepository.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/repository/DocIndexViewRepository.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/repository/DocTitleViewRepository.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/service/DocViewService.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/tnDocumentGroup/model/TnDocumentGroup.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/tnDocumentGroup/repository/TnDocumentGroupRepository.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/tnDocumentGroup/service/TnDocumentGroupService.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/DocSearchController.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/model/DocContent.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/model/DocIndex.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/model/DocTitle.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocContentRepository.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocIndexRepository.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocTitleRepository.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/service/DocSearchService.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/DocumentGroupController.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/model/DocumentGroup.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/repository/DocumentGroupRepository.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/service/DocumentGroupService.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/scheduler/IndexingScheduler.java create mode 100644 kcsc-opensearch/src/main/resources/application.properties diff --git a/kcsc-opensearch/.gitignore b/kcsc-opensearch/.gitignore new file mode 100644 index 0000000..c2065bc --- /dev/null +++ b/kcsc-opensearch/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/kcsc-opensearch/build.gradle b/kcsc-opensearch/build.gradle new file mode 100644 index 0000000..ce37ea5 --- /dev/null +++ b/kcsc-opensearch/build.gradle @@ -0,0 +1,35 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.2.4' + id 'io.spring.dependency-management' version '1.1.4' +} + +group = 'com.dbnt' +version = '0.0.1-SNAPSHOT' + +java { + sourceCompatibility = '17' +} + +repositories { + mavenCentral() +} + +dependencies { + compileOnly 'org.projectlombok:lombok:1.18.24' + annotationProcessor 'org.projectlombok:lombok:1.18.24' + annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor' + + implementation 'org.springframework.boot:spring-boot-starter' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-actuator' + + // https://mvnrepository.com/artifact/org.opensearch.client/spring-data-opensearch-starter + implementation (group: 'org.opensearch.client', name: 'spring-data-opensearch-starter', version: '1.3.0'){ + exclude group: 'org.opensearch.client', module: 'opensearch-rest-client-sniffer' + } + + runtimeOnly 'org.postgresql:postgresql:42.3.6' + +} diff --git a/kcsc-opensearch/gradle/wrapper/gradle-wrapper.jar b/kcsc-opensearch/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e6441136f3d4ba8a0da8d277868979cfbc8ad796 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c z&{(nX_ht=QbJ%DzAya}!&uNu!4V0xI)QE$SY__m)SAKcN0P(&JcoK*Lxr@P zY&P=}&B3*UWNlc|&$Oh{BEqwK2+N2U$4WB7Fd|aIal`FGANUa9E-O)!gV`((ZGCc$ zBJA|FFrlg~9OBp#f7aHodCe{6= zay$6vN~zj1ddMZ9gQ4p32(7wD?(dE>KA2;SOzXRmPBiBc6g`eOsy+pVcHu=;Yd8@{ zSGgXf@%sKKQz~;!J;|2fC@emm#^_rnO0esEn^QxXgJYd`#FPWOUU5b;9eMAF zZhfiZb|gk8aJIw*YLp4!*(=3l8Cp{(%p?ho22*vN9+5NLV0TTazNY$B5L6UKUrd$n zjbX%#m7&F#U?QNOBXkiiWB*_tk+H?N3`vg;1F-I+83{M2!8<^nydGr5XX}tC!10&e z7D36bLaB56WrjL&HiiMVtpff|K%|*{t*ltt^5ood{FOG0<>k&1h95qPio)2`eL${YAGIx(b4VN*~nKn6E~SIQUuRH zQ+5zP6jfnP$S0iJ@~t!Ai3o`X7biohli;E zT#yXyl{bojG@-TGZzpdVDXhbmF%F9+-^YSIv|MT1l3j zrxOFq>gd2%U}?6}8mIj?M zc077Zc9fq(-)4+gXv?Az26IO6eV`RAJz8e3)SC7~>%rlzDwySVx*q$ygTR5kW2ds- z!HBgcq0KON9*8Ff$X0wOq$`T7ml(@TF)VeoF}x1OttjuVHn3~sHrMB++}f7f9H%@f z=|kP_?#+fve@{0MlbkC9tyvQ_R?lRdRJ@$qcB(8*jyMyeME5ns6ypVI1Xm*Zr{DuS zZ!1)rQfa89c~;l~VkCiHI|PCBd`S*2RLNQM8!g9L6?n`^evQNEwfO@&JJRme+uopQX0%Jo zgd5G&#&{nX{o?TQwQvF1<^Cg3?2co;_06=~Hcb6~4XWpNFL!WU{+CK;>gH%|BLOh7@!hsa(>pNDAmpcuVO-?;Bic17R}^|6@8DahH)G z!EmhsfunLL|3b=M0MeK2vqZ|OqUqS8npxwge$w-4pFVXFq$_EKrZY?BuP@Az@(k`L z`ViQBSk`y+YwRT;&W| z2e3UfkCo^uTA4}Qmmtqs+nk#gNr2W4 zTH%hhErhB)pkXR{B!q5P3-OM+M;qu~f>}IjtF%>w{~K-0*jPVLl?Chz&zIdxp}bjx zStp&Iufr58FTQ36AHU)0+CmvaOpKF;W@sMTFpJ`j;3d)J_$tNQI^c<^1o<49Z(~K> z;EZTBaVT%14(bFw2ob@?JLQ2@(1pCdg3S%E4*dJ}dA*v}_a4_P(a`cHnBFJxNobAv zf&Zl-Yt*lhn-wjZsq<9v-IsXxAxMZ58C@e0!rzhJ+D@9^3~?~yllY^s$?&oNwyH!#~6x4gUrfxplCvK#!f z$viuszW>MFEcFL?>ux*((!L$;R?xc*myjRIjgnQX79@UPD$6Dz0jutM@7h_pq z0Zr)#O<^y_K6jfY^X%A-ip>P%3saX{!v;fxT-*0C_j4=UMH+Xth(XVkVGiiKE#f)q z%Jp=JT)uy{&}Iq2E*xr4YsJ5>w^=#-mRZ4vPXpI6q~1aFwi+lQcimO45V-JXP;>(Q zo={U`{=_JF`EQj87Wf}{Qy35s8r1*9Mxg({CvOt}?Vh9d&(}iI-quvs-rm~P;eRA@ zG5?1HO}puruc@S{YNAF3vmUc2B4!k*yi))<5BQmvd3tr}cIs#9)*AX>t`=~{f#Uz0 z0&Nk!7sSZwJe}=)-R^$0{yeS!V`Dh7w{w5rZ9ir!Z7Cd7dwZcK;BT#V0bzTt>;@Cl z#|#A!-IL6CZ@eHH!CG>OO8!%G8&8t4)Ro@}USB*k>oEUo0LsljsJ-%5Mo^MJF2I8- z#v7a5VdJ-Cd%(a+y6QwTmi+?f8Nxtm{g-+WGL>t;s#epv7ug>inqimZCVm!uT5Pf6 ziEgQt7^%xJf#!aPWbuC_3Nxfb&CFbQy!(8ANpkWLI4oSnH?Q3f?0k1t$3d+lkQs{~(>06l&v|MpcFsyAv zin6N!-;pggosR*vV=DO(#+}4ps|5$`udE%Kdmp?G7B#y%H`R|i8skKOd9Xzx8xgR$>Zo2R2Ytktq^w#ul4uicxW#{ zFjG_RNlBroV_n;a7U(KIpcp*{M~e~@>Q#Av90Jc5v%0c>egEdY4v3%|K1XvB{O_8G zkTWLC>OZKf;XguMH2-Pw{BKbFzaY;4v2seZV0>^7Q~d4O=AwaPhP3h|!hw5aqOtT@ z!SNz}$of**Bl3TK209@F=Tn1+mgZa8yh(Png%Zd6Mt}^NSjy)etQrF zme*llAW=N_8R*O~d2!apJnF%(JcN??=`$qs3Y+~xs>L9x`0^NIn!8mMRFA_tg`etw z3k{9JAjnl@ygIiJcNHTy02GMAvBVqEss&t2<2mnw!; zU`J)0>lWiqVqo|ex7!+@0i>B~BSU1A_0w#Ee+2pJx0BFiZ7RDHEvE*ptc9md(B{&+ zKE>TM)+Pd>HEmdJao7U@S>nL(qq*A)#eLOuIfAS@j`_sK0UEY6OAJJ-kOrHG zjHx`g!9j*_jRcJ%>CE9K2MVf?BUZKFHY?EpV6ai7sET-tqk=nDFh-(65rhjtlKEY% z@G&cQ<5BKatfdA1FKuB=i>CCC5(|9TMW%K~GbA4}80I5%B}(gck#Wlq@$nO3%@QP_ z8nvPkJFa|znk>V92cA!K1rKtr)skHEJD;k8P|R8RkCq1Rh^&}Evwa4BUJz2f!2=MH zo4j8Y$YL2313}H~F7@J7mh>u%556Hw0VUOz-Un@ZASCL)y8}4XXS`t1AC*^>PLwIc zUQok5PFS=*#)Z!3JZN&eZ6ZDP^-c@StY*t20JhCnbMxXf=LK#;`4KHEqMZ-Ly9KsS zI2VUJGY&PmdbM+iT)zek)#Qc#_i4uH43 z@T5SZBrhNCiK~~esjsO9!qBpaWK<`>!-`b71Y5ReXQ4AJU~T2Njri1CEp5oKw;Lnm)-Y@Z3sEY}XIgSy%xo=uek(kAAH5MsV$V3uTUsoTzxp_rF=tx zV07vlJNKtJhCu`b}*#m&5LV4TAE&%KtHViDAdv#c^x`J7bg z&N;#I2GkF@SIGht6p-V}`!F_~lCXjl1BdTLIjD2hH$J^YFN`7f{Q?OHPFEM$65^!u zNwkelo*5+$ZT|oQ%o%;rBX$+?xhvjb)SHgNHE_yP%wYkkvXHS{Bf$OiKJ5d1gI0j< zF6N}Aq=(WDo(J{e-uOecxPD>XZ@|u-tgTR<972`q8;&ZD!cep^@B5CaqFz|oU!iFj zU0;6fQX&~15E53EW&w1s9gQQ~Zk16X%6 zjG`j0yq}4deX2?Tr(03kg>C(!7a|b9qFI?jcE^Y>-VhudI@&LI6Qa}WQ>4H_!UVyF z((cm&!3gmq@;BD#5P~0;_2qgZhtJS|>WdtjY=q zLnHH~Fm!cxw|Z?Vw8*~?I$g#9j&uvgm7vPr#&iZgPP~v~BI4jOv;*OQ?jYJtzO<^y z7-#C={r7CO810!^s(MT!@@Vz_SVU)7VBi(e1%1rvS!?PTa}Uv`J!EP3s6Y!xUgM^8 z4f!fq<3Wer_#;u!5ECZ|^c1{|q_lh3m^9|nsMR1#Qm|?4Yp5~|er2?W^7~cl;_r4WSme_o68J9p03~Hc%X#VcX!xAu%1`R!dfGJCp zV*&m47>s^%Ib0~-2f$6oSgn3jg8m%UA;ArcdcRyM5;}|r;)?a^D*lel5C`V5G=c~k zy*w_&BfySOxE!(~PI$*dwG><+-%KT5p?whOUMA*k<9*gi#T{h3DAxzAPxN&Xws8o9Cp*`PA5>d9*Z-ynV# z9yY*1WR^D8|C%I@vo+d8r^pjJ$>eo|j>XiLWvTWLl(^;JHCsoPgem6PvegHb-OTf| zvTgsHSa;BkbG=(NgPO|CZu9gUCGr$8*EoH2_Z#^BnxF0yM~t`|9ws_xZ8X8iZYqh! zAh;HXJ)3P&)Q0(&F>!LN0g#bdbis-cQxyGn9Qgh`q+~49Fqd2epikEUw9caM%V6WgP)532RMRW}8gNS%V%Hx7apSz}tn@bQy!<=lbhmAH=FsMD?leawbnP5BWM0 z5{)@EEIYMu5;u)!+HQWhQ;D3_Cm_NADNeb-f56}<{41aYq8p4=93d=-=q0Yx#knGYfXVt z+kMxlus}t2T5FEyCN~!}90O_X@@PQpuy;kuGz@bWft%diBTx?d)_xWd_-(!LmVrh**oKg!1CNF&LX4{*j|) zIvjCR0I2UUuuEXh<9}oT_zT#jOrJAHNLFT~Ilh9hGJPI1<5`C-WA{tUYlyMeoy!+U zhA#=p!u1R7DNg9u4|QfED-2TuKI}>p#2P9--z;Bbf4Op*;Q9LCbO&aL2i<0O$ByoI z!9;Ght733FC>Pz>$_mw(F`zU?`m@>gE`9_p*=7o=7av`-&ifU(^)UU`Kg3Kw`h9-1 z6`e6+im=|m2v`pN(2dE%%n8YyQz;#3Q-|x`91z?gj68cMrHl}C25|6(_dIGk*8cA3 zRHB|Nwv{@sP4W+YZM)VKI>RlB`n=Oj~Rzx~M+Khz$N$45rLn6k1nvvD^&HtsMA4`s=MmuOJID@$s8Ph4E zAmSV^+s-z8cfv~Yd(40Sh4JG#F~aB>WFoX7ykaOr3JaJ&Lb49=B8Vk-SQT9%7TYhv z?-Pprt{|=Y5ZQ1?od|A<_IJU93|l4oAfBm?3-wk{O<8ea+`}u%(kub(LFo2zFtd?4 zwpN|2mBNywv+d^y_8#<$r>*5+$wRTCygFLcrwT(qc^n&@9r+}Kd_u@Ithz(6Qb4}A zWo_HdBj#V$VE#l6pD0a=NfB0l^6W^g`vm^sta>Tly?$E&{F?TTX~DsKF~poFfmN%2 z4x`Dc{u{Lkqz&y!33;X}weD}&;7p>xiI&ZUb1H9iD25a(gI|`|;G^NwJPv=1S5e)j z;U;`?n}jnY6rA{V^ zxTd{bK)Gi^odL3l989DQlN+Zs39Xe&otGeY(b5>rlIqfc7Ap4}EC?j<{M=hlH{1+d zw|c}}yx88_xQr`{98Z!d^FNH77=u(p-L{W6RvIn40f-BldeF-YD>p6#)(Qzf)lfZj z?3wAMtPPp>vMehkT`3gToPd%|D8~4`5WK{`#+}{L{jRUMt zrFz+O$C7y8$M&E4@+p+oV5c%uYzbqd2Y%SSgYy#xh4G3hQv>V*BnuKQhBa#=oZB~w{azUB+q%bRe_R^ z>fHBilnRTUfaJ201czL8^~Ix#+qOHSO)A|xWLqOxB$dT2W~)e-r9;bm=;p;RjYahB z*1hegN(VKK+ztr~h1}YP@6cfj{e#|sS`;3tJhIJK=tVJ-*h-5y9n*&cYCSdg#EHE# zSIx=r#qOaLJoVVf6v;(okg6?*L_55atl^W(gm^yjR?$GplNP>BZsBYEf_>wM0Lc;T zhf&gpzOWNxS>m+mN92N0{;4uw`P+9^*|-1~$uXpggj4- z^SFc4`uzj2OwdEVT@}Q`(^EcQ_5(ZtXTql*yGzdS&vrS_w>~~ra|Nb5abwf}Y!uq6R5f&6g2ge~2p(%c< z@O)cz%%rr4*cRJ5f`n@lvHNk@lE1a*96Kw6lJ~B-XfJW%?&-y?;E&?1AacU@`N`!O z6}V>8^%RZ7SQnZ-z$(jsX`amu*5Fj8g!3RTRwK^`2_QHe;_2y_n|6gSaGyPmI#kA0sYV<_qOZc#-2BO%hX)f$s-Z3xlI!ub z^;3ru11DA`4heAu%}HIXo&ctujzE2!6DIGE{?Zs>2}J+p&C$rc7gJC35gxhflorvsb%sGOxpuWhF)dL_&7&Z99=5M0b~Qa;Mo!j&Ti_kXW!86N%n= zSC@6Lw>UQ__F&+&Rzv?gscwAz8IP!n63>SP)^62(HK98nGjLY2*e^OwOq`3O|C92? z;TVhZ2SK%9AGW4ZavTB9?)mUbOoF`V7S=XM;#3EUpR+^oHtdV!GK^nXzCu>tpR|89 zdD{fnvCaN^^LL%amZ^}-E+214g&^56rpdc@yv0b<3}Ys?)f|fXN4oHf$six)-@<;W&&_kj z-B}M5U*1sb4)77aR=@%I?|Wkn-QJVuA96an25;~!gq(g1@O-5VGo7y&E_srxL6ZfS z*R%$gR}dyONgju*D&?geiSj7SZ@ftyA|}(*Y4KbvU!YLsi1EDQQCnb+-cM=K1io78o!v*);o<XwjaQH%)uIP&Zm?)Nfbfn;jIr z)d#!$gOe3QHp}2NBak@yYv3m(CPKkwI|{;d=gi552u?xj9ObCU^DJFQp4t4e1tPzM zvsRIGZ6VF+{6PvqsplMZWhz10YwS={?`~O0Ec$`-!klNUYtzWA^f9m7tkEzCy<_nS z=&<(awFeZvt51>@o_~>PLs05CY)$;}Oo$VDO)?l-{CS1Co=nxjqben*O1BR>#9`0^ zkwk^k-wcLCLGh|XLjdWv0_Hg54B&OzCE^3NCP}~OajK-LuRW53CkV~Su0U>zN%yQP zH8UH#W5P3-!ToO-2k&)}nFe`t+mdqCxxAHgcifup^gKpMObbox9LFK;LP3}0dP-UW z?Zo*^nrQ6*$FtZ(>kLCc2LY*|{!dUn$^RW~m9leoF|@Jy|M5p-G~j%+P0_#orRKf8 zvuu5<*XO!B?1E}-*SY~MOa$6c%2cM+xa8}_8x*aVn~57v&W(0mqN1W`5a7*VN{SUH zXz98DDyCnX2EPl-`Lesf`=AQT%YSDb`$%;(jUTrNen$NPJrlpPDP}prI>Ml!r6bCT;mjsg@X^#&<}CGf0JtR{Ecwd&)2zuhr#nqdgHj+g2n}GK9CHuwO zk>oZxy{vcOL)$8-}L^iVfJHAGfwN$prHjYV0ju}8%jWquw>}_W6j~m<}Jf!G?~r5&Rx)!9JNX!ts#SGe2HzobV5); zpj@&`cNcO&q+%*<%D7za|?m5qlmFK$=MJ_iv{aRs+BGVrs)98BlN^nMr{V_fcl_;jkzRju+c-y?gqBC_@J0dFLq-D9@VN&-`R9U;nv$Hg?>$oe4N&Ht$V_(JR3TG^! zzJsbQbi zFE6-{#9{G{+Z}ww!ycl*7rRdmU#_&|DqPfX3CR1I{Kk;bHwF6jh0opI`UV2W{*|nn zf_Y@%wW6APb&9RrbEN=PQRBEpM(N1w`81s=(xQj6 z-eO0k9=Al|>Ej|Mw&G`%q8e$2xVz1v4DXAi8G};R$y)ww638Y=9y$ZYFDM$}vzusg zUf+~BPX>(SjA|tgaFZr_e0{)+z9i6G#lgt=F_n$d=beAt0Sa0a7>z-?vcjl3e+W}+ z1&9=|vC=$co}-Zh*%3588G?v&U7%N1Qf-wNWJ)(v`iO5KHSkC5&g7CrKu8V}uQGcfcz zmBz#Lbqwqy#Z~UzHgOQ;Q-rPxrRNvl(&u6ts4~0=KkeS;zqURz%!-ERppmd%0v>iRlEf+H$yl{_8TMJzo0 z>n)`On|7=WQdsqhXI?#V{>+~}qt-cQbokEbgwV3QvSP7&hK4R{Z{aGHVS3;+h{|Hz z6$Js}_AJr383c_+6sNR|$qu6dqHXQTc6?(XWPCVZv=)D#6_;D_8P-=zOGEN5&?~8S zl5jQ?NL$c%O)*bOohdNwGIKM#jSAC?BVY={@A#c9GmX0=T(0G}xs`-%f3r=m6-cpK z!%waekyAvm9C3%>sixdZj+I(wQlbB4wv9xKI*T13DYG^T%}zZYJ|0$Oj^YtY+d$V$ zAVudSc-)FMl|54n=N{BnZTM|!>=bhaja?o7s+v1*U$!v!qQ%`T-6fBvmdPbVmro&d zk07TOp*KuxRUSTLRrBj{mjsnF8`d}rMViY8j`jo~Hp$fkv9F_g(jUo#Arp;Xw0M$~ zRIN!B22~$kx;QYmOkos@%|5k)!QypDMVe}1M9tZfkpXKGOxvKXB!=lo`p?|R1l=tA zp(1}c6T3Fwj_CPJwVsYtgeRKg?9?}%oRq0F+r+kdB=bFUdVDRPa;E~~>2$w}>O>v=?|e>#(-Lyx?nbg=ckJ#5U6;RT zNvHhXk$P}m9wSvFyU3}=7!y?Y z=fg$PbV8d7g25&-jOcs{%}wTDKm>!Vk);&rr;O1nvO0VrU&Q?TtYVU=ir`te8SLlS zKSNmV=+vF|ATGg`4$N1uS|n??f}C_4Sz!f|4Ly8#yTW-FBfvS48Tef|-46C(wEO_%pPhUC5$-~Y?!0vFZ^Gu`x=m7X99_?C-`|h zfmMM&Y@zdfitA@KPw4Mc(YHcY1)3*1xvW9V-r4n-9ZuBpFcf{yz+SR{ zo$ZSU_|fgwF~aakGr(9Be`~A|3)B=9`$M-TWKipq-NqRDRQc}ABo*s_5kV%doIX7LRLRau_gd@Rd_aLFXGSU+U?uAqh z8qusWWcvgQ&wu{|sRXmv?sl=xc<$6AR$+cl& zFNh5q1~kffG{3lDUdvEZu5c(aAG~+64FxdlfwY^*;JSS|m~CJusvi-!$XR`6@XtY2 znDHSz7}_Bx7zGq-^5{stTRy|I@N=>*y$zz>m^}^{d&~h;0kYiq8<^Wq7Dz0w31ShO^~LUfW6rfitR0(=3;Uue`Y%y@ex#eKPOW zO~V?)M#AeHB2kovn1v=n^D?2{2jhIQd9t|_Q+c|ZFaWt+r&#yrOu-!4pXAJuxM+Cx z*H&>eZ0v8Y`t}8{TV6smOj=__gFC=eah)mZt9gwz>>W$!>b3O;Rm^Ig*POZP8Rl0f zT~o=Nu1J|lO>}xX&#P58%Yl z83`HRs5#32Qm9mdCrMlV|NKNC+Z~ z9OB8xk5HJ>gBLi+m@(pvpw)1(OaVJKs*$Ou#@Knd#bk+V@y;YXT?)4eP9E5{J%KGtYinNYJUH9PU3A}66c>Xn zZ{Bn0<;8$WCOAL$^NqTjwM?5d=RHgw3!72WRo0c;+houoUA@HWLZM;^U$&sycWrFd zE7ekt9;kb0`lps{>R(}YnXlyGY}5pPd9zBpgXeJTY_jwaJGSJQC#-KJqmh-;ad&F- z-Y)E>!&`Rz!HtCz>%yOJ|v(u7P*I$jqEY3}(Z-orn4 zlI?CYKNl`6I){#2P1h)y(6?i;^z`N3bxTV%wNvQW+eu|x=kbj~s8rhCR*0H=iGkSj zk23lr9kr|p7#qKL=UjgO`@UnvzU)`&fI>1Qs7ubq{@+lK{hH* zvl6eSb9%yngRn^T<;jG1SVa)eA>T^XX=yUS@NCKpk?ovCW1D@!=@kn;l_BrG;hOTC z6K&H{<8K#dI(A+zw-MWxS+~{g$tI7|SfP$EYKxA}LlVO^sT#Oby^grkdZ^^lA}uEF zBSj$weBJG{+Bh@Yffzsw=HyChS(dtLE3i*}Zj@~!_T-Ay7z=B)+*~3|?w`Zd)Co2t zC&4DyB!o&YgSw+fJn6`sn$e)29`kUwAc+1MND7YjV%lO;H2}fNy>hD#=gT ze+-aFNpyKIoXY~Vq-}OWPBe?Rfu^{ps8>Xy%42r@RV#*QV~P83jdlFNgkPN=T|Kt7 zV*M`Rh*30&AWlb$;ae130e@}Tqi3zx2^JQHpM>j$6x`#{mu%tZlwx9Gj@Hc92IuY* zarmT|*d0E~vt6<+r?W^UW0&#U&)8B6+1+;k^2|FWBRP9?C4Rk)HAh&=AS8FS|NQaZ z2j!iZ)nbEyg4ZTp-zHwVlfLC~tXIrv(xrP8PAtR{*c;T24ycA-;auWsya-!kF~CWZ zw_uZ|%urXgUbc@x=L=_g@QJ@m#5beS@6W195Hn7>_}z@Xt{DIEA`A&V82bc^#!q8$ zFh?z_Vn|ozJ;NPd^5uu(9tspo8t%&-U9Ckay-s@DnM*R5rtu|4)~e)`z0P-sy?)kc zs_k&J@0&0!q4~%cKL)2l;N*T&0;mqX5T{Qy60%JtKTQZ-xb%KOcgqwJmb%MOOKk7N zgq})R_6**{8A|6H?fO+2`#QU)p$Ei2&nbj6TpLSIT^D$|`TcSeh+)}VMb}LmvZ{O| ze*1IdCt3+yhdYVxcM)Q_V0bIXLgr6~%JS<<&dxIgfL=Vnx4YHuU@I34JXA|+$_S3~ zy~X#gO_X!cSs^XM{yzDGNM>?v(+sF#<0;AH^YrE8smx<36bUsHbN#y57K8WEu(`qHvQ6cAZPo=J5C(lSmUCZ57Rj6cx!e^rfaI5%w}unz}4 zoX=nt)FVNV%QDJH`o!u9olLD4O5fl)xp+#RloZlaA92o3x4->?rB4`gS$;WO{R;Z3>cG3IgFX2EA?PK^M}@%1%A;?f6}s&CV$cIyEr#q5;yHdNZ9h{| z-=dX+a5elJoDo?Eq&Og!nN6A)5yYpnGEp}?=!C-V)(*~z-+?kY1Q7qs#Rsy%hu_60rdbB+QQNr?S1 z?;xtjUv|*E3}HmuNyB9aFL5H~3Ho0UsmuMZELp1a#CA1g`P{-mT?BchuLEtK}!QZ=3AWakRu~?f9V~3F;TV`5%9Pcs_$gq&CcU}r8gOO zC2&SWPsSG{&o-LIGTBqp6SLQZPvYKp$$7L4WRRZ0BR$Kf0I0SCFkqveCp@f)o8W)! z$%7D1R`&j7W9Q9CGus_)b%+B#J2G;l*FLz#s$hw{BHS~WNLODV#(!u_2Pe&tMsq={ zdm7>_WecWF#D=?eMjLj=-_z`aHMZ=3_-&E8;ibPmM}61i6J3is*=dKf%HC>=xbj4$ zS|Q-hWQ8T5mWde6h@;mS+?k=89?1FU<%qH9B(l&O>k|u_aD|DY*@~(`_pb|B#rJ&g zR0(~(68fpUPz6TdS@4JT5MOPrqDh5_H(eX1$P2SQrkvN8sTxwV>l0)Qq z0pzTuvtEAKRDkKGhhv^jk%|HQ1DdF%5oKq5BS>szk-CIke{%js?~%@$uaN3^Uz6Wf z_iyx{bZ(;9y4X&>LPV=L=d+A}7I4GkK0c1Xts{rrW1Q7apHf-))`BgC^0^F(>At1* za@e7{lq%yAkn*NH8Q1{@{lKhRg*^TfGvv!Sn*ed*x@6>M%aaqySxR|oNadYt1mpUZ z6H(rupHYf&Z z29$5g#|0MX#aR6TZ$@eGxxABRKakDYtD%5BmKp;HbG_ZbT+=81E&=XRk6m_3t9PvD zr5Cqy(v?gHcYvYvXkNH@S#Po~q(_7MOuCAB8G$a9BC##gw^5mW16cML=T=ERL7wsk zzNEayTG?mtB=x*wc@ifBCJ|irFVMOvH)AFRW8WE~U()QT=HBCe@s$dA9O!@`zAAT) zaOZ7l6vyR+Nk_OOF!ZlZmjoImKh)dxFbbR~z(cMhfeX1l7S_`;h|v3gI}n9$sSQ>+3@AFAy9=B_y$)q;Wdl|C-X|VV3w8 z2S#>|5dGA8^9%Bu&fhmVRrTX>Z7{~3V&0UpJNEl0=N32euvDGCJ>#6dUSi&PxFW*s zS`}TB>?}H(T2lxBJ!V#2taV;q%zd6fOr=SGHpoSG*4PDaiG0pdb5`jelVipkEk%FV zThLc@Hc_AL1#D&T4D=w@UezYNJ%0=f3iVRuVL5H?eeZM}4W*bomebEU@e2d`M<~uW zf#Bugwf`VezG|^Qbt6R_=U0}|=k;mIIakz99*>FrsQR{0aQRP6ko?5<7bkDN8evZ& zB@_KqQG?ErKL=1*ZM9_5?Pq%lcS4uLSzN(Mr5=t6xHLS~Ym`UgM@D&VNu8e?_=nSFtF$u@hpPSmI4Vo_t&v?>$~K4y(O~Rb*(MFy_igM7 z*~yYUyR6yQgzWnWMUgDov!!g=lInM+=lOmOk4L`O?{i&qxy&D*_qorRbDwj6?)!ef z#JLd7F6Z2I$S0iYI={rZNk*<{HtIl^mx=h>Cim*04K4+Z4IJtd*-)%6XV2(MCscPiw_a+y*?BKbTS@BZ3AUao^%Zi#PhoY9Vib4N>SE%4>=Jco0v zH_Miey{E;FkdlZSq)e<{`+S3W=*ttvD#hB8w=|2aV*D=yOV}(&p%0LbEWH$&@$X3x~CiF-?ejQ*N+-M zc8zT@3iwkdRT2t(XS`d7`tJQAjRmKAhiw{WOqpuvFp`i@Q@!KMhwKgsA}%@sw8Xo5Y=F zhRJZg)O4uqNWj?V&&vth*H#je6T}}p_<>!Dr#89q@uSjWv~JuW(>FqoJ5^ho0%K?E z9?x_Q;kmcsQ@5=}z@tdljMSt9-Z3xn$k)kEjK|qXS>EfuDmu(Z8|(W?gY6-l z@R_#M8=vxKMAoi&PwnaIYw2COJM@atcgfr=zK1bvjW?9B`-+Voe$Q+H$j!1$Tjn+* z&LY<%)L@;zhnJlB^Og6I&BOR-m?{IW;tyYC%FZ!&Z>kGjHJ6cqM-F z&19n+e1=9AH1VrVeHrIzqlC`w9=*zfmrerF?JMzO&|Mmv;!4DKc(sp+jy^Dx?(8>1 zH&yS_4yL7m&GWX~mdfgH*AB4{CKo;+egw=PrvkTaoBU+P-4u?E|&!c z)DKc;>$$B6u*Zr1SjUh2)FeuWLWHl5TH(UHWkf zLs>7px!c5n;rbe^lO@qlYLzlDVp(z?6rPZel=YB)Uv&n!2{+Mb$-vQl=xKw( zve&>xYx+jW_NJh!FV||r?;hdP*jOXYcLCp>DOtJ?2S^)DkM{{Eb zS$!L$e_o0(^}n3tA1R3-$SNvgBq;DOEo}fNc|tB%%#g4RA3{|euq)p+xd3I8^4E&m zFrD%}nvG^HUAIKe9_{tXB;tl|G<%>yk6R;8L2)KUJw4yHJXUOPM>(-+jxq4R;z8H#>rnJy*)8N+$wA$^F zN+H*3t)eFEgxLw+Nw3};4WV$qj&_D`%ADV2%r zJCPCo%{=z7;`F98(us5JnT(G@sKTZ^;2FVitXyLe-S5(hV&Ium+1pIUB(CZ#h|g)u zSLJJ<@HgrDiA-}V_6B^x1>c9B6%~847JkQ!^KLZ2skm;q*edo;UA)~?SghG8;QbHh z_6M;ouo_1rq9=x$<`Y@EA{C%6-pEV}B(1#sDoe_e1s3^Y>n#1Sw;N|}8D|s|VPd+g z-_$QhCz`vLxxrVMx3ape1xu3*wjx=yKSlM~nFgkNWb4?DDr*!?U)L_VeffF<+!j|b zZ$Wn2$TDv3C3V@BHpSgv3JUif8%hk%OsGZ=OxH@8&4`bbf$`aAMchl^qN>Eyu3JH} z9-S!x8-s4fE=lad%Pkp8hAs~u?|uRnL48O|;*DEU! zuS0{cpk%1E0nc__2%;apFsTm0bKtd&A0~S3Cj^?72-*Owk3V!ZG*PswDfS~}2<8le z5+W^`Y(&R)yVF*tU_s!XMcJS`;(Tr`J0%>p=Z&InR%D3@KEzzI+-2)HK zuoNZ&o=wUC&+*?ofPb0a(E6(<2Amd6%uSu_^-<1?hsxs~0K5^f(LsGqgEF^+0_H=uNk9S0bb!|O8d?m5gQjUKevPaO+*VfSn^2892K~%crWM8+6 z25@V?Y@J<9w%@NXh-2!}SK_(X)O4AM1-WTg>sj1{lj5@=q&dxE^9xng1_z9w9DK>| z6Iybcd0e zyi;Ew!KBRIfGPGytQ6}z}MeXCfLY0?9%RiyagSp_D1?N&c{ zyo>VbJ4Gy`@Fv+5cKgUgs~na$>BV{*em7PU3%lloy_aEovR+J7TfQKh8BJXyL6|P8un-Jnq(ghd!_HEOh$zlv2$~y3krgeH;9zC}V3f`uDtW(%mT#944DQa~^8ZI+zAUu4U(j0YcDfKR$bK#gvn_{JZ>|gZ5+)u?T$w7Q%F^;!Wk?G z(le7r!ufT*cxS}PR6hIVtXa)i`d$-_1KkyBU>qmgz-=T};uxx&sKgv48akIWQ89F{ z0XiY?WM^~;|T8zBOr zs#zuOONzH?svv*jokd5SK8wG>+yMC)LYL|vLqm^PMHcT=`}V$=nIRHe2?h)8WQa6O zPAU}d`1y(>kZiP~Gr=mtJLMu`i<2CspL|q2DqAgAD^7*$xzM`PU4^ga`ilE134XBQ z99P(LhHU@7qvl9Yzg$M`+dlS=x^(m-_3t|h>S}E0bcFMn=C|KamQ)=w2^e)35p`zY zRV8X?d;s^>Cof2SPR&nP3E+-LCkS0J$H!eh8~k0qo$}00b=7!H_I2O+Ro@3O$nPdm ztmbOO^B+IHzQ5w>@@@J4cKw5&^_w6s!s=H%&byAbUtczPQ7}wfTqxxtQNfn*u73Qw zGuWsrky_ajPx-5`R<)6xHf>C(oqGf_Fw|-U*GfS?xLML$kv;h_pZ@Kk$y0X(S+K80 z6^|z)*`5VUkawg}=z`S;VhZhxyDfrE0$(PMurAxl~<>lfZa>JZ288ULK7D` zl9|#L^JL}Y$j*j`0-K6kH#?bRmg#5L3iB4Z)%iF@SqT+Lp|{i`m%R-|ZE94Np7Pa5 zCqC^V3}B(FR340pmF*qaa}M}+h6}mqE~7Sh!9bDv9YRT|>vBNAqv09zXHMlcuhKD| zcjjA(b*XCIwJ33?CB!+;{)vX@9xns_b-VO{i0y?}{!sdXj1GM8+$#v>W7nw;+O_9B z_{4L;C6ol?(?W0<6taGEn1^uG=?Q3i29sE`RfYCaV$3DKc_;?HsL?D_fSYg}SuO5U zOB_f4^vZ_x%o`5|C@9C5+o=mFy@au{s)sKw!UgC&L35aH(sgDxRE2De%(%OT=VUdN ziVLEmdOvJ&5*tCMKRyXctCwQu_RH%;m*$YK&m;jtbdH#Ak~13T1^f89tn`A%QEHWs~jnY~E}p_Z$XC z=?YXLCkzVSK+Id`xZYTegb@W8_baLt-Fq`Tv|=)JPbFsKRm)4UW;yT+J`<)%#ue9DPOkje)YF2fsCilK9MIIK>p*`fkoD5nGfmLwt)!KOT+> zOFq*VZktDDyM3P5UOg`~XL#cbzC}eL%qMB=Q5$d89MKuN#$6|4gx_Jt0Gfn8w&q}%lq4QU%6#jT*MRT% zrLz~C8FYKHawn-EQWN1B75O&quS+Z81(zN)G>~vN8VwC+e+y(`>HcxC{MrJ;H1Z4k zZWuv$w_F0-Ub%MVcpIc){4PGL^I7M{>;hS?;eH!;gmcOE66z3;Z1Phqo(t zVP(Hg6q#0gIKgsg7L7WE!{Y#1nI(45tx2{$34dDd#!Z0NIyrm)HOn5W#7;f4pQci# zDW!FI(g4e668kI9{2+mLwB+=#9bfqgX%!B34V-$wwSN(_cm*^{y0jQtv*4}eO^sOV z*9xoNvX)c9isB}Tgx&ZRjp3kwhTVK?r9;n!x>^XYT z@Q^7zp{rkIs{2mUSE^2!Gf6$6;j~&4=-0cSJJDizZp6LTe8b45;{AKM%v99}{{FfC zz709%u0mC=1KXTo(=TqmZQ;c?$M3z(!xah>aywrj40sc2y3rKFw4jCq+Y+u=CH@_V zxz|qeTwa>+<|H%8Dz5u>ZI5MmjTFwXS-Fv!TDd*`>3{krWoNVx$<133`(ftS?ZPyY z&4@ah^3^i`vL$BZa>O|Nt?ucewzsF)0zX3qmM^|waXr=T0pfIb0*$AwU=?Ipl|1Y; z*Pk6{C-p4MY;j@IJ|DW>QHZQJcp;Z~?8(Q+Kk3^0qJ}SCk^*n4W zu9ZFwLHUx-$6xvaQ)SUQcYd6fF8&x)V`1bIuX@>{mE$b|Yd(qomn3;bPwnDUc0F=; zh*6_((%bqAYQWQ~odER?h>1mkL4kpb3s7`0m@rDKGU*oyF)$j~Ffd4fXV$?`f~rHf zB%Y)@5SXZvfwm10RY5X?TEo)PK_`L6qgBp=#>fO49$D zDq8Ozj0q6213tV5Qq=;fZ0$|KroY{Dz=l@lU^J)?Ko@ti20TRplXzphBi>XGx4bou zEWrkNjz0t5j!_ke{g5I#PUlEU$Km8g8TE|XK=MkU@PT4T><2OVamoK;wJ}3X0L$vX zgd7gNa359*nc)R-0!`2X@FOTB`+oETOPc=ubp5R)VQgY+5BTZZJ2?9QwnO=dnulIUF3gFn;BODC2)65)HeVd%t86sL7Rv^Y+nbn+&l z6BAJY(ETvwI)Ts$aiE8rht4KD*qNyE{8{x6R|%akbTBzw;2+6Echkt+W+`u^XX z_z&x%n '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/kcsc-opensearch/gradlew.bat b/kcsc-opensearch/gradlew.bat new file mode 100644 index 0000000..25da30d --- /dev/null +++ b/kcsc-opensearch/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/kcsc-opensearch/settings.gradle b/kcsc-opensearch/settings.gradle new file mode 100644 index 0000000..6cb0f71 --- /dev/null +++ b/kcsc-opensearch/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'kcsc-opensearch' diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/KcscOpensearchApplication.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/KcscOpensearchApplication.java new file mode 100644 index 0000000..361e108 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/KcscOpensearchApplication.java @@ -0,0 +1,16 @@ +package com.dbnt.kcscopensearch; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; +import org.springframework.scheduling.annotation.EnableScheduling; + +@EnableScheduling +@SpringBootApplication(exclude = ElasticsearchDataAutoConfiguration.class) +public class KcscOpensearchApplication { + + public static void main(String[] args) { + SpringApplication.run(KcscOpensearchApplication.class, args); + } + +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/config/KcscDatabaseConfig.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/config/KcscDatabaseConfig.java new file mode 100644 index 0000000..ac4e0b5 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/config/KcscDatabaseConfig.java @@ -0,0 +1,61 @@ +package com.dbnt.kcscopensearch.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; + +import javax.sql.DataSource; +import java.util.HashMap; + +@Configuration +@EnableJpaRepositories( + basePackages = "com.dbnt.kcscopensearch.kcsc.**.repository", + entityManagerFactoryRef = "kcscEntityManager", + transactionManagerRef = "kcscTransactionManager" +) +@ComponentScan(basePackageClasses = KcscDatabaseConfig.class) +public class KcscDatabaseConfig { + + @Bean + public LocalContainerEntityManagerFactoryBean kcscEntityManager(){ + LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(kcscDataSource()); + + //Entity 패키지 경로 + em.setPackagesToScan(new String[] { "com.dbnt.kcscopensearch.kcsc.**.model" }); + + HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + em.setJpaVendorAdapter(vendorAdapter); + + //Hibernate 설정 + HashMap properties = new HashMap<>(); + properties.put("hibernate.hbm2ddl.auto", "none"); + properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); + em.setJpaPropertyMap(properties); + return em; + } + + @Primary + @Bean + @ConfigurationProperties(prefix="spring.datasource-kcsc") + public DataSource kcscDataSource() { + return DataSourceBuilder.create().build(); + } + + @Primary + @Bean + public PlatformTransactionManager kcscTransactionManager() { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(kcscEntityManager().getObject()); + return transactionManager; + } + +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/config/OpensearchConfig.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/config/OpensearchConfig.java new file mode 100644 index 0000000..1b77b1a --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/config/OpensearchConfig.java @@ -0,0 +1,43 @@ +package com.dbnt.kcscopensearch.config; + +import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; +import org.apache.http.ssl.SSLContextBuilder; +import org.opensearch.client.RestClientBuilder; +import org.opensearch.spring.boot.autoconfigure.RestClientBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; + +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; + +@Configuration +@EnableElasticsearchRepositories( + basePackages = "com.dbnt.kcscopensearch.opensearch.**.repository" +) +@ComponentScan(basePackageClasses = OpensearchConfig.class) +public class OpensearchConfig { + + @Bean + RestClientBuilderCustomizer customizer(){ + return new RestClientBuilderCustomizer() { + @Override + public void customize(HttpAsyncClientBuilder builder){ + try { + builder.setSSLContext(new SSLContextBuilder() + .loadTrustMaterial(null, new TrustSelfSignedStrategy()) + .build()); + } catch (final KeyManagementException | NoSuchAlgorithmException | KeyStoreException ex) { + throw new RuntimeException("Failed to initialize SSL Context instance", ex); + } + } + @Override + public void customize(RestClientBuilder builder) { + + } + }; + } +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/model/DocContentView.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/model/DocContentView.java new file mode 100644 index 0000000..b9a37c5 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/model/DocContentView.java @@ -0,0 +1,30 @@ +package com.dbnt.kcscopensearch.kcsc.docView.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Immutable; + +@Data +@Entity +@Immutable +@NoArgsConstructor +@Table(name = "doc_content") +public class DocContentView { + @Id + @Column(name = "content_id") + private Integer contentId; + @Column(name = "kcsc_cd") + private String kcscCd; + @Column(name = "doc_nm") + private String docNm; + @Column(name = "doc_yr") + private String docYr; + @Column(name = "group_title") + private String groupTitle; + @Column(name = "table_content") + private String tableContent; +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/model/DocIndexView.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/model/DocIndexView.java new file mode 100644 index 0000000..bf902b3 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/model/DocIndexView.java @@ -0,0 +1,28 @@ +package com.dbnt.kcscopensearch.kcsc.docView.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Immutable; + +@Data +@Entity +@Immutable +@NoArgsConstructor +@Table(name = "doc_index") +public class DocIndexView { + @Id + @Column(name = "index_id") + private Integer indexId; + @Column(name = "kcsc_cd") + private String kcscCd; + @Column(name = "doc_nm") + private String docNm; + @Column(name = "doc_yr") + private String docYr; + @Column(name = "group_title") + private String groupTitle; +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/model/DocTitleView.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/model/DocTitleView.java new file mode 100644 index 0000000..73329aa --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/model/DocTitleView.java @@ -0,0 +1,22 @@ +package com.dbnt.kcscopensearch.kcsc.docView.model; + +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.Immutable; + +@Data +@Entity +@Immutable +@NoArgsConstructor +@Table(name = "doc_title") +public class DocTitleView { + @Id + @Column(name = "title_id") + private Integer titleId; + @Column(name = "kcsc_cd") + private String kcscCd; + @Column(name = "doc_nm") + private String docNm; + @Column(name = "doc_yr") + private String docYr; +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/repository/DocContentViewRepository.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/repository/DocContentViewRepository.java new file mode 100644 index 0000000..81a8cc4 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/repository/DocContentViewRepository.java @@ -0,0 +1,10 @@ +package com.dbnt.kcscopensearch.kcsc.docView.repository; + +import com.dbnt.kcscopensearch.kcsc.docView.model.DocContentView; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface DocContentViewRepository extends JpaRepository { + +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/repository/DocIndexViewRepository.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/repository/DocIndexViewRepository.java new file mode 100644 index 0000000..02029d1 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/repository/DocIndexViewRepository.java @@ -0,0 +1,10 @@ +package com.dbnt.kcscopensearch.kcsc.docView.repository; + +import com.dbnt.kcscopensearch.kcsc.docView.model.DocIndexView; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface DocIndexViewRepository extends JpaRepository { + +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/repository/DocTitleViewRepository.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/repository/DocTitleViewRepository.java new file mode 100644 index 0000000..b3c60f7 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/repository/DocTitleViewRepository.java @@ -0,0 +1,10 @@ +package com.dbnt.kcscopensearch.kcsc.docView.repository; + +import com.dbnt.kcscopensearch.kcsc.docView.model.DocTitleView; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface DocTitleViewRepository extends JpaRepository { + +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/service/DocViewService.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/service/DocViewService.java new file mode 100644 index 0000000..292291c --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/docView/service/DocViewService.java @@ -0,0 +1,42 @@ +package com.dbnt.kcscopensearch.kcsc.docView.service; + +import com.dbnt.kcscopensearch.kcsc.docView.model.DocContentView; +import com.dbnt.kcscopensearch.kcsc.docView.model.DocIndexView; +import com.dbnt.kcscopensearch.kcsc.docView.model.DocTitleView; +import com.dbnt.kcscopensearch.kcsc.docView.repository.DocContentViewRepository; +import com.dbnt.kcscopensearch.kcsc.docView.repository.DocIndexViewRepository; +import com.dbnt.kcscopensearch.kcsc.docView.repository.DocTitleViewRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class DocViewService { + private final DocTitleViewRepository titleRepository; + private final DocIndexViewRepository indexRepository; + private final DocContentViewRepository contentRepository; + + public Map> selectAllView(){ + Map> viewDataMap = new HashMap<>(); + viewDataMap.put("docTitle", titleRepository.findAll()); + viewDataMap.put("docIndex", indexRepository.findAll()); + viewDataMap.put("docContent", contentRepository.findAll()); + return viewDataMap; + } + + public List selectAllDocTitle(){ + return titleRepository.findAll(); + } + + public List selectAllDocIndex(){ + return indexRepository.findAll(); + } + + public List selectAllDocContent(){ + return contentRepository.findAll(); + } +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/tnDocumentGroup/model/TnDocumentGroup.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/tnDocumentGroup/model/TnDocumentGroup.java new file mode 100644 index 0000000..f2269d0 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/tnDocumentGroup/model/TnDocumentGroup.java @@ -0,0 +1,61 @@ +package com.dbnt.kcscopensearch.kcsc.tnDocumentGroup.model; + +import jakarta.persistence.*; +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 java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@NoArgsConstructor +@DynamicInsert +@DynamicUpdate +@Table(name = "tn_document_group") +public class TnDocumentGroup { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "group_seq") + private Integer groupSeq; + @Column(name = "group_full_cd") + private String groupFullCd; + @Column(name = "kcsc_cd") + private String kcscCd; + @Column(name = "group_cur_cd") + private String groupCurCd; + @Column(name = "group_nm") + private String groupNm; + @Column(name = "group_type") + private String groupType; + @Column(name = "item_cd") + private String itemCd; + @Column(name = "doc_type") + private Integer docType; + @Column(name = "doc_level") + private Integer docLevel; + @Column(name = "doc_order") + private Integer docOrder; + @Column(name = "parent_group_seq") + private Integer parentGroupSeq; + @Column(name = "rvsn_remark") + private String rvsnRemark; + @Column(name = "frst_crt_id") + private String frstCrtId; + @Column(name = "frst_crt_dt") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime frstCrtDt; + @Column(name = "last_chg_id") + private String lastChgId; + @Column(name = "last_chg_dt") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime lastChgDt; + @Column(name = "use_yn") + private String useYn; + @Column(name = "old_seq") + private Integer oldSeq; +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/tnDocumentGroup/repository/TnDocumentGroupRepository.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/tnDocumentGroup/repository/TnDocumentGroupRepository.java new file mode 100644 index 0000000..0490058 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/tnDocumentGroup/repository/TnDocumentGroupRepository.java @@ -0,0 +1,16 @@ +package com.dbnt.kcscopensearch.kcsc.tnDocumentGroup.repository; + +import com.dbnt.kcscopensearch.kcsc.tnDocumentGroup.model.TnDocumentGroup; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface TnDocumentGroupRepository extends JpaRepository { + + Integer countBy(); + List findByOrderByGroupSeqAsc(Pageable pageable); + +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/tnDocumentGroup/service/TnDocumentGroupService.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/tnDocumentGroup/service/TnDocumentGroupService.java new file mode 100644 index 0000000..c8da89c --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/kcsc/tnDocumentGroup/service/TnDocumentGroupService.java @@ -0,0 +1,27 @@ +package com.dbnt.kcscopensearch.kcsc.tnDocumentGroup.service; + +import com.dbnt.kcscopensearch.kcsc.tnDocumentGroup.repository.TnDocumentGroupRepository; +import com.dbnt.kcscopensearch.kcsc.tnDocumentGroup.model.TnDocumentGroup; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class TnDocumentGroupService { + private final TnDocumentGroupRepository tnDocumentGroupRepository; + + public List selectAll(){ + /*List documentGroupList = new ArrayList<>(); + Integer totalCnt = tnDocumentGroupRepository.countBy(); + Integer pageCnt = 0; + while (pageCnt < totalCnt){ + List temp = tnDocumentGroupRepository.findByOrderByGroupSeqAsc(PageRequest.of(pageCnt, pageCnt+100)); + documentGroupList.addAll(temp); + pageCnt += 100; + } + return documentGroupList;*/ + return tnDocumentGroupRepository.findAll(); + } +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/DocSearchController.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/DocSearchController.java new file mode 100644 index 0000000..65478cc --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/DocSearchController.java @@ -0,0 +1,34 @@ +package com.dbnt.kcscopensearch.opensearch.docSearch; + +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocContent; +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocIndex; +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocTitle; +import com.dbnt.kcscopensearch.opensearch.docSearch.service.DocSearchService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/doc-search") +public class DocSearchController { + private final DocSearchService docSearchService; + + @GetMapping(value="/doc-title", produces = MediaType.APPLICATION_JSON_VALUE) + public List searchTitle (@RequestParam(value="searchText", required = true) String text){ + return docSearchService.selectDocTitle(text); + } + @GetMapping(value="/doc-index", produces = MediaType.APPLICATION_JSON_VALUE) + public List searchIndex (@RequestParam(value="searchText", required = true) String text){ + return docSearchService.selectDocIndex(text); + } + @GetMapping(value="/doc-content", produces = MediaType.APPLICATION_JSON_VALUE) + public List searchContent (@RequestParam(value="searchText", required = true) String text){ + return docSearchService.selectDocContent(text); + } +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/model/DocContent.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/model/DocContent.java new file mode 100644 index 0000000..2fa74ac --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/model/DocContent.java @@ -0,0 +1,39 @@ +package com.dbnt.kcscopensearch.opensearch.docSearch.model; + +import com.dbnt.kcscopensearch.kcsc.docView.model.DocContentView; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +@Getter +@Setter +@NoArgsConstructor +@Document(indexName = "doc_content") +public class DocContent { + @Id + private Integer id; + + @Field(type = FieldType.Text, name = "kcsc_cd") + private String kcscCd; + @Field(type = FieldType.Text, name = "doc_nm") + private String docNm; + @Field(type = FieldType.Text, name = "doc_yr") + private String docYr; + @Field(type = FieldType.Text, name = "group_title") + private String groupTitle; + @Field(type = FieldType.Text, name = "table_content") + private String tableContent; + + public DocContent(DocContentView view){ + this.id = view.getContentId(); + this.kcscCd = view.getKcscCd(); + this.docNm = view.getDocNm(); + this.docYr = view.getDocYr(); + this.groupTitle = view.getGroupTitle(); + this.tableContent = view.getTableContent(); + } +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/model/DocIndex.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/model/DocIndex.java new file mode 100644 index 0000000..284e3a9 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/model/DocIndex.java @@ -0,0 +1,36 @@ +package com.dbnt.kcscopensearch.opensearch.docSearch.model; + +import com.dbnt.kcscopensearch.kcsc.docView.model.DocIndexView; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +@Getter +@Setter +@NoArgsConstructor +@Document(indexName = "doc_index") +public class DocIndex { + @Id + private Integer id; + + @Field(type = FieldType.Text, name = "kcsc_cd") + private String kcscCd; + @Field(type = FieldType.Text, name = "doc_nm") + private String docNm; + @Field(type = FieldType.Text, name = "doc_yr") + private String docYr; + @Field(type = FieldType.Text, name = "group_title") + private String groupTitle; + + public DocIndex(DocIndexView view){ + this.id = view.getIndexId(); + this.kcscCd = view.getKcscCd(); + this.docNm = view.getDocNm(); + this.docYr = view.getDocYr(); + this.groupTitle = view.getGroupTitle(); + } +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/model/DocTitle.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/model/DocTitle.java new file mode 100644 index 0000000..c7fc96f --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/model/DocTitle.java @@ -0,0 +1,33 @@ +package com.dbnt.kcscopensearch.opensearch.docSearch.model; + +import com.dbnt.kcscopensearch.kcsc.docView.model.DocTitleView; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +@Getter +@Setter +@NoArgsConstructor +@Document(indexName = "doc_title") +public class DocTitle { + @Id + private Integer id; + + @Field(type = FieldType.Text, name = "kcsc_cd") + private String kcscCd; + @Field(type = FieldType.Text, name = "doc_nm") + private String docNm; + @Field(type = FieldType.Text, name = "doc_yr") + private String docYr; + + public DocTitle(DocTitleView view){ + this.id= view.getTitleId(); + this.kcscCd = view.getKcscCd(); + this.docNm = view.getDocNm(); + this.docYr = view.getDocYr(); + } +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocContentRepository.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocContentRepository.java new file mode 100644 index 0000000..ef34138 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocContentRepository.java @@ -0,0 +1,13 @@ +package com.dbnt.kcscopensearch.opensearch.docSearch.repository; + +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocContent; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface DocContentRepository extends ElasticsearchRepository { + + List findByTableContentContains(String text); +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocIndexRepository.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocIndexRepository.java new file mode 100644 index 0000000..b180047 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocIndexRepository.java @@ -0,0 +1,13 @@ +package com.dbnt.kcscopensearch.opensearch.docSearch.repository; + +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocIndex; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface DocIndexRepository extends ElasticsearchRepository { + + List findByGroupTitleContains(String text); +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocTitleRepository.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocTitleRepository.java new file mode 100644 index 0000000..07c68af --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocTitleRepository.java @@ -0,0 +1,13 @@ +package com.dbnt.kcscopensearch.opensearch.docSearch.repository; + +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocTitle; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface DocTitleRepository extends ElasticsearchRepository { + + List findByDocNmContains(String text); +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/service/DocSearchService.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/service/DocSearchService.java new file mode 100644 index 0000000..82e53a4 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/service/DocSearchService.java @@ -0,0 +1,136 @@ +package com.dbnt.kcscopensearch.opensearch.docSearch.service; + +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocContent; +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocIndex; +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocTitle; +import com.dbnt.kcscopensearch.opensearch.docSearch.repository.DocContentRepository; +import com.dbnt.kcscopensearch.opensearch.docSearch.repository.DocIndexRepository; +import com.dbnt.kcscopensearch.opensearch.docSearch.repository.DocTitleRepository; +import lombok.RequiredArgsConstructor; +import org.slf4j.LoggerFactory; +import org.slf4j.Logger; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class DocSearchService { + + private final DocTitleRepository titleRepository; + private final DocIndexRepository indexRepository; + private final DocContentRepository contentRepository; + private final Logger log = LoggerFactory.getLogger(this.getClass().getSimpleName()); + + @Transactional + public void save(Map> indexingDataMap){ + Iterator keys = indexingDataMap.keySet().iterator(); + while(keys.hasNext()) { + int i = 0; + String key = keys.next(); + List dataList = indexingDataMap.get(key); + if (!dataList.isEmpty()) { + switch (key) { + case "docTitle": + List titleList = (List) dataList; + while (i<=titleList.size()){ + int endNum = i+1000; + if(endNum>titleList.size()){ + endNum = titleList.size(); + } + titleRepository.saveAll(titleList.subList(i, endNum)); + i+=1000; + } + break; + case "docIndex": + List indexList = (List) dataList; + while (i<=indexList.size()){ + int endNum = i+1000; + if(endNum>indexList.size()){ + endNum = indexList.size(); + } + indexRepository.saveAll(indexList.subList(i, endNum)); + i+=1000; + } + break; + case "docContent": + List contentList = (List) dataList; + while (i<=contentList.size()){ + int endNum = i+1000; + if(endNum>contentList.size()){ + endNum = contentList.size(); + } + contentRepository.saveAll(contentList.subList(i, endNum)); + i+=1000; + } + break; + } + } + } + System.out.println("indexing end"); + } + + + @Transactional + public void saveDocTitle(List titleList) { + log.info("title indexing start listSize: "+titleList.size()); + int i = 0; + while (i<=titleList.size()){ + int endNum = i+1000; + if(endNum>titleList.size()){ + endNum = titleList.size(); + } + log.info("startNUm: "+i+" , endNum: "+endNum); + titleRepository.saveAll(titleList.subList(i, endNum)); + i+=1000; + } + log.info("titleIndexing end"); + } + + @Transactional + public void saveDocIndex(List indexList) { + log.info("index indexing start listSize: "+indexList.size()); + int i = 0; + while (i<=indexList.size()){ + int endNum = i+1000; + if(endNum>indexList.size()){ + endNum = indexList.size(); + } + log.info("startNUm: "+i+" , endNum: "+endNum); + indexRepository.saveAll(indexList.subList(i, endNum)); + i+=1000; + } + log.info("indexIndexing end"); + } + + @Transactional + public void saveDocContent(List contentList) { + log.info("content indexing start listSize: "+contentList.size()); + int i = 0; + while (i<=contentList.size()){ + int endNum = i+1000; + if(endNum>contentList.size()){ + endNum = contentList.size(); + } + log.info("startNUm: "+i+" , endNum: "+endNum); + contentRepository.saveAll(contentList.subList(i, endNum)); + i+=1000; + } + log.info("contentIndexing end"); + } + + public List selectDocTitle(String text) { + return titleRepository.findByDocNmContains(text); + } + + public List selectDocIndex(String text){ + return indexRepository.findByGroupTitleContains(text); + } + + public List selectDocContent(String text){ + return contentRepository.findByTableContentContains(text); + } +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/DocumentGroupController.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/DocumentGroupController.java new file mode 100644 index 0000000..5eafee4 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/DocumentGroupController.java @@ -0,0 +1,26 @@ +package com.dbnt.kcscopensearch.opensearch.documentGroup; + +import com.dbnt.kcscopensearch.opensearch.documentGroup.model.DocumentGroup; +import com.dbnt.kcscopensearch.opensearch.documentGroup.service.DocumentGroupService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/documentGroup") +public class DocumentGroupController { + + private final DocumentGroupService documentGroupService; + + /*@GetMapping(value = "/search", produces = MediaType.APPLICATION_JSON_VALUE) + public List search(@RequestParam(value="groupNm", required = true) String groupNm){ + return documentGroupService.search(groupNm); + }*/ + +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/model/DocumentGroup.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/model/DocumentGroup.java new file mode 100644 index 0000000..86ad44d --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/model/DocumentGroup.java @@ -0,0 +1,87 @@ +package com.dbnt.kcscopensearch.opensearch.documentGroup.model; + +import com.dbnt.kcscopensearch.kcsc.tnDocumentGroup.model.TnDocumentGroup; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +@Getter +@Setter +@NoArgsConstructor +@Document(indexName = "document_group") +public class DocumentGroup { + + @Id + private Integer id; + + @Field(type = FieldType.Integer, name = "group_seq") + private Integer groupSeq; + @Field(type = FieldType.Text, name = "group_full_cd") + private String groupFullCd; + @Field(type = FieldType.Text, name = "kcsc_cd") + private String kcscCd; + @Field(type = FieldType.Text, name = "group_cur_cd") + private String groupCurCd; + @Field(type = FieldType.Text, name = "group_nm") + private String groupNm; + @Field(type = FieldType.Text, name = "group_type") + private String groupType; + @Field(type = FieldType.Text, name = "item_cd") + private String itemCd; + @Field(type = FieldType.Integer, name = "doc_type") + private Integer docType; + @Field(type = FieldType.Integer, name = "doc_level") + private Integer docLevel; + @Field(type = FieldType.Integer, name = "doc_order") + private Integer docOrder; + @Field(type = FieldType.Integer, name = "parent_group_seq") + private Integer parentGroupSeq; + @Field(type = FieldType.Text, name = "rvsn_remark") + private String rvsnRemark; + @Field(type = FieldType.Text, name = "frst_crt_id") + private String frstCrtId; + @Field(type = FieldType.Date, name = "frst_crt_dt") + @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS", timezone = "Asia/Seoul") + private LocalDateTime frstCrtDt; + @Field(type = FieldType.Text, name = "last_chg_id") + private String lastChgId; + @Field(type = FieldType.Date, name = "last_chg_dt") + @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS", timezone = "Asia/Seoul") + private LocalDateTime lastChgDt; + @Field(type = FieldType.Text, name = "use_yn") + private String useYn; + @Field(type = FieldType.Integer, name = "old_seq") + private Integer oldSeq; + + public DocumentGroup(TnDocumentGroup documentGroup){ + this.id = documentGroup.getGroupSeq(); + this.groupSeq = documentGroup.getGroupSeq(); + this.groupFullCd = documentGroup.getGroupCurCd(); + this.kcscCd = documentGroup.getKcscCd(); + this.groupCurCd = documentGroup.getGroupCurCd(); + this.groupNm = documentGroup.getGroupNm(); + this.groupType = documentGroup.getGroupNm(); + this.itemCd = documentGroup.getItemCd(); + this.docType = documentGroup.getDocType(); + this.docLevel = documentGroup.getDocLevel(); + this.docOrder = documentGroup.getDocOrder(); + this.parentGroupSeq = documentGroup.getParentGroupSeq(); + this.rvsnRemark = documentGroup.getRvsnRemark(); + this.frstCrtId = documentGroup.getFrstCrtId(); + this.frstCrtDt = documentGroup.getFrstCrtDt(); + this.lastChgId = documentGroup.getLastChgId(); + this.lastChgDt = documentGroup.getLastChgDt(); + this.useYn = documentGroup.getUseYn(); + this.oldSeq = documentGroup.getOldSeq(); + } +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/repository/DocumentGroupRepository.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/repository/DocumentGroupRepository.java new file mode 100644 index 0000000..b45ff30 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/repository/DocumentGroupRepository.java @@ -0,0 +1,13 @@ +package com.dbnt.kcscopensearch.opensearch.documentGroup.repository; + +import com.dbnt.kcscopensearch.opensearch.documentGroup.model.DocumentGroup; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface DocumentGroupRepository extends ElasticsearchRepository { + List findByGroupNmLike(String groupNm); + +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/service/DocumentGroupService.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/service/DocumentGroupService.java new file mode 100644 index 0000000..083cd79 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/documentGroup/service/DocumentGroupService.java @@ -0,0 +1,25 @@ +package com.dbnt.kcscopensearch.opensearch.documentGroup.service; + +import com.dbnt.kcscopensearch.opensearch.documentGroup.model.DocumentGroup; +import com.dbnt.kcscopensearch.opensearch.documentGroup.repository.DocumentGroupRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class DocumentGroupService { + + private final DocumentGroupRepository documentGroupRepository; + + public List search(String groupNm){ + return documentGroupRepository.findByGroupNmLike(groupNm); + } + + @Transactional + public void save(List documentGroupList) { + documentGroupRepository.saveAll(documentGroupList); + } +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/scheduler/IndexingScheduler.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/scheduler/IndexingScheduler.java new file mode 100644 index 0000000..7011534 --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/scheduler/IndexingScheduler.java @@ -0,0 +1,91 @@ +package com.dbnt.kcscopensearch.scheduler; + +import com.dbnt.kcscopensearch.kcsc.docView.model.DocContentView; +import com.dbnt.kcscopensearch.kcsc.docView.model.DocIndexView; +import com.dbnt.kcscopensearch.kcsc.docView.model.DocTitleView; +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocContent; +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocIndex; +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocTitle; +import com.dbnt.kcscopensearch.opensearch.docSearch.service.DocSearchService; +import com.dbnt.kcscopensearch.kcsc.docView.service.DocViewService; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.*; + +@Component +@RequiredArgsConstructor +public class IndexingScheduler { + + private final DocViewService docViewService; + private final DocSearchService docSearchService; + + @Scheduled(cron = "40 18 23 * * *") + public void viewIndexing(){ + Map> viewDataMap = docViewService.selectAllView(); + Map> indexingDataMap = new HashMap<>(); + Iterator keys = viewDataMap.keySet().iterator(); + while(keys.hasNext()){ + String key = keys.next(); + List viewDataList = viewDataMap.get(key); + if(!viewDataList.isEmpty()){ + switch (key){ + case "docTitle": + List titleList = new ArrayList<>(); + for(Object obj: viewDataList){ + titleList.add(new DocTitle((DocTitleView) obj)); + } + indexingDataMap.put("docTitle", titleList); + break; + case "docIndex": + List indexList = new ArrayList<>(); + for(Object obj: viewDataList){ + indexList.add(new DocIndex((DocIndexView) obj)); + } + indexingDataMap.put("docIndex", indexList); + break; + case "docContent": + List contentList = new ArrayList<>(); + for(Object obj: viewDataList){ + contentList.add(new DocContent((DocContentView) obj)); + } + indexingDataMap.put("docContent", contentList); + break; + } + } + } + + docSearchService.save(indexingDataMap); + + //docSearchService.save(indexingDataMap); + } + + @Scheduled(cron = "40 20 23 * * *") + public void titleIndexing(){ + List titleViewList = docViewService.selectAllDocTitle(); + List titleList = new ArrayList<>(); + for(DocTitleView view: titleViewList){ + titleList.add(new DocTitle(view)); + } + docSearchService.saveDocTitle(titleList); + } + @Scheduled(cron = "40 21 23 * * *") + public void indexIndexing(){ + List indexViewList = docViewService.selectAllDocIndex(); + List indexList = new ArrayList<>(); + for(DocIndexView view: indexViewList){ + indexList.add(new DocIndex(view)); + } + docSearchService.saveDocIndex(indexList); + } + @Scheduled(cron = "40 25 23 * * *") + public void contentIndexing(){ + List contentViewList = docViewService.selectAllDocContent(); + List contentList = new ArrayList<>(); + for(DocContentView view: contentViewList){ + contentList.add(new DocContent(view)); + } + docSearchService.saveDocContent(contentList); + } +} diff --git a/kcsc-opensearch/src/main/resources/application.properties b/kcsc-opensearch/src/main/resources/application.properties new file mode 100644 index 0000000..ce0d122 --- /dev/null +++ b/kcsc-opensearch/src/main/resources/application.properties @@ -0,0 +1,16 @@ +spring.application.name=kcsc-opensearch + +opensearch.uris=https://localhost:9200 +opensearch.username=admin +opensearch.password=kpbP7ECsaTlgvfmaGNBtORH75QHf7TmJhHZdW7Z7 + +spring.datasource-kcsc.driverClassName=org.postgresql.Driver +spring.datasource-kcsc.jdbcUrl=jdbc:postgresql://118.219.150.34:50503/kcsc +spring.datasource-kcsc.username=dbnt0031 +spring.datasource-kcsc.password=dbnt0928! + +spring.jpa.show-sql=true +spring.jpa.generate-ddl=false +spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl + +spring.jackson.serialization.INDENT_OUTPUT=true \ No newline at end of file From d0f17a8086d318683a85ba6b908298d888d45c14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Fri, 5 Apr 2024 17:18:32 +0900 Subject: [PATCH 10/50] =?UTF-8?q?=EA=B2=80=EC=83=89=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=20api=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opensearch/docSearch/DocSearchController.java | 12 ++++++------ .../docSearch/repository/DocContentRepository.java | 3 ++- .../docSearch/repository/DocIndexRepository.java | 3 ++- .../docSearch/repository/DocTitleRepository.java | 3 ++- .../docSearch/service/DocSearchService.java | 13 +++++++------ 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/DocSearchController.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/DocSearchController.java index 65478cc..ae562ef 100644 --- a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/DocSearchController.java +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/DocSearchController.java @@ -20,15 +20,15 @@ public class DocSearchController { private final DocSearchService docSearchService; @GetMapping(value="/doc-title", produces = MediaType.APPLICATION_JSON_VALUE) - public List searchTitle (@RequestParam(value="searchText", required = true) String text){ - return docSearchService.selectDocTitle(text); + public List searchTitle (@RequestParam(value="searchText", required = true) String text, @RequestParam(value="pageNum", required = true) Integer pageNum){ + return docSearchService.selectDocTitle(text, pageNum); } @GetMapping(value="/doc-index", produces = MediaType.APPLICATION_JSON_VALUE) - public List searchIndex (@RequestParam(value="searchText", required = true) String text){ - return docSearchService.selectDocIndex(text); + public List searchIndex (@RequestParam(value="searchText", required = true) String text, @RequestParam(value="pageNum", required = true) Integer pageNum){ + return docSearchService.selectDocIndex(text, pageNum); } @GetMapping(value="/doc-content", produces = MediaType.APPLICATION_JSON_VALUE) - public List searchContent (@RequestParam(value="searchText", required = true) String text){ - return docSearchService.selectDocContent(text); + public List searchContent (@RequestParam(value="searchText", required = true) String text, @RequestParam(value="pageNum", required = true) Integer pageNum){ + return docSearchService.selectDocContent(text, pageNum); } } diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocContentRepository.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocContentRepository.java index ef34138..688ce7c 100644 --- a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocContentRepository.java +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocContentRepository.java @@ -1,6 +1,7 @@ package com.dbnt.kcscopensearch.opensearch.docSearch.repository; import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocContent; +import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Repository; @@ -9,5 +10,5 @@ import java.util.List; @Repository public interface DocContentRepository extends ElasticsearchRepository { - List findByTableContentContains(String text); + List findByTableContentContains(String text, Pageable pageable); } diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocIndexRepository.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocIndexRepository.java index b180047..f2b5641 100644 --- a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocIndexRepository.java +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocIndexRepository.java @@ -1,6 +1,7 @@ package com.dbnt.kcscopensearch.opensearch.docSearch.repository; import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocIndex; +import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Repository; @@ -9,5 +10,5 @@ import java.util.List; @Repository public interface DocIndexRepository extends ElasticsearchRepository { - List findByGroupTitleContains(String text); + List findByGroupTitleContains(String text, Pageable pageable); } diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocTitleRepository.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocTitleRepository.java index 07c68af..8f70978 100644 --- a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocTitleRepository.java +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/repository/DocTitleRepository.java @@ -1,6 +1,7 @@ package com.dbnt.kcscopensearch.opensearch.docSearch.repository; import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocTitle; +import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Repository; @@ -9,5 +10,5 @@ import java.util.List; @Repository public interface DocTitleRepository extends ElasticsearchRepository { - List findByDocNmContains(String text); + List findByDocNmContains(String text, Pageable pageable); } diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/service/DocSearchService.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/service/DocSearchService.java index 82e53a4..69b8187 100644 --- a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/service/DocSearchService.java +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/service/DocSearchService.java @@ -9,6 +9,7 @@ import com.dbnt.kcscopensearch.opensearch.docSearch.repository.DocTitleRepositor import lombok.RequiredArgsConstructor; import org.slf4j.LoggerFactory; import org.slf4j.Logger; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -122,15 +123,15 @@ public class DocSearchService { log.info("contentIndexing end"); } - public List selectDocTitle(String text) { - return titleRepository.findByDocNmContains(text); + public List selectDocTitle(String text, Integer pageNum) { + return titleRepository.findByDocNmContains(text, PageRequest.of(pageNum, 20)); } - public List selectDocIndex(String text){ - return indexRepository.findByGroupTitleContains(text); + public List selectDocIndex(String text, Integer pageNum){ + return indexRepository.findByGroupTitleContains(text, PageRequest.of(pageNum, 20)); } - public List selectDocContent(String text){ - return contentRepository.findByTableContentContains(text); + public List selectDocContent(String text, Integer pageNum){ + return contentRepository.findByTableContentContains(text, PageRequest.of(pageNum, 20)); } } From b4d0596992123c229dc532a39752642f917aa118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Mon, 8 Apr 2024 15:32:05 +0900 Subject: [PATCH 11/50] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EB=AC=BC=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EA=B2=8C=EC=8B=9C=ED=8C=90=EC=9C=A0=ED=98=95,=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=EC=96=B4,=20=ED=8E=98=EC=9D=B4=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/admin/board/AdminPostMgtList.jsx | 61 ++++++++----------- .../admin/boards/AdminBoardsController.java | 10 ++- .../admin/boards/entity/TnBbsContents.java | 3 +- .../boards/mapper/AdminBoardsMapper.java | 14 +++++ .../boards/service/AdminBoardsService.java | 13 ++-- .../mybatisMapper/AdminBoardsMapper.xml | 52 ++++++++++++++++ 6 files changed, 109 insertions(+), 44 deletions(-) create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/mapper/AdminBoardsMapper.java create mode 100644 kcsc-back-end/src/main/resources/mybatisMapper/AdminBoardsMapper.xml 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 75cbf60..be33693 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 @@ -24,7 +24,7 @@ function AdminPostMgtList(props) { console.log("EgovAdminPostList [location] : ", location); // eslint-disable-next-line no-unused-vars - const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { pageIndex: 1, searchCnd: '0', searchWrd: '' });// 기존 조회에서 접근 했을 시 || 신규로 접근 했을 시 + const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { pageIndex: 1, searchCnd: '0', searchKeyword: '', bbsSeq:8 });// 기존 조회에서 접근 했을 시 || 신규로 접근 했을 시 const [paginationInfo, setPaginationInfo] = useState({}); const cndRef = useRef(); @@ -38,19 +38,19 @@ function AdminPostMgtList(props) { const handleClose = () => setShow(false); const handleShow = () => setShow(true); - const retrieveList = useCallback(() => { + const retrieveList = useCallback((searchCondition) => { handleClose(); + const params = EgovNet.convParams(searchCondition); console.groupCollapsed("EgovAdminPostList.retrieveList()"); - const retrieveListURL = '/admin/boards/post-list'; + const retrieveListURL = '/admin/boards/post-list' + params; const requestOptions = { method: "GET", headers: { 'Content-type': 'application/json', - - }, - body: JSON.stringify() + + } } EgovNet.requestFetch(retrieveListURL, @@ -60,27 +60,24 @@ function AdminPostMgtList(props) { setCategoryList(resp.result.categoryList); let mutListTag = []; - listTag.push(

검색된 결과가 없습니다.

); // 게시판 목록 초기값 + setListTag([]); - // 리스트 항목 구성 resp.result.postList.forEach(function (item, index) { - if (index === 0) mutListTag = []; // 목록 초기화 - const finalModifiedDate = item.lastChgDt ? item.lastChgDt : item.frstCrtDt; + const finalModifiedDate = item?.lastChgDt ? item?.lastChgDt : item?.frstCrtDt; const formattedDate = finalModifiedDate ? format(finalModifiedDate, "yyyy-MM-dd HH:mm") : ""; - mutListTag.push(
-
-
{item.bbsContTitle}
-
{item.frstCrtId}
+
{item?.bbsContSeq}
+
{item?.bbsContTitle}
+
{item?.frstCrtId}
{formattedDate}
-
{item.bbsReadCnt}
-
{item.fileGrpId}
+
{item?.bbsReadCnt}
+
{item?.fileGrpId}
); }); - + if(!mutListTag.length) mutListTag.push(

검색된 결과가 없습니다.

); // 게시판 목록 초기값 setListTag(mutListTag); }, function (resp) { @@ -88,15 +85,15 @@ function AdminPostMgtList(props) { } ); console.groupEnd("EgovAdminPostList.retrieveList()"); - },[listTag, searchCondition]); + },[listTag]); useEffect(() => { retrieveList(searchCondition); // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + }, [searchCondition]); const handleSelectChange = (e) => { - + setSearchCondition({...searchCondition, bbsSeq: e.target.value}) } function editPost(item){ @@ -104,7 +101,7 @@ function AdminPostMgtList(props) { if(item != undefined) { item.mode = CODE.MODE_MODIFY; } - setModalBody() + setModalBody( retrieveList(searchCondition)}/>) } console.log("------------------------------EgovAdminPostList [End]"); @@ -139,12 +136,12 @@ function AdminPostMgtList(props) {
  • - 검색유형선택 + 게시판선택 @@ -152,15 +149,9 @@ function AdminPostMgtList(props) {
  • 검색어 - { - wrdRef.current.value = e.target.value; - }} - /> - + {setSearchCondition({...searchCondition, searchKeyword: e.target.value})}}/> +
@@ -170,7 +161,7 @@ function AdminPostMgtList(props) { {/* */}
- + 번호 제목 작성자 최종수정일 @@ -187,7 +178,7 @@ function AdminPostMgtList(props) {
{/* */} { - retrieveList({ ...searchCondition, pageIndex: passedPage, searchCnd: cndRef.current.value, searchWrd: wrdRef.current.value }) + retrieveList({ ...searchCondition, pageIndex: passedPage}) //, searchCnd: cndRef.current.value, searchKeyword: wrdRef.current.value }} /> {/* */}
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 1072a1f..dcb9a54 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 @@ -152,11 +152,15 @@ public class AdminBoardsController extends BaseController { @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) @RequestMapping(method = RequestMethod.GET, value = "/post-list", consumes = MediaType.APPLICATION_JSON_VALUE) - public ResultVO getPostList() throws Exception { + public ResultVO getPostList(TnBbsContents params) throws Exception { ResultVO resultVO = new ResultVO(); - Map resultMap = new HashMap<>(); + params.setQueryInfo(); + Map resultMap = adminBoardsService.selectPostList(params); resultMap.put("categoryList", adminBoardsService.selectBoardList()); - resultMap.put("postList", adminBoardsService.selectPostList()); + int totCnt = Integer.parseInt((String)resultMap.get("resultCnt")); + params.setContentCnt(totCnt); + params.setPaginationInfo(); + resultMap.put("paginationInfo", params); resultVO.setResult(resultMap); return resultVO; } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/entity/TnBbsContents.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/entity/TnBbsContents.java index 42bd06c..f0a42e8 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/entity/TnBbsContents.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/entity/TnBbsContents.java @@ -1,4 +1,5 @@ package com.dbnt.kcscbackend.admin.boards.entity; +import com.dbnt.kcscbackend.config.common.BoardParams; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -15,7 +16,7 @@ import java.time.LocalDateTime; @DynamicInsert @DynamicUpdate @Table(name = "tn_bbs_contents") -public class TnBbsContents { +public class TnBbsContents extends BoardParams { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "bbs_cont_seq") diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/mapper/AdminBoardsMapper.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/mapper/AdminBoardsMapper.java new file mode 100644 index 0000000..55b22ea --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/mapper/AdminBoardsMapper.java @@ -0,0 +1,14 @@ +package com.dbnt.kcscbackend.admin.boards.mapper; + +import com.dbnt.kcscbackend.admin.boards.entity.TnBbsContents; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface AdminBoardsMapper { + + List selectPostList(TnBbsContents params); + + Integer selectPostListCnt(TnBbsContents params); +} 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 d8ba319..c65a8c8 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 @@ -2,6 +2,7 @@ package com.dbnt.kcscbackend.admin.boards.service; import com.dbnt.kcscbackend.admin.boards.entity.TnBbs; import com.dbnt.kcscbackend.admin.boards.entity.TnBbsContents; +import com.dbnt.kcscbackend.admin.boards.mapper.AdminBoardsMapper; import com.dbnt.kcscbackend.admin.boards.repository.TnBbsContentsRepository; import com.dbnt.kcscbackend.admin.boards.repository.TnBbsRepository; import com.dbnt.kcscbackend.admin.config.entity.TcMenu; @@ -17,9 +18,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; import java.time.LocalDateTime; -import java.util.Date; -import java.util.List; -import java.util.Optional; +import java.util.*; @Service @RequiredArgsConstructor @@ -27,6 +26,7 @@ public class AdminBoardsService extends EgovAbstractServiceImpl { private final TnBbsRepository tnBbsRepository; private final TnBbsContentsRepository tnBbsContentsRepository; + private final AdminBoardsMapper adminBoardsMapper; private final FileService fileService; public List selectBoardList() { @@ -70,8 +70,11 @@ public class AdminBoardsService extends EgovAbstractServiceImpl { } } - public List selectPostList() { - return tnBbsContentsRepository.findAll(); + public Map selectPostList(TnBbsContents params) { + Map resultMap = new HashMap<>(); + resultMap.put("resultCnt", String.valueOf(adminBoardsMapper.selectPostListCnt(params))); + resultMap.put("postList", adminBoardsMapper.selectPostList(params)); + return resultMap; } /** diff --git a/kcsc-back-end/src/main/resources/mybatisMapper/AdminBoardsMapper.xml b/kcsc-back-end/src/main/resources/mybatisMapper/AdminBoardsMapper.xml new file mode 100644 index 0000000..a65e26c --- /dev/null +++ b/kcsc-back-end/src/main/resources/mybatisMapper/AdminBoardsMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + and bbs_seq = #{bbsSeq} + + + and bbs_cont_title like '%'||#{searchKeyword}||'%' + + + + \ No newline at end of file From a7e798d5d788ead10966f8ca1c1629b756d493aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Mon, 15 Apr 2024 17:54:20 +0900 Subject: [PATCH 12/50] =?UTF-8?q?kcsc-back-end=20<>=20kcsc-opensearch=20?= =?UTF-8?q?=ED=86=B5=EC=8B=A0=20=EC=9E=91=EC=97=85=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?kcsc-opensearch=20<>=20opensearch=20=EB=B0=B0=ED=8F=AC=EC=84=9C?= =?UTF-8?q?=EB=B2=84=20=EC=84=B8=ED=8C=85=EC=A4=91.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kcsc-back-end/build.gradle | 4 ++ .../config/security/SecurityConfig.java | 3 + .../kcscbackend/search/SearchController.java | 29 +++++++++ .../kcscbackend/search/model/DocContent.java | 25 ++++++++ .../kcscbackend/search/model/DocIndex.java | 23 ++++++++ .../kcscbackend/search/model/DocTitle.java | 21 +++++++ .../search/service/SearchService.java | 46 +++++++++++++++ .../main/resources/application-dev.properties | 5 ++ .../resources/application-prod.properties | 5 ++ .../src/main/resources/application.properties | 4 -- .../indexing/IndexingController.java | 59 +++++++++++++++++++ .../docSearch/DocSearchController.java | 21 +++++-- .../docSearch/service/DocSearchService.java | 12 ++-- .../scheduler/IndexingScheduler.java | 18 +++--- .../main/resources/application-dev.properties | 3 + .../resources/application-prod.properties | 3 + .../src/main/resources/application.properties | 5 +- 17 files changed, 256 insertions(+), 30 deletions(-) create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/SearchController.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocContent.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocIndex.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocTitle.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/service/SearchService.java create mode 100644 kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/indexing/IndexingController.java create mode 100644 kcsc-opensearch/src/main/resources/application-dev.properties create mode 100644 kcsc-opensearch/src/main/resources/application-prod.properties diff --git a/kcsc-back-end/build.gradle b/kcsc-back-end/build.gradle index 34a1ba0..2ca397a 100644 --- a/kcsc-back-end/build.gradle +++ b/kcsc-back-end/build.gradle @@ -89,6 +89,10 @@ dependencies { implementation 'org.apache.commons:commons-lang3' + // https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5 + implementation group: 'org.apache.httpcomponents.client5', name: 'httpclient5', version: '5.3.1' + // https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple + implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1' } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java index 5f1a557..d77ea7b 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java @@ -89,6 +89,9 @@ public class SecurityConfig { /* 기준코드 조회 */ "/standardCode/**", + /* 통합검색 요청 */ + "/search/doc", + /* 관련사이트 이미지 조회 */ "/admin/config/get-site-image/**" }; diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/SearchController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/SearchController.java new file mode 100644 index 0000000..14fda3b --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/SearchController.java @@ -0,0 +1,29 @@ +package com.dbnt.kcscbackend.search; + +import com.dbnt.kcscbackend.search.model.DocTitle; +import com.dbnt.kcscbackend.search.service.SearchService; +import lombok.RequiredArgsConstructor; +import org.json.simple.JSONArray; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/search") +public class SearchController { + + private final SearchService searchService; + + @RequestMapping("/doc") + public JSONArray searchDoc( + @RequestParam(value="target", required = true) String target, + @RequestParam(value="searchText", required = true) String text, + @RequestParam(value="pageNum", required = false, defaultValue = "1") Integer pageNum, + @RequestParam(value="pageSize", required = false, defaultValue = "15") Integer pageSize + ){ + return searchService.searchRequest(target, text, pageNum, pageSize); + } +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocContent.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocContent.java new file mode 100644 index 0000000..fe67d02 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocContent.java @@ -0,0 +1,25 @@ +package com.dbnt.kcscbackend.search.model; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor + +public class DocContent { + + private Integer id; + + private String kcscCd; + + private String docNm; + + private String docYr; + + private String groupTitle; + + private String tableContent; + +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocIndex.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocIndex.java new file mode 100644 index 0000000..f314f5a --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocIndex.java @@ -0,0 +1,23 @@ +package com.dbnt.kcscbackend.search.model; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class DocIndex { + + private Integer id; + + private String kcscCd; + + private String docNm; + + private String docYr; + + private String groupTitle; + + +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocTitle.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocTitle.java new file mode 100644 index 0000000..db3b2d8 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocTitle.java @@ -0,0 +1,21 @@ +package com.dbnt.kcscbackend.search.model; + + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class DocTitle { + + private Integer id; + + private String kcscCd; + + private String docNm; + + private String docYr; + +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/service/SearchService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/service/SearchService.java new file mode 100644 index 0000000..77f661f --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/service/SearchService.java @@ -0,0 +1,46 @@ +package com.dbnt.kcscbackend.search.service; + +import lombok.RequiredArgsConstructor; + +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.ParseException; +import org.apache.hc.core5.http.io.entity.EntityUtils; +import org.json.simple.JSONArray; +import org.json.simple.parser.JSONParser; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +@Service +@RequiredArgsConstructor +public class SearchService { + + + public JSONArray searchRequest(String target, String text, Integer pageNum, Integer pageSize) { + String uri = "http://localhost:8090"; + switch (target){ + case "title": uri+="/doc-search/doc-title?";break; + case "index": uri+="/doc-search/doc-index?";break; + case "content": uri+="/doc-search/doc-content?";break; + } + String param = "searchText="+URLEncoder.encode(text, StandardCharsets.UTF_8)+"&pageNum="+pageNum+"&pageSize="+pageSize; + try{ + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(uri+param); + httpGet.addHeader("User-Agent", "Mozilla/5.0"); + httpGet.addHeader("Content-type", "application/json;charset=UTF-8"); + CloseableHttpResponse httpResponse = httpClient.execute(httpGet); + String json = EntityUtils.toString(httpResponse.getEntity(), "UTF-8"); + return (JSONArray)new JSONParser().parse(json); + } catch (IOException | ParseException e) { + throw new RuntimeException(e); + } catch (org.json.simple.parser.ParseException e) { + throw new RuntimeException(e); + } + } +} diff --git a/kcsc-back-end/src/main/resources/application-dev.properties b/kcsc-back-end/src/main/resources/application-dev.properties index 604bda4..1d463c0 100644 --- a/kcsc-back-end/src/main/resources/application-dev.properties +++ b/kcsc-back-end/src/main/resources/application-dev.properties @@ -33,3 +33,8 @@ logging.level.com.atoz_develop.mybatissample.repository=TRACE Globals.posblAtchFileSize=5242880 Globals.fileStorePath=D:\\kcscUploadFiles Globals.addedOptions=false + +#JWT +# redisConfig +spring.redis.host=localhost +spring.redis.port=6379 \ No newline at end of file diff --git a/kcsc-back-end/src/main/resources/application-prod.properties b/kcsc-back-end/src/main/resources/application-prod.properties index c2e9161..336ddca 100644 --- a/kcsc-back-end/src/main/resources/application-prod.properties +++ b/kcsc-back-end/src/main/resources/application-prod.properties @@ -36,3 +36,8 @@ logging.level.com.atoz_develop.mybatissample.repository=info Globals.posblAtchFileSize=5242880 Globals.fileStorePath=/kcscUploadFiles Globals.addedOptions=false + +#JWT +# redisConfig +spring.redis.host=localhost +spring.redis.port=6479 \ No newline at end of file diff --git a/kcsc-back-end/src/main/resources/application.properties b/kcsc-back-end/src/main/resources/application.properties index 96c2e7e..27d335f 100644 --- a/kcsc-back-end/src/main/resources/application.properties +++ b/kcsc-back-end/src/main/resources/application.properties @@ -6,10 +6,6 @@ spring.mvc.pathmatch.matching-strategy=ant_path_matcher Globals.pageUnit=10 Globals.pageSize=10 -#JWT -# redisConfig -spring.redis.host=localhost -spring.redis.port=6379 # secret key Globals.jwt.secret = qWwMroux3QtiIJcPSIZARNTZEBBnWVH0jZ2Lx7tfFChCYi0ViZllo1bekZdiU0B3FRjJI7g90n0ha120dwlz8JZU8rOkmNCe9Uq0 diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/indexing/IndexingController.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/indexing/IndexingController.java new file mode 100644 index 0000000..66759bb --- /dev/null +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/indexing/IndexingController.java @@ -0,0 +1,59 @@ +package com.dbnt.kcscopensearch.indexing; + +import com.dbnt.kcscopensearch.kcsc.docView.model.DocContentView; +import com.dbnt.kcscopensearch.kcsc.docView.model.DocIndexView; +import com.dbnt.kcscopensearch.kcsc.docView.model.DocTitleView; +import com.dbnt.kcscopensearch.kcsc.docView.service.DocViewService; +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocContent; +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocIndex; +import com.dbnt.kcscopensearch.opensearch.docSearch.model.DocTitle; +import com.dbnt.kcscopensearch.opensearch.docSearch.service.DocSearchService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/indexing") +public class IndexingController { + private final DocViewService docViewService; + private final DocSearchService docSearchService; + + @GetMapping("/doc-title") + public String getTitleIndexing(){ + List titleViewList = docViewService.selectAllDocTitle(); + List titleList = new ArrayList<>(); + for(DocTitleView view: titleViewList){ + titleList.add(new DocTitle(view)); + } + docSearchService.saveDocTitle(titleList); + return "OK"; + } + + @GetMapping("/doc-index") + public String getIndexIndexing(){ + List indexViewList = docViewService.selectAllDocIndex(); + List indexList = new ArrayList<>(); + for(DocIndexView view: indexViewList){ + indexList.add(new DocIndex(view)); + } + docSearchService.saveDocIndex(indexList); + return "OK"; + } + + @GetMapping("/doc-content") + public String getContentIndexing(){ + List contentViewList = docViewService.selectAllDocContent(); + List contentList = new ArrayList<>(); + for(DocContentView view: contentViewList){ + contentList.add(new DocContent(view)); + } + docSearchService.saveDocContent(contentList); + return "OK"; + } + +} diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/DocSearchController.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/DocSearchController.java index ae562ef..52ebf0d 100644 --- a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/DocSearchController.java +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/DocSearchController.java @@ -20,15 +20,24 @@ public class DocSearchController { private final DocSearchService docSearchService; @GetMapping(value="/doc-title", produces = MediaType.APPLICATION_JSON_VALUE) - public List searchTitle (@RequestParam(value="searchText", required = true) String text, @RequestParam(value="pageNum", required = true) Integer pageNum){ - return docSearchService.selectDocTitle(text, pageNum); + public List searchTitle ( + @RequestParam(value="searchText", required = true) String text, + @RequestParam(value="pageNum", required = false, defaultValue = "1") Integer pageNum, + @RequestParam(value="pageSize", required = false, defaultValue = "15") Integer pageSize){ + return docSearchService.selectDocTitle(text, pageNum, pageSize); } @GetMapping(value="/doc-index", produces = MediaType.APPLICATION_JSON_VALUE) - public List searchIndex (@RequestParam(value="searchText", required = true) String text, @RequestParam(value="pageNum", required = true) Integer pageNum){ - return docSearchService.selectDocIndex(text, pageNum); + public List searchIndex ( + @RequestParam(value="searchText", required = true) String text, + @RequestParam(value="pageNum", required = false, defaultValue = "1") Integer pageNum, + @RequestParam(value="pageSize", required = false, defaultValue = "15") Integer pageSize){ + return docSearchService.selectDocIndex(text, pageNum, pageSize); } @GetMapping(value="/doc-content", produces = MediaType.APPLICATION_JSON_VALUE) - public List searchContent (@RequestParam(value="searchText", required = true) String text, @RequestParam(value="pageNum", required = true) Integer pageNum){ - return docSearchService.selectDocContent(text, pageNum); + public List searchContent ( + @RequestParam(value="searchText", required = true) String text, + @RequestParam(value="pageNum", required = false, defaultValue = "1") Integer pageNum, + @RequestParam(value="pageSize", required = false, defaultValue = "15") Integer pageSize){ + return docSearchService.selectDocContent(text, pageNum, pageSize); } } diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/service/DocSearchService.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/service/DocSearchService.java index 69b8187..fd7e57b 100644 --- a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/service/DocSearchService.java +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/opensearch/docSearch/service/DocSearchService.java @@ -123,15 +123,15 @@ public class DocSearchService { log.info("contentIndexing end"); } - public List selectDocTitle(String text, Integer pageNum) { - return titleRepository.findByDocNmContains(text, PageRequest.of(pageNum, 20)); + public List selectDocTitle(String text, Integer pageNum, Integer pageSize) { + return titleRepository.findByDocNmContains(text, PageRequest.of(pageNum, pageSize)); } - public List selectDocIndex(String text, Integer pageNum){ - return indexRepository.findByGroupTitleContains(text, PageRequest.of(pageNum, 20)); + public List selectDocIndex(String text, Integer pageNum, Integer pageSize){ + return indexRepository.findByGroupTitleContains(text, PageRequest.of(pageNum, pageSize)); } - public List selectDocContent(String text, Integer pageNum){ - return contentRepository.findByTableContentContains(text, PageRequest.of(pageNum, 20)); + public List selectDocContent(String text, Integer pageNum, Integer pageSize){ + return contentRepository.findByTableContentContains(text, PageRequest.of(pageNum, pageSize)); } } diff --git a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/scheduler/IndexingScheduler.java b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/scheduler/IndexingScheduler.java index 7011534..9b1df76 100644 --- a/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/scheduler/IndexingScheduler.java +++ b/kcsc-opensearch/src/main/java/com/dbnt/kcscopensearch/scheduler/IndexingScheduler.java @@ -21,7 +21,7 @@ public class IndexingScheduler { private final DocViewService docViewService; private final DocSearchService docSearchService; - @Scheduled(cron = "40 18 23 * * *") + /*@Scheduled(cron = "40 18 23 * * *") public void viewIndexing(){ Map> viewDataMap = docViewService.selectAllView(); Map> indexingDataMap = new HashMap<>(); @@ -57,12 +57,10 @@ public class IndexingScheduler { } docSearchService.save(indexingDataMap); + }*/ - //docSearchService.save(indexingDataMap); - } - - @Scheduled(cron = "40 20 23 * * *") - public void titleIndexing(){ + @Scheduled(cron = "40 1 2 * * *") + public void ScheduledTitleIndexing(){ List titleViewList = docViewService.selectAllDocTitle(); List titleList = new ArrayList<>(); for(DocTitleView view: titleViewList){ @@ -70,8 +68,8 @@ public class IndexingScheduler { } docSearchService.saveDocTitle(titleList); } - @Scheduled(cron = "40 21 23 * * *") - public void indexIndexing(){ + @Scheduled(cron = "40 2 2 * * *") + public void ScheduledIndexIndexing(){ List indexViewList = docViewService.selectAllDocIndex(); List indexList = new ArrayList<>(); for(DocIndexView view: indexViewList){ @@ -79,8 +77,8 @@ public class IndexingScheduler { } docSearchService.saveDocIndex(indexList); } - @Scheduled(cron = "40 25 23 * * *") - public void contentIndexing(){ + @Scheduled(cron = "40 7 2 * * *") + public void ScheduledContentIndexing(){ List contentViewList = docViewService.selectAllDocContent(); List contentList = new ArrayList<>(); for(DocContentView view: contentViewList){ diff --git a/kcsc-opensearch/src/main/resources/application-dev.properties b/kcsc-opensearch/src/main/resources/application-dev.properties new file mode 100644 index 0000000..0126223 --- /dev/null +++ b/kcsc-opensearch/src/main/resources/application-dev.properties @@ -0,0 +1,3 @@ +opensearch.uris=https://localhost:9200 +opensearch.username=admin +opensearch.password=kpbP7ECsaTlgvfmaGNBtORH75QHf7TmJhHZdW7Z7 \ No newline at end of file diff --git a/kcsc-opensearch/src/main/resources/application-prod.properties b/kcsc-opensearch/src/main/resources/application-prod.properties new file mode 100644 index 0000000..8f4c3c1 --- /dev/null +++ b/kcsc-opensearch/src/main/resources/application-prod.properties @@ -0,0 +1,3 @@ +opensearch.uris=https://kcsc.dbnt.co.kr:9200 +opensearch.username=admin +opensearch.password=kpbP7ECsaTlgvfmaGNBtORH75QHf7TmJhHZdW7Z7 \ No newline at end of file diff --git a/kcsc-opensearch/src/main/resources/application.properties b/kcsc-opensearch/src/main/resources/application.properties index ce0d122..0a755b0 100644 --- a/kcsc-opensearch/src/main/resources/application.properties +++ b/kcsc-opensearch/src/main/resources/application.properties @@ -1,8 +1,5 @@ spring.application.name=kcsc-opensearch - -opensearch.uris=https://localhost:9200 -opensearch.username=admin -opensearch.password=kpbP7ECsaTlgvfmaGNBtORH75QHf7TmJhHZdW7Z7 +server.port=8090 spring.datasource-kcsc.driverClassName=org.postgresql.Driver spring.datasource-kcsc.jdbcUrl=jdbc:postgresql://118.219.150.34:50503/kcsc From cb9aff3e56ac4f177878820581211ccaf687b198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Tue, 16 Apr 2024 16:11:16 +0900 Subject: [PATCH 13/50] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=84=9C?= =?UTF-8?q?=EB=B2=84=20opensearch=20=EC=97=B0=EB=8F=99=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=99=84=EB=A3=8C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dbnt/kcscbackend/search/service/SearchService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/service/SearchService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/service/SearchService.java index 77f661f..5e5795c 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/service/SearchService.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/service/SearchService.java @@ -22,7 +22,7 @@ public class SearchService { public JSONArray searchRequest(String target, String text, Integer pageNum, Integer pageSize) { - String uri = "http://localhost:8090"; + String uri = "http://192.168.0.89:8090"; switch (target){ case "title": uri+="/doc-search/doc-title?";break; case "index": uri+="/doc-search/doc-index?";break; From c50039f9356589a47d86d882899ab1db20bf1528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Tue, 16 Apr 2024 17:49:15 +0900 Subject: [PATCH 14/50] =?UTF-8?q?propertis=20=EC=A0=95=EB=A6=AC=20?= =?UTF-8?q?=EB=AF=B8=EC=82=AC=EC=9A=A9=20class=20=EC=82=AD=EC=A0=9C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kcscbackend/search/SearchController.java | 1 - .../kcscbackend/search/model/DocContent.java | 25 ----------- .../kcscbackend/search/model/DocIndex.java | 23 ----------- .../kcscbackend/search/model/DocTitle.java | 21 ---------- .../search/service/SearchService.java | 14 ++++--- .../main/resources/application-dev.properties | 4 +- .../resources/application-local.properties | 41 ------------------- .../resources/application-prod.properties | 6 +-- .../resources/application-test.properties | 15 ++++--- .../main/resources/application-dev.properties | 3 -- .../resources/application-prod.properties | 3 -- .../src/main/resources/application.properties | 4 ++ 12 files changed, 26 insertions(+), 134 deletions(-) delete mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocContent.java delete mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocIndex.java delete mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocTitle.java delete mode 100644 kcsc-back-end/src/main/resources/application-local.properties delete mode 100644 kcsc-opensearch/src/main/resources/application-dev.properties delete mode 100644 kcsc-opensearch/src/main/resources/application-prod.properties diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/SearchController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/SearchController.java index 14fda3b..0eac27b 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/SearchController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/SearchController.java @@ -1,6 +1,5 @@ package com.dbnt.kcscbackend.search; -import com.dbnt.kcscbackend.search.model.DocTitle; import com.dbnt.kcscbackend.search.service.SearchService; import lombok.RequiredArgsConstructor; import org.json.simple.JSONArray; diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocContent.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocContent.java deleted file mode 100644 index fe67d02..0000000 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocContent.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dbnt.kcscbackend.search.model; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor - -public class DocContent { - - private Integer id; - - private String kcscCd; - - private String docNm; - - private String docYr; - - private String groupTitle; - - private String tableContent; - -} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocIndex.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocIndex.java deleted file mode 100644 index f314f5a..0000000 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocIndex.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dbnt.kcscbackend.search.model; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor -public class DocIndex { - - private Integer id; - - private String kcscCd; - - private String docNm; - - private String docYr; - - private String groupTitle; - - -} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocTitle.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocTitle.java deleted file mode 100644 index db3b2d8..0000000 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/model/DocTitle.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.dbnt.kcscbackend.search.model; - - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor -public class DocTitle { - - private Integer id; - - private String kcscCd; - - private String docNm; - - private String docYr; - -} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/service/SearchService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/service/SearchService.java index 5e5795c..126a01f 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/service/SearchService.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/search/service/SearchService.java @@ -10,6 +10,7 @@ import org.apache.hc.core5.http.ParseException; import org.apache.hc.core5.http.io.entity.EntityUtils; import org.json.simple.JSONArray; import org.json.simple.parser.JSONParser; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.IOException; @@ -19,19 +20,20 @@ import java.nio.charset.StandardCharsets; @Service @RequiredArgsConstructor public class SearchService { - + @Value("${kcsc.opensearch.url}") + protected String kcscOpensearchUrl; public JSONArray searchRequest(String target, String text, Integer pageNum, Integer pageSize) { - String uri = "http://192.168.0.89:8090"; + String url = kcscOpensearchUrl; switch (target){ - case "title": uri+="/doc-search/doc-title?";break; - case "index": uri+="/doc-search/doc-index?";break; - case "content": uri+="/doc-search/doc-content?";break; + case "title": url+="/doc-search/doc-title?";break; + case "index": url+="/doc-search/doc-index?";break; + case "content": url+="/doc-search/doc-content?";break; } String param = "searchText="+URLEncoder.encode(text, StandardCharsets.UTF_8)+"&pageNum="+pageNum+"&pageSize="+pageSize; try{ CloseableHttpClient httpClient = HttpClients.createDefault(); - HttpGet httpGet = new HttpGet(uri+param); + HttpGet httpGet = new HttpGet(url+param); httpGet.addHeader("User-Agent", "Mozilla/5.0"); httpGet.addHeader("Content-type", "application/json;charset=UTF-8"); CloseableHttpResponse httpResponse = httpClient.execute(httpGet); diff --git a/kcsc-back-end/src/main/resources/application-dev.properties b/kcsc-back-end/src/main/resources/application-dev.properties index 1d463c0..828b8e1 100644 --- a/kcsc-back-end/src/main/resources/application-dev.properties +++ b/kcsc-back-end/src/main/resources/application-dev.properties @@ -37,4 +37,6 @@ Globals.addedOptions=false #JWT # redisConfig spring.redis.host=localhost -spring.redis.port=6379 \ No newline at end of file +spring.redis.port=6379 + +kcsc.opensearch.url=http://192.168.0.89:8090 \ No newline at end of file diff --git a/kcsc-back-end/src/main/resources/application-local.properties b/kcsc-back-end/src/main/resources/application-local.properties deleted file mode 100644 index 20ab5a8..0000000 --- a/kcsc-back-end/src/main/resources/application-local.properties +++ /dev/null @@ -1,41 +0,0 @@ - -# Access-Control-Allow-Origin -Globals.Allow.Origin = http://localhost:3000 - - -spring.devtools.livereload.enabled=true -#Datasource Configuration -spring.sql.init.encoding=utf-8 -#maximum-pool-size: CPU core count -spring.datasource.hikari.maximum-pool-size=4 -#postgresql -#spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy -#spring.datasource.url=jdbc:log4jdbc:postgresql://118.219.150.34:50654/kcsc -#spring.datasource.username=kcsc -#spring.datasource.password=dbnt0928! -spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy -#spring.datasource.url=jdbc:log4jdbc:postgresql://127.0.0.1:5432/kcsc -spring.datasource.url=jdbc:log4jdbc:postgresql://118.219.150.34:50503/kcsc -spring.datasource.username=dbnt0031 -spring.datasource.password=dbnt0928! - - -#jpa -spring.jpa.show-sql=true -spring.jpa.generate-ddl=false -spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl -spring.jpa.properties.hibernate.proc.param_null_passing=true -spring.jpa.properties.hibernate.jdbc.time_zone=Asia/Seoul - - - -# MyBatis -mybatis.mapper-locations: mybatisMapper/*.xml -mybatis.configuration.map-underscore-to-camel-case=true -mybatis.type-aliases-package=com.dbnt.kcscbackend.**.entity -logging.level.com.atoz_develop.mybatissample.repository=TRACE - -# File Config -Globals.posblAtchFileSize=5242880 -Globals.fileStorePath=D:\\kcscUploadFiles -Globals.addedOptions=false \ No newline at end of file diff --git a/kcsc-back-end/src/main/resources/application-prod.properties b/kcsc-back-end/src/main/resources/application-prod.properties index 336ddca..4c0c55c 100644 --- a/kcsc-back-end/src/main/resources/application-prod.properties +++ b/kcsc-back-end/src/main/resources/application-prod.properties @@ -1,3 +1,4 @@ +# ??? ? ?? ?? properties ?? ?? ? ?? ??. # Access-Control-Allow-Origin Globals.Allow.Origin = https://back.dbnt.co.kr @@ -37,7 +38,4 @@ Globals.posblAtchFileSize=5242880 Globals.fileStorePath=/kcscUploadFiles Globals.addedOptions=false -#JWT -# redisConfig -spring.redis.host=localhost -spring.redis.port=6479 \ No newline at end of file +kcsc.opensearch.url=http://192.168.0.89:8090 \ No newline at end of file diff --git a/kcsc-back-end/src/main/resources/application-test.properties b/kcsc-back-end/src/main/resources/application-test.properties index 806fec5..4d6c377 100644 --- a/kcsc-back-end/src/main/resources/application-test.properties +++ b/kcsc-back-end/src/main/resources/application-test.properties @@ -1,8 +1,9 @@ +# dbnt ?? ??? ?? properties # Access-Control-Allow-Origin -Globals.Allow.Origin = http://118.219.150.34:50590/ +Globals.Allow.Origin = https://back.dbnt.co.kr -server.port=8088 +server.port=8080 spring.devtools.livereload.enabled=false server.error.path=/errors @@ -16,8 +17,8 @@ spring.sql.init.encoding=utf-8 spring.datasource.hikari.maximum-pool-size=4 #postgresql spring.datasource.driverClassName=org.postgresql.Driver -spring.datasource.url=jdbc:postgresql://localhost/kcsc -spring.datasource.username=kcsc +spring.datasource.url=jdbc:postgresql://118.219.150.34:50503/kcsc +spring.datasource.username=dbnt0031 spring.datasource.password=dbnt0928! #jpa @@ -34,5 +35,7 @@ logging.level.com.atoz_develop.mybatissample.repository=info # File Config Globals.posblAtchFileSize=5242880 -Globals.fileStorePath=D:\\kcscUploadFiles -Globals.addedOptions=false \ No newline at end of file +Globals.fileStorePath=/kcscUploadFiles +Globals.addedOptions=false + +kcsc.opensearch.url=http://192.168.0.89:8090 diff --git a/kcsc-opensearch/src/main/resources/application-dev.properties b/kcsc-opensearch/src/main/resources/application-dev.properties deleted file mode 100644 index 0126223..0000000 --- a/kcsc-opensearch/src/main/resources/application-dev.properties +++ /dev/null @@ -1,3 +0,0 @@ -opensearch.uris=https://localhost:9200 -opensearch.username=admin -opensearch.password=kpbP7ECsaTlgvfmaGNBtORH75QHf7TmJhHZdW7Z7 \ No newline at end of file diff --git a/kcsc-opensearch/src/main/resources/application-prod.properties b/kcsc-opensearch/src/main/resources/application-prod.properties deleted file mode 100644 index 8f4c3c1..0000000 --- a/kcsc-opensearch/src/main/resources/application-prod.properties +++ /dev/null @@ -1,3 +0,0 @@ -opensearch.uris=https://kcsc.dbnt.co.kr:9200 -opensearch.username=admin -opensearch.password=kpbP7ECsaTlgvfmaGNBtORH75QHf7TmJhHZdW7Z7 \ No newline at end of file diff --git a/kcsc-opensearch/src/main/resources/application.properties b/kcsc-opensearch/src/main/resources/application.properties index 0a755b0..dd21969 100644 --- a/kcsc-opensearch/src/main/resources/application.properties +++ b/kcsc-opensearch/src/main/resources/application.properties @@ -1,6 +1,10 @@ spring.application.name=kcsc-opensearch server.port=8090 +opensearch.uris=https://localhost:9200 +opensearch.username=admin +opensearch.password=kpbP7ECsaTlgvfmaGNBtORH75QHf7TmJhHZdW7Z7 + spring.datasource-kcsc.driverClassName=org.postgresql.Driver spring.datasource-kcsc.jdbcUrl=jdbc:postgresql://118.219.150.34:50503/kcsc spring.datasource-kcsc.username=dbnt0031 From 242940d65323f034e2ad25de269c6663d55a4ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Tue, 16 Apr 2024 17:52:29 +0900 Subject: [PATCH 15/50] =?UTF-8?q?=EA=B4=80=EB=A0=A8=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8,=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/css/page.css | 28 +++++++++++-------- .../pages/admin/board/AdminPostMgtEdit.jsx | 1 - .../pages/admin/board/AdminPostMgtList.jsx | 25 ++++++++++++++--- .../pages/admin/board/EgovAdminBoardEdit.jsx | 5 +--- .../src/pages/admin/boards/List.jsx | 2 -- .../src/pages/admin/config/AboutSiteMgt.jsx | 2 -- .../config/aboutSiteMgt/AboutSiteModal.jsx | 6 +++- .../admin/boards/AdminBoardsController.java | 4 +-- .../boards/service/AdminBoardsService.java | 22 +++++++-------- .../admin/config/AdminConfigController.java | 1 - .../mybatisMapper/AdminBoardsMapper.xml | 5 ++++ 11 files changed, 60 insertions(+), 41 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/css/page.css b/egovframe-template-simple-react-contribution/src/css/page.css index 29a13cb..16e70b4 100644 --- a/egovframe-template-simple-react-contribution/src/css/page.css +++ b/egovframe-template-simple-react-contribution/src/css/page.css @@ -86,7 +86,7 @@ .P_MAIN .banner_bot > div.b2 > div {background: url(css/images/ico_bn02.png) no-repeat center 60px;} .P_MAIN .banner_bot > div.b3 > div {background: url(css/images/ico_bn03.png) no-repeat center 60px;} .P_MAIN .banner_bot > div.b4 > div {background: url(css/images/ico_bn04.png) no-repeat center 60px;} - + /* 오늘의 행사 */ .BRD001 .head > span:nth-child(1) {width: 150px;} @@ -141,16 +141,16 @@ .BRD005 .result .list_item > div:nth-child(4) {width: 120px;} .BRD005 .result .list_item > div:nth-child(5) {width: 100px;} - /* 게시판생성 관리 */ - .BRD006 .head > span:nth-child(1) {width: 70px;} + /* 게시판 관리 */ + .BRD006 .head > span:nth-child(1) {width: 75px;} .BRD006 .head > span:nth-child(3) {width: 160px;} .BRD006 .head > span:nth-child(4) {width: 168px;} - .BRD006 .head > span:nth-child(5) {width: 140px;} + .BRD006 .head > span:nth-child(5) {width: 70px;} .BRD006 .head > span:nth-child(6) {width: 140px;} - .BRD006 .result .list_item > div:nth-child(1) {width: 70px;} + .BRD006 .result .list_item > div:nth-child(1) {width: 75px;} .BRD006 .result .list_item > div:nth-child(3) {width: 160px;} .BRD006 .result .list_item > div:nth-child(4) {width: 168px;} - .BRD006 .result .list_item > div:nth-child(5) {width: 140px;} + .BRD006 .result .list_item > div:nth-child(5) {width: 70px;} .BRD006 .result .list_item > div:nth-child(6) {width: 140px;} /* 사이트관리 > 사용자관리 > 사용자목록 */ @@ -254,13 +254,17 @@ .PDS_LIST .tit_5 {margin-top: 42px;} .PDS_LIST .board_list {margin-top: 50px;} .BRD007 .head > span:nth-child(1) {width: 70px;} - .BRD007 .head > span:nth-child(3) {width: 90px;} - .BRD007 .head > span:nth-child(4) {width: 90px;} - .BRD007 .head > span:nth-child(5) {width: 120px;} + .BRD007 .head > span:nth-child(3) {width: 160px;} + .BRD007 .head > span:nth-child(4) {width: 120px;} + .BRD007 .head > span:nth-child(5) {width: 70px;} + .BRD007 .head > span:nth-child(6) {width: 120px;} + .BRD007 .head > span:nth-child(7) {width: 140px;} .BRD007 .result .list_item > div:nth-child(1) {width: 70px;} - .BRD007 .result .list_item > div:nth-child(3) {width: 90px;} - .BRD007 .result .list_item > div:nth-child(4) {width: 90px;} - .BRD007 .result .list_item > div:nth-child(5) {width: 120px;} + .BRD007 .result .list_item > div:nth-child(3) {width: 160px;} + .BRD007 .result .list_item > div:nth-child(4) {width: 120px;} + .BRD007 .result .list_item > div:nth-child(5) {width: 70px;} + .BRD007 .result .list_item > div:nth-child(6) {width: 120px;} + .BRD007 .result .list_item > div:nth-child(7) {width: 140px;} .PDS_REG .pds_desc_edit {margin: 14px 0 30px 0;} diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx index c12a9a8..985c38c 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx @@ -131,7 +131,6 @@ function AdminPostMgtEdit({props, reloadFunction}) { }, (resp) => { if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { - alert("삭제되었습니다.") reloadFunction(); } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { console.log("토큰 갱신중.") 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 be33693..1c0fbaf 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 @@ -14,6 +14,7 @@ import AdminPostMgtEdit from "./AdminPostMgtEdit"; import Modal from "react-bootstrap/Modal"; import {format} from "date-fns"; import {Form} from "react-bootstrap"; +const fileIconPath = require('../../../css/images/ico_file.png'); function AdminPostMgtList(props) { console.group("EgovAdminPostList"); @@ -44,7 +45,7 @@ function AdminPostMgtList(props) { console.groupCollapsed("EgovAdminPostList.retrieveList()"); const retrieveListURL = '/admin/boards/post-list' + params; - + const requestOptions = { method: "GET", headers: { @@ -58,21 +59,37 @@ function AdminPostMgtList(props) { (resp) => { setPaginationInfo(resp.result.paginationInfo); setCategoryList(resp.result.categoryList); + console.log("@@@ resultCnt : " + resp.result.resultCnt); let mutListTag = []; setListTag([]); + resp.result.fixedList.forEach(function (item) { + const finalModifiedDate = item?.lastChgDt ? item?.lastChgDt : item?.frstCrtDt; + const formattedDate = finalModifiedDate ? format(finalModifiedDate, "yyyy-MM-dd HH:mm") : ""; + mutListTag.push( +
+
공지
+
{item?.bbsContTitle}
+
{item?.frstCrtId}
+
{formattedDate}
+
{item?.bbsReadCnt}
+
{item?.fileGrpId && File Icon}
+
+
+ ); + }); resp.result.postList.forEach(function (item, index) { const finalModifiedDate = item?.lastChgDt ? item?.lastChgDt : item?.frstCrtDt; const formattedDate = finalModifiedDate ? format(finalModifiedDate, "yyyy-MM-dd HH:mm") : ""; mutListTag.push(
-
{item?.bbsContSeq}
+
{resp.result.resultCnt - (resp.result.paginationInfo.pageIndex -1) * resp.result.paginationInfo.rowCnt - index}
{item?.bbsContTitle}
{item?.frstCrtId}
{formattedDate}
{item?.bbsReadCnt}
-
{item?.fileGrpId}
+
{item?.fileGrpId && File Icon}
); @@ -159,7 +176,7 @@ function AdminPostMgtList(props) { {/* */} {/* */} -
+
번호 제목 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 dea18ac..8bf595d 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 @@ -122,7 +122,6 @@ function EgovAdminBoardEdit({props, reloadFunction}) { }, (resp) => { if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { - alert("삭제되었습니다.") reloadFunction(); } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { console.log("토큰 갱신중.") @@ -179,7 +178,6 @@ function EgovAdminBoardEdit({props, reloadFunction}) {
필수
- {bbsTypeList.map((item) => ( ))} @@ -226,7 +224,7 @@ function EgovAdminBoardEdit({props, reloadFunction}) {
필수
- + {roleList.map((item) => ( ))} @@ -237,7 +235,6 @@ function EgovAdminBoardEdit({props, reloadFunction}) {
필수
- {roleList.map((item) => ( ))} 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 27d39a3..f025c4e 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 @@ -58,7 +58,6 @@ function EgovAdminBoardList(props) { mutListTag.push(
-
{item.bbsId}
{item.bbsTitle}
{item.frstCrtId}
@@ -122,7 +121,6 @@ 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 e641012..bc47159 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 @@ -51,7 +51,6 @@ function StandardCodeMgt(props) { mutListTag.push(
-
{item.siteTitle}
{item.siteUrl}
이미지 window.open(e.target.src)}/>
@@ -148,7 +147,6 @@ function StandardCodeMgt(props) { {/* */}
- 사이트명 URL 배너이미지 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 index bc94b97..7e187de 100644 --- 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 @@ -243,7 +243,11 @@ function AboutSiteModal({props, reloadFunction}) {
필수
+ defaultValue={props?.siteOrder} onChange={(e) => { + const inputValue = e.target.value; + const numericValue = inputValue.replace(/\D/g, ''); + e.target.value = numericValue; + }}/>
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 dcb9a54..66389f3 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,7 +130,7 @@ public class AdminBoardsController extends BaseController { if (user == null) { resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); } else { - String result = adminBoardsService.deleteBoard(bbs, user.getId()); + String result = adminBoardsService.deleteBoard(bbs); if (result == null) { resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); } else if (result.equals("notFind")) { @@ -256,7 +256,7 @@ public class AdminBoardsController extends BaseController { resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); } else { contents.setIpAddress(ClientUtils.getRemoteIP(request)); - String result = adminBoardsService.deletePost(contents, user.getId()); + String result = adminBoardsService.deletePost(contents); if (result == null) { resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); } else if (result.equals("notFind")) { 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 c65a8c8..1a60c3f 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 @@ -57,23 +57,25 @@ public class AdminBoardsService extends EgovAbstractServiceImpl { } @Transactional - public String deleteBoard(TnBbs bbs, String userId) { + public String deleteBoard(TnBbs bbs) { TnBbs savedBoard = tnBbsRepository.findById(bbs.getBbsSeq()).orElse(null); if (savedBoard == null) { return "notFind"; } else { - savedBoard.setUseYn("N"); - savedBoard.setLastChgDt(LocalDateTime.now()); - savedBoard.setLastChgId(userId); - tnBbsRepository.save(savedBoard); + tnBbsRepository.deleteById(bbs.getBbsSeq()); return null; } } public Map selectPostList(TnBbsContents params) { Map resultMap = new HashMap<>(); - resultMap.put("resultCnt", String.valueOf(adminBoardsMapper.selectPostListCnt(params))); + + params.setFixedYn("N"); resultMap.put("postList", adminBoardsMapper.selectPostList(params)); + resultMap.put("resultCnt", String.valueOf(adminBoardsMapper.selectPostListCnt(params))); + + params.setFixedYn("Y"); + resultMap.put("fixedList", adminBoardsMapper.selectPostList(params)); return resultMap; } @@ -158,16 +160,12 @@ public class AdminBoardsService extends EgovAbstractServiceImpl { } @Transactional - public String deletePost(TnBbsContents contents, String userId) { + public String deletePost(TnBbsContents contents) { TnBbsContents savedPost = tnBbsContentsRepository.findById(contents.getBbsContSeq()).orElse(null); if (savedPost == null) { return "notFind"; } else { - savedPost.setIpAddress(contents.getIpAddress()); - savedPost.setUseYn("N"); - savedPost.setLastChgDt(LocalDateTime.now()); - savedPost.setLastChgId(userId); - tnBbsContentsRepository.save(savedPost); + tnBbsContentsRepository.deleteById(contents.getBbsContSeq()); return null; } } 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 833b460..57e4cb2 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 @@ -532,7 +532,6 @@ public class AdminConfigController extends BaseController { }) @RequestMapping(method = RequestMethod.GET, value = "/get-site-image") public void getSiteImage(HttpServletResponse response, @RequestParam String fileGrpId) throws Exception { - System.out.println("@@@ in : "); List dbImgList = fileService.findByFileGrpId(fileGrpId); String realFile = dbImgList.get(0).getFilePath(); String fileNm = dbImgList.get(0).getFileNewName(); diff --git a/kcsc-back-end/src/main/resources/mybatisMapper/AdminBoardsMapper.xml b/kcsc-back-end/src/main/resources/mybatisMapper/AdminBoardsMapper.xml index a65e26c..c61ac04 100644 --- a/kcsc-back-end/src/main/resources/mybatisMapper/AdminBoardsMapper.xml +++ b/kcsc-back-end/src/main/resources/mybatisMapper/AdminBoardsMapper.xml @@ -30,7 +30,9 @@ from tn_bbs_contents order by bbs_cont_seq desc + limit #{rowCnt} offset #{firstIndex} + + + \ No newline at end of file From fcb5ed5a4297c1aefd0e8b606e3bff4f011b1b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Fri, 19 Apr 2024 17:45:34 +0900 Subject: [PATCH 17/50] =?UTF-8?q?=EB=88=84=EB=9D=BD=20=EC=86=8C=EC=8A=A4?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/security/SecurityConfig.java | 57 ++++++++++--------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java index d77ea7b..8bfaa68 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/SecurityConfig.java @@ -61,39 +61,42 @@ public class SecurityConfig { // 인증 예외 List private String[] AUTH_WHITELIST = { - "/", - "/login", - "/auth/login", - "/auth/accessTokenRefresh", // jwt accessToken 갱신 - "/auth/join",//회원가입 - "/auth/findId", // id 찾기 - "/auth/findPw", // pw 찾기 + "/", + "/login", + "/auth/login", + "/auth/accessTokenRefresh", // jwt accessToken 갱신 + "/auth/join",//회원가입 + "/auth/findId", // id 찾기 + "/auth/findPw", // pw 찾기 - "/cmm/main/**.do", // 메인페이지 - "/cmm/fms/FileDown.do", //파일 다운로드 - "/file/download", //파일 다운로드 - "/file/standardCode-download", //파일 다운로드 - "/cmm/fms/getImage.do", //갤러리 이미지보기 + "/cmm/main/**.do", // 메인페이지 + "/cmm/fms/FileDown.do", //파일 다운로드 + "/file/download", //파일 다운로드 + "/file/standardCode-download", //파일 다운로드 + "/cmm/fms/getImage.do", //갤러리 이미지보기 - "/cop/bbs/selectUserBBSMasterInfAPI.do", //게시판 마스터 상세 조회 - "/cop/bbs/selectBoardListAPI.do", //게시판 목록조회 - "/cop/bbs/selectBoardArticleAPI.do", //게시물 상세조회 + "/cop/bbs/selectUserBBSMasterInfAPI.do", //게시판 마스터 상세 조회 + "/cop/bbs/selectBoardListAPI.do", //게시판 목록조회 + "/cop/bbs/selectBoardArticleAPI.do", //게시물 상세조회 - /* swagger v2 */ - "/v2/api-docs", - "/swagger-resources", - "/swagger-resources/**", - "/swagger-ui.html", - "/swagger-ui/**", + /* swagger v2 */ + "/v2/api-docs", + "/swagger-resources", + "/swagger-resources/**", + "/swagger-ui.html", + "/swagger-ui/**", - /* 기준코드 조회 */ - "/standardCode/**", + /* 기준코드 조회 */ + "/standardCode/**", - /* 통합검색 요청 */ - "/search/doc", + /* 통합검색 요청 */ + "/search/doc", - /* 관련사이트 이미지 조회 */ - "/admin/config/get-site-image/**" + /* 관련사이트 이미지 조회 */ + "/admin/config/get-site-image/**", + + /*권한별 메뉴 호출*/ + "/leftNav/menu" }; private static final String[] ORIGINS_WHITELIST = { "http://localhost:3000", From c7c34f6354b3040396579bd51c48520f14cab6db Mon Sep 17 00:00:00 2001 From: "Lim\\jun" Date: Mon, 22 Apr 2024 11:59:39 +0900 Subject: [PATCH 18/50] =?UTF-8?q?=EA=B4=80=EB=A0=A8=EC=8B=B8=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/css/page.css | 46 +++++++++---------- .../src/pages/admin/config/AboutSiteMgt.jsx | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/css/page.css b/egovframe-template-simple-react-contribution/src/css/page.css index 16e70b4..eb59d13 100644 --- a/egovframe-template-simple-react-contribution/src/css/page.css +++ b/egovframe-template-simple-react-contribution/src/css/page.css @@ -142,16 +142,16 @@ .BRD005 .result .list_item > div:nth-child(5) {width: 100px;} /* 게시판 관리 */ - .BRD006 .head > span:nth-child(1) {width: 75px;} + .BRD006 .head > span:nth-child(1) {width: 160px; text-align: left;} .BRD006 .head > span:nth-child(3) {width: 160px;} - .BRD006 .head > span:nth-child(4) {width: 168px;} + .BRD006 .head > span:nth-child(4) {width: 70px;} .BRD006 .head > span:nth-child(5) {width: 70px;} - .BRD006 .head > span:nth-child(6) {width: 140px;} - .BRD006 .result .list_item > div:nth-child(1) {width: 75px;} + .BRD006 .head > span:nth-child(6) {width: 120px;} + .BRD006 .result .list_item > div:nth-child(1) {width: 160px; text-align: left;} .BRD006 .result .list_item > div:nth-child(3) {width: 160px;} - .BRD006 .result .list_item > div:nth-child(4) {width: 168px;} + .BRD006 .result .list_item > div:nth-child(4) {width: 70px;} .BRD006 .result .list_item > div:nth-child(5) {width: 70px;} - .BRD006 .result .list_item > div:nth-child(6) {width: 140px;} + .BRD006 .result .list_item > div:nth-child(6) {width: 120px;} /* 사이트관리 > 사용자관리 > 사용자목록 */ .userList .head > span:nth-child(1) {width: 60px;} @@ -435,20 +435,20 @@ .bookmark:hover{cursor: pointer} .errorText{color:white; background-color: red; font-size: x-small; vertical-align: bottom; padding: 0 10px;} -/*기준코드 뷰어*/ -.titleCheckBox ~ p {display: inline} -.errorCnt{display: inline; color:red;} -.errorText{display: inline; cursor: pointer} -.detailInfoDiv > div > input {margin-right: 5px;} -.docInfoTitle{white-space: nowrap;} -.yearInfo{font-size: 9px} -.yearInfoActive{color: #0d6efd} -.docInfoBtn{--bs-btn-padding-y: 0.1rem;--bs-btn-padding-x: 0.25rem;--bs-btn-font-size: 0.7rem; filter: grayscale(100%);} -.docInfoActive{filter: grayscale(0%);} -.modalYearInfo{font-size: 9px} -.modalYearInfoActive{color: #0d6efd} -.modalDocInfoBtn{--bs-btn-padding-y: 0.1rem;--bs-btn-padding-x: 0.25rem;--bs-btn-font-size: 0.7rem; filter: grayscale(100%);} -.modalDocInfoActive{filter: grayscale(0%);} -.docInfoRow > div{--bs-gutter-x: 0.5rem;} -.bookmarkModalHeader{--bs-modal-title-line-height:1;} -.optionBtn{--bs-btn-padding-y: 0.1rem;--bs-btn-padding-x: 0.25rem;--bs-btn-font-size: 0.7rem; margin-right: 7px;} \ No newline at end of file + /*기준코드 뷰어*/ + .titleCheckBox ~ p {display: inline} + .errorCnt{display: inline; color:red;} + .errorText{display: inline; cursor: pointer} + .detailInfoDiv > div > input {margin-right: 5px;} + .docInfoTitle{white-space: nowrap;} + .yearInfo{font-size: 9px} + .yearInfoActive{color: #0d6efd} + .docInfoBtn{--bs-btn-padding-y: 0.1rem;--bs-btn-padding-x: 0.25rem;--bs-btn-font-size: 0.7rem; filter: grayscale(100%);} + .docInfoActive{filter: grayscale(0%);} + .modalYearInfo{font-size: 9px} + .modalYearInfoActive{color: #0d6efd} + .modalDocInfoBtn{--bs-btn-padding-y: 0.1rem;--bs-btn-padding-x: 0.25rem;--bs-btn-font-size: 0.7rem; filter: grayscale(100%);} + .modalDocInfoActive{filter: grayscale(0%);} + .docInfoRow > div{--bs-gutter-x: 0.5rem;} + .bookmarkModalHeader{--bs-modal-title-line-height:1;} + .optionBtn{--bs-btn-padding-y: 0.1rem;--bs-btn-padding-x: 0.25rem;--bs-btn-font-size: 0.7rem; margin-right: 7px;} 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 bc47159..89ce3ba 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 @@ -53,7 +53,7 @@ function StandardCodeMgt(props) {
{item.siteTitle}
{item.siteUrl}
-
이미지 window.open(e.target.src)}/>
+
이미지 window.open(e.target.src)} width={"150"}/>
{item.siteOrder}
{item.useYn}
From d31b147935d69ec7a06994f9f0e072075c5229ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Mon, 22 Apr 2024 14:24:02 +0900 Subject: [PATCH 19/50] =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EC=84=A4=EC=A0=95=20=EB=B0=A9=EC=8B=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD.=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=20=EB=AA=A9=EB=A1=9D=20=ED=98=B8=EC=B6=9C=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/users/UserInfoModal.jsx | 3 ++- .../com/dbnt/kcscbackend/admin/config/entity/TcMenu.java | 2 +- .../admin/config/service/AdminConfigService.java | 4 ++-- .../kcscbackend/admin/leftNav/LeftNavController.java | 5 ++++- .../dbnt/kcscbackend/config/jwt/EgovJwtTokenUtil.java | 9 --------- .../kcscbackend/config/jwt/JwtAuthenticationFilter.java | 4 ---- .../src/main/resources/mybatisMapper/TcMenuMapper.xml | 5 +---- 7 files changed, 10 insertions(+), 22 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/users/UserInfoModal.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/users/UserInfoModal.jsx index 2d54780..2623395 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/users/UserInfoModal.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/users/UserInfoModal.jsx @@ -139,7 +139,8 @@ function UserInfoModal({savedInfo, reloadFunction}){ 사용자 권한 - + {/**/} + diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/entity/TcMenu.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/entity/TcMenu.java index d910167..4db653f 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/entity/TcMenu.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/entity/TcMenu.java @@ -64,7 +64,7 @@ public class TcMenu { private String menuAuth; @Transient - private List roleList; + private String role; @Transient private List childList; 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 dad96f7..d212daa 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 @@ -163,10 +163,10 @@ public class AdminConfigService extends EgovAbstractServiceImpl { } - public List selectMenuListToRole(String menuTypeCd, List roleList){ + public List selectMenuListToRole(String menuTypeCd, String role){ TcMenu params = new TcMenu(); params.setMenuTypeCd(menuTypeCd); - params.setRoleList(roleList); + params.setRole(role); return menuMapper.selectMenuListToRole(params); } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/leftNav/LeftNavController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/leftNav/LeftNavController.java index 50ef3d3..92785fe 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/leftNav/LeftNavController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/leftNav/LeftNavController.java @@ -3,6 +3,7 @@ package com.dbnt.kcscbackend.admin.leftNav; import com.dbnt.kcscbackend.admin.config.entity.TcMenu; import com.dbnt.kcscbackend.admin.config.service.AdminConfigService; +import com.dbnt.kcscbackend.admin.users.service.AdminUsersService; import com.dbnt.kcscbackend.auth.entity.LoginVO; import com.dbnt.kcscbackend.config.common.ResultVO; import io.swagger.v3.oas.annotations.tags.Tag; @@ -22,6 +23,7 @@ import java.util.*; public class LeftNavController { private final AdminConfigService adminConfigService; + private final AdminUsersService adminUsersService; @RequestMapping(method = RequestMethod.GET, value = "/menu") public ResultVO getMenu( @@ -29,7 +31,8 @@ public class LeftNavController { @RequestParam(value="menuType", required = true) String menuTypeCd ){ ResultVO resultVO = new ResultVO(); - List menuList = adminConfigService.selectMenuListToRole(menuTypeCd, Arrays.asList(user.getUserRole().split(","))); + String userRole = adminUsersService.selectUserInfo(user.getUserSeq()).getUserRole(); + List menuList = adminConfigService.selectMenuListToRole(menuTypeCd, userRole); Map groupMap = new LinkedHashMap<>(); for(TcMenu menu: menuList){ groupMap.put(menu.getMenuGroup(), menu.getGroupTitle()); diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/EgovJwtTokenUtil.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/EgovJwtTokenUtil.java index 84ee52f..6e168f7 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/EgovJwtTokenUtil.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/EgovJwtTokenUtil.java @@ -70,14 +70,6 @@ public class EgovJwtTokenUtil implements Serializable{ Claims claims = getClaimFromToken(token); return claims.get("userSe").toString(); } - public String getUserRoleFromToken(String token) { - Claims claims = getClaimFromToken(token); - return claims.get("userRole").toString(); - } - public String getInfoFromToken(String type, String token) { - Claims claims = getClaimFromToken(token); - return claims.get(type).toString(); - } public Claims getClaimFromToken(String token) { return getAllClaimsFromToken(token); } @@ -101,7 +93,6 @@ public class EgovJwtTokenUtil implements Serializable{ claims.put("id", loginVO.getUserId()); claims.put("remoteAddr", remoteAddr); claims.put("userSe", loginVO.getUserSe()); - claims.put("userRole", loginVO.getUserRole()); claims.put("type", "Authorization"); log.debug("===>>> secret = "+SECRET_KEY); diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/JwtAuthenticationFilter.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/JwtAuthenticationFilter.java index 54db30c..83cc8bd 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/JwtAuthenticationFilter.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/JwtAuthenticationFilter.java @@ -70,10 +70,6 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { loginVO.setUserSeq(Integer.parseInt(jwtTokenUtil.getUserSeqFromToken(jwtToken))); loginVO.setId(id); loginVO.setUserSe(jwtTokenUtil.getUserSeFromToken(jwtToken)); - loginVO.setUserRole(jwtTokenUtil.getUserRoleFromToken(jwtToken)); -// loginVO.setUniqId( jwtTokenUtil.getInfoFromToken("uniqId",jwtToken) ); -// loginVO.setOrgnztId( jwtTokenUtil.getInfoFromToken("orgnztId",jwtToken) ); -// loginVO.setName( jwtTokenUtil.getInfoFromToken("name",jwtToken) ); UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(loginVO, null, Arrays.asList(new SimpleGrantedAuthority("ROLE_USER")) diff --git a/kcsc-back-end/src/main/resources/mybatisMapper/TcMenuMapper.xml b/kcsc-back-end/src/main/resources/mybatisMapper/TcMenuMapper.xml index 10f07ee..351a07d 100644 --- a/kcsc-back-end/src/main/resources/mybatisMapper/TcMenuMapper.xml +++ b/kcsc-back-end/src/main/resources/mybatisMapper/TcMenuMapper.xml @@ -51,10 +51,7 @@ inner join ( select menu_id , string_agg(role_id, ',') as role_cd from tb_menu_role - where role_id in - - #{role} - + where role_id = #{role} group by menu_id ) b on a.menu_id = b.menu_id inner join tc_menu c on a.menu_group = c.menu_id From 150310ebf333eb6810da6f9d395a5a1b750f3ba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Tue, 23 Apr 2024 18:00:38 +0900 Subject: [PATCH 20/50] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=EB=B2=A1=EC=97=94=EB=93=9C=20=ED=99=95=EC=9D=B8=20?= =?UTF-8?q?=EC=A0=88=EC=B0=A8=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/leftmenu/EgovLeftNavAdmin.jsx | 14 ++--- .../admin/committee/ProgressStatus/Edit.jsx | 2 +- .../src/pages/admin/config/AboutSiteMgt.jsx | 2 +- .../pages/admin/config/CommitteeCodeMgt.jsx | 4 +- .../CommitteeCodeRegistrationPopup.jsx | 2 +- .../config/aboutSiteMgt/AboutSiteModal.jsx | 4 +- .../admin/config/baseCode/ChildCodeDiv.jsx | 6 +-- .../admin/config/baseCode/ParentCodeDiv.jsx | 6 +-- .../committee/AdminCommitteeController.java | 19 +------ .../admin/config/AdminConfigController.java | 54 +++++++++---------- ...nConfigService.java => ConfigService.java} | 3 +- .../admin/leftNav/LeftNavController.java | 12 ++--- .../admin/users/AdminUsersController.java | 12 ++--- ...minUsersService.java => UsersService.java} | 3 +- .../auth/EgovLoginApiController.java | 5 +- .../service/impl/EgovLoginServiceImpl.java | 1 + .../config/common/AuthCheckInterceptor.java | 41 ++++++++++++++ .../config/security/WebMvcConfig.java | 15 ++++++ 18 files changed, 124 insertions(+), 81 deletions(-) rename kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/service/{AdminConfigService.java => ConfigService.java} (98%) rename kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/service/{AdminUsersService.java => UsersService.java} (93%) create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/common/AuthCheckInterceptor.java diff --git a/egovframe-template-simple-react-contribution/src/components/leftmenu/EgovLeftNavAdmin.jsx b/egovframe-template-simple-react-contribution/src/components/leftmenu/EgovLeftNavAdmin.jsx index 56ef0b9..0459419 100644 --- a/egovframe-template-simple-react-contribution/src/components/leftmenu/EgovLeftNavAdmin.jsx +++ b/egovframe-template-simple-react-contribution/src/components/leftmenu/EgovLeftNavAdmin.jsx @@ -20,19 +20,19 @@ function EgovLeftNavAdmin(props) { let activeKey; if (activeFolder === "config") { - activeKey = "0"; + activeKey = 0; } else if (activeFolder === "users") { - activeKey = "1"; + activeKey = 1; } else if (activeFolder === "boards") { - activeKey = "2"; + activeKey = 2; } else if (activeFolder === "standards") { - activeKey = "3"; + activeKey = 3; } else if (activeFolder === "contents") { - activeKey = "4"; + activeKey = 4; } else if (activeFolder === "committee") { - activeKey = "5"; + activeKey = 5; } else if (activeFolder === "logs") { - activeKey = "6"; + activeKey = 6; } // else { // activeKey = "7"; diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/committee/ProgressStatus/Edit.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/committee/ProgressStatus/Edit.jsx index 1cc4804..de58317 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/committee/ProgressStatus/Edit.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/committee/ProgressStatus/Edit.jsx @@ -224,7 +224,7 @@ function ProgressStatusEdit(props) { const getList = (orgSearchCondition) => { - EgovNet.requestFetch(`/admin/config/committee-code-management?paramCodeGroup=${orgSearchCondition.paramCodeGroup}¶mCodeLevel=${orgSearchCondition.paramCodeLevel}`, + EgovNet.requestFetch(`/admin/config/committee-code-mgt?paramCodeGroup=${orgSearchCondition.paramCodeGroup}¶mCodeLevel=${orgSearchCondition.paramCodeLevel}`, requestOptions, function (resp) { const myIndex = Number(String(orgSearchCondition.paramCodeLevel).replace('LV_','')) - 1; 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 89ce3ba..cd3d062 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 @@ -27,7 +27,7 @@ function StandardCodeMgt(props) { handleClose(); console.groupCollapsed("AdminPartnerSiteList.retrieveList()"); - const retrieveListURL = '/admin/config/partner-site-list'; + const retrieveListURL = '/admin/config/about-site-mgt/list'; const requestOptions = { method: "GET", diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/config/CommitteeCodeMgt.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/config/CommitteeCodeMgt.jsx index c989b44..ef564cf 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/config/CommitteeCodeMgt.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/config/CommitteeCodeMgt.jsx @@ -111,7 +111,7 @@ function CommitteeCodeMgt(props) { const getList = (searchCondition) => { - EgovNet.requestFetch(`/admin/config/committee-code-management?paramCodeGroup=${searchCondition.paramCodeGroup}¶mCodeLevel=${searchCondition.paramCodeLevel}`, + EgovNet.requestFetch(`/admin/config/committee-code-mgt?paramCodeGroup=${searchCondition.paramCodeGroup}¶mCodeLevel=${searchCondition.paramCodeLevel}`, requestOptions, function (resp) { if( searchCondition.paramCodeLevel === 'LV_01' ) { @@ -163,7 +163,7 @@ function CommitteeCodeMgt(props) { const requestTask = () => { - EgovNet.requestFetch(`/admin/config/committee-code-management/${deleteItem.orgId}`, + EgovNet.requestFetch(`/admin/config/committee-code-mgt/${deleteItem.orgId}`, requestOptions, function (resp) { let forChangeObject = {...searchCondition, paramCodeGroup, paramCodeLevel}; diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/config/CommitteeCodeMgt/CommitteeCodeRegistrationPopup.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/config/CommitteeCodeMgt/CommitteeCodeRegistrationPopup.jsx index 7422b46..6b15293 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/config/CommitteeCodeMgt/CommitteeCodeRegistrationPopup.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/config/CommitteeCodeMgt/CommitteeCodeRegistrationPopup.jsx @@ -95,7 +95,7 @@ function CommitteeCodeRegistrationPopup(props) { if( props.createOrModifyCondition.mode === CODE.MODE_MODIFY ) { appendRequestURL = `/${props.createOrModifyCondition.target.orgId}`; } - const requestURL = "/admin/config/committee-code-management" + appendRequestURL; + const requestURL = "/admin/config/committee-code-mgt" + appendRequestURL; EgovNet.requestFetch(requestURL, requestOptions, function (resp) { 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 index 7e187de..b8df330 100644 --- 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 @@ -69,7 +69,7 @@ function AboutSiteModal({props, reloadFunction}) { formData.append('fileGrpId', props.fileGrpId); } EgovNet.requestFetch( - '/admin/config/partner-site-mgt', + '/admin/config/about-site-mgt', { method: "PUT", body: formData @@ -90,7 +90,7 @@ function AboutSiteModal({props, reloadFunction}) { function deletePartnerSite(partnerSite){ if(window.confirm("삭제하시겠습니까?")) { EgovNet.requestFetch( - '/admin/config/partner-site-mgt', + '/admin/config/about-site-mgt', { method: "DELETE", headers: { diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/config/baseCode/ChildCodeDiv.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/config/baseCode/ChildCodeDiv.jsx index 150d5ec..e86edcb 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/config/baseCode/ChildCodeDiv.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/config/baseCode/ChildCodeDiv.jsx @@ -20,7 +20,7 @@ function ChildCodeDiv({}, ref){ setCodeItemRow([]); setGrpCd(parentCd) EgovNet.requestFetch( - '/admin/config/code-item?grpCd='+parentCd, + '/admin/config/base-code-mgt/code-item?grpCd='+parentCd, { method: "GET" }, @@ -54,7 +54,7 @@ function ChildCodeDiv({}, ref){ alert("코드와 코드명을 입력해주세요.") }else{ EgovNet.requestFetch( - '/admin/config/code-item', + '/admin/config/base-code-mgt/code-item', { method: "POST", headers: { @@ -99,7 +99,7 @@ function ChildCodeDiv({}, ref){ useYn: action==="modify"?'Y':'N' } EgovNet.requestFetch( - '/admin/config/code-item', + '/admin/config/base-code-mgt/code-item', { method: "PUT", headers: { diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/config/baseCode/ParentCodeDiv.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/config/baseCode/ParentCodeDiv.jsx index 8d1e5de..47cb746 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/config/baseCode/ParentCodeDiv.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/config/baseCode/ParentCodeDiv.jsx @@ -14,7 +14,7 @@ function ParentCodeDiv({getCodeItem}){ const getCodeGrp = useCallback(()=>{ EgovNet.requestFetch( - '/admin/config/code-grp', + '/admin/config/base-code-mgt/code-grp', { method: "GET" }, @@ -62,7 +62,7 @@ function ParentCodeDiv({getCodeItem}){ alert("코드 그룹을 입력해주세요.") }else{ EgovNet.requestFetch( - '/admin/config/code-grp', + '/admin/config/base-code-mgt/code-grp', { method: "POST", headers: { @@ -102,7 +102,7 @@ function ParentCodeDiv({getCodeItem}){ useYn: action==="modify"?'Y':'N' } EgovNet.requestFetch( - '/admin/config/code-grp', + '/admin/config/base-code-mgt/code-grp', { method: "PUT", headers: { diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/AdminCommitteeController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/AdminCommitteeController.java index 5aac4b0..82c0a8c 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/AdminCommitteeController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/AdminCommitteeController.java @@ -1,38 +1,23 @@ package com.dbnt.kcscbackend.admin.committee; import com.dbnt.kcscbackend.admin.committee.service.AdminCommitteeProgressStatusService; -import com.dbnt.kcscbackend.admin.config.entity.TcMenu; -import com.dbnt.kcscbackend.admin.config.entity.TnPartnerSite; -import com.dbnt.kcscbackend.admin.config.model.CreateCommitteeCodeManagementVO; -import com.dbnt.kcscbackend.admin.config.model.SetCommitteeCodeManagementVO; -import com.dbnt.kcscbackend.admin.config.service.AdminCommitteeCodeManagementService; -import com.dbnt.kcscbackend.admin.config.service.AdminConfigService; +import com.dbnt.kcscbackend.admin.config.service.ConfigService; import com.dbnt.kcscbackend.auth.entity.LoginVO; -import com.dbnt.kcscbackend.commonCode.entity.TcCodeGrp; -import com.dbnt.kcscbackend.commonCode.entity.TcCodeItem; import com.dbnt.kcscbackend.commonCode.service.CommonCodeService; import com.dbnt.kcscbackend.config.common.BaseController; import com.dbnt.kcscbackend.config.common.ResponseCode; import com.dbnt.kcscbackend.config.common.ResultVO; -import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; -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.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; @RestController @RequiredArgsConstructor @@ -40,7 +25,7 @@ import java.util.Map; @Tag(name="AdminCommitteeController", description = "사이트관리 위원회관리 메뉴 컨트롤러") public class AdminCommitteeController extends BaseController { - private final AdminConfigService adminConfigService; + private final ConfigService configService; private final CommonCodeService commonCodeService; @Resource(name = "adminCommitteeProgressStatusService") 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 57e4cb2..b610897 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 @@ -7,7 +7,7 @@ import com.dbnt.kcscbackend.admin.config.model.SetCommitteeCodeManagementVO; import com.dbnt.kcscbackend.admin.config.service.AdminCommitteeCodeManagementService; import com.dbnt.kcscbackend.commonCode.entity.TcCodeGrp; import com.dbnt.kcscbackend.commonCode.entity.TcCodeItem; -import com.dbnt.kcscbackend.admin.config.service.AdminConfigService; +import com.dbnt.kcscbackend.admin.config.service.ConfigService; import com.dbnt.kcscbackend.auth.entity.LoginVO; import com.dbnt.kcscbackend.commonCode.service.CommonCodeService; import com.dbnt.kcscbackend.config.common.BaseController; @@ -47,7 +47,7 @@ import java.util.Map; @Tag(name="AdminConfigController", description = "사이트관리 환결설정 메뉴 컨트롤러") public class AdminConfigController extends BaseController { - private final AdminConfigService adminConfigService; + private final ConfigService configService; private final CommonCodeService commonCodeService; private final FileService fileService; @@ -63,11 +63,11 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.GET, value = "/code-grp") + @RequestMapping(method = RequestMethod.GET, value = "/base-code-mgt/code-grp") public ResultVO getCodeGrp() throws Exception{ ResultVO resultVO = new ResultVO(); Map resultMap = new HashMap<>(); - resultMap.put("codeGrpList", adminConfigService.selectCodeGrpList()); + resultMap.put("codeGrpList", configService.selectCodeGrpList()); resultVO.setResult(resultMap); return resultVO; } @@ -82,7 +82,7 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "303", description = "만료된 토큰"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.POST, value = "/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.POST, value = "/base-code-mgt/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO addCodeGrp(@RequestBody TcCodeGrp codeGrp, @AuthenticationPrincipal LoginVO user) throws Exception{ ResultVO resultVO = new ResultVO(); if(user == null){ @@ -98,7 +98,7 @@ public class AdminConfigController extends BaseController { codeGrp.setFrstCrtDt(LocalDateTime.now()); codeGrp.setFrstCrtId(user.getId()); codeGrp.setUseYn("Y"); - String result = adminConfigService.addCodeGrp(codeGrp); + String result = configService.addCodeGrp(codeGrp); if(result.equals("isSaved")){ resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); resultVO.setResultMessage("중복되는 코드그룹이 있습니다."); @@ -120,7 +120,7 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "303", description = "만료된 토큰"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.PUT, value = "/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.PUT, value = "/base-code-mgt/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO modifyCodeGrp(@RequestBody TcCodeGrp codeGrp, @AuthenticationPrincipal LoginVO user) throws Exception{ ResultVO resultVO = new ResultVO(); if(user == null){ @@ -135,7 +135,7 @@ public class AdminConfigController extends BaseController { }else{ codeGrp.setLastChgDt(LocalDateTime.now()); codeGrp.setLastChgId(user.getId()); - String result = adminConfigService.modifyCodeGrp(codeGrp); + String result = configService.modifyCodeGrp(codeGrp); if(result.equals("modified")){ resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); }else{ @@ -155,11 +155,11 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.GET, value = "/code-item") + @RequestMapping(method = RequestMethod.GET, value = "/base-code-mgt/code-item") public ResultVO getCodeItem(String grpCd) throws Exception{ ResultVO resultVO = new ResultVO(); Map resultMap = new HashMap<>(); - resultMap.put("codeItemList", adminConfigService.selectCodeItemList(grpCd)); + resultMap.put("codeItemList", configService.selectCodeItemList(grpCd)); resultVO.setResult(resultMap); return resultVO; } @@ -174,7 +174,7 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "303", description = "만료된 토큰"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.POST, value = "/code-item", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.POST, value = "/base-code-mgt/code-item", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO addCodeItem(@RequestBody TcCodeItem codeItem, @AuthenticationPrincipal LoginVO user) throws Exception{ ResultVO resultVO = new ResultVO(); if(user == null){ @@ -190,7 +190,7 @@ public class AdminConfigController extends BaseController { codeItem.setFrstCrtDt(LocalDateTime.now()); codeItem.setFrstCrtId(user.getId()); codeItem.setUseYn("Y"); - String result = adminConfigService.addCodeItem(codeItem); + String result = configService.addCodeItem(codeItem); if(result.equals("isSaved")){ resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); resultVO.setResultMessage("중복되는 코드가 있습니다."); @@ -212,7 +212,7 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "303", description = "만료된 토큰"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.PUT, value = "/code-item", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.PUT, value = "/base-code-mgt/code-item", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO modifyCodeItem(@RequestBody TcCodeItem codeItem, @AuthenticationPrincipal LoginVO user) throws Exception{ ResultVO resultVO = new ResultVO(); if(user == null){ @@ -227,7 +227,7 @@ public class AdminConfigController extends BaseController { }else{ codeItem.setLastChgDt(LocalDateTime.now()); codeItem.setLastChgId(user.getId()); - String result = adminConfigService.modifyCodeItem(codeItem); + String result = configService.modifyCodeItem(codeItem); if(result.equals("modified")){ resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); }else{ @@ -251,7 +251,7 @@ public class AdminConfigController extends BaseController { public ResultVO getMenuMgt(){ ResultVO resultVO = new ResultVO(); Map resultMap = new HashMap<>(); - resultMap.put("menuList", adminConfigService.selectMenuList()); + resultMap.put("menuList", configService.selectMenuList()); resultVO.setResult(resultMap); return resultVO; } @@ -284,7 +284,7 @@ public class AdminConfigController extends BaseController { resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); } else { - adminConfigService.saveMenu(menu, user.getId()); + configService.saveMenu(menu, user.getId()); resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); } } @@ -310,7 +310,7 @@ public class AdminConfigController extends BaseController { resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); } else { - String result = adminConfigService.deleteMenu(menu.getMenuId(), user.getId()); + String result = configService.deleteMenu(menu.getMenuId(), user.getId()); if(result==null){ resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); }else if(result.equals("notFind")){ @@ -335,7 +335,7 @@ public class AdminConfigController extends BaseController { public ResultVO getMenuAuthMgt(){ ResultVO resultVO = new ResultVO(); Map resultMap = new HashMap<>(); - resultMap.put("menuList", adminConfigService.selectMenuAuthList()); + resultMap.put("menuList", configService.selectMenuAuthList()); resultMap.put("roleList", commonCodeService.selectCodeItemList("ROLE")); resultVO.setResult(resultMap); return resultVO; @@ -360,7 +360,7 @@ public class AdminConfigController extends BaseController { resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); } else { - adminConfigService.editMenuAuth(menu); + configService.editMenuAuth(menu); resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); } } @@ -377,7 +377,7 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "303", description = "만료된 토큰"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @GetMapping(value = "/committee-code-management") + @GetMapping(value = "/committee-code-mgt") public ResultVO getCommitteeCodeManagement( @AuthenticationPrincipal LoginVO user, HttpServletRequest request, @@ -424,7 +424,7 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "303", description = "만료된 토큰"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @PostMapping(value = "/committee-code-management") + @PostMapping(value = "/committee-code-mgt") public ResultVO createCommitteeCodeManagement( @AuthenticationPrincipal LoginVO user, HttpServletRequest request, @@ -464,7 +464,7 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "200", description = "등록 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @DeleteMapping(value = "/committee-code-management/{orgId}") + @DeleteMapping(value = "/committee-code-mgt/{orgId}") public ResultVO deleteSchedule ( @AuthenticationPrincipal LoginVO user, @@ -506,11 +506,11 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.GET, value = "/partner-site-list", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.GET, value = "/about-site-mgt/list", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO getPartnerSiteList() throws Exception { ResultVO resultVO = new ResultVO(); Map resultMap = new HashMap<>(); - List tnPartnerSite = adminConfigService.selectPartnerSiteList(); + List tnPartnerSite = configService.selectPartnerSiteList(); for (TnPartnerSite partnerSite : tnPartnerSite) { String fileGrpId = partnerSite.getFileGrpId(); String filePath = fileService.findByFileGrpId(fileGrpId).get(0).getFilePath(); @@ -598,7 +598,7 @@ public class AdminConfigController extends BaseController { } else { System.out.println("@@@ bbs.getBbsSeq() : " + tnPartnerSite.getSiteSeq()); System.out.println("@@@ file : " + file); - adminConfigService.savePartnerSite(tnPartnerSite, request, user, file); + configService.savePartnerSite(tnPartnerSite, request, user, file); resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); } } @@ -620,7 +620,7 @@ public class AdminConfigController extends BaseController { if (user == null) { resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); } else { - String result = adminConfigService.deletePartnerSite(tnPartnerSite, user.getId()); + String result = configService.deletePartnerSite(tnPartnerSite, user.getId()); if (result == null) { resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); } else if (result.equals("notFind")) { @@ -640,7 +640,7 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "200", description = "등록 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"), }) - @PutMapping(value = "/committee-code-management/{orgId}") + @PutMapping(value = "/committee-code-mgt/{orgId}") public ResultVO setCommitteeCodeManagement( HttpServletRequest request, @AuthenticationPrincipal LoginVO loginVO, 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/ConfigService.java similarity index 98% rename from kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/service/AdminConfigService.java rename to kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/service/ConfigService.java index d212daa..7a04060 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/ConfigService.java @@ -1,6 +1,5 @@ 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; @@ -31,7 +30,7 @@ import java.util.Optional; @Service @RequiredArgsConstructor -public class AdminConfigService extends EgovAbstractServiceImpl { +public class ConfigService extends EgovAbstractServiceImpl { private final TcCodeGrpRepository codeGrpRepository; private final TcCodeItemRepository codeItemRepository; diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/leftNav/LeftNavController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/leftNav/LeftNavController.java index 92785fe..ff89e0b 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/leftNav/LeftNavController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/leftNav/LeftNavController.java @@ -2,8 +2,8 @@ package com.dbnt.kcscbackend.admin.leftNav; import com.dbnt.kcscbackend.admin.config.entity.TcMenu; -import com.dbnt.kcscbackend.admin.config.service.AdminConfigService; -import com.dbnt.kcscbackend.admin.users.service.AdminUsersService; +import com.dbnt.kcscbackend.admin.config.service.ConfigService; +import com.dbnt.kcscbackend.admin.users.service.UsersService; import com.dbnt.kcscbackend.auth.entity.LoginVO; import com.dbnt.kcscbackend.config.common.ResultVO; import io.swagger.v3.oas.annotations.tags.Tag; @@ -22,8 +22,8 @@ import java.util.*; @Tag(name="LeftNavController", description = "leftNav 컨트롤러") public class LeftNavController { - private final AdminConfigService adminConfigService; - private final AdminUsersService adminUsersService; + private final ConfigService configService; + private final UsersService usersService; @RequestMapping(method = RequestMethod.GET, value = "/menu") public ResultVO getMenu( @@ -31,8 +31,8 @@ public class LeftNavController { @RequestParam(value="menuType", required = true) String menuTypeCd ){ ResultVO resultVO = new ResultVO(); - String userRole = adminUsersService.selectUserInfo(user.getUserSeq()).getUserRole(); - List menuList = adminConfigService.selectMenuListToRole(menuTypeCd, userRole); + String userRole = usersService.selectUserInfo(user.getUserSeq()).getUserRole(); + List menuList = configService.selectMenuListToRole(menuTypeCd, userRole); Map groupMap = new LinkedHashMap<>(); for(TcMenu menu: menuList){ groupMap.put(menu.getMenuGroup(), menu.getGroupTitle()); diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/AdminUsersController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/AdminUsersController.java index 83f6025..2494522 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/AdminUsersController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/AdminUsersController.java @@ -2,7 +2,7 @@ package com.dbnt.kcscbackend.admin.users; import com.dbnt.kcscbackend.admin.logs.service.AdminLogsService; -import com.dbnt.kcscbackend.admin.users.service.AdminUsersService; +import com.dbnt.kcscbackend.admin.users.service.UsersService; import com.dbnt.kcscbackend.auth.entity.LoginVO; import com.dbnt.kcscbackend.auth.entity.UserInfo; import com.dbnt.kcscbackend.commonCode.service.CommonCodeService; @@ -35,7 +35,7 @@ import java.util.Map; @Tag(name="AdminConfigController", description = "사이트관리 사용자관리 메뉴 컨트롤러") public class AdminUsersController extends BaseController { - private final AdminUsersService adminUsersService; + private final UsersService usersService; private final AdminLogsService adminLogsService; private final CommonCodeService commonCodeService; @@ -55,8 +55,8 @@ public class AdminUsersController extends BaseController { Map resultMap = new HashMap<>(); params.setQueryInfo(); resultMap.put("userSeOption", commonCodeService.selectCodeItemList("ACC_TYPE")); - resultMap.put("userList", adminUsersService.selectUserList(params)); - params.setContentCnt(adminUsersService.selectUserListCnt(params)); + resultMap.put("userList", usersService.selectUserList(params)); + params.setContentCnt(usersService.selectUserListCnt(params)); params.setPaginationInfo(); resultMap.put("paginationInfo", params); resultVO.setResult(resultMap); @@ -107,7 +107,7 @@ public class AdminUsersController extends BaseController { resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); resultVO.setResultMessage("비밀번호 확인이 잘못 입력되었습니다."); }else { - Integer insertResult = adminUsersService.updateUserInfo(info, user.getId()); + Integer insertResult = usersService.updateUserInfo(info, user.getId()); if(insertResult!=null){ if(insertResult==-1){ resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); @@ -140,7 +140,7 @@ public class AdminUsersController extends BaseController { public ResultVO deleteUserInfo(@RequestBody UserInfo info, HttpServletRequest request, @AuthenticationPrincipal LoginVO user) throws Exception{ adminLogsService.insertPrivacyLog(user.getId(), ClientUtils.getRemoteIP(request), "PRV_DLT", info.getUserId()); ResultVO resultVO = new ResultVO(); - adminUsersService.deleteUserInfo(info.getUserSeq()); + usersService.deleteUserInfo(info.getUserSeq()); resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); return resultVO; } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/service/AdminUsersService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/service/UsersService.java similarity index 93% rename from kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/service/AdminUsersService.java rename to kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/service/UsersService.java index ed940e4..11a5479 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/service/AdminUsersService.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/service/UsersService.java @@ -1,6 +1,5 @@ package com.dbnt.kcscbackend.admin.users.service; -import com.dbnt.kcscbackend.admin.logs.repository.PrivacyLogsRepository; import com.dbnt.kcscbackend.admin.users.mapper.AdminUsersMapper; import com.dbnt.kcscbackend.auth.entity.UserInfo; import com.dbnt.kcscbackend.auth.repository.UserInfoRepository; @@ -14,7 +13,7 @@ import java.util.List; @Service @RequiredArgsConstructor -public class AdminUsersService extends EgovAbstractServiceImpl { +public class UsersService extends EgovAbstractServiceImpl { private final UserInfoRepository userInfoRepository; private final AdminUsersMapper usersMapper; diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/auth/EgovLoginApiController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/auth/EgovLoginApiController.java index 3ffe480..7d6cef7 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/auth/EgovLoginApiController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/auth/EgovLoginApiController.java @@ -1,5 +1,6 @@ package com.dbnt.kcscbackend.auth; +import com.dbnt.kcscbackend.admin.users.service.UsersService; import com.dbnt.kcscbackend.auth.entity.UserInfo; import com.dbnt.kcscbackend.auth.service.EgovLoginService; import com.dbnt.kcscbackend.config.common.BaseController; @@ -64,6 +65,7 @@ public class EgovLoginApiController extends BaseController { private final EgovJwtTokenUtil egovJwtTokenUtil; private final RefreshTokenRepository refreshTokenRepository; + private final UsersService usersService; @Operation( summary = "회원가입", @@ -179,7 +181,8 @@ public class EgovLoginApiController extends BaseController { if (refreshToken != null){ String serverToken = refreshToken.getRefreshToken(); if(egovJwtTokenUtil.getUserSeFromToken(clientToken).equals(egovJwtTokenUtil.getUserSeFromToken(serverToken))){ - return egovJwtTokenUtil.getUserIdFromToken(clientToken).equals("admin"); + UserInfo user = usersService.selectUserInfo(Integer.parseInt(egovJwtTokenUtil.getUserSeqFromToken(clientToken))); + return user.getUserRole().equals("ROLE_001")||user.getUserRole().equals("ROLE_002")||user.getUserRole().equals("ROLE_003"); } } return false; diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/auth/service/impl/EgovLoginServiceImpl.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/auth/service/impl/EgovLoginServiceImpl.java index 1f07ead..832a746 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/auth/service/impl/EgovLoginServiceImpl.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/auth/service/impl/EgovLoginServiceImpl.java @@ -64,6 +64,7 @@ public class EgovLoginServiceImpl extends EgovAbstractServiceImpl implements Ego info.setEmail(loginVO.getEmail()); info.setPhoneNum(loginVO.getPhoneNum()); info.setUserSe("ACC_TP02"); + info.setUserRole("ROLE_005"); info.setStatus("USE_ST"); info.setFrstCrtDt(LocalDateTime.now()); userInfoRepository.save(info); diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/common/AuthCheckInterceptor.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/common/AuthCheckInterceptor.java new file mode 100644 index 0000000..41350bf --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/common/AuthCheckInterceptor.java @@ -0,0 +1,41 @@ +package com.dbnt.kcscbackend.config.common; + +import com.dbnt.kcscbackend.admin.config.entity.TcMenu; +import com.dbnt.kcscbackend.admin.config.service.ConfigService; +import com.dbnt.kcscbackend.admin.users.service.UsersService; +import com.dbnt.kcscbackend.auth.entity.LoginVO; +import lombok.RequiredArgsConstructor; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +@Component +@RequiredArgsConstructor +public class AuthCheckInterceptor implements HandlerInterceptor { + + private final UsersService usersService; + private final ConfigService configService; + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav) throws Exception { + /*관리자 메뉴 접근시 권한 체크*/ + String requestUri = request.getRequestURI(); + String userRole = usersService.selectUserInfo(((LoginVO)((UsernamePasswordAuthenticationToken)request.getUserPrincipal()).getPrincipal()).getUserSeq()).getUserRole(); + List menuList = configService.selectMenuListToRole("MNU_0000", userRole); + boolean requestFlag = false; + for(TcMenu menu: menuList){ + if(requestUri.contains(menu.getMenuUrl())){ + requestFlag = true; + break; + } + } + if(!requestFlag){ + response.sendRedirect("/"); + } + } +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/WebMvcConfig.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/WebMvcConfig.java index d45700d..a0491a0 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/WebMvcConfig.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/WebMvcConfig.java @@ -1,7 +1,10 @@ package com.dbnt.kcscbackend.config.security; +import com.dbnt.kcscbackend.config.common.AuthCheckInterceptor; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @@ -17,7 +20,19 @@ import java.util.List; * 2023/07/13 crlee 최초 생성 */ @Configuration +@RequiredArgsConstructor public class WebMvcConfig implements WebMvcConfigurer { + private final AuthCheckInterceptor authCheckInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry){ + /*관리자 메뉴 접근시 권한 체크*/ + registry.addInterceptor(authCheckInterceptor) + .addPathPatterns("/admin/**") + .excludePathPatterns( + "/admin/dashboard/**" + ); + } @Override public void addArgumentResolvers(List argumentResolvers) { argumentResolvers.add(new CustomAuthenticationPrincipalResolver()); From a4362f37833d80d2a313c4c23eaeb3e03fb8bd50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Wed, 24 Apr 2024 17:56:46 +0900 Subject: [PATCH 21/50] =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=82=AD=EC=A0=9C.=20=EA=B4=80=EB=A6=AC=EC=9E=90?= =?UTF-8?q?=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A0=91=EA=B7=BC=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=ED=99=95=EC=9D=B8=EC=9C=BC=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20URL=20=EC=88=98=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/constants/url.js | 7 +- .../pages/admin/board/AdminPostMgtEdit.jsx | 6 +- .../pages/admin/board/AdminPostMgtList.jsx | 2 +- .../pages/admin/board/EgovAdminBoardEdit.jsx | 6 +- .../src/pages/admin/boards/Keywords.jsx | 185 ------------------ .../src/pages/admin/boards/List.jsx | 2 +- .../src/pages/admin/config/AboutSiteMgt.jsx | 5 +- .../config/aboutSiteMgt/AboutSiteModal.jsx | 4 +- .../src/pages/admin/standards/ApiKeys.jsx | 6 +- .../src/pages/admin/users/List.jsx | 4 +- .../src/pages/admin/users/UserInfoModal.jsx | 4 +- .../src/routes/index.jsx | 5 +- .../admin/boards/AdminBoardsController.java | 16 +- .../admin/config/AdminConfigController.java | 6 +- .../standards/AdminStandardsController.java | 6 +- .../admin/users/AdminUsersController.java | 8 +- .../config/common/AuthCheckInterceptor.java | 10 +- .../resources/mybatisMapper/TcMenuMapper.xml | 4 +- 18 files changed, 50 insertions(+), 236 deletions(-) delete mode 100644 egovframe-template-simple-react-contribution/src/pages/admin/boards/Keywords.jsx diff --git a/egovframe-template-simple-react-contribution/src/constants/url.js b/egovframe-template-simple-react-contribution/src/constants/url.js index 22f6ce3..ddae056 100644 --- a/egovframe-template-simple-react-contribution/src/constants/url.js +++ b/egovframe-template-simple-react-contribution/src/constants/url.js @@ -84,16 +84,15 @@ const URL = { ADMIN_ABOUT_SITE : "/admin/config/about-site-mgt", // 사이트관리/환경설정/관련사이트 관리 // 관리자 - 사용자 현황 - ADMIN__USERS__LIST : "/admin/users/list", // 사용자 현황 + ADMIN__USERS__LIST : "/admin/users/mgt", // 사용자 현황 // 관리자 - 게시판 현황 - ADMIN__BOARDS__LIST : "/admin/boards/list", // 게시판 현황/게시판 관리 + ADMIN__BOARDS__LIST : "/admin/boards/mgt", // 게시판 현황/게시판 관리 ADMIN__BOARDS__POSTS : "/admin/boards/posts", // 게시판 현황/게시물 관리 - ADMIN__BOARDS__KEYWORDS : "/admin/boards/keywords", // 게시판 현황/키워드 관리 // 관리자 - 건설기준 관리 ADMIN__STANDARDS__REFERENCE_CODES : "/admin/standards/reference-codes", // 건설기준 관리/참조코드 조회 - ADMIN__STANDARDS__API_KYES : "/admin/standards/api-kyes", // 건설기준 관리/API KEY 관리 + ADMIN__STANDARDS__API_KYES : "/admin/standards/api-keys", // 건설기준 관리/API KEY 관리 ADMIN__STANDARDS__SIMILARITY_CHECK : "/admin/standards/standards/similarity-check", // 건설기준 관리/유사성 검사 ADMIN__STANDARDS__INFO_DISCLOSURE : "/admin/standards/info-disclosure", // 건설기준 관리/정보공개 관리 diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx index 985c38c..818025d 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx @@ -35,7 +35,7 @@ function AdminPostMgtEdit({props, reloadFunction}) { const [categoryList, setCategoryList] = useState([]); const retrieveList = useCallback(() => { - const retrieveListURL = '/admin/boards/get-category-and-file-list'; + const retrieveListURL = '/admin/boards/posts/get-category-and-file-list'; const requestOptions = { method: "POST", @@ -100,7 +100,7 @@ function AdminPostMgtEdit({props, reloadFunction}) { formData.append('bbsContSeq', props.bbsContSeq); } EgovNet.requestFetch( - '/admin/boards/post-mgt', + '/admin/boards/posts/post-mgt', { method: "PUT", body: formData @@ -121,7 +121,7 @@ function AdminPostMgtEdit({props, reloadFunction}) { function deletePost(post) { if (window.confirm("삭제하시겠습니까?")) { EgovNet.requestFetch( - '/admin/boards/post-mgt', + '/admin/boards/posts/post-mgt', { method: "DELETE", headers: { 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 1c0fbaf..d253fdc 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 @@ -44,7 +44,7 @@ function AdminPostMgtList(props) { const params = EgovNet.convParams(searchCondition); console.groupCollapsed("EgovAdminPostList.retrieveList()"); - const retrieveListURL = '/admin/boards/post-list' + params; + const retrieveListURL = '/admin/boards/posts/post-list' + params; const requestOptions = { method: "GET", 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 8bf595d..1d4bf1b 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 @@ -34,7 +34,7 @@ function EgovAdminBoardEdit({props, reloadFunction}) { const [roleList, setRoleList] = useState([]); const retrieveList = useCallback(() => { - const retrieveListURL = '/admin/boards/get-option-list'; + const retrieveListURL = '/admin/boards/mgt/get-option-list'; const requestOptions = { method: "GET", @@ -88,7 +88,7 @@ function EgovAdminBoardEdit({props, reloadFunction}) { info.bbsSeq = props.bbsSeq; } EgovNet.requestFetch( - '/admin/boards/board-mgt', + '/admin/boards/mgt/board-mgt', { method: "PUT", headers: { @@ -112,7 +112,7 @@ function EgovAdminBoardEdit({props, reloadFunction}) { function deleteBoard(bbs){ if(window.confirm("삭제하시겠습니까?")) { EgovNet.requestFetch( - '/admin/boards/board-mgt', + '/admin/boards/mgt/board-mgt', { method: "DELETE", headers: { 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 deleted file mode 100644 index c485536..0000000 --- a/egovframe-template-simple-react-contribution/src/pages/admin/boards/Keywords.jsx +++ /dev/null @@ -1,185 +0,0 @@ -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 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 ( -
-
- {/* */} -
-
    -
  • Home
  • -
  • 사이트관리
  • -
  • 게시판현황
  • -
  • 키워드 관리
  • -
-
- {/* */} - -
- {/* */} - - {/* */} - -
-
-

사이트관리

-
-

키워드 관리

- {/* */} - {/*
-
    -
  • - 검색유형선택 - -
  • -
  • - 검색어 - - { - wrdRef.current.value = e.target.value; - }} - /> - - -
  • -
  • - 등록 -
  • -
-
*/} - {/* */} - - {/* */} -
-
- 번호 - 아이디 - 제목 - 작성자 - 작성일 - 수정일 - -
-
- {listTag} -
-
- {/* */} - -
- {/* */} - {/* { - retrieveList({ ...searchCondition, pageIndex: passedPage, searchCnd: cndRef.current.value, searchWrd: wrdRef.current.value }) - }} />*/} - {/* */} -
- - {/* */} -
-
-
- - {modalBody} - -
- ); -} - -export default StandardCodeMgt; \ No newline at end of file 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 f025c4e..b9258da 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 @@ -32,7 +32,7 @@ function EgovAdminBoardList(props) { handleClose(); console.groupCollapsed("AdminBoardList.retrieveList()"); - const retrieveListURL = '/admin/boards/board-list'; + const retrieveListURL = '/admin/boards/mgt/board-list'; const requestOptions = { method: "GET", 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 cd3d062..725e5d9 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,10 +5,11 @@ 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 CODE from "constants/code"; import Modal from "react-bootstrap/Modal"; import AboutSiteModal from "./aboutSiteMgt/AboutSiteModal"; import {Image} from "react-bootstrap"; +import {SERVER_URL} from "config"; function StandardCodeMgt(props) { @@ -53,7 +54,7 @@ function StandardCodeMgt(props) {
{item.siteTitle}
{item.siteUrl}
-
이미지 window.open(e.target.src)} width={"150"}/>
+
이미지 window.open(e.target.src)} width={"150"}/>
{item.siteOrder}
{item.useYn}
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 index b8df330..e6d54be 100644 --- 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 @@ -69,7 +69,7 @@ function AboutSiteModal({props, reloadFunction}) { formData.append('fileGrpId', props.fileGrpId); } EgovNet.requestFetch( - '/admin/config/about-site-mgt', + '/admin/config/about-site-mgt/partner-site-mgt', { method: "PUT", body: formData @@ -90,7 +90,7 @@ function AboutSiteModal({props, reloadFunction}) { function deletePartnerSite(partnerSite){ if(window.confirm("삭제하시겠습니까?")) { EgovNet.requestFetch( - '/admin/config/about-site-mgt', + '/admin/config/about-site-mgt/partner-site-mgt', { method: "DELETE", headers: { diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/standards/ApiKeys.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/standards/ApiKeys.jsx index 3475d31..a75f909 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/standards/ApiKeys.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/standards/ApiKeys.jsx @@ -32,7 +32,7 @@ function ApiKeys(props) { const retrieveList = useCallback((srchCnd) => { // console.groupCollapsed("EgovAdminUsageList.retrieveList()"); - const retrieveListURL = '/admin/standards/apikey'; + const retrieveListURL = '/admin/standards/api-keys'; const requestOptions = { method: "POST", @@ -95,7 +95,7 @@ function ApiKeys(props) { const handleSwitchToggle = async (item) => { try { - const updateApiEndpoint = '/admin/standards/apiupdate'; + const updateApiEndpoint = '/admin/standards/api-keys/api-update'; const requestOptions = { method: 'POST', headers: { @@ -122,7 +122,7 @@ function ApiKeys(props) { const handleApiKeyChart = (item) => { try { - const updateApiEndpoint = '/admin/standards/apiDailyChart'; + const updateApiEndpoint = '/admin/standards/api-keys/api-daily-chart'; const requestOptions = { method: 'POST', headers: { diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/users/List.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/users/List.jsx index 39e9d00..e5402d4 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/users/List.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/users/List.jsx @@ -32,7 +32,7 @@ function List({}) { const retrieveList = useCallback((searchCondition) => { const params = EgovNet.convParams(searchCondition); EgovNet.requestFetch( - '/admin/users/list'+params, + '/admin/users/mgt/list'+params, { method: "GET" }, @@ -80,7 +80,7 @@ function List({}) { const removeUserInfo = useCallback((seq)=>{ if(window.confirm("삭제하시겠습니까?\n복구할 수 없습니다.")){ EgovNet.requestFetch( - '/admin/users/info', + '/admin/users/mgt/info', { method: "DELETE", headers: { diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/users/UserInfoModal.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/users/UserInfoModal.jsx index 2623395..5071d8e 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/users/UserInfoModal.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/users/UserInfoModal.jsx @@ -36,7 +36,7 @@ function UserInfoModal({savedInfo, reloadFunction}){ info.userRole = userRole.slice(0, -1) } EgovNet.requestFetch( - '/admin/users/info', + '/admin/users/mgt/info', { method: "PUT", headers: { @@ -59,7 +59,7 @@ function UserInfoModal({savedInfo, reloadFunction}){ function modalOpen(){ EgovNet.requestFetch( - '/admin/users/info?userId='+savedInfo?.userId, + '/admin/users/mgt/info?userId='+savedInfo?.userId, { method: "GET", headers: { diff --git a/egovframe-template-simple-react-contribution/src/routes/index.jsx b/egovframe-template-simple-react-contribution/src/routes/index.jsx index 10e53ce..c67ec6f 100644 --- a/egovframe-template-simple-react-contribution/src/routes/index.jsx +++ b/egovframe-template-simple-react-contribution/src/routes/index.jsx @@ -79,8 +79,7 @@ import AdminUsersList from 'pages/admin/users/List'; // 관리자 - 게시판 현황 import AdminBoardsList from 'pages/admin/boards/List'; // 관리자 - 게시판 현황/게시판 관리 -import AdminBoardsPosts from 'pages/admin/boards/Posts'; // 관리자 - 게시판 현황/게시물 관리 -import AdminBoardsKeywords from 'pages/admin/boards/Keywords'; // 관리자 - 게시판 현황/키워드 관리 +import AdminPostMgtList from "../pages/admin/board/AdminPostMgtList"; // 관리자 - 게시판 현황/게시물 관리 // 관리자 - 건설기준 관리 import AdminStandardsReferenceCodes from 'pages/admin/standards/ReferenceCodes'; // 관리자 - 건설기준 관리/참조코드 조회 @@ -121,7 +120,6 @@ 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줄) */} @@ -297,7 +295,6 @@ 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 66389f3..2ae995b 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 @@ -53,7 +53,7 @@ public class AdminBoardsController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.GET, value = "/board-list", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.GET, value = "/mgt/board-list", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO getBoardList() throws Exception { ResultVO resultVO = new ResultVO(); Map resultMap = new HashMap<>(); @@ -72,7 +72,7 @@ public class AdminBoardsController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.GET, value = "/get-option-list", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.GET, value = "/mgt/get-option-list", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO getOptionList() throws Exception { ResultVO resultVO = new ResultVO(); Map resultMap = new HashMap<>(); @@ -92,7 +92,7 @@ public class AdminBoardsController extends BaseController { @ApiResponse(responseCode = "200", description = "저장 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.PUT, value = "/board-mgt") + @RequestMapping(method = RequestMethod.PUT, value = "/mgt/board-mgt") public ResultVO saveBoardMgt(@RequestBody @Valid TnBbs bbs, Errors errors, @AuthenticationPrincipal LoginVO user) { ResultVO resultVO = new ResultVO(); if (user == null) { @@ -124,7 +124,7 @@ public class AdminBoardsController extends BaseController { @ApiResponse(responseCode = "200", description = "삭제 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.DELETE, value = "/board-mgt") + @RequestMapping(method = RequestMethod.DELETE, value = "/mgt/board-mgt") public ResultVO deleteBoardMgt(@RequestBody TnBbs bbs, @AuthenticationPrincipal LoginVO user) { ResultVO resultVO = new ResultVO(); if (user == null) { @@ -151,7 +151,7 @@ public class AdminBoardsController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.GET, value = "/post-list", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.GET, value = "/posts/post-list", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO getPostList(TnBbsContents params) throws Exception { ResultVO resultVO = new ResultVO(); params.setQueryInfo(); @@ -174,7 +174,7 @@ public class AdminBoardsController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.POST, value = "/get-category-and-file-list", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.POST, value = "/posts/get-category-and-file-list", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO getCategoryList(@RequestBody TnBbsContents tnBbsContents) throws Exception { ResultVO resultVO = new ResultVO(); Map resultMap = new HashMap<>(); @@ -210,7 +210,7 @@ public class AdminBoardsController extends BaseController { @ApiResponse(responseCode = "200", description = "저장 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.PUT, value = "/post-mgt") + @RequestMapping(method = RequestMethod.PUT, value = "/posts/post-mgt") public ResultVO savePostMgt( @Valid TnBbsContents contents, HttpServletRequest request, @@ -249,7 +249,7 @@ public class AdminBoardsController extends BaseController { @ApiResponse(responseCode = "200", description = "삭제 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.DELETE, value = "/post-mgt") + @RequestMapping(method = RequestMethod.DELETE, value = "/posts/post-mgt") public ResultVO deletePostMgt(@RequestBody TnBbsContents contents, HttpServletRequest request, @AuthenticationPrincipal LoginVO user) { ResultVO resultVO = new ResultVO(); if (user == null) { 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 b610897..e0f2970 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 @@ -530,7 +530,7 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "200", description = "저장 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.GET, value = "/get-site-image") + @RequestMapping(method = RequestMethod.GET, value = "/about-site-mgt/get-site-image") public void getSiteImage(HttpServletResponse response, @RequestParam String fileGrpId) throws Exception { List dbImgList = fileService.findByFileGrpId(fileGrpId); String realFile = dbImgList.get(0).getFilePath(); @@ -576,7 +576,7 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "200", description = "저장 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.PUT, value = "/partner-site-mgt") + @RequestMapping(method = RequestMethod.PUT, value = "/about-site-mgt/partner-site-mgt") public ResultVO savePartnerSite( @Valid TnPartnerSite tnPartnerSite, HttpServletRequest request, @@ -614,7 +614,7 @@ public class AdminConfigController extends BaseController { @ApiResponse(responseCode = "200", description = "삭제 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.DELETE, value = "/partner-site-mgt") + @RequestMapping(method = RequestMethod.DELETE, value = "/about-site-mgt/partner-site-mgt") public ResultVO removePartnerSite(@RequestBody TnPartnerSite tnPartnerSite, @AuthenticationPrincipal LoginVO user) { ResultVO resultVO = new ResultVO(); if (user == null) { diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/AdminStandardsController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/AdminStandardsController.java index d0dc80c..17402fa 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/AdminStandardsController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/AdminStandardsController.java @@ -38,7 +38,7 @@ public class AdminStandardsController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.POST, value = "/apikey", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.POST, value = "/api-keys", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO selectApiList(@RequestBody TnApiKey tnApiKey, @AuthenticationPrincipal LoginVO user) throws Exception { @@ -66,7 +66,7 @@ public class AdminStandardsController extends BaseController { @ApiResponse(responseCode = "303", description = "만료된 토큰"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.POST, value = "/apiupdate", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.POST, value = "/api-keys/api-update", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO modifyApi(@RequestBody TnApiKey tnApiKey, @AuthenticationPrincipal LoginVO user) throws Exception{ ResultVO resultVO = new ResultVO(); @@ -92,7 +92,7 @@ public class AdminStandardsController extends BaseController { @ApiResponse(responseCode = "303", description = "만료된 토큰"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.POST, value = "/apiDailyChart", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.POST, value = "/api-keys/api-daily-chart", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO ApiChart(@RequestBody Map dateRange, @AuthenticationPrincipal LoginVO user) throws Exception{ ResultVO resultVO = new ResultVO(); Map resultMap = new HashMap<>(); diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/AdminUsersController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/AdminUsersController.java index 2494522..51903ad 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/AdminUsersController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/AdminUsersController.java @@ -48,7 +48,7 @@ public class AdminUsersController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.GET, value = "/list") + @RequestMapping(method = RequestMethod.GET, value = "/mgt/list") public ResultVO getUserList(UserInfo params, HttpServletRequest request, @AuthenticationPrincipal LoginVO user) throws Exception{ adminLogsService.insertPrivacyLog(user.getId(), ClientUtils.getRemoteIP(request), "PRV_LIST", null); ResultVO resultVO = new ResultVO(); @@ -72,7 +72,7 @@ public class AdminUsersController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.GET, value = "/info") + @RequestMapping(method = RequestMethod.GET, value = "/mgt/info") public ResultVO getUserInfo(UserInfo params, HttpServletRequest request, @AuthenticationPrincipal LoginVO user) throws Exception{ adminLogsService.insertPrivacyLog(user.getId(), ClientUtils.getRemoteIP(request), "PRV_VIEW", params.getUserId()); ResultVO resultVO = new ResultVO(); @@ -91,7 +91,7 @@ public class AdminUsersController extends BaseController { @ApiResponse(responseCode = "200", description = "수정 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.PUT, value = "/info") + @RequestMapping(method = RequestMethod.PUT, value = "/mgt/info") public ResultVO modifyUserInfo(@RequestBody @Valid UserInfo info, Errors errors, HttpServletRequest request, @AuthenticationPrincipal LoginVO user) throws Exception{ adminLogsService.insertPrivacyLog(user.getId(), ClientUtils.getRemoteIP(request), "PRV_UPDT", info.getUserId()); ResultVO resultVO = new ResultVO(); @@ -136,7 +136,7 @@ public class AdminUsersController extends BaseController { @ApiResponse(responseCode = "200", description = "삭제 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.DELETE, value = "/info", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.DELETE, value = "/mgt/info", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO deleteUserInfo(@RequestBody UserInfo info, HttpServletRequest request, @AuthenticationPrincipal LoginVO user) throws Exception{ adminLogsService.insertPrivacyLog(user.getId(), ClientUtils.getRemoteIP(request), "PRV_DLT", info.getUserId()); ResultVO resultVO = new ResultVO(); diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/common/AuthCheckInterceptor.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/common/AuthCheckInterceptor.java index 41350bf..502f833 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/common/AuthCheckInterceptor.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/common/AuthCheckInterceptor.java @@ -5,6 +5,8 @@ import com.dbnt.kcscbackend.admin.config.service.ConfigService; import com.dbnt.kcscbackend.admin.users.service.UsersService; import com.dbnt.kcscbackend.auth.entity.LoginVO; import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; @@ -20,9 +22,10 @@ public class AuthCheckInterceptor implements HandlerInterceptor { private final UsersService usersService; private final ConfigService configService; + private final Logger log = LoggerFactory.getLogger(this.getClass().getSimpleName()); @Override - public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav) throws Exception { + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { /*관리자 메뉴 접근시 권한 체크*/ String requestUri = request.getRequestURI(); String userRole = usersService.selectUserInfo(((LoginVO)((UsernamePasswordAuthenticationToken)request.getUserPrincipal()).getPrincipal()).getUserSeq()).getUserRole(); @@ -34,8 +37,7 @@ public class AuthCheckInterceptor implements HandlerInterceptor { break; } } - if(!requestFlag){ - response.sendRedirect("/"); - } + log.info("requestFlag: "+requestFlag); + return requestFlag; } } diff --git a/kcsc-back-end/src/main/resources/mybatisMapper/TcMenuMapper.xml b/kcsc-back-end/src/main/resources/mybatisMapper/TcMenuMapper.xml index 351a07d..4639d22 100644 --- a/kcsc-back-end/src/main/resources/mybatisMapper/TcMenuMapper.xml +++ b/kcsc-back-end/src/main/resources/mybatisMapper/TcMenuMapper.xml @@ -37,7 +37,7 @@ group by menu_id ) b on a.menu_id = b.menu_id where a.use_yn = 'Y' - order by a.menu_id asc + order by a.menu_type_cd desc, a.menu_id asc \ No newline at end of file From 758b87d93ea3633a2f732ac478fb749ff2269835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Thu, 25 Apr 2024 09:47:53 +0900 Subject: [PATCH 22/50] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=ED=99=95=EC=9D=B8=20=EB=A1=9C=EC=A7=81=EC=97=90=20?= =?UTF-8?q?=EB=A7=9E=EC=B6=B0=20url=20=EC=88=98=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/contents/Survey.jsx | 4 ++-- .../src/pages/admin/contents/survey/QuestionModal.jsx | 4 ++-- .../src/pages/admin/contents/survey/SurveyModal.jsx | 4 ++-- .../src/pages/admin/logs/FileDownloadStatus.jsx | 2 +- .../src/pages/admin/logs/MenuAccessInfo.jsx | 2 +- .../src/pages/admin/logs/PrivacyLogs.jsx | 2 +- .../src/pages/admin/logs/UserConnections.jsx | 2 +- .../admin/contents/survey/AdminSurveyController.java | 2 +- .../dbnt/kcscbackend/admin/logs/AdminLogsController.java | 8 ++++---- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/contents/Survey.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/contents/Survey.jsx index 530d364..b72e1d4 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/contents/Survey.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/contents/Survey.jsx @@ -23,7 +23,7 @@ function Survey({}) { const retrieveList = useCallback(() => { handleClose() EgovNet.requestFetch( - '/admin/survey/list', + '/admin/contents/survey/list', { method: "GET" }, @@ -58,7 +58,7 @@ function Survey({}) { function editUseYn(svySeq){ EgovNet.requestFetch( - '/admin/survey/info-use-yn', + '/admin/contents/survey/info-use-yn', { method: "PUT", headers: { diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/QuestionModal.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/QuestionModal.jsx index e5af92b..f30cce7 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/QuestionModal.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/QuestionModal.jsx @@ -15,7 +15,7 @@ function QuestionModal({svySeq}){ function getSurveyQt(){ EgovNet.requestFetch( - '/admin/survey/info-qt?svySeq='+svySeq, + '/admin/contents/survey/info-qt?svySeq='+svySeq, { method: "GET" }, @@ -77,7 +77,7 @@ function QuestionModal({svySeq}){ function editSurveyQt(e){ EgovNet.requestFetch( - '/admin/survey/info-qt', + '/admin/contents/survey/info-qt', { method: "PUT", headers: { diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/SurveyModal.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/SurveyModal.jsx index 0234b73..906f540 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/SurveyModal.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/SurveyModal.jsx @@ -21,7 +21,7 @@ function SurveyModal({savedInfo, reloadFunction}){ e.preventDefault(); e.stopPropagation(); EgovNet.requestFetch( - '/admin/survey/info', + '/admin/contents/survey/info', { method: "PUT", headers: { @@ -44,7 +44,7 @@ function SurveyModal({savedInfo, reloadFunction}){ e.preventDefault(); e.stopPropagation(); EgovNet.requestFetch( - '/admin/survey/info', + '/admin/contents/survey/info', { method: "DELETE", headers: { diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/logs/FileDownloadStatus.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/logs/FileDownloadStatus.jsx index 2fe065b..70a3c57 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/logs/FileDownloadStatus.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/logs/FileDownloadStatus.jsx @@ -55,7 +55,7 @@ function FileConnections(props) { const retrieveList = useCallback((srchCnd) => { // console.groupCollapsed("EgovAdminUsageList.retrieveList()"); - const retrieveListURL = '/admin/logs/file'; + const retrieveListURL = '/admin/logs/file-download-status'; const requestOptions = { method: "POST", diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/logs/MenuAccessInfo.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/logs/MenuAccessInfo.jsx index 3a75376..a1a5ae6 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/logs/MenuAccessInfo.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/logs/MenuAccessInfo.jsx @@ -36,7 +36,7 @@ function MenuConnections(props) { const retrieveList = useCallback((srchCnd) => { // console.groupCollapsed("EgovAdminUsageList.retrieveList()"); - const retrieveListURL = '/admin/logs/menu'; + const retrieveListURL = '/admin/logs/menu-access-info'; const requestOptions = { method: "POST", diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/logs/PrivacyLogs.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/logs/PrivacyLogs.jsx index 1d633ef..48a1c40 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/logs/PrivacyLogs.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/logs/PrivacyLogs.jsx @@ -30,7 +30,7 @@ function PrivacyConnections(props) { const retrieveList = useCallback((srchCnd) => { // console.groupCollapsed("EgovAdminUsageList.retrieveList()"); - const retrieveListURL = '/admin/logs/privacy'; + const retrieveListURL = '/admin/logs/privacy-logs'; const requestOptions = { method: "POST", diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/logs/UserConnections.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/logs/UserConnections.jsx index bcb57c9..7f1d236 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/logs/UserConnections.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/logs/UserConnections.jsx @@ -35,7 +35,7 @@ function UserConnections(props) { const retrieveList = useCallback((srchCnd) => { // console.groupCollapsed("EgovAdminUsageList.retrieveList()"); - const retrieveListURL = '/admin/logs/user'; + const retrieveListURL = '/admin/logs/user-connections'; const requestOptions = { method: "POST", diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/AdminSurveyController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/AdminSurveyController.java index 280f10b..106b893 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/AdminSurveyController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/AdminSurveyController.java @@ -24,7 +24,7 @@ import java.util.Map; @RestController @RequiredArgsConstructor -@RequestMapping("/admin/survey") +@RequestMapping("/admin/contents/survey") public class AdminSurveyController { private final AdminSurveyService adminSurveyService; diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/logs/AdminLogsController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/logs/AdminLogsController.java index a1c5c36..a91bdb7 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/logs/AdminLogsController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/logs/AdminLogsController.java @@ -41,7 +41,7 @@ public class AdminLogsController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.POST, value = "/menu", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.POST, value = "/menu-access-info", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO MenuListCount(@RequestBody Map dateRange, @AuthenticationPrincipal LoginVO user) throws Exception { @@ -70,7 +70,7 @@ public class AdminLogsController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.POST, value = "/user", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.POST, value = "/user-connections", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO UserListCount(@RequestBody Map dateRange, @AuthenticationPrincipal LoginVO user) throws Exception { @@ -99,7 +99,7 @@ public class AdminLogsController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.POST, value = "/privacy", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.POST, value = "/privacy-logs", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO selectPrivacyLogsList(@RequestBody ThPrivacyLog thPrivacyLog, @AuthenticationPrincipal LoginVO user) throws Exception { @@ -127,7 +127,7 @@ public class AdminLogsController extends BaseController { @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @RequestMapping(method = RequestMethod.POST, value = "/file", consumes = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(method = RequestMethod.POST, value = "/file-download-status", consumes = MediaType.APPLICATION_JSON_VALUE) public ResultVO FileListCount(@RequestBody Map dateRange, @AuthenticationPrincipal LoginVO user) throws Exception { From 380cd52d2eb959a4e572f441a6d6fe1264b42f79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Thu, 25 Apr 2024 16:42:59 +0900 Subject: [PATCH 23/50] =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=9C=84=EC=9B=90=ED=9A=8C=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/users/List.jsx | 11 ++-- .../src/pages/admin/users/UserInfoModal.jsx | 55 +++++++++++++------ .../admin/users/AdminUsersController.java | 3 + .../admin/users/service/UsersService.java | 1 + .../kcscbackend/auth/entity/UserInfo.java | 4 ++ .../commonCode/entity/TnCmtOrg.java | 5 ++ .../repository/TnCmtOrgRepository.java | 2 + .../commonCode/service/CmtService.java | 37 +++++++++++++ .../mybatisMapper/AdminUsersMapper.xml | 5 +- 9 files changed, 99 insertions(+), 24 deletions(-) create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/service/CmtService.java diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/users/List.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/users/List.jsx index e5402d4..be26d13 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/users/List.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/users/List.jsx @@ -20,9 +20,7 @@ function List({}) { }); const [listTag, setListTag] = useState([]); - const [paginationInfo, setPaginationInfo] = useState({}); - const [show, setShow] = useState(false); const [modalBody, setModalBody] = useState(); @@ -42,13 +40,15 @@ function List({}) { setListTag([]); // 리스트 항목 구성 + const cmtList = resp.result.cmtList; resp.result.userList.forEach(function (item, index) { mutListTag.push(
- +
{item.userNm}
{item.email}
{item.phoneNum}
+
{item.cmtOrgNm}
{item.statusValue}
@@ -72,9 +72,9 @@ function List({}) { setSearchCondition({...searchCondition, pageIndex: passedPage}) }); - function userInfoModal(userInfo){ + function userInfoModal(userInfo, cmtList){ handleShow() - setModalBody() + setModalBody() } const removeUserInfo = useCallback((seq)=>{ @@ -151,6 +151,7 @@ function List({}) { 이름 이메일 연락처 + 위원회 상태 삭제
diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/users/UserInfoModal.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/users/UserInfoModal.jsx index 5071d8e..c741900 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/users/UserInfoModal.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/users/UserInfoModal.jsx @@ -1,4 +1,4 @@ -import React, {useCallback, useEffect, useState} from "react" +import React, {useEffect, useState} from "react" import Modal from "react-bootstrap/Modal"; import * as EgovNet from "api/egovFetch"; import Form from "react-bootstrap/Form"; @@ -6,11 +6,12 @@ import Row from "react-bootstrap/Row"; import Col from "react-bootstrap/Col"; import Button from "react-bootstrap/Button"; import SelectOption from "components/commonCode/SelectOption"; -import CheckBox from "components/commonCode/CheckBox"; import CODE from "../../../constants/code"; -function UserInfoModal({savedInfo, reloadFunction}){ - +function UserInfoModal({savedInfo, cmtList, reloadFunction}){ + const [selectedCmtList, setSelectedCmtList] = useState(cmtList); + const [cmtOrg, setCmtOrg] = useState({cmtSeq: savedInfo?.cmtOrg, cmtNm: savedInfo?.cmtOrgNm}); + function userInfoChange(e){ e.preventDefault(); e.stopPropagation(); @@ -23,18 +24,10 @@ function UserInfoModal({savedInfo, reloadFunction}){ userNm: form.userNm.value, email: form.email.value, phoneNum: form.phoneNum.value, - userRole: '', + userRole: form.userRole.value, + cmtOrg: form.cmtOrg.value, status: form.status.value, } - let userRole = ''; - form.userRole.forEach(function (input){ - if(input.checked){ - userRole += input.value+',' - } - }) - if(userRole){ - info.userRole = userRole.slice(0, -1) - } EgovNet.requestFetch( '/admin/users/mgt/info', { @@ -56,8 +49,19 @@ function UserInfoModal({savedInfo, reloadFunction}){ } ) } - - function modalOpen(){ + const changeSelectorOption = (e) => { + selectedCmtList.forEach(function (cmt){ + if(cmt.cmtSeq === Number(e.target.value)){ + setCmtOrg({cmtSeq: cmt.cmtSeq, cmtNm: cmt.cmtNm}); + if(cmt.childList.length === 0){ + setSelectedCmtList(cmtList); + }else{ + setSelectedCmtList(cmt.childList); + } + } + }) + } + /*function modalOpen(){ EgovNet.requestFetch( '/admin/users/mgt/info?userId='+savedInfo?.userId, { @@ -70,10 +74,10 @@ function UserInfoModal({savedInfo, reloadFunction}){ } ) - } + }*/ useEffect(() => { - modalOpen(); + /*modalOpen();*/ }, []); return ( @@ -143,6 +147,21 @@ function UserInfoModal({savedInfo, reloadFunction}){
+ + + 위원회 + + + + + + + {selectedCmtList.map((cmt) => ( + + ))} + + + 상태 diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/AdminUsersController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/AdminUsersController.java index 51903ad..4559ef6 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/AdminUsersController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/AdminUsersController.java @@ -5,6 +5,7 @@ import com.dbnt.kcscbackend.admin.logs.service.AdminLogsService; import com.dbnt.kcscbackend.admin.users.service.UsersService; import com.dbnt.kcscbackend.auth.entity.LoginVO; import com.dbnt.kcscbackend.auth.entity.UserInfo; +import com.dbnt.kcscbackend.commonCode.service.CmtService; import com.dbnt.kcscbackend.commonCode.service.CommonCodeService; import com.dbnt.kcscbackend.config.common.BaseController; import com.dbnt.kcscbackend.config.common.ResponseCode; @@ -38,6 +39,7 @@ public class AdminUsersController extends BaseController { private final UsersService usersService; private final AdminLogsService adminLogsService; private final CommonCodeService commonCodeService; + private final CmtService cmtService; @Operation( summary = "사용자 목록 조회", @@ -55,6 +57,7 @@ public class AdminUsersController extends BaseController { Map resultMap = new HashMap<>(); params.setQueryInfo(); resultMap.put("userSeOption", commonCodeService.selectCodeItemList("ACC_TYPE")); + resultMap.put("cmtList", cmtService.selectCmtOrgList()); resultMap.put("userList", usersService.selectUserList(params)); params.setContentCnt(usersService.selectUserListCnt(params)); params.setPaginationInfo(); diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/service/UsersService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/service/UsersService.java index 11a5479..d6f17f3 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/service/UsersService.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/users/service/UsersService.java @@ -51,6 +51,7 @@ public class UsersService extends EgovAbstractServiceImpl { savedInfo.setEmail(info.getEmail()); savedInfo.setPhoneNum(info.getPhoneNum()); savedInfo.setUserRole(info.getUserRole()); + savedInfo.setCmtOrg(info.getCmtOrg()); savedInfo.setStatus(info.getStatus()); savedInfo.setLastChgId(updateUser); savedInfo.setLastChgDt(LocalDateTime.now()); diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/auth/entity/UserInfo.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/auth/entity/UserInfo.java index 6696f90..65b99d3 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/auth/entity/UserInfo.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/auth/entity/UserInfo.java @@ -57,6 +57,8 @@ public class UserInfo extends BoardParams implements UserDetails{ private String phoneNum; @Column(name = "user_role") private String userRole; + @Column(name = "cmt_org") + private Integer cmtOrg; @Column(name = "status") private String status; @Column(name = "frst_crt_dt") @@ -72,6 +74,8 @@ public class UserInfo extends BoardParams implements UserDetails{ private String passwordChk; @Transient private String statusValue; + @Transient + private String cmtOrgNm; @Override @JsonIgnore diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/entity/TnCmtOrg.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/entity/TnCmtOrg.java index 8e83ee1..dc272f8 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/entity/TnCmtOrg.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/entity/TnCmtOrg.java @@ -8,6 +8,8 @@ import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.io.Serializable; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; @Getter @Setter @@ -57,6 +59,9 @@ public class TnCmtOrg { @Column(name = "old_seq") private Long oldSeq; + @Transient + private List childList = new ArrayList<>(); + @Embeddable @Data @NoArgsConstructor diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtOrgRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtOrgRepository.java index 11ced52..38d6990 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtOrgRepository.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtOrgRepository.java @@ -10,6 +10,8 @@ import java.util.List; import java.util.Map; public interface TnCmtOrgRepository extends JpaRepository { + + List findByUseYnOrderByCmtTypeAsc(String useYn); List findByUseYnAndUpCmtSeqOrderByCmtOrder(String useYn, Long upCmtSeq); TnCmtOrg findByUseYnAndCmtSeq(String useYn, Long cmtSeq); List findByUseYnAndUpCmtSeqAndCmtTypeOrderByCmtOrder(String useYn, Long upCmtSeq, String cmtType); diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/service/CmtService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/service/CmtService.java new file mode 100644 index 0000000..8cc0002 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/service/CmtService.java @@ -0,0 +1,37 @@ +package com.dbnt.kcscbackend.commonCode.service; + +import com.dbnt.kcscbackend.commonCode.entity.TnCmtOrg; +import com.dbnt.kcscbackend.commonCode.repository.TnCmtOrgRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class CmtService { + private final TnCmtOrgRepository tnCmtOrgRepository; + + public List selectCmtOrgList(){ + List cmtList = tnCmtOrgRepository.findByUseYnOrderByCmtTypeAsc("Y"); + List lv1List = new ArrayList<>(); + for(TnCmtOrg cmt: cmtList){ + if(cmt.getCmtType().equals("LV_01")){ + lv1List.add(cmt); + } + cmt.getChildList().addAll(findChildCmt(cmt, cmtList)); + } + return lv1List; + } + + private List findChildCmt(TnCmtOrg parent, List cmtList){ + List tempList = new ArrayList<>(); + for(TnCmtOrg cmt: cmtList){ + if(parent.getCmtSeq().equals(cmt.getUpCmtSeq())){ + tempList.add(cmt); + } + } + return tempList; + } +} diff --git a/kcsc-back-end/src/main/resources/mybatisMapper/AdminUsersMapper.xml b/kcsc-back-end/src/main/resources/mybatisMapper/AdminUsersMapper.xml index 73a369e..4530426 100644 --- a/kcsc-back-end/src/main/resources/mybatisMapper/AdminUsersMapper.xml +++ b/kcsc-back-end/src/main/resources/mybatisMapper/AdminUsersMapper.xml @@ -12,10 +12,13 @@ a.phone_num, a.user_role, a.status, - c.item_nm as status_value + c.item_nm as status_value, + a.cmt_org, + d.cmt_nm as cmt_org_nm from user_info a inner join tc_code_item b on a.user_se = b.item_cd inner join tc_code_item c on a.status = c.item_cd + left outer join tn_cmt_org d on a.cmt_org = d.cmt_seq order by user_seq desc limit #{rowCnt} offset #{firstIndex} From 16d0119ff1d0545009979a14cb34ab747b0bb34c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Thu, 25 Apr 2024 16:45:20 +0900 Subject: [PATCH 24/50] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20ID=20=EC=A4=91=EB=B3=B5=ED=99=95=EC=9D=B8,=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=EA=B2=80=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/admin/board/EgovAdminBoardEdit.jsx | 62 ++++++++++++++++++- .../admin/boards/AdminBoardsController.java | 19 ++++++ .../boards/repository/TnBbsRepository.java | 3 + .../boards/service/AdminBoardsService.java | 7 +++ 4 files changed, 89 insertions(+), 2 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 1d4bf1b..935c2ca 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 @@ -32,6 +32,7 @@ function EgovAdminBoardEdit({props, reloadFunction}) { const [bbsTypeList, setBbsTypeList] = useState([]); const [roleList, setRoleList] = useState([]); + const [duplicateYn, setDuplicateYn] = useState(""); const retrieveList = useCallback(() => { const retrieveListURL = '/admin/boards/mgt/get-option-list'; @@ -72,6 +73,20 @@ function EgovAdminBoardEdit({props, reloadFunction}) { function editBoard(e) { e.preventDefault(); e.stopPropagation(); + + if (modeInfo.mode === CODE.MODE_CREATE) { + if (duplicateYn === "") { + alert("중복확인을 해주세요."); + return; + } else if (duplicateYn === "Y") { + alert("중복된 아이디 입니다."); + return; + } else if (duplicateYn === "C") { + alert("중복확인을 다시 해주세요."); + return; + } + } + const form = e.target; const info = { bbsId: form.bbsId.value, @@ -103,7 +118,7 @@ function EgovAdminBoardEdit({props, reloadFunction}) { } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { console.log("토큰 갱신중.") } else { - alert(resp.result.resultMessage) + alert(resp.resultMessage); } } ) @@ -133,6 +148,44 @@ function EgovAdminBoardEdit({props, reloadFunction}) { } } + const handleInputChange = (e) => { + setDuplicateYn("C"); + }; + + const handleCheckDuplicate = () => { + const bbsId = document.querySelector('[name="bbsId"]').value; + if (!bbsId.trim()) { + alert("게시판 ID를 입력해주세요."); + return; + } + + const checkDuplicateURL = '/admin/boards/mgt/check-duplicate?bbsId=' + bbsId; + + const requestOptions = { + method: "GET", + headers: { + 'Content-type': 'application/json', + } + } + + EgovNet.requestFetch(checkDuplicateURL, + requestOptions, + (resp) => { + setDuplicateYn(resp.result.duplicateYn); + console.log("@@@ duplicateYn : " + JSON.stringify(resp.result.duplicateYn)); + if (resp.result.duplicateYn === "Y") { + alert("중복된 아이디 입니다."); + } + else if (resp.result.duplicateYn === "N") { + alert("사용 가능한 아이디 입니다."); + } + }, + function (resp) { + console.log("err response : ", resp); + } + ); + } + console.log("------------------------------EgovAdminBoardEdit [End]"); console.groupEnd("EgovAdminBoardEdit"); @@ -157,7 +210,12 @@ function EgovAdminBoardEdit({props, reloadFunction}) {
필수
+ defaultValue={props?.bbsId} readOnly={modeInfo.mode === CODE.MODE_MODIFY} onChange={handleInputChange}/> +
+
+ {modeInfo.mode !== CODE.MODE_MODIFY && ( + + )}
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 2ae995b..b851ff6 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 @@ -83,6 +83,25 @@ public class AdminBoardsController extends BaseController { return resultVO; } + @Operation( + summary = "게시판 ID 중복 확인", + description = "게시판 ID 중복 확인", + tags = {"AdminBoardsController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.GET, value = "/mgt/check-duplicate", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO checkDuplicate(String bbsId) throws Exception { + ResultVO resultVO = new ResultVO(); + Map resultMap = new HashMap<>(); + + resultMap.put("duplicateYn", adminBoardsService.checkDuplicate(bbsId)); + resultVO.setResult(resultMap); + return resultVO; + } + @Operation( summary = "게시판 저장", description = "게시판 저장", 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 b700de4..393b11d 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 @@ -4,9 +4,12 @@ import com.dbnt.kcscbackend.admin.boards.entity.TnBbs; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface TnBbsRepository extends JpaRepository { List findAllByOrderByBbsSeqDesc(); + Optional findByBbsId(String bbsId); + } 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 1a60c3f..9bd1902 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 @@ -33,6 +33,13 @@ public class AdminBoardsService extends EgovAbstractServiceImpl { return tnBbsRepository.findAllByOrderByBbsSeqDesc(); } + public String checkDuplicate(String bbsId) { + Optional result = tnBbsRepository.findByBbsId(bbsId); + String duplicateYn = result.isPresent() ? "Y" : "N"; + System.out.println("@@@ duplicateYn : " + duplicateYn); + return duplicateYn; + } + @Transactional public void saveBoard(TnBbs bbs, String userId) { if (bbs.getBbsSeq() == null) { From 6cdca8f5b7efa750ffa86c94c68720f409ab49c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Thu, 25 Apr 2024 16:48:40 +0900 Subject: [PATCH 25/50] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/board/EgovAdminBoardEdit.jsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 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 935c2ca..6b03968 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 @@ -303,15 +303,12 @@ function EgovAdminBoardEdit({props, reloadFunction}) { {/* */}
- - {modeInfo.mode === CODE.MODE_MODIFY && - - } + {modeInfo.mode === CODE.MODE_MODIFY && ( + + )}
-
- +
{/* */} From eb147a80e927f3232e3d07d96d299992722ddf06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Thu, 25 Apr 2024 17:10:22 +0900 Subject: [PATCH 26/50] =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EC=8B=9C=20=EC=8A=88=ED=8D=BC=EA=B4=80=EB=A6=AC=EC=9E=90=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EC=83=9D=EC=84=B1=20=EC=8A=88=ED=8D=BC=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=EA=B6=8C=ED=95=9C=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EB=B6=88=ED=97=88.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/config/MenuAuthMgt.jsx | 29 +++++++++++-------- .../admin/config/entity/TbMenuRole.java | 6 ++++ .../admin/config/service/ConfigService.java | 1 + 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/config/MenuAuthMgt.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/config/MenuAuthMgt.jsx index dd17ce0..fd7a434 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/config/MenuAuthMgt.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/config/MenuAuthMgt.jsx @@ -33,19 +33,24 @@ function MenuAuthMgt(props) { roleList.forEach(function (role) { checkboxs.push(
- { - const checked = e.target.checked; - if(checked) { - item.menuAuth += ","+role.itemCd - }else{ - item.menuAuth = item.menuAuth.replace(role.itemCd, ''); - if(item.menuAuth.startsWith(",")) { - item.menuAuth.replace(",", "") + {role.itemCd === "ROLE_001"? + () + : + ({ + const checked = e.target.checked; + if(checked) { + item.menuAuth += ","+role.itemCd + }else{ + item.menuAuth = item.menuAuth.replace(role.itemCd, ''); + if(item.menuAuth.startsWith(",")) { + item.menuAuth.replace(",", "") + } } - } - }} - defaultChecked={item.menuAuth.includes(role.itemCd)}/> + }} + defaultChecked={item.menuAuth.includes(role.itemCd)} />) + }
) /*if(item.menuGroup){ diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/entity/TbMenuRole.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/entity/TbMenuRole.java index 22e0205..81d889b 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/entity/TbMenuRole.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/entity/TbMenuRole.java @@ -28,6 +28,12 @@ public class TbMenuRole { @Column(name = "write_yn") private String writeYn; + public TbMenuRole(String roleId, String menuId, String writeYn) { + this.roleId = roleId; + this.menuId = menuId; + this.writeYn = writeYn; + } + @Embeddable @Data @NoArgsConstructor diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/service/ConfigService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/service/ConfigService.java index 7a04060..570324d 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/service/ConfigService.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/config/service/ConfigService.java @@ -130,6 +130,7 @@ public class ConfigService extends EgovAbstractServiceImpl { menu.setFrstCrtId(userId); menu.setUseYn("Y"); menuRepository.save(menu); + menuRoleRepository.save(new TbMenuRole("ROLE_001", menu.getMenuId(), "Y")); }else{ savedMenu.setMenuTitle(menu.getMenuTitle()); savedMenu.setMenuGroup(menu.getMenuGroup()); From f538ca64e85a50487d2b9b385c6a6ed0df86a0c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Tue, 30 Apr 2024 17:42:55 +0900 Subject: [PATCH 27/50] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EB=AC=BC=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80=EC=8B=9C=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20=EA=B8=B0=EB=B3=B8=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EB=B0=8F=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/board/AdminPostMgtEdit.jsx | 14 +++++--------- .../src/pages/admin/board/AdminPostMgtList.jsx | 4 ++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx index 818025d..63f0200 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx @@ -28,7 +28,7 @@ function AdminPostMgtEdit({props, reloadFunction}) { item = props; console.log("@@@ item : " + JSON.stringify(item)); - const [modeInfo, setModeInfo] = useState(item != null ? {mode: props.mode} : {mode: CODE.MODE_CREATE}); + const [modeInfo, setModeInfo] = useState(props.selectedBbsSeq ? {mode: CODE.MODE_CREATE} : {mode: props.mode}); const [boardDetail, setBoardDetail] = useState({}); console.log("@@@ mode : " + modeInfo.mode); @@ -230,7 +230,8 @@ function AdminPostMgtEdit({props, reloadFunction}) { {categoryList.map((item) => ( - + ))} @@ -258,20 +259,15 @@ function AdminPostMgtEdit({props, reloadFunction}) { {/* */}
- {modeInfo.mode === CODE.MODE_MODIFY && - }
- +
{/* */} 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 d253fdc..1621162 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 @@ -118,6 +118,10 @@ function AdminPostMgtList(props) { if(item != undefined) { item.mode = CODE.MODE_MODIFY; } + else { + item = {}; + item.selectedBbsSeq = searchCondition.bbsSeq; + } setModalBody( retrieveList(searchCondition)}/>) } From f09da411c0c06da8517b30a2102ffd034d7740dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Tue, 30 Apr 2024 17:57:38 +0900 Subject: [PATCH 28/50] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/board/AdminPostMgtEdit.jsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx index 63f0200..70f310b 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx @@ -82,7 +82,7 @@ function AdminPostMgtEdit({props, reloadFunction}) { formData.append('fixedYn', defaultFixedYn); formData.append('secretYn', defaultSecretYn); formData.append('bbsId', form.bbsId.value); - formData.append('bbsSeq', selectedBbsSeq); + formData.append('bbsSeq', selectedBbsSeq ? selectedBbsSeq : props.selectedBbsSeq); formData.append('bbsContTitle', form.bbsContTitle.value); formData.append('bbsContents', text); //첨부파일 @@ -151,9 +151,8 @@ function AdminPostMgtEdit({props, reloadFunction}) { const [selectedBbsSeq, setSelectedBbsSeq] = useState(null); const handleSelectChange = (e) => { - const selectedBbsId = e.target.value; - const selectedOption = categoryList.find((item) => item.bbsId === selectedBbsId); - setSelectedBbsSeq(selectedOption.bbsSeq); + const selectedBbsSeq = e.target.value; + setSelectedBbsSeq(selectedBbsSeq); } const fileTypes = ["JPG", "PNG", "GIF", "PDF", "HWP", "HWPX", "ZIP", "JPEG", "MP4", "TXT"]; From c7c8f80843cd635034769df0fdbeaaf1349b5ec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Fri, 3 May 2024 09:43:36 +0900 Subject: [PATCH 29/50] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EB=AC=BC=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EC=A0=80=EC=9E=A5=ED=9B=84=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20=EB=B0=98=EC=98=81=EB=90=98=EC=84=9C=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/board/AdminPostMgtEdit.jsx | 7 ++++--- .../src/pages/admin/board/AdminPostMgtList.jsx | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx index 70f310b..ad7a6d9 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx @@ -13,7 +13,8 @@ import RichTextEditor from "../../../components/editor/RichTextEditor"; import AttachFile from "../../../components/file/AttachFile"; -function AdminPostMgtEdit({props, reloadFunction}) { +function AdminPostMgtEdit({props, reloadFunction, searchCondition}) { + console.log("@@@ searchCondition : " + JSON.stringify(searchCondition)); console.group("AdminPostMgtEdit"); console.log("[Start] AdminPostMgtEdit ------------------------------"); console.log("AdminPostMgtEdit [props] : ", props); @@ -108,7 +109,7 @@ function AdminPostMgtEdit({props, reloadFunction}) { (resp) => { if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { alert("저장되었습니다."); - reloadFunction(); + reloadFunction(searchCondition); } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { console.log("토큰 갱신중.") } else { @@ -131,7 +132,7 @@ function AdminPostMgtEdit({props, reloadFunction}) { }, (resp) => { if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { - reloadFunction(); + reloadFunction(searchCondition); } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { console.log("토큰 갱신중.") } else { 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 1621162..091bd42 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 @@ -122,7 +122,7 @@ function AdminPostMgtList(props) { item = {}; item.selectedBbsSeq = searchCondition.bbsSeq; } - setModalBody( retrieveList(searchCondition)}/>) + setModalBody( retrieveList(searchCondition)} searchCondition={searchCondition}/>) } console.log("------------------------------EgovAdminPostList [End]"); From 4326dd805b33b984eaefa1e75a45f1209e789e42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Fri, 3 May 2024 09:58:11 +0900 Subject: [PATCH 30/50] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EB=AC=BC=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=88=98=EC=A0=95,?= =?UTF-8?q?=20=EC=84=A0=ED=83=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/css/component.css | 1 + .../src/css/page.css | 9 +++++---- .../src/pages/admin/board/AdminPostMgtList.jsx | 17 ++++++++--------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/css/component.css b/egovframe-template-simple-react-contribution/src/css/component.css index 23837cf..540dde7 100644 --- a/egovframe-template-simple-react-contribution/src/css/component.css +++ b/egovframe-template-simple-react-contribution/src/css/component.css @@ -56,6 +56,7 @@ .board_list .result .list_item {display: table; width: 100%; table-layout: fixed;} /* changed by lim padding: 18px 0 20px 0; */ .board_list .result .list_item > div {display: table-cell; padding: 7px 0 7px 0; border-bottom: 1px solid #dde2e5; color: #666; font-size: 14px; text-align: center; vertical-align: middle;} +.board_list .result .list_item > .left_align {text-align: left;} .board_list .result .list_item > div.al {padding: 18px 30px 20px 30px; text-align: left;} .board_list .result .list_item > div.reply {position: relative; padding: 18px 30px 20px 52px;} .board_list .result .list_item > div.reply::before {content: ""; display: block; position: absolute; left: 27px; top: 24px; width: 22px; height: 14px; background: url(css/images/ico_reply.png) no-repeat;} diff --git a/egovframe-template-simple-react-contribution/src/css/page.css b/egovframe-template-simple-react-contribution/src/css/page.css index eb59d13..cc22cd4 100644 --- a/egovframe-template-simple-react-contribution/src/css/page.css +++ b/egovframe-template-simple-react-contribution/src/css/page.css @@ -253,16 +253,17 @@ .PDS_LIST .recent > ul li .ymd {display: block; position: absolute; right: 0; top: 0; height: 30px; color: #666; font-size: 16px; line-height: 30px;} .PDS_LIST .tit_5 {margin-top: 42px;} .PDS_LIST .board_list {margin-top: 50px;} + /* 사이트관리 > 게시판현황 > 게시물관리 */ .BRD007 .head > span:nth-child(1) {width: 70px;} - .BRD007 .head > span:nth-child(3) {width: 160px;} + .BRD007 .head > span:nth-child(3) {width: 70px;} .BRD007 .head > span:nth-child(4) {width: 120px;} - .BRD007 .head > span:nth-child(5) {width: 70px;} + .BRD007 .head > span:nth-child(5) {width: 160px;} .BRD007 .head > span:nth-child(6) {width: 120px;} .BRD007 .head > span:nth-child(7) {width: 140px;} .BRD007 .result .list_item > div:nth-child(1) {width: 70px;} - .BRD007 .result .list_item > div:nth-child(3) {width: 160px;} + .BRD007 .result .list_item > div:nth-child(3) {width: 70px;} .BRD007 .result .list_item > div:nth-child(4) {width: 120px;} - .BRD007 .result .list_item > div:nth-child(5) {width: 70px;} + .BRD007 .result .list_item > div:nth-child(5) {width: 160px;} .BRD007 .result .list_item > div:nth-child(6) {width: 120px;} .BRD007 .result .list_item > div:nth-child(7) {width: 140px;} 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 091bd42..0484b3c 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 @@ -69,11 +69,11 @@ function AdminPostMgtList(props) { mutListTag.push(
공지
-
{item?.bbsContTitle}
-
{item?.frstCrtId}
-
{formattedDate}
+
{item?.bbsContTitle}
{item?.bbsReadCnt}
{item?.fileGrpId && File Icon}
+
{item?.frstCrtId}
+
{formattedDate}
); @@ -85,11 +85,11 @@ function AdminPostMgtList(props) { mutListTag.push(
{resp.result.resultCnt - (resp.result.paginationInfo.pageIndex -1) * resp.result.paginationInfo.rowCnt - index}
-
{item?.bbsContTitle}
-
{item?.frstCrtId}
-
{formattedDate}
+
{item?.bbsContTitle}
{item?.bbsReadCnt}
{item?.fileGrpId && File Icon}
+
{item?.frstCrtId}
+
{formattedDate}
); @@ -160,7 +160,6 @@ function AdminPostMgtList(props) { 게시판선택