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

目录

一、总述

二、商品分类问题

三、前端检验

四、后端检验

五、总结


一、总述

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

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.rhkb.cn/news/79247.html

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

相关文章

九度OJ → 题目1368:二叉树中和为某一值的路径 ← DFS

【题目来源】 由于九度OJ&#xff08;http://ac.jobdu.com/&#xff09;已经永久关闭&#xff0c;故无法在其上进行在线提交代码。 幸运的是&#xff0c;在AcWing上有此题目“二叉树中和为某一值的路径”&#xff0c;但描述有些不同。可详见&#xff1a;https://www.acwing.com…

redis 集群 1:李代桃僵 —— Sentinel

目前我们讲的 Redis 还只是主从方案&#xff0c;最终一致性。读者们可思考过&#xff0c;如果主节点凌晨 3 点突发宕机怎么办&#xff1f;就坐等运维从床上爬起来&#xff0c;然后手工进行从主切换&#xff0c;再通知所有的程序把地址统统改一遍重新上线么&#xff1f;毫无疑问…

绿色项目管理:为环境和效益双赢

绿色项目管理&#xff1a;为环境和效益双赢 在21世纪的今天&#xff0c;我们正面临着各种全球性的环境问题&#xff0c;从气候变化到资源枯竭。作为项目经理&#xff0c;我们有责任和机会确保我们的项目对环境的影响最小&#xff0c;并在可能的情况下为环境做出积极的贡献。 …

P9503 『MGOI』Simple Round I | B. 魔法照相馆

题目背景 照片留下了值得留恋的瞬间&#xff0c;但对于魔法士来说最重要的是向前看。——殿堂魔法士 W 题目描述 小 M 正在准备入学所必需的魔法士证件&#xff0c;因此他来到了纵深巷的魔法照相馆。 在等待的时候&#xff0c;小 M 注意到魔法照相馆有三个幕布&#xff0c;颜…

建筑行业是不是一个夕阳产业?一建值得考吗?

建筑行业行业是不是夕阳产业&#xff0c;提出这个问题的人已经了解了现在建筑行业的不景气&#xff0c;从3年疫情到放开疫情管控&#xff0c;2023年是疫情放开后最好的一年。 建筑上下游各产业链行业失业率攀升&#xff0c;房屋建筑土地没人卖&#xff0c;多修建公共建筑&…

RISC-V公测平台发布:如何在SG2042上玩转OpenMPI

About HS-2 HS-2 RISC-V通用主板是澎峰科技与合作伙伴共同研发的一款专为开发者设计的标准mATX主板&#xff0c;它预装了澎峰科技为RISC-V高性能服务器定制开发的软件包&#xff0c;包括各种标准bencmark、支持V扩展的GCC编译器、计算库、中间件以及多种典型服务器应用程序。…

音频客观感知MOS对比,对ViSQOL、PESQ、MosNet(神经网络MOS分)和polqa一致性对比和可信度验证

原创&#xff1a;转载需附链接&#xff1a; https://blog.csdn.net/qq_37100442/article/details/132057139?spm1001.2014.3001.5502 一、背景 Mos分评价音质重要指标&#xff0c;最近也有很多机构和公司在研究适合自己的评价体系。目前Mos分主要分为主观评测和客观感知评价。…

6.6 实现卷积神经网络LeNet训练并预测手写体数字

