若依 ruoyi-vue 用户账号前后端参数校验密码 手机号 邮箱

在这里插入图片描述
在这里插入图片描述

前端

<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
        <el-row>
          <el-col :span="12">
            <el-form-item label="姓名/名称" prop="userName">
              <el-input v-model="form.userName" placeholder="请输入姓名/名称"/>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="手机号码" prop="mobile">
              <el-input v-model="form.mobile" placeholder="请输入手机号码"/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="邮箱" prop="email">
              <el-input v-model="form.email" placeholder="请输入邮箱"/>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="性别" prop="gender">
              <el-radio v-model="form.gender"
                        :label="dict.value"
                        v-for="dict in dict.type.gender"
                        :key="dict.value">{{ dict.label }}
              </el-radio>
            </el-form-item>
          </el-col>
        </el-row>

        <el-row>
          <el-row>
            <el-col :span="12">
              <el-form-item label="密码" prop="password">
                <el-input v-model="form.password" placeholder="请输入密码" type="password" maxlength="20"
                          show-password/>
                <password-strength v-model="form.password" style="padding-top: 10px;"></password-strength>
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="确认密码" prop="confirmPassword">
                <el-input v-model="form.confirmPassword" placeholder="请输入确认密码" type="password" maxlength="20"
                          show-password/>
              </el-form-item>
            </el-col>
          </el-row>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="所属地域" prop="areaCode">
              <treeselect v-model="form.areaCode" :options="tzSysTreeDictOptions"
                          :normalizer="normalizer" placeholder="请所属地域"/>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="领域" prop="domain">
              <el-select v-model="form.domain" placeholder="请选择领域" style="width:100%">
                <el-option
                  v-for="dict in dict.type.tzLyUserDomain"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="证件类型" prop="idType">
              <el-select v-model="form.idType" placeholder="请选择证件类型" style="width:100%">
                <el-option
                  v-for="dict in dict.type.certType"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="证件号码" prop="idCard">
              <el-input v-model="form.idCard" placeholder="请输入证件号码" style="width:100%"/>
            </el-form-item>
          </el-col>
        </el-row>

        <el-row>
          <el-col :span="12">
            <el-form-item label="民族" prop="ethnicity">
              <el-select v-model="form.ethnicity" placeholder="请选择民族" style="width:100%">
                <el-option
                  v-for="dict in dict.type.ethnicity"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="政治面貌" prop="politicalStatus">
              <el-select v-model="form.politicalStatus" placeholder="请选择政治面貌" style="width:100%">
                <el-option
                  v-for="dict in dict.type.politicalStatus"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="职业" prop="occupation">
              <el-select v-model="form.occupation" placeholder="请选择职业" style="width:100%">
                <el-option
                  v-for="dict in dict.type.trade"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="工作单位(公司)" prop="unit">
              <el-input v-model="form.unit" placeholder="请输入工作单位(公司)"/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="职务" prop="job">
              <el-input v-model="form.job" placeholder="请输入职务"/>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="个人介绍" prop="introduction">
              <el-input v-model="form.introduction" placeholder="请输入个人介绍"/>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>
 // 表单校验
      rules: {
        userName: [
          { required: true, message: '姓名/名称不能为空', trigger: 'blur' }
        ],
        mobile: [
          { required: true, trigger: 'blur', validator: this.validatePhoneNumber }
        ],
        password: [
          { trigger: 'blur', validator: this.validatePassword }
        ],
        confirmPassword: [
          { trigger: 'blur', validator: this.validateConfirmPassword }
        ],
        email: [
          { required: true, message: '邮箱不能为空', trigger: 'blur' },
          {
            pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
            message: '请输入正确的邮箱地址',
            trigger: ['blur', 'change']
          }
        ],
        areaCode: [
          { required: true, message: '所属地域不能为空', trigger: 'blur' }
        ],
        domain: [
          { required: true, message: '领域不能为空', trigger: 'blur' }
        ],
        idType: [
          { required: true, message: '证件类型不能为空', trigger: 'blur' }
        ],
        idCard: [
          { required: true, validator: this.validateChineseIDCard, trigger: 'blur' }
        ]
      },
 //校验确认密码
    validateConfirmPassword(rule, value, callback) {
      if (!this.isInsert) {
        callback()
      }
      if (value !== this.form.password) {
        callback(new Error('密码和确认密码不一致'))
      } else {
        callback()
      }
    },
    //校验身份证号码
    validateChineseIDCard(rule, value, callback) {
      if (this.form.idType!=='1'){
        callback()
      }
      const reg = /(^\d{15}$)|(^\d{17}(\d|X|x)$)/
      if (!value) {
        callback(new Error('身份证号码不能为空'))
      } else if (!reg.test(value)) {
        callback(new Error('身份证号码格式不正确'))
      } else {
        callback()
      }
    },
    //校验密码
    validatePassword(rule, value, callback) {
      if (!this.isInsert) {
        callback()
      }
      // 密码必须包含数字、小写字母、大写字母和特殊字符中的至少三种
      const reg = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_]).{6,20}$/
      if (!value) {
        callback(new Error('密码长度要在 6 到 20 个字符'))
      } else if (value.length < 6 || value.length > 20) {
        callback(new Error('密码长度要在 6 到 20 个字符'))
      } else if (!reg.test(value)) {
        callback(new Error('密码必须包含数字、小写字母、大写字母和特殊字符中的至少三种'))
      } else {
        callback()
      }
    },
    //校验手机号码
    validatePhoneNumber(rule, value, callback) {
      const reg = /^1[3-9]\d{9}$/
      if (!value) {
        callback(new Error('手机号不能为空'))
      } else if (!reg.test(value)) {
        callback(new Error('手机号格式不正确'))
      } else {
        callback()
      }
    },

