195 lines
5.4 KiB
Vue
195 lines
5.4 KiB
Vue
<template>
|
|
<div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}">
|
|
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
|
|
<sidebar v-if="!sidebar.hide" class="sidebar-container"/>
|
|
<div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container">
|
|
<div :class="{'fixed-header':fixedHeader}">
|
|
<navbar/>
|
|
<tags-view v-if="needTagsView"/>
|
|
</div>
|
|
<app-main/>
|
|
<right-panel>
|
|
<settings/>
|
|
</right-panel>
|
|
</div>
|
|
<el-dialog :title="title" :visible.sync="showChangePasswordDialog" width="30%" :close-on-click-modal="false"
|
|
:show-close="false"
|
|
>
|
|
<el-form ref="form" :model="user" :rules="rules" label-width="80px">
|
|
<el-form-item label="旧密码" prop="oldPassword">
|
|
<el-input v-model="user.oldPassword" placeholder="请输入旧密码" type="password" show-password/>
|
|
</el-form-item>
|
|
<el-form-item label="新密码" prop="newPassword">
|
|
<el-input v-model="user.newPassword" placeholder="请输入新密码" type="password" show-password/>
|
|
</el-form-item>
|
|
<el-form-item label="确认密码" prop="confirmPassword">
|
|
<el-input v-model="user.confirmPassword" placeholder="请确认新密码" type="password" show-password/>
|
|
</el-form-item>
|
|
<!-- <el-form-item>
|
|
<el-button type="primary" size="mini" @click="submit">保存</el-button>
|
|
<el-button type="danger" size="mini" @click="close">关闭</el-button>
|
|
</el-form-item>-->
|
|
</el-form>
|
|
<div slot="footer" class="dialog-footer">
|
|
<el-button type="primary" @click="submit">确 定</el-button>
|
|
<el-button @click="close">取 消</el-button>
|
|
</div>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import RightPanel from '@/components/RightPanel'
|
|
import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components'
|
|
import ResizeMixin from './mixin/ResizeHandler'
|
|
import { mapState } from 'vuex'
|
|
import variables from '@/assets/styles/variables.scss'
|
|
import { validateNewPassword } from '@/utils/validate'
|
|
import { updateUserPwd, checkPasswordStatus } from '@/api/system/user'
|
|
|
|
export default {
|
|
name: 'Layout',
|
|
data() {
|
|
const equalToPassword = (rule, value, callback) => {
|
|
if (this.user.newPassword !== value) {
|
|
callback(new Error('两次输入的密码不一致'))
|
|
} else {
|
|
callback()
|
|
}
|
|
}
|
|
return {
|
|
showChangePasswordDialog: false, // 控制弹窗显示
|
|
title: '',
|
|
user: {
|
|
oldPassword: undefined,
|
|
newPassword: undefined,
|
|
confirmPassword: undefined
|
|
},
|
|
// 表单校验规则
|
|
rules: {
|
|
oldPassword: [
|
|
{ required: true, message: '旧密码不能为空', trigger: 'blur' }
|
|
],
|
|
newPassword: [
|
|
{ required: true, message: '新密码不能为空', trigger: 'blur' },
|
|
{ validator: validateNewPassword, trigger: 'blur' }
|
|
],
|
|
confirmPassword: [
|
|
{ required: true, message: '确认密码不能为空', trigger: 'blur' },
|
|
{ required: true, validator: equalToPassword, trigger: 'blur' }
|
|
]
|
|
}
|
|
}
|
|
},
|
|
components: {
|
|
AppMain,
|
|
Navbar,
|
|
RightPanel,
|
|
Settings,
|
|
Sidebar,
|
|
TagsView
|
|
},
|
|
mixins: [ResizeMixin],
|
|
computed: {
|
|
...mapState({
|
|
theme: state => state.settings.theme,
|
|
sideTheme: state => state.settings.sideTheme,
|
|
sidebar: state => state.app.sidebar,
|
|
device: state => state.app.device,
|
|
needTagsView: state => state.settings.tagsView,
|
|
fixedHeader: state => state.settings.fixedHeader
|
|
}),
|
|
classObj() {
|
|
return {
|
|
hideSidebar: !this.sidebar.opened,
|
|
openSidebar: this.sidebar.opened,
|
|
withoutAnimation: this.sidebar.withoutAnimation,
|
|
mobile: this.device === 'mobile'
|
|
}
|
|
},
|
|
variables() {
|
|
return variables
|
|
}
|
|
},
|
|
created() {
|
|
this.checkPasswordStatus()
|
|
},
|
|
methods: {
|
|
checkPasswordStatus() {
|
|
checkPasswordStatus().then(response => {
|
|
if (response.code === 200) {
|
|
this.showChangePasswordDialog = response.data
|
|
this.title = response.msg
|
|
}
|
|
})
|
|
},
|
|
handleClickOutside() {
|
|
this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
|
|
},
|
|
submit() {
|
|
this.$refs['form'].validate(valid => {
|
|
if (valid) {
|
|
updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => {
|
|
this.showChangePasswordDialog = false
|
|
this.$modal.msgSuccess('修改成功')
|
|
})
|
|
}
|
|
})
|
|
},
|
|
close() {
|
|
this.$store.dispatch('LogOut').then(() => {
|
|
location.href = '/index';
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
@import "~@/assets/styles/mixin.scss";
|
|
@import "~@/assets/styles/variables.scss";
|
|
|
|
.app-wrapper {
|
|
@include clearfix;
|
|
position: relative;
|
|
height: 100%;
|
|
width: 100%;
|
|
|
|
&.mobile.openSidebar {
|
|
position: fixed;
|
|
top: 0;
|
|
}
|
|
}
|
|
|
|
.drawer-bg {
|
|
background: #000;
|
|
opacity: 0.3;
|
|
width: 100%;
|
|
top: 0;
|
|
height: 100%;
|
|
position: absolute;
|
|
z-index: 999;
|
|
}
|
|
|
|
.fixed-header {
|
|
position: fixed;
|
|
top: 0;
|
|
right: 0;
|
|
z-index: 9;
|
|
width: calc(100% - #{$base-sidebar-width});
|
|
transition: width 0.28s;
|
|
}
|
|
|
|
.hideSidebar .fixed-header {
|
|
width: calc(100% - 54px);
|
|
}
|
|
|
|
.sidebarHide .fixed-header {
|
|
width: 100%;
|
|
}
|
|
|
|
.mobile .fixed-header {
|
|
width: 100%;
|
|
}
|
|
</style>
|