// ==UserScript== // @name 改善 JVS 开发体验 // @namespace https://github.com/11ze // @match *://*/* // @icon https://jvsoss.bctools.cn/jvs-public/jvs-auth-mgr/2_1_8/1/application/2024/03/08/2024-03-08950809363759403008-86d5bf057d4bdc12ed6d4341e84e118.png // @grant GM_addStyle // @license MIT // @author 11ze // @version 0.2.27 // @description 2025-04-28 // @downloadURL https://update.greasyfork.icu/scripts/527392/%E6%94%B9%E5%96%84%20JVS%20%E5%BC%80%E5%8F%91%E4%BD%93%E9%AA%8C.user.js // @updateURL https://update.greasyfork.icu/scripts/527392/%E6%94%B9%E5%96%84%20JVS%20%E5%BC%80%E5%8F%91%E4%BD%93%E9%AA%8C.meta.js // ==/UserScript== // 检查是否包含 jvs-ui 的 link 标签 const isJVS = () => { const links = document.getElementsByTagName('link'); for (const link of links) { const matchList = [ 'jvs-ui', 'edf-ui', ]; if (link.href && matchList.some((match) => link.href.includes(match))) { console.log('%c「改善 JVS 开发体验」已检测到 JVS 环境', 'color: #0099ff;'); return true; } } return false; }; (function () { ('use strict'); if (!isJVS()) { return; } setInterval(() => { const operations = [ expandNames, changeTitle, enterAppCenter, enterTabDesign, adjustInterfaceAndComponentStyle, addButtonToOpenNewLogicDesign, addButtonToOpenNewLogicDesignForNestedLogic, addButtonToCopyDesignName, addButtonToCopyComponentName, expandFormButton, addButtonToClearAllFields, expandLogicVariableButton, addButtonToOpenNewFormOrListDesign, highlightApps, expandFormDesignAllComponentSettings, autoExpandComponentLibraryCategory, applicationSetClick, ]; for (const operation of operations) { try { operation(); } catch (error) { console.error('「改善 JVS 开发体验」' + operation.name + ' 运行错误:'); console.error(error); } } }, 400); // changeTitle const envList = [ { ip: '8.138.', env: '开发站' }, { ip: 'jyy-test.', env: '测试站' }, { ip: '47.107.', env: '正式站' }, ]; const designMapping = { 逻辑设计: '逻', 列表设计: '列', 表单设计: '表', 流程设计: '流', }; // log const designSetting = { 逻辑设计: { color: 'blue', shortname: '逻辑' }, 列表设计: { color: 'orange', shortname: '列表' }, 表单设计: { color: 'green', shortname: '表单' }, 流程设计: { color: 'purple', shortname: '流程' }, }; const logsLocalStorageKey = '__11ze_JVS_LOG_LOGS_'; const logOptionsLocalStorageKey = '__11ze_JVS_LOG_OPTIONS_'; // value 是日志对象的 key const logOptions = [ { label: '设计', value: 'tabType', options: ['全部', '逻辑', '表单', '列表', '流程'], selected: '全部', }, { label: '操作', value: 'type', options: ['全部', '打开', '保存'], selected: '打开', }, ]; const logSaveDays = 365; window.designSetting = designSetting; window.logsLocalStorageKey = logsLocalStorageKey; window.logSaveDays = logSaveDays; window.logOptionsLocalStorageKey = logOptionsLocalStorageKey; window.logOptions = logOptions; window.appNameSelectorList = [ // 应用左上角 '#app > div > div > div.jvs-layout > div.jvs-left > div > div.el-menu-scrollbar.el-scrollbar > div.el-scrollbar__wrap > div > div.app-item-info.app-item-info-hide > div > span', // 应用左上角 '#app > div > div > div.jvs-layout > div.jvs-left > div > div.el-menu-scrollbar.el-scrollbar > div.el-scrollbar__wrap > div > div.app-item-info > div > span', // 逻辑设计、列表设计、表单设计 '#app > div > div > div.design-header-box > div.header-left', // 新版 JVS 列表设计、表单设计 'div.design-header-box > div.header-left', ]; function getQueryParamMapping(url) { if (!url) { return {}; } // 先根据 # 分割,再平铺成基于 ? 分割的一维数组 const urlParts = url.split('#'); const urlQuery = urlParts.map((part) => part.split('?')[1]).join('&'); if (!urlQuery) { return {}; } const params = urlQuery.split('&'); const mapping = {}; for (let i = 0; i < params.length; i++) { const param = params[i]; const id = param.split('=')[0]; const value = param.split('=')[1]; mapping[id] = value; } return mapping; } window.getQueryParamMapping = getQueryParamMapping; function getUrl() { return location.href; } window.getUrl = getUrl; function getJvsAppId() { const urlParams = getQueryParamMapping(getUrl()); return urlParams['jvsAppId']; } window.getJvsAppId = getJvsAppId; function getTabType() { // #tab-design > span const typeDom = document.querySelector('#tab-design > span'); if (!typeDom) { return ''; } return typeDom.textContent; } window.getTabType = getTabType; window.appModeMapKey = '__11ze_JVS_APP_MODE_MAP__'; function getAppModelMap() { return JSON.parse(localStorage.getItem(window.appModeMapKey) ?? '{}'); } window.getAppModelMap = getAppModelMap; function getMode() { const systemList = document.querySelector('.system-list'); if (!systemList) { return ''; } const systemListItems = systemList.querySelectorAll('li'); for (const systemListItem of systemListItems) { if (systemListItem.innerText.includes('模式')) { const mode = systemListItem.innerText.trim(); const jvsAppId = window.getJvsAppId(); if (jvsAppId) { const appModeMap = window.getAppModelMap(); appModeMap[jvsAppId] = mode; localStorage.setItem(window.appModeMapKey, JSON.stringify(appModeMap)); } return mode; } } return ''; } window.getMode = getMode; function getModeFromHistory() { const urlParams = getQueryParamMapping(getUrl()); if (!urlParams) { return ''; } const jvsAppId = urlParams['jvsAppId']; if (!jvsAppId) { return ''; } const appModeMap = window.getAppModelMap(); return appModeMap[jvsAppId]; } window.getModeFromHistory = getModeFromHistory; function getModeColor(mode) { const modeColorMapping = { 开发模式: 'black', 测试模式: 'green', 正式模式: 'red', }; return modeColorMapping[mode] ?? 'black'; } window.getModeColor = getModeColor; /** * 展开应用名称和侧边栏功能名称 */ function expandNames() { const appNameSelectorList = [ // 首页 '#app > div > div > div.jvs-layout > div.jvs-main > div.el-scrollbar > div.el-scrollbar__wrap > div > div > div.top-outer-container > div.el-row-bottom-container.el-row > div > div > div > div > p', // 旧应用中心 '#template > div.template-manage-content > div.template-manage-box > div.my-template-list > div > div > div.content > div.content-header > h5', // 新首页 > 常用应用 '#app > div > div > div.jvs-layout > div.jvs-main > div.el-scrollbar > div.el-scrollbar__wrap > div > div > div.top-outer-container > div > div:nth-child(2) > div > div:nth-child(4) > div > div.card-body.el-col.el-col-24 > div > div > p', // 新首页 > 应用中心 '#app > div > div > div.jvs-layout.jvs-layout-tempOpen > div.template-content-box > div.container.el-row > div:nth-child(2) > div > div > div > div:nth-child(1) > p', // 应用左上角 '#app > div > div > div.jvs-layout > div.jvs-left > div > div.el-menu-scrollbar.el-scrollbar > div.el-scrollbar__wrap > div > div.app-item-info.app-item-info-hide > div > span', // 应用左上角 '#app > div > div > div.jvs-layout > div.jvs-left > div > div.el-menu-scrollbar.el-scrollbar > div.el-scrollbar__wrap > div > div.app-item-info > div > span', // 逻辑设计、列表设计、表单设计 '#app > div > div > div.design-header-box > div.header-left', ]; for (let i = 0; i < appNameSelectorList.length; i++) { document.querySelectorAll(appNameSelectorList[i]).forEach((el) => { el.style.whiteSpace = 'normal'; }); } } /** * 修改浏览器标签页标题 */ function changeTitle() { function getEnvironment() { const url = location.href; for (let i = 0; i < envList.length; i++) { if (url.includes(envList[i].ip)) { return envList[i].env; } } return ''; } function getAppName() { // 逻辑设计 // 把 selector 放到 getAppName 获取不到,先保留下面的处理 const title = document.querySelector( '#app > div > div > div.design-header-box > div.header-left > span:nth-child(3)' ); if (title) { return title.textContent.trim(); } for (let i = 1; i < window.appNameSelectorList.length; i++) { const allTextElements = document.querySelectorAll(window.appNameSelectorList[i]); for (let j = 0; j < allTextElements.length; j++) { const text = allTextElements[j].innerHTML; if (!text.includes('<')) { return text.trim(); } if (i === 3) { let splitText = text.split('')[1]; if (!splitText) { continue; } splitText = splitText.split('center;">')[1]; if (!splitText) { continue; } splitText = splitText.split('<')[0]; return splitText.trim(); } const splitText = text.split('')[1]; if (!splitText) { continue; } if (splitText.includes('<')) { return splitText.split('<')[0].trim(); } return splitText.trim(); } } if (location.href.includes('doc.html')) { return '接口文档'; } return ''; } window.getAppName = getAppName; function getTabType() { const typeDom = document.querySelector('#tab-design > span'); if (!typeDom) { return ''; } if (designMapping[typeDom.textContent]) { return designMapping[typeDom.textContent]; } return typeDom.textContent.trim(); } const appName = getAppName(); const tabType = getTabType(); function changeFavicon(iconURL) { const links = document.querySelectorAll("link[rel*='icon']"); // 获取现有的 favicon 元素 if (!links) { // 如果不存在,则创建一个新的 link 元素 const link = document.createElement('link'); link.rel = 'shortcut icon'; // 或 'icon' link.type = 'image/x-icon'; // 设置类型,虽然并非所有浏览器都强制要求 document.head.appendChild(link); } links.forEach(function (link) { link.href = iconURL; // 设置新的图标 URL }); } if (tabType) { document.title = appName; changeFavicon(window.iconMap[tabType]); } else { let prefix = getMode(); if (!prefix) { prefix = getEnvironment(); } document.title = prefix + '|' + (appName ? appName : '未打开应用'); } } /** * 首次进入平台首页时自动进入应用中心 */ function enterAppCenter() { const selector = '#app > div > div > div.jvs-tags > div > div > div.top-nav > ul > li:nth-child(2) > span'; const element = document.querySelector(selector); const url = location.href; if (element) { if ( element.innerText === '应用中心' && url.includes('wel/index') && !element.hasAttribute('app-center-clicked-11ze') ) { element.click(); element.setAttribute('app-center-clicked-11ze', 'true'); } } } window.secondTabDesignClicked11ze = false; /** * 在设计页面自动点击 tab,如【表单设计】 */ function enterTabDesign() { const selector = '#tab-design'; const element = document.querySelector(selector); if (!element) { return; } if (element.getAttribute('second-tab-design-clicked-11ze')) { if (window.secondTabDesignClicked11ze) { return; } window.secondTabDesignClicked11ze = true; element.click(); return; } element.click(); element.setAttribute('second-tab-design-clicked-11ze', 'true'); } /** * 调整界面、组件样式 */ function adjustInterfaceAndComponentStyle() { // 旧版 JVS,逻辑设计,所有在用可拖拽组件,改颜色 const draggableComponents = document.querySelectorAll( 'div.jvs-rule-node.ef-node-container.jtk-droppable' ); const typeToColorList = [ { types: [ '数据模型', '跳过数据权限', '删除数据', '新增数据', '查询单条', '查询所有', '更新模型', '统计条数', ], color: '#ffcbda', }, { types: ['逻辑引擎', '逻辑应用'], color: '#d4e3fc', }, { types: ['循环容器', '对数组对象进行遍历'], color: '#c8f0c7', }, { types: ['中止程序', '提示消息'], color: '#fef7d7', }, { types: [ '对象变量', '数组变量', '对象数组变量', '固定变量', '对象结构', '公式值', '等变量', '结构示例', ], color: '#e6e6fa', }, ]; for (const component of draggableComponents) { const text = component.innerText.trim(); for (const typeToColor of typeToColorList) { if (typeToColor.types.some((t) => text.includes(t))) { component.style.backgroundColor = typeToColor.color; component.style.borderColor = typeToColor.color; break; } } } // 新版 JVS,逻辑设计,所有在用可拖拽组件,改颜色 const newDraggableComponents = document.querySelectorAll('.jvs-rule-node.ef-node-container'); for (const component of newDraggableComponents) { // 获取组件所有文本 const text = component.textContent.trim(); for (const typeToColor of typeToColorList) { if (typeToColor.types.some((t) => text.includes(t))) { component.style.backgroundColor = typeToColor.color; component.style.borderColor = typeToColor.color; break; } } } // 设置侧边栏可选组件的颜色 const sidebarComponents = document.querySelectorAll('.getItem'); for (const component of sidebarComponents) { const text = component.innerText.trim(); for (const typeToColor of typeToColorList) { if (typeToColor.types.some((t) => text.includes(t))) { component.style.backgroundColor = typeToColor.color; component.style.borderColor = typeToColor.color; break; } } } // 新版 JVS,表单设计,组件的名称全部显示出来 const formComponents = document.querySelectorAll('.formitem2'); for (const component of formComponents) { const parent = component.parentElement; if (!parent.getAttribute('draggable')) { continue; } component.classList.add('active-formitem2'); } } /** * 从日志或 url 生成跳转链接 * * @param {*} id 设计 id * @param {*} isFromUrl 是否是从 url 中获取 * @returns string | null */ function getUrlFromLogs(id, isFromUrl) { if (!id) { return null; } const logs = window.getLogs(); for (let i = logs.length - 1; i >= 0; i--) { const log = logs[i]; if (log.id === id) { return log.url; } } if (!isFromUrl) { return null; } const url = location.href; // http://xxx?id=xxx&xxx return url.replace(/id=([^&]*)/, `id=${id}`); } /** * 从日志和 url 生成跳转链接 * @returns string | null */ function getUrlFromLogsAndUrl(logicName, jvsAppId) { if (!logicName) { return null; } const logs = window.getLogs(); for (let i = logs.length - 1; i >= 0; i--) { const log = logs[i]; if (log.jvsAppId !== jvsAppId) { continue; } if (log.designName === logicName) { return log.url; } } return null; } /** * 逻辑设计,检查到【逻辑调用】组件时,自动添加一个按钮用于查看对应的逻辑设计 */ function addButtonToOpenNewLogicDesign() { const buttonClass = 'ze-look-logic-button'; const selector = '.el-form-item__label'; const labels = document.querySelectorAll(selector); for (const label of labels) { if (!label.innerText.includes('逻辑引擎远程调用key')) { continue; } const logicKey = label.nextElementSibling.querySelector('.el-input__inner').title; const newUrl = getUrlFromLogs(logicKey, true); if (!newUrl) { continue; } const existedButton = label.querySelector('.' + buttonClass); if (existedButton) { if (existedButton.getAttribute('target-key') === logicKey) { continue; } existedButton.remove(); } const newButton = document.createElement('button'); newButton.className = buttonClass + ' modern-button el-button el-button--primary el-button--mini button-11ze'; newButton.innerHTML = '查看'; newButton.setAttribute('target-key', logicKey); newButton.onclick = function () { window.open(newUrl, '_blank'); }; newButton.style.marginLeft = '10px'; // 将按钮直接添加到 label 元素中 label.appendChild(newButton); } } /** * 新版逻辑嵌套组件,检查到【逻辑嵌套】组件时,自动添加一个按钮用于查看对应的逻辑设计 * 从已打开过的逻辑设计中获取跳转链接 */ function addButtonToOpenNewLogicDesignForNestedLogicLater() { const buttonClass = 'ze-look-logic-button'; const selector = '.el-form-item__label'; const labels = document.querySelectorAll(selector); for (const label of labels) { if (!label.innerText.includes('选择逻辑引擎')) { continue; } const logicNameElement = label.nextElementSibling.querySelector( '.el-select-dropdown__item.selected > span' ); if (!logicNameElement) { continue; } const logicName = logicNameElement.innerText.trim(); const jvsAppId = window.getJvsAppId(); const newUrl = getUrlFromLogsAndUrl(logicName, jvsAppId); if (!newUrl) { continue; } const existedButton = label.querySelector('.' + buttonClass); if (existedButton) { if (existedButton.getAttribute('target-key') === logicName) { continue; } existedButton.remove(); } const newButton = document.createElement('button'); newButton.className = buttonClass + ' modern-button el-button el-button--primary el-button--mini button-11ze'; newButton.innerHTML = '查看'; newButton.setAttribute('target-key', logicName); newButton.onclick = function () { window.open(newUrl, '_blank'); }; newButton.style.marginLeft = '10px'; // 将按钮直接添加到 label 元素中 label.appendChild(newButton); } } /** * 新版逻辑嵌套组件,检查到【逻辑嵌套】组件时,自动添加一个按钮用于查看对应的逻辑设计 * 从左上角的 icon 中获取跳转页面 */ function addButtonToOpenNewLogicDesignForNestedLogic() { const buttonClass = 'ze-look-logic-button'; const selector = '.el-form-item__label'; const labels = document.querySelectorAll(selector); const otherRuleListIcon = document.querySelector('.rule-list-icon'); if (!otherRuleListIcon) { return; } if (!otherRuleListIcon.getAttribute('check-logic-design-rule-list-icon-11ze')) { // 点击后才有逻辑列表 otherRuleListIcon.click(); otherRuleListIcon.click(); } otherRuleListIcon.setAttribute('check-logic-design-rule-list-icon-11ze', 'true'); function createButton(target, element, logicName) { const newButton = document.createElement('button'); newButton.className = buttonClass + ' modern-button el-button el-button--primary el-button--mini button-11ze'; newButton.innerHTML = '查看'; newButton.setAttribute('target-key', logicName); newButton.onclick = function () { element.click(); }; newButton.style.marginLeft = '10px'; // 将按钮直接添加到 label 元素中 target.appendChild(newButton); } const otherRuleList = document.querySelectorAll('.other-rule-list > .list-box > .list-item'); for (const label of labels) { if (!label.innerText.includes('选择逻辑引擎')) { continue; } const logicNameElement = document.querySelector( '.el-scrollbar__view.el-select-dropdown__list > .el-select-dropdown__item.selected > span' ); if (!logicNameElement) { continue; } const logicName = logicNameElement.innerText.trim(); const existedButton = label.querySelector('.' + buttonClass); if (existedButton) { if (existedButton.getAttribute('target-key') === logicName) { continue; } existedButton.remove(); } for (const otherRule of otherRuleList) { // 从 otherRule 里拿到 span 标签的 title 属性,内容是逻辑设计的名称 const title = otherRule.querySelector('span').title.trim(); if (title === logicName) { createButton(label, otherRule, logicName); return; } } addButtonToOpenNewLogicDesignForNestedLogicLater(); } } // 新版 JVS,在逻辑设计名称旁边添加复制按钮 function addButtonToCopyDesignName() { // 逻辑设计 let designName = document.querySelector( '#app > div > div > div.design-header-box > div.header-left > span' ); if (!designName) { // 表单设计 designName = document.querySelector( '#app > div > div > div:nth-child(1) > div.design-header-box > div.header-left > span' ); } if (designName) { const designNameText = designName.innerText.trim(); const existedButton = document.querySelector('#copy-design-name-button-11ze'); if (existedButton) { if (existedButton.getAttribute('design-name-11ze') === designNameText) { return; } existedButton.remove(); } if (!designName.querySelector('use')) { return; } const copyButton = document.createElement('button'); copyButton.innerHTML = '复制'; copyButton.className = 'modern-button el-button el-button--primary el-button--mini button-11ze'; copyButton.id = 'copy-design-name-button-11ze'; if (designNameText) { copyButton.setAttribute('design-name-11ze', designNameText); } copyButton.onclick = function () { copyToClipboard(designNameText, copyButton, '已复制'); }; designName.parentNode.insertBefore(copyButton, designName.nextSibling); } } function copyToClipboard(text, button, successMessage) { const copyTextToClipboard = (text) => { if (navigator.clipboard && navigator.clipboard.writeText) { return navigator.clipboard.writeText(text); } else { // 回退方法:创建一个临时的文本区域元素 const textArea = document.createElement('textarea'); textArea.value = text; textArea.style.position = 'fixed'; // 避免滚动到底部 document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { document.execCommand('copy'); return Promise.resolve(); } catch (err) { return Promise.reject(err); } finally { document.body.removeChild(textArea); } } }; copyTextToClipboard(text) .then(() => { const originalText = button.textContent; button.textContent = successMessage; button.disabled = true; setTimeout(() => { button.textContent = originalText; button.disabled = false; }, 1000); }) .catch((err) => { console.error('复制失败:', err); alert('复制失败,请重试'); }); } window.currentPageNotAddCopyComponentNameButton = false; /** * 新版 JVS,添加按钮复制组件名称 */ function addButtonToCopyComponentName() { const buttonClass = 'ze-copy-component-name-button'; const componentName = document.querySelector('#node_detailpannel > h4 > div > span'); if (!componentName) { return; } // 不在旧版加按钮,如果父级有子元素 el-icon-document-copy,则 return if (componentName.parentNode.querySelector('.el-icon-document-copy')) { window.currentPageNotAddCopyComponentNameButton = true; return; } if (window.currentPageNotAddCopyComponentNameButton) { return; } const componentNameText = componentName.innerText.trim(); const existedButton = document.querySelector('#copy-component-name-button-11ze'); if (existedButton) { if (existedButton.getAttribute('component-name-11ze') === componentNameText) { return; } existedButton.remove(); } const copyButton = document.createElement('button'); copyButton.innerHTML = '复制'; copyButton.className = buttonClass + ' modern-button el-button el-button--primary el-button--mini button-11ze'; copyButton.onclick = function () { copyToClipboard(componentNameText, copyButton, '已复制'); }; copyButton.id = 'copy-component-name-button-11ze'; copyButton.setAttribute('component-name-11ze', componentNameText); componentName.parentNode.insertBefore(copyButton, componentName.nextSibling); } /** * 新版 JVS,表单设计,自动展开表单设计的按钮设置 */ function expandFormButton() { const buttons = document.querySelectorAll('.item-body'); if (buttons) { for (const button of buttons) { if (button.getAttribute('item-body-checked-11ze') === 'true') { continue; } if (button.style.display === 'none') { button.style.display = 'block'; button.setAttribute('item-body-checked-11ze', 'true'); } } } } /** * 逻辑设计,添加按钮一键清空所有字段 */ function addButtonToClearAllFields() { const boxes = document.querySelectorAll('.data-model-box'); for (let i = 0; i < boxes.length; i++) { const box = boxes[i]; if (box.querySelector('#clear-all-fields-button-11ze' + i)) { continue; } const button = document.createElement('button'); button.className = 'modern-button el-button el-button--primary el-button--mini button-11ze'; button.innerHTML = '清空'; button.id = 'clear-all-fields-button-11ze' + i; button.onclick = function () { const ps = box.querySelectorAll('p'); for (let i = ps.length - 1; i >= 0; i--) { const el = ps[i]; if (el.querySelector('.delete-icon-button')) { el.querySelector('.delete-icon-button > span').click(); } if (el.querySelector('.el-icon-delete')) { el.querySelector('.el-icon-delete').click(); } } }; box.insertBefore(button, box.firstChild); } } /** * 新版 JVS,逻辑设计,自动展开变量组件设置里的按钮 */ function expandLogicVariableButton() { const buttons = document.querySelectorAll('.bottom-body'); if (buttons) { for (const button of buttons) { if (button.getAttribute('bottom-body-checked-11ze') === 'true') { continue; } if (button.style.display === 'none') { button.style.display = 'block'; button.setAttribute('bottom-body-checked-11ze', 'true'); } } } } /** * 在列表表单列表的 id 旁边添加查看按钮 */ function addButtonToOpenNewFormOrListDesign() { // 列表设计页面也有元素,得排除 const tabType = window.getTabType(); if (tabType === '列表设计') { return; } const selector = 'div.table-body-box > div > div.el-table__body-wrapper.is-scrolling-none > table > tbody > tr > td:nth-child(2) > div > span > span > div'; const elements = document.querySelectorAll(selector); for (const element of elements) { const designId = element.innerText.trim(); if (!designId) { continue; } element.style.whiteSpace = 'normal'; if (element.getAttribute('form-added-button-11ze')) { continue; } const targetUrl = getUrlFromLogs(designId, false); if (!targetUrl) { continue; } const copyButton = document.createElement('button'); copyButton.innerHTML = '查看'; copyButton.className = 'modern-button el-button el-button--primary el-button--mini button-11ze'; copyButton.id = 'open-new-form-or-list-design-button-11ze'; copyButton.onclick = function () { window.open(targetUrl, '_blank'); }; const targetElement = element.parentElement.parentElement.parentElement.parentElement.parentElement.querySelector( 'td:nth-child(5) > div > div' ); if (targetElement) { targetElement.appendChild(copyButton); element.setAttribute('form-added-button-11ze', 'true'); } } } /** * 自动展开表单设计所有组件设置 */ function expandFormDesignAllComponentSettings() { // 表单设计 const tabType = window.getTabType(); if (tabType !== '表单设计') { return; } // 文字标题元素跟展开内容元素同级 const buttons = document.querySelectorAll('.el-collapse-item > .el-collapse-item__wrap'); for (const button of buttons) { if (button.getAttribute('bottom-body-checked-11ze')) { continue; } const text = button.parentElement.innerText.trim(); const targetNames = ['设置', '扩展', '功能', '校验']; for (const targetName of targetNames) { if (text.includes(targetName)) { button.style.display = 'block'; break; } } button.setAttribute('bottom-body-checked-11ze', 'true'); } } /** * 高亮应用中心的应用 */ function highlightApps() { const highlightAppsKey = '__11ze_HIGHLIGHT_APPS__'; const labelClass = 'ze-highlight-label'; const appList = JSON.parse(localStorage.getItem(highlightAppsKey) ?? '[]'); function getContentSelector() { return 'div > div > div > p'; } function handle(nodes, appList) { // 如果在 appList 中,就高亮 nodes.forEach((n) => { const text = getNodeText(n); const label = n.querySelector(`.${labelClass}`); if (!label) { return; } if (appList.includes(text)) { n.style.border = '2px solid blue'; label.style.backgroundColor = 'white'; } else { n.style.border = '2px solid transparent'; label.style.backgroundColor = 'white'; } }); } function getNodeText(node) { return node.querySelector(getContentSelector()).innerText.trim(); } function handleClickNode(node) { const text = getNodeText(node); if (appList.includes(text)) { appList.splice(appList.indexOf(text), 1); } else { appList.push(text); } localStorage.setItem(highlightAppsKey, JSON.stringify(appList)); } function main() { const containerSelector = '.application'; // 找到相关容器,不存在就结束 const application = document.querySelector(containerSelector); if (!application) return; // 找到相关数据项,不存在就结束 const nodes = [...document.querySelectorAll(containerSelector)]; if (!nodes) return; // 不存在,结束 // 设置点击事件 nodes.forEach((n) => { if (n.querySelector(`.${labelClass}`)) { return; } // 加一个按钮,点击后高亮 const button = document.createElement('button'); button.innerHTML = '    '; button.className = labelClass + ' modern-button el-button el-button--primary el-button--mini'; button.style.borderColor = '#c8f0c7'; button.style.borderRadius = '5px'; button.style.borderWidth = '1px'; button.style.borderStyle = 'solid'; button.style.borderColor = '#c8f0c7'; button.onclick = (event) => { event.stopPropagation(); handleClickNode(n); }; n.querySelector('div > div > div').appendChild(button); }); // 渲染 handle(nodes, appList); } main(); } /** * 窗口聚焦时自动松开一次左 Ctrl 键 * 场景:按快捷键切换软件时,如果包含 Ctrl,回到逻辑设计时,Ctrl 会一直按住,导致鼠标拖拽变成画框 * 不用了,控制台有错误:Uncaught TypeError: Cannot read properties of undefined (reading 'removeEventListener') at HTMLDocument. (page.f3111d50.js:34:1216471) */ function autoClickLeftCtrlKey() { const container = document.querySelector('.container'); if (!container) { return; } container.addEventListener('focus', function () { // 创建一个模拟 Ctrl 键弹起的 KeyboardEvent (可选,如果需要模拟按下和弹起) const ctrlUp = new KeyboardEvent('keyup', { key: 'Control', code: 'ControlLeft', ctrlKey: false, bubbles: true, }); container.dispatchEvent(ctrlUp); }); } /** * 逻辑设计,自动展开组件库里指定的分类 */ function autoExpandComponentLibraryCategory() { if (window.autoExpandComponentLibraryCategory11ze) { return; } const ruleCategories = document.querySelectorAll('.left-tool-list-box > .rule-assembly-list'); if (ruleCategories.length === 0) { return; } for (const ruleCategory of ruleCategories) { if (ruleCategory.classList.contains('open')) { continue; } if (ruleCategory.getAttribute('auto-expand-component-library-category-11ze')) { continue; } const textDom = ruleCategory.querySelector('div > div > .label'); if (!textDom) { continue; } const text = textDom.innerText.trim(); if (['模型插件', '服务插件', '自定义代码插件'].includes(text)) { const left = ruleCategory.querySelector('.t-left'); if (left) { left.dispatchEvent(new MouseEvent('click', { bubbles: true })); } } ruleCategory.setAttribute('auto-expand-component-library-category-11ze', 'true'); } function simulateMouseClick(element) { const mouseClickEvents = ['mousedown', 'click', 'mouseup']; mouseClickEvents.forEach((mouseEventType) => { const mouseEvent = new MouseEvent(mouseEventType, { bubbles: true, // 允许事件冒泡 cancelable: true, // 允许事件被取消 clientX: element.clientWidth, // 设置点击位置 clientY: element.clientHeight, // 设置点击位置 }); element.dispatchEvent(mouseEvent); }); } // 鼠标左键点击一次,收起组件库 const container = document.querySelector('.butterfly-wrapper'); if (container) { simulateMouseClick(container); } window.autoExpandComponentLibraryCategory11ze = true; } window.appNameMapKey = '__11ze_JVS_APP_NAME_MAP__'; function getAppNameMap() { return JSON.parse(localStorage.getItem(window.appNameMapKey) ?? '{}'); } window.getAppNameMap = getAppNameMap; function getAppIdName(jvsAppId) { const appNameMap = getAppNameMap(); return appNameMap[jvsAppId] ?? ''; } window.getAppIdName = getAppIdName; function saveAppIdName(jvsAppId, appName) { const appNameMap = getAppNameMap(); appNameMap[jvsAppId] = appName; localStorage.setItem(window.appNameMapKey, JSON.stringify(appNameMap)); } function applicationSetClick() { const applicationElements = document.querySelectorAll('div.application'); if (applicationElements.length === 0) { return; } applicationElements.forEach(function (appElement) { if (appElement.classList.contains('set-click-11ze')) { return; } appElement.addEventListener('click', function (event) { const clickedElement = event.currentTarget; const idElement = clickedElement.querySelector('label.el-checkbox span.el-checkbox__label'); const nameElement = clickedElement.querySelector('p'); let applicationId = null; let applicationName = null; if (idElement) { applicationId = idElement.textContent.trim(); } else { console.warn('11ze 未找到 ID 元素:', clickedElement); } if (nameElement) { applicationName = nameElement.textContent.trim(); } else { console.warn('11ze 未找到名称元素:', clickedElement); } if (applicationId !== null && applicationName !== null) { saveAppIdName(applicationId, applicationName); } else { console.warn('11ze 应用中心点击应用未能完整获取点击的应用信息:', clickedElement); } }); appElement.classList.add('set-click-11ze'); }); } })(); /** * 记录和查看开发日志 */ window.onload = function () { ('use strict'); if (!isJVS()) { return; } function log() { function getTabType() { return window.getTabType(); } function getUrl() { return window.getUrl(); } function getJvsAppId() { return window.getJvsAppId(); } function getId() { return getQueryParamMapping(getUrl())['id']; } function getCurrentTime() { return new Date().getTime(); } function getNewTabTitle() { return window.getAppName(); } const appIdSelectorList = window.appNameSelectorList; function getAppName() { for (let i = 0; i < appIdSelectorList.length; i++) { const allTextElements = document.querySelectorAll(appIdSelectorList[i]); for (let j = 0; j < allTextElements.length; j++) { const text = allTextElements[j].textContent; if (text) { const textArray = text .trim() .split('\n') .map((item) => item.trim()); const newTextArray = []; textArray.forEach((item) => { if (item.trim() === '') { return; } newTextArray.push(item.trim()); }); if (document.querySelector('.list-item')) { const name = newTextArray[newTextArray.length - 3]; if (name) { return name; } } return newTextArray[0]; } } } return ''; } const url = getUrl(); const id = getId(); const time = getCurrentTime(); const tabType = getTabType(); const designName = getNewTabTitle(); const appName = getAppName(); const jvsAppId = getJvsAppId(); // 如果有一个为空则返回 null if (!designName || !appName || !id || !jvsAppId || !tabType) { return null; } return { tabType, url, time, designName, appName, id, jvsAppId, }; } function cutOverdueLogs(logs, currentTime) { // 每个 log 有 time 字段,格式为时间戳 // 从数组删除时间戳跟当前时间相差 n 天的 log for (let i = 0; i < logs.length; i++) { const log = logs[i]; if (!log.time) { logs.splice(i, 1); continue; } if (Math.abs(currentTime - log.time) > logSaveDays * 24 * 60 * 60 * 1000) { logs.splice(i, 1); continue; } } logs = uniqueLogs(logs); localStorage.setItem(logsLocalStorageKey, JSON.stringify(logs)); return logs; } function getLogs() { const logs = JSON.parse(localStorage.getItem(logsLocalStorageKey)); if (!logs) { return []; } logs.forEach((log) => { if (!log.appName || log.appName.length > 100 || log.appName === log.designName) { log.appName = window.getAppIdName(log.jvsAppId); } }); return cutOverdueLogs(logs, new Date().getTime()); } window.getLogs = getLogs; function saveLog(logObj, type) { if (!logObj) { return; } logObj.type = type; const logList = getLogs(); logList.push(logObj); localStorage.setItem(logsLocalStorageKey, JSON.stringify(logList)); } function uniqueLogs(logs) { const appIds = []; const uniqueLogs = []; for (let i = logs.length - 1; i >= 0; i--) { const log = logs[i]; const urlParams = getQueryParamMapping(log.url); const id = urlParams['id'] + log.type; if (!appIds.includes(id)) { appIds.push(id); uniqueLogs.push(log); } } return uniqueLogs.reverse(); } function formatTime(time) { const date = new Date(time); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return `${month}-${day} ${hours}:${minutes}:${seconds}`; } function getQueryParamMapping(url) { return window.getQueryParamMapping(url); } function getJvsAppIdsFromLogs(logs) { const appIds = []; for (let i = 0; i < logs.length; i++) { const log = logs[i]; if (!appIds.includes(log.jvsAppId)) { appIds.push(log.jvsAppId); } } return appIds; } function getRandomColor() { const letters = '0123456789ABCDEF'; let color = '#'; for (let i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * 16)]; } return color; } function getAppColorMapping(appNames) { const appColorMapping = {}; for (let i = 0; i < appNames.length; i++) { const appName = appNames[i]; appColorMapping[appName] = getRandomColor(); } return appColorMapping; } function getOptions() { const options = JSON.parse(localStorage.getItem(logOptionsLocalStorageKey)); if (!options) { return logOptions; } if (options.length !== logOptions.length) { return logOptions; } return options; } function saveOptions(selectedValue) { if (!selectedValue) { return; } const options = getOptions(); const selectedArray = selectedValue.split('-'); const value = selectedArray[0]; const selected = selectedArray[1]; for (let i = 0; i < options.length; i++) { const option = options[i]; if (option.value === value) { option.selected = selected; } } localStorage.setItem(logOptionsLocalStorageKey, JSON.stringify(options)); } function filterLogs(logs, options) { if (!options) { return logs; } const filteredLogs = []; for (let i = 0; i < logs.length; i++) { let log = logs[i]; let allSelected = true; for (let j = 0; j < options.length; j++) { const option = options[j]; if (option.selected === '全部') { continue; } if (!log[option.value].includes(option.selected)) { allSelected = false; break; } } if (allSelected) { filteredLogs.push(log); } } return filteredLogs; } function showPopup() { const popupId = '11ze-jvs-log-popup'; const popup = document.createElement('div'); popup.className = 'popup'; popup.id = popupId; const oldPopup = document.getElementById(popupId); if (oldPopup) { oldPopup.remove(); return; } const optionsDiv = document.createElement('div'); optionsDiv.style.textAlign = 'right'; const lastLogOptions = getOptions(); for (let i = 0; i < lastLogOptions.length; i++) { const currentDiv = document.createElement('div'); currentDiv.className = 'log-11ze-select-container'; const selectDom = document.createElement('select'); selectDom.className = 'log-11ze-select'; for (let j = 0; j < lastLogOptions[i].options.length; j++) { const option = document.createElement('option'); option.value = lastLogOptions[i].value + '-' + lastLogOptions[i].options[j]; option.textContent = lastLogOptions[i].options[j]; if (lastLogOptions[i].selected === lastLogOptions[i].options[j]) { option.selected = true; } selectDom.appendChild(option); } const pDom = document.createElement('p'); pDom.className = 'log-11ze-select-label'; pDom.textContent = lastLogOptions[i].label; currentDiv.appendChild(pDom); currentDiv.appendChild(selectDom); optionsDiv.appendChild(currentDiv); selectDom.onchange = function () { const selectedValue = selectDom.value; saveOptions(selectedValue); showPopup(); showPopup(); }; } popup.appendChild(optionsDiv); let logs = getLogs(); logs = filterLogs(logs, lastLogOptions); const appColorMapping = getAppColorMapping(getJvsAppIdsFromLogs(logs)); const appModeMap = window.getAppModelMap(); const listContent = []; for (let i = logs.length - 1; i >= 0; i--) { const oneLog = logs[i]; const datetime = formatTime(oneLog.time); const urlParams = getQueryParamMapping(oneLog.url); const currentType = designSetting[oneLog.tabType] ?? { color: 'red', shortname: '未知', }; const logFieldColor = oneLog.type === '打开' ? 'black' : 'red'; let appName = oneLog.appName; if (appName.length > 16) { appName = appName.substring(0, 16) + '…'; } const designName = oneLog.designName; const jvsAppId = oneLog.jvsAppId; const appColor = appColorMapping[jvsAppId]; const mode = appModeMap[jvsAppId] ?? ''; const modeColor = window.getModeColor(mode); listContent.push(` ${urlParams.id}   ${appName}   ${mode.replace('模式', '')}   ${currentType.shortname}   ${designName}   ${oneLog.type}   ${datetime}   打开   `); } const logTable = document.createElement('table'); logTable.className = 'table'; logTable.innerHTML = ` 设计 id   应用   模式   类型   名称   操作   时间   操作   ${listContent.join('')} `; logTable.style.fontSize = '0.9em'; logTable.style.minWidth = '800px'; logTable.style.borderBottom = '1px solid #dddddd'; logTable.style.textAlign = 'left'; popup.appendChild(logTable); popup.style.position = 'fixed'; popup.style.top = '50px'; popup.style.left = '20px'; popup.style.zIndex = '9999'; popup.style.backgroundColor = 'white'; popup.style.padding = '10px'; popup.style['max-height'] = '800px'; popup.style['overflow-y'] = 'auto'; document.body.appendChild(popup); // 添加点击事件监听器 document.addEventListener('click', closePopupOnOutsideClick); } // 新增函数: 检查点击是否在popup外部并关闭popup function closePopupOnOutsideClick(event) { const popup = document.getElementById('11ze-jvs-log-popup'); // 这是打开popup的按钮 const button = document.querySelector('.modern-button'); if (popup && !popup.contains(event.target) && event.target !== button) { popup.remove(); document.removeEventListener('click', closePopupOnOutsideClick); } } window.savedLogDesignName = ''; window.savedLogAppName = ''; function main() { const newLog = log(); if (newLog && newLog.tabType) { // 设计页面没有应用名称时会拿到逻辑设计列表 if (newLog.appName.length > 100 || newLog.appName === newLog.designName) { newLog.appName = window.getAppIdName(newLog.jvsAppId); } const needToSave = window.savedLogDesignName !== newLog.designName || window.savedLogAppName !== newLog.appName; if (needToSave) { saveLog(newLog, '打开'); window.savedLogDesignName = newLog.designName; window.savedLogAppName = newLog.appName; } } // 用于显示当前在的模式 let buttonName = '日志'; let mode = getModeFromHistory(); if (!mode) { mode = window.getMode(); } if (mode) { const modeSpan = document.createElement('span'); modeSpan.style.color = window.getModeColor(mode); modeSpan.innerHTML = mode; buttonName = modeSpan.outerHTML + '|' + buttonName; } createButton(buttonName); } function createButton(buttonName) { const existButton = document.getElementById('ze-jvs-log-button'); if (existButton) { if (existButton.innerHTML === buttonName) { return; } existButton.remove(); } // 在页面固定位置(绝对位置,悬浮)插入一个按钮 // 点击按钮打开一个弹窗显示内容(全局唯一),已有窗口则直接显示 const button = document.createElement('button'); button.innerHTML = buttonName; button.className = 'modern-button el-button el-button--primary el-button--mini button-11ze'; button.style.position = 'fixed'; button.style.top = '10px'; button.style.right = '300px'; button.style.zIndex = '9998'; button.style.fontSize = '13px'; button.id = 'ze-jvs-log-button'; button.onclick = function (event) { event.stopPropagation(); // 阻止事件冒泡到 document showPopup(); }; document.body.appendChild(button); } // 逻辑设计的保存按钮 const saveButton = document.querySelector( '#app > div > div > div.design-header-box > div.header-right > button' ); if (saveButton) { saveButton.addEventListener('click', function () { const newLog = log(); if (newLog) { saveLog(newLog, '保存'); } }); } setInterval(() => { try { main(); } catch (error) { console.error('「改善 JVS 开发体验」日志功能运行错误:'); console.error(error); } }, 400); }; window.iconMap = { 列: 'data:image/png;base64,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', 表: 'data:image/png;base64,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', 逻: 'data:image/png;base64,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', 流: 'data:image/png;base64,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', }; const css = ` /* 修改模型信息的弹窗宽度 */ body > div > div.el-dialog[aria-label="修改模型"], body > div > div.el-dialog[aria-label="数据集详情"], body > div > div.el-dialog[aria-label="数据模型配置"] { width: 75% !important; } /* 列表设计的按钮设置弹窗宽度 */ body > div > div.el-dialog[aria-label="导出"], body > div > div.el-dialog[aria-label="下载模板"] { width: 75% !important; } /* 逻辑设计,调整画布侧边栏宽度 */ .canvas-tool { width: 260px !important; } /* 逻辑设计,画布列表的图标 */ .canvas-tool-item > svg { display: none; } /* 调整画布右边的按钮位置 */ .itempannel-box { left: 220px !important; } /* 新版 JVS,逻辑设计,把浮动操作栏的宽度减小到 45% */ .tool-bar { width: 45% !important; } /* 新版 JVS,逻辑设计,组件详情底部的按钮,设置高度,原本 32px,改成 72px */ #node_detailpannel > div.block-container > div > form > div.el-row > div.form-item-btn.el-col.el-col-24 > div > div { .el-button, span { height: 72px !important; width: 90px !important; } } /* 逻辑设计,展开组件库的组件名称(换行) */ .left-tool-list { li.getItem > span { white-space: normal !important; } } /* 新版应用中心,移除每个分类末尾的透明方块(影响点击) */ #app > div > div > div.jvs-layout.jvs-layout-tempOpen > div.template-content-box > div > div.el-col.el-col-10.el-col-md-6.el-col-lg-18.el-col-xl-3 > div > div:nth-child(1) > div:nth-child(3) > div:nth-child(3) > img { display: none !important; } /* 放大公式 icon,原本 16px */ .add-formula-svg { width: 22px !important; height: 22px !important; } /* 移除新版逻辑设计右下角遮挡按钮的透明条 */ .cont-box-right > .tool-bar { display: none !important; } /* 逻辑设计,展开组件名称 */ .ef-node-text, .canvas-tool-item { white-space: normal !important; width: 100% !important; color: #363b4c !important; } /* 逻辑设计,调整页面设置和已使用逻辑的宽度 */ .content-box:has(.page-setting), .content-box:has(.used-logic) { width: 80% !important; margin-left: 10% !important; } /* 逻辑设计,设计名称输入框 */ #app > div > div > div.design-header-box > div.header-left > div.el-input.el-input--mini > input.el-input__inner { width: 300px !important; } /* 逻辑设计,设计名称编辑 icon */ #app > div > div > div.design-header-box > div.header-left > span > svg { width: 22px !important; height: 22px !important; } /* 自己加的组件 */ /* 日志弹窗的表格 */ .log-11ze-table-tr > td, .log-11ze-table-tr > th { } .log-11ze-table-tr:hover { background-color: #d5e3fb; /* 悬停时的背景颜色 */ } .log-11ze-select-container { display: inline-block; margin-right: 10px; } .log-11ze-select-label { display: inline-block; margin-right: 5px; } .log-11ze-select { display: inline-block; } /* 按钮统一样式 */ .button-11ze { background-color: white !important; border-color: #d4e3fc !important; color: black !important; border: 1px solid #e0e0e0 !important; } `; GM_addStyle(css);