import router from './router' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import { createPinia } from 'pinia' import { createApp } from 'vue' import App from './App.vue' import { useUserStore } from '@/stores/user' const app = createApp(App) const pinia = createPinia() app.use(router) app.use(ElementPlus) app.use(pinia) // 应用启动时尝试根据后端 session 恢复登录态(需要后端正确返回 Set-Cookie) const userStore = useUserStore(pinia) userStore.fetchCurrentUser().catch(() => { // 静默失败,维持未登录状态 }) app.mount('#app') // ------------------ DevTools 防护(弱保护,易被绕过) ------------------ // 说明:浏览器端无法绝对禁止 DevTools,以下脚本只是拦截常见快捷键并检测 DevTools 打开, // 在检测到时展示一个覆盖提示,增加逆向门槛,但有经验者仍可绕过。 // 拦截常见的打开 DevTools / 查看源码 的快捷键 // function preventDevShortcuts(e) { // // F12 // if (e.keyCode === 123) { // e.preventDefault() // return false // } // // Ctrl+Shift+I / Ctrl+Shift+J / Ctrl+U / Ctrl+S // if (e.ctrlKey && e.shiftKey && (e.key === 'I' || e.key === 'i' || e.key === 'J' || e.key === 'j')) { // e.preventDefault() // return false // } // if (e.ctrlKey && (e.key === 'U' || e.key === 'u' || e.key === 'S' || e.key === 's')) { // e.preventDefault() // return false // } // } // // 禁用右键菜单(可选) // function preventContextMenu(e) { // // 如果你不想全局禁止右键,可以把这个函数内的逻辑改为更精确的判断 // // e.preventDefault() // } // // 检测 DevTools 是否打开(基于窗口尺寸差异的启发式方法) // function createDevToolsDetector(onOpen, onClose) { // let devtoolsOpen = false // const threshold = 160 // 阈值,视浏览器和平台可调整 // function scan() { // try { // const widthDiff = window.outerWidth - window.innerWidth // const heightDiff = window.outerHeight - window.innerHeight // const currentlyOpen = widthDiff > threshold || heightDiff > threshold // if (currentlyOpen && !devtoolsOpen) { // devtoolsOpen = true // onOpen && onOpen() // } else if (!currentlyOpen && devtoolsOpen) { // devtoolsOpen = false // onClose && onClose() // } // } catch (e) { // // 忽略 // } // } // const id = setInterval(scan, 800) // // 返回停止检测的函数 // return () => clearInterval(id) // } // // 显示覆盖提示(简单实现) // function showOverlayMessage() { // debugger // if (document.getElementById('__devtools_block_overlay')) return // const o = document.createElement('div') // o.id = '__devtools_block_overlay' // Object.assign(o.style, { // position: 'fixed', // inset: '0', // background: 'rgba(0,0,0,0.7)', // color: '#fff', // display: 'flex', // alignItems: 'center', // justifyContent: 'center', // zIndex: '999999', // textAlign: 'center', // padding: '20px' // }) // o.innerHTML = `

检测到开发者工具

为保护内容,当前页面在检测到开发者工具打开时被屏蔽。若要继续,请刷新页面或关闭开发者工具。

` // document.body.appendChild(o) // const btn = document.getElementById('__devtools_block_close') // if (btn) btn.addEventListener('click', () => location.reload()) // } // function removeOverlayMessage() { // const el = document.getElementById('__devtools_block_overlay') // if (el) el.remove() // } // // 启动防护(放在监听器里以避免 SSR 问题) // if (typeof window !== 'undefined') { // window.addEventListener('keydown', preventDevShortcuts, { capture: true }) // window.addEventListener('contextmenu', preventContextMenu, { capture: true }) // const stopDetector = createDevToolsDetector(() => { // // 打开时触发:显示覆盖提示 // try { showOverlayMessage() } catch (e) {} // }, () => { // // 关闭时触发:移除覆盖 // try { removeOverlayMessage() } catch (e) {} // }) // // 可选:在页面卸载时清理 // window.addEventListener('beforeunload', () => { // window.removeEventListener('keydown', preventDevShortcuts, { capture: true }) // window.removeEventListener('contextmenu', preventContextMenu, { capture: true }) // stopDetector() // }) // } // ------------------ End DevTools 防护 ------------------