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

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

目录

一、总述

二、商品分类问题

三、前端检验

四、后端检验

五、总结


一、总述

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

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修复,另外还有就是前后端校验框架的使用,还是挺简单的,没什么技术含量的东西

相关文章:

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

目录 一、总述 二、商品分类问题 三、前端检验 四、后端检验 五、总结 一、总述 在完成完商品分类的时候&#xff0c;后来测试的时候还是发现了一些问题&#xff0c;现在将其进行解决&#xff0c;问题如下&#xff1a; 1. 取消显示的时候&#xff0c;如果取消了显示&…...

Java8函数式接口

在工作中我需要&#xff0c;我需要递归处理复杂嵌套的JSON字符串&#xff0c;然后处理方法有多种&#xff0c;为了代码通用性&#xff0c;我想要把处理方法当作参数&#xff0c;传入到函数中&#xff0c;然后根据不同的处理方法处理字符串。通过查资料得知&#xff0c;可以使用…...

.Net6 Web Core API --- Autofac -- AOP

目录 一、AOP 封装 二、类拦截 案例 三、接口拦截器 案例 AOP拦截器 可开启 类拦截器 和 接口拦截器 类拦截器 --- 只有方法标注 virtual 标识才会启动 接口拦截器 --- 所有实现接口的方法都会启动 一、AOP 封装 // 在 Program.cs 配置 builder.AddAOPExt();//自定义 A…...

RocketMQ基本概念和高级原理

基础概念 消息模型 RocketMQ 主要由 Producer、Broker、Consumer 三部分组成&#xff0c;其中 Producer 负责生产消息&#xff0c;Consumer 负责消费消息&#xff0c;Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器&#xff0c;每个 Broker 可以存储多个 Topic…...

小白到运维工程师自学之路 第六十六集 (docker 网络模型)

一、概述 Docker网络模型是指Docker容器在网络中的通信方式和组织结构。Docker容器通过网络连接&#xff0c;使得容器之间可以相互通信&#xff0c;并与主机和外部网络进行交互。 在Docker中&#xff0c;有几种不同的网络模型可供选择&#xff1a; 1、主机模式&#xff08;H…...

Go和Java实现建造者模式

Go和Java实现建造者模式 下面通过一个构造人身体不同部位的案例来说明构造者模式的使用。 1、建造者模式 建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式&#xff0c;它提供了 一种创建对象的最佳方式。 一个 Builder 类会…...

AutoSAR系列讲解(实践篇)11.6-服务映射(自顶向下)

目录 一、配置Service Needs 二、配置Cfg同步 我们在下一节的实验课中讲解这里的具体配置流程,本节主要讲一下这些配置的大致流程和配置项的作用。NvBlockSwComponents是一个可选项, 我们这里开始不使用NvBlockSwComponents,将我们的Application SWC直接和NvM通过C/S连接起…...

EXCEL, 用if({1,0,0} ...) 实现把给定的区域,输出为任意你想要的矩阵,数组区域!

目录 1 原材料&#xff1a;这样的一个区域 工具 if({1,0,0}) 数组公式 1.1 原始数据 1.2 原理 if(0/1,t-value,f-value)---变形--->if({},range1,range2) 1.2.1 if(0/1,t-value,f-value)---变形--->if({},range1,range2) 1.2.2 原理1&#xff1a; if 数组原理&#…...

c++实现Qt对象树机制

文章目录 对象树是什么使用对象树的好处使用c实现对象树 对象树是什么 我们常常听到 QObject 会用对象树来组织管理自己&#xff0c;那什么是对象树&#xff1f;  这个概念非常好理解。因为 QObject 类就有一个私有变量 QList<QObject *>&#xff0c;专门存储这个类的子…...

骨传导蓝牙耳机排行榜,精选五款排名最靠前的耳机

不知道大家在挑选耳机的时候会考虑什么&#xff1f;有些人会考虑耳机的功能、有些会考虑价格&#xff0c;还有的会考虑品牌等因素&#xff0c;但是综合下来&#xff0c;我们作为消费者无非是想要一款音质很好&#xff0c;而佩戴又很适合我们的耳机&#xff5e;我们年轻人作为耳…...

