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

news2024/12/28 3:10:32

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

前端

<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);
        }

    }

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

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

相关文章

链游:区块链技术的游戏新纪元

随着区块链技术的快速发展&#xff0c;越来越多的行业开始探索与其结合的可能性&#xff0c;其中&#xff0c;游戏行业与区块链的结合尤为引人注目。链游&#xff0c;即基于区块链技术的游戏&#xff0c;正以其独特的优势&#xff0c;为玩家带来全新的游戏体验。本文将对链游进…

【linux】linux中免交互命令expect原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

每日一题《leetcode--382.链表随机结点》

https://leetcode.cn/problems/linked-list-random-node/ 这道题我们首先看到题目中的要求&#xff1a;在单链表中随机选取一个链表中的结点&#xff0c;要使每个结点被选取的概率是一样的。 当我们看到随机这两个字时&#xff0c;应该就会想起rand()这个函数。接着我们把使用这…

绕过最新版bilibili app反frida机制

问题说明 截止到2024年5月1日&#xff0c;B站最新版的安卓APP&#xff08;7.76.0&#xff09;有反Frida机制&#xff0c;不管是spawn还是attach&#xff0c;都无法注入frida&#xff0c;如下图所示。本文介绍一下如何绕过它 方法 定位检测点 检测Frida的机制一般在Native层实…

【全网最全】2024电工杯数学建模A题21页初步参考论文+py代码+保奖思路等(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模A题21页初步参考论文py代码保奖思路等&#xff08;后续会更新成品论文&#xff09;「首先来看看目前已有的资料&#x…

vue3+ts+vant4 实现购物车 前端代码

一、功能效果 二、前端代码 购物车的vue代码 <template><van-nav-bar left-text"返回" title"购物车" click-left"onClickLeft"><template #right><van-popover v-model:show"showPopover" placement"bot…

自己搭建内网穿透

本文介绍使用最新版frp搭建内网穿透&#xff0c;最新版本的frp在配置上与之前有很大不同&#xff0c;需要使用.toml文件进行配置。其中主要问题出现在toml文件内部。 一、云服务器配置 下载frp sudo apt update sudo apt install wget wget https://github.com/fatedier/frp…

音视频及H264/H256编码相关原理

一、音视频封装格式原理&#xff1a; 我们播放的视频文件一般都是用一种封装格式封装起来的&#xff0c;封装格式的作用是什么呢&#xff1f;一般视频文件里不光有视频&#xff0c;还有音频&#xff0c;封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式&#…

Spark SQL 中DataFrame DSL的使用

在上一篇文章中已经大致说明了DataFrame APi,下面我们具体介绍DataFrame DSL的使用。DataFrame DSL是一种命令式编写Spark SQL的方式&#xff0c;使用的是一种类sql的风格语法。 文章链接&#xff1a; 一、单词统计案例引入 import org.apache.spark.sql.{DataFrame, SaveMod…

STL--string类的at()函数

at()成员函数介绍 获取索引位置的引用,和[]的作用类似,唯一的区别是[]不判断下标是否越界,at中的索引(下标)如果越界会引发异常。可以把at理解为安全版本的[]。 int main() {array<int, 5>a{1,2,3,4,5};try{//cout << a[5] << endl; //程序崩溃,但没有异常…

如何创建 Gala Games 账户:解决 Cloudflare 验证指南 2024

Gala Games 站在数字娱乐新时代的前沿&#xff0c;将区块链技术与游戏相结合&#xff0c;重新定义了所有权和奖励。本文将引导您创建 Gala Games 账户并使用 CapSolver 解决 Cloudflare 验证难题&#xff0c;确保您顺利进入这一创新的生态系统。 什么是 Gala Games&#xff1f…

Python操作MySQL实战

文章导读 本文用于巩固Pymysql操作MySQL与MySQL操作的知识点&#xff0c;实现一个简易的音乐播放器&#xff0c;拟实现的功能包括&#xff1a;用户登录&#xff0c;窗口显示&#xff0c;加载本地音乐&#xff0c;加入和删除播放列表&#xff0c;播放音乐。 点击此处获取参考源…

安装cad新版本比如2023之后,cad2016就打开闪退,每次重启可以进一次,出现许可无效弹窗

第一步&#xff0c;先右键弹窗的cad图标&#xff0c;打开文件位置&#xff0c;复制他的安装目录。比如这样 然后点击一下空白处&#xff0c;全选&#xff0c;右键复制一下 第二步&#xff0c;然后打开autoremove最新版本 点击扩展&#xff0c;滚轮往下翻到最下面。点击这个c…

炫酷网页设计:HTML5 + CSS3打造8种心形特效

你以为520过去了&#xff0c;你就逃过一劫了&#xff1f;那不是还有分手呢&#xff0c;那不是还得再找对象呢&#xff0c;那不是还有七夕节呢&#xff0c;那不是还有纪念日呢&#xff0c;那不是还有各种各样的节日呢&#xff0c;所以呀&#xff0c;这8种HTML5 CSS3打造8种心形…

瑞芯微RV1126——交叉编译与移植

一、搭建这个nfs服务挂载 (1) sudo apt install nfs-kernel-server (2) 然后在你的ubuntu创建一个nfs共享目录&#xff1a; (3) sudo /etc/init.d/nfs-kernel-server restart 重启nfs服务 (4) 修改配置文件: sudo vim /etc/exports 在这个配置文件里面添加&#xff1a;/hom…

Visual Studio 调试及快捷键

文章目录 原文连接环境一、调试器的基本使用1、更改执行流2、快速执行某一条代码断点设置条件断点查看内存信息查看调用堆栈查看寄存器信息设置监视断点调试二、快捷键一、窗口快捷键二、查找相关快捷键三、代码快捷键原文连接 【教程】visual studio debug 技巧总结 环境 一…

风控指南:国内车险欺诈呈现四大趋势

目录 车险欺诈呈现内外勾结的团伙化 防范车险欺诈需要多重合作 保险企业需要提升反欺诈能力 监管部门需要加强协同合作 2024年4月11日&#xff0c;国家金融监督管理总局官网发布国家金融监督管理总局关于《反保险欺诈工作办法&#xff08;征求意见稿&#xff09;》公开征求意见…

纯代码如何实现WordPress搜索包含评论内容?

WordPress自带的搜索默认情况下是不包含评论内容的&#xff0c;不过有些WordPress网站评论内容比较多&#xff0c;而且也比较有用&#xff0c;所以想要让用户在搜索时也能够同时搜索到评论内容&#xff0c;那么应该怎么做呢&#xff1f; 网络上很多教程都是推荐安装SearchWP插…

C语言——小知识和小细节18

一、力扣题目 1、题目本体 2、题解 本题目我们使用异或分组的方法来解决。可以在我之前的文章《C语言——操作符CSDN博客》中看一下异或的特点。 由于异或的运算规则为相同为0&#xff0c;不同为1&#xff0c;而且是在二进制补码上进行操作的&#xff0c;我们可以发现的一个…

Java面试真题日常练习

题目&#xff1a;反转字符串 描述&#xff1a;编写一个函数&#xff0c;输入一个字符串&#xff0c;将其反转并返回结果。 解题思路&#xff1a;可以使用两个指针&#xff0c;一个指向字符串的开头&#xff0c;一个指向字符串的末尾&#xff0c;然后不断交换两个指针所指的字符…