diff --git a/springAssignmentSystem/README.md b/springAssignmentSystem/README.md index da7e458c7..1f0ccdce4 100644 --- a/springAssignmentSystem/README.md +++ b/springAssignmentSystem/README.md @@ -56,6 +56,7 @@ - Part 30 : https://youtu.be/iYchh7v7P1Q?si=mDFJUFlhijuH83CN - Part 31 : https://youtu.be/SOyfQCsOvO4?si=HsjKAdQBiflZHORp - Part 32 : https://youtu.be/d_YH4TnLuhk?si=BmgFG1gWJvDLp5kO + - Part 33 : https://youtu.be/TbhJBqAiMGE?si=nIKaQMjUnpGcRjgw - Spring JWT diff --git a/springAssignmentSystem/doc/progress.txt b/springAssignmentSystem/doc/progress.txt index 76e386fb4..4b9b36ac8 100644 --- a/springAssignmentSystem/doc/progress.txt +++ b/springAssignmentSystem/doc/progress.txt @@ -103,4 +103,8 @@ - 20231012 - https://youtu.be/d_YH4TnLuhk?si=BmgFG1gWJvDLp5kO - - progress : 16:22 \ No newline at end of file + - progress : 16:22 + +- 20231015 + - https://youtu.be/d_YH4TnLuhk?si=BmgFG1gWJvDLp5kO + - https://youtu.be/TbhJBqAiMGE?si=nIKaQMjUnpGcRjgw \ No newline at end of file diff --git a/springAssignmentSystem/frontend/frontend_app/src/AssignmentView/index.js b/springAssignmentSystem/frontend/frontend_app/src/AssignmentView/index.js index 053a38559..33cbeb470 100644 --- a/springAssignmentSystem/frontend/frontend_app/src/AssignmentView/index.js +++ b/springAssignmentSystem/frontend/frontend_app/src/AssignmentView/index.js @@ -40,12 +40,21 @@ const AssignmentView = () => { console.log(assignment); } - function saveAssignment() { + function saveAssignment(status) { // call BE API save assignment // https://youtu.be/2XRQzR4y2yM?si=aiNeLhS3SXsU18HE&t=833 // means when submit an assignment at the first time - if (assignment.status === assignmentStatuses[0].status) { - updateAssignment("status", assignmentStatuses[1].status); + + // https://youtu.be/d_YH4TnLuhk?si=eYDtONFyA5U5hVZM&t=1134 + // if (assignment.status === assignmentStatuses[0].status) { + // updateAssignment("status", assignmentStatuses[1].status); + // } else { + // // https://youtu.be/2XRQzR4y2yM?si=RDbtHpdUnVs8j7JE&t=1109 + // persist(); + // } + + if (status && assignment.status != status) { + updateAssignment("status", status); } else { // https://youtu.be/2XRQzR4y2yM?si=RDbtHpdUnVs8j7JE&t=1109 persist(); @@ -216,7 +225,9 @@ const AssignmentView = () => { - + ) : ( <> diff --git a/springAssignmentSystem/frontend/frontend_app/src/CodeReviewAssignmentView/index.js b/springAssignmentSystem/frontend/frontend_app/src/CodeReviewAssignmentView/index.js index 866b17b25..72e791fe9 100644 --- a/springAssignmentSystem/frontend/frontend_app/src/CodeReviewAssignmentView/index.js +++ b/springAssignmentSystem/frontend/frontend_app/src/CodeReviewAssignmentView/index.js @@ -51,12 +51,12 @@ const CodeReviewerAssignmentView = () => { // means when submit an assignment at the first time // https://youtu.be/SOyfQCsOvO4?si=Eu1z9CWZO0c-e3Zq&t=816 - console.log( - "(saveAssignment) status = " + - status + - ", assignment = " + - JSON.stringify(assignment) - ); + // console.log( + // "(saveAssignment) status = " + + // status + + // ", assignment = " + + // JSON.stringify(assignment) + // ); if (status && assignment.status !== status) { updateAssignment("status", status); diff --git a/springWarehouse/my_csv.csv b/springWarehouse/my_csv.csv new file mode 100644 index 000000000..939efa4fc --- /dev/null +++ b/springWarehouse/my_csv.csv @@ -0,0 +1,2 @@ +John,Doe,38,Comment Data Another line of comment data +Jane,"Doe, Jr.",19,"She said ""I'm being quoted""" diff --git a/springWarehouse/sql/ddl/order.sql b/springWarehouse/sql/ddl/order.sql index 778376487..a4003ce95 100644 --- a/springWarehouse/sql/ddl/order.sql +++ b/springWarehouse/sql/ddl/order.sql @@ -8,13 +8,14 @@ CREATE TABLE IF NOT EXISTS orders ( merchant_id int, product_id int, amount int, + status varchar(10), create_time datetime, update_time datetime ); -INSERT INTO orders(id, merchant_id, product_id, amount, create_time, update_time) +INSERT INTO orders(id, merchant_id, product_id, amount, status, create_time, update_time) VALUES -(uuid(), 1, 1, 1, now(), now()), -(uuid(), 2, 2, 1, now(), now()), -(uuid(), 1, 3, 1, now(), now()); \ No newline at end of file +("213ac245-7a2a-453b-a4a7-149426b13f84", 1, 1, 1, "completed", now(), now()), +("d42b3224-b715-46af-9294-3b2ecc6ccc7a", 2, 2, 1, "cancelled", now(), now()), +(uuid(), 1, 3, 1, "pending", now(), now()); \ No newline at end of file diff --git a/springWarehouse/sql/ddl/product.sql b/springWarehouse/sql/ddl/product.sql index 6313df28e..a066db6c9 100644 --- a/springWarehouse/sql/ddl/product.sql +++ b/springWarehouse/sql/ddl/product.sql @@ -9,14 +9,14 @@ CREATE TABLE IF NOT EXISTS product( type_id int not null, price int not null, merchant_id varchar(100), - product_status varchar(1) not null, + product_status varchar(10), amount int DEFAULT 0, constraint FK_PRODUCT_TYPE FOREIGN KEY (type_id) references product_type(type_id) ); -- DML -INSERT INTO product(name, type_id, price, merchant_id, product_status) +INSERT INTO product(name, type_id, price, merchant_id, amount, product_status) VALUES -("i-phone", 2, 300, 1, "0"), -("cookie2", 4, 10, 2, "0"), -("soap", 1, 50, 1, "0"); \ No newline at end of file +("i-phone", 2, 300, 1, 3, "on_board"), +("cookie2", 4, 10, 2, 2, "new"), +("soap", 1, 50, 1, 1, "off_board"); \ No newline at end of file diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/bean/Order.java b/springWarehouse/src/main/java/com/yen/springWarehouse/bean/Order.java new file mode 100644 index 000000000..084880e29 --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/bean/Order.java @@ -0,0 +1,43 @@ +package com.yen.springWarehouse.bean; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("orders") +public class Order implements Serializable { + + private static final long serialVersionUID = 58533333369667604L; + + // https://www.cnblogs.com/mark5/p/14268122.html + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + @TableField("merchant_id") + private Integer merchantId; + + @TableField("product_id") + private Integer productId; + + @TableField("amount") + private Integer amount; + + @TableField("status") + private String status; + + @TableField("create_time") + private LocalDateTime createTime; + + @TableField("update_time") + private LocalDateTime updateTime; +} diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/controller/OrderController.java b/springWarehouse/src/main/java/com/yen/springWarehouse/controller/OrderController.java new file mode 100644 index 000000000..18b82ccbf --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/controller/OrderController.java @@ -0,0 +1,126 @@ +package com.yen.springWarehouse.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yen.springWarehouse.bean.Merchant; +import com.yen.springWarehouse.bean.Order; +import com.yen.springWarehouse.bean.Product; +import com.yen.springWarehouse.enums.OrderStatus; +import com.yen.springWarehouse.service.MerchantService; +import com.yen.springWarehouse.service.OrderService; +import com.yen.springWarehouse.service.ProductService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Slf4j +@Controller +@RequestMapping("/order") +public class OrderController { + + @Autowired + OrderService orderService; + + @Autowired + MerchantService merchantService; + + @Autowired + ProductService productService; + + @GetMapping("/toInput") + public String input(Map map) { + + map.put("merchantList", merchantService.list()); + map.put("productList", productService.list()); + //map.put("Order", new Order()); // TODO : check necessary ? + return "order/input_order"; + } + + @PostMapping("/create") + public String create(Order order) { + + if (!orderService.updateProductWithOrder(order)){ + log.error("order create failed"); + return "redirect:/order/list"; + } + + order.setStatus(OrderStatus.Pending.getMsg()); + order.setCreateTime(LocalDateTime.now()); + log.info("(OrderController.create) Create new order : " + order.toString()); + orderService.save(order); + return "redirect:/order/list"; + } + + @GetMapping("/list") + public String list(Map map, @RequestParam(value="pageNo", required=false, defaultValue="1") String pageNoStr) { + + // TODO : refactor to pageUtil (a common method handle paging request) + int pageNo; + + // check pageNo + pageNo = Integer.parseInt(pageNoStr); + if(pageNo < 1){ + pageNo = 1; + } + + /* + * 1st param:which page + * 2nd param : record count per page + */ + log.info("pageNo = {}", pageNo); + Page page = new Page<>(pageNo,3); + QueryWrapper queryWrapper = new QueryWrapper<>(); + IPage iPage = orderService.page(page, + new LambdaQueryWrapper() + .orderByAsc(Order::getId) + ); + log.info("iPage.total = {}, iPage.getPages = {} iPage = {}", iPage.getTotal(), iPage.getPages(), iPage); + map.put("page", iPage); + + return "order/list_order"; + } + + // TODO : only allow cancel if order status is "uncompleted" + @PostMapping(value="/remove/{orderNo}") + public String remove(@PathVariable("orderNo") String orderNo) { + + orderService.removeById(orderNo); + return "redirect:/order/list"; + } + + // TODO : only allow update if order status is "uncompleted" + @GetMapping(value="/preUpdate/{orderNo}") + public String preUpdate(@PathVariable("orderNo") String orderNo, Map map) { + + Order order = orderService.getById(orderNo); + map.put("order" , order); + map.put("orderList", orderService.list()); + return "order/update_order"; + } + + @PostMapping(value="/update") + public String update(Order order) { + + log.info("update order as {}", order); + orderService.updateById(order); + return "redirect:/order/list"; + } + + // TODO : fix below + /** + * download order data as csv + * https://pdai.tech/md/spring/springboot/springboot-x-file-upload-download.html + */ + @GetMapping(value="/download") + public void download(){ + List orders = orderService.getAllOrders(); + } + +} diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/controller/ProductController.java b/springWarehouse/src/main/java/com/yen/springWarehouse/controller/ProductController.java index a5a69ab3b..a090508ea 100644 --- a/springWarehouse/src/main/java/com/yen/springWarehouse/controller/ProductController.java +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/controller/ProductController.java @@ -79,6 +79,7 @@ public String list(@RequestParam(value="pageNo", required=false, defaultValue="1 Page page = productService.getProductPage(helper, pageNo, PAGE_SIZE); map.put("productTypeList", productTypeService.list()); + map.put("merchantList", merchantService.list()); map.put("page", page); map.put("helper", helper); log.info("(ProductController list) map = {}", map); diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/dto/ProductDto.java b/springWarehouse/src/main/java/com/yen/springWarehouse/dto/ProductDto.java new file mode 100644 index 000000000..3f63ec6d5 --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/dto/ProductDto.java @@ -0,0 +1,29 @@ +package com.yen.springWarehouse.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ProductDto { + + private int id; + + private String name; + + private int typeId; + + private int price; + + private int merchantId; + + private String productStatus; + + private int amount; + + private String productTypeName; + + private String merchantName; +} diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/enums/OrderStatus.java b/springWarehouse/src/main/java/com/yen/springWarehouse/enums/OrderStatus.java new file mode 100644 index 000000000..e0f237a75 --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/enums/OrderStatus.java @@ -0,0 +1,28 @@ +package com.yen.springWarehouse.enums; + +public enum OrderStatus { + + Completed(10000, "completed"), + + Pending(10001, "pending"), + + Cancelled(10002, "cancelled"); + + + private int code; + private String msg; + + OrderStatus(int code, String msg){ + this.code = code; + this.msg = msg; + } + + public int getCode(){ + return this.code; + } + + public String getMsg(){ + return this.msg; + } + +} diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/enums/ProductStatus.java b/springWarehouse/src/main/java/com/yen/springWarehouse/enums/ProductStatus.java new file mode 100644 index 000000000..952d5b184 --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/enums/ProductStatus.java @@ -0,0 +1,25 @@ +package com.yen.springWarehouse.enums; + +public enum ProductStatus { + + New(20000, "new"), + onBoard(20001, "on_board"), + offBoard(20002, "off_board"); + + private int code; + private String msg; + + ProductStatus(int code, String msg){ + this.code = code; + this.msg = msg; + } + + public int getCode(){ + return this.code; + } + + public String getMsg(){ + return this.msg; + } + +} diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/mapper/OrderMapper.java b/springWarehouse/src/main/java/com/yen/springWarehouse/mapper/OrderMapper.java new file mode 100644 index 000000000..ee994f759 --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/mapper/OrderMapper.java @@ -0,0 +1,18 @@ +package com.yen.springWarehouse.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yen.springWarehouse.bean.Order; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface OrderMapper extends BaseMapper { + + List getOrderList(Page orderPage, @Param("ew") Wrapper wrapper); + + List getAllOrders(); +} diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/mapper/OrderMapper.xml b/springWarehouse/src/main/java/com/yen/springWarehouse/mapper/OrderMapper.xml new file mode 100644 index 000000000..50e5bf6fb --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/mapper/OrderMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/service/OrderService.java b/springWarehouse/src/main/java/com/yen/springWarehouse/service/OrderService.java new file mode 100644 index 000000000..3a5525698 --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/service/OrderService.java @@ -0,0 +1,19 @@ +package com.yen.springWarehouse.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yen.springWarehouse.bean.Order; +import com.yen.springWarehouse.bean.Product; +import com.yen.springWarehouse.util.OrderQueryHelper; +import com.yen.springWarehouse.util.ProductQueryHelper; + +import java.util.List; + +public interface OrderService extends IService { + + Page getOrderPage(OrderQueryHelper helper, Integer pageNo, Integer pageSize); + + Boolean updateProductWithOrder(Order order); + + List getAllOrders(); +} diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/service/ProductService.java b/springWarehouse/src/main/java/com/yen/springWarehouse/service/ProductService.java index 7c2c8f8a5..376e32fb8 100644 --- a/springWarehouse/src/main/java/com/yen/springWarehouse/service/ProductService.java +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/service/ProductService.java @@ -3,10 +3,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.yen.springWarehouse.bean.Product; +import com.yen.springWarehouse.dto.ProductDto; import com.yen.springWarehouse.util.ProductQueryHelper; +import java.util.List; + public interface ProductService extends IService { /** Pagination */ Page getProductPage(ProductQueryHelper helper, Integer pageNo, Integer pageSize); + + List getProductDtoListFromProductList(List productList); + } diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/service/impl/OrderServiceImpl.java b/springWarehouse/src/main/java/com/yen/springWarehouse/service/impl/OrderServiceImpl.java new file mode 100644 index 000000000..3807bd076 --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/service/impl/OrderServiceImpl.java @@ -0,0 +1,88 @@ +package com.yen.springWarehouse.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yen.springWarehouse.bean.Merchant; +import com.yen.springWarehouse.bean.Order; +import com.yen.springWarehouse.bean.Product; +import com.yen.springWarehouse.mapper.OrderMapper; +import com.yen.springWarehouse.service.MerchantService; +import com.yen.springWarehouse.service.OrderService; +import com.yen.springWarehouse.service.ProductService; +import com.yen.springWarehouse.util.OrderQueryHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional(rollbackFor = Exception.class) +public class OrderServiceImpl extends ServiceImpl implements OrderService { + + @Autowired + MerchantService merchantService; + + @Autowired + ProductService productService; + + @Autowired + OrderMapper orderMapper; + + + @Override + public Page getOrderPage(OrderQueryHelper helper, Integer pageNo, Integer pageSize) { + + + Page page = new Page<>(pageNo,pageSize); + QueryWrapper orderWrapper = new QueryWrapper<>(); + + List orderList = baseMapper.getOrderList(page, orderWrapper); + + if(CollectionUtils.isNotEmpty(orderList)){ + page.setRecords(orderList); + return page; + } + + return new Page<>(); + } + + @Override + public Boolean updateProductWithOrder(Order order) { + + if (order.getMerchantId() == null || order.getProductId() == null){ + log.error("merchantId or ProductId is null"); + return false; + } + + Product product = productService.getById(order.getProductId()); + Merchant merchant = merchantService.getById(order.getMerchantId()); + + // TODO : optimize below + // TODO : send error msg to FE + // merchant doesn't own product + if (product.getMerchantId() != merchant.getId()){ + log.error("merchant doesn't own product"); + return false; + } + + int diff = product.getAmount() - order.getAmount(); + if (diff < 0){ + log.error("product amount less than order amount"); + return false; + } + + // update product + product.setAmount(diff); + productService.updateById(product); + return true; + } + + @Override + public List getAllOrders() { + return orderMapper.getAllOrders(); + } + +} diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/service/impl/ProductServiceImpl.java b/springWarehouse/src/main/java/com/yen/springWarehouse/service/impl/ProductServiceImpl.java index 5e907d77c..13e3e9ac3 100644 --- a/springWarehouse/src/main/java/com/yen/springWarehouse/service/impl/ProductServiceImpl.java +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/service/impl/ProductServiceImpl.java @@ -4,17 +4,24 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yen.springWarehouse.bean.Merchant; import com.yen.springWarehouse.bean.Product; +import com.yen.springWarehouse.bean.ProductType; +import com.yen.springWarehouse.dto.ProductDto; import com.yen.springWarehouse.mapper.ProductMapper; import com.yen.springWarehouse.mapper.ProductTypeMapper; +import com.yen.springWarehouse.service.MerchantService; import com.yen.springWarehouse.service.ProductService; +import com.yen.springWarehouse.service.ProductTypeService; import com.yen.springWarehouse.util.ProductQueryHelper; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.beans.BeanUtils; import java.util.List; +import java.util.stream.Collectors; @Service @Transactional(rollbackFor = Exception.class) @@ -23,6 +30,12 @@ public class ProductServiceImpl extends ServiceImpl impl @Autowired ProductTypeMapper productTypeMapper; + @Autowired + MerchantService merchantService; + + @Autowired + ProductTypeService productTypeService; + @Override public Page getProductPage(ProductQueryHelper helper, Integer pageNo, Integer pageSize) { @@ -54,6 +67,7 @@ public Page getProductPage(ProductQueryHelper helper, Integer pageNo, I // ); if(CollectionUtils.isNotEmpty(productList)){ + //List productDtoList = getProductDtoListFromProductList(productList); page.setRecords(productList); return page; } @@ -62,4 +76,22 @@ public Page getProductPage(ProductQueryHelper helper, Integer pageNo, I } + @Override + public List getProductDtoListFromProductList(List productList) { + + List productDtoList = productList.stream().map( + product -> { + ProductDto productDto = new ProductDto(); + Merchant merchant = merchantService.getById(product.getMerchantId()); + ProductType productType = productTypeService.getById(product.getTypeId()); + BeanUtils.copyProperties(productDto, product); + productDto.setMerchantName(merchant.getName()); + productDto.setProductTypeName(productType.getTypeName()); + return productDto; + } + ).collect(Collectors.toList()); + + return productDtoList; + } + } diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/util/OrderQueryHelper.java b/springWarehouse/src/main/java/com/yen/springWarehouse/util/OrderQueryHelper.java new file mode 100644 index 000000000..e38115b68 --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/util/OrderQueryHelper.java @@ -0,0 +1,9 @@ +package com.yen.springWarehouse.util; + +import java.io.Serializable; + +public class OrderQueryHelper implements Serializable { + + private static final long serialVersionUID = -977444405069L; + +} diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/util/csvUtil.java b/springWarehouse/src/main/java/com/yen/springWarehouse/util/csvUtil.java new file mode 100644 index 000000000..94cc037a0 --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/util/csvUtil.java @@ -0,0 +1,24 @@ +package com.yen.springWarehouse.util; + +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class csvUtil { + + // https://www.baeldung.com/java-csv + public String covertArrayToCSV(String[] data){ + return Stream.of(data) + .map(this::escapeSpecialCharacters) + .collect(Collectors.joining(",")); + } + + private String escapeSpecialCharacters(String data) { + String escapedData = data.replaceAll("\\R", " "); + if (data.contains(",") || data.contains("\"") || data.contains("'")) { + data = data.replace("\"", "\"\""); + escapedData = "\"" + data + "\""; + } + return escapedData; + } + +} diff --git a/springWarehouse/src/main/resources/templates/main.html b/springWarehouse/src/main/resources/templates/main.html index dd87cd4d1..4d7657541 100644 --- a/springWarehouse/src/main/resources/templates/main.html +++ b/springWarehouse/src/main/resources/templates/main.html @@ -32,6 +32,13 @@ +
+ +