谷粒商城【成神路】-【5】——品牌管理【上】

目录

🧈1.新建品牌分类

🥞2.导入前端代码 

🧂3.页面优化 

🥓4.阿里云开通oss 

🌭5.文件上传 

🥚6.表单后端校验 JSR303


1.新建品牌分类

在renren-fast客户端中,创建二级菜单,注意菜单的路由

2.导入前端代码 

  • 在使用逆向生成工具的时候,已经将前端代码生成直接放入到product目录下即可

3.页面优化 

  • 在导入代码后,对页面进行优化,如显示状态,利用elementUI;代码全部放到文章最后

4.阿里云开通oss 

  • 登录阿里云,开通oss对象存储,让log的地址存储到阿里云上

5.文件上传 

使用spring cloud Alibaba-oss,并将其创建第三方模块

参考官方文档:spring cloudAlibaba-oss

  • 1.导入依赖

spring boot和cloud的版本不要过高

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alicloud-oss</artifactId></dependency>
  • 2.在配置文件中添加配置

1.将其注册到服务中心

2.配置中心
3.微服务名称

4.端口号

spring:cloud:nacos:discovery:server-addr: 192.168.20.50:1111config:server-addr: 192.168.20.50:1111namespace: 75307413-52f9-4045-8d34-abaceeced6dealicloud:access-key: =====8DK3oQbqru1Zsyjezysecret-key: =====zNIZTc4QjUxEMY78ZyWCbkrIYoss:endpoint: =====beijing.aliyuncs.combucket: hqdmdxz-gulimallapplication:name: gulimall-third-partyserver:port: 30000
  • 3.设置 子账户以及读权限

  •  4.编写controller
@RestController
public class OssController {@AutowiredOSS ossClient;@Value("${spring.cloud.alicloud.oss.endpoint}")private String endpoint;@Value("${spring.cloud.alicloud.oss.bucket}")private String bucket;@Value("${spring.cloud.alicloud.access-key}")private String accessId;@RequestMapping("/oss/policy")public R policy() {//https://hqdmdxz-gulimall.oss-cn-beijing.aliyuncs.com/hahaha.jpgString host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint// callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
//        String callbackUrl = "http://88.88.88.88:8888";String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());String dir = format + "/"; // 用户上传文件时指定的前缀。Map<String, String> respMap = null;try {long expireTime = 30;long expireEndTime = System.currentTimeMillis() + expireTime * 1000;Date expiration = new Date(expireEndTime);PolicyConditions policyConds = new PolicyConditions();policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);byte[] binaryData = postPolicy.getBytes("utf-8");String encodedPolicy = BinaryUtil.toBase64String(binaryData);String postSignature = ossClient.calculatePostSignature(postPolicy);respMap = new LinkedHashMap<String, String>();respMap.put("accessid", accessId);respMap.put("policy", encodedPolicy);respMap.put("signature", postSignature);respMap.put("dir", dir);respMap.put("host", host);respMap.put("expire", String.valueOf(expireEndTime / 1000));// respMap.put("expire", formatISO8601Date(expiration));} catch (Exception e) {// Assert.fail(e.getMessage());System.out.println(e.getMessage());}return R.ok().put("data",respMap);}
}
  • 5.解决阿里云跨域

在阿里云上设置跨域设置,允许所有post请求

6.表单后端校验 JSR303

  • 1.添加校验注解,所有包javax.validation.constraints 

  • 2.开启校验注解@Valid 

  •  3.给校验的bean后紧跟BindingResult,就可以获取到校验的结果
@RequestMapping("/save")//@RequiresPermissions("product:brand:save")public R save(@Valid @RequestBody BrandEntity brand, BindingResult result) {if (result.hasErrors()) {Map<String,String> map=new HashMap<>();//1.获取校验的结果result.getFieldErrors().forEach((item)->{//2.获取的错误提示String message = item.getDefaultMessage();//3.获取错误的属性的名字String field = item.getField();map.put(field,message);});return R.error(400,"提交的数据不合法").put("data",map);} else {brandService.save(brand);}return R.ok();}
  • 4..使用postman测试 

  • 5.统一异常处理 @ControllerAdvice

上面的单个返回异常会反复操作,我们不使用BindingResult,而是使用一个类封装所有异常信息,当校验出现错误时,直接去异常嘞找即可。

