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'}">