谷粒商城第九天-解决商品品牌问题以及前后端使用检验框架检验参数

目录

一、总述

二、商品分类问题

三、前端检验

四、后端检验

五、总结


一、总述

在完成完商品分类的时候,后来测试的时候还是发现了一些问题,现在将其进行解决,问题如下:

1. 取消显示的时候,如果取消了显示,再次想要其进行显示的时候发现不能再次被显示了。

2. 在修改页面发现是否显示按钮完全也是不起作用

另外从现在这个商品品牌修改页开始就要进行参数校验了,参数校验除了前端的参数校验还有后端的参数校验。

二、商品分类问题

1. 当取消显示,让其想再显示的时候,发现其不能再显示了。

其实这个问题出现的原因也是很简单,就是一旦选择了不显示之后,因为在后端进行了逻辑删除,因此,当不显示之后其实也就是进行了逻辑删除。一旦删除了过后,肯定再去找这个品牌对象,肯定也是找不到了,因此也就无法再去修改它的状态了。

解决办法:

取消其逻辑删除,MP的配置那里还有实体类里面的注解也要将其注释掉,将是否显示的这个字段变成一个标志字段

 2. 在修改页面的是否显示修改不起作用

原因就是,当初只记得单纯加上这个组件,但是忘记修改其默认的绑定值了,默认是false和true。

三、前端检验

之前前端校验是使用原生的js代码进行控制的,重复繁琐。

现在可以直接使用vue中为我们提供好的参数校验框架解决这个问题。

参考elementUI的表单组件,可以看到有表单验证组件:

步骤:

1. 先在表单上面加上校验的属性

 通过这个:rules绑定其校验的规则

2. 写校验规则

按照这个格式写好就行了。

也可以自定义校验,不使用它已经写好了的, 这个就需要查看下面的组件了,自定义校验规则

也就是这样:

还是像之前一样,只不过在里面另外加了个校验器,这个校验器就是一个方法。

使用callback()来显示异常的校验信息,当里面什么都不放的时候。就代表参数正常

在我的品牌管理中的修改和新增的那个页面,直接采用这种方法进行校验。

 其中数字还有一种简便的方式。

 这里我直接贴代码了:

dataRules: {name: [{ required: true, message: "品牌名不能为空", trigger: "blur" }],firstLetter: [{validator: (rule, value, callback) => {if(value == ''){callback(new Error('不能为空'));}else if(!/^[a-zA-Z]$/.test(value)){callback(new Error('首字母必须是字母'));}else{callback();}},trigger: "blur"}],sort: [{validator : (rule, value, callback) => {if(value == ''){callback(new Error('不能为空'));}else if(!Number.isInteger(value)){callback(new Error('请输入数字'));}else{callback();}},trigger : "blur"}]}

四、后端检验

后端校验也是必须的,看似前端就已经校验过一遍了,但是其实前端只是防了老实人,真正懂技术的,其实可以直接访问后端接口,那么此时后端就需要进行参数校验,但是之前的参数校验是直接使用大量的if条件进行判断的,很繁琐麻烦,很前端一样。

本次使用的参数校验的框架使用的是JSR303,validation框架

其实这个使用起来很简单,最简单的就是直接在参数对象所对应的类的字段上面添加上相应的注解,然后真正用的时候,在请求参数那里加上@valid注解代表启用参数校验,这就可以校验了。

首先在javax.validation.constraints包下面包含了许多的参数校验的注解,比如说非空,还有最大最小,邮箱地址判断等。

对于每个注解如果不熟悉的话,就可以查找这个文件:ValidationMessages_zh.properties这里面包含中文解释

常用的注解有:@NotEmpty(不能为空,包括不能是空字符串)、@Null(只能为空)、@Pattern(正则表达式)。

就像下面我这个使用了:

public class Brand implements Serializable {public static final long serialVersionUID = 1L;/** 品牌id */@TableId(value = "brand_id")@Null(message = "商品id必须为空",groups = {AddStatus.class})@Min(value = 0,message = "必须是大于0的整数",groups = {UpdateStatus.class})private Long brandId;/** 品牌名 */@Excel(name = "品牌名")@NotEmpty(message = "品牌名不能为空",groups = {AddStatus.class})private String name;/** 品牌logo地址 */@Excel(name = "品牌logo地址")@NotEmpty(message = "logo地址不能为空",groups = {AddStatus.class})@URL(message = "请输入合法的logo地址")private String logo;/** 介绍 */@Excel(name = "介绍")private String descript;/** 显示状态[0-不显示;1-显示] */@Excel(name = "显示状态[0-不显示;1-显示]")//@TableLogic(value = "1",delval = "0")@ValueList(vals = {0,1},groups = {AddStatus.class})private Integer showStatus;/** 检索首字母 */@Excel(name = "检索首字母")@Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母必须为字母")@NotEmpty(message = "检索首字母不能为空",groups = {AddStatus.class})private String firstLetter;/** 排序 */@Excel(name = "排序")@Min(value = 0,message = "排序编号必须是一个大于0的整数")private Long sort;}

