Files
apt-nl-new/src/pages/shells/index/index.vue
2023-12-04 15:55:54 +08:00

614 lines
17 KiB
Vue

<template>
<div class="index-container" :class="{'enClass': selectType === 'en-us'}">
<div class="header-container">
<div class="horizontal-menu-container">
<el-menu :default-active="$route.meta.jumpPath" mode="horizontal" @select="handleSelect">
<el-menu-item :index="menu.index" v-for="menu in menus" :key="menu.index">{{selectType === 'en-us' ? menu.en_title : menu.zh_title}}</el-menu-item>
</el-menu>
</div>
<div class="lang_change_wraper">
<el-select v-model="selectType" placeholder="请选择" popper-class="lang_dropdown" @change="selectChanged">
<el-option
v-for="(item, index) in selectTypeList"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="header_state_wraper">
<div class="state-line"></div>
<div class="state-item">{{ selectType === 'en-us' ? topInfo.en_agvrun_status_name : topInfo.zh_agvrun_status_name }}</div>
<div class="state-item">{{ selectType === 'en-us' ? topInfo.en_automatic_status_name : topInfo.zh_automatic_status_name }}</div>
<div class="elec-qty-wrap">
<div class="elec-qty" :style="{width: Number(topInfo.electric) + '%'}" :class="{'elec-qty_s': Number(topInfo.electric) <= 40}"></div>
<div class="elec-qty_border"></div>
<div class="elec-txt">{{ topInfo.electric }}%</div>
</div>
<div class="state-line"></div>
</div>
<div class="header_user_wraper">
<div class="header_user_wraper_i" @click="showDropdown">
<div class="user_name">{{ username }}</div>
</div>
<div v-show="dropdown" class="header_dropdown_wraper">
<ul>
<li @click="showDialog">{{ $t('common.changepassword') }}</li>
<li @click="toEixt">{{ $t('common.exit') }}</li>
</ul>
<div class="popper__arrow"></div>
</div>
<div class="state-line"></div>
</div>
<div class="time-container">
<jxTime></jxTime>
</div>
</div>
<div class="body-conatiner" :class="{'body-conatiner_1': $route.path !== '/index/home'}">
<div class="hud_left"></div>
<div class="hud_right"></div>
<div class="bottom_bg"></div>
<div v-show="$route.path !== '/index/teach' && $route.path !== '/index/home' && $route.path !== '/index/errorinfo'" class="side-bar-container">
<el-menu :default-active="$route.meta.guidePath" @select="handleSelectChild">
<el-menu-item :index="menu.index" v-for="menu in childmenus" :key="menu.index" :class="{'el-menu-item-long': menu.title.length === 5 }">{{selectType === 'en-us' ? menu.en_title : menu.zh_title}}</el-menu-item>
</el-menu>
</div>
<router-view></router-view>
</div>
<jxDialog
ref="child"
title="修改密码"
:unclick="unclick"
@toSure="toSureDialog"
@toCancle="toCancle"
>
<div class="form_wraper">
<div class="form">
<div class="form_item">
<div class="form_item__label form_item__label_pass"><i>*</i>{{ $t('common.oldpassword') }}</div>
<div class="form_item__content form_item__content_pass">
<input type="password" class="form_item__input" v-model="oldpassword" @focus="show" data-layout="normal">
</div>
</div>
</div>
<div class="form">
<div class="form_item">
<div class="form_item__label form_item__label_pass"><i>*</i>{{ $t('common.newpassword') }}</div>
<div class="form_item__content form_item__content_pass">
<input type="password" class="form_item__input" v-model="newpassword1" @focus="show" data-layout="normal">
</div>
</div>
</div>
<div class="form">
<div class="form_item">
<div class="form_item__label form_item__label_pass"><i>*</i>{{ $t('common.newpassword') }}</div>
<div class="form_item__content form_item__content_pass">
<input type="password" class="form_item__input" v-model="newpassword2" @focus="show" data-layout="normal">
</div>
</div>
</div>
</div>
</jxDialog>
<vue-touch-keyboard id="keyboard" :options="options" v-if="visible" :layout="layout" :cancel="hide" :accept="accept" :input="input" :next="next" />
</div>
</template>
<script>
import jxTime from '@components/time.vue'
import jxDialog from '@components/dialog.vue'
import { queryHomePage } from '@/config/getData.js'
import { updatePass, sysMenuBuild, authLogout } from '@config/getData2.js'
import {encrypt} from '../../../main.js'
export default {
components: {
jxTime,
jxDialog
},
data () {
return {
itime: this.$store.getters.setTime,
timer: null,
username: this.$store.getters.userInfo !== '' ? JSON.parse(this.$store.getters.userInfo).user.username : '',
menus: [] || JSON.parse(this.$store.getters.menus),
// menus: [{
// label: '首页',
// index: '1',
// router: '',
// children: [{
// label: '首页',
// index: '1',
// router: '/index/home'
// }]
// }, {
// label: '任务',
// index: '2',
// router: '',
// children: [{
// label: '搬运站点',
// index: '1',
// router: '/index/carrypoint'
// }, {
// label: '任务列表',
// index: '2',
// router: '/index/tasklists'
// }, {
// label: '任务操作',
// index: '3',
// router: '/index/taskoperates'
// }]
// }, {
// label: '故障',
// index: '3',
// router: '',
// children: [{
// label: '故障信息',
// index: '1',
// router: '/index/errorinfo'
// }, {
// label: '故障处理',
// index: '2',
// router: '/index/errordeal'
// }]
// }, {
// label: '车辆',
// index: '4',
// router: '',
// children: [{
// label: '车辆状态',
// index: '1',
// router: '/index/vehiclestatus'
// }, {
// label: '车辆控制',
// index: '2',
// router: '/index/vehiclecontrol'
// }]
// }, {
// label: '示教',
// index: '5',
// router: '/index/teach'
// }, {
// label: '系统',
// index: '6',
// router: '',
// children: [{
// label: '用户管理',
// index: '1',
// router: '/index/user'
// }, {
// label: '角色管理',
// index: '2',
// router: '/index/role'
// }, {
// label: '系统参数',
// index: '3',
// router: '/index/system'
// }, {
// label: '开发者选项',
// index: '4',
// router: '/index/developer'
// }]
// }],
dropdown: false,
oldpassword: '',
newpassword1: '',
newpassword2: '',
unclick: false,
visible: false,
layout: 'normal',
input: null,
options: {
useKbEvents: false,
preventClickEvent: false
},
topInfo: {},
selectTypeList: [{value: 'zh-cn', label: '中文'}, {value: 'en-us', label: 'English'}],
selectType: ''
}
},
computed: {
routerPath () {
return this.$route.meta.jumpPath
},
childmenus () {
let res = []
this.menus.map(el => {
if (el.index === this.$route.meta.jumpPath) {
res = el.children
}
})
return res
}
},
watch: {
oldpassword (val) {
if (val === '' || this.newpassword1 === '' || this.newpassword2 === '') {
this.unclick = true
} else {
this.unclick = false
}
},
newpassword1 (val) {
if (val === '' || this.oldpassword === '' || this.newpassword2 === '') {
this.unclick = true
} else {
this.unclick = false
}
},
newpassword2 (val) {
if (val === '' || this.oldpassword === '' || this.newpassword1 === '') {
this.unclick = true
} else {
this.unclick = false
}
}
},
created () {
this._sysMenuBuild()
this._queryHomePage()
this.timer = setInterval(() => {
this._queryHomePage()
}, this.itime)
if (this.menus.length) {
this.menus.map(el => {
if (el.router === this.$route.path) {
this.childmenus = el.children
}
})
}
if (this.$i18n.locale === 'zh-cn') {
this.selectType = 'zh-cn'
} else if (this.$i18n.locale === 'en-us') {
this.selectType = 'en-us'
}
},
beforeDestroy () {
clearInterval(this.timer)
},
destroyed () {
clearInterval(this.timer)
},
methods: {
handleSelect (key) {
this.dropdown = false
this.menus.map(el => {
if (el.router === '' && el.index === key) {
this.$router.push({ path: el.children[0].router })
}
if (key === '5') {
this.$router.push({ path: el.router })
}
})
},
handleSelectChild (key) {
this.dropdown = false
this.childmenus.map(el => {
if (el.index === key) {
this.$router.push({ path: el.router })
}
})
},
showDropdown () {
this.dropdown = !this.dropdown
},
showDialog () {
this.dropdown = false
this.$refs.child.active = true
this.oldpassword = ''
this.newpassword1 = ''
this.newpassword2 = ''
this.unclick = true
},
toSureDialog () {
this._updatePass()
this.hide()
},
toCancle () {
this.hide()
},
async _updatePass () {
this.$refs.child.disabled = true
if (!this.oldpassword) {
// this.toast('旧密码不能为空')
this.toast(this.$t('common.toast1'))
this.$refs.child.disabled = false
return
}
if (!this.newpassword1) {
// this.toast('新密码不能为空')
this.toast(this.$t('common.toast2'))
this.$refs.child.disabled = false
return
}
if (!this.newpassword2) {
// this.toast('输入新密码')
this.toast(this.$t('common.toast3'))
this.$refs.child.disabled = false
return
}
if (this.newpassword1 !== this.newpassword2) {
// this.toast('新密码输入不一致,请重新输入')
this.toast(this.$t('common.toast4'))
this.$refs.child.disabled = false
return
}
try {
let res = await updatePass(encrypt(this.newpassword1), encrypt(this.oldpassword))
this.toast(res.desc)
this.$refs.child.active = false
this.$refs.child.disabled = false
} catch (e) {
this.$refs.child.active = false
this.$refs.child.disabled = false
}
},
async _sysMenuBuild () {
let res = await sysMenuBuild()
this.menus = [...res]
res.map(el => {
if (el.router === this.$route.path) {
this.childmenus = el.children
}
})
this.$store.dispatch('getMenus', [...res])
},
async _authLogout () {
await authLogout()
},
async _queryHomePage () {
let res = await queryHomePage()
if (res.code === '1') {
this.topInfo = res.result
} else {
this.toast(res.desc)
}
},
toEixt () {
this.$store.dispatch('setSignOut')
this._authLogout()
this.$router.push('/login')
},
show (e) {
this.input = e.target
this.layout = e.target.dataset.layout
if (!this.visible) {
this.visible = true
}
},
hide () {
this.visible = false
},
accept () {
this.hide()
},
next () {
let inputs = document.querySelectorAll('input')
let found = false;
[].forEach.call(inputs, (item, i) => {
if (!found && item === this.input && i < inputs.length - 1) {
found = true
this.$nextTick(() => {
inputs[i + 1].focus()
})
}
})
if (!found) {
this.input.blur()
this.hide()
}
},
selectChanged (e) {
this.$i18n.locale = e
window.localStorage.setItem('locale', e)
}
}
}
</script>
<style lang="stylus" scoped>
@import '~@style/mixin'
.index-container
position relative
_wh(100%, 100%)
.header-container
position absolute
left 0
top 0
z-index 150
_fj(flex-end, flex-start)
_wh(100%, 124px)
background center / 100% 100% url(../../../images/new/header_bg.png) no-repeat
.horizontal-menu-container
height 77px
.el-menu
border none
background-color transparent
.el-menu-item
// _wh(105px, 77px)
_wh(95px, 77px)
_font(30px, 77px, #8DBFEE, bold, center)
font-family SourceHanSansCN-Bold
font-style italic
background linear-gradient(0deg, #A2C3E3 0%, #5E9ED9 11.9140625%, #A2C3E3 100%)
-webkit-background-clip text
-webkit-text-fill-color transparent
border-bottom 0
padding 0
.el-menu-item.is-active
color #fff
.el-menu--horizontal>.el-menu-item.is-active
border-bottom 0
width 128px
color #fff
-webkit-text-fill-color #fff
background center / 100% 100% url(../../../images/new/nav_bg.png) no-repeat
.time-container
height 77px
margin 0 10px
.state-item
_wh(67px, 43px)
_font(20px,43px,#fff,,center)
font-family Adobe Heiti Std
margin-right 3px
background center / 100% 100% url(../../../images/new/state-item_bg.png) no-repeat
.state-line
_wh(1px,42px)
opacity 0.3
background #AECAF5
margin 0 5px
.elec-qty-wrap
position relative
_wh(67px, 43px)
z-index 151
.elec-qty
position absolute
z-index 152
_wh(0, 100%)
background-color green
background left top url(../../../images/new/elec.png) no-repeat
background-size cover
.elec-qty_s
background-image url(../../../images/new/elec.png)
.elec-qty_border
position absolute
z-index 152
_wh(100%, 100%)
background center / 100% 100% url(../../../images/new/elec_bg.png) no-repeat
.elec-txt
position relative
z-index 153
_font(20px, 43px, #fff,,center)
font-family Adobe Heiti Std
.header_user_wraper
position relative
_fj(flex-start)
height 77px
.header_user_wraper_i
_fj(flex-start)
height 77px
.user_name
_font(22px, 77px, #fff,,left)
font-family: SourceHanSansCN-Regular
padding-left 50px
margin-right 4px
background left center / 50px 52px url(../../../images/new/user_icon.png) no-repeat
.icon_admin
_font(32px, 60px, #54C0B3,,left)
margin-right 2px
.header_state_wraper
_fj(flex-start)
height 77px
margin-left 5px
.header_dropdown_wraper
position absolute
top 90%
left 50%
transform translateX(-50%)
z-index 1000
width 180px
background: rgba(7,31,62,0.95);
border: 1px solid #4980BD;
ul
width 100%
li
width 100%
_font(30px, 80px, #fff,,)
padding 0 20px
&:first-child
color #3CC1FF
.popper__arrow
position absolute
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 6px;
filter: drop-shadow(0 2px 12px rgba(0,0,0,.03))
top: -6px;
left: 50%;
transform: translateX(-6px)
margin-right: 3px;
border-top-width: 0;
border-bottom-color: #4980BD;
&:after
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
content: " ";
border-width: 6px;
top: 1px;
margin-left: -6px;
border-top-width: 0;
border-bottom-color: rgba(7,31,62,0.95);
.side-bar-container
.el-menu
border-right 0
background-color transparent
.el-menu-item
height 120px
_font(36px, 40px, #fff,,)
font-family: YouSheBiaoTiHei
white-space wrap
background center / 100% 100% url(../../../images/new/sidebar_bg.png) no-repeat
_fj(center)
padding 0 43px 10px 87px !important
.el-menu-item.is-active
background center / 100% 100% url(../../../images/new/sidebar_active_bg.png) no-repeat
.hud_left
position absolute
left 0
_wh(53px, 735px)
background center / 100% 100% url(../../../images/new/hud_left.png) no-repeat
.hud_right
position absolute
right 0
_wh(53px, 735px)
background center / 100% 100% url(../../../images/new/hud_right.png) no-repeat
.bottom_bg
position absolute
bottom 0
_wh(100%, 92px)
background center bottom / 100% 100% url(../../../images/new/bottom_bg.png) no-repeat
.side-bar-container
.el-menu-item-long
padding 0 30px 10px 87px !important
.lang_change_wraper
_wh(90px, 77px)
padding-top 20.5px
margin-left 45px
/deep/ .el-input, /deep/ .el-select .el-input .el-select__caret
font-size: 20px;
height 36px
line-height 36px
/deep/ .el-input__inner
font-size: 20px;
line-height: 36px;
height: 36px;
border: 1px solid #4980bd;
border-radius 0
padding-left 5px
padding-right 15px
/deep/ .el-input__suffix
right 5px
/deep/ .el-icon-arrow-up
width 10px
.enClass
.horizontal-menu-container .el-menu-item
font-size 24px
.side-bar-container .el-menu-item
font-size 20px
line-height 22px
padding 0 14px 10px 20px !important
white-space pre-line
.state-item
font-size 12px
.header_dropdown_wraper
width 300px
.form_item__label_pass
width 205px
.form_item__content_pass
width calc(100% - 205px)
</style>