电商微服务项目第一天(品牌管理)

1.BaseTrademarkController(品牌管理CRUD)

 /*** 添加品牌* @param baseTrademark* @return*/@PostMapping("baseTrademark/save")public Result<BaseTrademark> save(@RequestBody BaseTrademark baseTrademark){baseTrademarkService.save(baseTrademark);return Result.ok();}
    /*** 品牌的主键查询* 请求参数品牌主键ID*/@GetMapping("baseTrademark/get/{id}")@Operation(summary = "品牌主键查询")public Result<BaseTrademark> findById(@PathVariable("id")Long id){BaseTrademark baseTrademark = baseTrademarkService.getById(id);return Result.ok(baseTrademark);}
    /*** 修改品牌数据* 请求参数Json*/@Operation(summary = "修改品牌")@PutMapping("baseTrademark/update")public Result<BaseTrademark> update (@RequestBody BaseTrademark baseTrademark){baseTrademarkService.updateById(baseTrademark);return Result.ok();}
    /*** 删除品牌数据* 请求参数,品牌的主键*/@Operation(summary = "删除品牌")@DeleteMapping("baseTrademark/remove/{id}")public Result<BaseTrademark> deleteById(@PathVariable("id") Long spuId){//不能直接被删除,调业务层逻辑功能baseTrademarkService.deleteById(spuId);return Result.ok();}
  @Overridepublic void deleteById(Long spuId) {Long count= spuInfoMapper.selectCount(new QueryWrapper<SpuInfo>().eq("tm_id",spuId));System.out.println("count = " + count);//查询到总条数大于0,不能删除if (count > 0){//SpringMVC,全局的异常处理,抛出自定义的异常throw new  MallException(ResultCodeEnum.REF_SPU_ERROR.getMessage(),ResultCodeEnum.REF_SPU_ERROR.getCode());}else {this.removeById(spuId);}}

后端程序产生异常以后,前端直接显示’已取消删除‘提示信息不友好

自定义异常

@Data
public class MallException extends RuntimeException{/*** 定义异常中的参数* 状态码,异常的消息*/private String message;private Integer code;public MallException(){}public MallException(String message, Integer code) {this.message = message;this.code = code;}
}

自定义全局异常处理器

/*** 全局的异常处理器* 捕获异常:@RestControllerAdvice注解的类可以捕获整个应用程序中抛出的异常。* 任何异常都由这个类处理*/
@RestControllerAdvice
public class GlobalExceptionHandler {/*** ExceptionHandler注解,捕获异常* @param e* @return*/@ExceptionHandler(value = MallException.class)public Result<Object> mallExceptionHandler(MallException e) {Result<Object> result = new Result<>();result.setCode(e.getCode());result.setMessage(e.getMessage());System.out.println("result = " + result);return result;}
}

SPU = Standard Product Unit (标准化产品单元), SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一

个产品的特性。通俗点讲就是泛指一类商品,这种商品具有相同的属性。

举例:

iPhone 16
小米15s
Thinkpad 笔记本

SPU是定位到产品的概念,但它和产品细节无关。但实际上,我们在购买商品的时候,单凭SPU是不够的,还需要更多的信息来精确到可购买单元。

SKU = stock keeping unit(库存量单位) SKU即库存进出计量的单位(买家购买、商家进货、供应商备货、工厂生产都是依据SKU进行的)。是和具体的属性值有直

接的关联关系。SKU是物理上不可分割的最小存货单元。也就是说一款商品,可以根据SKU来确定具体的货物存量。

常见电商网站商品详情展示方式:

1、天猫:以spu展示

2、京东:以sku展示

不使用主外键,所以用spu和sku来确定能不能删除,当spu对应的有sku时,便不能删除

2.分页查询

  /*** pageInfo* @param pageNumber* @param pageSize* @return*/@GetMapping("baseTrademark/{page}/{limit}")public Result<Page<BaseTrademark>> findTrademarkByPage(@PathVariable("page") Integer pageNumber, @PathVariable("limit") Integer pageSize){Page<BaseTrademark> page = baseTrademarkService.findTrademarkByPage(pageNumber,pageSize);System.out.println(page);return Result.ok(page);}
    @Overridepublic Page<BaseTrademark> findTrademarkByPage(Integer pageNumber, Integer pageSize) {Page<BaseTrademark> baseTrademarkpage = new Page<>(pageNumber,pageSize);return page(baseTrademarkpage);}

具体使用是调用IService<T>的page方法

    default <E extends IPage<T>> E page(E page) {return this.page(page, Wrappers.emptyWrapper());}

3 Minio

 <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.13</version>
</dependency>

测试用例:

public class MinioFileUploadTest {public static void main(String[] args) {//1.创建Minio客户端对象MinioClient minioClient = MinioClient.builder().endpoint("http://192.168.157.128:9000").credentials("admin","admin123456").build();//2.判断是否存在try {boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("mall").build());if (!bucketExists){minioClient.makeBucket(MakeBucketArgs.builder().bucket("mall").build());}//3.上传文件FileInputStream fileInputStream = new FileInputStream("D:\\Apic\\1345360.png");minioClient.putObject(PutObjectArgs.builder().bucket("mall").object("1345360.png").stream(fileInputStream, fileInputStream.available(), -1).build());//4.获取访问地址String fileUrl = "http://192.168.157.128:9000/mall/1345360.png" ;System.out.println(fileUrl);} catch (ErrorResponseException e) {throw new RuntimeException(e);} catch (InsufficientDataException e) {throw new RuntimeException(e);} catch (InternalException e) {throw new RuntimeException(e);} catch (InvalidKeyException e) {throw new RuntimeException(e);} catch (InvalidResponseException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);} catch (ServerException e) {throw new RuntimeException(e);} catch (XmlParserException e) {throw new RuntimeException(e);}}

优化用例:

1.使用配置文件配置静态资源例如minio的地址,账号密码等

2.书写config,MinioClient用来判断是否有对应的桶,MinioProperty用来读取配置文件,配置文件写在启动类;

3.书写将文件上传代码解耦并抽出,增加复用性。

#minio连接配置
minio:url: http://192.168.157.128:9000accessKey: adminsecretKey: admin123456bucket: mall
@Data
@Configuration
public class MinioProperty {@Value("${minio.url}")private String url;@Value("${minio.accessKey}")private String accessKey;@Value("${minio.secretKey}")private String secretKey;@Value("${minio.bucket}")private String bucket;
}
@Configuration
public class MinioConfig {@AutowiredMinioProperty minioProperty;@Beanpublic MinioClient minioClient()throws Exception{//1.创建Minio客户端对象MinioClient minioClient = MinioClient.builder().endpoint(minioProperty.getUrl()).credentials(minioProperty.getAccessKey(), minioProperty.getSecretKey()).build();//2.判断Minio服务器中,是否存在桶,如果不存在,创建,方法bucketExists判断//方法的参数 BucketExistsArgs类型,返回true,有这个桶boolean bucketExists;BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder().bucket(minioProperty.getBucket()).build();MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(minioProperty.getBucket()).build();if (!minioClient.bucketExists(bucketExistsArgs)){minioClient.makeBucket(makeBucketArgs);}return minioClient;}
}
以上代码关键就是BucketExistsArgs、MakeBucketArgs来判断桶存在和创建桶
@Bean可以将方法注入其他类进行调用;
@Component
public class FileUploadUtil {@Autowiredprivate MinioClient minioClient;@Autowiredprivate MinioProperty minioProperty;/*** 返回上传后的文件地址* 方法的参数,SpringMVC的上传对象*/public String fileUpload(MultipartFile multipartFile)throws Exception{//定义新的上传的文件名String originalFilename = multipartFile.getOriginalFilename();//上传的原始文件名//获取文件的后缀名String extension = FilenameUtils.getExtension(originalFilename);String fileName = UUID.randomUUID().toString().replace("-","")+"."+extension;//获取文件上传的字节输入流InputStream inputStream = multipartFile.getInputStream();//调用方法上传PutObjectArgs putObjectArgs = PutObjectArgs.builder().bucket(minioProperty.getBucket()).object(fileName).stream(inputStream, inputStream.available(), -1).build();minioClient.putObject(putObjectArgs);//向controller返回文件的地址return minioProperty.getUrl()+"/"+minioProperty.getBucket()+"/"+fileName;}
}
    /*** 实现文件的上传* 定义上传文件接口* multipartFile 接口名字必须和上传组件的name对应*/@PostMapping("fileUpload")public Result fileUpload(@RequestParam("file") MultipartFile multipartFile){System.out.println(multipartFile);String filename=baseTrademarkService.fileUpload(multipartFile);return Result.ok(filename);}

4.Swagger

<!--swagger-->
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.1.0</version>
</dependency>

代替postman的在线请求发送,一般对controller层使用,所以放在services的pom里面


/*** 一级分类的请求响应*/
//@CrossOrigin
@Tag(name = "一级分类管理")
@RestController
@RequestMapping("/admin/product")
public class BaseCategory1Controller {//注入业务层@Autowiredprivate BaseCategory1Service baseCategory1Service;/*** 查询方法,查询所有的一级分类*/@GetMapping("/getCategory1")@Operation(description = "查询所有的一级分类")public Result<List<BaseCategory1>> findAll(){List<BaseCategory1> baseCategory1List = baseCategory1Service.list();return Result.ok(baseCategory1List);}
}

swagger的描述要在后端书写

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19547.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

初探Ranking系统的离在线满意度评估

【引子】在上周发布了《大模型应用系列&#xff1a;从Ranking到Reranking》之后&#xff0c; 有AI 产品经理问我&#xff0c;如何评估Ranking 系统的性能呢&#xff1f; 再进一步&#xff0c;如何评估RAG系统的性能呢&#xff1f; 老码农整理了一下在搜索引擎方面的感受&#x…

初识C++ (五)

没事干就学习 auto关键字 auto是C程序设计语言的关键字。自C11以来&#xff0c;auto关键字用于两种情况&#xff1a;声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。C98标准中auto关键字用于自动变量的声明&#xff0c;但由于使用极少且多余…

shell脚本判断nginx安装和运行

shell脚本判断nginx安装和运行 脚本内容&#xff1a; 传入服务名称&#xff1a; read -p "请输入要判断的程序名称:" service_name 查看服务进程&#xff1a; countps -aux | grep -cw $service_name 判断nginx是否安装&#xff08;系统中是否有nginx命令&#xff…

电脑msvcr100.dll丢失的解决方法,详细介绍多个解决方法

由于系统中关键文件msvcr100.dll的缺失&#xff0c;用户可能会遭遇一系列始料未及的困扰与问题。msvcr100.dll是Microsoft Visual C运行库中的一个核心动态链接库文件&#xff0c;对于许多应用程序的正常运行至关重要。当这个特定的dll文件丢失时&#xff0c;可能会导致部分软件…

Windows安装vcpkg教程(VS2022)

内容摘要&#xff1a; 本文详细介绍如何在Windows系统上使用 Git 克隆 vcpkg 仓库来安装vcpkg工具&#xff0c;并链接Visual Studio 2022。 目录 一、关于vcpkg 二、开发环境 三、安装Git 四、使用 Git 克隆 vcpkg 仓库 一、关于vcpkg vcpkg 是一个开源的 C 包管理工具&am…

TypeScript泛型基础知识

1.1 泛型 泛型是可以在保证类型安全的前提下&#xff0c;让函数等与多种类型一起工作&#xff0c;从而实现复用&#xff0c;常用于&#xff1a;函数、接口、class中。 需求&#xff1a;创建一个id函数&#xff0c;传入什么数据就返回该数据本身&#xff08;也就是说&#xff0c…

多线程的安全问题

什么是线程安全问题&#xff1f; 多个线程&#xff0c;访问同一资源&#xff0c;出现了问题&#xff0c;就是线程安全问题&#xff08;数据不准确&#xff0c;或者直接报错&#xff09; 1&#xff09;错误演示&#xff1a; public class Demo04 {static int tickedNum 100;/…

推荐一套相片复原工具:Focus Magic

Focus Magic是一套相片复原工具&#xff0c;能够帮助你修补及强化那些模糊不清楚的影像。其他那些锐利化工具只能够修补那些只有一点模糊的相片&#xff0c;但有了Focus Magic你就可以把那些根本完全没对准焦距的相片重新对准焦距。程序还可以以插件的形式作为其他图形处理工具…

C++:类的继承

在C中&#xff0c;类的继承是一种面向对象编程&#xff08;OOP&#xff09;的重要特性&#xff0c;它允许一个类&#xff08;子类或派生类&#xff09;继承另一个类&#xff08;基类或父类&#xff09;的属性和方法。通过继承&#xff0c;可以重用现有的代码&#xff0c;减少重…

详细解读Gson 、Jackson 、FastJson 三大json序列化工具

一 gson Google提供的用来java对象和JSON数据之间进行映射的JAVA类库 优缺点 优点&#xff1a;快速、高效&#xff0c; 依赖少只有一个jar包&#xff0c;面向对象&#xff0c;数据传输解析方便 缺点&#xff1a;速度较慢 mvn依赖 <dependency><groupId>com.go…

版块控制---git

引入 设想&#xff0c;当我们写论文时&#xff0c;对第一版不够满意时&#xff0c;想做出修改但是又怕修改时回毁掉整个论文版本&#xff0c;所以我们通常会进行备份&#xff0c;以防止数据被修改后的崩毁&#xff0c;版块控制就是这个合理创建管理备份的过程&#xff0c;而且这…

BLE 蓝牙客户端和服务器连接

蓝牙通信在设计小型智能设备时非常普遍&#xff0c;之前一直没有使用过&#xff0c;最近使用ardunio ESP32 做了一些实验&#xff0c;做了一个收听播客的智能旋钮&#xff08;Smart Knob&#xff09;&#xff0c;它带有一个旋转编码器和两个按键。 本文介绍BLE 服务器Server和W…

图(Graph)的概念和遍历

目录 定义 相关概念 无向图&#xff08;Undirected graphs) 有向图&#xff08;Directed graphs&#xff09; 完全图 稀疏图 稠密图 权&#xff08;Weight&#xff09; 网&#xff08;Network&#xff09; 子图&#xff08;Subgraph&#xff09; 图的顶点与边间关系 …

python成长技能之正则表达式

文章目录 一、认识正则表达式二、使用正则表达式匹配单一字符三、正则表达式之重复出现数量匹配四、使用正则表达式匹配字符集五、正则表达式之边界匹配六、正则表达式之组七、正则表达式之贪婪与非贪婪 一、认识正则表达式 什么是正则表达式 正则表达式&#xff08;英语&…

Unity图形学之RenderQueue

1.指定物体的渲染顺序 Tags { “Queue” “XXXX” } 取值类型&#xff1a; Background&#xff1a; 对应数值为 1000&#xff0c;用于需要被最先渲染的对象&#xff0c;。 Geometry&#xff1a; 对应数值为 2000, 用于不透明的物体。这个是默认的选项&#xff08;如果不指明…

i春秋-破译(凯撒密码+数字替换单词中的字母)

练习平台地址 竞赛中心 题目描述 题目内容 就是破译&#xff01;&#xff01;&#xff01; 解题 观察到最后一段是四个字母加上{xxxxx}的形式&#xff0c;很像flag&#xff0c;我们猜测要破译的主要是这个片段 大括号依然存在&#xff0c;那么可能是通过凯撒密码来加密的&a…

丹摩征文活动|平台评测与使用体验报告

一、基本信息 目标产品 丹摩智算平台www.damodel.com 体验设备 台式机 体验系统/环境 Windows 10/浏览器 体验时间 2024/11 二、产品信息 产品类型&#xff1a;云计算服务提供商 产品定位&#xff1a;提供AI开发和算力GPU租赁服务的平台。它旨在简化AI开发流程&#…

Stable Diffusion核心网络结构——CLIP Text Encoder

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…

20241118给荣品PRO-RK3566开发板刷Rockchip原厂的buildroot后使用iperf3打流

20241118给荣品PRO-RK3566开发板刷Rockchip原厂的buildroot后使用iperf3打流 2024/11/18 16:38 缘起&#xff0c;使用荣品的DTS。 Y:\RK3566_RK3568_Linux5.10_V1.2.0\device\rockchip\.chips\rk3566_rk3568\rockchip_rk3566_evb2_lp4x_v10_defconfig 1、指定RK_KERNEL_DTS_NAM…

基于java+SpringBoot+Vue的基于web的智慧社区设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…