 这是第一步,准备工作,但是要真正的启用参数校验,还需要启用参数校验:

在控制器的请求参数那里,就是请求的实体类的前面加上@Valid即可。

下面介绍这个校验框架的高级功能,有分组校验还有自定义参数校验注解

1. 分组校验

这个实际上很简单,因为在控制器的那里其实是有着许多控制器的,有个时候多个控制器其实是使用的相同的实体类的,这里的话不能对于任何的都使用一套校验规则,最简单的就是说,比如添加和修改,对于姓名等字段,添加是必须的,但是修改却并不是必须的。

步骤:

1. 先定义注解

这个注解只是起着标识的作用,就像@Override注解一样,里面什么内容都没有

2. 在实体类上面定义好注解与对应的接口进行绑定

只需要写上其注解对应的分组 

3. 在控制器那里直接也要标明状态

控制器这里要注意一下,不能依旧使用之前的@Valid注解了

需要使用@Validation注解,在里面写好value = 接口

下面是使用的效果:

这里的修改的时候其实是并没有加上name等字段的,但是也可以请求成功。原因就是那些字段是使用add注解进行绑定,而修改的话是与update进行绑定

2. 自定义校验注解

比如在这里我检验 是否显示的状态只能是 0和1 其他的不行

步骤:

1. 写一个校验注解

这里可以写上自己的文件,写上自己的提示信息

2. 写好校验器

点击validatedBy属性,可以发现校验器需要实现ConstraintValidator这个接口

这里我直接贴上这个检验器:

public class ValueListConstraintValidator implements ConstraintValidator<ValueList,Integer> {private Set<Integer> set = new HashSet<>();@Overridepublic void initialize(ValueList constraintAnnotation) {int[] vals = constraintAnnotation.vals();for (int val : vals) {set.add(val);}}@Overridepublic boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {return set.contains(integer);}
}

3. 在检验注解上面指定好校验器

然后就能直接进行使用了

下面是效果:

  

五、总结

这一次就是对商品的品牌进行了bug修复,另外还有就是前后端校验框架的使用,还是挺简单的,没什么技术含量的东西

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

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

相关文章

Mybatis引出的一系列问题-spring多数据源配置

在日常开发中我们都是以单个数据库进行开发&#xff0c;在小型项目中是完全能够满足需求的。但是&#xff0c;当我们牵扯到像淘宝、京东这样的大型项目的时候&#xff0c;单个数据库就难以承受用户的CRUD操作。那么此时&#xff0c;我们就需要使用多个数据源进行读写分离的操作…

系统中出现大量不可中断进程和僵尸进程怎么办?

进程状态 通过top命令&#xff0c;我们可以看到进程的状态(S列) toptop - 19:27:57 up 365 days, 25 min, 0 users, load average: 0.06, 0.05, 0.01 Tasks: 134 total, 1 running, 90 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 0.5 sy, 0.0 ni, 99.2 id, …

Qt中ffmpeg API存储和显示摄像头视频

Qt中ffmpeg API存储和显示摄像头视频的功能需要之前写的视频ffmpegAPI的视频播放的流程。 代码源码位置&#xff1a;https://download.csdn.net/download/qq_43812868/88157743?spm1001.2014.3001.5503 一、存储和显示摄像头的视频的流程 这是读取打开视频文件的流程&#x…

【c++】内存管理

C/C内存管理 C/C内存分布 一个简单题 先试试看吧&#xff0c;答案在文章末尾给出 选择题&#xff1a; 选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区) globalVar在哪里&#xff1f;____ staticGlobalVar在哪里&#xff1f;____ staticVar在哪里&#xff1f;____ localVar在…

Docker容器

目录 1.docker简介 docker的优点&#xff1a; docker的应用&#xff1a; 2.docker的基本概念 1.镜像&#xff1a; 2.容器&#xff1a; 3.仓库 3.docker的安装部署&#xff08;yum&#xff09; 4.docker的基础命令 镜像操作&#xff1a; 容器操作&#xff1a; 进入容器…

【C++】开源:Eigen3矩阵与线性代数库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Eigen3矩阵与线性代数库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&…

problem(3):python IDE和python解释器

为什么写这篇文章呢&#xff1f;遇到了下面的问题&#xff0c;相同的解释器&#xff0c;如果运行angr库的代码&#xff0c;会出现 这样的情况&#xff0c;但是用spyder IDE 会显示正常&#xff0c;很奇怪 应该就是IDE的原因 IDE的循环导入问题 检查IDE配置&#xff1a; 如果可…

一百四十四、Kettle——Linux上安装的kettle8.2连接MySQL数据库

一、目的 在Linux上安装好kettle&#xff0c;然后用kettle连接MySQL数据库 注意&#xff1a;kettle版本是8.2 二、实施步骤 &#xff08;一&#xff09;到kettle安装目录下启动Linux的kettle服务 # cd /opt/install/data-integration/ # ./spoon.sh &#xff08;二&#x…

SpringBoot搭建WebSocket初始化

1.java后端的maven添加websocket依赖 <!-- websocket依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>2.实例化ServerEndpointExport…

linux安装Java11,maven,docker,mysql,rabbitmq,nacos,redis,es一条龙服务

1 安装jdk11 # 第一步&#xff1a;上传或下载安装包 cd /usr/local jdk-11.0.9_linux-x64_bin.tar.gz# 第二步&#xff1a;解压安装包 tar -xzvf jdk-11.0.9_linux-x64_bin.tar.gz# 第三步&#xff1a;修改环境变量 vim /etc/profile#在末尾加入 JAVA_HOME/usr/local/jdk-11.…

踩坑(5)整合kafka 报错 java.net.UnknownHostException: 不知道这样的主机

java.net.UnknownHostException: 不知道这样的主机。 (5c0c3c629db9)at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[na:na]at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:933) ~[na:na]at java.ba…

