Merge remote-tracking branch 'origin/main' into main

This commit is contained in:
lizhenhua 2024-07-24 19:27:08 +08:00
commit 5f43e35b90
7 changed files with 51 additions and 107 deletions

View File

@ -76,8 +76,9 @@ const user = {
mobile: userInfo.mobile.trim(), mobile: userInfo.mobile.trim(),
uuid: userInfo.uuid, uuid: userInfo.uuid,
code: userInfo.code, code: userInfo.code,
loginType: userInfo.loginType mobileCodeType: userInfo.mobileCodeType
} }
console.log(payload)
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
getPhoneCode(payload).then(res => { getPhoneCode(payload).then(res => {
resolve() resolve()

View File

@ -32,9 +32,8 @@ service.interceptors.request.use(
} }
// 处理GET请求参数并加密 // 处理GET请求参数并加密
if (config.method === 'get' && config.params) { if (config.params) {
let param = tansParams(config.params) let param = tansParams(config.params)
if (param) { if (param) {
param = param.slice(0, -1) param = param.slice(0, -1)
param = encryptCBC(param) param = encryptCBC(param)

View File

@ -102,46 +102,48 @@ export function validPwd(value) {
export function validatePassword(rule, value, callback) { export function validatePassword(rule, value, callback) {
if (!value) { if (!value) {
return callback(new Error('请输入密码')); return callback(new Error('请输入密码'))
} }
const lengthRegex = /^.{8,}$/; const lengthRegex = /^.{8,}$/
const uppercaseRegex = /[A-Z]/; const uppercaseRegex = /[A-Z]/
const lowercaseRegex = /[a-z]/; const lowercaseRegex = /[a-z]/
const digitRegex = /\d/; const digitRegex = /\d/
const specialCharRegex = /[!@#$%^&*(),.?":{}|<>]/; const specialCharRegex = /[!@#$%^&*(),.?":{}|<>]/
if (!lengthRegex.test(value)) {
return callback(new Error('密码必须至少为8个字符'))
}
const checks = [ const checks = [
{ regex: lengthRegex, message: '密码必须至少为8个字符' }, { regex: uppercaseRegex, message: '必须包含至少一个大写字母' },
{ regex: uppercaseRegex, message: '密码必须包含至少一个大写字母' }, { regex: lowercaseRegex, message: '必须包含至少一个小写字母' },
{ regex: lowercaseRegex, message: '密码必须包含至少一个小写字母' }, { regex: digitRegex, message: '必须包含至少一个数字' },
{ regex: digitRegex, message: '密码必须包含至少一个数字' }, { regex: specialCharRegex, message: '必须包含至少一个特殊字符' }
{ regex: specialCharRegex, message: '密码必须包含至少一个特殊字符' } ]
];
let passedChecks = checks.filter(check => check.regex.test(value)).length; let passedChecks = checks.filter(check => check.regex.test(value)).length
console.log(checks.filter(check => check.regex.test(value)))
let requiredChecks; let requiredChecks
switch ('weak') { switch ('strong') {
case 'weak': case 'weak':
requiredChecks = 1; requiredChecks = 1
break; break
case 'medium': case 'medium':
requiredChecks = 2; requiredChecks = 2
break; break
case 'strong': case 'strong':
requiredChecks = 3; requiredChecks = 3
break; break
case 'very-strong': case 'very-strong':
requiredChecks = 4; requiredChecks = 4
break; break
default: default:
return callback(new Error('请选择有效的密码强度')); return callback(new Error('请选择有效的密码强度'))
} }
if (passedChecks < requiredChecks) { if (passedChecks < requiredChecks) {
return callback(new Error(`密码不符合强度要求`)); return callback(new Error(`密码至少包含 ${requiredChecks} 类字符(大写字母,小写字母,数字,特殊字符)`))
} }
callback()
callback();
} }

View File

@ -122,7 +122,7 @@
</template> </template>
<script> <script>
import { getCodeImg, getLoginOptions } from '@/api/login' import { getCodeImg } from '@/api/login'
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
import { encrypt, decrypt } from '@/utils/jsencrypt' import { encrypt, decrypt } from '@/utils/jsencrypt'
import dingding from '@/assets/images/dingding.svg' import dingding from '@/assets/images/dingding.svg'
@ -145,7 +145,8 @@ export default {
mobile: '', mobile: '',
verificationCode: '', verificationCode: '',
uuid: '', uuid: '',
loginType: '' loginType: '',
mobileCodeType: 'login'
}, },
passwordLoginRules: { passwordLoginRules: {
username: [{ required: true, trigger: 'blur', message: '请输入您的账号' }], username: [{ required: true, trigger: 'blur', message: '请输入您的账号' }],
@ -182,7 +183,6 @@ export default {
created() { created() {
this.getCode() this.getCode()
this.getCookie() this.getCookie()
this.fetchLoginOptions()
}, },
methods: { methods: {
getCode() { getCode() {
@ -202,14 +202,6 @@ export default {
this.loginForm.password = password ? decrypt(password) : '' this.loginForm.password = password ? decrypt(password) : ''
this.loginForm.rememberMe = rememberMe === 'true' this.loginForm.rememberMe = rememberMe === 'true'
}, },
fetchLoginOptions() {
getLoginOptions().then(res => {
this.supportsPhoneLogin = res.supportsPhoneLogin
this.supportsEmailLogin = res.supportsEmailLogin
}).catch(err => {
console.error('获取登录选项失败', err)
})
},
handleLogin() { handleLogin() {
this.$refs.loginForm.validate(valid => { this.$refs.loginForm.validate(valid => {
if (valid) { if (valid) {
@ -243,7 +235,6 @@ export default {
this.$message.error('请先填写手机号') this.$message.error('请先填写手机号')
return return
} }
this.loginForm.loginType = this.loginMethod
this.$store.dispatch('GetPhoneCode', this.loginForm) this.$store.dispatch('GetPhoneCode', this.loginForm)
.then(() => { .then(() => {
this.isSendingCode = true this.isSendingCode = true

View File

@ -97,7 +97,7 @@
<script> <script>
import { getCodeImg, register } from '@/api/login' import { getCodeImg, register } from '@/api/login'
import { validatePassword } from '@/utils/validate'
export default { export default {
name: 'Register', name: 'Register',
data() { data() {
@ -135,7 +135,8 @@ export default {
nickName: '', nickName: '',
code: '', code: '',
uuid: '', uuid: '',
loginType: 'register' loginType: 'mobile',
mobileCodeType: 'register'
}, },
registerRules: { registerRules: {
nickName: [ nickName: [
@ -147,7 +148,7 @@ export default {
], ],
password: [ password: [
{ required: true, trigger: 'blur', message: '请输入您的密码' }, { required: true, trigger: 'blur', message: '请输入您的密码' },
{ validator: this.validatePassword, trigger: 'blur' } { validator: validatePassword, trigger: 'blur' }
], ],
confirmPassword: [ confirmPassword: [
{ required: true, trigger: 'blur', message: '请再次输入您的密码' }, { required: true, trigger: 'blur', message: '请再次输入您的密码' },
@ -179,15 +180,15 @@ export default {
this.$refs.registerForm.validate(valid => { this.$refs.registerForm.validate(valid => {
if (valid) { if (valid) {
this.loading = true this.loading = true
this.registerForm.loginType = 'mobile'
register(this.registerForm).then(res => { register(this.registerForm).then(res => {
const username = this.registerForm.username const username = this.registerForm.username
this.$alert(`<font color='red'>恭喜你,您的账号 ${username} 注册成功!</font>`, '系统提示', { this.$alert(`<font color="red">恭喜你,您的账号 ${username} 注册成功!</font>`, '系统提示', {
dangerouslyUseHTMLString: true, dangerouslyUseHTMLString: true,
type: 'success' type: 'success'
}).then(() => { }).then(() => {
this.$router.push('/login') this.$router.push('/login')
}).catch(() => {}) }).catch(() => {
})
}).catch(() => { }).catch(() => {
this.loading = false this.loading = false
if (this.captchaEnabled) { if (this.captchaEnabled) {
@ -209,8 +210,6 @@ export default {
this.$message.error('请先填写手机号') this.$message.error('请先填写手机号')
return return
} }
this.registerForm.loginType = 'register'
this.$store.dispatch('GetPhoneCode', this.registerForm) this.$store.dispatch('GetPhoneCode', this.registerForm)
.then(() => { .then(() => {
this.isSendingCode = true this.isSendingCode = true
@ -246,56 +245,6 @@ export default {
return callback(new Error('必须是有效的电子邮件或电话号码')) return callback(new Error('必须是有效的电子邮件或电话号码'))
} }
callback()
},
//
validatePassword(rule, value, callback) {
if (!value) {
return callback(new Error('请输入密码'))
}
const lengthRegex = /^.{8,}$/
const uppercaseRegex = /[A-Z]/
const lowercaseRegex = /[a-z]/
const digitRegex = /\d/
const specialCharRegex = /[!@#$%^&*(),.?":{}|<>]/
if (!lengthRegex.test(value)) {
return callback(new Error('密码必须至少为8个字符'))
}
const checks = [
{ regex: uppercaseRegex, message: '必须包含至少一个大写字母' },
{ regex: lowercaseRegex, message: '必须包含至少一个小写字母' },
{ regex: digitRegex, message: '必须包含至少一个数字' },
{ regex: specialCharRegex, message: '必须包含至少一个特殊字符' }
]
let passedChecks = checks.filter(check => check.regex.test(value)).length
let requiredChecks
switch ('medium') {
case 'weak':
requiredChecks = 1
break
case 'medium':
requiredChecks = 2
break
case 'strong':
requiredChecks = 3
break
case 'very-strong':
requiredChecks = 4
break
default:
return callback(new Error('请选择有效的密码强度'))
}
if (passedChecks < requiredChecks) {
const messages = checks.map(check => check.message).join('')
return callback(new Error(`密码至少包含 ${requiredChecks} 类字符:${messages}`))
}
callback() callback()
} }
} }

View File

@ -298,7 +298,7 @@ import {
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import Treeselect from '@riophae/vue-treeselect' import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css' import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import { validPwd } from '@/utils/validate' import { validPwd, validatePassword } from '@/utils/validate'
import { hashWithSM3AndSalt } from '@/utils/sm' import { hashWithSM3AndSalt } from '@/utils/sm'
export default { export default {
@ -409,8 +409,7 @@ export default {
], ],
password: [ password: [
{ required: true, message: '密码不能为空', trigger: 'blur' }, { required: true, message: '密码不能为空', trigger: 'blur' },
{ min: 8, max: 20, message: '密码长度在8到20个字符', trigger: 'blur' }, { validator: validatePassword, trigger: 'blur' }
{ validator: this.validatePwd, trigger: 'blur' }
], ],
roleIds: [ roleIds: [
{ required: true, message: '请选择角色', trigger: 'change' } { required: true, message: '请选择角色', trigger: 'change' }
@ -425,7 +424,6 @@ export default {
} }
}, },
created() { created() {
console.log(hashWithSM3AndSalt('1234567890'))
this.getList() this.getList()
this.getDeptTree() this.getDeptTree()
this.getConfigKey('sys.user.initPassword').then(response => { this.getConfigKey('sys.user.initPassword').then(response => {
@ -478,6 +476,10 @@ export default {
}, },
// //
handleApprovalStatus(row) { handleApprovalStatus(row) {
if (row.roles.length === 0) {
this.$modal.msgError('请先分配用户权限')
return;
}
this.$modal.confirm('确认要审批' + row.userName + '"用户吗?').then(function() { this.$modal.confirm('确认要审批' + row.userName + '"用户吗?').then(function() {
console.log({ userId: row.userId }) console.log({ userId: row.userId })
return approvalStatus({ userId: row.userId }) return approvalStatus({ userId: row.userId })

View File

@ -18,6 +18,7 @@
<script> <script>
import { updateUserPwd } from "@/api/system/user"; import { updateUserPwd } from "@/api/system/user";
import { validatePassword } from '@/utils/validate'
export default { export default {
data() { data() {
@ -41,8 +42,7 @@ export default {
], ],
newPassword: [ newPassword: [
{ required: true, message: "新密码不能为空", trigger: "blur" }, { required: true, message: "新密码不能为空", trigger: "blur" },
{ min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }, { validator: validatePassword, trigger: 'blur' }
{ pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }
], ],
confirmPassword: [ confirmPassword: [
{ required: true, message: "确认密码不能为空", trigger: "blur" }, { required: true, message: "确认密码不能为空", trigger: "blur" },