From 24314253627df580aa539d77c9c2652a64d812c9 Mon Sep 17 00:00:00 2001 From: thkim Date: Fri, 26 Jan 2024 09:27:56 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20?= =?UTF-8?q?=EC=BB=A8=ED=85=90=EC=B8=A0=EA=B4=80=EB=A6=AC=20-=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=EA=B8=B0=EC=A4=80=EC=97=B0=EA=B5=AC=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EB=AA=A9=EB=A1=9D=20=EA=B5=AC=ED=98=84=20back-end?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdminStandardResearchController.java | 240 ++++++++++++++++ .../model/CreateStandardResearchVO.java | 43 +++ .../model/TnResearchLightweight.java | 68 +++++ .../model/UpdateStandardResearchVO.java | 45 +++ .../TnResearchRepositoryLightweight.java | 8 + .../service/AdminStandardResearchService.java | 21 ++ .../AdminStandardResearchServiceImpl.java | 269 ++++++++++++++++++ .../commonCode/entity/TnResearch.java | 77 +++++ .../repository/TnResearchRepository.java | 102 +++++++ 9 files changed, 873 insertions(+) create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/AdminStandardResearchController.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/model/CreateStandardResearchVO.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/model/TnResearchLightweight.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/model/UpdateStandardResearchVO.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/repository/TnResearchRepositoryLightweight.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/service/AdminStandardResearchService.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/service/impl/AdminStandardResearchServiceImpl.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/entity/TnResearch.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnResearchRepository.java 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..98effd2 --- /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 = {"PopUpApiController"} + ) + @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 = {"PopUpApiController"} + ) + @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 = {"PopUpApiController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "등록 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"), + }) + @PutMapping(value = "/contents/standard-research/{popupId}") + public ResultVO contentsStandardResearchUpdate( + HttpServletRequest request, + @AuthenticationPrincipal LoginVO loginVO, + UpdateStandardResearchVO updateStandardResearchVO, + @PathVariable("popupId") Long popupId + ) throws Exception { + + ResultVO resultVO = new ResultVO(); + + try { + resultVO = adminStandardResearchService.contentsStandardResearchUpdate(resultVO, request, loginVO, updateStandardResearchVO, popupId); + } 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 = {"PopUpApiController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "등록 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"), + }) + @DeleteMapping(value = "/contents/standard-research/{popupId}") + public ResultVO contentsStandardResearchDelete + ( + @AuthenticationPrincipal LoginVO user, + HttpServletRequest request, + @PathVariable("popupId") String strPopupId + ) throws Exception { + + ResultVO resultVO = new ResultVO(); + Long popupId = Long.valueOf(strPopupId); + try { + resultVO = adminStandardResearchService.contentsStandardResearchDelete(resultVO, request, user, popupId); + } 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 = {"PopUpApiController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공") + }) + @GetMapping(value = "/contents/standard-research/{popupId}") + public ResultVO contentsStandardResearchRead( + HttpServletRequest request, + @AuthenticationPrincipal LoginVO loginVO, + @PathVariable("popupId") Long popupId + ) throws Exception { + + ResultVO resultVO = new ResultVO(); + + try { + resultVO = adminStandardResearchService.contentsStandardResearchRead(resultVO, request, loginVO, popupId); + } 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..d8db62c --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/repository/TnResearchRepositoryLightweight.java @@ -0,0 +1,8 @@ +package com.dbnt.kcscbackend.admin.standardResearch.repository; + +import com.dbnt.kcscbackend.admin.standardResearch.model.TnResearchLightweight; +import org.springframework.data.jpa.repository.JpaRepository; + + +public interface TnResearchRepositoryLightweight extends JpaRepository { +} 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..bf278b1 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/service/impl/AdminStandardResearchServiceImpl.java @@ -0,0 +1,269 @@ +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.count(); + List> list = tnResearchRepositoryLightweight.findAll(pageable) + .stream() + .map(item -> { + Map codeMap = new HashMap<>(); + codeMap.put("id", item.getRsSeq()); + codeMap.put("title", item.getRsTitle()); + codeMap.put("researchStartDate", item.getRsStartDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + codeMap.put("researchEndDate", item.getRsEndDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + codeMap.put("director", item.getRsDirector()); + codeMap.put("createDate", item.getFrstCrtDt()); + codeMap.put("createUserId", item.getFrstCrtId()); + codeMap.put("updateDate", item.getLastChgDt()); + codeMap.put("updateUserId", item.getLastChgId()); + codeMap.put("useYn", item.getUseYn()); + return codeMap; + }) + .collect(Collectors.toList()); + + + PaginationInfo paginationInfo = new PaginationInfo(); + paginationInfo.setCurrentPageNo(pageable.getPageNumber()+1); + paginationInfo.setRecordCountPerPage(pageable.getPageSize()); + paginationInfo.setPageSize(5);//hard coded + paginationInfo.setTotalRecordCount((int) totalRecordCount); + + Map dto = new HashMap(); + dto.put("list", list); + dto.put("paginationInfo", paginationInfo); + resultVO.setResult(dto); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); + + return resultVO; + } + + + + + + @Override + public ResultVO contentsStandardResearchCreate(ResultVO resultVO, HttpServletRequest request, LoginVO user, final MultipartHttpServletRequest multiRequest, CreateStandardResearchVO createStandardResearchVO) throws Exception { + + System.out.println( + "\n--------------------------------------------------------------\n" + + request.getRequestURI() + " IN:" + + "\n--------------------------------------------------------------\n" + + "user.getEmail():" + "\n" + + user.getEmail() + "\n" + + "\n--------------------------------------------------------------\n" + ); + + // 첨부파일 관련 첨부파일ID 생성 + List _result = null; + String _atchFileId = ""; + + final Map files = multiRequest.getFileMap(); + + if (!files.isEmpty()) { + //_atchFileId = fileMngService.insertFileInfs(_result); //파일이 생성되고나면 생성된 첨부파일 ID를 리턴한다. + } + + Map response = tnResearchRepository.spAddTnResearch( + createStandardResearchVO.getTitle(), + createStandardResearchVO.getResearchStartDate(), + createStandardResearchVO.getResearchEndDate(), + createStandardResearchVO.getDirector(), + createStandardResearchVO.getPurpose(), + createStandardResearchVO.getContent(), + createStandardResearchVO.getEffectContent(), + "kcsc_admin", + null, + null, + null + ); + + + Map dto = new HashMap(); + + resultVO.setResult(dto); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); + + return resultVO; + } + + + @Override + public ResultVO contentsStandardResearchRead(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long rsId) throws Exception { + + System.out.println( + "\n--------------------------------------------------------------\n" + + request.getRequestURI() + " IN:" + + "\n--------------------------------------------------------------\n" + + "user.getEmail():" + "\n" + + user.getEmail() + "\n" + + "rsId:" + "\n" + + rsId + "\n" + + "\n--------------------------------------------------------------\n" + ); + + + TnResearch tnResearch = tnResearchRepository.findByRsSeq(rsId); + + + Map dto = new HashMap(); + dto.put("content", tnResearch.getRsContents()); + dto.put("createDate", tnResearch.getFrstCrtDt().plusHours(9).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 날짜/시간의 시작 일시 - yyyyMMddHHmmss + dto.put("createUserId", tnResearch.getFrstCrtId()); + dto.put("director", tnResearch.getRsDirector()); + dto.put("effectContent", tnResearch.getRsEffect()); + dto.put("id", tnResearch.getRsSeq()); + dto.put("purpose", tnResearch.getRsPurpose()); + dto.put("researchEndDate", tnResearch.getRsEndDate().plusHours(9).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 날짜/시간의 시작 일시 - yyyyMMddHHmmss + dto.put("researchStartDate", tnResearch.getRsStartDate().plusHours(9).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 날짜/시간의 종료 일시 - yyyyMMddHHmmss + dto.put("title", tnResearch.getRsTitle()); + dto.put("updateDate", tnResearch.getLastChgDt().plusHours(9).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 날짜/시간의 종료 일시 - yyyyMMddHHmmss + dto.put("updateUserId", tnResearch.getLastChgId()); + dto.put("useYn", tnResearch.getUseYn()); + + + + + + resultVO.setResult(dto); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); + + return resultVO; + } + + @Override + public ResultVO contentsStandardResearchUpdate(ResultVO resultVO, HttpServletRequest request, LoginVO user, UpdateStandardResearchVO updateStandardResearchVO, Long rsId) throws Exception { + System.out.println( + "\n--------------------------------------------------------------\n" + + request.getRequestURI() + " IN:" + + "\n--------------------------------------------------------------\n" + + "updateStandardResearchVO:" + "\n" + + updateStandardResearchVO.toString() + "\n" + + "rsId:" + "\n" + + rsId + "\n" + + "\n--------------------------------------------------------------\n" + ); + + if( Long.parseLong(updateStandardResearchVO.getResearchStartDate()) > Long.parseLong(updateStandardResearchVO.getResearchEndDate()) ) { + throw new Exception("종료일시는 시작일시보다 앞 설 수 없습니다."); + } + + Map response = tnResearchRepository.spUpdateTnResearch( + rsId.intValue(), + updateStandardResearchVO.getResearchStartDate(), + updateStandardResearchVO.getResearchEndDate(), + updateStandardResearchVO.getDirector(), + updateStandardResearchVO.getPurpose(), + updateStandardResearchVO.getContent(), + updateStandardResearchVO.getEffectContent(), + "kcsc_admin", + null, + null, + null + ); + + + Map dto = new HashMap(); + dto.put("errorMessage", response.get("_error_message") ); + dto.put("rsId", rsId); + + resultVO.setResult(dto); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); + + return resultVO; + } + + + @Override + public ResultVO contentsStandardResearchDelete(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long rsId) throws Exception { + System.out.println( + "\n--------------------------------------------------------------\n" + + request.getRequestURI() + " IN:" + + "\n--------------------------------------------------------------\n" + + "rsId:" + "\n" + + rsId + "\n" + + "\n--------------------------------------------------------------\n" + ); + + + + + + Map dto = new HashMap(); + + Map response = tnResearchRepository.spDeleteTnResearch( + rsId.intValue(), + "admin", + null, + null, + null + ); + dto.put("errorMessage", response.get("_error_message") ); + + + dto.put("rsId", rsId ); + + resultVO.setResult(dto); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); + + return resultVO; + } + + +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/entity/TnResearch.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/entity/TnResearch.java new file mode 100644 index 0000000..8681b34 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/entity/TnResearch.java @@ -0,0 +1,77 @@ +package com.dbnt.kcscbackend.commonCode.entity; + +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 TnResearch { + + @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 = "rs_purpose") + private String rsPurpose; + + @Column(name = "rs_contents") + private String rsContents; + + @Column(name = "rs_effect") + private String rsEffect; + + @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/commonCode/repository/TnResearchRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnResearchRepository.java new file mode 100644 index 0000000..24b3538 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnResearchRepository.java @@ -0,0 +1,102 @@ +package com.dbnt.kcscbackend.commonCode.repository; + +import com.dbnt.kcscbackend.commonCode.entity.TnResearch; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.jpa.repository.query.Procedure; +import org.springframework.data.repository.query.Param; + +import java.util.Map; + + +public interface TnResearchRepository extends JpaRepository { + + @Query(value = "CALL sp_add_tn_research (" + + ":_rs_title, " + + "TO_TIMESTAMP(" + + " :_rs_start_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + "TO_TIMESTAMP(" + + " :_rs_end_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + ":_rs_director, " + + ":_rs_purpose, " + + ":_rs_contents, " + + ":_rs_effect, " + + ":_modi_id, " + + ":_result_count, " + + ":_result_code, " + + ":_error_message)", + nativeQuery = true) + Map spAddTnResearch( + @Param("_rs_title") String rsTitle, + @Param("_rs_start_date") String rsStartDate, + @Param("_rs_end_date") String rsEndDate, + @Param("_rs_director") String rsDirector, + @Param("_rs_purpose") String rsPurpose, + @Param("_rs_contents") String rsContents, + @Param("_rs_effect") String rsEffect, + @Param("_modi_id") String modiId, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage + ); + + + @Query(value = "CALL sp_update_tn_research (" + + ":_rs_seq, " + + "TO_TIMESTAMP(" + + " :_rs_start_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + "TO_TIMESTAMP(" + + " :_rs_end_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + ":_rs_director, " + + ":_rs_purpose, " + + ":_rs_contents, " + + ":_rs_effect, " + + ":_modi_id, " + + ":_result_count, " + + ":_result_code, " + + ":_error_message)", + nativeQuery = true) + Map spUpdateTnResearch( + @Param("_rs_seq") Integer rsSeq, + @Param("_rs_start_date") String rsStartDate, + @Param("_rs_end_date") String rsEndDate, + @Param("_rs_director") String rsDirector, + @Param("_rs_purpose") String rsPurpose, + @Param("_rs_contents") String rsContents, + @Param("_rs_effect") String rsEffect, + @Param("_modi_id") String modiId, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage + ); + + + @Query(value = "CALL sp_delete_tn_research (" + + ":_rs_seq, " + + ":_modi_id, " + + ":_result_count, " + + ":_result_code, " + + ":_error_message)", + nativeQuery = true) + Map spDeleteTnResearch( + @Param("_rs_seq") Integer rsSeq, + @Param("_modi_id") String modiId, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage + ); + + + + TnResearch findByRsSeq(Long rsSeq); + + +} From e2e4c075b7cc7034e0c05e67590ab4c8d6f9624c Mon Sep 17 00:00:00 2001 From: thkim Date: Fri, 26 Jan 2024 09:28:20 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20?= =?UTF-8?q?=EC=BB=A8=ED=85=90=EC=B8=A0=EA=B4=80=EB=A6=AC=20-=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=EA=B8=B0=EC=A4=80=EC=97=B0=EA=B5=AC=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EB=AA=A9=EB=A1=9D=20=EA=B5=AC=ED=98=84=20front-end?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{PopupWriter.jsx => PopupEditor.jsx} | 4 +- .../pages/admin/contents/StandardResearch.jsx | 124 +++++- .../StandardResearchEditor.jsx | 376 ++++++++++++++++++ .../src/routes/index.jsx | 2 +- 4 files changed, 497 insertions(+), 9 deletions(-) rename egovframe-template-simple-react-contribution/src/pages/admin/contents/PopUp/{PopupWriter.jsx => PopupEditor.jsx} (99%) create mode 100644 egovframe-template-simple-react-contribution/src/pages/admin/contents/StandardResearch/StandardResearchEditor.jsx 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..026a33f 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 @@ -28,7 +28,7 @@ const StyledDiv = styled.div` `; -function PopupWriter(props) { +function PopupEditor(props) { const navigate = useNavigate(); const location = useLocation(); @@ -373,4 +373,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..fb24312 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, popupId) => { + const checked = e.target.checked; + const requestURL = `/contents/api/popup-manage/activation-switch/${popupId}?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..5e1c30b --- /dev/null +++ b/egovframe-template-simple-react-contribution/src/pages/admin/contents/StandardResearch/StandardResearchEditor.jsx @@ -0,0 +1,376 @@ +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; + } + + .board_btn_area { + + margin-top: 70px; + } + +`; + +function StandardResearchEditor(props) { + + const navigate = useNavigate(); + const location = useLocation(); + + const [modeInfo, setModeInfo] = useState({ mode: props.mode }); + const [text, setText] = useState(""); + const [textOriginal, setTextOriginal] = useState(""); + const [popupDetail, setPopupDetail] = useState({ startDate: new Date(), endDate: new Date() }); + + const [schdulBgndeHH, setSchdulBgndeHH] = useState(); + const [schdulBgndeMM, setSchdulBgndeMM] = useState(); + const [schdulEnddeHH, setSchdulEnddeHH] = useState(); + const [schdulEnddeMM, setSchdulEnddeMM] = useState(); + const [boardAttachFiles, setBoardAttachFiles] = useState(); + + 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('contents') === null || formData.get('contents') === "") { + alert("내용은 필수 값입니다."); + return false; + } + return true; + } + + const initMode = () => { + + // props.mode 값이 없으면 에러가 발생한다. + switch (props.mode) { + case CODE.MODE_CREATE: + setModeInfo({ + ...modeInfo, + modeTitle: "등록", + method : "POST", + editURL: '/contents/api/popup-manage' + }); + break; + case CODE.MODE_MODIFY: + setModeInfo({ + ...modeInfo, + modeTitle: "수정", + method : "PUT", + editURL: '/contents/api/popup-manage' + }); + break; + default: + navigate({pathname: URL.ERROR}, {state: {msg : ""}}); + } + retrieveDetail(); + } + + const retrieveDetail = () => { + + if (modeInfo.mode === CODE.MODE_CREATE) {// 조회/등록이면 조회 안함 + return; + } + + const retrieveDetailURL = `/contents/api/popup-manage/${location.state?.popupId}`; + const requestOptions = { + method: "GET", + headers: { + 'Content-type': 'application/json' + } + } + EgovNet.requestFetch(retrieveDetailURL, + requestOptions, + function (resp) { + let rawDetail = resp.result; + //기본값 설정 + setPopupDetail({ + ...popupDetail, + ...rawDetail, + startDate: convertDate(rawDetail.schdulBgnde), + endDate: convertDate(rawDetail.schdulEndde), + }); + setText(rawDetail.contents); + setTextOriginal(rawDetail.contents); + } + ); + } + + + + const createPopup = () => { + const formData = new FormData(); + + for (let key in popupDetail) { + if ( key === 'startDate' ) { + formData.append(key, getDateFourteenDigit( popupDetail[key] )); + } else if( key === 'endDate' ) { + formData.append(key, getDateFourteenDigit( popupDetail[key] )); + } else { + formData.append(key, popupDetail[key]); + } + } + + //게시글 내용 + formData.delete("contents"); + formData.append("contents", text); + + 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__POP_UP }); + } 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?.popupId}`}}); + } + + } + + } + + const onClickDelete = (popupId) => { + const deleteBoardURL = `/contents/api/popup-manage/${popupId}`; + + 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__POP_UP ,{ 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__POP_UP ,{ replace: true }); + }; + if( text !== textOriginal ) { + 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 ( +
+
+ {/* */} + + {/* */} + +
+ {/* */} + + {/* */} + +
+ {/* */} + +
+

팝업 추가

+
+ {/* */} +
+
+
필수
+
+ setPopupDetail({ ...popupDetail, title: e.target.value })} + /> +
+
+
+
기간필수
+
+ + { + console.log("setStartDate : ", date); + setPopupDetail({ ...popupDetail, schdulBgnde: getDateFourteenDigit(date), schdulBgndeYYYMMDD: getYYYYMMDD(date), schdulBgndeHH: date.getHours(), schdulBgndeMM: date.getMinutes(), startDate: date }); + setSchdulBgndeHH(date.getHours()); + setSchdulBgndeMM(date.getMinutes()); + }} /> + + + ~ + + + { + console.log("setEndDate: ", date); + setPopupDetail({ ...popupDetail, schdulEndde: getDateFourteenDigit(date), schdulEnddeYYYMMDD: getYYYYMMDD(date), schdulEnddeHH: date.getHours(), schdulEnddeMM: date.getMinutes(), endDate: date }); + setSchdulEnddeHH(date.getHours()); + setSchdulEnddeMM(date.getMinutes()); + } + } /> + + + +
+
+ { + console.log("====>>> Changed attachfile file = ", attachfile); + const arrayConcat = { ...popupDetail}; // 기존 단일 파일 업로드에서 다중파일 객체 추가로 변환(아래 for문으로) + for ( let i = 0; i < attachfile.length; i++) { + arrayConcat[`file_${i}`] = attachfile[i]; + } + setPopupDetail(arrayConcat); + }} + fnDeleteFile={(deletedFile) => { + console.log("====>>> Delete deletedFile = ", deletedFile); + setBoardAttachFiles(deletedFile); + }} + boardFiles={boardAttachFiles} + mode={props.mode} /> +
+ {/* */} + + {/* */} + + {/* */} + + {/* */} +
+
+ + {modeInfo.mode === CODE.MODE_MODIFY && + + } +
+
+ +
+
+ {/* */} + + +
+ {/* */} +
+
+
+
+ ); +} + + +export default StandardResearchEditor; \ No newline at end of file diff --git a/egovframe-template-simple-react-contribution/src/routes/index.jsx b/egovframe-template-simple-react-contribution/src/routes/index.jsx index 27837f7..a821863 100644 --- a/egovframe-template-simple-react-contribution/src/routes/index.jsx +++ b/egovframe-template-simple-react-contribution/src/routes/index.jsx @@ -91,7 +91,7 @@ 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 AdminContentsPopUpWriter from 'pages/admin/contents/PopUp/PopupEditor'; // 관리자 - 컨텐츠 관리/팝업 관리/팝업 추가 또는 수정 import AdminContentsStandardResearch from 'pages/admin/contents/StandardResearch'; // 관리자 - 컨텐츠 관리/건설기준연구 관리 import AdminContentsTextMessages from 'pages/admin/contents/TextMessages'; // 관리자 - 컨텐츠 관리/문자 발송 From 8797ad9570c351a4469d95644de5e0503f485a98 Mon Sep 17 00:00:00 2001 From: thkim Date: Fri, 26 Jan 2024 11:32:29 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20?= =?UTF-8?q?=EC=BB=A8=ED=85=90=EC=B8=A0=EA=B4=80=EB=A6=AC=20-=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=EA=B8=B0=EC=A4=80=EC=97=B0=EA=B5=AC=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=97=90=EC=84=9C=20=EC=88=98=EC=A0=95=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20back-end?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdminStandardResearchController.java | 46 +++++++++---------- .../AdminStandardResearchServiceImpl.java | 15 ++---- .../repository/TnResearchRepository.java | 16 +++---- 3 files changed, 34 insertions(+), 43 deletions(-) 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 index 98effd2..f2ecfd9 100644 --- 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 @@ -39,7 +39,7 @@ public class AdminStandardResearchController { @Operation( summary = "'건설기준연구 관리' 페이지에서 목록 불러오는 API", description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 목록 불러오는 API", - tags = {"PopUpApiController"} + tags = {"AdminStandardResearchController"} ) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "조회 성공"), @@ -76,9 +76,9 @@ public class AdminStandardResearchController { @Operation( - summary = "팝업 추가 API", - description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 팝업을 추가하는 API", - tags = {"PopUpApiController"} + summary = "추가 API", + description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 항목을 추가하는 API", + tags = {"AdminStandardResearchController"} ) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "등록 성공"), @@ -118,26 +118,26 @@ public class AdminStandardResearchController { @Operation( - summary = "팝업 수정 API", - description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 팝업을 수정하는 API", - tags = {"PopUpApiController"} + summary = "수정 API", + description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 항목을 수정하는 API", + tags = {"AdminStandardResearchController"} ) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "등록 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"), }) - @PutMapping(value = "/contents/standard-research/{popupId}") + @PutMapping(value = "/contents/standard-research/{rsId}") public ResultVO contentsStandardResearchUpdate( HttpServletRequest request, @AuthenticationPrincipal LoginVO loginVO, UpdateStandardResearchVO updateStandardResearchVO, - @PathVariable("popupId") Long popupId + @PathVariable("rsId") Long rsId ) throws Exception { ResultVO resultVO = new ResultVO(); try { - resultVO = adminStandardResearchService.contentsStandardResearchUpdate(resultVO, request, loginVO, updateStandardResearchVO, popupId); + resultVO = adminStandardResearchService.contentsStandardResearchUpdate(resultVO, request, loginVO, updateStandardResearchVO, rsId); } catch (Exception e) { resultVO.setResultCode(ResponseCode.FAILED.getCode()); resultVO.setResultMessage(e.getMessage()); @@ -159,26 +159,26 @@ public class AdminStandardResearchController { @Operation( - summary = "팝업 비활성화 API", - description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 팝업을 비활성화 API. 삭제가 아닌 비활성화 임. 삭제는 없음.", - tags = {"PopUpApiController"} + summary = "삭제 API", + description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 항목을 삭제하는 API", + tags = {"AdminStandardResearchController"} ) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "등록 성공"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"), }) - @DeleteMapping(value = "/contents/standard-research/{popupId}") + @DeleteMapping(value = "/contents/standard-research/{rsId}") public ResultVO contentsStandardResearchDelete ( @AuthenticationPrincipal LoginVO user, HttpServletRequest request, - @PathVariable("popupId") String strPopupId + @PathVariable("rsId") String strPopupId ) throws Exception { ResultVO resultVO = new ResultVO(); - Long popupId = Long.valueOf(strPopupId); + Long rsId = Long.valueOf(strPopupId); try { - resultVO = adminStandardResearchService.contentsStandardResearchDelete(resultVO, request, user, popupId); + resultVO = adminStandardResearchService.contentsStandardResearchDelete(resultVO, request, user, rsId); } catch (Exception e) { resultVO.setResultCode(ResponseCode.FAILED.getCode()); resultVO.setResultMessage(e.getMessage()); @@ -198,24 +198,24 @@ public class AdminStandardResearchController { @Operation( - summary = "팝업 내용 불러오기 API", - description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 저장된 팝업을 불러오는 API", - tags = {"PopUpApiController"} + summary = "내용 불러오기 API", + description = "관리자 단에서 '컨텐츠 관리' > '건설기준연구 관리' 페이지에서 저장된 항목을 불러오는 API", + tags = {"AdminStandardResearchController"} ) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "조회 성공") }) - @GetMapping(value = "/contents/standard-research/{popupId}") + @GetMapping(value = "/contents/standard-research/{rsId}") public ResultVO contentsStandardResearchRead( HttpServletRequest request, @AuthenticationPrincipal LoginVO loginVO, - @PathVariable("popupId") Long popupId + @PathVariable("rsId") Long rsId ) throws Exception { ResultVO resultVO = new ResultVO(); try { - resultVO = adminStandardResearchService.contentsStandardResearchRead(resultVO, request, loginVO, popupId); + resultVO = adminStandardResearchService.contentsStandardResearchRead(resultVO, request, loginVO, rsId); } catch (Exception e) { resultVO.setResultCode(ResponseCode.FAILED.getCode()); resultVO.setResultMessage(e.getMessage()); 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 index bf278b1..1ba4b3a 100644 --- 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 @@ -106,15 +106,6 @@ public class AdminStandardResearchServiceImpl extends EgovAbstractServiceImpl im "\n--------------------------------------------------------------\n" ); - // 첨부파일 관련 첨부파일ID 생성 - List _result = null; - String _atchFileId = ""; - - final Map files = multiRequest.getFileMap(); - - if (!files.isEmpty()) { - //_atchFileId = fileMngService.insertFileInfs(_result); //파일이 생성되고나면 생성된 첨부파일 ID를 리턴한다. - } Map response = tnResearchRepository.spAddTnResearch( createStandardResearchVO.getTitle(), @@ -167,10 +158,10 @@ public class AdminStandardResearchServiceImpl extends EgovAbstractServiceImpl im dto.put("effectContent", tnResearch.getRsEffect()); dto.put("id", tnResearch.getRsSeq()); dto.put("purpose", tnResearch.getRsPurpose()); - dto.put("researchEndDate", tnResearch.getRsEndDate().plusHours(9).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 날짜/시간의 시작 일시 - yyyyMMddHHmmss - dto.put("researchStartDate", tnResearch.getRsStartDate().plusHours(9).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 날짜/시간의 종료 일시 - yyyyMMddHHmmss + dto.put("researchEndDate", tnResearch.getRsEndDate().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 날짜/시간의 시작 일시 - yyyyMMddHHmmss + dto.put("researchStartDate", tnResearch.getRsStartDate().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 날짜/시간의 종료 일시 - yyyyMMddHHmmss dto.put("title", tnResearch.getRsTitle()); - dto.put("updateDate", tnResearch.getLastChgDt().plusHours(9).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 날짜/시간의 종료 일시 - yyyyMMddHHmmss + dto.put("updateDate", tnResearch.getLastChgDt()); // 날짜/시간의 종료 일시 - yyyyMMddHHmmss dto.put("updateUserId", tnResearch.getLastChgId()); dto.put("useYn", tnResearch.getUseYn()); diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnResearchRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnResearchRepository.java index 24b3538..7b55d37 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnResearchRepository.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnResearchRepository.java @@ -13,14 +13,14 @@ public interface TnResearchRepository extends JpaRepository { @Query(value = "CALL sp_add_tn_research (" + ":_rs_title, " + - "TO_TIMESTAMP(" + + "TO_DATE(" + " :_rs_start_date," + " 'YYYYMMDDHH24MISS'" + - ")::::timestamptz AT TIME ZONE 'UTC', " + - "TO_TIMESTAMP(" + + "), " + + "TO_DATE(" + " :_rs_end_date," + " 'YYYYMMDDHH24MISS'" + - ")::::timestamptz AT TIME ZONE 'UTC', " + + "), " + ":_rs_director, " + ":_rs_purpose, " + ":_rs_contents, " + @@ -47,14 +47,14 @@ public interface TnResearchRepository extends JpaRepository { @Query(value = "CALL sp_update_tn_research (" + ":_rs_seq, " + - "TO_TIMESTAMP(" + + "TO_DATE(" + " :_rs_start_date," + " 'YYYYMMDDHH24MISS'" + - ")::::timestamptz AT TIME ZONE 'UTC', " + - "TO_TIMESTAMP(" + + "), " + + "TO_DATE(" + " :_rs_end_date," + " 'YYYYMMDDHH24MISS'" + - ")::::timestamptz AT TIME ZONE 'UTC', " + + "), " + ":_rs_director, " + ":_rs_purpose, " + ":_rs_contents, " + From d9f223960a79bb21d76b3bcda61d6139eb1899f7 Mon Sep 17 00:00:00 2001 From: thkim Date: Fri, 26 Jan 2024 11:32:59 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20?= =?UTF-8?q?=EC=BB=A8=ED=85=90=EC=B8=A0=EA=B4=80=EB=A6=AC=20-=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=EA=B8=B0=EC=A4=80=EC=97=B0=EA=B5=AC=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=97=90=EC=84=9C=20=EC=88=98=EC=A0=95=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20front-end?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/editor/RichTextEditor.js | 2 +- .../src/constants/url.js | 14 +- .../admin/contents/PopUp/PopupEditor.jsx | 4 - .../pages/admin/contents/StandardResearch.jsx | 8 +- .../StandardResearchEditor.jsx | 200 +++++++++++------- .../src/routes/index.jsx | 17 +- 6 files changed, 141 insertions(+), 104 deletions(-) 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 d36fd9e..7fbb159 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/PopupEditor.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/contents/PopUp/PopupEditor.jsx index 026a33f..05460a2 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/contents/PopUp/PopupEditor.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/contents/PopUp/PopupEditor.jsx @@ -21,10 +21,6 @@ const StyledDiv = styled.div` margin-bottom: 30px; } - .board_btn_area { - - margin-top: 70px; - } `; 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 fb24312..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 @@ -55,9 +55,9 @@ function StandardResearch(props) { } - const onChangeActivationSwitch = (e, popupId) => { + const onChangeActivationSwitch = (e, rsId) => { const checked = e.target.checked; - const requestURL = `/contents/api/popup-manage/activation-switch/${popupId}?checked=${checked}`; + const requestURL = `/contents/api/popup-manage/activation-switch/${rsId}?checked=${checked}`; const requestOptions = { method: "PUT", @@ -114,7 +114,7 @@ function StandardResearch(props) { {/* */}
- 글 작성 + 글 작성
{/* */} @@ -135,7 +135,7 @@ function StandardResearch(props) { {list.map((it)=>(
{it.id}
-
{it.title}
+
{it.title}
{it.researchStartDate} ~ {it.researchEndDate}
{it.director}
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 index 5e1c30b..7dacc1c 100644 --- 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 @@ -21,9 +21,20 @@ const StyledDiv = styled.div` margin-bottom: 30px; } - .board_btn_area { - - margin-top: 70px; + .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; + } } `; @@ -34,16 +45,16 @@ function StandardResearchEditor(props) { const location = useLocation(); const [modeInfo, setModeInfo] = useState({ mode: props.mode }); - const [text, setText] = useState(""); - const [textOriginal, setTextOriginal] = useState(""); - const [popupDetail, setPopupDetail] = useState({ startDate: new Date(), endDate: new Date() }); + 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 [schdulBgndeHH, setSchdulBgndeHH] = useState(); - const [schdulBgndeMM, setSchdulBgndeMM] = useState(); - const [schdulEnddeHH, setSchdulEnddeHH] = useState(); - const [schdulEnddeMM, setSchdulEnddeMM] = useState(); - const [boardAttachFiles, setBoardAttachFiles] = useState(); + + const [standardResearchDetail, setStandardResearchDetail] = useState({ researchStartDate: new Date(), researchEndDate: new Date() }); const [confirm, setConfirm] = React.useState(); @@ -55,7 +66,7 @@ function StandardResearchEditor(props) { const formValidator = (formData) => { if (formData.get('title') === null || formData.get('title') === "") { - alert("제목은 필수 값입니다."); + alert("연구명은 필수 값입니다."); return false; } @@ -63,8 +74,24 @@ function StandardResearchEditor(props) { alert("종료일시는 시작일시보다 앞 설 수 없습니다."); return false; } - if (formData.get('contents') === null || formData.get('contents') === "") { - alert("내용은 필수 값입니다."); + + 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; @@ -79,7 +106,7 @@ function StandardResearchEditor(props) { ...modeInfo, modeTitle: "등록", method : "POST", - editURL: '/contents/api/popup-manage' + editURL: '/contents/standard-research' }); break; case CODE.MODE_MODIFY: @@ -87,7 +114,7 @@ function StandardResearchEditor(props) { ...modeInfo, modeTitle: "수정", method : "PUT", - editURL: '/contents/api/popup-manage' + editURL: '/contents/standard-research' }); break; default: @@ -102,7 +129,7 @@ function StandardResearchEditor(props) { return; } - const retrieveDetailURL = `/contents/api/popup-manage/${location.state?.popupId}`; + const retrieveDetailURL = `/contents/standard-research/${location.state?.rsId}`; const requestOptions = { method: "GET", headers: { @@ -114,36 +141,49 @@ function StandardResearchEditor(props) { function (resp) { let rawDetail = resp.result; //기본값 설정 - setPopupDetail({ - ...popupDetail, + setStandardResearchDetail({ + ...standardResearchDetail, ...rawDetail, - startDate: convertDate(rawDetail.schdulBgnde), - endDate: convertDate(rawDetail.schdulEndde), + researchStartDate: convertDate(rawDetail.researchStartDate), + researchEndDate: convertDate(rawDetail.researchEndDate), }); - setText(rawDetail.contents); - setTextOriginal(rawDetail.contents); + setPurpose(rawDetail.purpose); + setPurposeOriginal(rawDetail.purpose); + setContent(rawDetail.content); + setContentOriginal(rawDetail.content); + setEffectContent(rawDetail.effectContent); + setEffectContentOriginal(rawDetail.effectContent); } ); } - const createPopup = () => { + const createItem = () => { const formData = new FormData(); - for (let key in popupDetail) { - if ( key === 'startDate' ) { - formData.append(key, getDateFourteenDigit( popupDetail[key] )); - } else if( key === 'endDate' ) { - formData.append(key, getDateFourteenDigit( popupDetail[key] )); + 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, popupDetail[key]); + formData.append(key, standardResearchDetail[key]); } } - //게시글 내용 - formData.delete("contents"); - formData.append("contents", text); + //연구 목적 + 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 = { @@ -159,7 +199,7 @@ function StandardResearchEditor(props) { if (modeInfo.mode === CODE.MODE_MODIFY) { alert("게시글이 수정 되었습니다."); } - navigate({ pathname: URL.ADMIN__CONTENTS__POP_UP }); + navigate({ pathname: URL.ADMIN__CONTENTS__STANDARDS_RESEARCH }); } else { navigate({pathname: URL.ERROR}, {state: {msg : resp.resultMessage}}); } @@ -171,15 +211,15 @@ function StandardResearchEditor(props) { 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?.popupId}`}}); + setConfirm({...confirm, open: true, body: "수정하시겠습니까?", yesCallback: requestTask, yesCallbackParams: {requestUrl:`${modeInfo.editURL}/${location.state?.rsId}`}}); } } } - const onClickDelete = (popupId) => { - const deleteBoardURL = `/contents/api/popup-manage/${popupId}`; + const onClickDelete = (rsId) => { + const deleteBoardURL = `/contents/standard-research/${rsId}`; const requestOptions = { method: "DELETE", @@ -210,7 +250,12 @@ function StandardResearchEditor(props) { const requestTask = () => { navigate(URL.ADMIN__CONTENTS__POP_UP ,{ replace: true }); }; - if( text !== textOriginal ) { + + 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(); @@ -245,7 +290,7 @@ function StandardResearchEditor(props) {
  • Home
  • 사이트 관리
  • 컨텐츠 관리
  • -
  • 팝업 관리
  • +
  • 건설기준연구 관리
  • ) @@ -267,91 +312,82 @@ function StandardResearchEditor(props) { {/* */}
    -

    팝업 추가

    +

    건설기준연구 추가

    {/* */}
    -
    필수
    +
    필수
    - setPopupDetail({ ...popupDetail, title: e.target.value })} + setStandardResearchDetail({ ...standardResearchDetail, title: e.target.value })} />
    -
    기간필수
    +
    연구 기간필수
    { console.log("setStartDate : ", date); - setPopupDetail({ ...popupDetail, schdulBgnde: getDateFourteenDigit(date), schdulBgndeYYYMMDD: getYYYYMMDD(date), schdulBgndeHH: date.getHours(), schdulBgndeMM: date.getMinutes(), startDate: date }); - setSchdulBgndeHH(date.getHours()); - setSchdulBgndeMM(date.getMinutes()); + setStandardResearchDetail({ ...standardResearchDetail, schdulBgnde: getDateFourteenDigit(date), schdulBgndeYYYMMDD: getYYYYMMDD(date), researchStartDate: date }); }} /> - - ~ { console.log("setEndDate: ", date); - setPopupDetail({ ...popupDetail, schdulEndde: getDateFourteenDigit(date), schdulEnddeYYYMMDD: getYYYYMMDD(date), schdulEnddeHH: date.getHours(), schdulEnddeMM: date.getMinutes(), endDate: date }); - setSchdulEnddeHH(date.getHours()); - setSchdulEnddeMM(date.getMinutes()); + setStandardResearchDetail({ ...standardResearchDetail, schdulEndde: getDateFourteenDigit(date), schdulEnddeYYYMMDD: getYYYYMMDD(date), researchEndDate: date }); } } /> - -
    - { - console.log("====>>> Changed attachfile file = ", attachfile); - const arrayConcat = { ...popupDetail}; // 기존 단일 파일 업로드에서 다중파일 객체 추가로 변환(아래 for문으로) - for ( let i = 0; i < attachfile.length; i++) { - arrayConcat[`file_${i}`] = attachfile[i]; - } - setPopupDetail(arrayConcat); - }} - fnDeleteFile={(deletedFile) => { - console.log("====>>> Delete deletedFile = ", deletedFile); - setBoardAttachFiles(deletedFile); - }} - boardFiles={boardAttachFiles} - mode={props.mode} /> +
    +
    필수
    +
    + setStandardResearchDetail({ ...standardResearchDetail, director: e.target.value })} + /> +
    +
    {/* */} {/* */} - + + + + + + + + {/* */} {/* */}
    {modeInfo.mode === CODE.MODE_MODIFY && }
    diff --git a/egovframe-template-simple-react-contribution/src/routes/index.jsx b/egovframe-template-simple-react-contribution/src/routes/index.jsx index a821863..a087981 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/PopupEditor'; // 관리자 - 컨텐츠 관리/팝업 관리/팝업 추가 또는 수정 -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 = () => { {/* 관리자 - 컨텐츠 관리 */} } /> } /> - } /> - } /> + } /> + } /> } /> + } /> + } /> } /> {/* 관리자 - 위원회 관리 */} From bcaf14dfc3f0062f8df2a1a0502c44c32eac5482 Mon Sep 17 00:00:00 2001 From: thkim Date: Fri, 26 Jan 2024 13:18:12 +0900 Subject: [PATCH 5/7] =?UTF-8?q?feat:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20?= =?UTF-8?q?=EC=BB=A8=ED=85=90=EC=B8=A0=EA=B4=80=EB=A6=AC=20-=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=EA=B8=B0=EC=A4=80=EC=97=B0=EA=B5=AC=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=97=90=EC=84=9C=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20back-end?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdminStandardResearchController.java | 4 ++-- .../TnResearchRepositoryLightweight.java | 10 ++++++++ .../AdminStandardResearchServiceImpl.java | 23 +++++++------------ 3 files changed, 20 insertions(+), 17 deletions(-) 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 index f2ecfd9..b56428e 100644 --- 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 @@ -172,11 +172,11 @@ public class AdminStandardResearchController { ( @AuthenticationPrincipal LoginVO user, HttpServletRequest request, - @PathVariable("rsId") String strPopupId + @PathVariable("rsId") String strRsId ) throws Exception { ResultVO resultVO = new ResultVO(); - Long rsId = Long.valueOf(strPopupId); + Long rsId = Long.valueOf(strRsId); try { resultVO = adminStandardResearchService.contentsStandardResearchDelete(resultVO, request, user, rsId); } catch (Exception e) { 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 index d8db62c..e5ae1fa 100644 --- 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 @@ -1,8 +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/impl/AdminStandardResearchServiceImpl.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standardResearch/service/impl/AdminStandardResearchServiceImpl.java index 1ba4b3a..6547cbc 100644 --- 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 @@ -54,8 +54,8 @@ public class AdminStandardResearchServiceImpl extends EgovAbstractServiceImpl im ); - long totalRecordCount = tnResearchRepositoryLightweight.count(); - List> list = tnResearchRepositoryLightweight.findAll(pageable) + long totalRecordCount = tnResearchRepositoryLightweight.countByUseYn("Y"); + List> list = tnResearchRepositoryLightweight.findByUseYn("Y", pageable) .stream() .map(item -> { Map codeMap = new HashMap<>(); @@ -64,11 +64,11 @@ public class AdminStandardResearchServiceImpl extends EgovAbstractServiceImpl im codeMap.put("researchStartDate", item.getRsStartDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); codeMap.put("researchEndDate", item.getRsEndDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); codeMap.put("director", item.getRsDirector()); - codeMap.put("createDate", item.getFrstCrtDt()); - codeMap.put("createUserId", item.getFrstCrtId()); - codeMap.put("updateDate", item.getLastChgDt()); - codeMap.put("updateUserId", item.getLastChgId()); - codeMap.put("useYn", item.getUseYn()); + //codeMap.put("createDate", item.getFrstCrtDt()); + //codeMap.put("createUserId", item.getFrstCrtId()); + //codeMap.put("updateDate", item.getLastChgDt()); + //codeMap.put("updateUserId", item.getLastChgId()); + //codeMap.put("useYn", item.getUseYn()); return codeMap; }) .collect(Collectors.toList()); @@ -165,10 +165,6 @@ public class AdminStandardResearchServiceImpl extends EgovAbstractServiceImpl im dto.put("updateUserId", tnResearch.getLastChgId()); dto.put("useYn", tnResearch.getUseYn()); - - - - resultVO.setResult(dto); resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); @@ -222,6 +218,7 @@ public class AdminStandardResearchServiceImpl extends EgovAbstractServiceImpl im @Override public ResultVO contentsStandardResearchDelete(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long rsId) throws Exception { + System.out.println( "\n--------------------------------------------------------------\n" + request.getRequestURI() + " IN:" + @@ -231,10 +228,6 @@ public class AdminStandardResearchServiceImpl extends EgovAbstractServiceImpl im "\n--------------------------------------------------------------\n" ); - - - - Map dto = new HashMap(); Map response = tnResearchRepository.spDeleteTnResearch( From 5d87831386a314466bd8802f22d62e53d4f4b186 Mon Sep 17 00:00:00 2001 From: thkim Date: Fri, 26 Jan 2024 13:18:37 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20?= =?UTF-8?q?=EC=BB=A8=ED=85=90=EC=B8=A0=EA=B4=80=EB=A6=AC=20-=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=EA=B8=B0=EC=A4=80=EC=97=B0=EA=B5=AC=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=97=90=EC=84=9C=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20front-end?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contents/StandardResearch/StandardResearchEditor.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 index 7dacc1c..3cee0f3 100644 --- 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 @@ -234,7 +234,7 @@ function StandardResearchEditor(props) { (resp) => { if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { alert("삭제 되었습니다."); - navigate(URL.ADMIN__CONTENTS__POP_UP ,{ replace: true }); + navigate(URL.ADMIN__CONTENTS__STANDARDS_RESEARCH ,{ replace: true }); } else { navigate({pathname: URL.ERROR}, {state: {msg : resp.resultMessage}}); } @@ -248,7 +248,7 @@ function StandardResearchEditor(props) { const onClickList = (e) => { const requestTask = () => { - navigate(URL.ADMIN__CONTENTS__POP_UP ,{ replace: true }); + navigate(URL.ADMIN__CONTENTS__STANDARDS_RESEARCH ,{ replace: true }); }; if( purpose !== purposeOriginal ) { From d42accff75a11bc174ae3e4a762a94868df31d38 Mon Sep 17 00:00:00 2001 From: "Lim\\jun" Date: Fri, 26 Jan 2024 13:50:34 +0900 Subject: [PATCH 7/7] =?UTF-8?q?API=20Key=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/admin/standards/ApiKeys.jsx | 224 ++++++++++++++++-- .../standards/AdminStandardsController.java | 108 +++++++++ .../admin/standards/entity/TnApiKey.java | 41 ++++ .../repository/ApiKeyRepository.java | 19 ++ .../standards/service/AdminApiService.java | 47 ++++ 5 files changed, 421 insertions(+), 18 deletions(-) create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/AdminStandardsController.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/entity/TnApiKey.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/repository/ApiKeyRepository.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/service/AdminApiService.java 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/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 new file mode 100644 index 0000000..d0dc80c --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/AdminStandardsController.java @@ -0,0 +1,108 @@ +package com.dbnt.kcscbackend.admin.standards; + +import com.dbnt.kcscbackend.admin.standards.entity.TnApiKey; +import com.dbnt.kcscbackend.admin.standards.service.AdminApiService; +import com.dbnt.kcscbackend.auth.entity.LoginVO; +import com.dbnt.kcscbackend.config.common.BaseController; +import com.dbnt.kcscbackend.config.common.ResponseCode; +import com.dbnt.kcscbackend.config.common.ResultVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/admin/standards") +@Tag(name="AdminStandardsController", description = "사이트관리 건설기준관리 메뉴 컨트롤러") +public class AdminStandardsController extends BaseController { + + private final AdminApiService adminApiService; + + @Operation( + summary = "건설기준관리 - API 관리", + description = "API 관리", + tags = {"AdminStandardsController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.POST, value = "/apikey", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO selectApiList(@RequestBody TnApiKey tnApiKey, @AuthenticationPrincipal LoginVO user) + throws Exception { + + ResultVO resultVO = new ResultVO(); + tnApiKey.setQueryInfo(); + Map resultMap = adminApiService.selectApiList(); + int totCnt = Integer.parseInt((String)resultMap.get("resultCnt")); + tnApiKey.setContentCnt(totCnt); + tnApiKey.setPaginationInfo(); + resultMap.put("paginationInfo", tnApiKey); + + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); + resultVO.setResult(resultMap); + return resultVO; + } + + @Operation( + summary = "API key 관리", + description = "API key 승인여부 수정", + tags = {"AdminStandardsController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "수정 성공"), + @ApiResponse(responseCode = "303", description = "만료된 토큰"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.POST, value = "/apiupdate", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO modifyApi(@RequestBody TnApiKey tnApiKey, @AuthenticationPrincipal LoginVO user) throws Exception{ + ResultVO resultVO = new ResultVO(); + + TnApiKey existingApiKey = adminApiService.getApiKeyById(tnApiKey.getUserId()); + if (existingApiKey != null) { + existingApiKey.setIdntyYn(existingApiKey.getIdntyYn().equals("Y") ? "N" : "Y"); + adminApiService.modifyApi(existingApiKey); + + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + } else { + resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); // 존재하지 않는 user_id에 대한 처리 + } + return resultVO; + } + + @Operation( + summary = "API key Chart", + description = "API key 클릭시 차트", + tags = {"AdminStandardsController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "수정 성공"), + @ApiResponse(responseCode = "303", description = "만료된 토큰"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.POST, value = "/apiDailyChart", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO ApiChart(@RequestBody Map dateRange, @AuthenticationPrincipal LoginVO user) throws Exception{ + ResultVO resultVO = new ResultVO(); + Map resultMap = new HashMap<>(); + + String UserId = dateRange.get("userId"); + + resultMap.put("resultList", adminApiService.selectApiDailyCount(UserId)); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); + resultVO.setResult(resultMap); + return resultVO; + } +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/entity/TnApiKey.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/entity/TnApiKey.java new file mode 100644 index 0000000..f565c6f --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/entity/TnApiKey.java @@ -0,0 +1,41 @@ +package com.dbnt.kcscbackend.admin.standards.entity; + +import com.dbnt.kcscbackend.config.common.BoardParams; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.*; +import java.time.LocalDate; + +@Getter +@Setter +@Accessors(chain = true) +@Entity +@NoArgsConstructor +@DynamicInsert +@DynamicUpdate +@Table(name = "tn_api_key") +public class TnApiKey extends BoardParams { + @Id + @Column(name = "user_id") + private String userId; + + @Column(name = "api_key") + private String apiKey; + + @Column(name = "idnty_yn") + private String idntyYn; + + @Column(name = "start_dt") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate startDt; + + @Column(name = "end_dt") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate endDt; +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/repository/ApiKeyRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/repository/ApiKeyRepository.java new file mode 100644 index 0000000..cbfcb18 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/repository/ApiKeyRepository.java @@ -0,0 +1,19 @@ +package com.dbnt.kcscbackend.admin.standards.repository; + +import com.dbnt.kcscbackend.admin.standards.entity.TnApiKey; +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 ApiKeyRepository extends JpaRepository { + List findAllByOrderByEndDtDesc(); + + @Query(value = "SELECT TO_CHAR(access_dt, 'YYYY-MM-DD') as log_dt, count(1) as log_cnt " + + "FROM th_api_log " + + "WHERE access_id = :UserId " + + "GROUP BY TO_CHAR(access_dt, 'YYYY-MM-DD') " + + "ORDER BY log_dt asc", nativeQuery = true) + List selectCountApiDaily(@Param("UserId") String UserId); +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/service/AdminApiService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/service/AdminApiService.java new file mode 100644 index 0000000..e736724 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/standards/service/AdminApiService.java @@ -0,0 +1,47 @@ +package com.dbnt.kcscbackend.admin.standards.service; + +import com.dbnt.kcscbackend.admin.standards.entity.TnApiKey; +import com.dbnt.kcscbackend.admin.standards.repository.ApiKeyRepository; +import lombok.RequiredArgsConstructor; +import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class AdminApiService extends EgovAbstractServiceImpl { + private final ApiKeyRepository apiKeyRepository; + + public Map selectApiList() { + Map resultMap = new HashMap<>(); + + long totalRecordCount = apiKeyRepository.count(); // 전체 레코드 수 가져오기 + List apiList = apiKeyRepository.findAllByOrderByEndDtDesc(); // 개인 정보 로그 리스트 가져오기 + + resultMap.put("resultCnt", String.valueOf(totalRecordCount)); // 개수를 resultMap에 추가 + resultMap.put("resultList", apiList); // 결과를 resultMap에 추가 + + return resultMap; + } + + public TnApiKey getApiKeyById(String userId) { return apiKeyRepository.findById(userId).orElse(null); } + + @Transactional + public String modifyApi(TnApiKey tnApiKey) { + try { + apiKeyRepository.save(tnApiKey); + return "API key updated successfully"; + } catch (Exception e) { + return "Failed to update API key"; + } + } + + public List selectApiDailyCount(String UserId) { + return apiKeyRepository.selectCountApiDaily(UserId); + } // 일자별 API 요청횟수 + +}