Files
qhmes/jeecgboot-vue3/src/hooks/web/useDragNotice.ts
2026-04-03 09:56:14 +08:00

166 lines
5.8 KiB
Vue
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 { 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等同于httpwss等同于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<string | null>(null);
//当前表单参数
const modalParams = ref<Recordable>({});
//表单注册缓存
const modalRegCache = ref<Recordable>({});
//组件绑定参数
const bindParams = ref<Recordable>({});
/**
* 根据类型打开不同弹窗
* @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,
};
}