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])
})
// 在 main.js 的 router.beforeEach 中添加
router.beforeEach((to, from, next) => {
// 清空面包屑状态的代码
// store.commit('tagsView/resetBreadcrumbState');
// 新增:检测是否为移动设备
const userAgent = navigator.userAgent;
const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent);
// 如果是移动设备且访问的是根路径,重定向到移动端首页
if (isMobile && to.path === '/') {
next('/h5HomePage');
return;
}
// 如果是移动设备且访问的不是移动端页面,重定向到移动端首页
if (isMobile && !to.meta?.isMobile && to.path !== '/h5HomePage' && !to.path.startsWith('/h5HomePage/')) {
next('/h5HomePage');
return;
}
// 如果已登录且有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 = 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();
});
Vue.config.productionTip = false
new Vue({
el: '#app',
router,
store,
render: h => h(App)
})