From 2041523c79d865ebce59c8e5f16b5c6e0a70bbde Mon Sep 17 00:00:00 2001 From: suixy <2277317060@qq.com> Date: Tue, 27 Jan 2026 17:53:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A2=9C=E8=89=B2=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 27 +++ src/directive/autoScroll/autoScroll.js | 58 ++++++ src/directive/index.ts | 2 + src/views/boardGenerate/index.vue | 197 +++++++++++++----- .../nodes/board/multiLinesNode.vue | 27 ++- .../boardGenerate/nodes/board/radarNode.vue | 10 +- .../nodes/form/scrollTableNode.vue | 8 +- .../boardGenerate/nodes/form/textNode.vue | 2 +- src/views/boardGenerate/tool.js | 11 +- 9 files changed, 269 insertions(+), 73 deletions(-) create mode 100644 src/directive/autoScroll/autoScroll.js diff --git a/src/App.vue b/src/App.vue index cb29009..eed994e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -52,3 +52,30 @@ const openAiAssistantMenu = () => { z-index:8006 !important; } + diff --git a/src/directive/autoScroll/autoScroll.js b/src/directive/autoScroll/autoScroll.js new file mode 100644 index 0000000..6ee5a30 --- /dev/null +++ b/src/directive/autoScroll/autoScroll.js @@ -0,0 +1,58 @@ +export default { + mounted(el, binding) { + const duration = binding.value?.duration || 4 + const delay = binding.value?.delay || 1 + + const run = () => { + // 1. 找到容器内部所有带 id 的元素 + const nodes = [...el.querySelectorAll('#autoScroll')] + + // 2. 按 id 分组 + const groups = {} + nodes.forEach(node => { + const id = node.id + if (!groups[id]) groups[id] = [] + groups[id].push(node) + }) + + // 3. 每组只判断一次 + Object.keys(groups).forEach(id => { + const group = groups[id] + const target = group[0] + + const parent = target.parentElement + if (!parent) return + + target.style.display = 'inline-block' + target.style.whiteSpace = 'nowrap' + + const overflow = target.scrollWidth - parent.clientWidth + + if (overflow > 0) { + group.forEach(elm => { + elm.classList.add('auto-scroll-back') + elm.style.setProperty('--scroll-x', `${overflow}px`) + elm.style.animationDuration = `${duration * 2 + delay * 2}s` + }) + } else { + group.forEach(elm => { + elm.classList.remove('auto-scroll-back') + }) + } + }) + } + + requestAnimationFrame(() => { + requestAnimationFrame(run) + }) + + const ro = new ResizeObserver(run) + ro.observe(el) + + el.__ro__ = ro + }, + + unmounted(el) { + el.__ro__?.disconnect() + } +} diff --git a/src/directive/index.ts b/src/directive/index.ts index ef25ee8..2561c21 100644 --- a/src/directive/index.ts +++ b/src/directive/index.ts @@ -1,4 +1,5 @@ import copyText from './common/copyText'; +import autoScroll from './autoScroll/autoScroll'; import { hasPermi, hasRoles } from './permission'; import { App } from 'vue'; @@ -6,4 +7,5 @@ export default (app: App) => { app.directive('copyText', copyText); app.directive('hasPermi', hasPermi); app.directive('hasRoles', hasRoles); + app.directive('autoScroll', autoScroll); }; diff --git a/src/views/boardGenerate/index.vue b/src/views/boardGenerate/index.vue index 82a41fd..37a62da 100644 --- a/src/views/boardGenerate/index.vue +++ b/src/views/boardGenerate/index.vue @@ -402,8 +402,10 @@ :body-style="{padding:'4px 0'}">
菜单
@@ -522,167 +524,175 @@ + @@ -690,7 +700,7 @@
-
属性设置
@@ -700,27 +710,61 @@
-
+
- + - + - + - + - + + + + + + + + + + + + +
+
{{ i.name }}
+
+
+
@@ -1059,6 +1103,22 @@ /> + + + + + + @@ -1078,7 +1138,8 @@ :headers="headers" :on-success="(res)=>nodeAttrForm.backgroundImage = res.data.url" > - @@ -1274,7 +1335,6 @@ - @@ -1618,7 +1678,7 @@ - +
@@ -1697,7 +1757,7 @@ import InputNode from '@/views/boardGenerate/nodes/form/inputNode.vue'; import ButtonNode from '@/views/boardGenerate/nodes/form/buttonNode.vue'; import SelectNode from '@/views/boardGenerate/nodes/form/selectNode.vue'; -import MenuNode from './nodes/advancedComponents/menuNode.vue' +import MenuNode from './nodes/advancedComponents/menuNode.vue'; import TreeNode from './nodes/advancedComponents/tree/index.vue'; import TreeOption from './nodes/advancedComponents/tree/option.vue'; @@ -1845,6 +1905,41 @@ onMounted(async () => { }); }); const icons = ref([]); +const colorType = ref(); +const colorList = ref([ + { + name: '科技', + value: 0, + colors: ['#0B3D91', '#0F4C81', '#1663A8', '#1A76C8', '#2A93E2', '#4AA7FF', '#70BCFF', '#98D4FF', '#BFE7FF', '#E6F3FF'] + }, + { + name: '复古', + value: 1, + colors: ['#6B3E2A', '#8B4F2E', '#A65A2F', '#C36A33', '#E07B3A', '#F09C4B', '#F6B66E', '#F9D19A', '#FBE5C4', '#FFF3E8'] + }, + { + name: '自然', + value: 2, + colors: ['#1B5E20', '#2E7D32', '#3EA34B', '#56B86A', '#6FD58A', '#86E3A7', '#A2F2C5', '#C1F9DE', '#DFFFEF', '#F3FFF8'] + }, + { + name: '霓虹', + value: 3, + colors: ['#FF3D7F', '#FF5E5E', '#FF8A00', '#FFD700', '#32FFDA', '#00E5FF', '#3B82F6', '#6B5BFF', '#B45CFF', '#FF3DF5'] + }, + { + name: '极简', + value: 4, + colors: ['#0B0C10', '#1A1B21', '#2B2D33', '#3D4048', '#4F535E', '#6A6F7A', '#8A909F', '#B0B6C3', '#D2D7E3', '#F0F2F8'] + }, + { + name: '标准', + value: 5, + colors: ['#5470C6', '#91CC75', '#FAC858', '#EE6666', '#73C0DE', '#3BA272', '#FC8452', '#9A60B4', '#EA7CCC'] + } + + +]); const selectIconInput = ref(''); const collapseActiveName = ref('1'); const loading = ref(false); @@ -1873,7 +1968,6 @@ const customData = ref([]); const cellOption = ref({}); const boardData = ref({}); const pageData = ref({}); -const customDataForm = ref({}); const nodeAttrForm = ref({}); const nodeDataForm = ref({}); const pageSettingForm = ref({}); @@ -1896,24 +1990,22 @@ const logEvent = async (eventname, event) => { case 'paneClick': nodeAttrForm.value = {}; nodeDataForm.value = {}; - customDataForm.value = {}; + tabs.value = 0 break; case 'click': nodeAttrForm.value = event.node.data.options; nodeDataForm.value = event.node; - customDataForm.value = event.node.data.customData; key.value += 1; break; case 'nodeDrag': if (event.nodes.length === 1) { nodeAttrForm.value = event.node.data.options; nodeDataForm.value = event.node; - customDataForm.value = event.node.data.customData; key.value += 1; } else { nodeAttrForm.value = {}; - nodeDataForm.value = {}; - customDataForm.value = {}; + tabs,value = 0 + nodeDataForm.value = { }; } break; case 'contextmenu': @@ -2133,7 +2225,6 @@ const pitchOnNode = (e) => { nodeAttrForm.value = e.data.options; key.value += 1; nodeDataForm.value = e; - customDataForm.value = e.data.customData; }; const cellClick = (e) => { diff --git a/src/views/boardGenerate/nodes/board/multiLinesNode.vue b/src/views/boardGenerate/nodes/board/multiLinesNode.vue index 4140047..430b7a9 100644 --- a/src/views/boardGenerate/nodes/board/multiLinesNode.vue +++ b/src/views/boardGenerate/nodes/board/multiLinesNode.vue @@ -1,7 +1,8 @@