当前位置: 首页 > news >正文

谷粒商城实战笔记-75-商品服务-API-品牌管理-品牌分类关联与级联更新

文章目录

  • 一,引入Mybatis Plus分页插件
  • 二,品牌列表的模糊查询
  • 三,增加品牌测试数据
  • 四,开发后台品牌关联分类接口
    • 1,接口product/categorybrandrelation/catelog/list
    • 2,接口product/categorybrandrelation/save
  • 前端丢失Long类型精度问题

一,引入Mybatis Plus分页插件

基于代码生成工具生成的代码,有最基本的增删改查功能,但有很多功能待完善。

打开品牌管理界面,页面底部的分页就有问题,后端没有返回正确的分页数据。

在product模块下增加MybatisPlus分页配置。

在这里插入图片描述

@Configuration
@EnableTransactionManagement //开启事务
@MapperScan("com.atguigu.gulimall.product.dao")
public class MyBatisConfig {//引入分页插件@Beanpublic PaginationInterceptor paginationInterceptor() {PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认falsepaginationInterceptor.setOverflow(true);// 设置最大单页限制数量,默认 500 条,-1 不受限制paginationInterceptor.setLimit(1000);return paginationInterceptor;}
}

二,品牌列表的模糊查询

@Overridepublic PageUtils queryPage(Map<String, Object> params) {//1、获取keyString key = (String) params.get("key");QueryWrapper<BrandEntity> queryWrapper = new QueryWrapper<>();if(StrUtil.isNotEmpty(key)){queryWrapper.eq("brand_id",key).or().like("name",key);}IPage<BrandEntity> page = this.page(new Query<BrandEntity>().getPage(params),queryWrapper);return new PageUtils(page);}

三,增加品牌测试数据

把之前的品牌数据删除,新增4条数据。

在这里插入图片描述

四,开发后台品牌关联分类接口

前端已经开发后,直接copy代码即可。

用课程资料中的文件替换掉工程中下图两个文件夹中的所有内容。

在这里插入图片描述

1,接口product/categorybrandrelation/catelog/list

这个接口的功能是根据brandId查询其关联的所有分类,结果用于在列表中展示。

在这里插入图片描述

接口代码如下。

	@RequestMapping("catelog/list")public R list(@RequestParam Map<String, Object> params){List<CategoryBrandRelationEntity> list = categoryBrandRelationService.list(new QueryWrapper<CategoryBrandRelationEntity>().eq("brand_id", params.get("brandId")));return R.ok().put("data", list);}

在这里插入图片描述

2,接口product/categorybrandrelation/save

这个接口用来保存品牌和分类的关系。

	@RequestMapping("/save")public R save(@RequestBody CategoryBrandRelationEntity categoryBrandRelation){categoryBrandRelationService.saveDetail(categoryBrandRelation);return R.ok();}

接口调用CategoryBrandRelationService的新方法saveDetail,具体实现如下。

@Overridepublic void saveDetail(CategoryBrandRelationEntity categoryBrandRelation) {Long brandId = categoryBrandRelation.getBrandId();Long catelogId = categoryBrandRelation.getCatelogId();//1、查询详细名字BrandEntity brandEntity = brandDao.selectById(brandId);CategoryEntity categoryEntity = categoryDao.selectById(catelogId);categoryBrandRelation.setBrandName(brandEntity.getName());categoryBrandRelation.setCatelogName(categoryEntity.getName());this.save(categoryBrandRelation);}

在这里,我们冗余了分类和品牌的名称,为的查询时不用管理品牌表和分类表就能查询到品牌名称和分类名称。这是一种在实际工作中常用的性能优化手段,查询时尽量避免表的join。

当然,这样做也是有风险的,如果品牌表的品牌名称更新,但关联表的品牌名称没有及时可惜,就会出现数据不一致。

针对这个问题,可以采取一些手段来保持数据的一致性。比如在分类和品牌的更新接口中,增加更新关联表的冗余字段的逻辑。

品牌更新:
在这里插入图片描述

分类更新:
在这里插入图片描述

前端丢失Long类型精度问题

在这里插入图片描述

开发商城管理系统的品牌管理界面时,发现一个问题,接口返回品牌Id和页面展示的品牌Id不一致,如接口返回的是1816714744603811841,前端展示的是1816714744603811800

前端出现Long类型的精度丢失。

精度丢失的具体原因:

JavaScript的Number类型用于表示浮点数,它遵循IEEE 754标准中的64位浮点数格式。这意味着它能够准确表示从(-2{53})到(2{53}-1)之间的所有整数。超出这个范围的整数值在转换为Number类型时可能会发生精度丢失,即原本不同的长整数会被转换成相同的浮点数值,从而导致数据失真。

解决办法:

后端将Long类型转换为String类型。

为此,后端可以增加一个全局配置,在序列化时完成这个任务。

在这里插入图片描述

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;@Configuration
public class JacksonConfig {@Bean@Primary@ConditionalOnMissingBean(ObjectMapper.class)public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {ObjectMapper objectMapper = builder.createXmlMapper(false).build();SimpleModule simpleModule = new SimpleModule();// 将Long类型序列化为String类型simpleModule.addSerializer(Long.class, ToStringSerializer.instance);objectMapper.registerModule(simpleModule);return objectMapper;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 微信小程序云开发订单微信支付与小票和标签打印的完整高效流程
  • 【C# 】Pipe管道通信使用
  • Java实现数据库图片上传(包含从数据库拿图片传递前端渲染)-图文详解
  • SSRF-labs-master靶场
  • FFmpeg研究
  • ai智能写作软件哪个好?高效写作少不了这5个
  • 大数据——Hive原理
  • mysql 数据库空间统计sql
  • 一条命令安装mysql,php
  • C++——从前序与中序遍历序列构造二叉树leetcode105
  • 网络安全管理制度
  • java算法day27
  • Android13 控制设置界面 双栏显示或单栏显示
  • go语言day18 reflect反射
  • 数仓建模:DWS层该如何建设?如何设计通用数据模型?
  • 「译」Node.js Streams 基础
  • ES10 特性的完整指南
  • Github访问慢解决办法
  • JS函数式编程 数组部分风格 ES6版
  • Laravel Telescope:优雅的应用调试工具
  • magento2项目上线注意事项
  • 电商搜索引擎的架构设计和性能优化
  • 记一次和乔布斯合作最难忘的经历
  • 技术胖1-4季视频复习— (看视频笔记)
  • 京东美团研发面经
  • 利用jquery编写加法运算验证码
  • 全栈开发——Linux
  • 算法之不定期更新(一)(2018-04-12)
  •  一套莫尔斯电报听写、翻译系统
  • 应用生命周期终极 DevOps 工具包
  • 用jquery写贪吃蛇
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 选择阿里云数据库HBase版十大理由
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • #pragma data_seg 共享数据区(转)
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • %@ page import=%的用法
  • (1) caustics\
  • (4) PIVOT 和 UPIVOT 的使用
  • (接口自动化)Python3操作MySQL数据库
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (数据结构)顺序表的定义
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)SpringBoot3---尚硅谷总结
  • (转)四层和七层负载均衡的区别
  • .NET 4.0中的泛型协变和反变
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net wcf memory gates checking failed
  • .net 发送邮件
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池