From b879df804a52b6bfe7cbe648f898370771e4283f Mon Sep 17 00:00:00 2001 From: Kurt92 Date: Tue, 11 Nov 2025 17:57:27 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20TotalInfo=20=EC=9E=91=EC=97=85?= =?UTF-8?q?=EC=A4=91.=201.=20=EA=B6=8C=ED=95=9C=20=EB=B0=8F=20=EC=82=AC?= =?UTF-8?q?=EC=A7=84=20=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=EB=A5=BC=20?= =?UTF-8?q?=EC=84=B8=EC=85=98=EC=97=90=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=202.=20?= =?UTF-8?q?=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EC=97=86=EC=9D=B4=20?= =?UTF-8?q?=EC=82=AC=EC=A7=84=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/EgovConfigInterceptor.java | 9 +- .../config/JPAConf/JPAConfig.java | 7 + .../interceptor/AuthInterceptor.java | 11 + .../init/controller/MinwonInitController.java | 2 +- .../controller/TotalInfoController.java | 34 +- .../project/system/common/model/PagingVO.java | 2 +- .../project/system/login/model/SessionVO.java | 3 + .../WEB-INF/views/biz/minwon/init/init.jsp | 33 +- .../views/biz/totalInfo/totalInfo_popup.jsp | 52 ++- .../WEB-INF/views/layouts/popup/default.jsp | 1 + src/main/webapp/resources/css/cc.css | 359 ++++++++++++++++++ src/main/webapp/resources/xit/xit-popup.css | 296 --------------- 12 files changed, 478 insertions(+), 331 deletions(-) create mode 100644 src/main/webapp/resources/css/cc.css diff --git a/src/main/java/egovframework/config/EgovConfigInterceptor.java b/src/main/java/egovframework/config/EgovConfigInterceptor.java index 85bf4b8..6674eb0 100644 --- a/src/main/java/egovframework/config/EgovConfigInterceptor.java +++ b/src/main/java/egovframework/config/EgovConfigInterceptor.java @@ -2,6 +2,8 @@ package egovframework.config; import egovframework.configProperties.InterceptorProperties; import egovframework.interceptor.AuthInterceptor; +import go.kr.project.domain.entity.CpSetinfo; +import go.kr.project.domain.repo.cp.CpSetinfoRepository; import go.kr.project.system.login.service.LoginService; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; @@ -17,6 +19,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; public class EgovConfigInterceptor implements WebMvcConfigurer { private final LoginService loginService; + private final CpSetinfoRepository cpSetinfoRepository; private final InterceptorProperties interceptorProperties; @@ -27,8 +30,8 @@ public class EgovConfigInterceptor implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authInterceptor()) -// .addPathPatterns("/**") // 모든 경로에 적용 - .addPathPatterns("/__disabled__/**") // 인터셉터 미적용 임시 우회 + .addPathPatterns("/**") // 모든 경로에 적용 +// .addPathPatterns("/__disabled__/**") // 인터셉터 미적용 임시 우회 .excludePathPatterns(interceptorProperties.getInterceptorExclude()); // 접근 제어 예외 URL 패턴 제외 } @@ -38,6 +41,6 @@ public class EgovConfigInterceptor implements WebMvcConfigurer { */ @Bean public AuthInterceptor authInterceptor() { - return new AuthInterceptor(loginService); + return new AuthInterceptor(loginService, cpSetinfoRepository); } } \ No newline at end of file diff --git a/src/main/java/egovframework/config/JPAConf/JPAConfig.java b/src/main/java/egovframework/config/JPAConf/JPAConfig.java index a2b2594..d4b7aba 100644 --- a/src/main/java/egovframework/config/JPAConf/JPAConfig.java +++ b/src/main/java/egovframework/config/JPAConf/JPAConfig.java @@ -3,10 +3,12 @@ package egovframework.config.JPAConf; import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.JpaVendorAdapter; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; import javax.persistence.PersistenceContext; @Configuration @@ -20,6 +22,11 @@ public class JPAConfig { return new JPAQueryFactory(em); } + @Bean(name = "transactionManager") + public JpaTransactionManager transactionManager(EntityManagerFactory emf) { + return new JpaTransactionManager(emf); + } + // @Bean // public JpaVendorAdapter jpaVendorAdapter() { // HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); diff --git a/src/main/java/egovframework/interceptor/AuthInterceptor.java b/src/main/java/egovframework/interceptor/AuthInterceptor.java index ca86781..bbc5f50 100644 --- a/src/main/java/egovframework/interceptor/AuthInterceptor.java +++ b/src/main/java/egovframework/interceptor/AuthInterceptor.java @@ -8,6 +8,8 @@ import egovframework.filter.XssUtil; import egovframework.util.ApiResponseEntity; import egovframework.util.HttpServletUtil; import egovframework.constant.SessionConstants; +import go.kr.project.domain.entity.CpSetinfoId; +import go.kr.project.domain.repo.cp.CpSetinfoRepository; import go.kr.project.system.login.mapper.LoginMapper; import go.kr.project.system.login.model.SessionVO; import go.kr.project.system.login.model.UserSessionVO; @@ -47,6 +49,9 @@ public class AuthInterceptor implements HandlerInterceptor { private final LoginService loginService; + // 세션에 업로드 경로를 담아놓기 위한 setinfo 인젝션 + private final CpSetinfoRepository cpSetinfoRepository; + // URL 패턴 매칭을 위한 AntPathMatcher private final AntPathMatcher pathMatcher = new AntPathMatcher(); @@ -137,6 +142,8 @@ public class AuthInterceptor implements HandlerInterceptor { userSessionVO.setLastAccessDttm(LocalDateTime.now()); loginMapper.updateUserSession(userSessionVO); log.debug("세션 정보 업데이트 (동시 접속 제한): {}", sessionId); + + } } } @@ -187,6 +194,10 @@ public class AuthInterceptor implements HandlerInterceptor { // 로그인 상태인 경우 접근 권한 확인 if (hasAccess(sessionVO, requestURI)) { + //여기서 사진 업로드 패스를 세션에 저장하면 좋을듯. + cpSetinfoRepository.findById(new CpSetinfoId("WORKER", "INFO", "LOCAL")) + .ifPresent(info -> sessionVO.setImgPath(info.getStrValue5())); + log.info(sessionVO.getImgPath()); return true; } diff --git a/src/main/java/go/kr/project/biz/minwon/init/controller/MinwonInitController.java b/src/main/java/go/kr/project/biz/minwon/init/controller/MinwonInitController.java index 863f5a8..1bdb24e 100644 --- a/src/main/java/go/kr/project/biz/minwon/init/controller/MinwonInitController.java +++ b/src/main/java/go/kr/project/biz/minwon/init/controller/MinwonInitController.java @@ -42,7 +42,7 @@ public class MinwonInitController { dto.setTotalCount(totalCount); // 페이징 처리를 위한 설정 - dto.setPagingYn("Y"); + dto.setPagingYn("N"); // 리스트 조회 List result = minwonInitService.findInitAnswers(dto); diff --git a/src/main/java/go/kr/project/biz/totalInfo/controller/TotalInfoController.java b/src/main/java/go/kr/project/biz/totalInfo/controller/TotalInfoController.java index fa283a2..bdb51a8 100644 --- a/src/main/java/go/kr/project/biz/totalInfo/controller/TotalInfoController.java +++ b/src/main/java/go/kr/project/biz/totalInfo/controller/TotalInfoController.java @@ -1,14 +1,26 @@ package go.kr.project.biz.totalInfo.controller; +import egovframework.constant.SessionConstants; import egovframework.constant.TilesConstants; import egovframework.util.ApiResponseUtil; import go.kr.project.biz.totalInfo.model.TotalInfoDto; import go.kr.project.biz.totalInfo.service.TotalInfoService; +import go.kr.project.system.login.model.SessionVO; import lombok.RequiredArgsConstructor; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import javax.mail.Session; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + @Controller @RequiredArgsConstructor public class TotalInfoController { @@ -16,8 +28,7 @@ public class TotalInfoController { private final TotalInfoService totalInfoService; @GetMapping("/total/info.do") - public String totalInfoViewPopup(){ - + public String totalInfoViewPopup(HttpSession session){ return "biz/totalInfo/totalInfo_popup" + TilesConstants.POPUP; } @@ -31,5 +42,24 @@ public class TotalInfoController { } + @GetMapping("/images/{fileName}") + public ResponseEntity getImage(@PathVariable String fileName, HttpSession session) throws IOException { + + SessionVO sessionVO = (SessionVO) session.getAttribute(SessionConstants.SESSION_KEY); + String basePath = sessionVO.getImgPath(); + String ssgCode = fileName.substring(0, 5); + String year = fileName.substring(5, 9); + Path path = Paths.get(basePath, ssgCode, year, fileName); + if (!Files.exists(path)) return ResponseEntity.notFound().build(); + + Resource resource = new UrlResource(path.toUri()); + String contentType = Files.probeContentType(path); + if (contentType == null) contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE; + + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType(contentType)) + .body(resource); + } + } diff --git a/src/main/java/go/kr/project/system/common/model/PagingVO.java b/src/main/java/go/kr/project/system/common/model/PagingVO.java index 0900408..ee5f49a 100644 --- a/src/main/java/go/kr/project/system/common/model/PagingVO.java +++ b/src/main/java/go/kr/project/system/common/model/PagingVO.java @@ -35,7 +35,7 @@ public class PagingVO extends DefaultVO { private Integer totalPages; /** 기본 페이지당 항목 수 */ - private static final int DEFAULT_PER_PAGE = 10; + private static final int DEFAULT_PER_PAGE = 30; /** * 페이징 처리를 위한 시작 인덱스와 끝 인덱스를 계산합니다. diff --git a/src/main/java/go/kr/project/system/login/model/SessionVO.java b/src/main/java/go/kr/project/system/login/model/SessionVO.java index b9d50f9..a81b4e1 100644 --- a/src/main/java/go/kr/project/system/login/model/SessionVO.java +++ b/src/main/java/go/kr/project/system/login/model/SessionVO.java @@ -58,4 +58,7 @@ public class SessionVO implements Serializable { // 마지막 접근 시간 private long lastAccessedTime; + + //이미지 경로 + private String imgPath; } \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/biz/minwon/init/init.jsp b/src/main/webapp/WEB-INF/views/biz/minwon/init/init.jsp index 5dd4d2d..cb93fb7 100644 --- a/src/main/webapp/WEB-INF/views/biz/minwon/init/init.jsp +++ b/src/main/webapp/WEB-INF/views/biz/minwon/init/init.jsp @@ -11,7 +11,6 @@ -
    @@ -49,8 +48,8 @@
  • / Pages
  • @@ -123,7 +122,7 @@ // 그리드 설정 객체 생성 var gridConfig = new XitTuiGridConfig(); - // 기본 설정 + // 기본 설정w gridConfig.setOptDataSource(dataSource); // 데이터소스 연결 gridConfig.setOptGridId('grid'); // 그리드를 출력할 Element ID gridConfig.setOptGridHeight(390); // 그리드 높이(단위: px) @@ -132,34 +131,38 @@ // 페이징 옵션 설정 gridConfig.setOptPageOptions({ - useClient: false, // 클라이언트 페이징 여부(false: 서버 페이징) + useClient: true, // 클라이언트 페이징 여부(false: 서버 페이징) perPage: perPage // 페이지당 표시 건수 }); - gridConfig.setOptUseClientSort(false); // 서버사이드 정렬 false + gridConfig.setOptUseClientSort(true); // 서버사이드 정렬 false // 컬럼 정보 설정 gridConfig.setOptColumns([ { header: '등록구분', name: 'mmIngb', + sortable: true, width: 50, align: 'center' }, { header: '목록번호', name: 'asBbsNo', + sortable: true, width: 70, align: 'center' }, { header: '신고자', name: 'mmSgnm', + sortable: true, width: 100, align: 'center' }, { header: '담당자', name: 'mmSgtel', + sortable: true, width: 100, align: 'center' }, @@ -172,18 +175,21 @@ { header: '접수일자', name: 'asJsdate', + sortable: true, width: 70, align: 'center' }, { header: '처리기한', name: 'asLimitDt', + sortable: true, width: 70, align: 'center' }, { header: '위반일자', name: 'mmDate', + sortable: true, width: 150, align: 'center' }, @@ -208,18 +214,21 @@ { header: '접수번호', name: 'asJsno', + sortable: true, width: 150, align: 'center' }, { header: '차량번호', name: 'mmCarno', + sortable: true, width: 150, align: 'center' }, { header: 'mmCode', name: 'mmCode', + sortable: true, width: 150, align: 'center', hidden: false @@ -279,8 +288,8 @@ this.instance.on('successResponse', function(ev) { var responseObj = JSON.parse(ev.xhr.response); //$('.totCnt').text(responseObj.data.pagination.totalCount); - $("#currentPage").text(responseObj.data.pagination.page); - $("#totalPages").text(responseObj.data.pagination.totalPages); + // $("#currentPage").text(responseObj.data.pagination.page); + // $("#totalPages").text(responseObj.data.pagination.totalPages); }); // 행 더블클릭 이벤트 - 게시물 상세 페이지로 이동 @@ -290,9 +299,13 @@ var popOption = "width=1400px, height=900px, resizable=yes, scrollbars=yes, location=no, top=100px, left=100px"; // 팝업 띄우기 - const mmCode = this.instance.getValue(ev.rowKey, 'mmCode'); // tuiGrid의 해당 행 컬럼값 + let cursor = this.instance.getValue(ev.rowKey, 'mmCode'); // 선택한 mmCode + let mmCodes = this.instance.getData().map(row => row.mmCode); // 리스트업 된 자료 mmCode 리스트 const $openPop = window.open(popUrl, popTitle, popOption); - $($openPop).prop('mmCode', mmCode); + $($openPop).prop('cursor', cursor); + $($openPop).prop('mmCodes', mmCodes); + + }); diff --git a/src/main/webapp/WEB-INF/views/biz/totalInfo/totalInfo_popup.jsp b/src/main/webapp/WEB-INF/views/biz/totalInfo/totalInfo_popup.jsp index 76182f4..64f69ab 100644 --- a/src/main/webapp/WEB-INF/views/biz/totalInfo/totalInfo_popup.jsp +++ b/src/main/webapp/WEB-INF/views/biz/totalInfo/totalInfo_popup.jsp @@ -5,11 +5,11 @@ Time: 오후 5:34 To change this template use File | Settings | File Templates. --%> -<%@ page contentType="text/html;charset=UTF-8" language="java" %> -<%----%> +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +
    - 요거슨 개별 총 정보
    • 위반정보
    • @@ -33,10 +33,13 @@
      <%-- 부모창에서 받아오는 리스트 배열 --%> + <%-- 부모창에서 받아오는 리스크 커서 --%> + +
      2 of 4