商品管理 - 上架、下架 + 列表页实现 - 跳转到列表页


一、搭建搜索服务 - 公共模块

1、导入依赖:

<dependency><groupId>com.zhengqing</groupId><artifactId>basic_util</artifactId><version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot 对 spring data es 的支持-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2、配置:

spring:data:elasticsearch:cluster-name: elasticsearchcluster-nodes: 127.0.0.1:9300  # 注:9200->图形界面端、9300->代码端

注: 这里暂时先将8010中的bootstrap.yml备份一份bootstrap_bak.yml 然后将github上的配置application-common-dev.yml 里面的内容拷贝到项目中bootstrap.yml本地里 !! -->原因:暂时只能拿到项目本地配置!

3、编写服务 - 接口层

① ProductDoc

@Document(indexName = "aigou",type = "product")
public class ProductDoc {@Idprivate Long id;private Long productTypeId;//类型idprivate Long brandId;//品牌idprivate Integer minPrice;//最小价格private Integer maxPrice;//最大价格private Integer saleCount;//销量private Integer onSaleTime;//上架时间private Integer commentCount;//评论总数private Integer viewCount;//浏览数@Field(type = FieldType.Keyword)List<String> images = new ArrayList<>();//图片@Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")private String all;//模糊查询所有字段 name、subName、brandName、productTypeName@Field(type = FieldType.Keyword)private String viewProperties;//显示属性@Field(type = FieldType.Keyword)private String skuProperties;//sku属性//getter/setter方法...
}

② feign/fallbackFactory

@FeignClient(value = "AIGOU-COMMON", fallbackFactory = ProductDocClientFallbackFactory.class)
@RequestMapping("/productDoc")
public interface ProductDocClient {//crud@RequestMapping(value = "/save",method = RequestMethod.POST)AjaxResult save(ProductDoc productDoc); //添加、修改@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)AjaxResult del(@PathVariable("id") Long id);  //删除@RequestMapping(value = "/{id}",method = RequestMethod.GET)ProductDoc get(@PathVariable("id") Long id); //获取一个//批量操作@RequestMapping(value = "/batchSave",method = RequestMethod.POST)AjaxResult batchSave(@RequestBody List<ProductDoc> productDocs); //批量添加@RequestMapping(value = "/batchDel",method = RequestMethod.DELETE)AjaxResult batchDel(@RequestBody List<Long> ids); //批量上传//分页搜索@RequestMapping(value = "/search",method = RequestMethod.GET)PageList<ProductDoc> search(Map<String,Object> params);  //搜索
}
@Component
public class ProductDocClientFallbackFactory implements FallbackFactory<ProductDocClient>{@Overridepublic ProductDocClient create(Throwable throwable) {return new ProductDocClient() {@Overridepublic AjaxResult save(ProductDoc productDoc) {return null;}@Overridepublic AjaxResult del(Long id) {return null;}@Overridepublic ProductDoc get(Long id) {return null;}@Overridepublic AjaxResult batchSave(List<ProductDoc> productDocs) {return null;}@Overridepublic AjaxResult batchDel(List<Long> ids) {return null;}@Overridepublic PageList<ProductDoc> search(Map<String, Object> params) {return null;}};}
}

4、编写服务层:

① repository

@Repository
public interface ProductDocRepository extends ElasticsearchRepository<ProductDoc,Long> {}

② service

public interface IProductDocService {void add(ProductDoc productDoc);//添加文档void del(Long id);//删除文档ProductDoc get(Long id);//获取文档void batchAdd(List<ProductDoc> productDocs);//批量添加文档void batchDel(List<Long> ids);//批量删除PageList<ProductDoc> search(Map<String, Object> params);//查询
}
@Service
public class ProductDocServiceImpl implements IProductDocService{@Autowiredprivate ProductDocRepository repository;@Overridepublic void add(ProductDoc productDoc) {repository.save(productDoc);}@Overridepublic void del(Long id) {repository.deleteById(id);}@Overridepublic ProductDoc get(Long id) {return  repository.findById(id).get();}@Overridepublic void batchAdd(List<ProductDoc> productDocs) {repository.saveAll(productDocs);}@Overridepublic void batchDel(List<Long> ids) {for (Long id : ids) {repository.deleteById(id);}}@Overridepublic PageList<ProductDoc> search(Map<String, Object> params) {return null;}
}

③ controller实现feign

