更新ai广场bug

This commit is contained in:
hero920103 committed 2026-09-10 21:51:00 +08:00
1 parent 26eaf1eddb
commit 9f60450ffa
6 files changed
+482 -132

No files matched your search

@@ -4,7 +4,7 @@
<div>
<h2>文档图谱</h2>
<p>
默认展示顶级往下 3 级分类脉络,点击带 ▸ 的分类节点可继续延展 3 级;滚轮缩放,按住空格 + 左键拖拽平移
默认展示顶级往下 3 级分类脉络,点击带 ▸ 的分类节点可继续延展 3 级;滚轮缩放,按住右键拖拽平移画布
</p>
</div>
<div class="header-actions">
@@ -66,7 +66,12 @@
</div>
<div v-loading="loading" class="chart-wrap">
<div ref="chartRef" class="chart" />
<div
ref="chartRef"
class="chart"
@contextmenu.prevent
@mousedown="onChartMouseDown"
/>
<el-empty
v-if="!loading && !displayNodes.length"
description="暂无可展示的分类或文档,请先到文档库新建分类并上传文档"
@@ -97,7 +102,8 @@
<i class="line dotted" />分类层级
</span>
<span class="legend-tip"
>滚轮缩放 · 空格+左键拖拽平移 · 点击 ▸ 分类展开下级(更深层级循环使用这 3 色)</span
>滚轮缩放 · 右键拖拽平移 · 左键拖拽节点 · 点击 ▸ 分类展开下级(更深层级循环使用这 3
色)</span
>
</div>
</div>
@@ -210,8 +216,8 @@ const detailId = ref(0);
// 分层展开:默认展示顶级往下 3 级,点击分支节点后在该分支继续延展 3 级
const INITIAL_DEPTH = 3;
const expandedIds = ref(new Set());
// 按住空格 + 鼠标左键拖拽平移
const spaceHeld = ref(false);
// 按住右键拖拽平移画布(ECharts 原生 roam 只响应左键,右键需自行接管)
const panning = ref(false);
const filters = reactive({
keyword: "",
@@ -455,10 +461,10 @@ function buildOption() {
{
type: "graph",
layout: filters.layout,
// roam: 滚轮缩放 + 拖拽平移;按住空格时禁用节点拖拽,让左键拖拽整体平移
// roam: 滚轮缩放 + 左键在空白处拖拽平移;节点左键可拖拽,右键拖拽整体平移
roam: true,
scaleLimit: { min: 0.15, max: 6 },
draggable: !spaceHeld.value,
draggable: true,
data,
links: edgeList,
categories: [
@@ -540,39 +546,50 @@ function openNode(node) {
}
}
// ---------------- 空格 + 鼠标左键拖拽平移 ----------------
function isTypingTarget(el) {
return (
!!el &&
(el.tagName === "INPUT" ||
el.tagName === "TEXTAREA" ||
el.isContentEditable === true)
);
}
// ---------------- 按住右键拖拽平移 ----------------
// ECharts 的 roam 会忽略右键(isMiddleOrRightButtonOnMouseUpDown),
// 这里自行接管右键拖拽,通过 graphRoam 动作平移,不改动节点数据与布局。
let panLastX = 0;
let panLastY = 0;
function applyPanMode(on) {
if (chartRef.value) chartRef.value.style.cursor = on ? "grab" : "";
try {
// 空格按下时禁用节点拖拽,使左键拖拽变为整体平移
chart?.setOption({ series: [{ draggable: !on }] });
} catch {
/* ignore */
}
}
function onSpaceDown(e) {
if (e.code !== "Space") return;
if (isTypingTarget(e.target)) return;
function onChartMouseDown(e) {
if (e.button !== 2) return; // 仅响应右键
e.preventDefault();
if (spaceHeld.value) return;
spaceHeld.value = true;
applyPanMode(true);
panning.value = true;
panLastX = e.clientX;
panLastY = e.clientY;
chartRef.value?.classList.add("is-panning");
window.addEventListener("mousemove", onPanMouseMove);
window.addEventListener("mouseup", onPanMouseUp);
}
function onSpaceUp(e) {
if (e.code !== "Space") return;
spaceHeld.value = false;
applyPanMode(false);
function onPanMouseMove(e) {
if (!panning.value) return;
// 右键在画布外松开时 mouseup 不会触发,用 buttons 兜底结束拖拽
if ((e.buttons & 2) === 0) {
stopPan();
return;
}
const dx = e.clientX - panLastX;
const dy = e.clientY - panLastY;
panLastX = e.clientX;
panLastY = e.clientY;
if (!dx && !dy) return;
e.preventDefault();
chart?.dispatchAction({ type: "graphRoam", seriesIndex: 0, dx, dy });
}
function onPanMouseUp(e) {
if (e.button !== 2) return;
stopPan();
}
function stopPan() {
if (!panning.value) return;
panning.value = false;
chartRef.value?.classList.remove("is-panning");
window.removeEventListener("mousemove", onPanMouseMove);
window.removeEventListener("mouseup", onPanMouseUp);
}
async function loadCategories() {
@@ -677,14 +694,10 @@ onMounted(async () => {
attributes: true,
attributeFilter: ["class"]
});
// 空格 + 左键拖拽平移
window.addEventListener("keydown", onSpaceDown);
window.addEventListener("keyup", onSpaceUp);
});
onBeforeUnmount(() => {
window.removeEventListener("keydown", onSpaceDown);
window.removeEventListener("keyup", onSpaceUp);
stopPan();
resizeObserver?.disconnect();
themeObserver?.disconnect();
chart?.dispose();
@@ -752,6 +765,12 @@ onBeforeUnmount(() => {
.chart {
width: 100%;
height: 100%;
// 右键拖拽平移时强制抓手光标(zrender 会改写 canvas 内联 cursor)
&.is-panning,
&.is-panning * {
cursor: grabbing !important;
}
}
.chart-empty {