// ==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.21
// @description 2025-03-04
// ==/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,
];
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('</svg>')[1];
if (!splitText) {
continue;
}
splitText = splitText.split('center;">')[1];
if (!splitText) {
continue;
}
splitText = splitText.split('<')[0];
return splitText.trim();
}
const splitText = text.split('</svg>')[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;
}
if (log.designName.includes(logicName)) {
return log.url;
}
if (logicName.includes(log.designName)) {
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) {
const inputName = otherRule.innerHTML.trim();
if (inputName === logicName) {
createButton(label, otherRule, logicName);
return;
}
if (inputName.includes(logicName)) {
createButton(label, otherRule, logicName);
return;
}
if (logicName.includes(inputName)) {
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 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.<anonymous> (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.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 [];
}
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(`
<tr class="log-11ze-table-tr">
<td> ${urlParams.id} </td>
<td style="color: ${appColor}"> ${appName} </td>
<td style="color: ${modeColor}"> ${mode.replace('模式', '')} </td>
<td style="color: ${currentType.color}"> ${currentType.shortname} </td>
<td> ${designName} </td>
<td style="color: ${logFieldColor}"> ${oneLog.type} </td>
<td> ${datetime} </td>
<td> <a href="${oneLog.url}" target="_blank">打开</a> </td>
</tr>
`);
}
const logTable = document.createElement('table');
logTable.className = 'table';
logTable.innerHTML = `
<thead>
<tr style="background-color: #eef5fe" class="log-11ze-table-tr">
<th> 设计 id </th>
<th> 应用 </th>
<th> 模式 </th>
<th> 类型 </th>
<th> 名称 </th>
<th> 操作 </th>
<th> 时间 </th>
<th> 操作 </th>
</tr>
</thead>
<tbody>
${listContent.join('')}
</tbody>
`;
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) {
const needToSave =
window.savedLogDesignName !== newLog.designName ||
window.savedLogAppName !== newLog.savedLogAppName;
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);