uniapp封装request请求

在基础文件里面创建一个api文件 在创建两个 js文件 http.js 里面封装 request 请求 let baseUrl https://white.51.toponet.cn; //基地址 export const request (options {}) > {//异步封装接口&#xff0c;使用Promise处理异步请求return new Promise((resolve, reject…

MySQL备份还原

mysql> create database school; mysql> use school; /* 1.创建student和score表 */ --创建student表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR…

typescript基础之关键字type

TypeScript的type是一个关键字&#xff0c;用来定义一个类型别名https://www.typescripttutorial.net/typescript-tutorial/typescript-types/。类型别名可以给一个已有的类型起一个新的名字&#xff0c;或者组合多个类型成为一个新的类型。例如&#xff1a; // 给string类型起…

React Antd 实现表格合计功能

思路&#xff1a;首先拿到 表格数组对象&#xff0c;然后写一个工具类&#xff0c;然后向数组对象最后插入一条数据&#xff0c;这条数据的字段时根据表格数组里合计算出来的。 代码如下&#xff0c;需根据各自业务稍作改动&#xff1a; <Table dataSource{tableData}column…

时间复杂度为O(nlogn)的两种排序算法

1.归并排序 归并排序的核心思想&#xff1a;如果要排序一个数组&#xff0c;我们先把数组从中间分成前后两部分&#xff0c;然后对前后两部分分别排序&#xff0c;再将排好序的两部分合并在一起&#xff0c;这样整个数组就都有序了。 归并排序使用的就是分治思想。分治&#x…

第2章 HTML中的JavaScript

引言 将JavaScript引入网页&#xff0c;首先要解决它与网页的主导语言HTML的关系问题 script元素 将JavaScript插入HTML的主要方法是使用script元素&#xff0c;script有8个可选属性 async&#xff1a;表示异步加载js文件内容&#xff0c;他们之间的顺序不一定按照html顺序ch…

IDEA强大的VisualGC插件

前言 开发阶段实时监测&#xff0c;自己的JVM信息&#xff0c;实时可视化 Hotspot JVM 垃圾回收监控工具, 支持查看本地和远程JVM进程, 支持G1 and ZGC算法。 插件安装 在线安装 IntelliJ IDEA 可通过在线安装的方式&#xff0c;安装插件 JDK VisualGC&#xff0c;安装步骤: …

DAY02_Spring第三方资源配置管理Spring容器Spring注解开发Spring整合Mybatis和Junit

目录 一 第三方资源配置管理1 管理DataSource连接池对象问题导入1.1 管理Druid连接池1.2 管理c3p0连接池 2 加载properties属性文件问题导入2.1 基本用法2.2 配置不加载系统属性2.3 加载properties文件写法 二 Spring容器1 Spring核心容器介绍问题导入1.1 创建容器1.2 获取bean…

JVM 类文件结构(class文件)

JVM 本文链接&#xff1a;https://blog.csdn.net/feather_wch/article/details/132116849 类文件结构 1、class文件的组成 无符号数&#xff1a;基本数据类型 u1 u2 u3 u4 描述 数字字符串索引引用 表&#xff1a;复合数据类型&#xff0c;无符号数 表组&#xff0c; _inf…