From 8e1f495a0b3cf63af59c1f606f7ac3e90879b5a0 Mon Sep 17 00:00:00 2001 From: pjs Date: Sun, 1 Mar 2026 02:19:52 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=ED=9E=88=EC=8A=A4?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- boot_log.txt | 1 + .../log/ctrl/LogHistoryController.java | 29 +++ .../crm/settings/log/dto/LogHistoryDTO.java | 53 +++++ .../settings/log/mapper/LogHistoryMapper.java | 16 ++ .../settings/log/svc/LogHistoryService.java | 62 ++++++ .../resources/mappers/LogHistorySqlMap.xml | 72 ++++++ .../crm/settings/log/logHistorySelectList.js | 205 ++++++++++++++++++ .../settings/log/logHistorySelectList.html | 117 ++++++++++ 8 files changed, 555 insertions(+) create mode 100644 src/main/java/com/madeu/crm/settings/log/ctrl/LogHistoryController.java create mode 100644 src/main/java/com/madeu/crm/settings/log/dto/LogHistoryDTO.java create mode 100644 src/main/java/com/madeu/crm/settings/log/mapper/LogHistoryMapper.java create mode 100644 src/main/java/com/madeu/crm/settings/log/svc/LogHistoryService.java create mode 100644 src/main/resources/mappers/LogHistorySqlMap.xml create mode 100644 src/main/resources/static/js/crm/settings/log/logHistorySelectList.js create mode 100644 src/main/resources/templates/crm/settings/log/logHistorySelectList.html diff --git a/boot_log.txt b/boot_log.txt index 0f7fb1b..f72cf98 100644 --- a/boot_log.txt +++ b/boot_log.txt @@ -1 +1,2 @@ > Task :compileJava UP-TO-DATE +Terminate batch job (Y/N)? \ No newline at end of file diff --git a/src/main/java/com/madeu/crm/settings/log/ctrl/LogHistoryController.java b/src/main/java/com/madeu/crm/settings/log/ctrl/LogHistoryController.java new file mode 100644 index 0000000..c2d665c --- /dev/null +++ b/src/main/java/com/madeu/crm/settings/log/ctrl/LogHistoryController.java @@ -0,0 +1,29 @@ +package com.madeu.crm.settings.log.ctrl; + +import com.madeu.init.ManagerDraftAction; +import com.madeu.crm.settings.log.dto.LogHistoryDTO; +import com.madeu.crm.settings.log.svc.LogHistoryService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +@Slf4j +@RestController +public class LogHistoryController extends ManagerDraftAction { + + @Autowired + private LogHistoryService logHistoryService; + + @RequestMapping(value = "/logHistory/moveLogHistoryList.do") + public ModelAndView moveLogHistoryList() throws Exception { + return new ModelAndView("/crm/settings/log/logHistorySelectList"); + } + + @RequestMapping(value = "/logHistory/getLogHistoryList.do") + public LogHistoryDTO getLogHistoryList(@RequestBody LogHistoryDTO paramDTO) throws Exception { + return logHistoryService.getLogHistoryList(paramDTO); + } +} diff --git a/src/main/java/com/madeu/crm/settings/log/dto/LogHistoryDTO.java b/src/main/java/com/madeu/crm/settings/log/dto/LogHistoryDTO.java new file mode 100644 index 0000000..051e84d --- /dev/null +++ b/src/main/java/com/madeu/crm/settings/log/dto/LogHistoryDTO.java @@ -0,0 +1,53 @@ +package com.madeu.crm.settings.log.dto; + +import lombok.Data; + +@Data +public class LogHistoryDTO { + // DB Column mapping + private String muLogHistoryId; + private String muMemberId; + private String visitIp; + private String visitOriginAgent; + private String visitAgent; + private String visitOs; + private String url; + private String func; + private String service; + private String funcName; + private String serviceName; + private String requestValue; + private String responseValue; + private String resultCode; + private String resultMsg; + private String writeDate; + private String writeTime; + private String cudFlag; + private String useYn; + private String regId; + private String regDate; + private String modId; + private String modDate; + private String tId; + private String tDate; + + // 조회 결과 전용 + private String rowNum; + + // Search & UI Variables + private String searchKeyword; + private String searchType; + private String startDate; + private String endDate; + private Integer start; + private Integer limit; + private String sort; + private String dir; + + // Response Mapping Variables + private String msgCode; + private String msgDesc; + private String success; + private int totalCount; + private Object rows; +} diff --git a/src/main/java/com/madeu/crm/settings/log/mapper/LogHistoryMapper.java b/src/main/java/com/madeu/crm/settings/log/mapper/LogHistoryMapper.java new file mode 100644 index 0000000..f3ac125 --- /dev/null +++ b/src/main/java/com/madeu/crm/settings/log/mapper/LogHistoryMapper.java @@ -0,0 +1,16 @@ +package com.madeu.crm.settings.log.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.springframework.dao.DataAccessException; + +import com.madeu.crm.settings.log.dto.LogHistoryDTO; +import java.util.List; + +@Mapper +public interface LogHistoryMapper { + + List selectTotalLogHistoryCount(LogHistoryDTO paramDTO) throws DataAccessException; + + List selectListLogHistory(LogHistoryDTO paramDTO) throws DataAccessException; + +} diff --git a/src/main/java/com/madeu/crm/settings/log/svc/LogHistoryService.java b/src/main/java/com/madeu/crm/settings/log/svc/LogHistoryService.java new file mode 100644 index 0000000..0eeeb24 --- /dev/null +++ b/src/main/java/com/madeu/crm/settings/log/svc/LogHistoryService.java @@ -0,0 +1,62 @@ +package com.madeu.crm.settings.log.svc; + +import com.madeu.constants.Constants; +import com.madeu.crm.settings.log.dto.LogHistoryDTO; +import com.madeu.crm.settings.log.mapper.LogHistoryMapper; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +@Slf4j +@Service("LogHistoryViewService") +public class LogHistoryService { + + @Autowired + private HttpSession session; + + @Autowired + private LogHistoryMapper logHistoryMapper; + + @Autowired + private MessageSource messageSource; + + private String msg(String code) { + return messageSource.getMessage(code, null, Locale.getDefault()); + } + + public LogHistoryDTO getLogHistoryList(LogHistoryDTO dto) { + try { + // 로그 히스토리는 시스템 관리 기능 → 로그인 여부만 체크 + String loginMemberId = (String) session.getAttribute("loginMemberId"); + if (loginMemberId != null && !loginMemberId.isEmpty() && !"null".equals(loginMemberId)) { + dto.setUseYn("Y"); + + List countList = logHistoryMapper.selectTotalLogHistoryCount(dto); + int total = countList.get(0).getTotalCount(); + + dto.setTotalCount(total); + if (total > 0) { + dto.setRows(logHistoryMapper.selectListLogHistory(dto)); + } else { + dto.setRows(new ArrayList<>()); + } + dto.setMsgCode(Constants.OK); + dto.setSuccess("true"); + } else { + dto.setMsgCode(Constants.FAIL); + dto.setMsgDesc(msg("auth.error.select")); + } + } catch (Exception e) { + log.error("Error in getLogHistoryList", e); + dto.setMsgCode(Constants.FAIL); + dto.setMsgDesc(msg("error.select")); + } + return dto; + } +} diff --git a/src/main/resources/mappers/LogHistorySqlMap.xml b/src/main/resources/mappers/LogHistorySqlMap.xml new file mode 100644 index 0000000..836c4ca --- /dev/null +++ b/src/main/resources/mappers/LogHistorySqlMap.xml @@ -0,0 +1,72 @@ + + + + + + + + + diff --git a/src/main/resources/static/js/crm/settings/log/logHistorySelectList.js b/src/main/resources/static/js/crm/settings/log/logHistorySelectList.js new file mode 100644 index 0000000..a4da51e --- /dev/null +++ b/src/main/resources/static/js/crm/settings/log/logHistorySelectList.js @@ -0,0 +1,205 @@ +/**************************************************************************** + * 로그 히스토리 목록 - Tabulator Grid + ****************************************************************************/ + +let logHistoryTable; +let currentPage = 1; +let pageSize = 50; + +/**************************************************************************** + * 초기화 + ****************************************************************************/ +$(document).ready(function () { + fn_initTable(); + fn_initEvent(); + fn_setDefaultDate(); + fn_selectLogHistoryList(1); +}); + +/**************************************************************************** + * 기본 날짜 설정 (오늘 기준 7일 전 ~ 오늘) + ****************************************************************************/ +function fn_setDefaultDate() { + let today = new Date(); + let weekAgo = new Date(); + weekAgo.setDate(today.getDate() - 7); + + $("#searchEndDate").val(fn_formatDate(today)); + $("#searchStartDate").val(fn_formatDate(weekAgo)); +} + +function fn_formatDate(date) { + let y = date.getFullYear(); + let m = String(date.getMonth() + 1).padStart(2, "0"); + let d = String(date.getDate()).padStart(2, "0"); + return y + "-" + m + "-" + d; +} + +/**************************************************************************** + * Tabulator 초기화 + ****************************************************************************/ +function fn_initTable() { + logHistoryTable = new Tabulator("#logHistoryGrid", { + height: "calc(100vh - 350px)", + layout: "fitColumns", + placeholder: "조회된 데이터가 없습니다.", + columns: [ + { + title: "No", + field: "rowNum", + hozAlign: "center", + headerHozAlign: "center", + width: 60, + headerSort: false + }, + { + title: "날짜", + field: "writeDate", + hozAlign: "center", + headerHozAlign: "center", + width: 110 + }, + { + title: "시간", + field: "writeTime", + hozAlign: "center", + headerHozAlign: "center", + width: 90 + }, + { + title: "기능명", + field: "funcName", + headerHozAlign: "center", + minWidth: 160 + }, + { + title: "서비스명", + field: "serviceName", + headerHozAlign: "center", + minWidth: 160 + }, + { + title: "URL", + field: "url", + headerHozAlign: "center", + minWidth: 200 + }, + { + title: "결과", + field: "resultCode", + hozAlign: "center", + headerHozAlign: "center", + width: 90, + formatter: function (cell) { + let val = cell.getValue(); + if (val === "SUCCESS") { + return 'SUCCESS'; + } else if (val === "ERROR") { + return 'ERROR'; + } + return val || ""; + } + }, + { + title: "사용자ID", + field: "muMemberId", + hozAlign: "center", + headerHozAlign: "center", + width: 100 + }, + { + title: "접속IP", + field: "visitIp", + hozAlign: "center", + headerHozAlign: "center", + width: 130 + } + ] + }); +} + +/**************************************************************************** + * 이벤트 바인딩 + ****************************************************************************/ +function fn_initEvent() { + // 조회 버튼 + $("#btnSearch").on("click", function () { + fn_selectLogHistoryList(1); + }); + + // Enter 키 검색 + $("#searchKeyword").on("keyup", function (e) { + if (e.keyCode === 13) { + fn_selectLogHistoryList(1); + } + }); +} + +/**************************************************************************** + * 로그 히스토리 목록 조회 + ****************************************************************************/ +function fn_selectLogHistoryList(page) { + currentPage = page; + let start = (page - 1) * pageSize; + + let paramData = { + "menuClass": menuClass, + "start": start, + "limit": pageSize, + "searchKeyword": $("#searchKeyword").val(), + "resultCode": $("#searchResultCode").val(), + "startDate": $("#searchStartDate").val(), + "endDate": $("#searchEndDate").val() + }; + + $.ajax({ + url: encodeURI("/logHistory/getLogHistoryList.do"), + data: JSON.stringify(paramData), + dataType: "json", + contentType: "application/json", + type: "POST", + async: true, + success: function (data) { + if ("0" == data.msgCode) { + let totalCount = data.totalCount || 0; + $("#totalCount").text(totalCount.toLocaleString()); + + if (data.rows && data.rows.length > 0) { + logHistoryTable.setData(data.rows); + } else { + logHistoryTable.setData([]); + } + + fn_setPagination(totalCount); + } else { + alert(data.msgDesc || "조회 중 오류가 발생하였습니다."); + } + }, + error: function () { + alert("서버 통신 오류가 발생하였습니다."); + } + }); +} + +/**************************************************************************** + * 페이지네이션 + ****************************************************************************/ +function fn_setPagination(totalCount) { + let totalPages = Math.ceil(totalCount / pageSize); + if (totalPages < 1) totalPages = 1; + + $("#logHistoryPagination").twbsPagination("destroy"); + $("#logHistoryPagination").twbsPagination({ + totalPages: totalPages, + startPage: currentPage, + visiblePages: 10, + initiateStartPageClick: false, + first: "<<", + prev: "<", + next: ">", + last: ">>", + onPageClick: function (event, page) { + fn_selectLogHistoryList(page); + } + }); +} diff --git a/src/main/resources/templates/crm/settings/log/logHistorySelectList.html b/src/main/resources/templates/crm/settings/log/logHistorySelectList.html new file mode 100644 index 0000000..6338c95 --- /dev/null +++ b/src/main/resources/templates/crm/settings/log/logHistorySelectList.html @@ -0,0 +1,117 @@ + + + + + + + + + + + +
+

로그 히스토리

+ +
+
+
+ + ~ + + + + + + + +
+
+
+ +
+ 전체 0 건 +
+ +
+ + +
+ +
+
+
+ + + + + + + \ No newline at end of file