模型架构 代码实现 import torch from torch import nn from d2l import torch as d2lnet nn.Sequential(nn.Conv2d(1,6,kernel_size5,padding2),nn.Sigmoid(),#padding2补偿5x5卷积核导致的特征减少。nn.AvgPool2d(kernel_size2,stride2),nn.Conv2d(6,16,kernel_size5),nn.S…

黑马大数据学习笔记5-案例

目录 需求分析背景介绍目标需求数据内容DBeaver连接到Hive建库建表加载数据 ETL数据清洗数据问题需求实现查看结果扩展 指标计算需求需求指标统计 可视化展示BIFineBI的介绍及安装FineBI配置数据源及数据准备 可视化展示 P73~77 https://www.bilibili.com/video/BV1WY4y197g7?…

宋浩概率论笔记(三)随机向量/二维随机变量

第三更&#xff1a;本章的内容最重要的在于概念的理解与抽象&#xff0c;二重积分通常情况下不会考得很难。此外&#xff0c;本次暂且忽略【二维连续型随机变量函数的分布】这一章节&#xff0c;非常抽象且难度较高&#xff0c;之后有时间再更新。

回归决策树模拟sin函数

# -*-coding:utf-8-*- import numpy as np from sklearn import tree import matplotlib.pyplot as pltplt.switch_backend("TkAgg") # 创建了一个随机数生成器对象 rng rngnp.random.RandomState(1) print("rng",rng) #5*rng.rand(80,1)生成一个80行、1列…

恒盛策略:上交所过户费收费标准?

随着我国股市的发展&#xff0c;股票买卖所的过户费成为了广阔投资者关注的焦点之一。在我国股票商场中&#xff0c;上交所是最重要的买卖所之一&#xff0c;因而上交所过户费的收费规范备受到了广泛关注。那么&#xff0c;上交所过户费的收费规范究竟怎么拟定&#xff1f;对投…

【Docker】Docker私有仓库的使用

目录 一、搭建私有仓库 二、上传镜像到私有仓库 三、从私有仓库拉取镜像 一、搭建私有仓库 首先我们需要拉取仓库的镜像 docker pull registry 然后创建私有仓库容器 docker run -it --namereg -p 5000:5000 registry 这个时候我们可以打开浏览器访问5000端口看是否成功&…

python-opencv对极几何 StereoRectify

OpenCV如何正确使用stereoRectify函数 函数介绍 用于双目相机的立体校正环节中&#xff0c;这里只谈谈这个函数怎么使用&#xff0c;参数具体指哪些函数参数 随便去网上一搜或者看官方手册就能得到参数信息&#xff0c;但是&#xff01;&#xff01;相对关系非常容易出错&…

【MySQL】事务的多版本并发控制(MVCC)

目录 一、数据库并发的三种场景二、MVCC2.1 三个记录隐藏字段2.2 undo log&#xff08;撤销日志&#xff09;2.3 模拟MVCC2.3.1 模拟更新&#xff08;update&#xff09;2.3.1 模拟删除&#xff08;delete&#xff09;2.3.1 模拟插入&#xff08;insert&#xff09;2.3.1 模拟查…

maven中常见问题

文章目录 一、配置项提示二、父子打包三、打包之后不显示target四、自定义打包之后的jar包名称五、整个项目打包5.1、父项目管理插件和微服务打包 一、配置项提示 SpringBoot中提示错误信息 表示的是SpringBoot中的注释提示没有配置&#xff01;那么可以来使用一下springboot官…

安全学习DAY14_JS信息打点

信息打点——前端JS框架 文章目录 信息打点——前端JS框架小节概述-思维导图JS安全概述什么是JS渗透测试&#xff1f;前后端差异JS安全问题流行的Js框架如何判定JS开发应用&#xff1f; 测试方法&#xff08;JS文件的获取以及分析方法1、手工搜索分析2、半自动Burp分析插件介绍…

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

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

引流精准客源方法,学会这一招就够你用的了

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 第一&#xff0c;你要想一想&#xff0c;你想吸引什么样的人&#xff1f; 您的排水目的是推…

构建语言模型:BERT 分步实施指南

学习目标 了解 BERT 的架构和组件。了解 BERT 输入所需的预处理步骤以及如何处理不同的输入序列长度。获得使用 TensorFlow 或 PyTorch 等流行机器学习框架实施 BERT 的实践知识。了解如何针对特定下游任务(例如文本分类或命名实体识别)微调 BERT。为什么我们需要 BERT? 正…