import { ref, nextTick, getCurrentInstance, watch } from 'vue'; import { getToken } from '/@/utils/auth'; import md5 from 'crypto-js/md5'; import { connectWebSocket, onWebSocket } from '/@/hooks/web/useWebSocket'; import { useGlobSetting } from '/@/hooks/setting'; import { useModal } from '/@/components/Modal'; import { useUserStore } from '/@/store/modules/user'; import { isUrl } from '@/utils/is'; import { getQueryVariable, getUrlParams } from '@/utils'; import { useRouter } from 'vue-router'; import { useMessage } from '@/hooks/web/useMessage'; const { createMessage } = useMessage(); export function useDragNotice() { //*********************************websocket配置begin****************************************** const glob = useGlobSetting(); const { push, currentRoute } = useRouter(); const userStore = useUserStore(); const instance: any = getCurrentInstance(); // 初始化 WebSocket function initWebSocket() { const token = getToken(); //将登录token生成一个短的标识 const wsClientId = md5(token); // WebSocket与普通的请求所用协议有所不同,ws等同于http,wss等同于https const url = glob.domainUrl?.replace('https://', 'wss://').replace('http://', 'ws://') + '/dragChannelSocket/' + wsClientId; connectWebSocket(url); onWebSocket(onWebSocketMessage); } async function onWebSocketMessage(data) { console.log('仪表盘监听按钮点击事件websocket', data); if (data?.CMD === 'drag') { //触发动作: url:路径 modal:弹窗 const action = data.result.action; //弹窗类型: 点击按钮打开什么弹窗,根据type打开不同的弹窗 const type = data.result.type; //url地址,可以是路由,也可以是外部链接 let url = data.result.url; //弹窗参数或者url参数 const record = data.result.records || {}; console.log('仪表盘监听点击事件类型type', type); console.log('仪表盘监听点击事件动作action', action); console.log('仪表盘监听点击事件路径url', url); console.log('仪表盘监听点击事件参数', record); //1.路径的话,判断外部链接还是内部路由跳转 if (action == 'url') { //常用下載特殊处理 if (url == 'fileUrl') { url = record[url]; } const urlParamsObj = getUrlParams(url); if (url.startsWith('http')) { window.open(url, '_blank'); } else { push({ path: urlParamsObj.url, query: { ...urlParamsObj.params, ...record } }); } } else { //2.弹窗方式打开项目组件 switch (type) { case 'email': //邮箱查看弹窗 handleOpenType('email', { record }); break; default: break; } } } } //*********************************websocket配置end****************************************** //*********************************打开弹窗修改,动态设置弹窗begin******************************* //当前表单弹窗 const currentModal = ref(null); //当前表单参数 const modalParams = ref({}); //表单注册缓存 const modalRegCache = ref({}); //组件绑定参数 const bindParams = ref({}); /** * 根据类型打开不同弹窗 * @param type * @param params */ async function handleOpenType(type, params) { currentModal.value = null; modalParams.value = { ...params }; switch (type) { case 'email': //邮件查看 currentModal.value = 'EoaMailBoxInModal'; break; default: currentModal.value = null; break; } //注册表单弹窗 initModalRegister(); await nextTick(() => { if (modalRegCache.value[currentModal.value!]?.isRegister) { console.log('已注冊,走缓存'); modalRegCache.value[currentModal.value!].modalMethods.openModal(true, modalParams.value); } }); } /** * 初始化弹窗注册 */ function initModalRegister() { //如果当前选择表单为null,就不处理 if (!currentModal.value) { return; } //判断缓存中是否存在,不存在就走缓存逻辑 if (!modalRegCache.value[currentModal.value]) { const [registerModal, modalMethods] = useModal(); modalRegCache.value[currentModal.value] = { isRegister: false, register: bindRegisterModal(registerModal, modalMethods), modalMethods, }; } } /** * 绑定注册弹窗 * @param regFn * @param modalMethod */ function bindRegisterModal(regFn, modalMethod) { return async (...args) => { console.log('开始注册:', currentModal.value); await regFn(...args); console.log('注册完成:', currentModal.value); //打开弹窗 modalMethod.openModal(true, modalParams.value); //设置缓存标识 modalRegCache.value[currentModal.value!].isRegister = true; }; } //*********************************打开弹窗修改,动态设置弹窗end****************************************** //刷新页面 function reloadPage() { const iframes: any = document.getElementsByClassName('jeecg-iframe-page__main'); // 将 HTMLCollection 转换为数组 const iframeArray = Array.from(iframes); if (currentRoute.value?.meta?.frameSrc && currentRoute.value?.meta?.frameSrc.indexOf('/drag/view?pageId=') >= 0) { const targetIframe: any = iframeArray.find((iframe: any) => iframe.src == currentRoute.value?.meta?.frameSrc); console.log('targetIframe', targetIframe); if (targetIframe) { targetIframe.contentWindow.postMessage({ reload: true }, '*'); } } } return { initDragWebSocket: initWebSocket, handleOpenType, currentModal, modalParams, modalRegCache, bindParams, reloadPage, }; }