import Vue from 'vue' import Cookies from 'js-cookie' import 'normalize.css/normalize.css' // a modern alternative to CSS resets import './assets/css/iconfont/iconfont.css' import Element from 'element-ui' import './styles/element-variables.scss' import 'xterm/css/xterm.css' // import enLang from 'element-ui/lib/locale/lang/en'// 如果使用中文语言包请默认支持,无需额外引入,请删除该依赖 // import 'lib-flexible/flexible' import '@/styles/index.scss' // global css import globalMixin from '@/mixin/globalMixin'; // 替换为实际的文件路径 // 全局混入 Vue.mixin(globalMixin); let ploady={ reseller_orgid:'', start_date:'', end_date:'' } // reqSaleMoneyList(ploady) // import {saveApprovalInfo} from "@/api/finance/approvalList"; // saveApprovalInfo(JSON.stringify({ // "flag":"update", // "id": "GUwHSPn7oKC-LZoqFfdJ9", // "user_id": "11", // "orgid": "x", // "send_dd_user_id": "11", // "source": "sssss", // "app_key": "aaa", // "app_secret": "app_secret", // "http_aes_key": "http_aes_key", // "http_token": "http_token", // "process_code": "PROC-B2DAA076-6A9F-4740-80AB-0D5D4410F7AC", // "process_name": "process_name", // "update_time": "2023-08-25 16:15:18" // })) // bpmn 工作流绘图工具的样式 // import "bpmn-js/dist/assets/diagram-js.css" // 左边工具栏以及编辑节点的样式 // import "bpmn-js/dist/assets/bpmn-font/css/bpmn.css" // import "bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css" // import "bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css" // import 'bpmn-js-properties-panel/dist/assets/properties-panel.css' // 右边工具栏样式 import App from './App' import store from './store' import router from './router' // import 'default-passive-events' import './icons' // icon import './permission' // permission control // import './utils/error-log' // error log import index from '@/styles/index.css' import { v4 as uuidv4 } from 'uuid';//引入uuid // uuidv4(); sessionStorage.setItem('client_uuid', uuidv4()) // console.log(uuidv4()); // 引入form-create 表单生成器 import formCreate from "@form-create/element-ui" Vue.use(formCreate); import * as filters from './filters' // global filters import HappyScroll from 'vue-happy-scroll' // 引入css import 'vue-happy-scroll/docs/happy-scroll.css' import {reqSaleMoneyList} from "@/api/sales/distributorMangement"; Vue.use(HappyScroll) // Vue.use(axios) // Vue.prototype.axios=axios /** * If you don't want to use mock-server * you want to use MockJs for mock api * you can execute: mockXHR() * * Currently MockJs will be used in the production environment, * please remove it before going online ! ! ! */ // if (process.env.NODE_ENV === 'production') { // const { mockXHR } = require('../mock') // mockXHR() // } // ==================== 防 F12 和右键检查功能开始 ==================== // 只在生产环境启用防调试功能 // if (process.env.NODE_ENV === 'production') { // // 禁止右键菜单 // document.addEventListener('contextmenu', function(e) { // e.preventDefault(); // return false; // }); // // 禁止F12和开发者工具快捷键 // document.addEventListener('keydown', function(e ) { // // 禁止F12 // if (e.key === 'F12') { // e.preventDefault(); // return false; // } // // 禁止Ctrl+Shift+I (Chrome, Edge) // if (e.ctrlKey && e.shiftKey && e.key === 'I') { // e.preventDefault(); // return false; // } // // 禁止Ctrl+Shift+J (Chrome) // if (e.ctrlKey && e.shiftKey && e.key === 'J') { // e.preventDefault(); // return false; // } // // 禁止Ctrl+U (查看源代码) // if (e.ctrlKey && e.key === 'u') { // e.preventDefault(); // return false; // } // // 禁止Ctrl+Shift+C (开发者工具检查元素) // if (e.ctrlKey && e.shiftKey && e.key === 'C') { // e.preventDefault(); // return false; // } // // 禁止Ctrl+Shift+J (Firefox) // if (e.ctrlKey && e.shiftKey && e.key === 'K') { // e.preventDefault(); // return false; // } // }); // // 更准确的开发者工具检测 // let isDevToolsOpened = false; // // 方法1: 检查开发者工具宽度 // function checkDevToolsByWidth() { // const threshold = 160; // 开发者工具通常至少160px宽 // const widthThreshold = window.outerWidth - window.innerWidth > threshold; // const heightThreshold = window.outerHeight - window.innerHeight > threshold; // return widthThreshold || heightThreshold; // } // // 方法2: 检查debugger执行时间(更宽松的阈值) // function checkDevToolsByDebugger() { // return new Promise((resolve) => { // const start = performance.now(); // debugger; // const end = performance.now(); // // 使用更宽松的阈值,避免误报 // resolve(end - start > 200); // }); // } // // 方法3: 检查控制台是否打开 // function checkDevToolsByConsole() { // const element = new Image(); // Object.defineProperty(element, 'id', { // get: function() { // isDevToolsOpened = true; // } // }); // console.log(element); // console.clear(); // 清除测试日志 // } // // 方法4: 检查Eruda等移动端调试工具 // function checkMobileDevTools() { // return !!(window.eruda || window.__eruda || window.vConsole); // } // // 处理检测到调试器的情况 // function handleDebuggerDetected() { // if (!isDevToolsOpened) { // isDevToolsOpened = true; // // 可以选择以下一种或多种处理方式 // // 1. 显示警告信息(推荐) // alert('检测到开发者工具已打开,为了系统安全,请关闭开发者工具。'); // // 2. 跳转到关于页面或其他安全页面 // // window.location.href = '/about'; // // 3. 清空敏感数据 // // sessionStorage.clear(); // // localStorage.clear(); // // 4. 关闭窗口(慎用) // // window.close(); // // 5. 禁用页面交互 // // document.body.innerHTML = '

