BUG修改 以及新增 密码加密

This commit is contained in:
a0049873 2022-06-24 17:58:43 +08:00
parent 4f36fdbc0c
commit a21a0490e1
10 changed files with 265 additions and 57 deletions

View File

@ -56,6 +56,7 @@
"@vue/cli-service": "^4.4.6",
"@vue/eslint-config-standard": "^5.1.2",
"babel-eslint": "^10.1.0",
"crypto-js": "^4.1.1",
"element-theme-chalk": "^2.13.2",
"eslint": "^7.5.0",
"eslint-plugin-import": "^2.22.0",

View File

@ -25,7 +25,7 @@ t.choose = '请选择'
t.fileName = '文件名'
t.design = '在线设计'
t.preview = '预览'
t.reset='重置'
t.reset = '重置'
t.prompt = {}
t.prompt.title = '提示'
@ -36,6 +36,7 @@ t.prompt.deleteBatch = '请选择删除项'
t.validate = {}
t.validate.required = '必填项不能为空'
t.validate.pwdStrength = '密码需包含字母、数字、标点符号,并超过8位'
t.validate.format = '{attr}格式错误'
t.upload = {}
@ -547,36 +548,32 @@ t.notice.disconnect = '连接断开'
t.notice.disconnectMessage = 'WebSocket连接已断开请检查网络'
t.projectList = {}
t.projectList.projectName='项目名称'
t.projectList.projectUnit='申请单位'
t.projectList.department='责任处室'
t.projectList.applydate='申请日期'
t.projectList.district='所属区市'
t.projectList.contacts='业务联系人'
t.projectList.contactstel='业务联系人电话'
t.projectList.technology='技术联系人电话'
t.projectList.technologytel='技术联系人电话'
t.dataresources={}
t.dataresources.componentType="组件类型"
t.dataresources.componentName="组件名称"
t.dataresources.putOnDate="上架时间"
t.dataresources.resourcesName="数据资源名称"
t.dataresources.resourcesCode="数据资源代码"
t.dataresources.resourcesProvide="数据资源提供方"
t.dataresources.resourcesAbstract="数据资源摘要"
t.dataresources.associatedApplication="关联应用"
t.infrastructure={}
t.infrastructure.resourceCategory="资源类别"
t.infrastructure.resourceName="摄像头名称"
t.infrastructure.district="所在区市"
t.infrastructure.street="所在街道"
t.infrastructure.department="所属部门"
t.infrastructure.associatedApplication="关联应用"
t.projectList.projectName = '项目名称'
t.projectList.projectUnit = '申请单位'
t.projectList.department = '责任处室'
t.projectList.applydate = '申请日期'
t.projectList.district = '所属区市'
t.projectList.contacts = '业务联系人'
t.projectList.contactstel = '业务联系人电话'
t.projectList.technology = '技术联系人电话'
t.projectList.technologytel = '技术联系人电话'
t.dataresources = {}
t.dataresources.componentType = '组件类型'
t.dataresources.componentName = '组件名称'
t.dataresources.putOnDate = '上架时间'
t.dataresources.resourcesName = '数据资源名称'
t.dataresources.resourcesCode = '数据资源代码'
t.dataresources.resourcesProvide = '数据资源提供方'
t.dataresources.resourcesAbstract = '数据资源摘要'
t.dataresources.associatedApplication = '关联应用'
t.infrastructure = {}
t.infrastructure.resourceCategory = '资源类别'
t.infrastructure.resourceName = '摄像头名称'
t.infrastructure.district = '所在区市'
t.infrastructure.street = '所在街道'
t.infrastructure.department = '所属部门'
t.infrastructure.associatedApplication = '关联应用'
export default t

58
back/src/utils/crypto.js Normal file
View File

@ -0,0 +1,58 @@
/*
* @Author: hisense.liangjunhua
* @Date: 2022-06-24 16:00:58
* @LastEditors: hisense.liangjunhua
* @LastEditTime: 2022-06-24 16:44:28
* @Description: 告诉大家这是什么
*/
import CryptoJS from 'crypto-js/crypto-js'
// 默认的 KEY 与 iv 与后端保持一致 ,不采用后端传值密钥 上上下下左右左右BABA 一往无前虎山行拨开云雾见光明梦里花开牡丹亭幻想成真歌舞升平
const KEY = CryptoJS.enc.Utf8.parse('YwwqhsxBkywjgm01') // 密钥
const IV = CryptoJS.enc.Utf8.parse('SSXXZYZYBABA30TM') // 偏移量
/**
* AES加密 字符串 key iv 返回base64
*/
export function Encrypt(word, keyStr, ivStr) {
let key = KEY
let iv = IV
if (keyStr) {
key = CryptoJS.enc.Utf8.parse(keyStr)
iv = CryptoJS.enc.Utf8.parse(ivStr)
}
const srcs = CryptoJS.enc.Utf8.parse(word)
var encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding,
})
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
}
/**
* AES 解密 字符串 key iv 返回base64
*
*/
export function Decrypt(word, keyStr, ivStr) {
let key = KEY
let iv = IV
if (keyStr) {
key = CryptoJS.enc.Utf8.parse(keyStr)
iv = CryptoJS.enc.Utf8.parse(ivStr)
}
const base64 = CryptoJS.enc.Base64.parse(word)
const src = CryptoJS.enc.Base64.stringify(base64)
var decrypt = CryptoJS.AES.decrypt(src, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding,
})
var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
return decryptedStr.toString()
}