  • @ControllerAdvice注解是一个全局异常处理器,用于处理控制器层(Controller层)的异常。
@Slf4j
//RestControllerAdvice=@ControllerAdvice+@ResponseBody
@RestControllerAdvice(basePackages = "com.xz.gulimall.product.controller")
public class GuLiMallExceptionControllerAdvice {//精确匹配@ExceptionHandler(value = MethodArgumentNotValidException.class)public R handleVaildException(MethodArgumentNotValidException e) {log.error("数据校验出现问题{},异常类型{}", e.getMessage(), e.getClass());BindingResult result = e.getBindingResult();Map<String, String> map = new HashMap<>();result.getFieldErrors().forEach((fieldError) -> {map.put(fieldError.getField(), fieldError.getDefaultMessage());});return R.error(BizCodeEnume.VALD_EXCEPTION.getCode(), BizCodeEnume.VALD_EXCEPTION.getMsg()).put("data", map);}//兜底异常处理@ExceptionHandler(value = Throwable.class)public R handleException(Throwable throwable) {return R.error(BizCodeEnume.UNKONW_EXCEPTION.getCode(),BizCodeEnume.UNKONW_EXCEPTION.getMsg());}
}

 在之后,我们所有的异常直接抛出,全都用异常类处理,这也产生一个问题,就是状态码不统一,如何使用不同的状态码》》》》我们在公共模块封装一个状态码枚举

/*** 定义系统状态码*/
public enum BizCodeEnume {UNKONW_EXCEPTION(10000, "系统未知异常"),VALD_EXCEPTION(10001,"参数格式校验失败");private Integer code;private String msg;BizCodeEnume(Integer code, String msg) {this.code = code;this.msg = msg;}public Integer getCode() {return code;}public String getMsg() {return msg;}
}

之后直接待用枚举中相对应的状态码和异常信息即可~ 

  • 6.分组校验

1.给校验注解标注什么时候开始校验 

2.使用@ValidDated,标记校验分组

注:不添加分组校验,添加的校验功能注解是不生效的

