🎨 产品信息维护接口

1. 产品信息维护接口
2. 产品模块接口调整
This commit is contained in:
ronger 2024-02-28 13:52:59 +08:00 committed by GitHub
commit 77605d84b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 187 additions and 33 deletions

View File

@ -2,6 +2,7 @@ package com.rymcu.forest.dto;
import com.rymcu.forest.entity.Product; import com.rymcu.forest.entity.Product;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* Created on 2022/6/21 9:38. * Created on 2022/6/21 9:38.
@ -11,6 +12,7 @@ import lombok.Data;
* @packageName com.rymcu.forest.dto * @packageName com.rymcu.forest.dto
*/ */
@Data @Data
@EqualsAndHashCode(callSuper=false)
public class ProductDTO extends Product { public class ProductDTO extends Product {
/** /**
* 文章内容 * 文章内容

View File

@ -3,10 +3,7 @@ package com.rymcu.forest.entity;
import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data; import lombok.Data;
import javax.persistence.Column; import javax.persistence.*;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
@ -19,7 +16,7 @@ import java.util.Date;
*/ */
@Data @Data
@Table(name = "forest_product") @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") @JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date updatedTime; private Date updatedTime;
private Integer status;
private String tags;
@Transient
private String productImgType;
} }

View File

@ -16,7 +16,7 @@ import java.util.Date;
*/ */
@Data @Data
@Table(name = "forest_product_content") @Table(name = "forest_product_content")
public class ProductContent implements Serializable, Cloneable { public class ProductContent implements Serializable {
/** /**
* 产品表主键 * 产品表主键
*/ */

View File

@ -17,26 +17,49 @@ public interface ProductMapper extends Mapper<Product> {
/** /**
* 保存产品详情 * 保存产品详情
* *
* @param idProduct * @param idProduct 产品主键
* @param productContent * @param productContent 产品详情 markdown
* @param productContentHtml * @param productContentHtml 产品详情 html
* @return * @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<ProductDTO> selectProducts(); List<ProductDTO> selectProducts();
/** /**
* 获取产品详情 * 获取产品详情
* *
* @param idProduct * @param idProduct 产品 ID
* @param type * @param type 获取类型
* @return * @return 产品信息
*/ */
ProductDTO selectProductDTOById(@Param("idProduct") Integer idProduct, @Param("type") Integer type); ProductDTO selectProductDTOById(@Param("idProduct") Long idProduct, @Param("type") Integer type);
/**
* 获取在线产品
* @return 产品信息
*/
List<ProductDTO> 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);
} }

View File

@ -16,17 +16,35 @@ import java.util.List;
public interface ProductService extends Service<Product> { public interface ProductService extends Service<Product> {
/** /**
* 查询产品列表 * 查询产品列表
* * @return 产品列表
* @return
*/ */
List<ProductDTO> findProducts(); List<ProductDTO> findProducts();
/** /**
* 获取产品详情 * 获取产品详情
* *
* @param idProduct * @param idProduct 产品主键
* @param type * @param type 数据类型
* @return * @return 产品详情
*/ */
ProductDTO findProductDTOById(Integer idProduct, Integer type); ProductDTO findProductDTOById(Long idProduct, Integer type);
/**
* 获取在线商品
* @return 产品列表
*/
List<ProductDTO> findOnlineProducts();
/**
* @param product 产品信息
* @return 产品信息
*/
Product postProduct(ProductDTO product);
/**
* @param idProduct 产品主键
* @param status 状态
* @return 更新成功状态
*/
boolean updateStatus(Long idProduct, Integer status);
} }

View File

@ -5,9 +5,13 @@ import com.rymcu.forest.dto.ProductDTO;
import com.rymcu.forest.entity.Product; import com.rymcu.forest.entity.Product;
import com.rymcu.forest.mapper.ProductMapper; import com.rymcu.forest.mapper.ProductMapper;
import com.rymcu.forest.service.ProductService; 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 org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@ -29,8 +33,53 @@ public class ProductServiceImpl extends AbstractService<Product> implements Prod
} }
@Override @Override
public ProductDTO findProductDTOById(Integer idProduct, Integer type) { public ProductDTO findProductDTOById(Long idProduct, Integer type) {
ProductDTO productDTO = productMapper.selectProductDTOById(idProduct, type); return productMapper.selectProductDTOById(idProduct, type);
return productDTO; }
@Override
public List<ProductDTO> 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;
} }
} }

View File