View File

@ -1,3 +1,10 @@
<!--
* @Author: hisense.liangjunhua
* @Date: 2022-06-23 16:41:46
* @LastEditors: hisense.liangjunhua
* @LastEditTime: 2022-06-24 17:51:42
* @Description: 告诉大家这是什么
-->
<template>
<el-dialog
:visible.sync="visible"
@ -13,7 +20,7 @@
<el-input v-model="dataForm.password" type="password" :placeholder="$t('updatePassword.password')"></el-input>
</el-form-item>
<el-form-item prop="newPassword" :label="$t('updatePassword.newPassword')">
<el-input v-model="dataForm.newPassword" type="password" :placeholder="$t('updatePassword.newPassword')"></el-input>
<el-input v-model="dataForm.newPassword" type="password" :placeholder="$t('updatePassword.newPassword')" @input="changeInput"></el-input>
</el-form-item>
<el-form-item prop="confirmPassword" :label="$t('updatePassword.confirmPassword')">
<el-input v-model="dataForm.confirmPassword" type="password" :placeholder="$t('updatePassword.confirmPassword')"></el-input>
@ -28,6 +35,7 @@
<script>
import debounce from 'lodash/debounce'
import { Encrypt } from '@/utils/crypto'
import { clearLoginInfo } from '@/utils'
export default {
data () {
@ -42,6 +50,28 @@ export default {
},
computed: {
dataRule () {
var validatePassword = (rule, value, callback) => {
if (!value) {
this.showLevel = false
return callback(new Error(this.$t('validate.pwdStrength')))
}
if (value.length < 8) {
this.showLevel = false
return callback(new Error(this.$t('validate.pwdStrength')))
}
const num = /^.*[0-9]+.*/
const low = /^.*[a-z]+.*/
const up = /^.*[A-Z]+.*/
const spe = /^.*[^a-zA-Z0-9]+.*/
console.log('包含数字', num.test(value), '包含字母', low.test(value), up.test(value), '包含特殊符号', spe.test(value))
if (!(num.test(value) && (low.test(value) || up.test(value)) && spe.test(value))) {
return callback(new Error(this.$t('validate.pwdStrength')))
}
// if (!this.dataForm.id && !/\S/.test(value)) {
// return callback(new Error(this.$t('validate.required')))
// }
callback()
}
var validateConfirmPassword = (rule, value, callback) => {
if (this.dataForm.newPassword !== value) {
return callback(new Error(this.$t('updatePassword.validate.confirmPassword')))
@ -53,7 +83,8 @@ export default {
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
],
newPassword: [
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
{ required: true, message: this.$t('validate.required'), trigger: 'blur' },
{ validator: validatePassword, trigger: 'blur' }
],
confirmPassword: [
{ required: true, message: this.$t('validate.required'), trigger: 'blur' },
@ -63,19 +94,33 @@ export default {
}
},
methods: {
changeInput (value) {
if (value !== value.replace(/ /g, '')) {
this.$message({
message: '密码中不允许存在空格!',
type: 'warning'
})
this.dataForm.newPassword = value.replace(/ /g, '')
// console.log('=============>', value)
}
},
init () {
this.visible = true
this.$nextTick(() => {
this.$refs['dataForm'].resetFields()
this.$refs.dataForm.resetFields()
})
},
//
dataFormSubmitHandle: debounce(function () {
this.$refs['dataForm'].validate((valid) => {
this.$refs.dataForm.validate((valid) => {
if (!valid) {
return false
}
this.$http.put('/sys/user/password', this.dataForm).then(({ data: res }) => {
this.$http.put('/sys/user/password', {
confirmPassword: Encrypt(this.dataForm.confirmPassword),
newPassword: Encrypt(this.dataForm.newPassword),
password: Encrypt(this.dataForm.password)
}).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
@ -91,7 +136,7 @@ export default {
})
}).catch(() => {})
})
}, 1000, { 'leading': true, 'trailing': false })
}, 1000, { leading: true, trailing: false })
}
}
</script>

View File

@ -7,10 +7,10 @@
<el-form-item prop="deptName" :label="$t('user.deptName')">
<ren-dept-tree v-model="dataForm.deptId" :placeholder="$t('dept.title')" :dept-name.sync="dataForm.deptName"></ren-dept-tree>
</el-form-item>
<el-form-item prop="password" :label="$t('user.password')" :class="{ 'is-required': !dataForm.id }" auto-complete="new-password">
<el-input v-model="dataForm.password" type="password" :placeholder="$t('user.password')" auto-complete="new-password"></el-input>
<el-form-item prop="password" :label="$t('user.password')" :class="{ 'is-required': !dataForm.id }" auto-complete="new-password" v-if="!dataForm.id">
<el-input v-model="dataForm.password" type="password" :placeholder="$t('user.password')" auto-complete="new-password" @input="changeInput"></el-input>
</el-form-item>
<el-form-item prop="confirmPassword" :label="$t('user.confirmPassword')" :class="{ 'is-required': !dataForm.id }">
<el-form-item prop="confirmPassword" :label="$t('user.confirmPassword')" :class="{ 'is-required': !dataForm.id }" v-if="!dataForm.id">
<el-input v-model="dataForm.confirmPassword" type="password" :placeholder="$t('user.confirmPassword')"></el-input>
</el-form-item>
<el-form-item prop="realName" :label="$t('user.realName')">
@ -51,6 +51,7 @@
<script>
import debounce from 'lodash/debounce'
import { Encrypt } from '@/utils/crypto'
import { isEmail, isMobile } from '@/utils/validate'
export default {
data () {
@ -79,9 +80,25 @@ export default {
computed: {
dataRule () {
var validatePassword = (rule, value, callback) => {
if (!this.dataForm.id && !/\S/.test(value)) {
return callback(new Error(this.$t('validate.required')))
if (!value) {
this.showLevel = false
return callback(new Error(this.$t('validate.pwdStrength')))
}
if (value.length < 8) {
this.showLevel = false
return callback(new Error(this.$t('validate.pwdStrength')))
}
const num = /^.*[0-9]+.*/
const low = /^.*[a-z]+.*/
const up = /^.*[A-Z]+.*/
const spe = /^.*[^a-zA-Z0-9]+.*/
console.log('包含数字', num.test(value), '包含字母', low.test(value), up.test(value), '包含特殊符号', spe.test(value))
if (!(num.test(value) && (low.test(value) || up.test(value)) && spe.test(value))) {
return callback(new Error(this.$t('validate.pwdStrength')))
}
// if (!this.dataForm.id && !/\S/.test(value)) {
// return callback(new Error(this.$t('validate.required')))
// }
callback()
}
var validateConfirmPassword = (rule, value, callback) => {
@ -131,6 +148,16 @@ export default {
}
},
methods: {
changeInput (value) {
if (value !== value.replace(/ /g, '')) {
this.$message({
message: '密码中不允许存在空格!',
type: 'warning'
})
this.dataForm.password = value.replace(/ /g, '')
// console.log('=============>', value)
}
},
init () {
this.visible = true
this.dataForm.deptId = ''
@ -192,6 +219,10 @@ export default {
if (!valid) {
return false
}
this.dataForm.password = Encrypt(this.dataForm.password)
if (this.dataForm.id) {
delete this.dataForm.password
}
this.$http[!this.dataForm.id ? 'post' : 'put']('/sys/user', {
...this.dataForm,
roleIdList: [

View File

@ -59,6 +59,7 @@
<script>
import Cookies from 'js-cookie'
import { Encrypt } from '@/utils/crypto'
import debounce from 'lodash/debounce'
import { messages } from '@/i18n'
import { getUUID } from '@/utils'
@ -105,7 +106,11 @@ export default {
if (!valid) {
return false
}
this.$http.get('/login', { params: this.dataForm }).then(({ data: res }) => {
if (this.dataForm.password !== this.dataForm.password.trim()) {
this.$message.error('登陆失败,用户名或密码错误!')
return
}
this.$http.get('/login', { params: { username: this.dataForm.username, password: Encrypt(this.dataForm.password) } }).then(({ data: res }) => {
if (res.code !== 0) {
this.getCaptcha()
return this.$message.error(res.msg)

View File

@ -56,6 +56,7 @@
"body-parser": "^1.19.0",
"chalk": "^4.1.1",
"chokidar": "^3.5.2",
"crypto-js": "^4.1.1",
"eslint": "^7.30.0",
"eslint-plugin-prettier": "^3.4.0",
"eslint-plugin-vue": "^7.13.0",

58
front/src/utils/crypto.js Normal file
View File

@ -0,0 +1,58 @@
/*
* @Author: hisense.liangjunhua
* @Date: 2022-06-24 16:00:58
* @LastEditors: hisense.liangjunhua
* @LastEditTime: 2022-06-24 16:44:28
* @Description: 告诉大家这是什么
*/
import CryptoJS from 'crypto-js/crypto-js'
// KEY iv BABA
const KEY = CryptoJS.enc.Utf8.parse('YwwqhsxBkywjgm01') //
const IV = CryptoJS.enc.Utf8.parse('SSXXZYZYBABA30TM') //
/**
* AES加密 字符串 key iv 返回base64
*/
export function Encrypt(word, keyStr, ivStr) {
let key = KEY
let iv = IV
if (keyStr) {
key = CryptoJS.enc.Utf8.parse(keyStr)
iv = CryptoJS.enc.Utf8.parse(ivStr)
}
const srcs = CryptoJS.enc.Utf8.parse(word)
var encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding,
})
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
}
/**
* AES 解密 字符串 key iv 返回base64
*
*/
export function Decrypt(word, keyStr, ivStr) {
let key = KEY
let iv = IV
if (keyStr) {
key = CryptoJS.enc.Utf8.parse(keyStr)
iv = CryptoJS.enc.Utf8.parse(ivStr)
}
const base64 = CryptoJS.enc.Base64.parse(word)
const src = CryptoJS.enc.Base64.stringify(base64)
var decrypt = CryptoJS.AES.decrypt(src, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding,
})
var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
return decryptedStr.toString()
}

View File

@ -2,7 +2,7 @@
* @Author: hisense.liangjunhua
* @Date: 2022-06-19 10:15:33
* @LastEditors: hisense.liangjunhua
* @LastEditTime: 2022-06-24 10:46:23
* @LastEditTime: 2022-06-24 15:04:52
* @Description: 告诉大家这是什么
-->
<template>
@ -38,6 +38,7 @@
import { ref } from 'vue'
// import { count } from '@/api/file'
import { dataResourceInfo } from '@/api/capabilityCloud'
import { dataTool } from 'echarts'
// import { abc } from './dataABC.json'
//
const resourcesLeft = ref([
@ -141,22 +142,23 @@
// console.log('===================>', res.data.data)
resourcesLeft.value.forEach((val) => {
const object = res.data.data.filter((item) => item.type === val.name)[0]
console.log('object', object)
if (object) {
val.num = obj.amount
}
const arr = res.data.data.filter((item) => item.resourceTop5)[0]
console.log('数据资源数据===================>', arr)
if (arr) {
assignRankings.value.map((val) => {
val.name = ''
val.operation = ''
})
arr.resourceTop5.forEach((val, index) => {
assignRankings.value[index].name = val.zyname || val.serviceName || 0
assignRankings.value[index].operation = val.syqk || val.requestCount || 0
})
val.num = object.amount
}
})
const arr = res.data.data.filter((item) => item.resourceTop5)[0]
console.log('数据资源数据===================>', arr)
if (arr) {
assignRankings.value.map((val) => {
val.name = ''
val.operation = ''
})
arr.resourceTop5.forEach((val, index) => {
assignRankings.value[index].name = val['服务名称'] || ''
assignRankings.value[index].operation = val['申请次数'] || ''
})
}
})
</script>
<style lang="less" scoped>
@ -170,6 +172,7 @@
text-decoration: none;
outline: none;
-webkit-transition: all 100ms ease-out;
-moz-transition: all 100ms ease-out;
transition: all 100ms ease-out;
.resources-top {

View File

@ -44,6 +44,7 @@
<script>
import { dependencies, devDependencies } from '*/package.json'
import { mapActions, mapGetters } from 'vuex'
import { Encrypt } from '@/utils/crypto'
import { UserOutlined, LockOutlined } from '@ant-design/icons-vue'
import { message } from 'ant-design-vue'
@ -97,7 +98,15 @@
async handleSubmit() {
// debugger
try {
await this.login(this.form)
// console.log('', Decrypt(Encrypt(this.form.password)))
if (this.form.password !== this.form.password.trim()) {
message.error('登陆失败,用户名或密码错误!')
return
}
await this.login({
password: Encrypt(this.form.password),
username: this.form.username,
})
window.sessionStorage.setItem('visits', JSON.stringify([]))
// console.log(this.handleRoute())
await this.$router.push('/home')