 @RequestMapping("/save")//@RequiresPermissions("product:brand:save")public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand /*,BindingResult result*/) {brandService.save(brand);return R.ok();}
  • 7.自定义校验注解 

1.编写一个自定义的校验注解,并创建配置文件

@Documented
@Constraint(validatedBy = {ListValueConstrainValidator.class//自定义校验器,与注解产生关联}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {String message() default "{com.xz.common.vaild.ListValue.message}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};int[] vals() default {};
}

2.自定义校验器

public class ListValueConstrainValidator implements ConstraintValidator<ListValue,Integer> {private Set<Integer> set=new HashSet<>();//初始化方法@Overridepublic void initialize(ListValue constraintAnnotation) {int[] vals = constraintAnnotation.vals();for (int val: vals){set.add(val);}}//判断是否校验成功/**** @param value : 需要校验的值* @param context* @return*/@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {return set.contains(value);}
}

3.校验注解与校验器产生关系,在注解中添加校验器类

​​​

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麒麟信安服务器操作系统荣获 “2023年湖南省软件和信息技术服务业名品”

12月22日&#xff0c;由中国软件行业协会、湖南省工业和信息化厅指导&#xff0c;湖南省软件行业协会、长沙市雨花区政府主办的2023年第五届湖南省软件产业高质量发展大会暨湖南省软件行业协会年会召开。会上隆重揭晓了“2023年湖南软件行业知名软件产品和服务”奖项&#xff0…

电商推荐系统

此篇博客主要记录一下商品推荐系统的主要实现过程。 一、获取用户对商品的偏好值 代码实现 package zb.grms;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.Doub…

JAVA代理模式详解

代理模式 1 代理模式介绍 在软件开发中,由于一些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为"代理"的第三者来实现间接访问.该方案对应的设计模式被称为代理模式. 代理模式(Proxy Design Pattern ) 原始定义是&#xff1a;让你能够提供对象的替代…

LEETCODE 75. 颜色分类

class Solution { public:void sortColors(vector<int>& nums) {//先定0int i,j;i0;j0;int nnums.size();while(j<n){if(nums[j]0){int tmpnums[j];nums[j]nums[i];nums[i]tmp;j1;i1;}else{j1;}}//对[i,n]处理&#xff0c;定1int i1i;ji1;while(j<n){if(nums[j…

全新 鸿蒙系统

一&#xff0c; 开发框架 基础 二&#xff0c; 官网地址 文档开发&#xff1a;华为HarmonyOS智能终端操作系统官网 | 应用设备分布式开发者生态 三&#xff0c;基础了解 鸿蒙系统是基于 js 和 ts 衍生出来的一个东西 要学 arkts 就要学习 js 和 ts 语法 四&#xff0c…

计算机毕业设计 | SSM 校园线上订餐系统(附源码)

1&#xff0c; 概述 1.1 项目背景 传统的外卖方式就是打电话预定&#xff0c;然而&#xff0c;在这种方式中&#xff0c;顾客往往通过餐厅散发的传单来获取餐厅的相关信息&#xff0c;通过电话来传达自己的订单信息&#xff0c;餐厅方面通过电话接受订单后&#xff0c;一般通…

哪种安全数据交换系统,可以满足信创环境要求?

安全数据交换系统是一种专门设计用于在不同网络环境之间安全传输数据的技术解决方案。这类系统确保数据在传输过程中的完整性、机密性和可用性&#xff0c;同时遵守相关的数据保护法规和行业标准。 使用安全数据交换系统的原因主要包括以下几点&#xff1a; 1、数据保护&#…

Jmeter接口自动化测试 —— Jmeter断言之Json断言

json断言可以让我们很快的定位到响应数据中的某一字段&#xff0c;当然前提是响应数据是json格式的&#xff0c;所以如果响应数据为json格式的话&#xff0c;使用json断言还是相当方便的。 还是以之前的接口举例 Url: https://data.cma.cn/weatherGis/web/weather/weatherFcst…

linux中的mtime,ctime,atime

目录 结论 文件 touch新文件 调整文件内容 echo直接修改 vi修改 修改文件属性 调整归属 调整权限 读取文件 目录 增加文件 调整目录下文件属性 访问目录下文件 删除文件 结论 mtime&#xff1a;文件内容的修改时间&#xff08;不含权限、属组修改&#xff09; …

mobi, azw, azw3, epub格式有什么区别

mobi, azw, azw3, epub格式有什么区别 对复杂排版的支持上是azw3好。 对使用方便来说是mobi好&#xff0c;因为可以邮件推送。 刚接触Kindle的小伙伴经常会被mobi、azw、azw3、epub等常见的几个格式搞的很凌乱&#xff0c;它们都有哪些区别呢&#xff1f;又各有什么优缺点呢&am…

C++泛编程(4)

类模板高级&#xff08;1&#xff09; 1.类模板具体化部分具体化完全具体化 2.类模板与继承 1.类模板具体化 有了函数模板具体化的基础&#xff0c;学习类模板的具体化很简单。类模板具体化有两种方式&#xff0c;分别为部分具体化和完全具体化。假如有类模板&#xff1a; te…

户用光伏电站设计优化方案:为行业打造示范标杆

不可再生能源的日益消耗促使了大家对新能源的使用和推广&#xff0c;光伏发电已经成为国家和企业大力推崇的技术。其中&#xff0c;户用光伏发电是重要组成部分&#xff0c;有非常大的市场发展空间。然而&#xff0c;如何优化设计&#xff0c;提高效率&#xff0c;降低成本&…

【Iceberg学习二】Branch和Tag在Iceberg中的应用

Iceberg 表元数据保持一个快照日志&#xff0c;记录了对表所做的更改。快照在 Iceberg 中至关重要&#xff0c;因为它们是读者隔离和时间旅行查询的基础。为了控制元数据大小和存储成本&#xff0c;Iceberg 提供了快照生命周期管理程序&#xff0c;如 expire_snapshots&#xf…

函数调用栈是什么

今天在力扣leetbook上看《图解算法数据结构》中的空间复杂度这一小节&#xff0c;看到如下这句话&#xff1a; “程序调用函数是基于栈实现的&#xff0c;函数在调用期间&#xff0c;占用常量大小的栈帧空间&#xff0c;直至返回后释放。” 这句话的意思是&#xff0c;在程序中…

2.3作业

作业要求&#xff1a; 程序代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> typedef struct node //定义链表节点结构体&#xff1a;数据域、指针域 {int data;struct node *next; }*linklist;linklist create_node()//创建新节…

C++类和对象入门(三)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 前言 在c中&#xff0c;类型分为两类&#xff0c;一类是内置类型&#xff0c;另一类是自定义类型。 1.内置类型&#xf…

Linux内存管理:(十二)Linux 5.0内核新增的反碎片优化

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 外碎片化发生时&#xff0c;页面分配…

Python基础知识:Python流程控制语句

流程控制就是控制程序如何执行的方法&#xff0c;适用于任何一门编程语言&#xff0c;其作用在于&#xff0c;可以根据用户的需求决定程序执行的顺序。计算机在运行程序时&#xff0c;有3种执行方法&#xff0c;第一种是顺序执行&#xff0c;自上而下顺序执行所有的语句&#x…

分享63个节日PPT,总有一款适合您

分享63个节日PPT&#xff0c;总有一款适合您 63个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1kZeiN06KbevtSCs5vXm6oA?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

【代码随想录-哈希表】两个数组的交集

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…