密码正则校验

This commit is contained in:
yy 2024-06-03 14:10:20 +08:00
parent 04c78723ee
commit a44ae3433d
4 changed files with 218 additions and 205 deletions

View File

@ -1,53 +1,59 @@
<template> <template>
<div class="user-info-part"> <div class="user-info-part">
<div class="header-box"> <div class="header-box">
<h3>个人信息</h3> <h3>个人信息</h3>
<el-icon @click="close"> <el-icon @click="close">
<Close/> <Close/>
</el-icon> </el-icon>
</div>
<div class="custom-tabs">
<div class="tabs-item" v-for="(item, index) in ['基础信息', '安全信息']" :key="item"
:class="{ 'active': tabActive === index }" @click="tabActive = index">{{ item }}
</div>
</div>
<el-form ref="formRef" :model="formData" :rules="rules" label-width="60">
<template v-if="tabActive === 0">
<el-upload action="#" :limit="1" :http-request="handleUpload" ref="uploadRef"
:show-file-list="false" :on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload">
<img v-if="formData.avatar" :src="'/api' + formData.avatar" class="avatar"/>
<img v-else src="@/assets/imgs/home/avatar.png" class="avatar"/>
</el-upload>
<el-form-item label="用户名" prop="account">
<el-input v-model="formData.account" disabled></el-input>
</el-form-item>
<el-form-item label="电话" prop="phone">
<el-input v-model="formData.phone" placeholder="请输入手机号"></el-input>
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input v-model="formData.name" placeholder="请输入姓名"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="mailbox">
<el-input v-model="formData.mailbox" placeholder="请输入邮箱"></el-input>
</el-form-item>
</template>
<template v-else>
<el-form-item label="密码" prop="password" label-width="100">
<el-input v-model="formData.password" type="password" show-password
placeholder="请输入密码"></el-input>
</el-form-item>
<el-form-item label="新密码" prop="newPassword" label-width="100">
<el-input v-model="formData.newPassword" type="password" show-password
placeholder="请输入新密码"></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="confirmPassword" label-width="100">
<el-input v-model="formData.confirmPassword" type="password" show-password
placeholder="请输入新密码"></el-input>
</el-form-item>
</template>
</el-form>
<div class="submit-box">
<el-button type="primary" @click="submitForm">{{
tabActive === 0 ? '更新个人信息' : '修改密码'
}}
</el-button>
</div>
</div> </div>
<div class="custom-tabs">
<div class="tabs-item" v-for="(item, index) in ['基础信息', '安全信息']" :key="item"
:class="{ 'active': tabActive === index }" @click="tabActive = index">{{ item }}
</div>
</div>
<el-form ref="formRef" :model="formData" :rules="rules" label-width="60">
<template v-if="tabActive === 0">
<el-upload action="#" :limit="1" :http-request="handleUpload" ref="uploadRef"
:show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
<img v-if="formData.avatar" :src="'/api' + formData.avatar" class="avatar"/>
<img v-else src="@/assets/imgs/home/avatar.png" class="avatar"/>
</el-upload>
<el-form-item label="用户名" prop="account">
<el-input v-model="formData.account" disabled></el-input>
</el-form-item>
<el-form-item label="电话" prop="phone">
<el-input v-model="formData.phone" placeholder="请输入手机号"></el-input>
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input v-model="formData.name" placeholder="请输入姓名"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="mailbox">
<el-input v-model="formData.mailbox" placeholder="请输入邮箱"></el-input>
</el-form-item>
</template>
<template v-else>
<el-form-item label="密码" prop="password" label-width="100">
<el-input v-model="formData.password" type="password" show-password placeholder="请输入密码"></el-input>
</el-form-item>
<el-form-item label="新密码" prop="newPassword" label-width="100">
<el-input v-model="formData.newPassword" type="password" show-password placeholder="请输入新密码"></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="confirmPassword" label-width="100">
<el-input v-model="formData.confirmPassword" type="password" show-password
placeholder="请输入新密码"></el-input>
</el-form-item>
</template>
</el-form>
<div class="submit-box">
<el-button type="primary" @click="submitForm">{{ tabActive === 0 ? '更新个人信息' : '修改密码' }}</el-button>
</div>
</div>
</template> </template>
<script lang='ts' setup> <script lang='ts' setup>
@ -57,6 +63,7 @@ import {ElMessage} from 'element-plus'
import {editPassword, getUserInfo, updateUserInfo} from "@/api/user"; import {editPassword, getUserInfo, updateUserInfo} from "@/api/user";
import {handleHttpUpload} from "@/api/file-upload"; import {handleHttpUpload} from "@/api/file-upload";
import {useUserStore} from "@/stores/user-info-store"; import {useUserStore} from "@/stores/user-info-store";
import {REGEXP} from "@/enum/log-enum";
const emit = defineEmits(['close']) const emit = defineEmits(['close'])
@ -66,199 +73,199 @@ const formRef = ref()
const uploadRef = ref() const uploadRef = ref()
onMounted(() => { onMounted(() => {
getUserInfo().then((res: any) => { getUserInfo().then((res: any) => {
if (res.data) { if (res.data) {
formData.value.account = res.data.sysUser.username formData.value.account = res.data.sysUser.username
formData.value.name = res.data.sysUser.name formData.value.name = res.data.sysUser.name
formData.value.phone = res.data.sysUser.phone formData.value.phone = res.data.sysUser.phone
formData.value.mailbox = res.data.sysUser.email formData.value.mailbox = res.data.sysUser.email
formData.value.avatar = res.data.sysUser.avatar formData.value.avatar = res.data.sysUser.avatar
} }
}) })
}) })
const validatePassword = (rule: any, value: any, callback: any) => { const validatePassword = (rule: any, value: any, callback: any) => {
if (formData.value.newPassword !== formData.value.confirmPassword) { if (formData.value.newPassword !== formData.value.confirmPassword) {
callback(new Error('两次密码不一致')) callback(new Error('两次密码不一致'))
} else { } else {
callback() callback()
} }
} }
// //
const validatorPassword = (rule: any, value: any, callback: any) => { const validatorPassword = (rule: any, value: any, callback: any) => {
if (value.length >= 6) { if (!(new RegExp(REGEXP.PASSWORD).test(value))) {
callback(); callback("8~16位字母或数字区分大小写");
} else { } else {
callback(new Error('密码长度至少6位')); callback()
} }
} }
const validatorPhone = (rule: any, value: any, callback: any) => { const validatorPhone = (rule: any, value: any, callback: any) => {
var isPhone = /^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/;
if (value.indexOf('****') >= 0) {
return callback().trim();
}
if (value.indexOf('****') >= 0) { if (!new RegExp(REGEXP.PHONE).test(value)) {
return callback().trim(); callback(new Error('请输入合法手机号'));
} } else {
callback();
if (!isPhone.test(value)) { }
callback(new Error('请输入合法手机号'));
} else {
callback();
}
} }
const rules = reactive({ const rules = reactive({
phone: [ phone: [
{required: true, validator: validatorPhone, trigger: 'blur'}, {required: true, validator: validatorPhone, trigger: 'blur'},
], ],
name: [ name: [
{required: true, message: '请输入姓名', trigger: 'blur'}, {required: true, message: '请输入姓名', trigger: 'blur'},
], ],
mailbox: [ mailbox: [
{type: 'email', message: '邮箱格式不正确', trigger: ['blur', 'change']}, {type: 'email', message: '邮箱格式不正确', trigger: ['blur', 'change']},
], ],
password: [ password: [
{required: true, validator: validatorPassword, trigger: 'change'}, {required: true, validator: validatorPassword, trigger: 'change'},
], ],
newPassword: [ newPassword: [
{required: true, validator: validatorPassword, trigger: 'change'}, {required: true, validator: validatorPassword, trigger: 'change'},
//{ validator: validatePassword, trigger: 'blur' } //{ validator: validatePassword, trigger: 'blur' }
], ],
confirmPassword: [ confirmPassword: [
{required: true, message: '请输入密码', trigger: 'change'}, {required: true, message: '请输入密码', trigger: 'change'},
{validator: validatePassword, trigger: 'blur'} {required: true, validator: validatorPassword, trigger: 'change'},
] {validator: validatePassword, trigger: 'blur'}
]
}) })
const tabActive = ref(0) const tabActive = ref(0)
const formData = ref({ const formData = ref({
avatar: '', avatar: '',
account: "", account: "",
phone: '', phone: '',
name: "", name: "",
mailbox: '', mailbox: '',
password: '', password: '',
newPassword: '', newPassword: '',
confirmPassword: '' confirmPassword: ''
}) })
const close = () => { const close = () => {
emit('close') emit('close')
} }
function handleAvatarSuccess(uploadFile: any) { function handleAvatarSuccess(uploadFile: any) {
} }
function handleUpload(options: any) { function handleUpload(options: any) {
handleHttpUpload(options).then((res: any) => { handleHttpUpload(options).then((res: any) => {
if (res && res.code == 0) { if (res && res.code == 0) {
formData.value.avatar = res.data.url formData.value.avatar = res.data.url
const param = { const param = {
avatar: formData.value.avatar, avatar: formData.value.avatar,
username: formData.value.account username: formData.value.account
} }
updateUserInfo(param).then((res: any) => { updateUserInfo(param).then((res: any) => {
uploadRef.value.clearFiles(); uploadRef.value.clearFiles();
if (res && res.code != 0) { if (res && res.code != 0) {
ElMessage.error(res.msg) ElMessage.error(res.msg)
}
})
} else {
ElMessage.error('图片格式错误')
} }
})
} else {
ElMessage.error('图片格式错误')
}
}).catch(err => { }).catch(err => {
ElMessage.error('图片格式错误') ElMessage.error('图片格式错误')
options.onError(err); options.onError(err);
}) })
} }
const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => { const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
if (rawFile.type !== 'image/jpeg') { if (rawFile.type !== 'image/jpeg') {
ElMessage.error('图片必须为jpg格式!') ElMessage.error('图片必须为jpg格式!')
return false return false
} else if (rawFile.size / 1024 / 1024 > 2) { } else if (rawFile.size / 1024 / 1024 > 2) {
ElMessage.error('图片大小不得超过2MB!') ElMessage.error('图片大小不得超过2MB!')
return false return false
} }
return true return true
} }
const submitForm = async () => { const submitForm = async () => {
await formRef.value.validate((valid: any, fields: any) => { await formRef.value.validate((valid: any, fields: any) => {
if (valid) { if (valid) {
// console.log('submit!') // console.log('submit!')
// //
useUserStore().setlogin('name', formData.value.name) useUserStore().setlogin('name', formData.value.name)
if (tabActive.value == 0) { if (tabActive.value == 0) {
const param = { const param = {
name: formData.value.name, name: formData.value.name,
phone: formData.value.phone, phone: formData.value.phone,
email: formData.value.mailbox, email: formData.value.mailbox,
username: formData.value.account username: formData.value.account
}
updateUserInfo(param).then((res: any) => {
if (res && res.code == 0) {
ElMessage.success('更新成功')
close()
} else {
ElMessage.error(res.msg)
}
})
} else {
editPassword({
password: formData.value.password,
newpassword1: formData.value.newPassword
}).then((res: any) => {
if (res && res.code == 0) {
formRef.value.resetFields(['password', 'newPassword', 'confirmPassword'])
ElMessage.success("修改密码成功")
close()
} else {
ElMessage.error(res.msg)
}
})
}
} else {
// console.log('error submit!', fields)
} }
updateUserInfo(param).then((res: any) => { })
if (res && res.code == 0) {
ElMessage.success('更新成功')
close()
} else {
ElMessage.error(res.msg)
}
})
} else {
editPassword({
password: formData.value.password,
newpassword1: formData.value.newPassword
}).then((res: any) => {
if (res && res.code == 0) {
formRef.value.resetFields(['password', 'newPassword', 'confirmPassword'])
ElMessage.success("修改密码成功")
close()
} else {
ElMessage.error(res.msg)
}
})
}
} else {
// console.log('error submit!', fields)
}
})
} }
</script> </script>
<style lang='scss' scoped> <style lang='scss' scoped>
.user-info-part { .user-info-part {
width: 100%;
height: 100%;
padding: 30px;
.header-box {
width: 100%; width: 100%;
height: 50px; height: 100%;
display: flex; padding: 30px;
justify-content: space-between;
align-items: center;
h3 { .header-box {
color: $main-color; width: 100%;
font-size: 20px; height: 50px;
display: flex;
justify-content: space-between;
align-items: center;
h3 {
color: $main-color;
font-size: 20px;
}
.el-icon {
cursor: pointer;
color: #606266;
}
} }
.el-icon { img.avatar {
cursor: pointer; width: 128px;
color: #606266; height: 148px;
object-fit: contain;
margin: 0 0 20px 60px;
} }
}
img.avatar { .submit-box {
width: 128px; padding-left: 60px;
height: 148px; }
object-fit: contain;
margin: 0 0 20px 60px;
}
.submit-box {
padding-left: 60px;
}
} }
</style> </style>

