kboss/f/web-kboss/src/main.js
2025-11-20 10:27:14 +08:00

357 lines
10 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 = '<h1>请关闭开发者工具后刷新页面</h1>';
}
}
// 定期检查(使用更宽松的间隔)
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)
})