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 @@
-
+
-
+
@@ -18,35 +18,36 @@