diff --git a/pom.xml b/pom.xml index a0cce9a..4aee1d1 100644 --- a/pom.xml +++ b/pom.xml @@ -160,6 +160,11 @@ 2.3.1 + + + org.springframework.boot + spring-boot-starter-webflux + diff --git a/src/main/java/com/itn/admin/agent/client/cmm/service/AbstractAgentService.java b/src/main/java/com/itn/admin/agent/client/cmm/service/AbstractAgentService.java index 73e989f..235a1e3 100644 --- a/src/main/java/com/itn/admin/agent/client/cmm/service/AbstractAgentService.java +++ b/src/main/java/com/itn/admin/agent/client/cmm/service/AbstractAgentService.java @@ -21,6 +21,7 @@ public abstract class AbstractAgentService implements AgentService { List agentVOL = new ArrayList<>(); int sendCnt = parseSendCount(agentVO); + for (int i = 0; i < sendCnt; i++) { T paramVO = createCopy(agentVO, i); agentVOL.add(paramVO); diff --git a/src/main/java/com/itn/admin/agent/client/one/service/impl/AgentCOneServiceImpl.java b/src/main/java/com/itn/admin/agent/client/one/service/impl/AgentCOneServiceImpl.java index 88e0985..2d77a67 100644 --- a/src/main/java/com/itn/admin/agent/client/one/service/impl/AgentCOneServiceImpl.java +++ b/src/main/java/com/itn/admin/agent/client/one/service/impl/AgentCOneServiceImpl.java @@ -51,6 +51,12 @@ public class AgentCOneServiceImpl extends AbstractAgentService findByLogMoveCnt(@RequestBody AgentCTwoVO agentCTwoVO) throws Exception { return ResponseEntity.ok().body(agentCTwoService.findAllLogMoveCnt(agentCTwoVO)); } + + @PostMapping("/agent/two/uploadFiles") + public ResponseEntity uploadFiles(@RequestParam("filename01") MultipartFile file1, + @RequestParam("filename02") MultipartFile file2, + @RequestParam("filename03") MultipartFile file3) { + try { + Map fileNames = new HashMap<>(); + + // 각 파일을 업로드하고 파일명을 수집 + String fileName = ""; + if (!file1.isEmpty()) { + fileName = uploadSingleFile(file1); + fileNames.put("fileName01", fileName); + } + + if (!file2.isEmpty()) { + fileName = uploadSingleFile(file2); + fileNames.put("fileName02", fileName); + } + + if (!file3.isEmpty()) { + fileName = uploadSingleFile(file3); + fileNames.put("fileName03", fileName); + } + // 경로와 파일명 반환 + Map response = new HashMap<>(); + response.put("fileNames", fileNames); + response.put("status", "OK"); + + return ResponseEntity.ok(new RestResponse(HttpStatus.OK, "",response) ); + + } catch (IOException ex) { + return ResponseEntity.ok(new RestResponse(HttpStatus.INTERNAL_SERVER_ERROR, "저장실패","") ); + } + } + + private String uploadSingleFile(MultipartFile file) throws IOException { + String fileName = StringUtils.cleanPath(file.getOriginalFilename()); + String uploadDir = "user-files/"; + Path uploadPath = Paths.get(uploadDir); + + if (!Files.exists(uploadPath)) { + Files.createDirectories(uploadPath); + } + + Path filePath = uploadPath.resolve(fileName); + Files.copy(file.getInputStream(), filePath, StandardCopyOption.REPLACE_EXISTING); + + return fileName; + } } diff --git a/src/main/java/com/itn/admin/agent/server/service/impl/AgentSServiceImpl.java b/src/main/java/com/itn/admin/agent/server/service/impl/AgentSServiceImpl.java index cdd6ee1..c4c2d0e 100644 --- a/src/main/java/com/itn/admin/agent/server/service/impl/AgentSServiceImpl.java +++ b/src/main/java/com/itn/admin/agent/server/service/impl/AgentSServiceImpl.java @@ -4,6 +4,7 @@ import com.itn.admin.agent.server.mapper.AgentSMapper; import com.itn.admin.agent.server.mapper.domain.AgentSVO; import com.itn.admin.agent.server.service.AgentSService; import com.itn.admin.cmn.msg.RestResponse; +import io.micrometer.common.util.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -24,7 +25,9 @@ public class AgentSServiceImpl implements AgentSService { // int cnt = agentSMapper.countByCurStateAndUserId(agentSVO); String cntTxt = agentSMapper.findByCurStateAndUserIdAndSmsTxt(agentSVO); - cntTxt = cntTxt.replace(agentSVO.getMessage(),"").trim(); + if(StringUtils.isNotEmpty(cntTxt) ){ + cntTxt = cntTxt.replace(agentSVO.getMessage(),"").trim(); + } return new RestResponse(HttpStatus.OK,"", cntTxt); } diff --git a/src/main/java/com/itn/admin/cmn/config/AppConfig.java b/src/main/java/com/itn/admin/cmn/config/AppConfig.java new file mode 100644 index 0000000..d269a58 --- /dev/null +++ b/src/main/java/com/itn/admin/cmn/config/AppConfig.java @@ -0,0 +1,14 @@ +package com.itn.admin.cmn.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class AppConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} \ No newline at end of file diff --git a/src/main/java/com/itn/admin/cmn/config/MainDatabaseConfig.java b/src/main/java/com/itn/admin/cmn/config/MainDatabaseConfig.java index e91c79f..0ab664a 100644 --- a/src/main/java/com/itn/admin/cmn/config/MainDatabaseConfig.java +++ b/src/main/java/com/itn/admin/cmn/config/MainDatabaseConfig.java @@ -19,7 +19,12 @@ import javax.sql.DataSource; @Configuration -@MapperScan(value = "com.itn.admin.itn.*.mapper", sqlSessionFactoryRef = "factory") +@MapperScan(basePackages = { + "com.itn.admin.itn.dict.mapper", + "com.itn.admin.itn.mjon.spam.mapper", + "com.itn.admin.itn.user.mapper" +} +, sqlSessionFactoryRef = "factory") class MainDatabaseConfig { private final String MAIN_DATA_SOURCE = "MainDatabase"; @@ -38,27 +43,11 @@ class MainDatabaseConfig { @Primary @Bean(name="factory") public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { - /* - * MyBatis 는 JdbcTemplate 대신 Connection 객체를 통한 질의를 위해서 SqlSession 을 사용한다. - * 내부적으로 SqlSessionTemplate 가 SqlSession 을 구현한다. - * Thread-Safe 하고 여러 개의 Mapper 에서 공유할 수 있다. - */ -// SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); -// bean.setDataSource(dataSource); - - // MyBatis Mapper Source - // MyBatis 의 SqlSession 에서 불러올 쿼리 정보 -// Resource[] res = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/itn/dictionary/*Mapper.xml"); -// bean.setMapperLocations(res); - - // MyBatis Config Setting - // MyBatis 설정 파일 -// bean.setConfigLocation(myBatisConfig); SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean(); sqlSessionFactory.setDataSource(dataSource); sqlSessionFactory.setTypeAliasesPackage("com.itn.admin.itn.*"); - sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/itn/*/*Mapper.xml")); + sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/itn/**/*Mapper.xml")); sqlSessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml")); return sqlSessionFactory.getObject(); diff --git a/src/main/java/com/itn/admin/itn/dict/mapper/DictionaryMapper.java b/src/main/java/com/itn/admin/itn/dict/mapper/DictionaryMapper.java index 00a7209..0ec07c3 100644 --- a/src/main/java/com/itn/admin/itn/dict/mapper/DictionaryMapper.java +++ b/src/main/java/com/itn/admin/itn/dict/mapper/DictionaryMapper.java @@ -3,7 +3,6 @@ package com.itn.admin.itn.dict.mapper; import com.itn.admin.itn.dict.mapper.domain.DictionaryVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; -import org.springframework.web.bind.annotation.RequestParam; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/itn/admin/itn/dict/service/impl/DictionaryServiceImpl.java b/src/main/java/com/itn/admin/itn/dict/service/impl/DictionaryServiceImpl.java index afd89d5..601ed58 100644 --- a/src/main/java/com/itn/admin/itn/dict/service/impl/DictionaryServiceImpl.java +++ b/src/main/java/com/itn/admin/itn/dict/service/impl/DictionaryServiceImpl.java @@ -6,9 +6,7 @@ import com.itn.admin.itn.dict.mapper.domain.DictionaryVO; import com.itn.admin.itn.dict.service.DictionaryService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.RequestParam; import org.thymeleaf.util.StringUtils; import java.util.List; diff --git a/src/main/java/com/itn/admin/itn/mjon/spam/mapper/SpamMapper.java b/src/main/java/com/itn/admin/itn/mjon/spam/mapper/SpamMapper.java new file mode 100644 index 0000000..d8d44eb --- /dev/null +++ b/src/main/java/com/itn/admin/itn/mjon/spam/mapper/SpamMapper.java @@ -0,0 +1,19 @@ +package com.itn.admin.itn.mjon.spam.mapper; + +import com.itn.admin.itn.dict.mapper.domain.DictionaryVO; +import com.itn.admin.itn.mjon.spam.mapper.domain.SpamVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface SpamMapper { + + List getList(SpamVO spamVO); + + List getListWhereKeywordsIsNull(SpamVO spamVO); + + void update(SpamVO spamVO); +} diff --git a/src/main/java/com/itn/admin/itn/mjon/spam/mapper/domain/SpamVO.java b/src/main/java/com/itn/admin/itn/mjon/spam/mapper/domain/SpamVO.java new file mode 100644 index 0000000..956ac4d --- /dev/null +++ b/src/main/java/com/itn/admin/itn/mjon/spam/mapper/domain/SpamVO.java @@ -0,0 +1,43 @@ +package com.itn.admin.itn.mjon.spam.mapper.domain; + +import lombok.*; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * packageName : com.itn.admin.itn.mjon.spam.mapper.domain + * fileName : SpamVO + * author : hylee + * date : 2024-08-14 + * description : 문자온 스팸관련 + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2024-08-14 hylee 최초 생성 + * + */ +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Getter +@Setter +@ToString +public class SpamVO implements Serializable { + + private static final long serialVersionUID = 1L; + + private int spamId; // 스팸 ID + private String msgGroupId; // 문자그룹ID + private String smsTxt; // 문자내용 + private String spamRsn; // 스팸사유 + private String keywords; // 문자에 포함된 단어 + private String chcKeywords; // 스팸에 해당하는 단어 + private LocalDateTime timestamp; // 요청 시간 + private String categ; // 스팸종류 + private String frstRegisterId; // 최초등록자ID + private LocalDateTime frstRegistPnttm; // 최초등록일자 + private String lastUpdusrId; // 최종수정자ID + private LocalDateTime lastUpdtPnttm; // 최종수정일자 + +} diff --git a/src/main/java/com/itn/admin/itn/mjon/spam/service/SpamService.java b/src/main/java/com/itn/admin/itn/mjon/spam/service/SpamService.java new file mode 100644 index 0000000..35508c8 --- /dev/null +++ b/src/main/java/com/itn/admin/itn/mjon/spam/service/SpamService.java @@ -0,0 +1,14 @@ +package com.itn.admin.itn.mjon.spam.service; + +import com.itn.admin.itn.mjon.spam.mapper.domain.SpamVO; + +import java.util.Map; + + +public interface SpamService { + + + Map getList(SpamVO spamVO); + + void analyze(); +} diff --git a/src/main/java/com/itn/admin/itn/mjon/spam/service/impl/SpamServiceImpl.java b/src/main/java/com/itn/admin/itn/mjon/spam/service/impl/SpamServiceImpl.java new file mode 100644 index 0000000..433cfb9 --- /dev/null +++ b/src/main/java/com/itn/admin/itn/mjon/spam/service/impl/SpamServiceImpl.java @@ -0,0 +1,114 @@ +package com.itn.admin.itn.mjon.spam.service.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.itn.admin.itn.mjon.spam.mapper.SpamMapper; +import com.itn.admin.itn.mjon.spam.mapper.domain.SpamVO; +import com.itn.admin.itn.mjon.spam.service.SpamService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.reactive.function.client.WebClient; + +import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@Service +public class SpamServiceImpl implements SpamService { + + + @Autowired + SpamMapper spamMapper; + + @Autowired + private RestTemplate restTemplate; + + + + final static private String PYTHON_ANALYZE_URL= "http://192.168.0.78:5000/word_analyze"; + + public SpamServiceImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + @Override + public Map getList(SpamVO spamVO) { + + List spamList = spamMapper.getList(spamVO); + + Map map = new HashMap<>(); + + map.put("spamList", spamList); + + + return map; + } + + @Override + public void analyze() { + + +// List spamList = spamMapper.getList(new SpamVO()); + +// for (SpamVO spamVO : spamList) { + + // API 호출 및 데이터 수신 + + List spamList = spamMapper.getListWhereKeywordsIsNull(new SpamVO()); + + for (SpamVO spamVO : spamList) { + String text = spamVO.getSmsTxt(); + try { + // 요청 데이터 준비 + Map requestBody = new HashMap<>(); + requestBody.put("text", text); + + // ObjectMapper를 사용하여 JSON 문자열 생성 + ObjectMapper objectMapper = new ObjectMapper(); + String jsonData = objectMapper.writeValueAsString(requestBody); + + // HTTP 헤더 설정 + HttpHeaders headers = new HttpHeaders(); + headers.set("Content-Type", "application/json"); + + // 요청 본문 설정 + HttpEntity requestEntity = new HttpEntity<>(jsonData, headers); + + // API 호출 및 응답 처리 + ResponseEntity responseEntity = restTemplate.exchange( + PYTHON_ANALYZE_URL, + HttpMethod.POST, + requestEntity, + String.class + ); + + String responseBody = responseEntity.getBody(); + + // JSON 응답을 Map으로 변환 + Map responseMap = objectMapper.readValue(responseBody, Map.class); + + // words 리스트 추출 + List wordsList = (List) responseMap.get("words"); + + // 가나다순으로 정렬 + Collections.sort(wordsList); + + // List를 ,로 구분된 단일 String으로 변환 + String wordsString = String.join(", ", wordsList); + + // 정렬된 결과 출력 + System.out.println("Sorted Words: " + wordsString); + spamVO.setKeywords(wordsString); + spamMapper.update(spamVO); + + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/com/itn/admin/itn/mjon/spam/web/RestSpamController.java b/src/main/java/com/itn/admin/itn/mjon/spam/web/RestSpamController.java new file mode 100644 index 0000000..5fb60e1 --- /dev/null +++ b/src/main/java/com/itn/admin/itn/mjon/spam/web/RestSpamController.java @@ -0,0 +1,47 @@ +package com.itn.admin.itn.mjon.spam.web; + +import com.itn.admin.itn.mjon.spam.mapper.domain.SpamVO; +import com.itn.admin.itn.mjon.spam.service.SpamService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.lang.module.ModuleDescriptor; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@Slf4j +@RestController +public class RestSpamController { + + private SpamService spamService; + + + @Autowired + public void setSpamService(SpamService spamService) { + this.spamService = spamService; + } + + @GetMapping(value = "/mjon/spam/analyze") + public void analyze(Model model) { + + + spamService.analyze(); + + + + } + + + + +} diff --git a/src/main/java/com/itn/admin/itn/mjon/spam/web/SpamController.java b/src/main/java/com/itn/admin/itn/mjon/spam/web/SpamController.java new file mode 100644 index 0000000..64e3683 --- /dev/null +++ b/src/main/java/com/itn/admin/itn/mjon/spam/web/SpamController.java @@ -0,0 +1,40 @@ +package com.itn.admin.itn.mjon.spam.web; + +import com.itn.admin.itn.dict.service.DictionaryService; +import com.itn.admin.itn.mjon.spam.mapper.domain.SpamVO; +import com.itn.admin.itn.mjon.spam.service.SpamService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; + +import java.util.Map; + +@Controller +public class SpamController { + + private SpamService spamService; + + @Autowired + public void setSpamService(SpamService spamService) { + this.spamService = spamService; + } + + @GetMapping(value = "/mjon/spam/select") + public String select(@ModelAttribute("spamVO") SpamVO spamVO, Model model) { +// +// +// Map resultMap = spamService.getList(spamVO); + +// model.addAttribute("spamList", resultMap.get("spamList")); +// +// model.addAttribute("list", resultMap.get("resultList")); + + return "mjon/spam/select"; + } + + + + +} diff --git a/src/main/resources/mapper/itn/mjon/spam/SpamMapper.xml b/src/main/resources/mapper/itn/mjon/spam/SpamMapper.xml new file mode 100644 index 0000000..d3f5ae5 --- /dev/null +++ b/src/main/resources/mapper/itn/mjon/spam/SpamMapper.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + UPDATE spam_keywords + SET keywords = #{keywords} + WHERE spam_id = #{spamId} + + + \ No newline at end of file diff --git a/src/main/resources/mybatis-config.xml b/src/main/resources/mybatis-config.xml index 41c4c8f..3dbb7aa 100644 --- a/src/main/resources/mybatis-config.xml +++ b/src/main/resources/mybatis-config.xml @@ -16,6 +16,7 @@ + diff --git a/src/main/resources/static/cmn/js/agent/init.js b/src/main/resources/static/cmn/js/agent/init.js index 6c01356..85f1161 100644 --- a/src/main/resources/static/cmn/js/agent/init.js +++ b/src/main/resources/static/cmn/js/agent/init.js @@ -85,14 +85,22 @@ $(function () { var msgType = $(this).val(); var tagId = getParentsId($(this)); + + // 제목 + $(tagId+' .subject').closest('.form-group').hide(); + + // 파일 그룹 + $(tagId+' .fileUploadGroup').hide(); + $(tagId+' .fileUploadGroup input[type="file"]').val(""); + if(msgType === 'L' - ||msgType === 'M' ||msgType === 'A' ||msgType === 'F' ) { $(tagId+' .subject').closest('.form-group').show(); - }else{ - $(tagId+' .subject').closest('.form-group').hide(); + }else if(msgType === 'M'){ + $(tagId+' .subject').closest('.form-group').show(); + $(tagId+' .fileUploadGroup').show(); } var $message = $(tagId + ' .message'); diff --git a/src/main/resources/templates/agent/view.html b/src/main/resources/templates/agent/view.html index 6b06593..4408382 100644 --- a/src/main/resources/templates/agent/view.html +++ b/src/main/resources/templates/agent/view.html @@ -187,6 +187,18 @@ +
@@ -282,6 +294,18 @@
+
@@ -486,9 +510,16 @@
+
- + +
+
@@ -804,51 +835,96 @@ * client_2 msg insert * */ $("#divTwoSms .sendBtn").on("click", function () { - console.log('#divTwoSms .sendBtn '); + // 폼 데이터를 수집 var formData = new FormData($("#divTwoSms .sendForm")[0]); - var jsonObject = {}; - formData.forEach((value, key) => { - jsonObject[key] = value; - }); - - if(jsonObject['recvPhone'] === ""){ - alert('정보를 입력하거나 예시입력을 클릭해주세요.') - return false; - } - - console.log('two sendBtn : ', jsonObject); + // 먼저 파일을 업로드하고 파일명만 받음 + var fileUploadForm = new FormData(); + fileUploadForm.append("filename01", formData.get("filename01")); + fileUploadForm.append("filename02", formData.get("filename02")); + fileUploadForm.append("filename03", formData.get("filename03")); $.ajax({ type: "POST", - url: "/agent/two/send", - data: JSON.stringify(jsonObject), // JSON 문자열로 변환된 데이터를 전송 - dataType: 'json', - contentType: 'application/json', - // async: true, - success: function (data) { - // console.log('data : ', data); + url: "/agent/two/uploadFiles", + data: fileUploadForm, + processData: false, + contentType: false, + success: function(response) { + if (response.status === 'OK') { - if (data.status === 'OK') { - fn_successAlert('경과시간 : '+data.data, data.msg); - // fn_successAlert(data, message) - } - else { - alert("오류 알림 : :: "+data.msg); + + // 파일명만 formData에 추가 + // 파일명 formData에 추가 + if (response.fileNames && response.fileNames.fileName01) { + formData.append("fileName01", response.fileNames.fileName01); + } else { + formData.append("fileName01", ""); + } + + if (response.fileNames && response.fileNames.fileName02) { + formData.append("fileName02", response.fileNames.fileName02); + } else { + formData.append("fileName02", ""); + } + + if (response.fileNames && response.fileNames.fileName03) { + formData.append("fileName03", response.fileNames.fileName03); + } else { + formData.append("fileName03", ""); + } + + + var jsonObject = {}; + formData.forEach((value, key) => { + jsonObject[key] = value; + + }); + if(jsonObject['recvPhone'] === ""){ + alert('정보를 입력하거나 예시입력을 클릭해주세요.') + return false; + } + console.log('jsonObject : ', jsonObject); +/* + $.ajax({ + type: "POST", + url: "/agent/two/send", + data: JSON.stringify(jsonObject), // JSON 문자열로 변환된 데이터를 전송 + dataType: 'json', + contentType: 'application/json', + // async: true, + success: function (data) { + // console.log('data : ', data); + + if (data.status === 'OK') { + fn_successAlert('경과시간 : '+data.data, data.msg); + // fn_successAlert(data, message) + } + else { + alert("오류 알림 : :: "+data.msg); + } + }, + error: function (e) { + alert("데이터 저장에 실패하였습니다."); + console.log("ERROR : " + JSON.stringify(e)); + }, + beforeSend : function(xmlHttpRequest) { + fn_twoInsertScriptStart(); + + }, + complete : function(xhr, textStatus) { + oneStopInsertTimer(); + } + });*/ + } else { + alert("파일 업로드 실패: " + response.msg); } }, - error: function (e) { - alert("데이터 저장에 실패하였습니다."); + error: function(e) { + alert("파일 업로드에 실패하였습니다."); console.log("ERROR : " + JSON.stringify(e)); - }, - beforeSend : function(xmlHttpRequest) { - fn_twoInsertScriptStart(); - - }, - complete : function(xhr, textStatus) { - oneStopInsertTimer(); } }); }); diff --git a/src/main/resources/templates/fragments/mainsidebar.html b/src/main/resources/templates/fragments/mainsidebar.html index 6e7f7ba..bbb398d 100644 --- a/src/main/resources/templates/fragments/mainsidebar.html +++ b/src/main/resources/templates/fragments/mainsidebar.html @@ -42,7 +42,7 @@ with font-awesome or any other icon font library --> @@ -60,9 +60,7 @@ diff --git a/src/main/resources/templates/mjon/spam/select.html b/src/main/resources/templates/mjon/spam/select.html new file mode 100644 index 0000000..e12e051 --- /dev/null +++ b/src/main/resources/templates/mjon/spam/select.html @@ -0,0 +1,191 @@ + + + + + + 스팸 단어 선택 + + + + + + + + + + + + + + + +
+
+ + + + + +
+ +
+
+
+
+

스팸 단어 선택

+
+
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+

스팸 단어 선택

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
번호스팸문자복합명사핵심 단어스팸분류
1(광고)♥봄맞이 특별이벤트 진행중♥ ...'바다', '서비스', '갯수', '이건조제한', ...'바다', '서비스', '갯수', '이건조제한', 'EVENT 1' ... + +
2[국민건강보험]...'바다', '서비스', '갯수'...'바다', '서비스'... + +
+ + + +
+ +
+ +
+ +
+ +
+ +
+ + +
+ + + + +
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + +