src/main/java/kr/wisestone/owl/service/NoticeService.java
@@ -6,7 +6,10 @@ import kr.wisestone.owl.web.form.NoticeForm; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.ui.Model; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.Map; @@ -23,4 +26,6 @@ void detailNotice(Map<String, Object> resJsonData, NoticeCondition noticeCondition); void sendNotice(NoticeForm noticeForm); ModelAndView downloadExcel(HttpServletRequest request, Model model); } src/main/java/kr/wisestone/owl/service/impl/NoticeServiceImpl.java
@@ -1,5 +1,6 @@ package kr.wisestone.owl.service.impl; import kr.wisestone.owl.common.ExcelConditionCheck; import kr.wisestone.owl.config.kafka.KafkaSender; import kr.wisestone.owl.constant.Constants; import kr.wisestone.owl.constant.MsgConstants; @@ -10,17 +11,23 @@ import kr.wisestone.owl.repository.NoticeRepository; import kr.wisestone.owl.service.NoticeService; import kr.wisestone.owl.service.UserService; import kr.wisestone.owl.service.WorkspaceService; import kr.wisestone.owl.util.ConvertUtil; import kr.wisestone.owl.vo.NoticeVo; import kr.wisestone.owl.vo.ResPage; import kr.wisestone.owl.vo.*; import kr.wisestone.owl.web.condition.CompanyFieldCondition; import kr.wisestone.owl.web.condition.NoticeCondition; import kr.wisestone.owl.web.form.NoticeForm; import kr.wisestone.owl.web.view.ExcelView; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -32,13 +39,22 @@ private NoticeRepository noticeRepository; @Autowired private NoticeMapper noticeMapper; @Autowired private UserService userService; @Autowired private KafkaSender kafkaSender; private WorkspaceService workspaceService; @Autowired private NoticeMapper noticeMapper; private ExcelView excelView; @Autowired private ExcelConditionCheck excelConditionCheck; @Autowired private KafkaSender kafkaSender; @Override protected JpaRepository<Notice, Long> getRepository() { @@ -153,4 +169,35 @@ this.kafkaSender.send("common-topic", message); } } @Override public ModelAndView downloadExcel(HttpServletRequest request, Model model) { ModelAndView modelAndView = this.workspaceService.checkUseExcelDownload(model); if (modelAndView != null) { return modelAndView; } Map<String, Object> conditions = new HashMap<>(); // 엑셀 다운로드에 필요한 검색 조건 정보를 추출하고 검색 조건 추출에 오류가 발생하면 경고를 표시해준다. modelAndView = this.excelConditionCheck.checkCondition(conditions, request, model); if (modelAndView != null) { return modelAndView; } NoticeCondition noticeCondition = NoticeCondition.make(conditions); List<Map<String, Object>> results = this.noticeMapper.find(noticeCondition); List<NoticeVo> noticeVos = ConvertUtil.convertListToListClass(results, NoticeVo.class); // code_ko_KR 에 code명 설정 ExportExcelVo excelInfo = new ExportExcelVo(); excelInfo.setFileName(this.messageAccessor.message("공지사항 목록")); excelInfo.addAttrInfos(new ExportExcelAttrVo("title", this.messageAccessor.message("notice.title"), 6, ExportExcelAttrVo.ALIGN_CENTER)); excelInfo.addAttrInfos(new ExportExcelAttrVo("registerDate", this.messageAccessor.message("notice.registerDate"), 10, ExportExcelAttrVo.ALIGN_CENTER)); excelInfo.addAttrInfos(new ExportExcelAttrVo("registerId", this.messageAccessor.message("notice.registerId"), 10, ExportExcelAttrVo.ALIGN_CENTER)); excelInfo.setDatas(noticeVos); model.addAttribute(Constants.EXCEL, excelInfo); return new ModelAndView(this.excelView); } } src/main/java/kr/wisestone/owl/web/controller/NoticeController.java
@@ -8,11 +8,14 @@ import org.springframework.data.domain.Pageable; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; @@ -85,5 +88,10 @@ return this.setSuccessMessage(resJsonData); } @RequestMapping(value = "/notice/downloadExcel", method = RequestMethod.POST) public ModelAndView downloadExcel(HttpServletRequest request, Model model) { return this.noticeService.downloadExcel(request, model); } } src/main/webapp/WEB-INF/i18n/code_ko_KR.properties
@@ -119,6 +119,9 @@ manageUser.manageFAQPerm=FAQ \uAD00\uB9AC manageUser.manageQnAPerm=QnA \uAD00\uB9AC manageUser.manageGuidePerm=\uAC00\uC774\uB4DC \uAD00\uB9AC notice.title=\uC81C\uBAA9 notice.registerDate=\uB4F1\uB85D\uC77C notice.registerId=\uB4F1\uB85D\uC790 department.departmentName=\uBD80\uC11C\uBA85 department.departmentDescription=\uBD80\uC11C\uC124\uBA85 department.departmentCount=\uBD80\uC11C\uC778\uC6D0 src/main/webapp/assets/images/Email.png
src/main/webapp/assets/images/badcode.png
src/main/webapp/assets/images/domain.png
src/main/webapp/assets/images/hosting.png
src/main/webapp/assets/styles/main.css
@@ -897,6 +897,9 @@ .offset-detail-2 { margin-left: 4%; } .offset-detail-3 { margin-left: 9.2%; } .offset-1 { margin-left: 8.3333333333%; @@ -28472,6 +28475,14 @@ margin-top: 30px !important; } .mt-40 { margin-top: 40px; !important; } .mt-50 { margin-top: 50px; !important; } .ml-10 { margin-left: 10px !important; } @@ -30379,6 +30390,20 @@ font-weight: 600; } .email_font { color: #494848; font-size: 0.75rem; line-height: 1.5; font-weight: 600; } .info_detail_font { color: #000; font-size: 1rem; line-height: 1.5; font-weight: 600; } .email_color { color:#0066ff; } @@ -30422,7 +30447,4 @@ margin: 0 auto; } .Email-Template-detail { } /* 간트차트 end */ src/main/webapp/scripts/app/common/common.controller.js
@@ -86,8 +86,8 @@ moveMenu("issues.list"); } } $rootScope.$broadcast("changeIssueListMenu", $rootScope.issueTypeMenu); moveMenu("issues.list"); //$rootScope.$broadcast("changeIssueListMenu", $rootScope.issueTypeMenu); if ($rootScope.user.lastIssueTypeId !== issueTypeId) { $scope.fn.setLastIssueType(issueTypeId); src/main/webapp/scripts/app/issue/issueSendMailPartners.controller.js
@@ -140,6 +140,8 @@ function showEmailTemplate() { const div1 = document.getElementById('Email-Template1'); const div2 = document.getElementById('Email-Template2'); const div3 = document.getElementById('Email-Template3'); const div4 = document.getElementById('Email-Template4'); if(div1.style.display === 'none') { div1.style.display = 'block'; @@ -151,6 +153,18 @@ } else if (div2.style.display == 'block') { div2.style.display = 'none'; } if (div3.style.display == 'none') { div3.style.display = 'block'; } else if (div3.style.display == 'block') { div3.style.display = 'none'; } if (div4.style.display == 'none') { div4.style.display = 'block'; } else if (div4.style.display == 'block') { div4.style.display = 'none'; } } }]); }); src/main/webapp/views/issue/issueDetail.html
@@ -188,14 +188,9 @@ <div class="row"> <div class="col-md-4"> <div class="form-group"> <h6 class="info_font" translate="common.detectingInfo">탐지정보</h6> <h6 class="info_detail_font" translate="common.detectingInfo">탐지정보</h6> <span class="issue-detail-label" style="position: relative; top: 1rem" ng-show="vm.viewer.issueCustomFields == ''">사용자 정의 필드값이 없습니다.</span> </div> </div> <div class="col-md-2"> <issue-detail-image-preview images="vm.images"></issue-detail-image-preview> </div> <div ng-show="vm.images.length < 1" class="detail-not-elements width-100"> </div> </div> <!-- 사용자 정의 필드 --> @@ -259,9 +254,16 @@ ng-repeat="useValue in issueCustomField.useValues">{{::useValue.value}}, </span> <span ng-if="!$root.isDefined(issueCustomField.useValues)">-</span> </div> </div> </div> </div> </div> <!--이미지 미리보기--> <div class="col-md-2"> <issue-detail-image-preview images="vm.images"></issue-detail-image-preview> </div> <div ng-show="vm.images.length < 1" class="detail-not-elements width-100"> </div> </div> @@ -278,7 +280,7 @@ <div ng-show="fn.containsPartner('업체')" class="row"> <div class="col-sm-2"> <div class="form-group"> <h6 class="info_font" translate="companyField.info">업체정보</h6> <h6 class="info_detail_font" translate="companyField.info">업체정보</h6> </div> </div> </div> @@ -332,7 +334,7 @@ <div ng-show="fn.containsPartner('ISP');" class="row"> <div class="col-sm-2"> <div class="form-group"> <h6 class="info_font" translate="ispField.info">ISP정보</h6> <h6 class="info_detail_font" translate="ispField.info">ISP정보</h6> </div> </div> </div> @@ -393,7 +395,7 @@ <div ng-show="fn.containsPartner('호스팅');" class="row"> <div class="col-sm-2"> <div class="form-group"> <h6 class="info_font" translate="hostingField.info">호스팅정보</h6> <h6 class="info_detail_font" translate="hostingField.info">호스팅정보</h6> </div> </div> </div> @@ -454,7 +456,7 @@ <div class="row mt-30"> <div class="col-md-10"> <span class="info_font h3" translate="issue.relationIssue">연관 이슈</span> <span class="info_detail_font h3" translate="issue.relationIssue">연관 이슈</span> </div> <div class="col-md-1"> <button class="btn btn-darkgrey offset-12" ng-click="fn.addRelationIssueTableConfig()" type="button"><span translate="issue.settingTableDisplay">테이블 표시 설정</span></button> @@ -501,7 +503,7 @@ <div class="row mt-30"> <div class="col-md-10"> <span class="info_font h3" translate="issue.downIssue">하위 이슈</span> <span class="info_detail_font h3" translate="issue.downIssue">하위 이슈</span> </div> <div class="col-md-1"> <button class="btn btn-darkgrey offset-12" ng-click="fn.addDownIssueTableConfig()" type="button"><span translate="issue.settingTableDisplay">테이블 표시 설정</span></button> src/main/webapp/views/issue/issueSendMailPartners.html
@@ -34,10 +34,15 @@ type : 'partner', maxlength : 100, autoResize : true, stopRemoveBodyEvent : true }"></js-input-autocomplete> <div class="Template-area mt-20"> <label class="issue-detail-label">이메일 템플릿</label> <div class="mt-20"> <div class="mt-10"> <img id="ISSUE_SEND_1" class="TemplateIMG" src="assets/images/image-email.png" ng-click="fn.changeTemplate('ISSUE_SEND_1')"> <img id="ISSUE_SEND_2" class="TemplateIMG" src="assets/images/image-email.png" ng-click="fn.changeTemplate('ISSUE_SEND_2')"> <img id="ISSUE_SEND_3" class="TemplateIMG" src="assets/images/image-email.png" ng-click="fn.changeTemplate('ISSUE_SEND_3')"> <div> <span class="email_font">악성코드</span> <span class="email_font offset-detail-3">도메인</span> <span class="email_font offset-detail-3">호스팅</span> </div> </div> <input class="btn-toggled btn-primary table-bordered" style="float: left" type="button" value="템플릿" ng-click="fn.showEmailTemplate()"> </div> @@ -55,7 +60,9 @@ </button> </div> <div> <img style="height: 350px; width: 330px; display: none; margin: 0 auto;" class="mt-20" id="Email-Template1" src="assets/images/email-temp-detail.png"> <img style="height: 350px; width: 330px; display: none; margin: 0 auto;" class="mt-20 mb-30" id="Email-Template2" src="assets/images/email-temp.png"> <img style="height: 24px; width: 250px; display: none; margin: 0 auto;" id="Email-Template1" src="assets/images/domain.png"> <img style="height: 24px; width: 250px; display: none; margin: 0 auto; margin-top: 50px" id="Email-Template2" src="assets/images/badcode.png"> <img style="height: 24px; width: 250px; display: none; margin: 0 auto; margin-top: 50px" id="Email-Template3" src="assets/images/hosting.png"> </div> <img style="height: 500px; width: 440px; display: none; margin: 0 auto;" class="mt-20 mb-30" id="Email-Template4" src="assets/images/Email.png"> </div>