@RestController
@RequestMapping("/productDoc")
public class ProductDocController implements ProductDocClient{@Autowiredprivate IProductDocService productDocService;//crud@RequestMapping(value = "/save",method = RequestMethod.POST)public AjaxResult save(ProductDoc productDoc){try {productDocService.add(productDoc);return AjaxResult.me();} catch (Exception e) {e.printStackTrace();return AjaxResult.me().setSuccess(false).setMessage("保存失败!"+e.getMessage());}}@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)public  AjaxResult del(@PathVariable("id") Long id){try {productDocService.del(id);return AjaxResult.me();} catch (Exception e) {e.printStackTrace();return AjaxResult.me().setSuccess(false).setMessage("删除失败!"+e.getMessage());}}@RequestMapping(value = "/{id}",method = RequestMethod.GET)public  ProductDoc get(@PathVariable("id") Long id){return productDocService.get(id);}//批量操作@RequestMapping(value = "/batchSave",method = RequestMethod.POST)public  AjaxResult batchSave(@RequestBody List<ProductDoc> productDocs){try {productDocService.batchAdd(productDocs);return AjaxResult.me();} catch (Exception e) {e.printStackTrace();return AjaxResult.me().setSuccess(false).setMessage("保存失败!"+e.getMessage());}}@RequestMapping(value = "/batchDel",method = RequestMethod.DELETE)public AjaxResult batchDel(@RequestBody List<Long> ids){try {productDocService.batchDel(ids);return AjaxResult.me();} catch (Exception e) {e.printStackTrace();return AjaxResult.me().setSuccess(false).setMessage("删除失败!"+e.getMessage());}}//分页搜索@RequestMapping(value = "/search",method = RequestMethod.GET)public PageList<ProductDoc> search(Map<String,Object> params){return productDocService.search(params);}
}

④ 创建索引,并且建立类型映射

@RunWith(SpringRunner.class)
@SpringBootTest(classes = CommonApplication_8010.class)
public class ProductDocInitTest {@Autowiredprivate ElasticsearchTemplate template;@Test  //创建索引,并且建立类型映射public void testInit() throws Exception {template.createIndex(ProductDoc.class); //创建索引template.putMapping(ProductDoc.class); //类型映射-自定义映射}
}

二、上下架处理

Product.java中修改:

public Long getOnSaleTime() {return onSaleTime;
}public void setOnSaleTime(Long onSaleTime) {this.onSaleTime = onSaleTime;
}


mapper:

void onSale(Map<String, Object> params);//上架
void offSale(Map<String, Object> params);//下架

mapper.xml: (注意collection里面是ids)

<update id="onSale" parameterType="map">UPDATE t_product set state = 1, onSaleTime = #{timeStamp} where id in<foreach collection="ids"  item="item" open="(" close=")" separator=",">#{item}</foreach>
</update>
<update id="offSale" parameterType="map">UPDATE t_product set state = 0, offSaleTime = #{timeStamp} where id in<foreach collection="ids"  item="item" open="(" close=")" separator=",">#{item}</foreach>
</update>

service:

