'admin-21.01.12:新增布局配置自动锁屏界面'

This commit is contained in:
lyt-Top 2021-01-12 22:48:55 +08:00
parent 95a6e1bbb4
commit d16e6c9075
6 changed files with 169 additions and 77 deletions

View File

@ -6,7 +6,7 @@
"build": "vite build"
},
"dependencies": {
"element-plus": "^v1.0.1-beta.23",
"element-plus": "^v1.0.1-beta.24",
"mitt": "^2.1.0",
"sortablejs": "^1.10.2",
"vue": "^3.0.5",

View File

@ -1,10 +1,10 @@
<template>
<router-view />
<LockScreen />
<LockScreen v-if="getThemeConfig.isLockScreen" />
</template>
<script lang="ts">
import { onBeforeMount } from "vue";
import { onBeforeMount, computed } from "vue";
import { useStore } from "/@/store/index.ts";
import { setIconfont } from "/@/utils/setIconfont.ts";
import LockScreen from "/@/views/layout/lockScreen/index.vue";
@ -13,11 +13,17 @@ export default {
components: { LockScreen },
setup() {
const store = useStore();
console.log(store);
//
const getThemeConfig = computed(() => {
return store.state.themeConfig;
});
// icon
onBeforeMount(() => {
setIconfont(["//at.alicdn.com/t/font_2298093_0fmefamqzj4a.css"]);
});
return {
getThemeConfig,
};
},
};
</script>

View File

@ -23,7 +23,8 @@ export interface RootStateTypes {
isFixedHeader: boolean,
isFixedHeaderChange: boolean,
isCollapse1: boolean,
menuWidth1: number,
isLockScreen: boolean,
lockScreenTime: number,
isShowLogo: boolean,
isShowLogoChange: boolean,
isBreadcrumb: boolean,

View File

@ -20,7 +20,8 @@ export default {
isFixedHeader: false,
isFixedHeaderChange: false,
isCollapse1: false,
menuWidth1: 200,
isLockScreen: false,
lockScreenTime: 30,
isShowLogo: false,
isShowLogoChange: false,
isBreadcrumb: true,

View File

@ -1,92 +1,164 @@
<template>
<div class="layout-lock-screen-mask"></div>
<div class="layout-lock-screen-img" :class="{'layout-lock-screen-filter':isShowLoockLogin}"></div>
<div class="layout-lock-screen">
<div class="layout-lock-screen-date">
<div class="layout-lock-screen-date-box">
<div class="layout-lock-screen-date-box-time">22:14</div>
<div class="layout-lock-screen-date-box-info">1月11日星期一</div>
<div v-show="isShowLockScreen">
<div class="layout-lock-screen-mask"></div>
<div class="layout-lock-screen-img" :class="{'layout-lock-screen-filter':isShowLoockLogin}"></div>
<div class="layout-lock-screen">
<div class="layout-lock-screen-date" @mousedown="onDown" @mousemove="onMove" @mouseup="onEnd"
@touchstart.stop="onDown" @touchmove.stop="onMove" @touchend.stop="onEnd">
<div class="layout-lock-screen-date-box">
<div class="layout-lock-screen-date-box-time">{{time.hm}}<span
class="layout-lock-screen-date-box-minutes">{{time.s}}</span></div>
<div class="layout-lock-screen-date-box-info">{{time.mdq}}</div>
</div>
</div>
<transition name="el-zoom-in-center">
<div v-show="isShowLoockLogin" class="layout-lock-screen-login">
<div class="layout-lock-screen-login-box">
<div class="layout-lock-screen-login-box-img">
<img
src="https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1813762643,1914315241&fm=26&gp=0.jpg" />
</div>
<div class="layout-lock-screen-login-box-name">Administrator</div>
<div class="layout-lock-screen-login-box-value">
<el-input placeholder="请输入密码" ref="layoutLockScreenInputRef">
<template #append>
<el-button icon="el-icon-right"></el-button>
</template>
</el-input>
</div>
</div>
<div class="layout-lock-screen-login-icon">
<i class="el-icon-microphone"></i>
<i class="el-icon-alarm-clock"></i>
<i class="el-icon-switch-button"></i>
</div>
</div>
</transition>
</div>
<transition name="el-zoom-in-center">
<div v-show="isShowLoockLogin" class="layout-lock-screen-login">
<div class="layout-lock-screen-login-box">
<div class="layout-lock-screen-login-box-img">
<img src="https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1813762643,1914315241&fm=26&gp=0.jpg" />
</div>
<div class="layout-lock-screen-login-box-name">Administrator</div>
<div class="layout-lock-screen-login-box-value">
<el-input placeholder="密码">
<template #append>
<el-button icon="el-icon-right"></el-button>
</template>
</el-input>
</div>
</div>
<div class="layout-lock-screen-login-icon">
<i class="el-icon-microphone"></i>
<i class="el-icon-alarm-clock"></i>
<i class="el-icon-switch-button"></i>
</div>
</div>
</transition>
</div>
</template>
<script lang="ts">
import { nextTick, onMounted, reactive, toRefs } from "vue";
import { nextTick, onMounted, reactive, toRefs, ref, onUnmounted } from "vue";
import { useStore } from "/@/store/index.ts";
import { formatDate } from "/@/utils/formatTime.ts";
export default {
name: "layoutLockScreen",
setup() {
const layoutLockScreenInputRef = ref();
const store = useStore();
const state = reactive({
moveDifference: 0,
transparency: 1,
downClientY: 0,
moveDifference: 0,
isShowLoockLogin: false,
isFlags: false,
querySelectorEl: null,
time: {
hm: "",
s: "",
mdq: "",
},
setIntervalTime: null,
isShowLockScreen: false,
isShowLockScreenIntervalTime: null,
});
//
const onDown = (down) => {
state.isFlags = true;
state.downClientY = down.touches ? down.touches[0].clientY : down.clientY;
};
//
const onMove = (move) => {
if (state.isFlags) {
const el = state.querySelectorEl;
const opacitys = (state.transparency -= 1 / 200);
if (move.touches) {
state.moveDifference = move.touches[0].clientY - state.downClientY;
} else {
state.moveDifference = move.clientY - state.downClientY;
}
if (state.moveDifference >= 0) return false;
el.setAttribute(
"style",
`top:${state.moveDifference}px;cursor:pointer;opacity:${opacitys};`
);
if (state.moveDifference < -400) {
el.setAttribute(
"style",
`top:${-el.clientHeight}px;cursor:pointer;transition:all 0.3s ease;`
);
state.moveDifference = -el.clientHeight;
setTimeout(() => {
el.remove();
}, 300);
}
if (state.moveDifference === -el.clientHeight) {
state.isShowLoockLogin = true;
layoutLockScreenInputRef.value.focus();
}
}
};
//
const onEnd = () => {
state.isFlags = false;
state.transparency = 1;
if (state.moveDifference >= -400) {
state.querySelectorEl.setAttribute(
"style",
`top:0px;opacity:1;transition:all 0.3s ease;`
);
}
};
//
const initGetElement = () => {
nextTick(() => {
const el = document.querySelector(".layout-lock-screen-date");
el.onmousedown = (down) => {
document.onmousemove = (move) => {
let opacitys = (state.transparency -= 1 / 200);
state.moveDifference = move.clientY - down.clientY;
if (state.moveDifference >= 0) return false;
el.setAttribute(
"style",
`top:${state.moveDifference}px;cursor:pointer;opacity:${opacitys};`
);
if (state.moveDifference < -400) {
el.setAttribute(
"style",
`top:${-el.clientHeight}px;cursor:pointer;transition:all 0.3s ease;`
);
state.moveDifference = -el.clientHeight;
setTimeout(() => {
el.remove();
}, 300);
}
if (state.moveDifference === -el.clientHeight) {
state.isShowLoockLogin = true;
}
};
document.onmouseup = (seup) => {
state.transparency = 1;
if (state.moveDifference >= -400) {
el.setAttribute(
"style",
`top:0px;opacity:1;transition:all 0.3s ease;`
);
}
document.onmousemove = null;
document.onmouseup = null;
};
};
state.querySelectorEl = document.querySelector(
".layout-lock-screen-date"
);
});
};
//
const initTime = () => {
state.time.hm = formatDate(new Date(), "HH:MM");
state.time.s = formatDate(new Date(), "SS");
state.time.mdq = formatDate(new Date(), "mm月dd日WWW");
};
//
const initSetTime = () => {
initTime();
state.setIntervalTime = setInterval(() => {
initTime();
}, 1000);
};
//
const initLockScreen = () => {
if (store.state.themeConfig.isLockScreen) {
state.isShowLockScreenIntervalTime = setInterval(() => {
if (store.state.themeConfig.lockScreenTime <= 0) {
state.isShowLockScreen = true;
return false;
}
store.state.themeConfig.lockScreenTime--;
}, 1000);
} else {
clearInterval(state.isShowLockScreenIntervalTime);
}
};
onMounted(() => {
initGetElement();
initSetTime();
initLockScreen();
});
onUnmounted(() => {
clearInterval(state.setIntervalTime);
clearInterval(state.isShowLockScreenIntervalTime);
});
return {
layoutLockScreenInputRef,
onDown,
onMove,
onEnd,
...toRefs(state),
};
},
@ -137,6 +209,9 @@ export default {
&-info {
font-size: 40px;
}
&-minutes {
font-size: 16px;
}
}
}
&-login {
@ -190,5 +265,8 @@ export default {
}
::v-deep(.el-input__inner) {
border-right-color: #f6f6f6;
&:hover {
border-color: #f6f6f6;
}
}
</style>

View File

@ -132,10 +132,16 @@
<el-switch v-model="getThemeConfig.isCollapse1"></el-switch>
</div>
</div>
<div class="layout-breadcrumb-seting-bar-flex mt11">
<div class="layout-breadcrumb-seting-bar-flex-label">自动锁屏</div>
<div class="layout-breadcrumb-seting-bar-flex mt15">
<div class="layout-breadcrumb-seting-bar-flex-label">开启锁屏</div>
<div class="layout-breadcrumb-seting-bar-flex-value">
<el-input-number v-model="getThemeConfig.menuWidth1" controls-position="right" :min="1" :max="999"
<el-switch v-model="getThemeConfig.isLockScreen"></el-switch>
</div>
</div>
<div class="layout-breadcrumb-seting-bar-flex mt11">
<div class="layout-breadcrumb-seting-bar-flex-label">自动锁屏(s/)</div>
<div class="layout-breadcrumb-seting-bar-flex-value">
<el-input-number v-model="getThemeConfig.lockScreenTime" controls-position="right" :min="0" :max="9999"
size="mini" style="width:90px;">
</el-input-number>
</div>
@ -212,7 +218,7 @@
</el-select>
</div>
</div>
<div class="layout-breadcrumb-seting-bar-flex mt15 mb26">
<div class="layout-breadcrumb-seting-bar-flex mt15 mb27">
<div class="layout-breadcrumb-seting-bar-flex-label">主页面切换动画</div>
<div class="layout-breadcrumb-seting-bar-flex-value">
<el-select v-model="getThemeConfig.animation" placeholder="请选择" size="mini" style="width:90px;">