diff --git a/src/main/java/com/rymcu/forest/dto/ProductDTO.java b/src/main/java/com/rymcu/forest/dto/ProductDTO.java index dd8c3cc..7123d04 100644 --- a/src/main/java/com/rymcu/forest/dto/ProductDTO.java +++ b/src/main/java/com/rymcu/forest/dto/ProductDTO.java @@ -2,6 +2,7 @@ package com.rymcu.forest.dto; import com.rymcu.forest.entity.Product; import lombok.Data; +import lombok.EqualsAndHashCode; /** * Created on 2022/6/21 9:38. @@ -11,6 +12,7 @@ import lombok.Data; * @packageName com.rymcu.forest.dto */ @Data +@EqualsAndHashCode(callSuper=false) public class ProductDTO extends Product { /** * 文章内容 diff --git a/src/main/java/com/rymcu/forest/entity/Product.java b/src/main/java/com/rymcu/forest/entity/Product.java index b5e312d..1f2e63d 100644 --- a/src/main/java/com/rymcu/forest/entity/Product.java +++ b/src/main/java/com/rymcu/forest/entity/Product.java @@ -3,10 +3,7 @@ package com.rymcu.forest.entity; import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; -import javax.persistence.Column; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; import java.io.Serializable; import java.util.Date; @@ -19,7 +16,7 @@ import java.util.Date; */ @Data @Table(name = "forest_product") -public class Product implements Serializable, Cloneable { +public class Product implements Serializable { /** * 主键 */ @@ -57,4 +54,11 @@ public class Product implements Serializable, Cloneable { */ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date updatedTime; + + private Integer status; + + private String tags; + + @Transient + private String productImgType; } diff --git a/src/main/java/com/rymcu/forest/entity/ProductContent.java b/src/main/java/com/rymcu/forest/entity/ProductContent.java index 8559ecb..701e874 100644 --- a/src/main/java/com/rymcu/forest/entity/ProductContent.java +++ b/src/main/java/com/rymcu/forest/entity/ProductContent.java @@ -16,7 +16,7 @@ import java.util.Date; */ @Data @Table(name = "forest_product_content") -public class ProductContent implements Serializable, Cloneable { +public class ProductContent implements Serializable { /** * 产品表主键 */ diff --git a/src/main/java/com/rymcu/forest/mapper/ProductMapper.java b/src/main/java/com/rymcu/forest/mapper/ProductMapper.java index 4fb8757..bb77426 100644 --- a/src/main/java/com/rymcu/forest/mapper/ProductMapper.java +++ b/src/main/java/com/rymcu/forest/mapper/ProductMapper.java @@ -17,26 +17,49 @@ public interface ProductMapper extends Mapper { /** * 保存产品详情 * - * @param idProduct - * @param productContent - * @param productContentHtml - * @return + * @param idProduct 产品主键 + * @param productContent 产品详情 markdown + * @param productContentHtml 产品详情 html + * @return 更新数量 */ - Integer insertProductContent(@Param("idProduct") Integer idProduct, @Param("productContent") String productContent, @Param("productContentHtml") String productContentHtml); + Integer insertProductContent(@Param("idProduct") Long idProduct, @Param("productContent") String productContent, @Param("productContentHtml") String productContentHtml); /** * 查询产品列表 * - * @return + * @return 产品列表 */ List selectProducts(); /** * 获取产品详情 * - * @param idProduct - * @param type - * @return + * @param idProduct 产品 ID + * @param type 获取类型 + * @return 产品信息 */ - ProductDTO selectProductDTOById(@Param("idProduct") Integer idProduct, @Param("type") Integer type); + ProductDTO selectProductDTOById(@Param("idProduct") Long idProduct, @Param("type") Integer type); + + /** + * 获取在线产品 + * @return 产品信息 + */ + List selectOnlineProducts(); + + /** + * 保存产品详情 + * + * @param idProduct 产品主键 + * @param productContent 产品详情 markdown + * @param productContentHtml 产品详情 html + * @return 更新数量 + */ + Integer updateProductContent(@Param("idProduct") Long idProduct, @Param("productContent") String productContent, @Param("productContentHtml") String productContentHtml); + + /** + * @param idProduct 产品主键 + * @param status 状态 + * @return 更新成功状态 + */ + int updateStatus(@Param("idProduct") Long idProduct, @Param("status") Integer status); } diff --git a/src/main/java/com/rymcu/forest/service/ProductService.java b/src/main/java/com/rymcu/forest/service/ProductService.java index 3851c37..d9d3a88 100644 --- a/src/main/java/com/rymcu/forest/service/ProductService.java +++ b/src/main/java/com/rymcu/forest/service/ProductService.java @@ -16,17 +16,35 @@ import java.util.List; public interface ProductService extends Service { /** * 查询产品列表 - * - * @return + * @return 产品列表 */ List findProducts(); /** * 获取产品详情 * - * @param idProduct - * @param type - * @return + * @param idProduct 产品主键 + * @param type 数据类型 + * @return 产品详情 */ - ProductDTO findProductDTOById(Integer idProduct, Integer type); + ProductDTO findProductDTOById(Long idProduct, Integer type); + + /** + * 获取在线商品 + * @return 产品列表 + */ + List findOnlineProducts(); + + /** + * @param product 产品信息 + * @return 产品信息 + */ + Product postProduct(ProductDTO product); + + /** + * @param idProduct 产品主键 + * @param status 状态 + * @return 更新成功状态 + */ + boolean updateStatus(Long idProduct, Integer status); } diff --git a/src/main/java/com/rymcu/forest/service/impl/ProductServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/ProductServiceImpl.java index 3e62b56..789cf93 100644 --- a/src/main/java/com/rymcu/forest/service/impl/ProductServiceImpl.java +++ b/src/main/java/com/rymcu/forest/service/impl/ProductServiceImpl.java @@ -5,9 +5,13 @@ import com.rymcu.forest.dto.ProductDTO; import com.rymcu.forest.entity.Product; import com.rymcu.forest.mapper.ProductMapper; import com.rymcu.forest.service.ProductService; +import com.rymcu.forest.util.BeanCopierUtil; +import com.rymcu.forest.web.api.common.UploadController; +import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Date; import java.util.List; /** @@ -29,8 +33,53 @@ public class ProductServiceImpl extends AbstractService implements Prod } @Override - public ProductDTO findProductDTOById(Integer idProduct, Integer type) { - ProductDTO productDTO = productMapper.selectProductDTOById(idProduct, type); - return productDTO; + public ProductDTO findProductDTOById(Long idProduct, Integer type) { + return productMapper.selectProductDTOById(idProduct, type); + } + + @Override + public List findOnlineProducts() { + return productMapper.selectOnlineProducts(); + } + + /** + * @param product 产品信息 + * @return 产品信息 + */ + @Override + public Product postProduct(ProductDTO product) { + boolean isUpdate = product.getIdProduct() > 0; + if (StringUtils.isNotBlank(product.getProductImgType())) { + String headImgUrl = UploadController.uploadBase64File(product.getProductImgUrl(), 0); + product.setProductImgUrl(headImgUrl); + } + Product newProduct; + if (isUpdate) { + newProduct = productMapper.selectByPrimaryKey(product.getIdProduct()); + newProduct.setProductImgUrl(product.getProductImgUrl()); + newProduct.setProductTitle(product.getProductTitle()); + newProduct.setProductPrice(product.getProductPrice()); + newProduct.setProductDescription(product.getProductDescription()); + productMapper.updateByPrimaryKeySelective(newProduct); + // 更新产品详情 + productMapper.updateProductContent(newProduct.getIdProduct(), product.getProductContent(), product.getProductContentHtml()); + } else { + newProduct = new Product(); + BeanCopierUtil.convert(product, newProduct); + newProduct.setCreatedTime(new Date()); + // 创建产品详情 + productMapper.insertProductContent(newProduct.getIdProduct(), product.getProductContent(), product.getProductContentHtml()); + } + return newProduct; + } + + /** + * @param idProduct 产品主键 + * @param status 状态 + * @return 更新成功状态 + */ + @Override + public boolean updateStatus(Long idProduct, Integer status) { + return productMapper.updateStatus(idProduct, status) > 0; } } diff --git a/src/main/java/com/rymcu/forest/web/api/admin/AdminArticleController.java b/src/main/java/com/rymcu/forest/web/api/admin/AdminArticleController.java index e56de0b..ab5c89e 100644 --- a/src/main/java/com/rymcu/forest/web/api/admin/AdminArticleController.java +++ b/src/main/java/com/rymcu/forest/web/api/admin/AdminArticleController.java @@ -34,7 +34,7 @@ public class AdminArticleController { @PatchMapping("/update-status") public GlobalResult updateArticleStatus(@RequestBody ArticleUpdateStatusDTO article) { - Long idArticle = article.getIdArticle();; + Long idArticle = article.getIdArticle(); String articleStatus = article.getArticleStatus(); String remarks = article.getRemarks(); return GlobalResultGenerator.genSuccessResult(articleService.updateStatus(idArticle, articleStatus, remarks)); diff --git a/src/main/java/com/rymcu/forest/web/api/common/CommonApiController.java b/src/main/java/com/rymcu/forest/web/api/common/CommonApiController.java index 8d7c562..5a3bdd9 100644 --- a/src/main/java/com/rymcu/forest/web/api/common/CommonApiController.java +++ b/src/main/java/com/rymcu/forest/web/api/common/CommonApiController.java @@ -141,14 +141,14 @@ public class CommonApiController { @GetMapping("/products") public GlobalResult> products(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "12") Integer rows) { PageHelper.startPage(page, rows); - List list = productService.findProducts(); + List list = productService.findOnlineProducts(); PageInfo pageInfo = new PageInfo<>(list); return GlobalResultGenerator.genSuccessResult(pageInfo); } @GetMapping("/product/{id}") @VisitLogger - public GlobalResult product(@PathVariable Integer id) { + public GlobalResult product(@PathVariable Long id) { ProductDTO productDTO = productService.findProductDTOById(id, 1); return GlobalResultGenerator.genSuccessResult(productDTO); } diff --git a/src/main/java/com/rymcu/forest/web/api/product/ProductController.java b/src/main/java/com/rymcu/forest/web/api/product/ProductController.java index 6675a1f..7873aea 100644 --- a/src/main/java/com/rymcu/forest/web/api/product/ProductController.java +++ b/src/main/java/com/rymcu/forest/web/api/product/ProductController.java @@ -1,8 +1,17 @@ package com.rymcu.forest.web.api.product; +import com.rymcu.forest.core.result.GlobalResult; +import com.rymcu.forest.core.result.GlobalResultGenerator; +import com.rymcu.forest.core.service.security.annotation.AuthorshipInterceptor; +import com.rymcu.forest.core.service.security.annotation.SecurityInterceptor; +import com.rymcu.forest.dto.ProductDTO; +import com.rymcu.forest.entity.Product; +import com.rymcu.forest.entity.Product; +import com.rymcu.forest.entity.User; +import com.rymcu.forest.enumerate.Module; import com.rymcu.forest.service.ProductService; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.rymcu.forest.util.UserUtils; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -20,4 +29,32 @@ public class ProductController { @Resource private ProductService productService; + @GetMapping("/detail/{idProduct}") + public GlobalResult detail(@PathVariable Long idProduct, @RequestParam(defaultValue = "2") Integer type) { + ProductDTO dto = productService.findProductDTOById(idProduct, type); + return GlobalResultGenerator.genSuccessResult(dto); + } + + @PostMapping("/post") + public GlobalResult add(@RequestBody ProductDTO product) { + Product newProduct = productService.postProduct(product); + return GlobalResultGenerator.genSuccessResult(newProduct); + } + + @PutMapping("/post") + public GlobalResult update(@RequestBody ProductDTO product) { + if (product.getIdProduct() == null || product.getIdProduct() == 0) { + throw new IllegalArgumentException("产品主键参数异常!"); + } + Product oldProduct = productService.postProduct(product); + return GlobalResultGenerator.genSuccessResult(oldProduct); + } + + + @PatchMapping("/update-status") + public GlobalResult updateStatus(@RequestBody Product product) { + boolean flag = productService.updateStatus(product.getIdProduct(), product.getStatus()); + return GlobalResultGenerator.genSuccessResult(flag); + } + } diff --git a/src/main/java/mapper/ProductMapper.xml b/src/main/java/mapper/ProductMapper.xml index 438aca3..ddf51f6 100644 --- a/src/main/java/mapper/ProductMapper.xml +++ b/src/main/java/mapper/ProductMapper.xml @@ -8,6 +8,9 @@ + + + insert into forest_product_content(id_product, @@ -21,13 +24,25 @@ sysdate(), sysdate()) + + update forest_product_content + set product_content = #{productContent}, + product_content_html = #{productContentHtml}, + updated_time = sysdate() + where id_product = #{idProduct} + + + update forest_product + set status = #{status} + where id_product = #{idProduct} + - \ No newline at end of file + +