From 463fda993ea50881c17ff459f89fd0b8ae944ffe Mon Sep 17 00:00:00 2001 From: Kana Date: Thu, 18 Jan 2024 16:15:34 +0900 Subject: [PATCH 1/3] use session --- .../webapp/WEB-INF/views/price/create.jsp | 33 +++---------------- .../webapp/WEB-INF/views/price/update.jsp | 10 ++++-- .../webapp/WEB-INF/views/product/create.jsp | 8 ++--- .../webapp/WEB-INF/views/product/update.jsp | 7 ++-- 4 files changed, 18 insertions(+), 40 deletions(-) diff --git a/src/main/webapp/WEB-INF/views/price/create.jsp b/src/main/webapp/WEB-INF/views/price/create.jsp index 958e58e..57d9477 100644 --- a/src/main/webapp/WEB-INF/views/price/create.jsp +++ b/src/main/webapp/WEB-INF/views/price/create.jsp @@ -1,4 +1,5 @@ <%@ page contentType="text/html; charset=UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> @@ -45,11 +46,8 @@ aria-describedby="basic-addon1"> - - - - - + + @@ -93,8 +91,8 @@ $(document).ready(function() { type: "post", data: { "price": price, - "manager_id": manager_id, // 추후 수정해야함. - "product_id": product_id, // 추후 수정해야함. + "manager_id": manager_id, + "product_id": product_id, "activation": true }, datatype:"json" @@ -102,24 +100,6 @@ $(document).ready(function() { if (data == true) { alert("제품 가격을 추가했습니다."); $(location).attr("href", "/price/list"); - - - //생각해서 바꿔야함. - // 조건 : DB에서 생성되는 uuid를 어떻게 자바스크립트에서 가져올것인지 궁리. - /* - var form = document.createElement("form"); - form.action = "/product/read"; - form.method = "POST"; - document.body.appendChild(form); - - var input = document.createElement("input"); - input.type = "hidden"; - input.name = "id"; - input.value = data.id; - form.appendChild(input); - - form.submit(); - */ } else { alert("제품 가격 추가에 실패하였습니다."); } @@ -153,8 +133,5 @@ function showSearchModal(title, val){ - - - \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/price/update.jsp b/src/main/webapp/WEB-INF/views/price/update.jsp index e780309..e83ffb3 100644 --- a/src/main/webapp/WEB-INF/views/price/update.jsp +++ b/src/main/webapp/WEB-INF/views/price/update.jsp @@ -1,4 +1,5 @@ <%@ page contentType="text/html; charset=UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> @@ -34,14 +35,15 @@ - +
담당자 + aria-label="담당자" value="${userData.name }" readonly>
+ @@ -62,6 +64,7 @@ $("#submitBtn").on("click", function() { var id = $("#id").val(); var price = $("#price").val(); + var manager_id = $("#manager_id").val(); if (!price || isNaN(price)) { alert("올바른 가격을 입력하세요."); @@ -74,7 +77,8 @@ type: "put", data: { "id": id, - "price": price + "price": price, + "manager_id": manager_id }, datatype: "json" }).done(function(data) { diff --git a/src/main/webapp/WEB-INF/views/product/create.jsp b/src/main/webapp/WEB-INF/views/product/create.jsp index a2f0686..f7a2bd8 100644 --- a/src/main/webapp/WEB-INF/views/product/create.jsp +++ b/src/main/webapp/WEB-INF/views/product/create.jsp @@ -63,11 +63,9 @@ - - + + - - @@ -81,7 +79,7 @@ - + diff --git a/src/main/webapp/WEB-INF/views/product/update.jsp b/src/main/webapp/WEB-INF/views/product/update.jsp index 4e43aa0..c19de7e 100644 --- a/src/main/webapp/WEB-INF/views/product/update.jsp +++ b/src/main/webapp/WEB-INF/views/product/update.jsp @@ -1,4 +1,5 @@ <%@ page contentType="text/html; charset=UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> @@ -59,10 +60,8 @@ - - - - + + From dabcd74cb662f215459fc5848ecb6c955e5776ab Mon Sep 17 00:00:00 2001 From: sungsu Date: Thu, 18 Jan 2024 17:29:35 +0900 Subject: [PATCH 2/3] #update --- .../com/no1/wms/excel/ExcelDownlodeUtils.java | 73 ++- .../ResetPasswordController.java | 33 +- .../resetpassword/ResetPasswordMapper.java | 4 +- .../resetpassword/ResetPasswordService.java | 7 +- .../com/no1/wms/vendor/VendorController.java | 25 + .../java/com/no1/wms/vendor/VendorMapper.java | 2 +- .../com/no1/wms/vendor/VendorService.java | 4 + .../resources/mappers/ResetPasswordMapper.xml | 14 +- src/main/resources/mappers/VendorMapper.xml | 14 + src/main/webapp/WEB-INF/views/out/create.jsp | 4 +- .../WEB-INF/views/resetpassword/list.jsp | 431 +++++++++--------- .../webapp/WEB-INF/views/vendor/create.jsp | 3 +- src/main/webapp/WEB-INF/views/vendor/list.jsp | 10 +- .../webapp/WEB-INF/views/warehouse/create.jsp | 3 +- 14 files changed, 386 insertions(+), 241 deletions(-) diff --git a/src/main/java/com/no1/wms/excel/ExcelDownlodeUtils.java b/src/main/java/com/no1/wms/excel/ExcelDownlodeUtils.java index 38df348..f22072c 100644 --- a/src/main/java/com/no1/wms/excel/ExcelDownlodeUtils.java +++ b/src/main/java/com/no1/wms/excel/ExcelDownlodeUtils.java @@ -11,6 +11,7 @@ import java.util.List; import javax.servlet.http.HttpServletResponse; +import com.no1.wms.vendor.VendorDto; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; @@ -115,8 +116,76 @@ public class ExcelDownlodeUtils { } - - + + + + + public void downloadVendorExcelFile(String excelFileName, HttpServletResponse response, + String sheetName, String[] columnName, List dto) { + String fileName = ""; + try { + fileName = new String((excelFileName + ".xlsx").getBytes("utf-8"), "iso-8859-1"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + response.setContentType("ms-vnd/excel"); + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";"); + + Workbook workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet(sheetName); + + Row row = null; + Cell cell = null; + int rowNum = 0; + + row = sheet.createRow(rowNum); + for( int i = 0; i <= columnName.length -1; i++ ) { + cell = row.createCell(i); + cell.setCellValue(columnName[i]); + } + rowNum += 1; + + //수정부분 + makeVendorBody(dto,row,sheet,cell,rowNum); + + try { + workbook.write(response.getOutputStream()); + workbook.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + + } + + public void makeVendorBody(List listdto, Row row, Sheet sheet, + Cell cell, int rowNum) { + // + for (int i = 0; i < listdto.size(); i++) { + row = sheet.createRow(rowNum++); + VendorDto dto = listdto.get(i); + cell = row.createCell(0); + cell.setCellValue(dto.getName()); + cell = row.createCell(1); + cell.setCellValue(dto.getPresident_name()); + cell = row.createCell(2); + cell.setCellValue(dto.getAddress()); + cell = row.createCell(3); + cell.setCellValue(dto.getRegistration_number()); + cell = row.createCell(4); + cell.setCellValue(dto.getEmail()); + cell = row.createCell(5); + cell.setCellValue(dto.getPresident_telephone()); + cell = row.createCell(6); + cell.setCellValue(dto.getVendor_manager()); + cell = row.createCell(7); + cell.setCellValue(dto.getVendor_manager_telephone()); + cell = row.createCell(8); + cell.setCellValue(dto.getMain_product()); + } + } + + diff --git a/src/main/java/com/no1/wms/resetpassword/ResetPasswordController.java b/src/main/java/com/no1/wms/resetpassword/ResetPasswordController.java index 8cb897d..ecc05ef 100644 --- a/src/main/java/com/no1/wms/resetpassword/ResetPasswordController.java +++ b/src/main/java/com/no1/wms/resetpassword/ResetPasswordController.java @@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; +import java.util.Objects; @Controller @RequestMapping("/resetpassword") @@ -20,21 +21,16 @@ public class ResetPasswordController { @GetMapping("/list") public String list(@RequestParam(name = "searchn", defaultValue = "0") int searchn, @RequestParam(name = "search", defaultValue = "") String search, - @RequestParam(name = "p", defaultValue = "1") int page, String resetpassword, String cancelrequest, Model m) { + @RequestParam(name = "p", defaultValue = "1") int page, + Model m) { int count = resetPasswordService.count(searchn, search); int perPage = 10; // 한 페이지에 보일 글의 갯수 int startRow = (page - 1) * perPage; - if(resetpassword != null){ - - } - if(cancelrequest != null){ - - } - //스톡서비스로 재고 리스트 출력 메서트 작성 List> dto = resetPasswordService.list(searchn, search, startRow ,perPage); + m.addAttribute("rlist", dto); m.addAttribute("start", startRow + 1); @@ -55,8 +51,6 @@ public class ResetPasswordController { m.addAttribute("totalPages", totalPages); m.addAttribute("p" , page); - System.out.println("테스트 : : " + m); - return "resetpassword/list"; } @@ -70,13 +64,22 @@ public class ResetPasswordController { } - @PostMapping("/delete") + @DeleteMapping("/delete") @ResponseBody - public String delete(ResetPasswordDto dto, Gson gson){ - resetPasswordService.delete(dto); - - return gson.toJson("s"); + public int delete(ResetPasswordDto dto){ + int i = resetPasswordService.delete(dto); + return i; } + @PutMapping("/update") + @ResponseBody + public boolean update(ResetPasswordDto dto) { + int i = resetPasswordService.passwordUpdate(dto); + if (i != 0) { + resetPasswordService.delete(dto); + return true; + } + return false; + } } diff --git a/src/main/java/com/no1/wms/resetpassword/ResetPasswordMapper.java b/src/main/java/com/no1/wms/resetpassword/ResetPasswordMapper.java index 331290d..59f12da 100644 --- a/src/main/java/com/no1/wms/resetpassword/ResetPasswordMapper.java +++ b/src/main/java/com/no1/wms/resetpassword/ResetPasswordMapper.java @@ -16,7 +16,9 @@ public interface ResetPasswordMapper { void insert(ResetPasswordDto dto); - void delete(ResetPasswordDto dto); + int delete(ResetPasswordDto dto); + + int passwordUpdate(ResetPasswordDto dto); diff --git a/src/main/java/com/no1/wms/resetpassword/ResetPasswordService.java b/src/main/java/com/no1/wms/resetpassword/ResetPasswordService.java index 7eae4a1..1aa9174 100644 --- a/src/main/java/com/no1/wms/resetpassword/ResetPasswordService.java +++ b/src/main/java/com/no1/wms/resetpassword/ResetPasswordService.java @@ -40,7 +40,10 @@ public class ResetPasswordService { mapper.insert(dto); } - void delete(ResetPasswordDto dto){ - mapper.delete(dto); + int delete(ResetPasswordDto dto){ + return mapper.delete(dto); } + + int passwordUpdate(ResetPasswordDto dto){ + return mapper.passwordUpdate(dto);} } diff --git a/src/main/java/com/no1/wms/vendor/VendorController.java b/src/main/java/com/no1/wms/vendor/VendorController.java index 3b7a83f..4aed0a9 100644 --- a/src/main/java/com/no1/wms/vendor/VendorController.java +++ b/src/main/java/com/no1/wms/vendor/VendorController.java @@ -1,5 +1,7 @@ package com.no1.wms.vendor; +import com.no1.wms.category.CategoryDto; +import com.no1.wms.excel.ExcelDownlodeUtils; import com.no1.wms.warehouse.WarehouseDto; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -7,6 +9,8 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -16,6 +20,9 @@ public class VendorController { @Autowired VendorService service; + + @Autowired + ExcelDownlodeUtils excelDownlodeUtils; // 재고 리스트 출력 @GetMapping("vendor/list") @@ -121,4 +128,22 @@ public class VendorController { int i = service.deleteVendor(id); return i; } + + // 엑셀다운로드테스트 + @GetMapping("/vendor/downloadTest") + public void downloadExcelTest(HttpServletResponse response) { + List dto = service.selectAll(); + String excelFileName = "거래처 파일"; + String sheetName = "거래처"; + String[] columnName = {"업체명","대표자명","주소","사엄자등록번호","이메일","대표번호","거래처 담당자 이름","거래처 담당자 연락 번호","주요품목"}; + excelDownlodeUtils.downloadVendorExcelFile(excelFileName, response, sheetName, columnName, dto); + + }; + + //서식 다운로드 + @GetMapping("/vendor/downlodeVendorForm") + public void downlodeVendorForm (HttpServletResponse response) throws IOException { + String vendorFormName = "거래처 데이터 입력 서식.xlsx"; + excelDownlodeUtils.downlodeExcelForm(response, vendorFormName); + }; } diff --git a/src/main/java/com/no1/wms/vendor/VendorMapper.java b/src/main/java/com/no1/wms/vendor/VendorMapper.java index ebd888c..46e39b6 100644 --- a/src/main/java/com/no1/wms/vendor/VendorMapper.java +++ b/src/main/java/com/no1/wms/vendor/VendorMapper.java @@ -9,7 +9,7 @@ import java.util.Map; @Mapper public interface VendorMapper { - + List selectAll(); List list(Map m); int count(Map m);//검색 글 갯수 diff --git a/src/main/java/com/no1/wms/vendor/VendorService.java b/src/main/java/com/no1/wms/vendor/VendorService.java index c88207e..7e67e76 100644 --- a/src/main/java/com/no1/wms/vendor/VendorService.java +++ b/src/main/java/com/no1/wms/vendor/VendorService.java @@ -54,4 +54,8 @@ public class VendorService { public int deleteVendor(String id) { return mapper.deleteVendor(id); } + + public List selectAll() { + return mapper.selectAll(); + } } diff --git a/src/main/resources/mappers/ResetPasswordMapper.xml b/src/main/resources/mappers/ResetPasswordMapper.xml index 759e422..e23bd76 100644 --- a/src/main/resources/mappers/ResetPasswordMapper.xml +++ b/src/main/resources/mappers/ResetPasswordMapper.xml @@ -20,14 +20,14 @@ (UUID(), (SELECT id from account where employee_number = #{employeeNumber} ), #{note}, NOW()) - SELECT rs.id as id, rs.account_id as account_id, rs.note as note, rs.date as date, acc.id, - acc.name as name, + acc.name, acc.email as email, acc.employee_number as employee_number @@ -38,7 +38,7 @@ acc.activation = 1 and acc.employee_number like concat('%',#{search},'%') - order by date desc limit #{start}, #{perPage} + order by rs.id desc limit #{start}, #{perPage} + + + update account a + left join reset_password rs on a.id = rs.account_id + set a.password = a.employee_number + where rs.id = #{id} + + delete from reset_password WHERE id = #{id} diff --git a/src/main/resources/mappers/VendorMapper.xml b/src/main/resources/mappers/VendorMapper.xml index b9c7550..a748e39 100644 --- a/src/main/resources/mappers/VendorMapper.xml +++ b/src/main/resources/mappers/VendorMapper.xml @@ -4,6 +4,20 @@ + + + + diff --git a/src/main/webapp/WEB-INF/views/resetpassword/list.jsp b/src/main/webapp/WEB-INF/views/resetpassword/list.jsp index 8d1ed12..f3e45a8 100644 --- a/src/main/webapp/WEB-INF/views/resetpassword/list.jsp +++ b/src/main/webapp/WEB-INF/views/resetpassword/list.jsp @@ -1,244 +1,249 @@ -<%@ page contentType="text/html; charset=UTF-8"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - -패스워드 초기화 요청 + + 패스워드 초기화 요청 -
-

패스워드 초기화 요청

-
-
-
-
-
-
-
-
- -
- - - - - - - - -
-
-
-
-
-
-
- - - - - - - - +
+

패스워드 초기화 요청

+
+
+
+
+
+
+
+
+ +
+ + -
- - - - - - - - - - - - -
번호사원명email요청사유
${start} ${dto.name }${dto.email }${dto.note } - - -
-
-
-
-
-
+ + + + -
-
+ +
+
+
+
+
+ + + + + + + + - -
  • - < -
  • -
    - -
  • active "> - ${i } -
  • -
    - -
  • - > -
  • -
    - - - + + + + + + + + + + + + + +
    번호사원명email요청사유
    ${start} ${dto.name }${dto.email }${dto.note } + + + +
    +
    +
    +
    +
    +
    -
    -
    -
    - - - + + });//ready + function pageingFunction(clickedId) { + var searchn1 = $("#searchn1").val(); + var search1 = $("#search1").val(); + + var form = document.createElement("form"); + form.action = "/resetpassword/list"; + form.method = "get"; + + var input1 = document.createElement("input"); + input1.type = "hidden"; + input1.name = "searchn"; + input1.value = searchn1; + form.appendChild(input1); + + var input2 = document.createElement("input"); + input2.type = "hidden"; + input2.name = "search"; + input2.value = search1; + form.appendChild(input2); + + var input3 = document.createElement("input"); + input3.type = "hidden"; + input3.name = "p"; + input3.value = clickedId; + form.appendChild(input3); + + document.body.appendChild(form); + form.submit(); + } + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/vendor/create.jsp b/src/main/webapp/WEB-INF/views/vendor/create.jsp index a9f37cf..9856e3f 100644 --- a/src/main/webapp/WEB-INF/views/vendor/create.jsp +++ b/src/main/webapp/WEB-INF/views/vendor/create.jsp @@ -37,7 +37,8 @@ <%-- 세션 만들어지고 value 수정--%> - + + diff --git a/src/main/webapp/WEB-INF/views/vendor/list.jsp b/src/main/webapp/WEB-INF/views/vendor/list.jsp index 078c088..4c8ea17 100644 --- a/src/main/webapp/WEB-INF/views/vendor/list.jsp +++ b/src/main/webapp/WEB-INF/views/vendor/list.jsp @@ -69,7 +69,7 @@
    ms-excel - +
    @@ -106,6 +106,14 @@ $(document).ready(function(){ + $("#downlodeExcelForm").on("click",function(){ + var form = document.createElement("form"); + form.action = "/vendor/downloadTest"; + form.method = "GET"; + document.body.appendChild(form); + form.submit(); + }); + //POST방식으로 create폼화면 출력 $("#createButton").on("click",function(){ var form = document.createElement("form"); diff --git a/src/main/webapp/WEB-INF/views/warehouse/create.jsp b/src/main/webapp/WEB-INF/views/warehouse/create.jsp index d2bb1e9..fab60dd 100644 --- a/src/main/webapp/WEB-INF/views/warehouse/create.jsp +++ b/src/main/webapp/WEB-INF/views/warehouse/create.jsp @@ -36,7 +36,8 @@ <%-- 세션 만들어지고 value 수정--%> - + + From c9160cd4e821920a2db498e083cdc0f40130501b Mon Sep 17 00:00:00 2001 From: sungsu Date: Thu, 18 Jan 2024 17:32:17 +0900 Subject: [PATCH 3/3] #update --- .../excelform/거래처 데이터 입력 서식.xlsx | Bin 0 -> 9328 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/webapp/excelfiles/excelform/거래처 데이터 입력 서식.xlsx diff --git a/src/main/webapp/excelfiles/excelform/거래처 데이터 입력 서식.xlsx b/src/main/webapp/excelfiles/excelform/거래처 데이터 입력 서식.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..22596901d3dbb4ce8ca39770158424dcfabe9232 GIT binary patch literal 9328 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