From 54758de8fa48d05d90394185faae7879ff53d39e Mon Sep 17 00:00:00 2001 From: tolag3 Date: Wed, 20 Sep 2023 14:25:22 +0900 Subject: [PATCH 1/7] =?UTF-8?q?=EC=9D=B4=EC=A4=80=ED=98=B8=20=EC=A0=84?= =?UTF-8?q?=EC=9E=90=EC=A1=B0=EC=A0=95=EC=8B=9C=EC=8A=A4=ED=85=9C=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - sms, email 발송 페이지 tabulator 버전 커밋 --- .../sendMgr/web/SendMgrSMSController.java | 6 + .../kccadr/sendMgr/emailSendMgr_tabulator.jsp | 30 ++- .../kccadr/sendMgr/smsSendMgr_tabulator.jsp | 212 ++++++++++++++++++ .../dist/css/tabulator_simple.min.css | 2 +- 4 files changed, 243 insertions(+), 7 deletions(-) create mode 100644 src/main/webapp/WEB-INF/jsp/kccadr/sendMgr/smsSendMgr_tabulator.jsp diff --git a/src/main/java/kcc/kccadr/sendMgr/web/SendMgrSMSController.java b/src/main/java/kcc/kccadr/sendMgr/web/SendMgrSMSController.java index fab63278..b60a110f 100644 --- a/src/main/java/kcc/kccadr/sendMgr/web/SendMgrSMSController.java +++ b/src/main/java/kcc/kccadr/sendMgr/web/SendMgrSMSController.java @@ -85,4 +85,10 @@ public class SendMgrSMSController { return modelAndView; } + + @RequestMapping(value = "/kccadr/sendMgr/smsSendMgr_tabulator.do") + public String smsSendMgrPage_tabulator() { + + return "/kccadr/sendMgr/smsSendMgr_tabulator"; + } } diff --git a/src/main/webapp/WEB-INF/jsp/kccadr/sendMgr/emailSendMgr_tabulator.jsp b/src/main/webapp/WEB-INF/jsp/kccadr/sendMgr/emailSendMgr_tabulator.jsp index 41e31bd3..7bfae27b 100644 --- a/src/main/webapp/WEB-INF/jsp/kccadr/sendMgr/emailSendMgr_tabulator.jsp +++ b/src/main/webapp/WEB-INF/jsp/kccadr/sendMgr/emailSendMgr_tabulator.jsp @@ -24,7 +24,10 @@ */ %> - + + + + @@ -117,21 +120,36 @@ clipboard:true, reactiveData:true, clipboardPasteAction:"replace", + validationMode:"highlight", columns:[ - {title:"메일주소", field:"mailAdress", width:200, editor:true}, - {formatter:"buttonCross", width:30, hozAlign:"center", + {title:"메일주소", field:"mailAdress", width:200, editor:true}, + {formatter:"buttonCross", width:30, hozAlign:"center", headerSort:false, cellClick:function(e, cell){ - $("#tabulatorArea").tabulator("deleteRow", 0); + cell.getRow().delete(); } } - ], + ] }); //메일추가 클릭 시 tabulator에 추가 document.getElementById("emailAdd").addEventListener("click", function(){ var inputEmail = $("#callTo").val(); + + if(inputEmail == "" || inputEmail == null){ + alert("메일주소를 입력해 주세요"); + return; + } + + var taxExptext = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i; + if(taxExptext.test(inputEmail)==false){ + alert("이메일주소 형식이 올바르지 않습니다."); + return false; + } + tabledata.push({mailAdress:inputEmail}); $("#callTo").val(''); +// var test = $("#tabulatorArea").tabulator("getInvalidCells"); + }); } @@ -184,7 +202,7 @@
-
+
diff --git a/src/main/webapp/WEB-INF/jsp/kccadr/sendMgr/smsSendMgr_tabulator.jsp b/src/main/webapp/WEB-INF/jsp/kccadr/sendMgr/smsSendMgr_tabulator.jsp new file mode 100644 index 00000000..92ddde94 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/kccadr/sendMgr/smsSendMgr_tabulator.jsp @@ -0,0 +1,212 @@ + +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %> +<%@ taglib prefix="kc" uri="/WEB-INF/tlds/kcc_tld.tld"%> +<% + /** + * @Class Name : smsSendMgr.do + * @Description : SMS 발송 화면 + * @Modification Information + * @ + * @ 수정일 수정자 수정내용 + * @ ------- -------- --------------------------- + * @ 2023.09.13 원영현 최초 생성 + * @author 원영현 + * @since 2023.09.13 + * @version 1.0 + * @see + * + */ +%> + + + + + + + + + + + + + + + +
+ + +
+
+ +
+

SMS 발송

+
    +
  • +
  • +

    발송 관리

    +
  • +
  • + SMS 발송 +
  • +