void onSale(String ids, Integer onSale);//上下架处理
@Autowired
private BrandMapper brandMapper;
@Autowired
private ProductTypeMapper productTypeMapper;
@Autowired
private ProductDocClient productDocClient;@Override
public boolean updateById(Product entity) {//添加本表信息以外,还要存放关联表entity.setUpdateTime(new Date().getTime());productMapper.updateById(entity);//通过productId查询productExtWrapper<ProductExt> wrapper = new EntityWrapper<ProductExt>().eq("productId", entity.getId());ProductExt productExt = productExtMapper.selectList(wrapper).get(0);//把前台传递进来值设置给数据库查询出来值,并且把它修改进去ProductExt tmp = entity.getProductExt();if ( tmp!= null) {productExt.setDescription(tmp.getDescription());productExt.setRichContent(tmp.getRichContent());productExtMapper.updateById(productExt);}// 如果是上架状态,要同步修改es库if (entity.getState()==1){ProductDoc productDoc = product2productDoc(entity);productDocClient.save(productDoc);}return true;
}@Override
public boolean deleteById(Serializable id) {super.deleteById(id);//如果是上架状态,要同步删除es库Product product = productMapper.selectById(id);if (product.getState()==1){productDocClient.del(Long.valueOf(id.toString()));}return true;
}@Override
public void onSale(String ids, Integer onSale) {List<Long> idsLong = StrUtils.splitStr2LongArr(ids);if (1==onSale.intValue()){  //上架//数据库状态和上架时间要修改 id 时间Map<String,Object> params = new HashMap<>();params.put("ids", idsLong);params.put("timeStamp", new Date().getTime());productMapper.onSale(params);//添加esku// productDocClient.batchDel(Arrays.asList(idsLong));List<ProductDoc> productDocs = product2productDocs(idsLong);productDocClient.batchSave(productDocs);}else{ //下架//数据库状态和下架时间要修改Map<String,Object> params = new HashMap<>();params.put("ids", idsLong);params.put("timeStamp", new Date().getTime());productMapper.offSale(params);//删除eskuproductDocClient.batchDel(idsLong);}
}//转换多个
private List<ProductDoc> product2productDocs(List<Long> ids) {List<ProductDoc> productDocs = new ArrayList<>();for (Long id : ids) {Product product = productMapper.selectById(id);ProductDoc productDoc = product2productDoc(product);productDocs.add(productDoc);}return productDocs;
}// 转换一个
private ProductDoc product2productDoc(Product product) {//选中productDoc -》 alt+enter -》 快速生成set方法赋值ProductDoc productDoc = new ProductDoc();productDoc.setId(product.getId());productDoc.setProductTypeId(product.getProductTypeId());productDoc.setBrandId(product.getBrandId());//从某个商品sku中获取最大或最小List<Sku> skus = skuMapper.selectList(new EntityWrapper<Sku>().eq("productId", product.getId()));Integer minPrice  = skus.get(0).getPrice();Integer maxPrice  = skus.get(0).getPrice();for (Sku sku : skus) {if (sku.getPrice()<minPrice) minPrice=sku.getPrice();if (sku.getPrice()>maxPrice) maxPrice = sku.getPrice();}productDoc.setMinPrice(minPrice);productDoc.setMaxPrice(maxPrice);productDoc.setSaleCount(product.getSaleCount());productDoc.setOnSaleTime(product.getOnSaleTime().intValue());productDoc.setCommentCount(product.getCommentCount());productDoc.setViewCount(product.getViewCount());String medias = product.getMedias();if (StringUtils.isNotBlank(medias)) {productDoc.setImages(Arrays.asList(medias.split(",")));}Brand brand = brandMapper.selectById(product.getBrandId());ProductType productType = productTypeMapper.selectById(product.getProductTypeId());//投机-有空格就会分词String all = product.getName()+" "+product.getSubName()+" "+brand.getName()+" "+productType.getName();productDoc.setAll(all);productDoc.setViewProperties(product.getViewProperties());productDoc.setSkuProperties(product.getSkuTemplate());//设置值return productDoc;
}

controller:

@RequestMapping(value="/onSale",method= RequestMethod.POST)
public AjaxResult onSale(@RequestBody Map<String,Object> params){try {String ids = (String) params.get("ids");//1,2,3System.out.println(ids);Integer onSale = Integer.valueOf(params.get("onSale").toString());System.out.println(onSale);productService.onSale(ids,onSale);return AjaxResult.me();} catch (Exception e) {e.printStackTrace();return AjaxResult.me().setSuccess(false).setMessage("上下架失败!"+e.getMessage());}
}

三、列表页实现 - 跳转到列表页:

1、主页携带参数跳转到列表页.

location.href = list.html?keyword ==xx

location.href = list.html?productType==154

2、列表页,加载完毕后,获取传递过来keyword ,或者productType

keyword

​ ①回显搜索框

​ ②以keyword为搜索条件到es中查询分页数据,展示在界面

productType

​ ①发送获取面包屑请求,展示在界面

​ ②发送品牌请求获取品牌,展示在界面

​ ③以productType为搜索条件到es中查询分页数据,展示在界面

修改模板路径: (notepad++ 替换打开所有文件 - 具体见代码…)

前端代码部分略:见源码即可…

最后启动测试:




源码和文档: https://pan.baidu.com/s/1FkLU_KPsd79Qci611BK0BQ

【B2C-爱购物商城】 开发文档 day10相关推荐

  1. OpenJWeb网上商城开发文档及源代码

    OpenJWeb网上商城包括: 商品分类管理 商品管理 订单管理 充值 余额管理 前台商品展示 购物车管理 本系统为文化部外联局纪念品征订项目案例 因文档带图片和源代码,可到http://www.op ...

  2. 基于 SSM 的网上购物系统(源码 + 开发文档 已开源)

    你能做到的,比想像的更多.  一.项目背景 这个项目是自己从四月份开始学习 Spring + SpringMVC + MyBatis 后的一次项目实践,恰好赶上学校的数据库暑期课程实践,跟老师申请后更 ...

  3. M5(项目)-01-尚硅谷谷粒商城项目分布式基础篇开发文档

    M5(项目)-01-尚硅谷谷粒商城项目分布式基础篇开发文档 分布式基础篇 一.环境搭建 各种开发软件的安装 虚拟机: docker,mysql,redis 主机: Maven, idea(后端),Vs ...

  4. CRMEB开发文档及目录结构

    CRMEB 开发文档及目录结构 官网 CRMEB v2.6开源地址:http://link.crmeb.net/u/lingting 完整帮助文档:http://help.crmeb.net QQ群: ...

  5. 开发文档怎么编写_PoC 编写指南

    什么是 PoC PoC(全称: Proof of Concept), 中文译作概念验证.在安全界,你可以理解成为漏洞验证程序.和一些应用程序相比,PoC 是一段不完整的程序,仅仅是为了证明提出者的观点 ...

  6. WSTMart开发文档

    WSTMart开发文档页面 PC版 开源版 授权版 序言 WSTMart安装协议 WSTMart电商系统安装 商城前台安装操作指南 用户中心指南 商家中心操作指南 商城后台操作指南 插件说明 开发说明 ...

  7. 数据库字典 - 微擎开发文档

    数据库字典 - 微擎开发文档 参考文档 account 平台账号表(公众号.小程序.PC等) 字段名 数据类型 说明 acid int(10) 主键 uniacid int(10) 所属帐号uniac ...

  8. Android的开发文档规范

    Android的开发文档规范 我们项目的代码时间时间很长,经过太多人手,代码的规范性堪忧,目前存在较多的比较自由的「代码规范」,这非常不利于项目的维护,代码可读性也不够高. 分析现有项目的代码的情况, ...

  9. 微信支付(商户平台)卡券开发文档

    文章目录 简介 代金券 代金券分类 预充值代金券 免充值代金券 发券渠道 二维码发券 营销活动发券 高级API接口发券 核销方式 支付中自动核销券 操作指引 开发前准备 开通代金券权限 下载API证书 ...

最新文章

  1. MindSpore技术理解(下)
  2. 实现搜索框记录搜索历史_三个案例告诉你:“搜索框”该如何设计?
  3. 在react next 中使用rem_CSS中的rem:了解和使用rem单位
  4. 自己写一个最简单的bootloader_jz2440
  5. VTK:Utilities之TimerLog
  6. windows+caffe(三)——求取图片的均值
  7. oracle应收模块核销点不上,详解EBS接口开发之应收款处理
  8. 一个java类可以有_一个.java文件中可以有几个同级类?
  9. mvc源码解读(10)-ParameterDescriptor方法Action方法的参数描述对象
  10. MySQL 在指定位置新增字段
  11. 基于Visual C++2013拆解世界五百强面试题--题8-数组的排序和查找
  12. 思维导图与知识树/大纲/目录的区别是什么?
  13. 很多程序员编码时都戴耳机,到底在听什么?
  14. 【Astar寻路算法图解】Java实现
  15. 机器学习 - 随机森林 Random Forest
  16. React组件前端组件化开发
  17. 国嵌,够欠!---ARM在线教育误区
  18. n1_N1考试非常难考过吗?
  19. STM32—TIM3输出PWM信号驱动MG996R舵机(按键控制)
  20. 【论文笔记】Remote Sensing Image Change Detection with Transformers

热门文章

  1. 网络游戏开发-进行设计
  2. 找不到vcomp120.dll,无法继续执行代码
  3. 盖尔金圆定理及严格对角占优矩阵(SDD) 1
  4. 并联型APF/有源电力滤波器/Matlab/Simulink仿真 dq/FBD谐波/无功检测
  5. plink源码_plink源码_plink参数说明
  6. 贵金属行情软件手机版哪个好
  7. Keras使用Leaky_Relu等高级激活函数
  8. 兰州大学计算机一志愿上线,某211专业一志愿无一人过线!这两所名校调剂系统仅开放1天!兰大发布预调剂考生名单!...
  9. Element UI结合vue-cropper打造图片裁剪上传组件
  10. win10没有声音的问题