From d97c94ffc874ae475196f621aec190f49f8aa41f Mon Sep 17 00:00:00 2001 From: RuoYi Date: Fri, 17 Apr 2026 14:48:40 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=AF=86=E7=A0=81=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89=E9=85=8D=E7=BD=AE=E8=A7=84?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/SysUserController.java | 7 ++ ruoyi-ui/src/store/modules/user.js | 2 + ruoyi-ui/src/utils/passwordRule.js | 71 +++++++++++++++++++ ruoyi-ui/src/views/register.vue | 41 +++++------ ruoyi-ui/src/views/system/user/index.vue | 19 ++--- .../views/system/user/profile/resetPwd.vue | 37 +++++----- sql/{ry_20260402.sql => ry_20260417.sql} | 1 + 7 files changed, 126 insertions(+), 52 deletions(-) create mode 100644 ruoyi-ui/src/utils/passwordRule.js rename sql/{ry_20260402.sql => ry_20260417.sql} (99%) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java index a59c4b48c..6fce9c908 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java @@ -189,11 +189,18 @@ public class SysUserController extends BaseController ajax.put("user", user); ajax.put("roles", roles); ajax.put("permissions", permissions); + ajax.put("pwdChrtype", getSysAccountChrtype()); ajax.put("isDefaultModifyPwd", initPasswordIsModify(user.getPwdUpdateDate())); ajax.put("isPasswordExpired", passwordIsExpiration(user.getPwdUpdateDate())); return ajax; } + // 获取用户密码自定义配置规则 + public String getSysAccountChrtype() + { + return Convert.toStr(configService.selectConfigByKey("sys.account.chrtype"), "0"); + } + // 检查初始密码是否提醒修改 public boolean initPasswordIsModify(Date pwdUpdateDate) { diff --git a/ruoyi-ui/src/store/modules/user.js b/ruoyi-ui/src/store/modules/user.js index 18ccf1c0f..8769ea299 100644 --- a/ruoyi-ui/src/store/modules/user.js +++ b/ruoyi-ui/src/store/modules/user.js @@ -1,5 +1,6 @@ import store from '@/store' import router from '@/router' +import cache from '@/plugins/cache' import { MessageBox, } from 'element-ui' import { login, logout, getInfo, refreshToken } from '@/api/login' import { getToken, setToken, setExpiresIn, removeToken } from '@/utils/auth' @@ -82,6 +83,7 @@ const user = { commit('SET_NAME', user.userName) commit('SET_NICK_NAME', user.nickName) commit('SET_AVATAR', avatar) + cache.session.set('pwrChrtype', res.pwdChrtype) /* 初始密码提示 */ if(res.isDefaultModifyPwd) { MessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { diff --git a/ruoyi-ui/src/utils/passwordRule.js b/ruoyi-ui/src/utils/passwordRule.js new file mode 100644 index 000000000..dd56f81c4 --- /dev/null +++ b/ruoyi-ui/src/utils/passwordRule.js @@ -0,0 +1,71 @@ +/** + * 密码强度规则 + * 根据参数 chrtype 动态生成校验规则 + * + * chrtype 说明: + * 0 - 任意字符(默认) + * 1 - 纯数字(0-9) + * 2 - 纯字母(a-z / A-Z) + * 3 - 字母 + 数字(必须同时包含) + * 4 - 字母 + 数字 + 特殊字符(必须同时包含,特殊字符:~!@#$%^&*()-=_+) + */ +import cache from '@/plugins/cache' + +// 各类型对应的正则、错误提示 +const PWD_RULES = { + '0': { pattern: /^[^<>"'|\\]+$/, message: '密码不能包含非法字符:< > " \' \\ |' }, + '1': { pattern: /^[0-9]+$/, message: '密码只能为数字(0-9)' }, + '2': { pattern: /^[a-zA-Z]+$/, message: '密码只能为英文字母(a-z、A-Z)' }, + '3': { pattern: /^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$/, message: '密码必须同时包含字母和数字' }, + '4': { pattern: /^(?=.*[A-Za-z])(?=.*\d)(?=.*[~!@#$%^&*()\-=_+])[A-Za-z\d~!@#$%^&*()\-=_+]+$/, message: '密码必须同时包含字母、数字和特殊字符(~!@#$%^&*()-=_+)' } +} + +export default { + data() { + return { + // 密码限制类型 + pwdChrType: cache.session.get('pwrChrtype') || '0' + } + }, + computed: { + // 默认密码校验 + pwdValidator() { + const rule = PWD_RULES[this.pwdChrType] || PWD_RULES['0'] + return [ + { required: true, message: '密码不能为空', trigger: 'blur' }, + { min: 6, max: 20, message: '密码长度必须介于 6 和 20 之间', trigger: 'blur' }, + { pattern: rule.pattern, message: rule.message, trigger: 'blur' } + ] + }, + // 校验prompt的inputValidator函数 + pwdPromptValidator() { + const rule = PWD_RULES['0'] + return (value) => { + if (!value || value.length < 6 || value.length > 20) { + return '密码长度必须介于 6 和 20 之间' + } + if (!rule.pattern.test(value)) { + return rule.message + } + } + }, + // 个人中心密码校验 + infoPwdValidator() { + const rule = PWD_RULES[this.pwdChrType] || PWD_RULES['0'] + return [ + { required: true, message: '新密码不能为空', trigger: 'blur' }, + { min: 6, max: 20, message: '新密码长度必须介于 6 和 20 之间', trigger: 'blur' }, + { pattern: rule.pattern, message: rule.message, trigger: 'blur' } + ] + }, + // 注册页面密码校验 + registerPwdValidator() { + const rule = PWD_RULES['0'] + return [ + { required: true, message: '请输入您的密码', trigger: 'blur' }, + { min: 6, max: 20, message: '用户密码长度必须介于 6 和 20 之间', trigger: 'blur' }, + { pattern: rule.pattern, message: rule.message, trigger: 'blur' } + ] + } + } +} diff --git a/ruoyi-ui/src/views/register.vue b/ruoyi-ui/src/views/register.vue index 73f865f3b..6dbfa8743 100644 --- a/ruoyi-ui/src/views/register.vue +++ b/ruoyi-ui/src/views/register.vue @@ -7,7 +7,7 @@ - + import { getCodeImg, register } from "@/api/login" +import passwordRule from "@/utils/passwordRule" import defaultSettings from '@/settings' export default { - name: "Register", + mixins: [passwordRule], data() { - const equalToPassword = (rule, value, callback) => { - if (this.registerForm.password !== value) { - callback(new Error("两次输入的密码不一致")) - } else { - callback() - } - } return { title: process.env.VUE_APP_TITLE, footerContent: defaultSettings.footerContent, @@ -91,24 +85,31 @@ export default { code: "", uuid: "" }, - registerRules: { + loading: false, + captchaEnabled: true + } + }, + computed: { + registerRules() { + return { username: [ { required: true, trigger: "blur", message: "请输入您的账号" }, { min: 2, max: 20, message: '用户账号长度必须介于 2 和 20 之间', trigger: 'blur' } ], - password: [ - { required: true, trigger: "blur", message: "请输入您的密码" }, - { min: 5, max: 20, message: "用户密码长度必须介于 5 和 20 之间", trigger: "blur" }, - { pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" } - ], confirmPassword: [ - { required: true, trigger: "blur", message: "请再次输入您的密码" }, - { required: true, validator: equalToPassword, trigger: "blur" } + { required: true, message: "请再次输入您的密码", trigger: "blur" }, + { + validator: (rule, value, callback) => { + if (this.registerForm.password !== value) { + callback(new Error("两次输入的密码不一致")) + } else { + callback() + } + }, trigger: "blur" + } ], code: [{ required: true, trigger: "change", message: "请输入验证码" }] - }, - loading: false, - captchaEnabled: true + } } }, created() { diff --git a/ruoyi-ui/src/views/system/user/index.vue b/ruoyi-ui/src/views/system/user/index.vue index 7d3f940af..73f4b4908 100644 --- a/ruoyi-ui/src/views/system/user/index.vue +++ b/ruoyi-ui/src/views/system/user/index.vue @@ -116,7 +116,7 @@ - + @@ -181,9 +181,11 @@ import "@riophae/vue-treeselect/dist/vue-treeselect.css" import TreePanel from "@/components/TreePanel" import ExcelImportDialog from "@/components/ExcelImportDialog" import UserViewDrawer from "./view" +import passwordRule from "@/utils/passwordRule" export default { name: "User", + mixins: [passwordRule], dicts: ['sys_normal_disable', 'sys_user_sex'], components: { Treeselect, TreePanel, ExcelImportDialog, UserViewDrawer }, data() { @@ -248,11 +250,6 @@ export default { nickName: [ { required: true, message: "用户昵称不能为空", trigger: "blur" } ], - password: [ - { required: true, message: "用户密码不能为空", trigger: "blur" }, - { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }, - { pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" } - ], email: [ { type: "email", @@ -405,17 +402,11 @@ export default { }, /** 重置密码按钮操作 */ handleResetPwd(row) { - this.$prompt('请输入"' + row.userName + '"的新密码', "提示", { + this.$prompt(`请输入「${row.userName}」的新密码`, "重置密码", { confirmButtonText: "确定", cancelButtonText: "取消", closeOnClickModal: false, - inputPattern: /^.{5,20}$/, - inputErrorMessage: "用户密码长度必须介于 5 和 20 之间", - inputValidator: (value) => { - if (/<|>|"|'|\||\\/.test(value)) { - return "不能包含非法字符:< > \" ' \\\ |" - } - }, + inputValidator: this.pwdPromptValidator }).then(({ value }) => { resetUserPwd(row.userId, value).then(() => { this.$modal.msgSuccess("修改成功,新密码是:" + value) diff --git a/ruoyi-ui/src/views/system/user/profile/resetPwd.vue b/ruoyi-ui/src/views/system/user/profile/resetPwd.vue index acfdff1dc..369e4518c 100644 --- a/ruoyi-ui/src/views/system/user/profile/resetPwd.vue +++ b/ruoyi-ui/src/views/system/user/profile/resetPwd.vue @@ -1,9 +1,9 @@