+
+ + +
+ +
+ + + + + + + + + + + + + + + +
발송내용 + +
수신번호 +
+ + +
+
+
+
+
+ + + +
+
+
+
+ +
+
+ +
+
+
+ +
diff --git a/src/main/webapp/tabulator/dist/css/tabulator_simple.min.css b/src/main/webapp/tabulator/dist/css/tabulator_simple.min.css index e102cf43..2ac751f1 100644 --- a/src/main/webapp/tabulator/dist/css/tabulator_simple.min.css +++ b/src/main/webapp/tabulator/dist/css/tabulator_simple.min.css @@ -1,2 +1,2 @@ -.tabulator{position:relative;border:1px solid #999;font-size:14px;text-align:left;overflow:hidden;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.tabulator[tabulator-layout=fitDataFill] .tabulator-tableholder .tabulator-table{min-width:100%}.tabulator[tabulator-layout=fitDataTable]{display:inline-block}.tabulator.tabulator-block-select{user-select:none}.tabulator .tabulator-header{position:relative;box-sizing:border-box;width:100%;border-bottom:1px solid #999;background-color:#fff;color:#555;font-weight:700;white-space:nowrap;overflow:hidden;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-header.tabulator-header-hidden{display:none}.tabulator .tabulator-header .tabulator-header-contents{position:relative;overflow:hidden}.tabulator .tabulator-header .tabulator-header-contents .tabulator-headers{display:inline-block}.tabulator .tabulator-header .tabulator-col{display:inline-flex;position:relative;box-sizing:border-box;flex-direction:column;justify-content:flex-start;border-right:1px solid #ddd;background:#fff;text-align:left;vertical-align:bottom;overflow:hidden}.tabulator .tabulator-header .tabulator-col.tabulator-moving{position:absolute;border:1px solid #999;background:#e6e6e6;pointer-events:none}.tabulator .tabulator-header .tabulator-col .tabulator-col-content{box-sizing:border-box;position:relative;padding:4px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-header-popup-button{padding:0 8px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-header-popup-button:hover{cursor:pointer;opacity:.6}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title-holder{position:relative}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title{box-sizing:border-box;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title.tabulator-col-title-wrap{white-space:normal;text-overflow:clip}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor{box-sizing:border-box;width:100%;border:1px solid #999;padding:1px;background:#fff}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-header-popup-button+.tabulator-title-editor{width:calc(100% - 22px)}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter{display:flex;align-items:center;position:absolute;top:0;bottom:0;right:4px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #bbb}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{position:relative;display:flex;border-top:1px solid #ddd;overflow:hidden;margin-right:-1px}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter{position:relative;box-sizing:border-box;margin-top:2px;width:100%;text-align:center}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea{height:auto!important}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg{margin-top:3px}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input::-ms-clear{width:0;height:0}.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-right:25px}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable.tabulator-col-sorter-element:hover{cursor:pointer;background-color:#e6e6e6}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter{color:#bbb}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter.tabulator-col-sorter-element .tabulator-arrow:hover{cursor:pointer;border-bottom:6px solid #555}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-top:none;border-bottom:6px solid #bbb}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter{color:#666}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter.tabulator-col-sorter-element .tabulator-arrow:hover{cursor:pointer;border-bottom:6px solid #555}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-top:none;border-bottom:6px solid #666}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter{color:#666}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter.tabulator-col-sorter-element .tabulator-arrow:hover{cursor:pointer;border-top:6px solid #555}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-bottom:none;border-top:6px solid #666;color:#666}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical .tabulator-col-content .tabulator-col-title{writing-mode:vertical-rl;text-orientation:mixed;display:flex;align-items:center;justify-content:center}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-col-vertical-flip .tabulator-col-title{transform:rotate(180deg)}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-title{padding-right:0;padding-top:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable.tabulator-col-vertical-flip .tabulator-col-title{padding-right:0;padding-bottom:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-sorter{justify-content:center;left:0;right:0;top:4px;bottom:auto}.tabulator .tabulator-header .tabulator-frozen{position:sticky;left:0;z-index:11}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left{border-right:2px solid #ddd}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #ddd}.tabulator .tabulator-header .tabulator-calcs-holder{box-sizing:border-box;background:#fff!important;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row{background:#fff!important}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle,.tabulator .tabulator-header .tabulator-frozen-rows-holder:empty{display:none}.tabulator .tabulator-tableholder{position:relative;width:100%;white-space:nowrap;overflow:auto;-webkit-overflow-scrolling:touch}.tabulator .tabulator-tableholder:focus{outline:none}.tabulator .tabulator-tableholder .tabulator-placeholder{box-sizing:border-box;display:flex;align-items:center;justify-content:center;width:100%}.tabulator .tabulator-tableholder .tabulator-placeholder[tabulator-render-mode=virtual]{min-height:100%;min-width:100%}.tabulator .tabulator-tableholder .tabulator-placeholder .tabulator-placeholder-contents{display:inline-block;text-align:center;padding:10px;color:#ccc;font-weight:700;font-size:20px;white-space:normal}.tabulator .tabulator-tableholder .tabulator-table{position:relative;display:inline-block;background-color:#fff;white-space:nowrap;overflow:visible;color:#333}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.tabulator-calcs{font-weight:700;background:#f2f2f2!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top{border-bottom:2px solid #ddd}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom{border-top:2px solid #ddd}.tabulator .tabulator-footer{border-top:1px solid #999;background-color:#fff;color:#555;font-weight:700;white-space:nowrap;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-footer .tabulator-footer-contents{display:flex;flex-direction:row;align-items:center;justify-content:space-between;padding:5px 10px}.tabulator .tabulator-footer .tabulator-footer-contents:empty{display:none}.tabulator .tabulator-footer .tabulator-calcs-holder{box-sizing:border-box;width:100%;text-align:left;background:#fff!important;border-bottom:1px solid #ddd;border-top:1px solid #ddd;overflow:hidden}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row{display:inline-block;background:#fff!important}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-footer .tabulator-calcs-holder:only-child{margin-bottom:-5px;border-bottom:none}.tabulator .tabulator-footer>*+.tabulator-page-counter{margin-left:10px}.tabulator .tabulator-footer .tabulator-page-counter{font-weight:400}.tabulator .tabulator-footer .tabulator-paginator{flex:1;text-align:right;color:#555;font-family:inherit;font-weight:inherit;font-size:inherit}.tabulator .tabulator-footer .tabulator-page-size{display:inline-block;margin:0 5px;padding:2px 5px;border:1px solid #aaa;border-radius:3px}.tabulator .tabulator-footer .tabulator-pages{margin:0 7px}.tabulator .tabulator-footer .tabulator-page{display:inline-block;margin:0 2px;padding:2px 5px;border:1px solid #aaa;border-radius:3px;background:hsla(0,0%,100%,.2)}.tabulator .tabulator-footer .tabulator-page.active{color:#d00}.tabulator .tabulator-footer .tabulator-page:disabled{opacity:.5}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover{cursor:pointer;background:rgba(0,0,0,.2);color:#fff}}.tabulator .tabulator-col-resize-handle{position:relative;display:inline-block;width:6px;margin-left:-3px;margin-right:-3px;z-index:10;vertical-align:middle}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-col-resize-handle:hover{cursor:ew-resize}}.tabulator .tabulator-col-resize-handle:last-of-type{width:3px;margin-right:0}.tabulator .tabulator-alert{position:absolute;display:flex;align-items:center;top:0;left:0;z-index:100;height:100%;width:100%;background:rgba(0,0,0,.4);text-align:center}.tabulator .tabulator-alert .tabulator-alert-msg{display:inline-block;margin:0 auto;padding:10px 20px;border-radius:10px;background:#fff;font-weight:700;font-size:16px}.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-msg{border:4px solid #333;color:#000}.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-error{border:4px solid #d00;color:#590000}.tabulator-row{position:relative;box-sizing:border-box;min-height:22px}.tabulator-row,.tabulator-row.tabulator-row-even{background-color:#fff}@media (hover:hover) and (pointer:fine){.tabulator-row.tabulator-selectable:hover{background-color:#bbb;cursor:pointer}}.tabulator-row.tabulator-selected{background-color:#9abcea}@media (hover:hover) and (pointer:fine){.tabulator-row.tabulator-selected:hover{background-color:#769bcc;cursor:pointer}}.tabulator-row.tabulator-row-moving{border:1px solid #000;background:#fff}.tabulator-row.tabulator-moving{position:absolute;border-top:1px solid #ddd;border-bottom:1px solid #ddd;pointer-events:none;z-index:15}.tabulator-row .tabulator-row-resize-handle{position:absolute;right:0;bottom:0;left:0;height:5px}.tabulator-row .tabulator-row-resize-handle.prev{top:0;bottom:auto}@media (hover:hover) and (pointer:fine){.tabulator-row .tabulator-row-resize-handle:hover{cursor:ns-resize}}.tabulator-row .tabulator-responsive-collapse{box-sizing:border-box;padding:5px;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.tabulator-row .tabulator-responsive-collapse:empty{display:none}.tabulator-row .tabulator-responsive-collapse table{font-size:14px}.tabulator-row .tabulator-responsive-collapse table tr td{position:relative}.tabulator-row .tabulator-responsive-collapse table tr td:first-of-type{padding-right:10px}.tabulator-row .tabulator-cell{display:inline-block;position:relative;box-sizing:border-box;padding:4px;border-right:1px solid #ddd;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tabulator-row .tabulator-cell.tabulator-frozen{display:inline-block;position:sticky;left:0;background-color:inherit;z-index:11}.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left{border-right:2px solid #ddd}.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right{border-left:2px solid #ddd}.tabulator-row .tabulator-cell.tabulator-editing{border:1px solid #1d68cd;outline:none;padding:0}.tabulator-row .tabulator-cell.tabulator-editing input,.tabulator-row .tabulator-cell.tabulator-editing select{border:1px;background:transparent;outline:none}.tabulator-row .tabulator-cell.tabulator-validation-fail{border:1px solid #d00}.tabulator-row .tabulator-cell.tabulator-validation-fail input,.tabulator-row .tabulator-cell.tabulator-validation-fail select{border:1px;background:transparent;color:#d00}.tabulator-row .tabulator-cell.tabulator-row-handle{display:inline-flex;align-items:center;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box{width:80%}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar{width:100%;height:3px;margin-top:2px;background:#666}.tabulator-row .tabulator-cell .tabulator-data-tree-branch-empty{display:inline-block;width:7px}.tabulator-row .tabulator-cell .tabulator-data-tree-branch{display:inline-block;vertical-align:middle;height:9px;width:7px;margin-top:-9px;margin-right:5px;border-bottom-left-radius:1px;border-left:2px solid #ddd;border-bottom:2px solid #ddd}.tabulator-row .tabulator-cell .tabulator-data-tree-control{display:inline-flex;justify-content:center;align-items:center;vertical-align:middle;height:11px;width:11px;margin-right:5px;border:1px solid #333;border-radius:2px;background:rgba(0,0,0,.1);overflow:hidden}@media (hover:hover) and (pointer:fine){.tabulator-row .tabulator-cell .tabulator-data-tree-control:hover{cursor:pointer;background:rgba(0,0,0,.2)}}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse{display:inline-block;position:relative;height:7px;width:1px;background:transparent}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand{display:inline-block;position:relative;height:7px;width:1px;background:#333}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle{display:inline-flex;align-items:center;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;height:15px;width:15px;border-radius:20px;background:#666;color:#fff;font-weight:700;font-size:1.1em}@media (hover:hover) and (pointer:fine){.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle:hover{opacity:.7;cursor:pointer}}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-close{display:initial}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-open{display:none}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle svg{stroke:#fff}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle .tabulator-responsive-collapse-toggle-close{display:none}.tabulator-row .tabulator-cell .tabulator-traffic-light{display:inline-block;height:14px;width:14px;border-radius:14px}.tabulator-row.tabulator-group{box-sizing:border-box;border-bottom:1px solid #999;border-right:1px solid #ddd;border-top:1px solid #999;padding:5px 5px 5px 10px;background:#ccc;font-weight:700;min-width:100%}@media (hover:hover) and (pointer:fine){.tabulator-row.tabulator-group:hover{cursor:pointer;background-color:rgba(0,0,0,.1)}}.tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow{margin-right:10px;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #666;border-bottom:0}.tabulator-row.tabulator-group.tabulator-group-level-1{padding-left:30px}.tabulator-row.tabulator-group.tabulator-group-level-2{padding-left:50px}.tabulator-row.tabulator-group.tabulator-group-level-3{padding-left:70px}.tabulator-row.tabulator-group.tabulator-group-level-4{padding-left:90px}.tabulator-row.tabulator-group.tabulator-group-level-5{padding-left:110px}.tabulator-row.tabulator-group .tabulator-group-toggle{display:inline-block}.tabulator-row.tabulator-group .tabulator-arrow{display:inline-block;width:0;height:0;margin-right:16px;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:0;border-left:6px solid #666;vertical-align:middle}.tabulator-row.tabulator-group span{margin-left:10px;color:#d00}.tabulator-popup-container{position:absolute;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #ddd;box-shadow:0 0 5px 0 rgba(0,0,0,.2);font-size:14px;overflow-y:auto;-webkit-overflow-scrolling:touch;z-index:10000}.tabulator-popup{padding:5px;border-radius:3px}.tabulator-tooltip{max-width:Min(500px,100%);padding:3px 5px;border-radius:2px;box-shadow:none;font-size:12px;pointer-events:none}.tabulator-menu .tabulator-menu-item{position:relative;box-sizing:border-box;padding:5px 10px;user-select:none}.tabulator-menu .tabulator-menu-item.tabulator-menu-item-disabled{opacity:.5}@media (hover:hover) and (pointer:fine){.tabulator-menu .tabulator-menu-item:not(.tabulator-menu-item-disabled):hover{cursor:pointer;background:#fff}}.tabulator-menu .tabulator-menu-item.tabulator-menu-item-submenu{padding-right:25px}.tabulator-menu .tabulator-menu-item.tabulator-menu-item-submenu:after{display:inline-block;position:absolute;top:calc(5px + .4em);right:10px;height:7px;width:7px;content:"";border-color:#ddd;border-style:solid;border-width:1px 1px 0 0;vertical-align:top;transform:rotate(45deg)}.tabulator-menu .tabulator-menu-separator{border-top:1px solid #ddd}.tabulator-edit-list{max-height:200px;font-size:14px;overflow-y:auto;-webkit-overflow-scrolling:touch}.tabulator-edit-list .tabulator-edit-list-item{padding:4px;color:#333;outline:none}.tabulator-edit-list .tabulator-edit-list-item.active{color:#fff;background:#1d68cd}.tabulator-edit-list .tabulator-edit-list-item.active.focused{outline:1px solid hsla(0,0%,100%,.5)}.tabulator-edit-list .tabulator-edit-list-item.focused{outline:1px solid #1d68cd}@media (hover:hover) and (pointer:fine){.tabulator-edit-list .tabulator-edit-list-item:hover{cursor:pointer;color:#fff;background:#1d68cd}}.tabulator-edit-list .tabulator-edit-list-placeholder{padding:4px;color:#333;text-align:center}.tabulator-edit-list .tabulator-edit-list-group{border-bottom:1px solid #ddd;padding:6px 4px 4px;color:#333;font-weight:700}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-2,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-2{padding-left:12px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-3,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-3{padding-left:20px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-4,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-4{padding-left:28px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-5,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-5{padding-left:36px}.tabulator.tabulator-ltr{direction:ltr}.tabulator.tabulator-rtl{text-align:initial;direction:rtl}.tabulator.tabulator-rtl .tabulator-header .tabulator-col{text-align:initial;border-left:1px solid #ddd;border-right:initial}.tabulator.tabulator-rtl .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{margin-right:0;margin-left:-1px}.tabulator.tabulator-rtl .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-right:0;padding-left:25px}.tabulator.tabulator-rtl .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter{left:8px;right:auto}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell{border-right:initial;border-left:1px solid #ddd}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell .tabulator-data-tree-branch{margin-right:0;margin-left:5px;border-bottom-left-radius:0;border-bottom-right-radius:1px;border-left:initial;border-right:2px solid #ddd}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell .tabulator-data-tree-control{margin-right:0;margin-left:5px}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left{border-left:2px solid #ddd}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right{border-right:2px solid #ddd}.tabulator.tabulator-rtl .tabulator-row .tabulator-col-resize-handle:last-of-type{width:3px;margin-left:0;margin-right:-3px}.tabulator.tabulator-rtl .tabulator-footer .tabulator-calcs-holder{text-align:initial}.tabulator-print-fullscreen{position:absolute;top:0;bottom:0;left:0;right:0;z-index:10000}body.tabulator-print-fullscreen-hide>:not(.tabulator-print-fullscreen){display:none!important}.tabulator-print-table{border-collapse:collapse}.tabulator-print-table .tabulator-data-tree-branch{display:inline-block;vertical-align:middle;height:9px;width:7px;margin-top:-9px;margin-right:5px;border-bottom-left-radius:1px;border-left:2px solid #ddd;border-bottom:2px solid #ddd}.tabulator-print-table .tabulator-print-table-group{box-sizing:border-box;border-bottom:1px solid #999;border-right:1px solid #ddd;border-top:1px solid #999;padding:5px 5px 5px 10px;background:#ccc;font-weight:700;min-width:100%}@media (hover:hover) and (pointer:fine){.tabulator-print-table .tabulator-print-table-group:hover{cursor:pointer;background-color:rgba(0,0,0,.1)}}.tabulator-print-table .tabulator-print-table-group.tabulator-group-visible .tabulator-arrow{margin-right:10px;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #666;border-bottom:0}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-1 td{padding-left:30px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-2 td{padding-left:50px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-3 td{padding-left:70px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-4 td{padding-left:90px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-5 td{padding-left:110px!important}.tabulator-print-table .tabulator-print-table-group .tabulator-group-toggle{display:inline-block}.tabulator-print-table .tabulator-print-table-group .tabulator-arrow{display:inline-block;width:0;height:0;margin-right:16px;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:0;border-left:6px solid #666;vertical-align:middle}.tabulator-print-table .tabulator-print-table-group span{color:#d00}.tabulator-print-table .tabulator-data-tree-control{display:inline-flex;justify-content:center;align-items:center;vertical-align:middle;height:11px;width:11px;margin-right:5px;border:1px solid #333;border-radius:2px;background:rgba(0,0,0,.1);overflow:hidden}@media (hover:hover) and (pointer:fine){.tabulator-print-table .tabulator-data-tree-control:hover{cursor:pointer;background:rgba(0,0,0,.2)}}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-collapse{display:inline-block;position:relative;height:7px;width:1px;background:transparent}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-expand{display:inline-block;position:relative;height:7px;width:1px;background:#333}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator{border:none;background-color:#fff}.tabulator .tabulator-header .tabulator-calcs-holder{background:#f2f2f2!important;border-bottom:1px solid #999}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row{background:#f2f2f2!important}.tabulator .tabulator-tableholder .tabulator-placeholder span{color:#000}.tabulator .tabulator-footer .tabulator-calcs-holder{background:#f2f2f2!important;border-bottom:1px solid #fff}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row{background:#f2f2f2!important}.tabulator-row{border-bottom:1px solid #ddd}.tabulator-row .tabulator-cell:last-of-type{border-right:none}.tabulator-row.tabulator-group span{color:#666}.tabulator-print-table .tabulator-print-table-group span{margin-left:10px;color:#666} +/* .tabulator{position:relative;border:1px solid #999;font-size:14px;text-align:left;overflow:hidden;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.tabulator[tabulator-layout=fitDataFill] .tabulator-tableholder .tabulator-table{min-width:100%}.tabulator[tabulator-layout=fitDataTable]{display:inline-block}.tabulator.tabulator-block-select{user-select:none}.tabulator .tabulator-header{position:relative;box-sizing:border-box;width:100%;border-bottom:1px solid #999;background-color:#fff;color:#555;font-weight:700;white-space:nowrap;overflow:hidden;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-header.tabulator-header-hidden{display:none}.tabulator .tabulator-header .tabulator-header-contents{position:relative;overflow:hidden}.tabulator .tabulator-header .tabulator-header-contents .tabulator-headers{display:inline-block}.tabulator .tabulator-header .tabulator-col{display:inline-flex;position:relative;box-sizing:border-box;flex-direction:column;justify-content:flex-start;border-right:1px solid #ddd;background:#fff;text-align:left;vertical-align:bottom;overflow:hidden}.tabulator .tabulator-header .tabulator-col.tabulator-moving{position:absolute;border:1px solid #999;background:#e6e6e6;pointer-events:none}.tabulator .tabulator-header .tabulator-col .tabulator-col-content{box-sizing:border-box;position:relative;padding:4px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-header-popup-button{padding:0 8px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-header-popup-button:hover{cursor:pointer;opacity:.6}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title-holder{position:relative}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title{box-sizing:border-box;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title.tabulator-col-title-wrap{white-space:normal;text-overflow:clip}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor{box-sizing:border-box;width:100%;border:1px solid #999;padding:1px;background:#fff}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-header-popup-button+.tabulator-title-editor{width:calc(100% - 22px)}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter{display:flex;align-items:center;position:absolute;top:0;bottom:0;right:4px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #bbb}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{position:relative;display:flex;border-top:1px solid #ddd;overflow:hidden;margin-right:-1px}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter{position:relative;box-sizing:border-box;margin-top:2px;width:100%;text-align:center}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea{height:auto!important}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg{margin-top:3px}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input::-ms-clear{width:0;height:0}.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-right:25px}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable.tabulator-col-sorter-element:hover{cursor:pointer;background-color:#e6e6e6}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter{color:#bbb}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter.tabulator-col-sorter-element .tabulator-arrow:hover{cursor:pointer;border-bottom:6px solid #555}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-top:none;border-bottom:6px solid #bbb}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter{color:#666}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter.tabulator-col-sorter-element .tabulator-arrow:hover{cursor:pointer;border-bottom:6px solid #555}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-top:none;border-bottom:6px solid #666}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter{color:#666}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter.tabulator-col-sorter-element .tabulator-arrow:hover{cursor:pointer;border-top:6px solid #555}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-bottom:none;border-top:6px solid #666;color:#666}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical .tabulator-col-content .tabulator-col-title{writing-mode:vertical-rl;text-orientation:mixed;display:flex;align-items:center;justify-content:center}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-col-vertical-flip .tabulator-col-title{transform:rotate(180deg)}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-title{padding-right:0;padding-top:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable.tabulator-col-vertical-flip .tabulator-col-title{padding-right:0;padding-bottom:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-sorter{justify-content:center;left:0;right:0;top:4px;bottom:auto}.tabulator .tabulator-header .tabulator-frozen{position:sticky;left:0;z-index:11}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left{border-right:2px solid #ddd}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #ddd}.tabulator .tabulator-header .tabulator-calcs-holder{box-sizing:border-box;background:#fff!important;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row{background:#fff!important}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle,.tabulator .tabulator-header .tabulator-frozen-rows-holder:empty{display:none}.tabulator .tabulator-tableholder{position:relative;width:100%;white-space:nowrap;overflow:auto;-webkit-overflow-scrolling:touch}.tabulator .tabulator-tableholder:focus{outline:none}.tabulator .tabulator-tableholder .tabulator-placeholder{box-sizing:border-box;display:flex;align-items:center;justify-content:center;width:100%}.tabulator .tabulator-tableholder .tabulator-placeholder[tabulator-render-mode=virtual]{min-height:100%;min-width:100%}.tabulator .tabulator-tableholder .tabulator-placeholder .tabulator-placeholder-contents{display:inline-block;text-align:center;padding:10px;color:#ccc;font-weight:700;font-size:20px;white-space:normal}.tabulator .tabulator-tableholder .tabulator-table{position:relative;display:inline-block;background-color:#fff;white-space:nowrap;overflow:visible;color:#333}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.tabulator-calcs{font-weight:700;background:#f2f2f2!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top{border-bottom:2px solid #ddd}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom{border-top:2px solid #ddd}.tabulator .tabulator-footer{border-top:1px solid #999;background-color:#fff;color:#555;font-weight:700;white-space:nowrap;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-footer .tabulator-footer-contents{display:flex;flex-direction:row;align-items:center;justify-content:space-between;padding:5px 10px}.tabulator .tabulator-footer .tabulator-footer-contents:empty{display:none}.tabulator .tabulator-footer .tabulator-calcs-holder{box-sizing:border-box;width:100%;text-align:left;background:#fff!important;border-bottom:1px solid #ddd;border-top:1px solid #ddd;overflow:hidden}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row{display:inline-block;background:#fff!important}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-footer .tabulator-calcs-holder:only-child{margin-bottom:-5px;border-bottom:none}.tabulator .tabulator-footer>*+.tabulator-page-counter{margin-left:10px}.tabulator .tabulator-footer .tabulator-page-counter{font-weight:400}.tabulator .tabulator-footer .tabulator-paginator{flex:1;text-align:right;color:#555;font-family:inherit;font-weight:inherit;font-size:inherit}.tabulator .tabulator-footer .tabulator-page-size{display:inline-block;margin:0 5px;padding:2px 5px;border:1px solid #aaa;border-radius:3px}.tabulator .tabulator-footer .tabulator-pages{margin:0 7px}.tabulator .tabulator-footer .tabulator-page{display:inline-block;margin:0 2px;padding:2px 5px;border:1px solid #aaa;border-radius:3px;background:hsla(0,0%,100%,.2)}.tabulator .tabulator-footer .tabulator-page.active{color:#d00}.tabulator .tabulator-footer .tabulator-page:disabled{opacity:.5}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover{cursor:pointer;background:rgba(0,0,0,.2);color:#fff}}.tabulator .tabulator-col-resize-handle{position:relative;display:inline-block;width:6px;margin-left:-3px;margin-right:-3px;z-index:10;vertical-align:middle}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-col-resize-handle:hover{cursor:ew-resize}}.tabulator .tabulator-col-resize-handle:last-of-type{width:3px;margin-right:0}.tabulator .tabulator-alert{position:absolute;display:flex;align-items:center;top:0;left:0;z-index:100;height:100%;width:100%;background:rgba(0,0,0,.4);text-align:center}.tabulator .tabulator-alert .tabulator-alert-msg{display:inline-block;margin:0 auto;padding:10px 20px;border-radius:10px;background:#fff;font-weight:700;font-size:16px}.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-msg{border:4px solid #333;color:#000}.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-error{border:4px solid #d00;color:#590000}.tabulator-row{position:relative;box-sizing:border-box;min-height:22px}.tabulator-row,.tabulator-row.tabulator-row-even{background-color:#fff}@media (hover:hover) and (pointer:fine){.tabulator-row.tabulator-selectable:hover{background-color:#bbb;cursor:pointer}}.tabulator-row.tabulator-selected{background-color:#9abcea}@media (hover:hover) and (pointer:fine){.tabulator-row.tabulator-selected:hover{background-color:#769bcc;cursor:pointer}}.tabulator-row.tabulator-row-moving{border:1px solid #000;background:#fff}.tabulator-row.tabulator-moving{position:absolute;border-top:1px solid #ddd;border-bottom:1px solid #ddd;pointer-events:none;z-index:15}.tabulator-row .tabulator-row-resize-handle{position:absolute;right:0;bottom:0;left:0;height:5px}.tabulator-row .tabulator-row-resize-handle.prev{top:0;bottom:auto}@media (hover:hover) and (pointer:fine){.tabulator-row .tabulator-row-resize-handle:hover{cursor:ns-resize}}.tabulator-row .tabulator-responsive-collapse{box-sizing:border-box;padding:5px;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.tabulator-row .tabulator-responsive-collapse:empty{display:none}.tabulator-row .tabulator-responsive-collapse table{font-size:14px}.tabulator-row .tabulator-responsive-collapse table tr td{position:relative}.tabulator-row .tabulator-responsive-collapse table tr td:first-of-type{padding-right:10px}.tabulator-row .tabulator-cell{display:inline-block;position:relative;box-sizing:border-box;padding:4px;border-right:1px solid #ddd;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tabulator-row .tabulator-cell.tabulator-frozen{display:inline-block;position:sticky;left:0;background-color:inherit;z-index:11}.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left{border-right:2px solid #ddd}.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right{border-left:2px solid #ddd}.tabulator-row .tabulator-cell.tabulator-editing{border:1px solid #1d68cd;outline:none;padding:0}.tabulator-row .tabulator-cell.tabulator-editing input,.tabulator-row .tabulator-cell.tabulator-editing select{border:1px;background:transparent;outline:none}.tabulator-row .tabulator-cell.tabulator-validation-fail{border:1px solid #d00}.tabulator-row .tabulator-cell.tabulator-validation-fail input,.tabulator-row .tabulator-cell.tabulator-validation-fail select{border:1px;background:transparent;color:#d00}.tabulator-row .tabulator-cell.tabulator-row-handle{display:inline-flex;align-items:center;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box{width:80%}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar{width:100%;height:3px;margin-top:2px;background:#666}.tabulator-row .tabulator-cell .tabulator-data-tree-branch-empty{display:inline-block;width:7px}.tabulator-row .tabulator-cell .tabulator-data-tree-branch{display:inline-block;vertical-align:middle;height:9px;width:7px;margin-top:-9px;margin-right:5px;border-bottom-left-radius:1px;border-left:2px solid #ddd;border-bottom:2px solid #ddd}.tabulator-row .tabulator-cell .tabulator-data-tree-control{display:inline-flex;justify-content:center;align-items:center;vertical-align:middle;height:11px;width:11px;margin-right:5px;border:1px solid #333;border-radius:2px;background:rgba(0,0,0,.1);overflow:hidden}@media (hover:hover) and (pointer:fine){.tabulator-row .tabulator-cell .tabulator-data-tree-control:hover{cursor:pointer;background:rgba(0,0,0,.2)}}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse{display:inline-block;position:relative;height:7px;width:1px;background:transparent}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand{display:inline-block;position:relative;height:7px;width:1px;background:#333}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle{display:inline-flex;align-items:center;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;height:15px;width:15px;border-radius:20px;background:#666;color:#fff;font-weight:700;font-size:1.1em}@media (hover:hover) and (pointer:fine){.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle:hover{opacity:.7;cursor:pointer}}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-close{display:initial}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-open{display:none}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle svg{stroke:#fff}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle .tabulator-responsive-collapse-toggle-close{display:none}.tabulator-row .tabulator-cell .tabulator-traffic-light{display:inline-block;height:14px;width:14px;border-radius:14px}.tabulator-row.tabulator-group{box-sizing:border-box;border-bottom:1px solid #999;border-right:1px solid #ddd;border-top:1px solid #999;padding:5px 5px 5px 10px;background:#ccc;font-weight:700;min-width:100%}@media (hover:hover) and (pointer:fine){.tabulator-row.tabulator-group:hover{cursor:pointer;background-color:rgba(0,0,0,.1)}}.tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow{margin-right:10px;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #666;border-bottom:0}.tabulator-row.tabulator-group.tabulator-group-level-1{padding-left:30px}.tabulator-row.tabulator-group.tabulator-group-level-2{padding-left:50px}.tabulator-row.tabulator-group.tabulator-group-level-3{padding-left:70px}.tabulator-row.tabulator-group.tabulator-group-level-4{padding-left:90px}.tabulator-row.tabulator-group.tabulator-group-level-5{padding-left:110px}.tabulator-row.tabulator-group .tabulator-group-toggle{display:inline-block}.tabulator-row.tabulator-group .tabulator-arrow{display:inline-block;width:0;height:0;margin-right:16px;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:0;border-left:6px solid #666;vertical-align:middle}.tabulator-row.tabulator-group span{margin-left:10px;color:#d00}.tabulator-popup-container{position:absolute;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #ddd;box-shadow:0 0 5px 0 rgba(0,0,0,.2);font-size:14px;overflow-y:auto;-webkit-overflow-scrolling:touch;z-index:10000}.tabulator-popup{padding:5px;border-radius:3px}.tabulator-tooltip{max-width:Min(500px,100%);padding:3px 5px;border-radius:2px;box-shadow:none;font-size:12px;pointer-events:none}.tabulator-menu .tabulator-menu-item{position:relative;box-sizing:border-box;padding:5px 10px;user-select:none}.tabulator-menu .tabulator-menu-item.tabulator-menu-item-disabled{opacity:.5}@media (hover:hover) and (pointer:fine){.tabulator-menu .tabulator-menu-item:not(.tabulator-menu-item-disabled):hover{cursor:pointer;background:#fff}}.tabulator-menu .tabulator-menu-item.tabulator-menu-item-submenu{padding-right:25px}.tabulator-menu .tabulator-menu-item.tabulator-menu-item-submenu:after{display:inline-block;position:absolute;top:calc(5px + .4em);right:10px;height:7px;width:7px;content:"";border-color:#ddd;border-style:solid;border-width:1px 1px 0 0;vertical-align:top;transform:rotate(45deg)}.tabulator-menu .tabulator-menu-separator{border-top:1px solid #ddd}.tabulator-edit-list{max-height:200px;font-size:14px;overflow-y:auto;-webkit-overflow-scrolling:touch}.tabulator-edit-list .tabulator-edit-list-item{padding:4px;color:#333;outline:none}.tabulator-edit-list .tabulator-edit-list-item.active{color:#fff;background:#1d68cd}.tabulator-edit-list .tabulator-edit-list-item.active.focused{outline:1px solid hsla(0,0%,100%,.5)}.tabulator-edit-list .tabulator-edit-list-item.focused{outline:1px solid #1d68cd}@media (hover:hover) and (pointer:fine){.tabulator-edit-list .tabulator-edit-list-item:hover{cursor:pointer;color:#fff;background:#1d68cd}}.tabulator-edit-list .tabulator-edit-list-placeholder{padding:4px;color:#333;text-align:center}.tabulator-edit-list .tabulator-edit-list-group{border-bottom:1px solid #ddd;padding:6px 4px 4px;color:#333;font-weight:700}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-2,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-2{padding-left:12px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-3,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-3{padding-left:20px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-4,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-4{padding-left:28px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-5,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-5{padding-left:36px}.tabulator.tabulator-ltr{direction:ltr}.tabulator.tabulator-rtl{text-align:initial;direction:rtl}.tabulator.tabulator-rtl .tabulator-header .tabulator-col{text-align:initial;border-left:1px solid #ddd;border-right:initial}.tabulator.tabulator-rtl .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{margin-right:0;margin-left:-1px}.tabulator.tabulator-rtl .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-right:0;padding-left:25px}.tabulator.tabulator-rtl .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter{left:8px;right:auto}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell{border-right:initial;border-left:1px solid #ddd}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell .tabulator-data-tree-branch{margin-right:0;margin-left:5px;border-bottom-left-radius:0;border-bottom-right-radius:1px;border-left:initial;border-right:2px solid #ddd}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell .tabulator-data-tree-control{margin-right:0;margin-left:5px}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left{border-left:2px solid #ddd}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right{border-right:2px solid #ddd}.tabulator.tabulator-rtl .tabulator-row .tabulator-col-resize-handle:last-of-type{width:3px;margin-left:0;margin-right:-3px}.tabulator.tabulator-rtl .tabulator-footer .tabulator-calcs-holder{text-align:initial}.tabulator-print-fullscreen{position:absolute;top:0;bottom:0;left:0;right:0;z-index:10000}body.tabulator-print-fullscreen-hide>:not(.tabulator-print-fullscreen){display:none!important}.tabulator-print-table{border-collapse:collapse}.tabulator-print-table .tabulator-data-tree-branch{display:inline-block;vertical-align:middle;height:9px;width:7px;margin-top:-9px;margin-right:5px;border-bottom-left-radius:1px;border-left:2px solid #ddd;border-bottom:2px solid #ddd}.tabulator-print-table .tabulator-print-table-group{box-sizing:border-box;border-bottom:1px solid #999;border-right:1px solid #ddd;border-top:1px solid #999;padding:5px 5px 5px 10px;background:#ccc;font-weight:700;min-width:100%}@media (hover:hover) and (pointer:fine){.tabulator-print-table .tabulator-print-table-group:hover{cursor:pointer;background-color:rgba(0,0,0,.1)}}.tabulator-print-table .tabulator-print-table-group.tabulator-group-visible .tabulator-arrow{margin-right:10px;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #666;border-bottom:0}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-1 td{padding-left:30px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-2 td{padding-left:50px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-3 td{padding-left:70px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-4 td{padding-left:90px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-5 td{padding-left:110px!important}.tabulator-print-table .tabulator-print-table-group .tabulator-group-toggle{display:inline-block}.tabulator-print-table .tabulator-print-table-group .tabulator-arrow{display:inline-block;width:0;height:0;margin-right:16px;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:0;border-left:6px solid #666;vertical-align:middle}.tabulator-print-table .tabulator-print-table-group span{color:#d00}.tabulator-print-table .tabulator-data-tree-control{display:inline-flex;justify-content:center;align-items:center;vertical-align:middle;height:11px;width:11px;margin-right:5px;border:1px solid #333;border-radius:2px;background:rgba(0,0,0,.1);overflow:hidden}@media (hover:hover) and (pointer:fine){.tabulator-print-table .tabulator-data-tree-control:hover{cursor:pointer;background:rgba(0,0,0,.2)}}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-collapse{display:inline-block;position:relative;height:7px;width:1px;background:transparent}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-expand{display:inline-block;position:relative;height:7px;width:1px;background:#333}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator{border:none;background-color:#fff}.tabulator .tabulator-header .tabulator-calcs-holder{background:#f2f2f2!important;border-bottom:1px solid #999}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row{background:#f2f2f2!important}.tabulator .tabulator-tableholder .tabulator-placeholder span{color:#000}.tabulator .tabulator-footer .tabulator-calcs-holder{background:#f2f2f2!important;border-bottom:1px solid #fff}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row{background:#f2f2f2!important}.tabulator-row{border-bottom:1px solid #ddd}.tabulator-row .tabulator-cell:last-of-type{border-right:none}.tabulator-row.tabulator-group span{color:#666}.tabulator-print-table .tabulator-print-table-group span{margin-left:10px;color:#666} */ /*# sourceMappingURL=tabulator_simple.min.css.map */ \ No newline at end of file From 7533c3e7e12762e12b647d4e57924e9c3e923fb7 Mon Sep 17 00:00:00 2001 From: myname Date: Thu, 21 Sep 2023 10:54:21 +0900 Subject: [PATCH 2/7] =?UTF-8?q?2023-09-21=2010:54=20=EC=83=88=EB=A1=9C?= =?UTF-8?q?=EC=9A=B4=20=EB=A1=9C=EA=B7=B8=20=EA=B4=80=EB=A6=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kcc/com/cmm/util/StringUtil2.java | 12 + .../log/clg/service/EgovLoginLogService.java | 4 + .../kcc/let/sym/log/clg/service/LoginLog.java | 29 ++ .../service/impl/EgovLoginLogServiceImpl.java | 10 + .../sym/log/clg/service/impl/LoginLogDAO.java | 8 + .../log/clg/web/EgovLoginLogController.java | 87 +++++- .../sym/log/lgm/service/EgovSysLogAspect.java | 1 + .../service/impl/EgovSysLogServiceImpl.java | 66 +++- .../sym/log/lgm/service/impl/SysLogDAO.java | 20 +- .../sym/log/clg/EgovLoginLog_SQL_Mysql.xml | 118 ++++++- .../let/sym/log/lgm/EgovSysLog_SQL_Mysql.xml | 90 ++++++ src/main/webapp/WEB-INF/decorators.xml | 2 + .../jsp/sym/log/clg/NSelectLoginLogList.jsp | 209 +++++++++++++ .../jsp/sym/log/clg/NSelectWebLogList.jsp | 208 ++++++++++++ .../jsp/sym/log/clg/SelectLogMethodList.jsp | 198 +++++++----- .../WEB-INF/jsp/sym/log/clg/ViewLogMethod.jsp | 295 ++++++++++++++---- 16 files changed, 1210 insertions(+), 147 deletions(-) create mode 100644 src/main/webapp/WEB-INF/jsp/sym/log/clg/NSelectLoginLogList.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/sym/log/clg/NSelectWebLogList.jsp diff --git a/src/main/java/kcc/com/cmm/util/StringUtil2.java b/src/main/java/kcc/com/cmm/util/StringUtil2.java index 6e0257fc..b5a0e1fb 100644 --- a/src/main/java/kcc/com/cmm/util/StringUtil2.java +++ b/src/main/java/kcc/com/cmm/util/StringUtil2.java @@ -577,5 +577,17 @@ public final class StringUtil2 { int fieldLength = 10; } + + public static String extractLogMethodNm( + String p_url + ) throws Exception{ + String[] s_arr = p_url.split("/"); + + if (s_arr.length>=3) { + return s_arr[s_arr.length-3]+"/"+s_arr[s_arr.length-2]+"/"+s_arr[s_arr.length-1]; + } + + return p_url; + } } diff --git a/src/main/java/kcc/let/sym/log/clg/service/EgovLoginLogService.java b/src/main/java/kcc/let/sym/log/clg/service/EgovLoginLogService.java index 15ae0fea..2c93bf7c 100644 --- a/src/main/java/kcc/let/sym/log/clg/service/EgovLoginLogService.java +++ b/src/main/java/kcc/let/sym/log/clg/service/EgovLoginLogService.java @@ -55,6 +55,10 @@ public interface EgovLoginLogService { public void logInsertAdminLoginLog(LoginLog loginLog) throws Exception; public List selectAmdinLog(LoginLog loginLog) throws Exception; + + public List selectNAmdinLog(LoginLog loginLog) throws Exception; + + public List selectNWebLog(LoginLog loginLog) throws Exception; public int selectAmdinLogTotCnt(LoginLog loginLog) throws Exception; diff --git a/src/main/java/kcc/let/sym/log/clg/service/LoginLog.java b/src/main/java/kcc/let/sym/log/clg/service/LoginLog.java index 970a401a..75bd38cf 100644 --- a/src/main/java/kcc/let/sym/log/clg/service/LoginLog.java +++ b/src/main/java/kcc/let/sym/log/clg/service/LoginLog.java @@ -146,6 +146,12 @@ public class LoginLog extends ComDefaultVO implements Serializable { private String totalLogCnt; + private String useYn; //통계 사용여부 + + private String sortNum; //통계 순서 + + private String methodCd; //통계 순서 + private List logDataList = new ArrayList() ; @@ -480,4 +486,27 @@ public class LoginLog extends ComDefaultVO implements Serializable { this.totalLogCnt = totalLogCnt; } + public String getUseYn() { + return useYn; + } + + public void setUseYn(String useYn) { + this.useYn = useYn; + } + + public String getSortNum() { + return sortNum; + } + + public void setSortNum(String sortNum) { + this.sortNum = sortNum; + } + + public String getMethodCd() { + return methodCd; + } + + public void setMethodCd(String methodCd) { + this.methodCd = methodCd; + } } diff --git a/src/main/java/kcc/let/sym/log/clg/service/impl/EgovLoginLogServiceImpl.java b/src/main/java/kcc/let/sym/log/clg/service/impl/EgovLoginLogServiceImpl.java index e8f27080..65a59df1 100644 --- a/src/main/java/kcc/let/sym/log/clg/service/impl/EgovLoginLogServiceImpl.java +++ b/src/main/java/kcc/let/sym/log/clg/service/impl/EgovLoginLogServiceImpl.java @@ -122,6 +122,16 @@ public class EgovLoginLogServiceImpl extends EgovAbstractServiceImpl implements return loginLogDAO.selectAmdinLog(loginLog); } + @Override + public List selectNAmdinLog(LoginLog loginLog) throws Exception { + return loginLogDAO.selectNAmdinLog(loginLog); + } + + @Override + public List selectNWebLog(LoginLog loginLog) throws Exception { + return loginLogDAO.selectNWebLog(loginLog); + } + @Override public int selectAmdinLogTotCnt(LoginLog loginLog) throws Exception { return loginLogDAO.selectAmdinLogTotCnt(loginLog); diff --git a/src/main/java/kcc/let/sym/log/clg/service/impl/LoginLogDAO.java b/src/main/java/kcc/let/sym/log/clg/service/impl/LoginLogDAO.java index abaeb7ef..f3dc7e5c 100644 --- a/src/main/java/kcc/let/sym/log/clg/service/impl/LoginLogDAO.java +++ b/src/main/java/kcc/let/sym/log/clg/service/impl/LoginLogDAO.java @@ -102,6 +102,14 @@ public class LoginLogDAO extends EgovAbstractDAO { return (List)list("LoginLogDAO.selectAmdinLog", loginLog); } + public List selectNAmdinLog(LoginLog loginLog) throws Exception{ + return (List)list("LoginLogDAO.selectNAmdinLog", loginLog); + } + + public List selectNWebLog(LoginLog loginLog) throws Exception{ + return (List)list("LoginLogDAO.selectNWebLog", loginLog); + } + public int selectAmdinLogTotCnt(LoginLog loginLog) throws Exception{ return (Integer)select("LoginLogDAO.selectAmdinLogTotCnt", loginLog); } diff --git a/src/main/java/kcc/let/sym/log/clg/web/EgovLoginLogController.java b/src/main/java/kcc/let/sym/log/clg/web/EgovLoginLogController.java index 941dc86c..d645d98f 100644 --- a/src/main/java/kcc/let/sym/log/clg/web/EgovLoginLogController.java +++ b/src/main/java/kcc/let/sym/log/clg/web/EgovLoginLogController.java @@ -122,6 +122,84 @@ public class EgovLoginLogController { return "sym/log/clg/EgovLoginLogList"; } + /** + * 로그인 로그 목록 조회(관리자) + * + * @param loginLog + * @return sym/log/clg/EgovLoginLogList + * @throws Exception + */ + @RequestMapping(value = "/sym/log/clg/NSelectLoginLogList.do") + public String NSelectLoginLogList(@ModelAttribute("searchVO") LoginLog loginLog, @RequestParam Map commandMap ,ModelMap model) throws Exception { + + if(loginLog.getPageUnit() != 10) { + loginLog.setPageUnit(loginLog.getPageUnit()); + } + PaginationInfo paginationInfo = new PaginationInfo(); + paginationInfo.setCurrentPageNo(loginLog.getPageIndex()); + paginationInfo.setRecordCountPerPage(loginLog.getPageUnit()); + paginationInfo.setPageSize(loginLog.getPageSize()); + + loginLog.setFirstIndex(paginationInfo.getFirstRecordIndex()); + loginLog.setLastIndex(paginationInfo.getLastRecordIndex()); + loginLog.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); + + if("".equals(loginLog.getSearchSortCnd())){ //최초조회시 최신것 조회List + loginLog.setSearchSortCnd("b.ADMINLOG_ID"); + loginLog.setSearchSortOrd("desc"); + } + List adminLogList = loginLogService.selectNAmdinLog(loginLog); + int adminLogListCnt = 0; + + if (adminLogList.size()>0) { + adminLogListCnt = adminLogList.get(0).getTotCnt(); + } + + paginationInfo.setTotalRecordCount(adminLogListCnt); + model.addAttribute("paginationInfo", paginationInfo); + model.addAttribute("adminLogList", adminLogList); + return "sym/log/clg/NSelectLoginLogList"; + } + + /** + * 로그인 로그 목록 조회(관리자) + * + * @param loginLog + * @return sym/log/clg/EgovLoginLogList + * @throws Exception + */ + @RequestMapping(value = "/sym/log/clg/NSelectWebLogList.do") + public String NSelectWebLogList(@ModelAttribute("searchVO") LoginLog loginLog, @RequestParam Map commandMap ,ModelMap model) throws Exception { + + if(loginLog.getPageUnit() != 10) { + loginLog.setPageUnit(loginLog.getPageUnit()); + } + PaginationInfo paginationInfo = new PaginationInfo(); + paginationInfo.setCurrentPageNo(loginLog.getPageIndex()); + paginationInfo.setRecordCountPerPage(loginLog.getPageUnit()); + paginationInfo.setPageSize(loginLog.getPageSize()); + + loginLog.setFirstIndex(paginationInfo.getFirstRecordIndex()); + loginLog.setLastIndex(paginationInfo.getLastRecordIndex()); + loginLog.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); + + if("".equals(loginLog.getSearchSortCnd())){ //최초조회시 최신것 조회List + loginLog.setSearchSortCnd("b.ADMINLOG_ID"); + loginLog.setSearchSortOrd("desc"); + } + List adminLogList = loginLogService.selectNWebLog(loginLog); + int adminLogListCnt = 0; + + if (adminLogList.size()>0) { + adminLogListCnt = adminLogList.get(0).getTotCnt(); + } + + paginationInfo.setTotalRecordCount(adminLogListCnt); + model.addAttribute("paginationInfo", paginationInfo); + model.addAttribute("adminLogList", adminLogList); + return "sym/log/clg/NSelectWebLogList"; + } + /** * 로그인 로그 상세 조회 * @@ -245,11 +323,16 @@ public class EgovLoginLogController { * @throws Exception */ @RequestMapping(value = "/sym/log/clg/SelectLogMethodList.do") - public String selectLogMethodList(@ModelAttribute("searchVO") LoginLog loginLog, @RequestParam Map commandMap ,ModelMap model) throws Exception { - + public String selectLogMethodList( + @ModelAttribute("searchVO") LoginLog loginLog, + @RequestParam Map commandMap , + ModelMap model + ) throws Exception { + /* if(loginLog.getPageUnit() != 10) { loginLog.setPageUnit(loginLog.getPageUnit()); } + */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(loginLog.getPageIndex()); paginationInfo.setRecordCountPerPage(loginLog.getPageUnit()); diff --git a/src/main/java/kcc/let/sym/log/lgm/service/EgovSysLogAspect.java b/src/main/java/kcc/let/sym/log/lgm/service/EgovSysLogAspect.java index 3e12b984..66c04df3 100644 --- a/src/main/java/kcc/let/sym/log/lgm/service/EgovSysLogAspect.java +++ b/src/main/java/kcc/let/sym/log/lgm/service/EgovSysLogAspect.java @@ -435,6 +435,7 @@ public class EgovSysLogAspect { * @throws Exception */ public void logAdminSelect(JoinPoint joinPoint) throws Throwable { + System.out.println("logAdminSelect"); Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); if(isAuthenticated.booleanValue()) { SysLog sysLog = new SysLog(); diff --git a/src/main/java/kcc/let/sym/log/lgm/service/impl/EgovSysLogServiceImpl.java b/src/main/java/kcc/let/sym/log/lgm/service/impl/EgovSysLogServiceImpl.java index 2aa99b3e..79c5bf42 100644 --- a/src/main/java/kcc/let/sym/log/lgm/service/impl/EgovSysLogServiceImpl.java +++ b/src/main/java/kcc/let/sym/log/lgm/service/impl/EgovSysLogServiceImpl.java @@ -3,17 +3,18 @@ package kcc.let.sym.log.lgm.service.impl; import java.util.HashMap; import java.util.Map; +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import kcc.com.cmm.LoginVO; +import kcc.com.cmm.util.StringUtil2; import kcc.let.sym.log.lgm.service.EgovSysLogService; import kcc.let.sym.log.lgm.service.SysLog; -import javax.annotation.Resource; - -import org.springframework.stereotype.Service; - /** * 로그관리(시스템)를 위한 서비스 구현 클래스 * @author 공통서비스개발팀 이삼섭 @@ -100,6 +101,9 @@ public class EgovSysLogServiceImpl extends EgovAbstractServiceImpl implements return _map; } + /* + * 관리자 로그 정보 이므로, method_cd='A' 이어야만 한다. + * */ @Override public void logInsertAdminSysLog(SysLog sysLog) throws Exception { String requstId = egovAdminLogIdGnrService.getNextStringId(); @@ -108,7 +112,59 @@ public class EgovSysLogServiceImpl extends EgovAbstractServiceImpl implements if(null != loginVO){ sysLog.setSiteId(loginVO.getSiteId()); } - sysLogDAO.logInsertAdminSysLog(sysLog); + + //하기 내용으로 대체 - 2023-09-21 + //sysLogDAO.logInsertAdminSysLog(sysLog); + + //고유값으로 만들기 + sysLog.setMethodNm(StringUtil2.extractLogMethodNm(sysLog.getUrl())); + + //sysLogDAO.logInsertAdminSysLog(sysLog); + int i = sysLogDAO.logInsertAdminSysLogNewStep1(sysLog); + + System.out.println("=====i====="); + System.out.println(i); + System.out.println(i); + + String[] s_arr = sysLog.getSrvcNm().split("[.]"); + sysLog.setTrgetMenuNm(s_arr[s_arr.length-1]); + + System.out.println("=====i====="+sysLog.getTrgetMenuNm()); + System.out.println("=====i====="+sysLog.getSrvcNm()); + System.out.println("=====i====="+sysLog.getUrl()); + System.out.println("=====i====="+sysLog.getPageUnit()); + System.out.println("=====i====="+sysLog.getRqsterNm()); + + System.out.println("=====i====="+sysLog.getMethodNm()); + + + try { + //저장이 안되었으면 LETTNADMINMETHOD 테이블에 추가하고 다시 저장해보기 + if (i<=0) { + //LETTNADMINMETHOD 테이블에 추가하기 + i = sysLogDAO.logInsertAdminSysLogNewStep3(sysLog); + + //다시 로그 남기기 + i = sysLogDAO.logInsertAdminSysLogNewStep1(sysLog); + } + + System.out.println("====re=i====="); + System.out.println(i); + System.out.println(i); + + //그래도 저장이 안되었으면 길이잘라서 log만 저장하기 + if (i<=0) { + if (sysLog.getUrl().length()>1000) sysLog.setUrl(sysLog.getUrl().substring(0,1000)); + + i = sysLogDAO.logInsertAdminSysLogNewStep2(sysLog); + + System.out.println("=====i====="); + System.out.println(i); + System.out.println(i); + } + }catch(Exception ex) { + System.out.println(ex.getMessage()); + } } } diff --git a/src/main/java/kcc/let/sym/log/lgm/service/impl/SysLogDAO.java b/src/main/java/kcc/let/sym/log/lgm/service/impl/SysLogDAO.java index 8ee0c1b1..a685b4fa 100644 --- a/src/main/java/kcc/let/sym/log/lgm/service/impl/SysLogDAO.java +++ b/src/main/java/kcc/let/sym/log/lgm/service/impl/SysLogDAO.java @@ -2,11 +2,11 @@ package kcc.let.sym.log.lgm.service.impl; import java.util.List; +import org.springframework.stereotype.Repository; + import egovframework.rte.psl.dataaccess.EgovAbstractDAO; import kcc.let.sym.log.lgm.service.SysLog; -import org.springframework.stereotype.Repository; - /** * 로그관리(시스템)를 위한 데이터 접근 클래스 * @author 공통서비스개발팀 이삼섭 @@ -96,4 +96,20 @@ public class SysLogDAO extends EgovAbstractDAO { } + + public int logInsertAdminSysLogNewStep1(SysLog sysLog) throws Exception{ + return update("SysLogDAO.logInsertAdminSysLogNewStep1", sysLog); + //return update("SysLogDAO.logInsertAdminSysLogNewStep1_bak", sysLog); + + } + + public int logInsertAdminSysLogNewStep2(SysLog sysLog) throws Exception{ + return update("SysLogDAO.logInsertAdminSysLogNewStep2", sysLog); + + } + + public int logInsertAdminSysLogNewStep3(SysLog sysLog) throws Exception{ + return update("SysLogDAO.logInsertAdminSysLogNewStep3", sysLog); + + } } diff --git a/src/main/resources/egovframework/sqlmap/let/sym/log/clg/EgovLoginLog_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/sym/log/clg/EgovLoginLog_SQL_Mysql.xml index 21a70b7c..c5f407ef 100644 --- a/src/main/resources/egovframework/sqlmap/let/sym/log/clg/EgovLoginLog_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/sym/log/clg/EgovLoginLog_SQL_Mysql.xml @@ -227,7 +227,116 @@ , now()) + + + + + + - /* 임시.*NOT_SQL_LOG.* */ + /* 임시.*NOT_SQL_LOG.* selectLogMethodList */ SELECT COUNT(A.ADMOT_ID) OVER() AS totCnt, A.ADMOT_ID AS admotId, @@ -302,7 +411,10 @@ A.APPRO_NM AS approNm, A.PARAM AS param, A.CREAT_DT AS tempSortNum, - A.PRIVACY AS privacy + A.PRIVACY AS privacy, + A.USE_YN AS useYn, + A.SORT_NUM AS sortNum, + A.method_cd as dateType FROM LETTNADMINMETHOD A WHERE 1=1 @@ -360,6 +472,8 @@ , MENU_NM = #menuNm# , APPRO_NM = #approNm# , PRIVACY = #privacy# + , USE_YN = #useYn# + , sort_num = #sortNum# WHERE ADMOT_ID = #admotId# diff --git a/src/main/resources/egovframework/sqlmap/let/sym/log/lgm/EgovSysLog_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/sym/log/lgm/EgovSysLog_SQL_Mysql.xml index 6f3e1f56..213cde13 100644 --- a/src/main/resources/egovframework/sqlmap/let/sym/log/lgm/EgovSysLog_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/sym/log/lgm/EgovSysLog_SQL_Mysql.xml @@ -192,5 +192,95 @@ LIMIT 1 + + + + /* SysLogDAO.logInsertAdminSysLogNewStep1 */ + INSERT INTO LETTNADMINLOG + ( ADMINLOG_ID + , CONECT_ID + , CONECT_IP + , CREAT_DT + , PROGRM_FILE_NM + , MENU_NM + , APPRO_NM + , URL + ) + SELECT #requstId# , + #rqesterId# , + #rqesterIp# , + + now(), + + #methodNm#, + MENU_NM , + APPRO_NM , + #url# + FROM LETTNADMINMETHOD + WHERE METHOD_NM = #methodNm# + AND method_cd='A' + + PARAM = #param# + + + PARAM = 'N' + + LIMIT 1 + + + + + /* SysLogDAO.logInsertAdminSysLogNewStep2 */ + INSERT INTO LETTNADMINLOG + ( ADMINLOG_ID + , CONECT_ID + , CONECT_IP + , CREAT_DT + , PROGRM_FILE_NM + , MENU_NM + , APPRO_NM + , URL + ) + SELECT #requstId# , + #rqesterId# , + #rqesterIp# , + + now(), + + #methodNm#, + 'MENU_NM' , + 'APPRO_NM' , + #url# + + + + + + /* SysLogDAO.logInsertAdminSysLogNewStep3 */ + INSERT INTO lettnadminmethod ( + admot_id, + method_nm, + param, + creat_dt, + menu_nm, + appro_nm, + privacy, + method_cd /* A or U */ + ) + + SELECT + MAX(REPLACE(admot_id,'ADMOTID_','')*1)+1 + , #methodNm# + , 'N' + + , NOW() + + , #trgetMenuNm# + , #url# + , 'N' + , 'A' + FROM LETTNADMINMETHOD + + diff --git a/src/main/webapp/WEB-INF/decorators.xml b/src/main/webapp/WEB-INF/decorators.xml index 2e19111e..d4d0132f 100644 --- a/src/main/webapp/WEB-INF/decorators.xml +++ b/src/main/webapp/WEB-INF/decorators.xml @@ -80,6 +80,7 @@ /cmm/main/mainPage.do /cmm/main/exctvMainPage.do /kccadr/* + /sym/log/clg/SelectLogMethodList.do @@ -124,6 +125,7 @@ /web/kccadr/payment/inipay/* /kccadr/adjPgrMgr/drtCtr/drtCtrReg_for_ApprovManageEndDetail.do + diff --git a/src/main/webapp/WEB-INF/jsp/sym/log/clg/NSelectLoginLogList.jsp b/src/main/webapp/WEB-INF/jsp/sym/log/clg/NSelectLoginLogList.jsp new file mode 100644 index 00000000..c328ea0d --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/sym/log/clg/NSelectLoginLogList.jsp @@ -0,0 +1,209 @@ +<%-- + Class Name : EgovLoginLogList.jsp + Description : 로그인 로그 정보목록 화면 + Modification Information + + 수정일 수정자 수정내용 + ------- -------- --------------------------- + 2009.03.11 이삼섭 최초 생성 + 2011.08.31 JJY 경량환경 버전 생성 + + author : 공통서비스 개발팀 이삼섭 + since : 2009.03.11 +--%> +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> + + + + + + +로그인 로그 목록 + + + +
+ + + " /> + " /> + + +
+
+ + +
+

관리자로그 관리

+
    +
  • +
  • +

    로그관리

    +
  • +
  • 관리자로그 관리
  • +
+
+ + +
+ +
+
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
번호 메뉴명 접근구분 메소드 접속ID 접속IP 접속URL 접속일자
+ + + + + + +
+
+ + +
+ +
+ +
+
+
+
+
+ + + + +
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/sym/log/clg/NSelectWebLogList.jsp b/src/main/webapp/WEB-INF/jsp/sym/log/clg/NSelectWebLogList.jsp new file mode 100644 index 00000000..2e138fec --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/sym/log/clg/NSelectWebLogList.jsp @@ -0,0 +1,208 @@ +<%-- + Class Name : EgovLoginLogList.jsp + Description : 로그인 로그 정보목록 화면 + Modification Information + + 수정일 수정자 수정내용 + ------- -------- --------------------------- + 2009.03.11 이삼섭 최초 생성 + 2011.08.31 JJY 경량환경 버전 생성 + + author : 공통서비스 개발팀 이삼섭 + since : 2009.03.11 +--%> +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> + + + + + + +로그인 로그 목록 + + + +
+ + + " /> + " /> + +
+
+ + +
+

사용자로그 관리

+
    +
  • +
  • +

    로그관리

    +
  • +
  • 사용자로그 관리
  • +
+
+ + +
+ +
+
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
번호 메뉴명 접근구분 메소드 접속ID 접속IP 접속URL 접속일자
+ + + + + + +
+
+ + +
+ +
+ +
+
+
+
+
+ + + + +
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/sym/log/clg/SelectLogMethodList.jsp b/src/main/webapp/WEB-INF/jsp/sym/log/clg/SelectLogMethodList.jsp index ad346c62..f1649af6 100644 --- a/src/main/webapp/WEB-INF/jsp/sym/log/clg/SelectLogMethodList.jsp +++ b/src/main/webapp/WEB-INF/jsp/sym/log/clg/SelectLogMethodList.jsp @@ -1,5 +1,5 @@ <%-- - Class Name : EgovLoginLogList.jsp + Class Name : SelectLogMethodList.jsp Description : 로그인 로그 정보목록 화면 Modification Information @@ -124,7 +124,6 @@ function fnCheckAll(){ } -로그인 로그 목록 @@ -137,37 +136,67 @@ function fnCheckAll(){ -
-
-
-

관리자로그설정관리

-

관리자 로그 설정을 관리할 수 있습니다.

-
-
-
- - - -
-
-

건수 :

-
- - - +
+
+ +
+

관리자로그설정관리

+
    +
  • +
  • +

    운영관리

    +
  • +
  • 관리자로그설정관리
  • +
-
-
- - + + +
+ +
+
+ +
+
+ + + +
+

+ 총 건수 : + + + + 건 +

+
+ +
+
+ + + +
+
+ @@ -176,11 +205,12 @@ function fnCheckAll(){ - - - - - + + + + + + @@ -188,55 +218,65 @@ function fnCheckAll(){ - + + + + - - + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - -
번호 메뉴명 메소드명 파라미터 개인정보여부 등록일자 게시판관리사용자구분통계사용여부통계순서관리
- - - - - - - - - - -
+ + + + + + + + +
-
-
- - -
- - -
+ + + +
+ + + + +
    - -
-
-
- + + +
+ + +
+
diff --git a/src/main/webapp/WEB-INF/jsp/sym/log/clg/ViewLogMethod.jsp b/src/main/webapp/WEB-INF/jsp/sym/log/clg/ViewLogMethod.jsp index 137c8f02..90e9d7c1 100644 --- a/src/main/webapp/WEB-INF/jsp/sym/log/clg/ViewLogMethod.jsp +++ b/src/main/webapp/WEB-INF/jsp/sym/log/clg/ViewLogMethod.jsp @@ -1,42 +1,133 @@ <%-- - Class Name : FmsFileModify.jsp - Description : 첨부파일 수정 페이지 + Class Name : SelectLogMethodList.jsp + Description : 로그인 로그 정보목록 화면 Modification Information - + 수정일 수정자 수정내용 ------- -------- --------------------------- - 2009.09.16 장동한 최초 생성 - - author : 공통서비스 개발팀 장동한 - since : 2009.09.16 - - Copyright (C) 2009 by MOPAS All right reserved. + 2009.03.11 이삼섭 최초 생성 + 2011.08.31 JJY 경량환경 버전 생성 + + author : 공통서비스 개발팀 이삼섭 + since : 2009.03.11 --%> -<%@ page contentType="text/html; charset=utf-8"%> +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> -<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> -<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> - - - - + -팝업창관리 관리 - - - + - + -
-
-
-

관리자로그설정관리

-

관리자 로그 설정을 관리 합니다.

-
-
-
-

*는 필수입력 항목입니다.

-
- + + " /> + "/> + + +
+
+ +
+

관리자로그설정관리상세

+ +
    +
  • +
  • +

    운영관리

    +
  • +
  • 관리자로그설정관리
  • +
  • 상세화면
  • +
+
+ + +
+ + + + + +
+ + +
@@ -128,35 +238,65 @@ function fn_delete() { - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - @@ -173,8 +313,49 @@ function fn_delete() { - + + + + + + + + + + + + + + +
+
    + +
+
+
+ + + + + + + + + " /> + "/> + + + - + \ No newline at end of file From 3571b03d7a7e9cf32594662b0ffd337ab8ba6766 Mon Sep 17 00:00:00 2001 From: tolag3 Date: Thu, 21 Sep 2023 11:19:50 +0900 Subject: [PATCH 3/7] =?UTF-8?q?=EC=A0=84=EC=A1=B0=EC=A1=B0=EC=A0=95?= =?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 메인페이지 텍스트 수정 --- src/main/webapp/WEB-INF/jsp/web/main/mainPage.jsp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/main/mainPage.jsp b/src/main/webapp/WEB-INF/jsp/web/main/mainPage.jsp index 20c582d0..2c989798 100644 --- a/src/main/webapp/WEB-INF/jsp/web/main/mainPage.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/main/mainPage.jsp @@ -265,18 +265,18 @@ function fn_egov_inqire_notice(bbsId, nttId) {
  • - - 문의게시판 + + 1:1 문의
  • From 59a09ea2f29ba7d318e794e62962081d660360d9 Mon Sep 17 00:00:00 2001 From: myname Date: Thu, 21 Sep 2023 12:14:14 +0900 Subject: [PATCH 4/7] =?UTF-8?q?2023-09-21=2012:14=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=A1=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../log/clg/service/EgovLoginLogService.java | 2 + .../service/impl/EgovLoginLogServiceImpl.java | 54 ++++++++ .../sym/log/clg/service/impl/LoginLogDAO.java | 13 ++ .../log/clg/web/EgovLoginLogController.java | 2 +- src/main/java/kcc/web/MainController.java | 4 +- .../sym/log/clg/EgovLoginLog_SQL_Mysql.xml | 129 +++++++++++++++++- .../jsp/sym/log/clg/NSelectLoginLogList.jsp | 6 +- .../jsp/sym/log/clg/NSelectWebLogList.jsp | 12 +- 8 files changed, 207 insertions(+), 15 deletions(-) diff --git a/src/main/java/kcc/let/sym/log/clg/service/EgovLoginLogService.java b/src/main/java/kcc/let/sym/log/clg/service/EgovLoginLogService.java index 2c93bf7c..913becfc 100644 --- a/src/main/java/kcc/let/sym/log/clg/service/EgovLoginLogService.java +++ b/src/main/java/kcc/let/sym/log/clg/service/EgovLoginLogService.java @@ -29,6 +29,8 @@ public interface EgovLoginLogService { * @param LoginLog */ public void logInsertLoginLog(LoginLog loinLog) throws Exception; + + public int logInsertLoginLogNewStep1(LoginLog loinLog) throws Exception; /** * 접속로그를 조회한다. diff --git a/src/main/java/kcc/let/sym/log/clg/service/impl/EgovLoginLogServiceImpl.java b/src/main/java/kcc/let/sym/log/clg/service/impl/EgovLoginLogServiceImpl.java index 65a59df1..3f83ddbb 100644 --- a/src/main/java/kcc/let/sym/log/clg/service/impl/EgovLoginLogServiceImpl.java +++ b/src/main/java/kcc/let/sym/log/clg/service/impl/EgovLoginLogServiceImpl.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import kcc.com.cmm.util.StringUtil2; import kcc.let.sym.log.clg.service.EgovLoginLogService; import kcc.let.sym.log.clg.service.LoginLog; @@ -66,6 +67,59 @@ public class EgovLoginLogServiceImpl extends EgovAbstractServiceImpl implements loginLogDAO.logInsertWebLoginLog(loinLog); //사용자 페이지의 로그만 남김(메뉴에 등록된 페이지만 남김) } + public int logInsertLoginLogNewStep1(LoginLog loinLog) throws Exception { + // TODO Auto-generated method stub + String logId = egovLoginLogIdGnrService.getNextStringId(); + loinLog.setLogId(logId); + + //method name 설정 + //LETTNLOGINLOG_BAK 테이블을 위해서 추가됨 + //String[] s_arr = loinLog.getUrl().split("/"); + + //loinLog.setMethodNm(s_arr[s_arr.length-3]+"/"+s_arr[s_arr.length-2]+"/"+s_arr[s_arr.length-1]); + + loinLog.setMethodNm(StringUtil2.extractLogMethodNm(loinLog.getUrl())); + + + System.out.println("loinLog.getMethodNm()"); + System.out.println(loinLog.getMethodNm()); + + + //loginLogDAO.logInsertLoginLog(loinLog); + int i=loginLogDAO.logInsertWebLoginLogNewStep1(loinLog); //사용자 페이지의 로그만 남김(메뉴에 등록된 페이지만 남김) + + + System.out.println("=====i====="); + System.out.println(i); + System.out.println(i); + + try { + if (loinLog.getUrl().length()>400) { + loinLog.setUrl(loinLog.getUrl().substring(0,399)); + } + + if (i<=0) { + //LETTNADMINMETHOD 테이블에 추가하기 + loginLogDAO.logInsertWebLoginLogNewStep3(loinLog); + + //다시 남기기 + i=loginLogDAO.logInsertWebLoginLogNewStep1(loinLog); //사용자 페이지의 로그만 남김(메뉴에 등록된 페이지만 남김) + + //lettnloginlog 에 남기기 + i=loginLogDAO.logInsertWebLoginLogNewStep2(loinLog); //사용자 페이지의 로그만 남김(메뉴에 등록된 페이지만 남김) + } + + }catch(Exception ex) { + ex.printStackTrace(); + } + + System.out.println("=====i====="); + System.out.println(i); + System.out.println(i); + + return i; + } + /** * 접속로그를 조회한다. * diff --git a/src/main/java/kcc/let/sym/log/clg/service/impl/LoginLogDAO.java b/src/main/java/kcc/let/sym/log/clg/service/impl/LoginLogDAO.java index f3dc7e5c..25376638 100644 --- a/src/main/java/kcc/let/sym/log/clg/service/impl/LoginLogDAO.java +++ b/src/main/java/kcc/let/sym/log/clg/service/impl/LoginLogDAO.java @@ -143,6 +143,19 @@ public class LoginLogDAO extends EgovAbstractDAO { insert("LoginLogDAO.logInsertWebLoginLog", loinLog); } + public int logInsertWebLoginLogNewStep1(LoginLog loinLog) throws Exception{ + return update("LoginLogDAO.logInsertWebLoginLogNewStep1", loinLog); + //return update("LoginLogDAO.logInsertWebLoginLogNewStep1_bak", loinLog); + } + + public int logInsertWebLoginLogNewStep2(LoginLog loinLog) throws Exception{ + return update("LoginLogDAO.logInsertWebLoginLogNewStep2", loinLog); + } + + public int logInsertWebLoginLogNewStep3(LoginLog loinLog) throws Exception{ + return update("LoginLogDAO.logInsertWebLoginLogNewStep3_bak", loinLog); + } + @SuppressWarnings("unchecked") public List selectWebLogList(LoginLog loginLog) throws Exception{ return (List)list("LoginLogDAO.selectWebLogList", loginLog); diff --git a/src/main/java/kcc/let/sym/log/clg/web/EgovLoginLogController.java b/src/main/java/kcc/let/sym/log/clg/web/EgovLoginLogController.java index d645d98f..c0bb13f8 100644 --- a/src/main/java/kcc/let/sym/log/clg/web/EgovLoginLogController.java +++ b/src/main/java/kcc/let/sym/log/clg/web/EgovLoginLogController.java @@ -184,7 +184,7 @@ public class EgovLoginLogController { loginLog.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); if("".equals(loginLog.getSearchSortCnd())){ //최초조회시 최신것 조회List - loginLog.setSearchSortCnd("b.ADMINLOG_ID"); + loginLog.setSearchSortCnd("b.CREAT_DT"); loginLog.setSearchSortOrd("desc"); } List adminLogList = loginLogService.selectNWebLog(loginLog); diff --git a/src/main/java/kcc/web/MainController.java b/src/main/java/kcc/web/MainController.java index d2c91ae0..3eaeb94b 100644 --- a/src/main/java/kcc/web/MainController.java +++ b/src/main/java/kcc/web/MainController.java @@ -735,7 +735,9 @@ public class MainController { }else { loginLog.setUrl(request.getRequestURI()); } - loginLogService.logInsertLoginLog(loginLog); + //loginLogService.logInsertLoginLog(loginLog); + + loginLogService.logInsertLoginLogNewStep1(loginLog); } //오늘 접속 / 최종접속 diff --git a/src/main/resources/egovframework/sqlmap/let/sym/log/clg/EgovLoginLog_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/sym/log/clg/EgovLoginLog_SQL_Mysql.xml index c5f407ef..2db991ad 100644 --- a/src/main/resources/egovframework/sqlmap/let/sym/log/clg/EgovLoginLog_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/sym/log/clg/EgovLoginLog_SQL_Mysql.xml @@ -298,13 +298,16 @@ , c.USER_ID AS loginId , c.USER_NM AS userNm FROM LETTNADMINMETHOD a - , LETTNADMINLOG b - , COMVNUSERMASTER c + , lettnloginlog b + LEFT OUTER JOIN COMVNUSERMASTER c + ON( + 1=1 + AND b.CONECT_ID =c.ESNTL_ID + ) WHERE 1=1 AND a.use_yn='Y' AND a.method_cd='U' - AND a.METHOD_NM =b.PROGRM_FILE_NM - AND b.CONECT_ID =c.ESNTL_ID + AND a.METHOD_NM =b.PROGRM_FILE_NM @@ -546,6 +549,124 @@ AND B.URL = #url# + + + /* 임시.*NOT_SQL_LOG.* */ + /* 2023-06-20일 저장확인을 위해 update 추가함*/ + /* LoginLogDAO.logInsertWebLoginLogNewStep1 */ + INSERT INTO LETTNLOGINLOG + ( LOG_ID + , CONECT_ID + , CONECT_IP + , USER_AT + , DEVICE_TYPE /**인테넛,모바일 */ + , PROGRM_FILE_NM + , MENU_NM + , URL + , CREAT_DT ) + + SELECT + #logId# + , #loginId# + , #loginIp# + , #userAt# /**A:관리자, U:홈페이지 */ + , #deviceType# + , method_nm + , menu_nm + , #url# + , NOW() + FROM LETTNADMINMETHOD + WHERE METHOD_NM = #methodNm# + LIMIT 1 + + + + + /* 임시.*NOT_SQL_LOG.* */ + /* 2023-06-20일 저장확인을 위해 update 추가함*/ + /* LoginLogDAO.logInsertWebLoginLogNewStep2 */ + INSERT INTO LETTNLOGINLOG + ( LOG_ID + , CONECT_ID + , CONECT_IP + , USER_AT + , DEVICE_TYPE /**인테넛,모바일 */ + , PROGRM_FILE_NM + , MENU_NO + , MENU_NM + , URL + , CREAT_DT ) + SELECT + #logId# + , #loginId# + , #loginIp# + , #userAt# /**A:관리자, U:홈페이지 */ + , #deviceType# + , 'PROGRM_FILE_NM' + , '999999999' + , 'MENU_NM' + , #url# + , NOW() + FROM DUAL + + + + + + + /* 임시.*NOT_SQL_LOG.* */ + /* 2023-06-20일 저장확인을 위해 update 추가함*/ + /* LoginLogDAO.logInsertWebLoginLogNewStep2 */ + INSERT INTO LETTNLOGINLOG_BAK + ( LOG_ID + , CONECT_ID + , CONECT_IP + , USER_AT + , DEVICE_TYPE /**인테넛,모바일 */ + , PROGRM_FILE_NM + , MENU_NO + , MENU_NM + , URL + , CREAT_DT ) + SELECT + #logId# + , #loginId# + , #loginIp# + , #userAt# /**A:관리자, U:홈페이지 */ + , #deviceType# + , 'PROGRM_FILE_NM' + , '999999999' + , 'MENU_NM' + , #url# + , NOW() + + + + + /* LoginLogDAO.logInsertWebLoginLogNewStep3_bak */ + INSERT INTO lettnadminmethod ( + admot_id, + method_nm, + param, + creat_dt, + menu_nm, + appro_nm, + privacy, + method_cd /* A or U */ + ) + + SELECT + NVL(MAX(TO_NUMBER(REPLACE(admot_id, 'ADMOTID_', ''))) + 1, 1) + , #methodNm# + , 'N' + , NOW() + , #methodNm# + , #url# + , 'N' + , 'U' + FROM LETTNADMINMETHOD + +
    - + @@ -175,7 +175,7 @@ function logListExcelDownload(){ - +<%-- --%> diff --git a/src/main/webapp/WEB-INF/jsp/sym/log/clg/NSelectWebLogList.jsp b/src/main/webapp/WEB-INF/jsp/sym/log/clg/NSelectWebLogList.jsp index 2e138fec..4f19e7f5 100644 --- a/src/main/webapp/WEB-INF/jsp/sym/log/clg/NSelectWebLogList.jsp +++ b/src/main/webapp/WEB-INF/jsp/sym/log/clg/NSelectWebLogList.jsp @@ -139,11 +139,11 @@ function logListExcelDownload(){
    메뉴명 - + +
    메소드명 - -
    파라미터 - -
    *기본값은 N 입니다. -
    *N이 아닌 값을 사용할 경우는 url에 'logParam=파라미터값' 형식을 추가해야 적용됩니다. +
    +
    기능명 - + + +
    파라미터 + +
    *기본값은 N 입니다.     *N이 아닌 값을 사용할 경우는 url에 'logParam=파라미터값' 형식을 추가해야 적용됩니다.
    privacy + +
    *기본값은 N 입니다.     N / Y *개인정보 포함 여부를 표시합니다. +
    사용자구분${loginLog.dateType}     -     U(사용자) / A(관리자) +
    통계노출여부 + +
    통계순서 + +
    등록일자 - + + ${loginLog.creatDt} +<%-- --%>
    번호 메뉴명 접근구분 메소드 접속ID 접속IP 접속URL
    - + - - - +<%-- --%> + + @@ -152,7 +152,7 @@ function logListExcelDownload(){ - + @@ -173,8 +173,8 @@ function logListExcelDownload(){ +<%-- --%> - From 6b8b337b872fc3e889587a3c1459db2f9c426268 Mon Sep 17 00:00:00 2001 From: myname Date: Thu, 21 Sep 2023 12:27:13 +0900 Subject: [PATCH 5/7] =?UTF-8?q?2023-09-21=2012:27=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=20=EB=A1=9C=EA=B7=B8=20=EA=B8=B0=EB=B3=B8=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kcc/let/sym/log/clg/web/EgovLoginLogController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/kcc/let/sym/log/clg/web/EgovLoginLogController.java b/src/main/java/kcc/let/sym/log/clg/web/EgovLoginLogController.java index c0bb13f8..ce57e898 100644 --- a/src/main/java/kcc/let/sym/log/clg/web/EgovLoginLogController.java +++ b/src/main/java/kcc/let/sym/log/clg/web/EgovLoginLogController.java @@ -144,8 +144,8 @@ public class EgovLoginLogController { loginLog.setLastIndex(paginationInfo.getLastRecordIndex()); loginLog.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); - if("".equals(loginLog.getSearchSortCnd())){ //최초조회시 최신것 조회List - loginLog.setSearchSortCnd("b.ADMINLOG_ID"); + if("".equals(loginLog.getSearchSortCnd())){ //최초조회시 최신것 조회List + loginLog.setSearchSortCnd("b.CREAT_DT"); loginLog.setSearchSortOrd("desc"); } List adminLogList = loginLogService.selectNAmdinLog(loginLog); From d965ada3b72ff60cfcd3a0735393a4dd821d4d74 Mon Sep 17 00:00:00 2001 From: tolag3 Date: Thu, 21 Sep 2023 15:24:05 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=EC=9D=B4=EC=A4=80=ED=98=B8=20=EC=A0=84?= =?UTF-8?q?=EC=9E=90=EC=A1=B0=EC=A0=95=EC=8B=9C=EC=8A=A4=ED=85=9C=20?= =?UTF-8?q?=EA=B3=A0=EB=8F=84=ED=99=94=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 분쟁조정 통계 개발 완료 --- .../java/kcc/kccadr/stts/service/SttsVO.java | 11 +- .../sqlmap/kccadr/stts/Stts_SQL_Mysql.xml | 168 +++++++++++------- .../WEB-INF/jsp/kccadr/stts/sttsYrlyPrcs.jsp | 12 +- 3 files changed, 125 insertions(+), 66 deletions(-) diff --git a/src/main/java/kcc/kccadr/stts/service/SttsVO.java b/src/main/java/kcc/kccadr/stts/service/SttsVO.java index 98b09142..7ec2d802 100644 --- a/src/main/java/kcc/kccadr/stts/service/SttsVO.java +++ b/src/main/java/kcc/kccadr/stts/service/SttsVO.java @@ -33,7 +33,8 @@ public class SttsVO extends ComDefaultVO implements Serializable { private String rcptTotCnt = ""; // 접수 총계 private String succCnt = ""; // 성립 건수(기일성립+조정권고성립) private String jikSuccCnt = ""; // 직권결정 성립 건수 - private String failCnt = ""; // 불성립 건수(모든 불성립) + private String failCnt = ""; // 불성립 건수(불성립 건수(직권 불성립 제외한 불성립)) + private String failJikCnt = ""; // 불성립 건수(직권 불성립) private String cancleCnt = ""; // 취하 건수 private String succPer = ""; // 성립율 private String finalTotCnt = ""; // 종결총계 @@ -272,6 +273,14 @@ public class SttsVO extends ComDefaultVO implements Serializable { public void setReqOlCd(String reqOlCd) { this.reqOlCd = reqOlCd; } + public String getFailJikCnt() { + return failJikCnt; + } + public void setFailJikCnt(String failJikCnt) { + this.failJikCnt = failJikCnt; + } + + diff --git a/src/main/resources/egovframework/sqlmap/kccadr/stts/Stts_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/kccadr/stts/Stts_SQL_Mysql.xml index 7be58863..fc2fe272 100644 --- a/src/main/resources/egovframework/sqlmap/kccadr/stts/Stts_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/kccadr/stts/Stts_SQL_Mysql.xml @@ -168,68 +168,114 @@ diff --git a/src/main/webapp/WEB-INF/jsp/kccadr/stts/sttsYrlyPrcs.jsp b/src/main/webapp/WEB-INF/jsp/kccadr/stts/sttsYrlyPrcs.jsp index f9bc8613..8c922987 100644 --- a/src/main/webapp/WEB-INF/jsp/kccadr/stts/sttsYrlyPrcs.jsp +++ b/src/main/webapp/WEB-INF/jsp/kccadr/stts/sttsYrlyPrcs.jsp @@ -116,6 +116,8 @@ $(document).ready(function() { + + @@ -125,7 +127,7 @@ $(document).ready(function() { - + @@ -133,9 +135,10 @@ $(document).ready(function() { - - - + + + + @@ -156,6 +159,7 @@ $(document).ready(function() { + From a5dfbac14516641a0eac4c985398898c95f09031 Mon Sep 17 00:00:00 2001 From: tolag3 Date: Mon, 25 Sep 2023 18:26:47 +0900 Subject: [PATCH 7/7] =?UTF-8?q?=EC=9D=B4=EC=A4=80=ED=98=B8=20=EC=A0=84?= =?UTF-8?q?=EC=9E=90=EC=A1=B0=EC=A0=95=EC=8B=9C=EC=8A=A4=ED=85=9C=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - sysout 주석처리 --- .../service/impl/EgovLoginLogServiceImpl.java | 6 ++-- .../service/impl/EgovSysLogServiceImpl.java | 32 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/kcc/let/sym/log/clg/service/impl/EgovLoginLogServiceImpl.java b/src/main/java/kcc/let/sym/log/clg/service/impl/EgovLoginLogServiceImpl.java index 3f83ddbb..4e63b417 100644 --- a/src/main/java/kcc/let/sym/log/clg/service/impl/EgovLoginLogServiceImpl.java +++ b/src/main/java/kcc/let/sym/log/clg/service/impl/EgovLoginLogServiceImpl.java @@ -89,9 +89,9 @@ public class EgovLoginLogServiceImpl extends EgovAbstractServiceImpl implements int i=loginLogDAO.logInsertWebLoginLogNewStep1(loinLog); //사용자 페이지의 로그만 남김(메뉴에 등록된 페이지만 남김) - System.out.println("=====i====="); - System.out.println(i); - System.out.println(i); +// System.out.println("=====i====="); +// System.out.println(i); +// System.out.println(i); try { if (loinLog.getUrl().length()>400) { diff --git a/src/main/java/kcc/let/sym/log/lgm/service/impl/EgovSysLogServiceImpl.java b/src/main/java/kcc/let/sym/log/lgm/service/impl/EgovSysLogServiceImpl.java index 79c5bf42..3576c35b 100644 --- a/src/main/java/kcc/let/sym/log/lgm/service/impl/EgovSysLogServiceImpl.java +++ b/src/main/java/kcc/let/sym/log/lgm/service/impl/EgovSysLogServiceImpl.java @@ -122,20 +122,20 @@ public class EgovSysLogServiceImpl extends EgovAbstractServiceImpl implements //sysLogDAO.logInsertAdminSysLog(sysLog); int i = sysLogDAO.logInsertAdminSysLogNewStep1(sysLog); - System.out.println("=====i====="); - System.out.println(i); - System.out.println(i); +// System.out.println("=====i====="); +// System.out.println(i); +// System.out.println(i); String[] s_arr = sysLog.getSrvcNm().split("[.]"); sysLog.setTrgetMenuNm(s_arr[s_arr.length-1]); - System.out.println("=====i====="+sysLog.getTrgetMenuNm()); - System.out.println("=====i====="+sysLog.getSrvcNm()); - System.out.println("=====i====="+sysLog.getUrl()); - System.out.println("=====i====="+sysLog.getPageUnit()); - System.out.println("=====i====="+sysLog.getRqsterNm()); - - System.out.println("=====i====="+sysLog.getMethodNm()); +// System.out.println("=====i====="+sysLog.getTrgetMenuNm()); +// System.out.println("=====i====="+sysLog.getSrvcNm()); +// System.out.println("=====i====="+sysLog.getUrl()); +// System.out.println("=====i====="+sysLog.getPageUnit()); +// System.out.println("=====i====="+sysLog.getRqsterNm()); +// +// System.out.println("=====i====="+sysLog.getMethodNm()); try { @@ -148,9 +148,9 @@ public class EgovSysLogServiceImpl extends EgovAbstractServiceImpl implements i = sysLogDAO.logInsertAdminSysLogNewStep1(sysLog); } - System.out.println("====re=i====="); - System.out.println(i); - System.out.println(i); +// System.out.println("====re=i====="); +// System.out.println(i); +// System.out.println(i); //그래도 저장이 안되었으면 길이잘라서 log만 저장하기 if (i<=0) { @@ -158,9 +158,9 @@ public class EgovSysLogServiceImpl extends EgovAbstractServiceImpl implements i = sysLogDAO.logInsertAdminSysLogNewStep2(sysLog); - System.out.println("=====i====="); - System.out.println(i); - System.out.println(i); +// System.out.println("=====i====="); +// System.out.println(i); +// System.out.println(i); } }catch(Exception ex) { System.out.println(ex.getMessage());
    번호 메뉴명 접근구분 메소드 접속ID 접속IP
    연도 접수종결종결 진행
    신규 성립직권성립불성립성립(합의)직권성립(직권)불성립(합의)불성립(직권) 취하