JDBC用法小结

JDBC用法小结 本文实例总结了JDBC的用法。分享给大家供大家参考。具体分析如下&#xff1a; DriverManger:驱动管理器类 要操作数据库&#xff0c;必须先与数据库创建连接&#xff0c;得到连接对象 public static Connection getConnection(String url, String username,Str…...

MySQL 数据表在什么情况下容易损坏

服务器突然断电导致数据文件损坏。强制关机&#xff0c;没有先关闭 MySQL 服务等。 表损坏的原因分析 以下原因是导致 mysql 表毁坏的常见原因&#xff1a; 1、 服务器突然断电导致数据文件损坏。 2、 强制关机&#xff0c;没有先关闭 mysql 服务。 3、 mysqld 进程在写表时…...

【设计模式——学习笔记】23种设计模式——访问者模式Visitor(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入要求传统方案 介绍基本介绍应用场景登场角色尚硅谷版本《图解设计模式》版本 案例实现案例一实现拓展 案例二(个人感觉这个案例较好)实现分析拓展一拓展二拓展三 总结额外知识双重分发 文章说明 案例引入 要求 测评系统需求&#xff1a;将观众分为男人和女人…...

Ubuntu安装MySQL 8.0与Navicat

目录 Ubuntu安装MySQL 8.0 1、更新软件包列表 2、安装 MySQL 8.0 3、启动 MySQL 服务 5、确保MySQL服务器正在运行 5、root 用户的密码 6、登录MySQL&#xff0c;输入mysql密码 7、MySQL默认位置 Ubuntu安装Navicat 1、下载 Navicat 2、额外的软件包 3、执行命令 U…...

GB28181智慧可视化指挥控制系统之执法记录仪设计探讨

什么是智慧可视化指挥控制系统&#xff1f; 智慧可视化指挥控制平台通过4G/5G网络、WIFI实时传输视音频数据至指挥中心&#xff0c;特别是在有突发情况时&#xff0c;可以指定一台执法仪为现场视频监控器&#xff0c;实时传输当前画面到指挥中心&#xff0c;指挥中心工作人员可…...

【SpringBoot】自动配置自动加载controller的原理

SpringBoot自动配置&&自动加载controller的原理.md 好久没有更新自己的博客了,自己最近的正好有点空闲的时间进行,自己在写着写着,突然想起来, 为什么我们点击application就能自动加载Controller呢?(好家伙,我顿时鱼鳃,哈哈) 1.首先我们来到启动现场>启动类 Sprin…...

Docker Enable live

ubuntu - Enabling live restore on docker isnt keeping the containers alive - Stack Overflow容器安全之启用实时恢复 - 简书 (jianshu.com)...

9.物联网操作系统之软件定时器

一。软件定时器概念及应用 1.软件定时器定义 就是软件实现定时器。 2.FreeRTOS软件定时器介绍 如上图所示&#xff0c;Times的左边为设置定时器时间&#xff0c;设置方式可以为任务设置或者中断设置&#xff1b;Times的右边为定时器的定时相应&#xff0c;使用CalBack相应。 …...

Windows Server 2012 R2 安装 Oracle RAC 11g R2

Windows Server 2012 R2 安装 Oracle RAC 11g R2 环境准备安装系统设置虚拟网络配置虚拟机网卡开机进行系统配置关闭防火墙设置网络系统高级设置修改注册表修改计算机名称设置账户控制RAC1 和 RAC2 的磁盘共享修改 hosts同步时间在 RAC1 RAC2 DATA 中安装 .net3.5在 DATA 中搭建…...

本地shell无法连接ubuntu,解决办法?

1.启动ssh服务&#xff1b; sudo /etc/init.d/ssh start若重启ssh服务后&#xff0c;还是连接不上&#xff0c;继续第2步&#xff1b; 2.修改SSH配置文件 /etc/ssh/sshd_config 默认是不允许root远程登录的&#xff0c;可以再配置文件开启。 sudo vi /etc/ssh/sshd_config找…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...