diff --git a/src/api/login.js b/src/api/login.js index 9f333cb..5be6f62 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -39,6 +39,15 @@ export function getInfo() { }) } +// 解锁屏幕 +export function unlockScreen(password) { + return request({ + url: '/unlockscreen', + method: 'post', + data: { password } + }) +} + // 退出方法 export function logout() { return request({ diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index f2cffd4..9663f4a 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -50,7 +50,10 @@ 布局设置 - + + + 锁定屏幕 + 退出登录 @@ -75,11 +78,15 @@ import RuoYiGit from '@/components/RuoYi/Git' import RuoYiDoc from '@/components/RuoYi/Doc' import useAppStore from '@/store/modules/app' import useUserStore from '@/store/modules/user' +import useLockStore from '@/store/modules/lock' import useSettingsStore from '@/store/modules/settings' import HeaderNotice from './HeaderNotice' +const route = useRoute() +const router = useRouter() const appStore = useAppStore() const userStore = useUserStore() +const lockStore = useLockStore() const settingsStore = useSettingsStore() function toggleSideBar() { @@ -91,6 +98,9 @@ function handleCommand(command) { case "setLayout": setLayout() break + case "lockScreen": + lockScreen() + break case "logout": logout() break @@ -116,6 +126,12 @@ function setLayout() { emits('setLayout') } +function lockScreen() { + const currentPath = route.fullPath + lockStore.lockScreen(currentPath) + router.push('/lock') +} + async function toggleTheme(event) { const x = event?.clientX || window.innerWidth / 2 const y = event?.clientY || window.innerHeight / 2 diff --git a/src/permission.js b/src/permission.js index a7d9f87..24a24d6 100644 --- a/src/permission.js +++ b/src/permission.js @@ -6,6 +6,7 @@ import { getToken } from '@/utils/auth' import { isHttp, isPathMatch } from '@/utils/validate' import { isRelogin } from '@/utils/request' import useUserStore from '@/store/modules/user' +import useLockStore from '@/store/modules/lock' import useSettingsStore from '@/store/modules/settings' import usePermissionStore from '@/store/modules/permission' @@ -21,12 +22,20 @@ router.beforeEach((to, from, next) => { NProgress.start() if (getToken()) { to.meta.title && useSettingsStore().setTitle(to.meta.title) + const isLock = useLockStore().isLock /* has token*/ if (to.path === '/login') { next({ path: '/' }) NProgress.done() } else if (isWhiteList(to.path)) { next() + } else if (isLock && to.path !== '/lock') { + next({ path: '/lock' }) + NProgress.done() + } else if (!isLock && to.path === '/lock') { + alert(isLock) + next({ path: '/' }) + NProgress.done() } else { if (useUserStore().roles.length === 0) { isRelogin.show = true diff --git a/src/router/index.js b/src/router/index.js index 86cedb0..796bd7e 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -70,6 +70,12 @@ export const constantRoutes = [ } ] }, + { + path: '/lock', + component: () => import('@/views/lock'), + hidden: true, + meta: { title: '锁定屏幕' } + }, { path: '/user', component: Layout, diff --git a/src/store/modules/lock.js b/src/store/modules/lock.js new file mode 100644 index 0000000..4dd0fa3 --- /dev/null +++ b/src/store/modules/lock.js @@ -0,0 +1,27 @@ +const LOCK_KEY = 'screen-lock' +const LOCK_PATH_KEY = 'screen-lock-path' + +export const useLockStore = defineStore('lock', { + state: () => ({ + isLock: JSON.parse(localStorage.getItem(LOCK_KEY) || 'false'), + lockPath: localStorage.getItem(LOCK_PATH_KEY) || '/index' + }), + actions: { + // 锁定屏幕,同时记录当前路径 + lockScreen(currentPath) { + this.lockPath = currentPath || '/index' + localStorage.setItem(LOCK_PATH_KEY, this.lockPath) + this.isLock = true + localStorage.setItem(LOCK_KEY, 'true') + }, + // 解锁屏幕,清除路径 + unlockScreen() { + this.isLock = false + localStorage.setItem(LOCK_KEY, 'false') + this.lockPath = '/index' + localStorage.setItem(LOCK_PATH_KEY, '/index') + } + } +}) + +export default useLockStore diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 0f54c2d..cde0963 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -3,6 +3,7 @@ import { ElMessageBox, } from 'element-plus' import { login, logout, getInfo } from '@/api/login' import { getToken, setToken, removeToken } from '@/utils/auth' import { isHttp, isEmpty } from "@/utils/validate" +import useLockStore from '@/store/modules/lock' import defAva from '@/assets/images/profile.jpg' const useUserStore = defineStore( @@ -28,6 +29,7 @@ const useUserStore = defineStore( login(username, password, code, uuid).then(res => { setToken(res.token) this.token = res.token + useLockStore().unlockScreen() resolve() }).catch(error => { reject(error) diff --git a/src/views/lock.vue b/src/views/lock.vue new file mode 100644 index 0000000..3fcc102 --- /dev/null +++ b/src/views/lock.vue @@ -0,0 +1,375 @@ + + + + +