View File

@ -5,3 +5,9 @@ export enum LogTypeEnum {
MODIFY = "3", MODIFY = "3",
EXCEPTION = '4', EXCEPTION = '4',
} }
export enum REGEXP {
PASSWORD = '^[a-zA-Z0-9]{8,16}$',
ACCOUNT = '^[a-zA-Z0-9]{2,16}$',
PHONE = '^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$'
}

View File

@ -82,7 +82,8 @@
<el-form ref="registerFormRef" :model="registerParams" :rules="registerRules" label-width="100"> <el-form ref="registerFormRef" :model="registerParams" :rules="registerRules" label-width="100">
<el-form-item label="用户名" prop="username"> <el-form-item label="用户名" prop="username">
<el-input v-model="registerParams.username" placeholder="请输入用户名2~16位字母或数字区分大小写"></el-input> <el-input v-model="registerParams.username"
placeholder="请输入用户名2~16位字母或数字区分大小写"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="密码" prop="password"> <el-form-item label="密码" prop="password">
<el-input v-model="registerParams.password" type="password" show-password <el-input v-model="registerParams.password" type="password" show-password
@ -143,6 +144,7 @@ import SliderVerify from "@/components/SliderVerify/index.vue";
import * as loginApi from "@/api/login"; import * as loginApi from "@/api/login";
import {Session} from "@/utils/storage"; import {Session} from "@/utils/storage";
import * as hospitalApi from "@/api/hospital"; import * as hospitalApi from "@/api/hospital";
import {REGEXP} from "@/enum/log-enum";
// //
@ -256,7 +258,7 @@ onMounted(() => {
}) })
function validatePass2(rule: any, value: any, callback: any) { function validatePass2(rule: any, value: any, callback: any) {
if (!(/^[a-zA-Z0-9]{8,16}$/.test(value))) { if (!(new RegExp(REGEXP.PASSWORD).test(value))) {
callback("8~16位字母或数字区分大小写"); callback("8~16位字母或数字区分大小写");
} else if (value !== registerParams.value.password) { } else if (value !== registerParams.value.password) {
callback(new Error('两次密码不一致')); callback(new Error('两次密码不一致'));
@ -266,7 +268,7 @@ function validatePass2(rule: any, value: any, callback: any) {
} }
function validateAccount(rule: any, value: any, callback: any) { function validateAccount(rule: any, value: any, callback: any) {
if (!(/^[a-zA-Z0-9]{2,16}$/.test(value))) { if (!(new RegExp(REGEXP.ACCOUNT).test(value))) {
callback("2~16位字母或数字区分大小写"); callback("2~16位字母或数字区分大小写");
} else { } else {
callback() callback()

View File

@ -70,6 +70,7 @@ import {onMounted, reactive, ref, toRefs, watch} from 'vue'
import {ElMessage, ElMessageBox} from 'element-plus' import {ElMessage, ElMessageBox} from 'element-plus'
import {getRoleList} from "@/api/role"; import {getRoleList} from "@/api/role";
import {addUser, updateUI} from "@/api/user"; import {addUser, updateUI} from "@/api/user";
import {REGEXP} from "@/enum/log-enum";
const emit = defineEmits(['close', 'save']) const emit = defineEmits(['close', 'save'])
@ -80,13 +81,10 @@ const props = defineProps({
const roleOption = ref<any>([]) const roleOption = ref<any>([])
const validatorPhone = (rule: any, value: any, callback: any) => { const validatorPhone = (rule: any, value: any, callback: any) => {
var isPhone = /^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/;
if (value.indexOf('****') >= 0) { if (value.indexOf('****') >= 0) {
return callback().trim(); return callback().trim();
} }
if (!isPhone.test(value)) { if (!new RegExp(REGEXP.PHONE).test(value)) {
callback(new Error('请输入合法手机号')); callback(new Error('请输入合法手机号'));
} else { } else {
callback(); callback();
@ -149,7 +147,7 @@ defineExpose({
}) })
function validatePass2(rule: any, value: any, callback: any) { function validatePass2(rule: any, value: any, callback: any) {
if (!(/^[a-zA-Z0-9]{8,16}$/.test(value))) { if (!(new RegExp(REGEXP.PASSWORD).test(value))) {
callback("8~16位字母或数字区分大小写"); callback("8~16位字母或数字区分大小写");
} else if (value !== formData.value.password) { } else if (value !== formData.value.password) {
callback(new Error('两次密码不一致')); callback(new Error('两次密码不一致'));
@ -159,7 +157,7 @@ function validatePass2(rule: any, value: any, callback: any) {
} }
function validateAccount(rule: any, value: any, callback: any) { function validateAccount(rule: any, value: any, callback: any) {
if (!(/^[a-zA-Z0-9]{2,16}$/.test(value))) { if (!(new RegExp(REGEXP.ACCOUNT).test(value))) {
callback("2~16位字母或数字区分大小写"); callback("2~16位字母或数字区分大小写");
} else { } else {
callback() callback()