@ -34,7 +34,7 @@ public class AdminArticleController {
@PatchMapping("/update-status") @PatchMapping("/update-status")
public GlobalResult<Boolean> updateArticleStatus(@RequestBody ArticleUpdateStatusDTO article) { public GlobalResult<Boolean> updateArticleStatus(@RequestBody ArticleUpdateStatusDTO article) {
Long idArticle = article.getIdArticle();; Long idArticle = article.getIdArticle();
String articleStatus = article.getArticleStatus(); String articleStatus = article.getArticleStatus();
String remarks = article.getRemarks(); String remarks = article.getRemarks();
return GlobalResultGenerator.genSuccessResult(articleService.updateStatus(idArticle, articleStatus, remarks)); return GlobalResultGenerator.genSuccessResult(articleService.updateStatus(idArticle, articleStatus, remarks));

View File

@ -141,14 +141,14 @@ public class CommonApiController {
@GetMapping("/products") @GetMapping("/products")
public GlobalResult<PageInfo<ProductDTO>> products(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "12") Integer rows) { public GlobalResult<PageInfo<ProductDTO>> products(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "12") Integer rows) {
PageHelper.startPage(page, rows); PageHelper.startPage(page, rows);
List<ProductDTO> list = productService.findProducts(); List<ProductDTO> list = productService.findOnlineProducts();
PageInfo<ProductDTO> pageInfo = new PageInfo<>(list); PageInfo<ProductDTO> pageInfo = new PageInfo<>(list);
return GlobalResultGenerator.genSuccessResult(pageInfo); return GlobalResultGenerator.genSuccessResult(pageInfo);
} }
@GetMapping("/product/{id}") @GetMapping("/product/{id}")
@VisitLogger @VisitLogger
public GlobalResult<ProductDTO> product(@PathVariable Integer id) { public GlobalResult<ProductDTO> product(@PathVariable Long id) {
ProductDTO productDTO = productService.findProductDTOById(id, 1); ProductDTO productDTO = productService.findProductDTOById(id, 1);
return GlobalResultGenerator.genSuccessResult(productDTO); return GlobalResultGenerator.genSuccessResult(productDTO);
} }

View File

@ -1,8 +1,17 @@
package com.rymcu.forest.web.api.product; 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 com.rymcu.forest.service.ProductService;
import org.springframework.web.bind.annotation.RequestMapping; import com.rymcu.forest.util.UserUtils;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -20,4 +29,32 @@ public class ProductController {
@Resource @Resource
private ProductService productService; private ProductService productService;
@GetMapping("/detail/{idProduct}")
public GlobalResult<ProductDTO> detail(@PathVariable Long idProduct, @RequestParam(defaultValue = "2") Integer type) {
ProductDTO dto = productService.findProductDTOById(idProduct, type);
return GlobalResultGenerator.genSuccessResult(dto);
}
@PostMapping("/post")
public GlobalResult<Product> add(@RequestBody ProductDTO product) {
Product newProduct = productService.postProduct(product);
return GlobalResultGenerator.genSuccessResult(newProduct);
}
@PutMapping("/post")
public GlobalResult<Product> 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<Boolean> updateStatus(@RequestBody Product product) {
boolean flag = productService.updateStatus(product.getIdProduct(), product.getStatus());
return GlobalResultGenerator.genSuccessResult(flag);
}
} }

View File

@ -8,6 +8,9 @@
<result column="product_description" property="productDescription"></result> <result column="product_description" property="productDescription"></result>
<result column="product_price" property="productPrice"></result> <result column="product_price" property="productPrice"></result>
<result column="product_content" property="productContent"></result> <result column="product_content" property="productContent"></result>
<result column="created_time" property="createdTime"></result>
<result column="status" property="status"></result>
<result column="tags" property="tags"></result>
</resultMap> </resultMap>
<insert id="insertProductContent"> <insert id="insertProductContent">
insert into forest_product_content(id_product, insert into forest_product_content(id_product,
@ -21,13 +24,25 @@
sysdate(), sysdate(),
sysdate()) sysdate())
</insert> </insert>
<update id="updateProductContent">
update forest_product_content
set product_content = #{productContent},
product_content_html = #{productContentHtml},
updated_time = sysdate()
where id_product = #{idProduct}
</update>
<update id="updateStatus">
update forest_product
set status = #{status}
where id_product = #{idProduct}
</update>
<select id="selectProducts" resultMap="DTOResultMap"> <select id="selectProducts" resultMap="DTOResultMap">
select * select id, product_title, product_img_url, tags, product_description, product_price, weights, status
from forest_product from forest_product
order by weights order by weights
</select> </select>
<select id="selectProductDTOById" resultMap="DTOResultMap"> <select id="selectProductDTOById" resultMap="DTOResultMap">
select id, product_title, select id, product_title, product_img_url, tags, product_description, product_price, weights, status,
<choose> <choose>
<when test="type == 1"> <when test="type == 1">
product_content_html as product_content, product_content_html as product_content,
@ -39,4 +54,10 @@
product_img_url from forest_product fp join forest_product_content fpc on fp.id = fpc.id_product product_img_url from forest_product fp join forest_product_content fpc on fp.id = fpc.id_product
where id = #{idProduct} where id = #{idProduct}
</select> </select>
<select id="selectOnlineProducts" resultMap="DTOResultMap">
select id, product_title, product_img_url, product_description, product_price
from forest_product
where status = 1
order by weights
</select>
</mapper> </mapper>