后端

枚举
package com.huida.common.valid;

import javax.validation.groups.Default;

public interface ValidParameterTzLyUser extends Default {

    interface User {
    }

    interface Group {
    }
}

实体
    /**
     * 密码
     * 不传递密码给前端,但是后端数据库查出来使用,允许前端传密码过来
     */
    @Size(min = 1, max = 30, message = "密码长度不能超过30个字符",
            groups = {ValidParameterTzLyUser.User.class, ValidParameterTzLyUser.Group.class})
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;

 /**
     * 统一社会信用代码,企业账号要校验统一社会信用代码
     */
    @Size(min = 1, max = 32, message = "统一社会信用代码不能为空,统一社会信用代码长度不大于32",
            groups = {ValidParameterTzLyUser.User.class, ValidParameterTzLyUser.Group.class})
    private String shxydm;

    /**
     * springboot自带参数校验
     */
    private static final javax.validation.Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator();

 public static void validate(TzLyUser tzLyUser) {
        //校验参数
        Set<ConstraintViolation<TzLyUser>> validate = null;
        if (TzLyConstants.IDENTITY_REGISTER_USERS.equals(tzLyUser.getIdentity())) {
            validate = VALIDATOR.validate(tzLyUser, ValidParameterTzLyUser.User.class);
        } else if (TzLyConstants.IDENTITY_AUTH_GROUP.equals(tzLyUser.getIdentity())) {
            validate = VALIDATOR.validate(tzLyUser, ValidParameterTzLyUser.Group.class);
        }
        if (ObjectUtils.isNotEmpty(validate)) {
            StringBuilder sb =new StringBuilder();
            for (ConstraintViolation<TzLyUser> violation : validate) {
                sb.append(violation.getMessage());
                sb.append("\n");
                System.out.println(violation.getMessage());
                System.out.println(violation);
            }
            throw new TipUserException(sb.toString());
        }
        if (!PhoneUtil.isMobile(tzLyUser.getMobile())) {
            throw new TipUserException("手机号码格式不正确");
        }
        if (!tzLyUserService.checkMobileUnique(tzLyUser)) {
            throw new TipUserException("注册失败,手机号码已存在");
        }
        String msg = PasswdUtils.verifyPassLevel(tzLyUser.getPassword());
        if (StringUtils.isNotBlank(msg)) {
            throw new TipUserException(msg);
        }

    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IOT技术怎么落地?以宝马,施耐德为例

物联网技术 物联网&#xff08;IoT&#xff09;技术正逐渐成为数字化工厂转型的核心驱动力。本文将通过实际案例&#xff0c;探讨IoT技术如何促进制造业的数字化转型&#xff0c;提高生产效率&#xff0c;降低成本&#xff0c;并提升产品质量。 1. 物联网技术简介 物联网技术通…

记录一次Netty的WSS异常

概述 业务场景 应用通过 WSS 客户端连接三方接口。在高并发压测时&#xff0c;出现了请求服务器写入失败的异常&#xff0c;该异常是偶发&#xff0c;出现的概率不到千分之一&#xff0c;异常如下图所示。 问题概述 注意&#xff1a; 因为握手是通过 http 协议进行的。所以…

SpringBoot整合WebSocket实现聊天室

1.简单的实现了聊天室功能&#xff0c;注意页面刷新后聊天记录不会保存&#xff0c;后端没有做消息的持久化 2.后端用户的识别只简单使用Session用户的身份 0.依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

firewalld 防火墙

firewalld概述 Linux系统防火墙从CentOS7开始的默认防火墙工作在网络层&#xff0c;属于包过滤防火墙 Firewalld和iptables的关系 netfilter 位于Linux内核中的包过滤功能体系称为Linux防火墙的“内核态” firewalld Centos默认的管理防火墙规则的工具称为防火墙的“用…

高中数学:平面向量-题型总结及解题思路梳理

一、知识点及解题思路梳理 高中&#xff0c;2/3的向量题目是坐标向量题&#xff0c;1/3是几何向量题。但是&#xff0c;这1/3的几何向量题可以转换成坐标向量题。 二、练习 例题1 几何型向量题 例题2

QML的Image 路径问题(source)

四种路径格式 在 QML 中&#xff0c;当你使用 Image 元素的 source 属性来指定一个图片的路径时&#xff0c;有几种不同的方式可以指定这个路径&#xff0c;每种方式都有其特定的用途和上下文。 相对路径&#xff1a; QML 文件和一个名为 close.png 的图片在同一目录下&#x…

比较两列数据

点其中一个数据 删掉S&#xff0c;回车 大的标红

基于SpringBoot+Vue+Mysql的实验室低值易耗品管理系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

基于springboot的毕业设计系统的开发源码

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的毕业设计系统的开发。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 毕业设计系统能够实现…

Git Core Lecture

1、Git 简介 官方介绍&#xff1a;Git is a fast distributed revision control system (Git 是一个快速的分布式版本控制系统) 2、Git Core Command 2.1 git init git 工程初始化&#xff0c;会在工作区 (working directory) 根目录中创建.git 目录 # 创建目录 $ mkdir git-i…

智能合约语言(eDSL)—— 并行化方案 2

这个并行算法最初其实是在aptos上实现的&#xff0c;aptos上使用的是move虚拟机&#xff0c;后来我把它移植到我们链上了&#xff0c;但是wasm虚拟机。还是费了不少事情。 目前evm并行也比较火&#xff0c;像monad&#xff0c;sei等。经过调研发现&#xff0c;其实evm的并行&am…

Python 获取当前IP地址(爬虫代理)

Python 获取当前IP地址&#xff08;爬虫代理&#xff09; 在Python中&#xff0c;获取当前的公网IP地址通常涉及到发送一个请求到外部服务&#xff0c;因为本地IP地址通常只在你的私有网络内部是可见的&#xff0c;而公网IP地址是由你的ISP&#xff08;互联网服务提供商&#x…

如何查看哪些组策略应用于你的电脑和用户帐户?这里有详细步骤

如果你希望在电脑上查看所有有效的组策略设置,以下是操作方法。 什么是Windows中的组策略 在Windows世界中,组策略为网络管理员提供了一种将特定设置分配给用户组或计算机组的方法。然后,无论何时组中的用户登录到联网的PC,或无论何时启动组中的PC,都会应用这些设置。 …

牛客NC222 插入区间【中等 数组,区间合并问题 Java/Go/PHP/C++】lintcode30 插入区间

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/1d784b5472ab4dde88ea2331d16ee909 https://www.lintcode.com/problem/30/solution/56586 思路 Java代码 import java.util.*;/** public class Interval {* int start;* int end;* public Interval(int …

python web自动化(分布式测试Grid)

Grid介绍 Selenium Grid 是 Selenium 提供的⼀个⼯具&#xff0c;⽤于⽀持在多台计算机上并⾏运⾏测试。 它允许将测试分发到不同的机器和浏览器组合上&#xff0c;同时收集结果。 1.并⾏执⾏测试⽤例&#xff1a;在不同的机器上并⾏执⾏测试⽤例&#xff0c;从⽽加速整个测试过…

详细分析Element Plus中的ElMessageBox弹窗用法(附Demo及模版)

目录 前言1. 基本知识2. Demo3. 实战4. 模版 前言 由于需要在登录时&#xff0c;附上一些用户说明书的弹窗 对于ElMessageBox的基本知识详细了解 可通过官网了解基本的语法知识ElMessageBox官网基本知识 1. 基本知识 Element Plus 是一个基于 Vue 3 的组件库&#xff0c;其中…

初识C语言——第二十四天

函数的基本使用和递归 1.函数是什么 2.库函数 3.自定义函数 4.函数参数 5.函数调用 6.函数的嵌套调用和链式访问 7.函数的声明和定义 函数是什么 C语言中函数的分类 1.库函数 2.自定义函数 库函数&#xff1a; 简单的总结,C语言常用的库函数都有&#xff1a; #includ…

QT之常用控件

一个图形化界面当然需要有各种各样的控件&#xff0c;QT也不例外&#xff0c;在QT designer中就有提供各种各样的控件&#xff0c;用以开发图形化界面。 而想使用好一个QT控件&#xff0c;就需要了解这些控件。 QWidget 在QT中&#xff0c;所有控件都继承自 QWidget 类&…

Docker学习(4):部署web项目

一、部署vue项目 在home目录下创建项目目录 将打包好的vue项目放入该目录下&#xff0c;dist是打包好的vue项目 在项目目录下&#xff0c;编辑default.conf 内容如下&#xff1a; server {listen 80;server_name localhost; # 修改为docker服务宿主机的iplocation / {r…

24法考证件照要求|不合格原因汇总!

6月法考报名&#xff0c;大家一定要提前熟悉下电子证件照片要求‼️ ⚠️证件照注意事项 ▪️不得上传全身照、风景照、生活照、背带(吊带)衫照、艺术照、侧面照、不规则手机照等。 ▪️本人近三个月内彩色(红、蓝、白底色均可)正面免冠电子证件照片&#xff0c;照片必须清晰完…