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 @@
+
+
+
+
+
+
+
{{ currentTime }}
+
{{ currentDate }}
+
+
+
+
+
![]()
+
🔒
+
+
{{ userStore.nickName }}
+
系统已锁定,请输入密码解锁
+
+
+
+
+
+
+
{{ errorMsg }}
+
+
+
+
+
+
+
+
+