feat: 增加记住密码功能和Data Recevice status Monitoring弹窗右侧图表根据容器大小自动resize功能
This commit is contained in:
parent
d723d2aaf7
commit
e94c0a2007
|
@ -20,6 +20,7 @@
|
||||||
"clipboard": "^2.0.4",
|
"clipboard": "^2.0.4",
|
||||||
"codemirror": "^5.46.0",
|
"codemirror": "^5.46.0",
|
||||||
"cron-parser": "^2.10.0",
|
"cron-parser": "^2.10.0",
|
||||||
|
"crypto-js": "^4.1.1",
|
||||||
"dayjs": "^1.8.0",
|
"dayjs": "^1.8.0",
|
||||||
"dom-align": "1.12.0",
|
"dom-align": "1.12.0",
|
||||||
"echarts": "^5.4.2",
|
"echarts": "^5.4.2",
|
||||||
|
@ -41,6 +42,7 @@
|
||||||
"vue-ls": "^3.2.0",
|
"vue-ls": "^3.2.0",
|
||||||
"vue-photo-preview": "^1.1.3",
|
"vue-photo-preview": "^1.1.3",
|
||||||
"vue-print-nb-jeecg": "^1.0.12",
|
"vue-print-nb-jeecg": "^1.0.12",
|
||||||
|
"vue-resize": "^1.0.1",
|
||||||
"vue-router": "^3.0.1",
|
"vue-router": "^3.0.1",
|
||||||
"vue-splitpane": "^1.0.4",
|
"vue-splitpane": "^1.0.4",
|
||||||
"vue-virtual-scroller": "^1.1.2",
|
"vue-virtual-scroller": "^1.1.2",
|
||||||
|
@ -53,6 +55,7 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/polyfill": "^7.2.5",
|
"@babel/polyfill": "^7.2.5",
|
||||||
|
"@types/crypto-js": "^4.1.1",
|
||||||
"@vue/cli-plugin-babel": "^3.3.0",
|
"@vue/cli-plugin-babel": "^3.3.0",
|
||||||
"@vue/cli-plugin-eslint": "^3.3.0",
|
"@vue/cli-plugin-eslint": "^3.3.0",
|
||||||
"@vue/cli-service": "^3.3.0",
|
"@vue/cli-service": "^3.3.0",
|
||||||
|
|
|
@ -21,6 +21,11 @@ export default {
|
||||||
this.chart = echarts.init(this.$refs.containerRef)
|
this.chart = echarts.init(this.$refs.containerRef)
|
||||||
this.chart.setOption(this.option)
|
this.chart.setOption(this.option)
|
||||||
},
|
},
|
||||||
|
methods: {
|
||||||
|
resize() {
|
||||||
|
this.chart && this.chart.resize()
|
||||||
|
}
|
||||||
|
},
|
||||||
watch : {
|
watch : {
|
||||||
option: {
|
option: {
|
||||||
handler() {
|
handler() {
|
||||||
|
|
|
@ -63,6 +63,10 @@ import { RecycleScroller } from 'vue-virtual-scroller'
|
||||||
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
|
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
|
||||||
Vue.component('RecycleScroller', RecycleScroller)
|
Vue.component('RecycleScroller', RecycleScroller)
|
||||||
|
|
||||||
|
import 'vue-resize/dist/vue-resize.css'
|
||||||
|
import VueResize from 'vue-resize'
|
||||||
|
Vue.use(VueResize)
|
||||||
|
|
||||||
Vue.prototype.rules = rules
|
Vue.prototype.rules = rules
|
||||||
Vue.config.productionTip = false
|
Vue.config.productionTip = false
|
||||||
Vue.use(Storage, config.storageOptions)
|
Vue.use(Storage, config.storageOptions)
|
||||||
|
|
23
src/utils/safe.js
Normal file
23
src/utils/safe.js
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
import CryptoJS from "crypto-js";
|
||||||
|
|
||||||
|
const key = CryptoJS.enc.Utf8.parse('6f4ff1fc2b53b9ee')
|
||||||
|
const iv = CryptoJS.enc.Utf8.parse('jskey_1618823712')
|
||||||
|
|
||||||
|
export function encrypt(data) {
|
||||||
|
const encrypted = CryptoJS.AES.encrypt(data, key, {
|
||||||
|
iv,
|
||||||
|
mode: CryptoJS.mode.CBC,
|
||||||
|
padding: CryptoJS.pad.Pkcs7
|
||||||
|
});
|
||||||
|
return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function decrypt(encryptedData) {
|
||||||
|
const encrypted = CryptoJS.AES.decrypt(encryptedData, key, {
|
||||||
|
iv,
|
||||||
|
mode: CryptoJS.mode.CBC,
|
||||||
|
padding: CryptoJS.pad.Pkcs7
|
||||||
|
});
|
||||||
|
return encrypted.toString(CryptoJS.enc.Utf8);
|
||||||
|
}
|
||||||
|
|
|
@ -233,7 +233,8 @@
|
||||||
<!-- 右侧图表展示栏 -->
|
<!-- 右侧图表展示栏 -->
|
||||||
<div class="data-receive-status-chart" :class="{ 'on-screen': !leftPaneShow }">
|
<div class="data-receive-status-chart" :class="{ 'on-screen': !leftPaneShow }">
|
||||||
<template v-if="showChart">
|
<template v-if="showChart">
|
||||||
<RealTimeDataChart :list="statusList" :scale-settings="initialDataRecieveSettings" />
|
<RealTimeDataChart ref="realtimeChartRef" :list="statusList" :scale-settings="initialDataRecieveSettings" />
|
||||||
|
<resize-observer @notify="handleResize" />
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<!-- 右侧图表展示栏结束 -->
|
<!-- 右侧图表展示栏结束 -->
|
||||||
|
@ -792,6 +793,10 @@ export default {
|
||||||
} finally {
|
} finally {
|
||||||
this.isGettingStatusList = false
|
this.isGettingStatusList = false
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
handleResize() {
|
||||||
|
this.$refs.realtimeChartRef.resize()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 图例结束 -->
|
<!-- 图例结束 -->
|
||||||
<custom-chart ref="customChart" :option="option" :height="list.length * 295"></custom-chart>
|
<custom-chart ref="customChartRef" :option="option" :height="list.length * 295"></custom-chart>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -276,6 +276,10 @@ export default {
|
||||||
handleLegendChange(legend) {
|
handleLegendChange(legend) {
|
||||||
legend.isShow = !legend.isShow
|
legend.isShow = !legend.isShow
|
||||||
this.initChartOption()
|
this.initChartOption()
|
||||||
|
},
|
||||||
|
|
||||||
|
resize() {
|
||||||
|
this.$refs.customChartRef.resize()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="position: fixed; z-index: -999;">
|
<div style="position: fixed; z-index: -999;">
|
||||||
<img src="@/assets/images/login/login-btn-active.png" alt="">
|
<img src="@/assets/images/login/login-btn-active.png" alt="" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -43,6 +43,7 @@ import { ACCESS_TOKEN } from '@/store/mutation-types'
|
||||||
import { timeFix } from '@/utils/util'
|
import { timeFix } from '@/utils/util'
|
||||||
import { getAction } from '@/api/manage'
|
import { getAction } from '@/api/manage'
|
||||||
import { mapActions } from 'vuex'
|
import { mapActions } from 'vuex'
|
||||||
|
import { encrypt, decrypt } from '@/utils/safe'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
|
@ -62,22 +63,26 @@ export default {
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
message: 'Password Required'
|
message: 'Password Required'
|
||||||
},
|
}
|
||||||
],
|
],
|
||||||
inputCode: [
|
inputCode: [
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
message: 'Captchar Required',
|
message: 'Captchar Required'
|
||||||
},
|
}
|
||||||
],
|
]
|
||||||
},
|
},
|
||||||
currdatetime: '',
|
currdatetime: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
Vue.ls.remove(ACCESS_TOKEN)
|
Vue.ls.remove(ACCESS_TOKEN)
|
||||||
this.getRouterData()
|
this.getRouterData()
|
||||||
this.handleChangeCheckCode()
|
this.handleChangeCheckCode()
|
||||||
|
const { username, password, rememberPwd } = this.getCredentials()
|
||||||
|
this.model.username = username
|
||||||
|
this.model.password = password
|
||||||
|
this.model.rememberPwd = rememberPwd !== 'false'
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapActions(['Login']),
|
...mapActions(['Login']),
|
||||||
|
@ -97,7 +102,7 @@ export default {
|
||||||
this.currdatetime = new Date().getTime()
|
this.currdatetime = new Date().getTime()
|
||||||
this.model.inputCode = ''
|
this.model.inputCode = ''
|
||||||
getAction(`/sys/randomImage/${this.currdatetime}`)
|
getAction(`/sys/randomImage/${this.currdatetime}`)
|
||||||
.then((res) => {
|
.then(res => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
this.randCodeImage = res.result
|
this.randCodeImage = res.result
|
||||||
this.requestCodeSuccess = true
|
this.requestCodeSuccess = true
|
||||||
|
@ -123,10 +128,17 @@ export default {
|
||||||
username: this.model.username,
|
username: this.model.username,
|
||||||
password: this.model.password,
|
password: this.model.password,
|
||||||
captcha: this.model.inputCode,
|
captcha: this.model.inputCode,
|
||||||
checkKey: this.currdatetime,
|
checkKey: this.currdatetime
|
||||||
}
|
}
|
||||||
this.isSubmitting = true
|
this.isSubmitting = true
|
||||||
const res = await this.Login(loginParams)
|
const res = await this.Login(loginParams)
|
||||||
|
// 记住密码
|
||||||
|
if (this.model.rememberPwd) {
|
||||||
|
this.saveCredentials(this.model.username, this.model.password, true)
|
||||||
|
} else {
|
||||||
|
this.clearCredentials()
|
||||||
|
localStorage.setItem('rememberPwd', false)
|
||||||
|
}
|
||||||
this.loginSuccess()
|
this.loginSuccess()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (error && error.code === 412) {
|
if (error && error.code === 412) {
|
||||||
|
@ -139,13 +151,30 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
saveCredentials(username, password, rememberPwd) {
|
||||||
|
localStorage.setItem('username', username)
|
||||||
|
localStorage.setItem('password', encrypt(password))
|
||||||
|
localStorage.setItem('rememberPwd', rememberPwd)
|
||||||
|
},
|
||||||
|
getCredentials() {
|
||||||
|
const username = localStorage.getItem('username')
|
||||||
|
const pwd = localStorage.getItem('password')
|
||||||
|
const password = pwd ? decrypt(pwd) : undefined
|
||||||
|
const rememberPwd = localStorage.getItem('rememberPwd')
|
||||||
|
return { username, password, rememberPwd }
|
||||||
|
},
|
||||||
|
clearCredentials() {
|
||||||
|
localStorage.removeItem('username')
|
||||||
|
localStorage.removeItem('password')
|
||||||
|
},
|
||||||
|
|
||||||
//登录失败
|
//登录失败
|
||||||
requestFailed(err) {
|
requestFailed(err) {
|
||||||
let description = ((err.response || {}).data || {}).message || err.message || 'Request Error'
|
let description = ((err.response || {}).data || {}).message || err.message || 'Request Error'
|
||||||
this.$notification['error']({
|
this.$notification['error']({
|
||||||
message: 'Login Failed',
|
message: 'Login Failed',
|
||||||
description: description,
|
description: description,
|
||||||
duration: 4,
|
duration: 4
|
||||||
})
|
})
|
||||||
//账户密码登录错误后更新验证码
|
//账户密码登录错误后更新验证码
|
||||||
this.handleChangeCheckCode()
|
this.handleChangeCheckCode()
|
||||||
|
@ -159,10 +188,10 @@ export default {
|
||||||
})
|
})
|
||||||
this.$notification.success({
|
this.$notification.success({
|
||||||
message: 'Welcome',
|
message: 'Welcome',
|
||||||
description: `${timeFix()},Welcome Back`,
|
description: `${timeFix()},Welcome Back`
|
||||||
})
|
})
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user