diff --git a/egovframe-template-simple-react-contribution/src/components/editor/RichTextEditor.js b/egovframe-template-simple-react-contribution/src/components/editor/RichTextEditor.js
index 0ada6e7..7adbab9 100644
--- a/egovframe-template-simple-react-contribution/src/components/editor/RichTextEditor.js
+++ b/egovframe-template-simple-react-contribution/src/components/editor/RichTextEditor.js
@@ -4,7 +4,7 @@ import 'react-quill/dist/quill.snow.css';
// react-quill에 기반을 둔 텍스트 에디터 컴포넌트
const RichTextEditor = ({item, setText}) => {
- const style = { height: "400px"};
+ const style = { height: "400px", paddingBottom: "69px"};
const onChangeEvent = (e) => {
setText(e);
diff --git a/egovframe-template-simple-react-contribution/src/constants/url.js b/egovframe-template-simple-react-contribution/src/constants/url.js
index 8597ffd..561f959 100644
--- a/egovframe-template-simple-react-contribution/src/constants/url.js
+++ b/egovframe-template-simple-react-contribution/src/constants/url.js
@@ -98,12 +98,14 @@ const URL = {
ADMIN__STANDARDS__INFO_DISCLOSURE : "/admin/standards/info-disclosure", // 건설기준 관리/정보공개 관리
// 관리자 - 컨텐츠 관리
- ADMIN__CONTENTS__SURVEY : "/admin/contents/survey", // 컨텐츠 관리/설문 관리
- ADMIN__CONTENTS__POP_UP : "/admin/contents/pop-up", // 컨텐츠 관리/팝업 관리
- ADMIN__CONTENTS__POP_UP__CREATE : "/admin/contents/pop-up/create", // 관리자 - 컨텐츠 관리/팝업 관리/팝업 추가
- ADMIN__CONTENTS__POP_UP__MODIFY : "/admin/contents/pop-up/modify", // 관리자 - 컨텐츠 관리/팝업 관리/팝업 수정
- ADMIN__CONTENTS__STANDARDS_RESEARCH : "/admin/contents/standards-research", // 컨텐츠 관리/건설기준연구 관리
- ADMIN__CONTENTS__TEXT_MESSAGES : "/admin/contents/text-messages", // 컨텐츠 관리/문자 발송
+ ADMIN__CONTENTS__SURVEY : "/admin/contents/survey", // 컨텐츠 관리/설문 관리
+ ADMIN__CONTENTS__POP_UP : "/admin/contents/pop-up", // 컨텐츠 관리/팝업 관리
+ ADMIN__CONTENTS__POP_UP__CREATE : "/admin/contents/pop-up/create", // 관리자 - 컨텐츠 관리/팝업 관리/팝업 추가
+ ADMIN__CONTENTS__POP_UP__MODIFY : "/admin/contents/pop-up/modify", // 관리자 - 컨텐츠 관리/팝업 관리/팝업 수정
+ ADMIN__CONTENTS__STANDARDS_RESEARCH : "/admin/contents/standards-research", // 컨텐츠 관리/건설기준연구 관리
+ ADMIN__CONTENTS__STANDARDS_RESEARCH__CREATE : "/admin/contents/standards-research/create", // 컨텐츠 관리/건설기준연구 관리/추가
+ ADMIN__CONTENTS__STANDARDS_RESEARCH__MODIFY : "/admin/contents/standards-research/modify", // 컨텐츠 관리/건설기준연구 관리/수정
+ ADMIN__CONTENTS__TEXT_MESSAGES : "/admin/contents/text-messages", // 컨텐츠 관리/문자 발송
// 관리자 - 위원회 관리
ADMIN__COMMITTEE__PROGRESS_STATUS : "/admin/committee/progress-status", // 위원회 관리/진행현황 관리
diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/contents/PopUp/PopupWriter.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/contents/PopUp/PopupEditor.jsx
similarity index 99%
rename from egovframe-template-simple-react-contribution/src/pages/admin/contents/PopUp/PopupWriter.jsx
rename to egovframe-template-simple-react-contribution/src/pages/admin/contents/PopUp/PopupEditor.jsx
index 2eba0af..05460a2 100644
--- a/egovframe-template-simple-react-contribution/src/pages/admin/contents/PopUp/PopupWriter.jsx
+++ b/egovframe-template-simple-react-contribution/src/pages/admin/contents/PopUp/PopupEditor.jsx
@@ -21,14 +21,10 @@ const StyledDiv = styled.div`
margin-bottom: 30px;
}
- .board_btn_area {
-
- margin-top: 70px;
- }
`;
-function PopupWriter(props) {
+function PopupEditor(props) {
const navigate = useNavigate();
const location = useLocation();
@@ -373,4 +369,4 @@ function PopupWriter(props) {
}
-export default PopupWriter;
\ No newline at end of file
+export default PopupEditor;
\ No newline at end of file
diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/contents/StandardResearch.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/contents/StandardResearch.jsx
index b5f3522..82d9d9b 100644
--- a/egovframe-template-simple-react-contribution/src/pages/admin/contents/StandardResearch.jsx
+++ b/egovframe-template-simple-react-contribution/src/pages/admin/contents/StandardResearch.jsx
@@ -1,13 +1,85 @@
-import React from 'react';
-import { Link } from 'react-router-dom';
+import React, { useState, useEffect } from 'react';
+import { Link, useLocation, useNavigate } from 'react-router-dom';
+import Switch from '@mui/material/Switch';
+import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
+import CODE from 'constants/code';
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
+import EgovPagingPaginationInfo from 'components/EgovPagingPaginationInfo';
+import styled from "styled-components";
+
+const StyledDiv = styled.div`
+ .board_btn_area {
+ margin: 12px 0px;
+ }
+`;
+
+const label = { inputProps: { 'aria-label': '사용여부' } };
+
function StandardResearch(props) {
+ const location = useLocation();
+ const navigate = useNavigate();
+
+ const [list, setList] = useState([]);
+ const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { pageIndex: 1, searchCnd: '0', searchWrd: '' });
+ const [paginationInfo, setPaginationInfo] = useState({});
+
+ useEffect(function () {
+ getList(searchCondition);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ const requestOptions = {
+ method: "GET",
+ headers: {
+ 'Content-type': 'application/json'
+ }
+ }
+
+ const getList = (searchCondition) => {
+
+ EgovNet.requestFetch(`/contents/standard-research/list?page=${searchCondition.pageIndex-1}&size=10&sort=rsSeq,desc`,
+ requestOptions,
+ function (resp) {
+ console.log('%o', resp);
+ setList(resp.result.list);
+ setPaginationInfo({...resp.result.paginationInfo});
+ }
+ );
+
+ }
+
+
+ const onChangeActivationSwitch = (e, rsId) => {
+ const checked = e.target.checked;
+ const requestURL = `/contents/api/popup-manage/activation-switch/${rsId}?checked=${checked}`;
+
+ const requestOptions = {
+ method: "PUT",
+ headers: {
+ 'Content-type': 'application/json',
+ }
+ }
+
+ EgovNet.requestFetch(requestURL,
+ requestOptions,
+ (resp) => {
+ console.log("====>>> Schdule delete= ", resp);
+ if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
+ navigate(URL.ADMIN__CONTENTS__POP_UP ,{ replace: true });
+ } else {
+ navigate({pathname: URL.ERROR}, {state: {msg : resp.resultMessage}});
+ }
+
+ }
+ );
+ }
+
const Location = React.memo(function Location() {
return (
@@ -35,11 +107,51 @@ function StandardResearch(props) {
{/* */}
-
-
건설기준연구 관리
-
+
+
+
건설기준연구 관리
+
+ {/* */}
+
+ {/* */}
+
+ {/* */}
+
+
+ 번호
+ 연구명
+ 연구기간
+ 연구책임자
+
+
+ {/* */}
+ {list.length === 0 &&
+
검색된 결과가 없습니다.
+ }
+ {list.map((it)=>(
+
+
{it.id}
+
{it.title}
+
{it.researchStartDate} ~ {it.researchEndDate}
+
{it.director}
+
+ ))}
+
+
+ {/* */}
- 여기에 구현해주세요.
+
+ {/* */}
+ {
+ getList({ ...searchCondition, pageIndex: passedPage })
+ }} />
+ {/* */}
+
+
{/* */}
diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/contents/StandardResearch/StandardResearchEditor.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/contents/StandardResearch/StandardResearchEditor.jsx
new file mode 100644
index 0000000..3cee0f3
--- /dev/null
+++ b/egovframe-template-simple-react-contribution/src/pages/admin/contents/StandardResearch/StandardResearchEditor.jsx
@@ -0,0 +1,412 @@
+import React, { useState, useEffect } from 'react';
+import { Link, useLocation, useNavigate } from 'react-router-dom';
+import DatePicker from "react-datepicker";
+
+import EgovAttachFile from 'components/EgovAttachFile';
+import RichTextEditor from "../../../../components/editor/RichTextEditor";
+import AlertDialogSlide from "../../../../components/alert/AlertDialogSlide";
+import CODE from 'constants/code';
+
+
+import * as EgovNet from 'api/egovFetch';
+import URL from 'constants/url';
+
+import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
+
+import styled from "styled-components";
+
+const StyledDiv = styled.div`
+
+ .board_view2 {
+ margin-bottom: 30px;
+ }
+
+ .label-text-editor {
+ font-size: 19px;
+ font-weight: 600;
+ color: #212529;
+ margin-bottom: 10px;
+ .req {
+ display: inline-block;
+ width: 7px;
+ height: 7px;
+ margin-left: 2px;
+ font-size: 0;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdCNDNBMURDRjVFRDExRUJBMkM3OUEyMERCMzg3NTBGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjdCNDNBMURERjVFRDExRUJBMkM3OUEyMERCMzg3NTBGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6N0I0M0ExREFGNUVEMTFFQkEyQzc5QTIwREIzODc1MEYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0I0M0ExREJGNUVEMTFFQkEyQzc5QTIwREIzODc1MEYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5vOlo3AAAAbElEQVR42mL4//8/Awy/zij/D8ShMD7Tm8wKQQYsACTOCFS5Csh2AeKzUPoeVP49E5BIB+JOIFaCCoJMWg3Erkwi0zveAxmzoIL3oPRZkDgTVHUHVMIEqrAcJMgClQQZywA1JR3omFAQHyDAAEctLdb1Cc0kAAAAAElFTkSuQmCC) no-repeat;
+ vertical-align: 17px;
+ }
+ }
+
+`;
+
+function StandardResearchEditor(props) {
+
+ const navigate = useNavigate();
+ const location = useLocation();
+
+ const [modeInfo, setModeInfo] = useState({ mode: props.mode });
+ const [purpose, setPurpose] = useState("");
+ const [purposeOriginal, setPurposeOriginal] = useState("");
+ const [content, setContent] = useState("");
+ const [contentOriginal, setContentOriginal] = useState("");
+ const [effectContent, setEffectContent] = useState("");
+ const [effectContentOriginal, setEffectContentOriginal] = useState("");
+
+
+
+ const [standardResearchDetail, setStandardResearchDetail] = useState({ researchStartDate: new Date(), researchEndDate: new Date() });
+ const [confirm, setConfirm] = React.useState();
+
+
+
+ useEffect(function () {
+ initMode();
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ const formValidator = (formData) => {
+ if (formData.get('title') === null || formData.get('title') === "") {
+ alert("연구명은 필수 값입니다.");
+ return false;
+ }
+
+ if (formData.get('schdulBgnde') > formData.get('schdulEndde')) {
+ alert("종료일시는 시작일시보다 앞 설 수 없습니다.");
+ return false;
+ }
+
+ if (formData.get('director') === null || formData.get('director') === "") {
+ alert("연구책임자는 필수 값입니다.");
+ return false;
+ }
+
+ if (formData.get('purpose') === null || formData.get('purpose') === "") {
+ alert("연구목적은 필수 값입니다.");
+ return false;
+ }
+
+ if (formData.get('content') === null || formData.get('content') === "") {
+ alert("연구내용은 필수 값입니다.");
+ return false;
+ }
+
+ if (formData.get('effectContent') === null || formData.get('effectContent') === "") {
+ alert("기대효과는 필수 값입니다.");
+ return false;
+ }
+ return true;
+ }
+
+ const initMode = () => {
+
+ // props.mode 값이 없으면 에러가 발생한다.
+ switch (props.mode) {
+ case CODE.MODE_CREATE:
+ setModeInfo({
+ ...modeInfo,
+ modeTitle: "등록",
+ method : "POST",
+ editURL: '/contents/standard-research'
+ });
+ break;
+ case CODE.MODE_MODIFY:
+ setModeInfo({
+ ...modeInfo,
+ modeTitle: "수정",
+ method : "PUT",
+ editURL: '/contents/standard-research'
+ });
+ break;
+ default:
+ navigate({pathname: URL.ERROR}, {state: {msg : ""}});
+ }
+ retrieveDetail();
+ }
+
+ const retrieveDetail = () => {
+
+ if (modeInfo.mode === CODE.MODE_CREATE) {// 조회/등록이면 조회 안함
+ return;
+ }
+
+ const retrieveDetailURL = `/contents/standard-research/${location.state?.rsId}`;
+ const requestOptions = {
+ method: "GET",
+ headers: {
+ 'Content-type': 'application/json'
+ }
+ }
+ EgovNet.requestFetch(retrieveDetailURL,
+ requestOptions,
+ function (resp) {
+ let rawDetail = resp.result;
+ //기본값 설정
+ setStandardResearchDetail({
+ ...standardResearchDetail,
+ ...rawDetail,
+ researchStartDate: convertDate(rawDetail.researchStartDate),
+ researchEndDate: convertDate(rawDetail.researchEndDate),
+ });
+ setPurpose(rawDetail.purpose);
+ setPurposeOriginal(rawDetail.purpose);
+ setContent(rawDetail.content);
+ setContentOriginal(rawDetail.content);
+ setEffectContent(rawDetail.effectContent);
+ setEffectContentOriginal(rawDetail.effectContent);
+ }
+ );
+ }
+
+
+
+ const createItem = () => {
+ const formData = new FormData();
+
+ for (let key in standardResearchDetail) {
+ if ( key === 'researchStartDate' ) {
+ formData.append(key, getDateFourteenDigit( standardResearchDetail[key] ));
+ } else if( key === 'researchEndDate' ) {
+ formData.append(key, getDateFourteenDigit( standardResearchDetail[key] ));
+ } else {
+ formData.append(key, standardResearchDetail[key]);
+ }
+ }
+
+ //연구 목적
+ formData.delete("purpose");
+ formData.append("purpose", purpose);
+
+ //연구 내용
+ formData.delete("content");
+ formData.append("content", content);
+
+ //기대 효과
+ formData.delete("effectContent");
+ formData.append("effectContent", effectContent);
+
+
+ if (formValidator(formData)) {
+ const requestOptions = {
+ method: modeInfo.method,
+ body: formData
+ }
+
+ const requestTask = (callbackParams) => {
+ EgovNet.requestFetch(callbackParams.requestUrl,
+ requestOptions,
+ (resp) => {
+ if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
+ if (modeInfo.mode === CODE.MODE_MODIFY) {
+ alert("게시글이 수정 되었습니다.");
+ }
+ navigate({ pathname: URL.ADMIN__CONTENTS__STANDARDS_RESEARCH });
+ } else {
+ navigate({pathname: URL.ERROR}, {state: {msg : resp.resultMessage}});
+ }
+ }
+ );
+ };
+
+
+ if (modeInfo.mode === CODE.MODE_CREATE) {
+ setConfirm({...confirm, open: true, body: "추가하시겠습니까?", yesCallback: requestTask, yesCallbackParams: {requestUrl:modeInfo.editURL}});
+ } else if (modeInfo.mode === CODE.MODE_MODIFY) {
+ setConfirm({...confirm, open: true, body: "수정하시겠습니까?", yesCallback: requestTask, yesCallbackParams: {requestUrl:`${modeInfo.editURL}/${location.state?.rsId}`}});
+ }
+
+ }
+
+ }
+
+ const onClickDelete = (rsId) => {
+ const deleteBoardURL = `/contents/standard-research/${rsId}`;
+
+ const requestOptions = {
+ method: "DELETE",
+ headers: {
+ 'Content-type': 'application/json',
+ }
+ }
+
+ const requestTask = () => {
+ EgovNet.requestFetch(deleteBoardURL,
+ requestOptions,
+ (resp) => {
+ if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
+ alert("삭제 되었습니다.");
+ navigate(URL.ADMIN__CONTENTS__STANDARDS_RESEARCH ,{ replace: true });
+ } else {
+ navigate({pathname: URL.ERROR}, {state: {msg : resp.resultMessage}});
+ }
+ }
+ );
+ };
+
+ setConfirm({...confirm, open: true, body: "삭제하시겠습니까?", yesCallback: requestTask});
+ }
+
+ const onClickList = (e) => {
+
+ const requestTask = () => {
+ navigate(URL.ADMIN__CONTENTS__STANDARDS_RESEARCH ,{ replace: true });
+ };
+
+ if( purpose !== purposeOriginal ) {
+ setConfirm({...confirm, open: true, body: "작업 내용을 취소하시겠습니까?", yesCallback: requestTask});
+ } else if( content !== contentOriginal ) {
+ setConfirm({...confirm, open: true, body: "작업 내용을 취소하시겠습니까?", yesCallback: requestTask});
+ } else if( effectContent !== effectContentOriginal ) {
+ setConfirm({...confirm, open: true, body: "작업 내용을 취소하시겠습니까?", yesCallback: requestTask});
+ } else {
+ requestTask();
+ }
+
+ }
+
+
+ const convertDate = (str) => {
+ let year = str.substring(0, 4);
+ let month = str.substring(4, 6);
+ let date = str.substring(6, 8);
+ let hour = str.substring(8, 10);
+ let minute = str.substring(10, 12);
+ return new Date(year, month - 1, date, hour, minute)
+ }
+ const getDateFourteenDigit = (date) => {
+ return `${getYYYYMMDD(date).toString()}${makeTwoDigit(date.getHours())}${makeTwoDigit(date.getMinutes())}${makeTwoDigit(date.getSeconds())}`;
+ }
+ const getYYYYMMDD = (date) => {
+ return date.getFullYear().toString() + makeTwoDigit(Number(date.getMonth() + 1)) + makeTwoDigit(date.getDate());
+ }
+ const makeTwoDigit = (number) => {
+ return number < 10 ? "0" + number : number.toString();
+ }
+
+
+ const Location = React.memo(function Location() {
+ return (
+
+
+ - Home
+ - 사이트 관리
+ - 컨텐츠 관리
+ - 건설기준연구 관리
+
+
+ )
+ });
+
+ return (
+
+
+ {/* */}
+
+ {/* */}
+
+
+ {/* */}
+
+ {/* */}
+
+
+ {/* */}
+
+
+
건설기준연구 추가
+
+ {/* */}
+
+
+ - 필수
+ -
+ setStandardResearchDetail({ ...standardResearchDetail, title: e.target.value })}
+ />
+
+
+
+ - 연구 기간필수
+ -
+
+ {
+ console.log("setStartDate : ", date);
+ setStandardResearchDetail({ ...standardResearchDetail, schdulBgnde: getDateFourteenDigit(date), schdulBgndeYYYMMDD: getYYYYMMDD(date), researchStartDate: date });
+ }} />
+ ~
+
+
+ {
+ console.log("setEndDate: ", date);
+ setStandardResearchDetail({ ...standardResearchDetail, schdulEndde: getDateFourteenDigit(date), schdulEnddeYYYMMDD: getYYYYMMDD(date), researchEndDate: date });
+ }
+ } />
+
+
+
+
+ - 필수
+ -
+ setStandardResearchDetail({ ...standardResearchDetail, director: e.target.value })}
+ />
+
+
+
+ {/* */}
+
+ {/* */}
+
+
+
+
+
+
+
+
+ {/* */}
+
+ {/* */}
+
+
+
+ {modeInfo.mode === CODE.MODE_MODIFY &&
+
+ }
+
+
+
+
+
+ {/* */}
+
+
+
+ {/* */}
+
+
+
+
+ );
+}
+
+
+export default StandardResearchEditor;
\ No newline at end of file
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 7088968..3475d31 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
@@ -1,30 +1,180 @@
-import React from 'react';
-import { Link } from 'react-router-dom';
+import React, {useState, useEffect, useCallback, useRef, PureComponent} from 'react';
+import { Link, useLocation } from 'react-router-dom';
+import {BarChart, Bar, Rectangle, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer} from 'recharts';
+
+import Switch from '@mui/material/Switch';
+
+import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
+import { itemIdxByPage } from 'utils/calc';
+import EgovPaging from 'components/EgovPaging';
+
function ApiKeys(props) {
+ // console.group("EgovAdminPrivacyList");
+ // console.log("[Start] EgovAdminPrivacyList ------------------------------");
+ // console.log("EgovAdminPrivacyList [props] : ", props);
+ const location = useLocation();
+ // console.log("EgovAdminPrivacyList [location] : ", location);
+
+ // eslint-disable-next-line no-unused-vars
+ const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { pageIndex: 1, searchCnd: '0', searchWrd: '' });
+ const [paginationInfo, setPaginationInfo] = useState({});
+ const [chartData, setChartData] = useState([]);
+ const [user_id, setuser_id] = useState([]);
+
+ const [listTag, setListTag] = useState([]);
+ // const label = { inputProps: { 'aria-label': '사용여부' } };
+
+ const retrieveList = useCallback((srchCnd) => {
+ // console.groupCollapsed("EgovAdminUsageList.retrieveList()");
+ const retrieveListURL = '/admin/standards/apikey';
+
+ const requestOptions = {
+ method: "POST",
+ headers: {
+ 'Content-type': 'application/json',
+ },
+ body: JSON.stringify(srchCnd)
+ }
+
+ EgovNet.requestFetch(
+ retrieveListURL,
+ requestOptions,
+ (resp) => {
+ setPaginationInfo(resp.result.paginationInfo);
+
+ let mutListTag = [];
+ listTag.push(데이터가 없습니다.
); // 게시판 목록 초기값
+
+ const resultCnt = parseInt(resp.result.resultCnt);
+ const currentPageNo = resp.result.paginationInfo.pageIndex;
+ const pageSize = resp.result.paginationInfo.rowCnt;
+
+ const startIndex = (currentPageNo - 1) * pageSize;
+ const endIndex = Math.min(startIndex + pageSize, resultCnt);
+
+ // 리스트 항목 구성
+ for (let index = startIndex; index < endIndex; index++) {
+ const listIdx = itemIdxByPage(resultCnt, currentPageNo, 0, index); // pageSize 로 넣으면 listIdx값이 2배씩 줄어서 0으로 수정
+ const item = resp.result.resultList[index];
+
+ mutListTag.push(
+
+
{item.userId}
+
handleApiKeyChart(item)}>{item.apiKey}
+
{item.startDt} ~ {item.endDt}
+
{item.idntyYn === 'Y' ? handleSwitchToggle(item)} /> : handleSwitchToggle(item)} />}
+
+ );
+ }
+ setListTag(mutListTag);
+ },
+ function (resp) {
+ console.log("err response : ", resp);
+ }
+ );
+ // console.groupEnd("EgovAdminPrivacyList.retrieveList()");
+ },[listTag]);
+
+ const CustomTooltip = ({ active, payload, label }) => {
+ if (active && payload && payload.length) {
+ return (
+
+
API 요청 [{user_id}]
+
{`${label} : ${payload[0].value}`}회
+
+ );
+ }
+ return null;
+ };
+
+ const handleSwitchToggle = async (item) => {
+ try {
+ const updateApiEndpoint = '/admin/standards/apiupdate';
+ const requestOptions = {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(item),
+ };
+
+ const response = await EgovNet.requestFetch(updateApiEndpoint, requestOptions);
+ const data = await response.json();
+
+ if (response.ok) {
+ console.log('Data updated successfully:', data);
+ return { success: true, data };
+ } else {
+ console.error('Failed to update data:', data);
+ return { success: false, error: data };
+ }
+ } catch (error) {
+ console.error('Error during data update:', error);
+ return { success: false, error };
+ }
+ };
+
+ const handleApiKeyChart = (item) => {
+ try {
+ const updateApiEndpoint = '/admin/standards/apiDailyChart';
+ const requestOptions = {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(item),
+ };
+
+ EgovNet.requestFetch(
+ updateApiEndpoint,
+ requestOptions,
+ (resp) => {
+ let chartDataArray = resp.result.resultList.map((item, index) => ({
+ logdt: item[0], // Assuming logCnt is the x-axis data
+ "API 요청수": item[1], // Assuming menuTitle is the y-axis data
+ }));
+ setChartData(chartDataArray);
+ // item.userId 값 넣기
+ console.log(`User ID: ${item.userId}`);
+ setuser_id(item.userId);
+ },
+ function (resp) {
+ console.log("err response : ", resp);
+ }
+ );
+ } catch (error) {
+ console.error('Error during data update:', error);
+ return { success: false, error };
+ }
+ };
+
+ useEffect(() => {
+ retrieveList(searchCondition);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ // console.log("------------------------------EgovAdminPrivacyList [End]");
+ // console.groupEnd("EgovAdminPrivacyList");
- const Location = React.memo(function Location() {
- return (
-
-
- - Home
- - 건설기준 관리
- - API KEY 관리
-
-
- )
- });
return (
{/* */}
-
+
+
+ - Home
+ - 사이트관리
+ - 건설기준 관리
+ - API KEY 관리
+
+
{/* */}
@@ -35,13 +185,51 @@ function ApiKeys(props) {
{/* */}
-
건설기준 관리
+ API KEY 관리
-
API KEY 관리
+ {/* */}
+
+
+ 사용자
+ 발급키
+ 승인기간
+ 승인여부
+
+
+ {listTag}
+
+
+ {/* */}
- 여기에 구현해주세요.
- {/* */}
+
+ {/* */}
+ {
+ retrieveList({ ...searchCondition, pageIndex: passedPage }) //, searchCnd: cndRef.current.value, searchWrd: wrdRef.current.value
+ }} />
+ {/* */}
+
+
+
+
+
+
+
+ } />
+
+ } />
+
+
+
+ {/* */}
diff --git a/egovframe-template-simple-react-contribution/src/routes/index.jsx b/egovframe-template-simple-react-contribution/src/routes/index.jsx
index f5cb5a0..e3c8edc 100644
--- a/egovframe-template-simple-react-contribution/src/routes/index.jsx
+++ b/egovframe-template-simple-react-contribution/src/routes/index.jsx
@@ -89,11 +89,12 @@ import AdminStandardsSimilarityCheck from 'pages/admin/standards/SimilarityCheck
import AdminStandardsInfoDisclosure from 'pages/admin/standards/InfoDisclosure'; // 관리자 - 건설기준 관리/정보공개 관리
// 관리자 - 컨텐츠 관리
-import AdminContentsSurvey from 'pages/admin/contents/Survey'; // 관리자 - 컨텐츠 관리/설문 관리
-import AdminContentsPopUp from 'pages/admin/contents/PopUp'; // 관리자 - 컨텐츠 관리/팝업 관리
-import AdminContentsPopUpWriter from 'pages/admin/contents/PopUp/PopupWriter'; // 관리자 - 컨텐츠 관리/팝업 관리/팝업 추가 또는 수정
-import AdminContentsStandardResearch from 'pages/admin/contents/StandardResearch'; // 관리자 - 컨텐츠 관리/건설기준연구 관리
-import AdminContentsTextMessages from 'pages/admin/contents/TextMessages'; // 관리자 - 컨텐츠 관리/문자 발송
+import AdminContentsSurvey from 'pages/admin/contents/Survey'; // 관리자 - 컨텐츠 관리/설문 관리
+import AdminContentsPopUp from 'pages/admin/contents/PopUp'; // 관리자 - 컨텐츠 관리/팝업 관리
+import AdminContentsPopUpEditor from 'pages/admin/contents/PopUp/PopupEditor'; // 관리자 - 컨텐츠 관리/팝업 관리/팝업 추가 또는 수정
+import AdminContentsStandardResearch from 'pages/admin/contents/StandardResearch'; // 관리자 - 컨텐츠 관리/건설기준연구 관리
+import AdminContentsStandardResearchEditor from 'pages/admin/contents/StandardResearch/StandardResearchEditor'; // 컨텐츠 관리/건설기준연구 관리/추가 또는 수정
+import AdminContentsTextMessages from 'pages/admin/contents/TextMessages'; // 관리자 - 컨텐츠 관리/문자 발송
// 관리자 - 위원회 관리
import AdminCommitteeProgressStatus from 'pages/admin/committee/ProgressStatus'; // 관리자 - 위원회 관리/진행현황 관리
@@ -298,9 +299,11 @@ const SecondRoutes = () => {
{/* 관리자 - 컨텐츠 관리 */}
} />
} />
-
} />
-
} />
+
} />
+
} />
} />
+
} />
+
} />
} />
{/* 관리자 - 위원회 관리 */}
diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/AdminStandardResearchController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/AdminStandardResearchController.java
new file mode 100644
index 0000000..b56428e
--- /dev/null
+++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/AdminStandardResearchController.java
@@ -0,0 +1,240 @@
+package com.dbnt.kcscbackend.admin.standardResearch;
+
+
+import com.dbnt.kcscbackend.admin.contents.popUp.model.CreatePopupVO;
+import com.dbnt.kcscbackend.admin.contents.popUp.model.UpdatePopupVO;
+import com.dbnt.kcscbackend.admin.contents.popUp.utils.EgovFileMngUtil;
+import com.dbnt.kcscbackend.admin.standardResearch.model.CreateStandardResearchVO;
+import com.dbnt.kcscbackend.admin.standardResearch.model.UpdateStandardResearchVO;
+import com.dbnt.kcscbackend.admin.standardResearch.service.AdminStandardResearchService;
+import com.dbnt.kcscbackend.auth.entity.LoginVO;
+import com.dbnt.kcscbackend.config.common.ResponseCode;
+import com.dbnt.kcscbackend.config.common.ResultVO;
+import io.swagger.annotations.Api;
+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 org.springframework.data.domain.Pageable;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+
+@Api("AdminStandardResearchController")
+@RestController
+@Tag(name="AdminStandardResearchController",description = "건설기준연구 관리")
+public class AdminStandardResearchController {
+
+ @Resource(name = "adminStandardResearchService")
+ private AdminStandardResearchService adminStandardResearchService;
+
+ @Resource(name = "EgovFileMngUtil")
+ private EgovFileMngUtil fileUtil;
+
+ @Operation(
+ summary = "'건설기준연구 관리' 페이지에서 목록 불러오는 API",
+ description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 목록 불러오는 API",
+ tags = {"AdminStandardResearchController"}
+ )
+ @ApiResponses(value = {
+ @ApiResponse(responseCode = "200", description = "조회 성공"),
+ @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
+ })
+ @GetMapping(value = "/contents/standard-research/list")
+ public ResultVO contentsStandardResearchList(
+ @AuthenticationPrincipal LoginVO user,
+ HttpServletRequest request,
+ Pageable pageable) throws Exception {
+
+ ResultVO resultVO = new ResultVO();
+
+ try {
+ resultVO = adminStandardResearchService.contentsStandardResearchList(resultVO, request, user, pageable);
+ } catch (Exception e) {
+ resultVO.setResultCode(ResponseCode.FAILED.getCode());
+ resultVO.setResultMessage(e.getMessage());
+ }
+
+
+ System.out.println(
+ "\n--------------------------------------------------------------\n" +
+ request.getRequestURI() + " OUT:" +
+ "\n--------------------------------------------------------------\n" +
+ "resultVO.toString():" + "\n" +
+ resultVO.toString() + "\n" +
+ "\n--------------------------------------------------------------\n"
+ );
+
+ return resultVO;
+ }
+
+
+
+ @Operation(
+ summary = "추가 API",
+ description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 항목을 추가하는 API",
+ tags = {"AdminStandardResearchController"}
+ )
+ @ApiResponses(value = {
+ @ApiResponse(responseCode = "200", description = "등록 성공"),
+ @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"),
+ @ApiResponse(responseCode = "900", description = "입력값 무결성 오류")
+ })
+ @PostMapping(value = "/contents/standard-research")
+ public ResultVO contentsStandardResearchCreate(
+ HttpServletRequest request,
+ @AuthenticationPrincipal LoginVO loginVO,
+ final MultipartHttpServletRequest multiRequest,
+ CreateStandardResearchVO createStandardResearchVO
+ ) throws Exception {
+
+ ResultVO resultVO = new ResultVO();
+
+ try {
+ resultVO = adminStandardResearchService.contentsStandardResearchCreate(resultVO, request, loginVO, multiRequest, createStandardResearchVO);
+ } catch (Exception e) {
+ resultVO.setResultCode(ResponseCode.FAILED.getCode());
+ resultVO.setResultMessage(e.getMessage());
+ }
+
+
+ System.out.println(
+ "\n--------------------------------------------------------------\n" +
+ request.getRequestURI() + " OUT:" +
+ "\n--------------------------------------------------------------\n" +
+ "resultVO.toString():" + "\n" +
+ resultVO.toString() + "\n" +
+ "\n--------------------------------------------------------------\n"
+ );
+
+ return resultVO;
+
+ }
+
+
+ @Operation(
+ summary = "수정 API",
+ description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 항목을 수정하는 API",
+ tags = {"AdminStandardResearchController"}
+ )
+ @ApiResponses(value = {
+ @ApiResponse(responseCode = "200", description = "등록 성공"),
+ @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"),
+ })
+ @PutMapping(value = "/contents/standard-research/{rsId}")
+ public ResultVO contentsStandardResearchUpdate(
+ HttpServletRequest request,
+ @AuthenticationPrincipal LoginVO loginVO,
+ UpdateStandardResearchVO updateStandardResearchVO,
+ @PathVariable("rsId") Long rsId
+ ) throws Exception {
+
+ ResultVO resultVO = new ResultVO();
+
+ try {
+ resultVO = adminStandardResearchService.contentsStandardResearchUpdate(resultVO, request, loginVO, updateStandardResearchVO, rsId);
+ } catch (Exception e) {
+ resultVO.setResultCode(ResponseCode.FAILED.getCode());
+ resultVO.setResultMessage(e.getMessage());
+ }
+
+
+ System.out.println(
+ "\n--------------------------------------------------------------\n" +
+ request.getRequestURI() + " OUT:" +
+ "\n--------------------------------------------------------------\n" +
+ "resultVO.toString():" + "\n" +
+ resultVO.toString() + "\n" +
+ "\n--------------------------------------------------------------\n"
+ );
+
+ return resultVO;
+
+ }
+
+
+ @Operation(
+ summary = "삭제 API",
+ description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 항목을 삭제하는 API",
+ tags = {"AdminStandardResearchController"}
+ )
+ @ApiResponses(value = {
+ @ApiResponse(responseCode = "200", description = "등록 성공"),
+ @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"),
+ })
+ @DeleteMapping(value = "/contents/standard-research/{rsId}")
+ public ResultVO contentsStandardResearchDelete
+ (
+ @AuthenticationPrincipal LoginVO user,
+ HttpServletRequest request,
+ @PathVariable("rsId") String strRsId
+ ) throws Exception {
+
+ ResultVO resultVO = new ResultVO();
+ Long rsId = Long.valueOf(strRsId);
+ try {
+ resultVO = adminStandardResearchService.contentsStandardResearchDelete(resultVO, request, user, rsId);
+ } catch (Exception e) {
+ resultVO.setResultCode(ResponseCode.FAILED.getCode());
+ resultVO.setResultMessage(e.getMessage());
+ }
+
+ System.out.println(
+ "\n--------------------------------------------------------------\n" +
+ request.getRequestURI() + " OUT:" +
+ "\n--------------------------------------------------------------\n" +
+ "resultVO.toString():" + "\n" +
+ resultVO.toString() + "\n" +
+ "\n--------------------------------------------------------------\n"
+ );
+
+ return resultVO;
+ }
+
+
+ @Operation(
+ summary = "내용 불러오기 API",
+ description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 저장된 항목을 불러오는 API",
+ tags = {"AdminStandardResearchController"}
+ )
+ @ApiResponses(value = {
+ @ApiResponse(responseCode = "200", description = "조회 성공")
+ })
+ @GetMapping(value = "/contents/standard-research/{rsId}")
+ public ResultVO contentsStandardResearchRead(
+ HttpServletRequest request,
+ @AuthenticationPrincipal LoginVO loginVO,
+ @PathVariable("rsId") Long rsId
+ ) throws Exception {
+
+ ResultVO resultVO = new ResultVO();
+
+ try {
+ resultVO = adminStandardResearchService.contentsStandardResearchRead(resultVO, request, loginVO, rsId);
+ } catch (Exception e) {
+ resultVO.setResultCode(ResponseCode.FAILED.getCode());
+ resultVO.setResultMessage(e.getMessage());
+ }
+
+
+ System.out.println(
+ "\n--------------------------------------------------------------\n" +
+ request.getRequestURI() + " OUT:" +
+ "\n--------------------------------------------------------------\n" +
+ "resultVO.toString():" + "\n" +
+ resultVO.toString() + "\n" +
+ "\n--------------------------------------------------------------\n"
+ );
+
+ return resultVO;
+ }
+
+
+
+
+}
\ No newline at end of file
diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/model/CreateStandardResearchVO.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/model/CreateStandardResearchVO.java
new file mode 100644
index 0000000..d745d39
--- /dev/null
+++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/model/CreateStandardResearchVO.java
@@ -0,0 +1,43 @@
+package com.dbnt.kcscbackend.admin.standardResearch.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@ApiModel(value = "CreateStandardResearchVO", description =
+ "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 글 작성하는 API에 사용된다." + ""
+)
+@RequiredArgsConstructor
+@Getter
+@Setter
+@ToString
+public class CreateStandardResearchVO implements Serializable {
+
+
+ private static final long serialVersionUID = 2635889608799075362L;
+
+ @ApiModelProperty(value = "title")
+ private String title;
+ @ApiModelProperty(value = "researchStartDate")
+ private String researchStartDate;
+ @ApiModelProperty(value = "researchEndDate")
+ private String researchEndDate;
+ @ApiModelProperty(value = "director")
+ private String director;
+ @ApiModelProperty(value = "purpose")
+ private String purpose;
+ @ApiModelProperty(value = "content")
+ private String content;
+ @ApiModelProperty(value = "effectContent")
+ private String effectContent;
+ /*
+ files: (binary)
+ files: (binary)
+ files: (binary)
+ */
+}
diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/model/TnResearchLightweight.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/model/TnResearchLightweight.java
new file mode 100644
index 0000000..d61f942
--- /dev/null
+++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/model/TnResearchLightweight.java
@@ -0,0 +1,68 @@
+package com.dbnt.kcscbackend.admin.standardResearch.model;
+
+import lombok.*;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Getter
+@Setter
+@Entity
+@NoArgsConstructor
+@DynamicInsert
+@DynamicUpdate
+@Table(name = "tn_research")
+public class TnResearchLightweight {
+
+ @Id
+ @Column(name = "rs_seq")
+ private Long rsSeq;
+
+ @Column(name = "rs_title")
+ private String rsTitle;
+
+ @Column(name = "rs_start_date")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime rsStartDate;
+
+ @Column(name = "rs_end_date")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime rsEndDate;
+
+ @Column(name = "rs_director")
+ private String rsDirector;
+
+ @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;
+
+
+ @Embeddable
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class TnResearchId implements Serializable {
+
+ private static final long serialVersionUID = 9042992093269088042L;
+
+ private String rsSeq;
+ }
+
+}
\ No newline at end of file
diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/model/UpdateStandardResearchVO.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/model/UpdateStandardResearchVO.java
new file mode 100644
index 0000000..7ad8905
--- /dev/null
+++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/model/UpdateStandardResearchVO.java
@@ -0,0 +1,45 @@
+package com.dbnt.kcscbackend.admin.standardResearch.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@ApiModel(value = "UpdateStandardResearchVO", description =
+ "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 글 수정하는 API에 사용된다." + ""
+)
+@RequiredArgsConstructor
+@Getter
+@Setter
+@ToString
+public class UpdateStandardResearchVO implements Serializable {
+
+
+ private static final long serialVersionUID = -2518477576804111511L;
+
+ @ApiModelProperty(value = "id")
+ private String id;
+ @ApiModelProperty(value = "title")
+ private String title;
+ @ApiModelProperty(value = "researchStartDate")
+ private String researchStartDate;
+ @ApiModelProperty(value = "researchEndDate")
+ private String researchEndDate;
+ @ApiModelProperty(value = "director")
+ private String director;
+ @ApiModelProperty(value = "purpose")
+ private String purpose;
+ @ApiModelProperty(value = "content")
+ private String content;
+ @ApiModelProperty(value = "effectContent")
+ private String effectContent;
+ /*
+ files: (binary)
+ files: (binary)
+ files: (binary)
+ */
+}
diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/repository/TnResearchRepositoryLightweight.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/repository/TnResearchRepositoryLightweight.java
new file mode 100644
index 0000000..e5ae1fa
--- /dev/null
+++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/repository/TnResearchRepositoryLightweight.java
@@ -0,0 +1,18 @@
+package com.dbnt.kcscbackend.admin.standardResearch.repository;
+
+import com.dbnt.kcscbackend.admin.standardResearch.model.TnResearchLightweight;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+
+public interface TnResearchRepositoryLightweight extends JpaRepository
{
+ @Query(value = "SELECT COUNT(1) FROM tn_research tr WHERE tr.use_yn = :use_yn", nativeQuery = true)
+ Long countByUseYn(@Param("use_yn") String useYn);
+
+ List findByUseYn( String useYn, Pageable pageable);
+
+}
diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/service/AdminStandardResearchService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/service/AdminStandardResearchService.java
new file mode 100644
index 0000000..09e842d
--- /dev/null
+++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/service/AdminStandardResearchService.java
@@ -0,0 +1,21 @@
+package com.dbnt.kcscbackend.admin.standardResearch.service;
+
+import com.dbnt.kcscbackend.admin.contents.popUp.model.CreatePopupVO;
+import com.dbnt.kcscbackend.admin.contents.popUp.model.UpdatePopupVO;
+import com.dbnt.kcscbackend.admin.standardResearch.model.CreateStandardResearchVO;
+import com.dbnt.kcscbackend.admin.standardResearch.model.UpdateStandardResearchVO;
+import com.dbnt.kcscbackend.auth.entity.LoginVO;
+import com.dbnt.kcscbackend.config.common.ResultVO;
+import org.springframework.data.domain.Pageable;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.servlet.http.HttpServletRequest;
+
+public interface AdminStandardResearchService {
+ public ResultVO contentsStandardResearchList(ResultVO resultVO, HttpServletRequest request, LoginVO user, Pageable pageable) throws Exception;
+ public ResultVO contentsStandardResearchCreate(ResultVO resultVO, HttpServletRequest request, LoginVO user, final MultipartHttpServletRequest multiRequest, CreateStandardResearchVO createStandardResearchVO) throws Exception;
+ public ResultVO contentsStandardResearchRead(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long popupId) throws Exception;
+ public ResultVO contentsStandardResearchUpdate(ResultVO resultVO, HttpServletRequest request, LoginVO user, UpdateStandardResearchVO updateStandardResearchVO, Long popupId) throws Exception;
+ public ResultVO contentsStandardResearchDelete(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long popupId) throws Exception;
+
+}
\ No newline at end of file
diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/service/impl/AdminStandardResearchServiceImpl.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/service/impl/AdminStandardResearchServiceImpl.java
new file mode 100644
index 0000000..6547cbc
--- /dev/null
+++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/service/impl/AdminStandardResearchServiceImpl.java
@@ -0,0 +1,253 @@
+package com.dbnt.kcscbackend.admin.standardResearch.service.impl;
+
+
+import com.dbnt.kcscbackend.admin.contents.popUp.model.CreatePopupVO;
+import com.dbnt.kcscbackend.admin.contents.popUp.model.FileVO;
+import com.dbnt.kcscbackend.admin.contents.popUp.model.UpdatePopupVO;
+import com.dbnt.kcscbackend.admin.contents.popUp.repository.TnPopupMngRepositoryWithoutPopupContents;
+import com.dbnt.kcscbackend.admin.contents.popUp.service.PopUpApiService;
+import com.dbnt.kcscbackend.admin.standardResearch.model.CreateStandardResearchVO;
+import com.dbnt.kcscbackend.admin.standardResearch.model.UpdateStandardResearchVO;
+import com.dbnt.kcscbackend.admin.standardResearch.repository.TnResearchRepositoryLightweight;
+import com.dbnt.kcscbackend.admin.standardResearch.service.AdminStandardResearchService;
+import com.dbnt.kcscbackend.auth.entity.LoginVO;
+import com.dbnt.kcscbackend.commonCode.entity.TnPopupMng;
+import com.dbnt.kcscbackend.commonCode.entity.TnResearch;
+import com.dbnt.kcscbackend.commonCode.repository.TnPopupMngRepository;
+import com.dbnt.kcscbackend.commonCode.repository.TnResearchRepository;
+import com.dbnt.kcscbackend.config.common.ResponseCode;
+import com.dbnt.kcscbackend.config.common.ResultVO;
+import lombok.RequiredArgsConstructor;
+import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
+import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.servlet.http.HttpServletRequest;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service("adminStandardResearchService")
+@RequiredArgsConstructor
+public class AdminStandardResearchServiceImpl extends EgovAbstractServiceImpl implements AdminStandardResearchService {
+
+ private final TnResearchRepository tnResearchRepository;
+ private final TnResearchRepositoryLightweight tnResearchRepositoryLightweight;
+
+
+ @Override
+ public ResultVO contentsStandardResearchList(ResultVO resultVO, HttpServletRequest request, LoginVO user, Pageable pageable) throws Exception {
+
+ System.out.println(
+ "\n--------------------------------------------------------------\n" +
+ request.getRequestURI() + " IN:" +
+ "\n--------------------------------------------------------------\n" +
+ "user.getEmail():" + "\n" +
+ user.getEmail() + "\n" +
+ "\n--------------------------------------------------------------\n"
+ );
+
+
+ long totalRecordCount = tnResearchRepositoryLightweight.countByUseYn("Y");
+ List