From 57d669cbdc6a7640897673f34ab59f9cbecdc033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Mon, 11 Mar 2024 17:29:45 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=84=A4=EB=AC=B8=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EC=9E=91=EC=97=85=EC=99=84=EB=A3=8C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/contents/survey/QuestionModal.jsx | 141 +++++++++++++++--- .../survey/AdminSurveyController.java | 15 +- .../repository/TnSurveyQtItemRepository.java | 1 + .../repository/TnSurveyQtRepository.java | 2 + .../survey/service/AdminSurveyService.java | 16 ++ 5 files changed, 155 insertions(+), 20 deletions(-) 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 3ef8bc8..f10df17 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 @@ -5,6 +5,7 @@ import Col from "react-bootstrap/Col"; import Form from "react-bootstrap/Form"; import Table from "react-bootstrap/Table"; import * as EgovNet from "api/egovFetch"; +import CODE from "../../../../constants/code"; function QuestionModal({svySeq}){ @@ -44,12 +45,54 @@ function QuestionModal({svySeq}){ setTempSeq(tempSeq+1); } - function addItem(){ + function qtOptionChange(target, value){ + const temp = {...selectedQt} + temp[target] = value; + setSelectedQt(temp); + } + function addItem(){ + const temp = {...selectedQt} + temp.itemList.push({ + qtItemSeq: null, + qtSeq:null, + itemNm: null, + questionYn:null + }) + setSelectedQt(temp); + } + + function removeQt(index){ + const temp = [...qtList] + temp.splice(index, 1); + setQtList(temp); + setSelectedQt(null) + } + + function removeItem(index){ + const temp = {...selectedQt} + temp.itemList.splice(index, 1) + setSelectedQt(temp) } function editSurveyQt(e){ - + EgovNet.requestFetch( + '/admin/survey/info-qt', + { + method: "PUT", + headers: { + 'Content-type': 'application/json' + }, + body: JSON.stringify(qtList) + }, + (resp) => { + if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { + alert("저장되었습니다.") + }else{ + alert(resp.resultMessage) + } + } + ) } useEffect(() => { @@ -60,16 +103,20 @@ function QuestionModal({svySeq}){ const tempQt = [...qtList]; tempQt.forEach(function (qt, index){ if(qt.qtSeq === null){ - if(qt.tempSeq === selectedQt.tempSeq){ - qt = selectedQt; + if(qt.tempSeq === selectedQt?.tempSeq){ + tempQt[index] = selectedQt; } - }else if(qt.qtSeq === selectedQt.qtSeq){ - qt = selectedQt; + }else if(qt.qtSeq === selectedQt?.qtSeq){ + tempQt[index] = selectedQt; } }) setQtList(tempQt); }, [selectedQt]); + useEffect(() => { + + }, [qtList]); + return ( <> @@ -79,17 +126,29 @@ function QuestionModal({svySeq}){ + + + + + - {qtList.map(qt=>{ + {qtList.map((qt, index)=>{ return ( - + setSelectedQt({...qt})}> + ); @@ -97,7 +156,7 @@ function QuestionModal({svySeq}){ - @@ -110,10 +169,38 @@ function QuestionModal({svySeq}){ 질문유형 - {setSelectedQt({...selectedQt, qtType:1})}}/> - {setSelectedQt({...selectedQt, qtType:2})}}/> - {setSelectedQt({...selectedQt, qtType:3})}}/> - {setSelectedQt({...selectedQt, qtType:4})}}/> + { + qtOptionChange("qtType", Number(e.target.value)); + }}/> + { + qtOptionChange("qtType", Number(e.target.value)); + }}/> + { + qtOptionChange("qtType", Number(e.target.value)); + }}/> + { + qtOptionChange("qtType", Number(e.target.value)); + }}/> + + + + + 설명 + + + { + qtOptionChange("qtDesc", e.target.value); + }}/> @@ -121,19 +208,32 @@ function QuestionModal({svySeq}){ 최대 선택 개수 - {setSelectedQt({...selectedQt, maxNo:e.target.value})}}/> + { + qtOptionChange("maxNo", e.target.value); + }}/> 기타 여부 - {setSelectedQt({...selectedQt, etcYn:e.target.checked?'Y':'N'})}}/> + { + qtOptionChange("etcYn", e.target.checked?'Y':'N'); + }}/> -
질문삭제
- {setSelectedQt(qt)}}/> + { + qt.qtTitle = e.target.value + setSelectedQt({...qt}) + }} /> + +
+
+
+ + + + + @@ -148,13 +248,16 @@ function QuestionModal({svySeq}){ setSelectedQt(qt); }}/> + ); })} - @@ -164,7 +267,7 @@ function QuestionModal({svySeq}){ - + ); 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 091f153..280f10b 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 @@ -1,6 +1,7 @@ package com.dbnt.kcscbackend.admin.contents.survey; import com.dbnt.kcscbackend.admin.contents.survey.entity.TnSurvey; +import com.dbnt.kcscbackend.admin.contents.survey.entity.TnSurveyQt; import com.dbnt.kcscbackend.admin.contents.survey.service.AdminSurveyService; import com.dbnt.kcscbackend.auth.entity.LoginVO; import com.dbnt.kcscbackend.config.common.ResponseCode; @@ -18,6 +19,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.util.HashMap; +import java.util.List; import java.util.Map; @RestController @@ -75,7 +77,7 @@ public class AdminSurveyController { } @RequestMapping(method = RequestMethod.GET, value = "/info-qt") - public ResultVO surveyEditQt(TnSurvey survey) throws Exception{ + public ResultVO surveyQt(TnSurvey survey) throws Exception{ ResultVO resultVO = new ResultVO(); Map resultMap = new HashMap<>(); @@ -83,4 +85,15 @@ public class AdminSurveyController { resultVO.setResult(resultMap); return resultVO; } + + @RequestMapping(method = RequestMethod.PUT, value = "/info-qt") + public ResultVO surveyQtEdit(@RequestBody List qtList, @AuthenticationPrincipal LoginVO user) throws Exception{ + ResultVO resultVO = new ResultVO(); + + adminSurveyService.insertSurveyQt(qtList, user.getId()); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage("저장 되었습니다."); + + return resultVO; + } } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/repository/TnSurveyQtItemRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/repository/TnSurveyQtItemRepository.java index fb2c308..418e7a5 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/repository/TnSurveyQtItemRepository.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/repository/TnSurveyQtItemRepository.java @@ -7,4 +7,5 @@ import java.util.List; public interface TnSurveyQtItemRepository extends JpaRepository { List findByQtSeqInOrderByQtItemSeq(List qtSeqList); + } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/repository/TnSurveyQtRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/repository/TnSurveyQtRepository.java index 72d38f2..5350879 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/repository/TnSurveyQtRepository.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/repository/TnSurveyQtRepository.java @@ -7,4 +7,6 @@ import java.util.List; public interface TnSurveyQtRepository extends JpaRepository { List findBySvySeqOrderByQtSeq(Integer svySeq); + + void deleteBySvySeq(Integer svySeq); } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/service/AdminSurveyService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/service/AdminSurveyService.java index 657e8c2..9bde9f1 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/service/AdminSurveyService.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/service/AdminSurveyService.java @@ -77,4 +77,20 @@ public class AdminSurveyService { public void deleteSurvey(Integer svySeq) { surveyRepository.deleteById(svySeq); } + + @Transactional + public void insertSurveyQt(List qtList, String id) { + qtRepository.deleteBySvySeq(qtList.get(0).getSvySeq()); + for(TnSurveyQt qt: qtList){ + qt.setQtSeq(null); + } + qtRepository.saveAll(qtList); + for(TnSurveyQt qt: qtList){ + for(TnSurveyQtItem item: qt.getItemList()){ + item.setQtSeq(qt.getQtSeq()); + } + itemRepository.saveAll(qt.getItemList()); + } + System.out.println(); + } } From 7933c125d5d06f77881068bb77accdb4ad028dd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Mon, 11 Mar 2024 17:51:40 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EC=84=A4=EB=AC=B8=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EC=A7=88=EB=AC=B8=EC=9D=98=20=EB=B3=B4=EA=B8=B0=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=97=90=20=EC=9D=91=EB=8B=B5=20=EC=BB=AC?= =?UTF-8?q?=EB=9F=BC=20=ED=91=9C=ED=98=84.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/admin/contents/survey/QuestionModal.jsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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 f10df17..e5af92b 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 @@ -57,7 +57,7 @@ function QuestionModal({svySeq}){ qtItemSeq: null, qtSeq:null, itemNm: null, - questionYn:null + questionYn:'Y' }) setSelectedQt(temp); } @@ -228,11 +228,13 @@ function QuestionModal({svySeq}){
보기삭제
+ +
+
+ + @@ -248,6 +250,15 @@ function QuestionModal({svySeq}){ setSelectedQt(qt); }}/> + From 33da2b2129ed31f0a09d3a88e88e644b751ba763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Tue, 12 Mar 2024 10:53:25 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=20=ED=95=B4=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/CustomUrlAuthenticationSuccessHandler.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomUrlAuthenticationSuccessHandler.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomUrlAuthenticationSuccessHandler.java index bf45b84..10dd07a 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomUrlAuthenticationSuccessHandler.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomUrlAuthenticationSuccessHandler.java @@ -63,7 +63,7 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati MediaType jsonMimeType = MediaType.APPLICATION_JSON; HashMap resultMap = new HashMap<>(); - if(securityUser.getUserId().equals("admin") && !adminIpList.contains(accessIp)){ + /*if(securityUser.getUserId().equals("admin") && !adminIpList.contains(accessIp)){ resultMap.put("resultCode", ResponseCode.FAILED.getCode()); resultMap.put("resultMessage", "관리자 계정은 지정된 아이피에서만 접속할 수 있습니다.\n필요한 경우 관리자에게 요청하십시오.\n접속자 아이피: "+ClientUtils.getRemoteIP(request)); }else{ @@ -74,8 +74,7 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati resultMap.put("refreshToken", refreshToken); //로그인 로그 기록 adminLogsService.insertLoginLog(securityUser.getUserId(), accessIp, accessToken, "Y", ClientUtils.getWebType(request)); - } -/* + }*/ // 로그인 제한 해제시 주석 해제 및 위 if문 주석처리 할 것. String accessToken = jwtTokenUtil.generateAccessToken(securityUser, request.getRemoteAddr()); String refreshToken = jwtTokenUtil.generateRefreshTokenToken(securityUser, request.getRemoteAddr()); @@ -83,7 +82,6 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati resultMap.put("accessToken", accessToken); resultMap.put("refreshToken", refreshToken); adminLogsService.insertLoginLog(securityUser.getUserId(), accessIp, accessToken, "Y", ClientUtils.getWebType(request)); -*/ if (jsonConverter.canWrite(resultMap.getClass(), jsonMimeType)) { jsonConverter.write(resultMap, jsonMimeType, new ServletServerHttpResponse(response)); From 100656b50faebae18271df095fea15caf3b90af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Tue, 12 Mar 2024 18:01:54 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EB=A9=94=EB=89=B4=EA=B6=8C=ED=95=9C?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=ED=91=9C=ED=98=84=EB=B0=A9=EC=8B=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD.=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=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 | 10 ++-- .../src/pages/admin/config/MenuAuthMgt.jsx | 49 ++++++++++--------- ...CustomUrlAuthenticationSuccessHandler.java | 8 ++- 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/css/page.css b/egovframe-template-simple-react-contribution/src/css/page.css index f6def02..29a13cb 100644 --- a/egovframe-template-simple-react-contribution/src/css/page.css +++ b/egovframe-template-simple-react-contribution/src/css/page.css @@ -182,14 +182,12 @@ .menuList .result .list_item > div:nth-child(5) {width: 100px;} /* 사이트관리 > 환경설정 > 메뉴권한관리 */ - .roleList .head > span:nth-child(1) {width: 120px;} - .roleList .head > span:nth-child(2) {width: 180px;} - .roleList .head > span:nth-child(3) {width: 120px;} + .roleList .head > span:nth-child(1) {width: 180px;} + .roleList .head > span:nth-child(2) {width: 120px;} .roleList .head .checkboxDiv {width: 60px;} .roleList .head .saveBtnDiv {width: 100px;} - .roleList .result .list_item > div:nth-child(1) {width: 120px;} - .roleList .result .list_item > div:nth-child(2) {width: 180px;} - .roleList .result .list_item > div:nth-child(3) {width: 120px;} + .roleList .result .list_item > div:nth-child(1) {width: 180px;} + .roleList .result .list_item > div:nth-child(2) {width: 120px;} .roleList .result .list_item .checkboxDiv {width: 60px;} .roleList .result .list_item .saveBtnDiv {width: 100px;} 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 727c93d..4d498a1 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 @@ -29,6 +29,7 @@ function MenuAuthMgt(props) { // 리스트 항목 구성 menuList.forEach(function (item, index) { const checkboxs = []; + roleList.forEach(function (role) { checkboxs.push(
@@ -44,12 +45,19 @@ function MenuAuthMgt(props) { defaultChecked={item.menuAuth.includes(role.itemCd)}/>
) + /*if(item.menuGroup){ + + }else{ + checkboxs.push( +
+ ) + }*/ }); + mutListTag.push(
-
{item.menuId}
+
{item.menuGroup?'└ ':''}{item.menuId}
{item.menuTitle}
-
{item.menuGroup}
{checkboxs}
@@ -73,27 +81,25 @@ function MenuAuthMgt(props) { },[]); function editMenu(menu){ - if(window.confirm("수정하시겠습니까?")) { - EgovNet.requestFetch( - '/admin/config/menu-auth-mgt', - { - method: "PUT", - headers: { - 'Content-type': 'application/json' - }, - body: JSON.stringify(menu) + EgovNet.requestFetch( + '/admin/config/menu-auth-mgt', + { + method: "PUT", + headers: { + 'Content-type': 'application/json' }, - (resp) => { - if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { - alert("수정되었습니다.") - } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { - console.log("토큰 갱신중.") - } else { - alert(resp.result.resultMessage) - } + body: JSON.stringify(menu) + }, + (resp) => { + if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { + alert("수정되었습니다.") + } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { + console.log("토큰 갱신중.") + } else { + alert(resp.result.resultMessage) } - ) - } + } + ) } useEffect(()=>{ @@ -126,7 +132,6 @@ function MenuAuthMgt(props) {
메뉴 코드 메뉴 이름 - 부모 메뉴 {roleHeader}
diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomUrlAuthenticationSuccessHandler.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomUrlAuthenticationSuccessHandler.java index 10dd07a..c2fe3e8 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomUrlAuthenticationSuccessHandler.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomUrlAuthenticationSuccessHandler.java @@ -63,7 +63,9 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati MediaType jsonMimeType = MediaType.APPLICATION_JSON; HashMap resultMap = new HashMap<>(); - /*if(securityUser.getUserId().equals("admin") && !adminIpList.contains(accessIp)){ + /* + // 관리자 계정 로그인 제한 if문 + if(securityUser.getUserId().equals("admin") && !adminIpList.contains(accessIp)){ resultMap.put("resultCode", ResponseCode.FAILED.getCode()); resultMap.put("resultMessage", "관리자 계정은 지정된 아이피에서만 접속할 수 있습니다.\n필요한 경우 관리자에게 요청하십시오.\n접속자 아이피: "+ClientUtils.getRemoteIP(request)); }else{ @@ -75,7 +77,8 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati //로그인 로그 기록 adminLogsService.insertLoginLog(securityUser.getUserId(), accessIp, accessToken, "Y", ClientUtils.getWebType(request)); }*/ - // 로그인 제한 해제시 주석 해제 및 위 if문 주석처리 할 것. + + // 관리자 로그인 제한 해제 위 if문 주석처리 할 것. String accessToken = jwtTokenUtil.generateAccessToken(securityUser, request.getRemoteAddr()); String refreshToken = jwtTokenUtil.generateRefreshTokenToken(securityUser, request.getRemoteAddr()); resultMap.put("resultCode", ResponseCode.SUCCESS.getCode()); @@ -83,6 +86,7 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati resultMap.put("refreshToken", refreshToken); adminLogsService.insertLoginLog(securityUser.getUserId(), accessIp, accessToken, "Y", ClientUtils.getWebType(request)); + if (jsonConverter.canWrite(resultMap.getClass(), jsonMimeType)) { jsonConverter.write(resultMap, jsonMimeType, new ServletServerHttpResponse(response)); }
보기응답 삭제
+ { + const qt = {...selectedQt} + qt.itemList[index].questionYn = e.target.checked?'Y':'N' + setSelectedQt(qt); + }}/> +