请关闭开发者工具后刷新页面

'; // } // } // // 定期检查(使用更宽松的间隔) // const checkInterval = setInterval(async function() { // // 如果已经检测到开发工具打开,停止检查 // if (isDevToolsOpened) { // clearInterval(checkInterval); // return; // } // // 检查移动端调试工具 // if (checkMobileDevTools()) { // handleDebuggerDetected(); // return; // } // // 检查窗口大小 // if (checkDevToolsByWidth()) { // handleDebuggerDetected(); // return; // } // // 检查debugger(异步) // const isDebugging = await checkDevToolsByDebugger(); // if (isDebugging) { // handleDebuggerDetected(); // return; // } // // 偶尔检查控制台(不要太频繁) // if (Math.random() < 0.1) { // 10%的概率检查 // checkDevToolsByConsole(); // } // }, 2000); // 每2秒检查一次,减少性能影响 // // 监听窗口大小变化(添加去抖) // let resizeTimer; // window.addEventListener('resize', function() { // clearTimeout(resizeTimer); // resizeTimer = setTimeout(function() { // if (checkDevToolsByWidth() && !isDevToolsOpened) { // handleDebuggerDetected(); // } // }, 500); // }); // // 禁用控制台输出(可选,根据需求开启) // // 注意:这会影响你自己的console.log调试,建议只在生产环境使用 // if (typeof console !== 'undefined') { // const noop = () => {}; // const methods = ['log', 'debug', 'info', 'warn', 'error', 'table', 'dir', 'trace']; // methods.forEach(method => { // console[method] = noop; // }); // // 防止重写console被绕过 // Object.defineProperty(window, 'console', { // get: function() { // return { // log: noop, debug: noop, info: noop, warn: noop, error: noop, // table: noop, dir: noop, trace: noop // }; // }, // set: function() {} // }); // } // console.log('防调试保护已启用'); // } // ==================== 防 F12 和右键检查功能结束 ==================== Vue.use(Element, { size: Cookies.get('size') || 'medium' // set element-ui default size // locale: enLang // 如果使用中文,无需设置,请删除 }) // 解决bug:页面/路由跳转后,滚动条消失,页面无法滚动 //设置跳转页面时给页面的body属性设置滚动条 var onOverflow = ["/shoppingManagement", "/supplierManagement"]; // 修复:在路由守卫中恢复用户状态和重新生成路由 router.beforeEach(async (to, from, next) => { // 清空面包屑状态的代码 // store.commit('tagsView/resetBreadcrumbState'); // 新增:如果已登录且有token,但Vuex状态丢失,从sessionStorage恢复 if (store.getters.token && (!store.getters.user || !store.getters.userType)) { console.log("检测到状态丢失,从sessionStorage恢复用户状态"); const user = sessionStorage.getItem('user'); const auths = sessionStorage.getItem('auths'); const userType = sessionStorage.getItem('userType'); const orgType = sessionStorage.getItem('orgType'); if (user) { store.commit('user/SET_USER', user); } if (auths) { store.commit('user/SET_AUTHS', JSON.parse(auths)); } if (userType) { store.commit('user/SET_USER_TYPE', userType); } if (orgType) { store.commit('user/SET_ORG_TYPE', parseInt(orgType)); } // 重新生成路由 try { const accessRoutes = await store.dispatch('permission/generateRoutes', { user: store.getters.user, auths: store.getters.auths, userType: store.getters.userType, orgType: store.getters.orgType }); // 重新添加路由 router.addRoutes(accessRoutes); // 重定向到当前路由以确保路由更新 next({ ...to, replace: true }); return; } catch (error) { console.error('重新生成路由失败:', error); } } onOverflow.forEach(element => { if (to.path == element) { document.querySelector("body").setAttribute("style", "overflow: auto !important;") } }); next(); }); window.addEventListener('beforeunload', function () { // 清空面包屑状态的代码 store.commit('tagsView/resetBreadcrumbState'); }); Object.keys(filters).forEach(key => { Vue.filter(key, filters[key]) }) Vue.config.productionTip = false new Vue({ el: '#app', router, store, render: h => h(App) })