+
+
+
diff --git a/src/components/base/base-table-form/BaseTableForm.vue b/src/components/base/base-table-form/BaseTableForm.vue
index 39d62ac..5d65198 100644
--- a/src/components/base/base-table-form/BaseTableForm.vue
+++ b/src/components/base/base-table-form/BaseTableForm.vue
@@ -199,20 +199,41 @@ defineExpose({
diff --git a/src/components/base/base-tree/BaseTree.vue b/src/components/base/base-tree/BaseTree.vue
index 184145b..e93e4ef 100644
--- a/src/components/base/base-tree/BaseTree.vue
+++ b/src/components/base/base-tree/BaseTree.vue
@@ -74,3 +74,41 @@ defineExpose({
/>
+
+
diff --git a/src/components/base/expandable-pageable-table/ExpandablePageableTable.vue b/src/components/base/expandable-pageable-table/ExpandablePageableTable.vue
index fb0af3a..07cc8c8 100644
--- a/src/components/base/expandable-pageable-table/ExpandablePageableTable.vue
+++ b/src/components/base/expandable-pageable-table/ExpandablePageableTable.vue
@@ -5,7 +5,7 @@ import BasePageableTable from "../base-pageable-table/BasePageableTable.vue";
import type { SearcherProp } from "../search-bar/SearchBarType";
import type { ToolButtonProp } from "../table-tool-bar/TableToolBarType";
import { get } from "@/common/http/request";
-import { Loading } from "@element-plus/icons-vue";
+import { Loading, ArrowRight } from "@element-plus/icons-vue";
const props = defineProps({
searchers: Array as PropType
,
@@ -210,21 +210,28 @@ defineExpose({
-
-
+
+
-
-
加载中...
+
+
+ 加载中...
+
-
- {{ JSON.stringify(itemDataMap[getRowKey(row)], null, 2) }}
+
+
+
+ {{ JSON.stringify(itemDataMap[getRowKey(row)], null, 2) }}
-
点击展开加载明细
+
@@ -238,17 +245,96 @@ defineExpose({
.item-container {
min-height: 50px;
padding: 16px;
- background-color: #fafafa;
+ background-color: var(--el-fill-color-light);
border-radius: 4px;
+ transition: all 0.3s ease;
}
-.loading-state,
-.empty-state {
+.item-container.is-expanded {
+ background-color: var(--el-fill-color);
+ box-shadow: inset 0 2px 8px rgb(0 0 0 / 8%);
+}
+
+.loading-state {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 80px;
+}
+
+.loading-content {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ align-items: center;
+}
+
+.loading-icon {
+ font-size: 24px;
+ color: var(--el-color-primary);
+}
+
+.loading-text {
+ font-size: 13px;
+ color: #909399;
+}
+
+.expand-hint {
display: flex;
gap: 8px;
align-items: center;
justify-content: center;
+ min-height: 60px;
+ font-size: 13px;
+ color: var(--el-text-color-placeholder);
+}
+
+.hint-icon {
font-size: 14px;
+ transition: transform 0.3s ease;
+}
+
+.expand-hint:hover .hint-icon {
+ color: var(--el-color-primary);
+ transform: translateX(4px);
+}
+
+.hint-text {
+ transition: color 0.3s ease;
+}
+
+.expand-hint:hover .hint-text {
+ color: var(--el-color-primary);
+}
+
+.empty-state {
+ padding: 20px 0;
+}
+
+.json-preview {
+ max-height: 400px;
+ padding: 12px;
+ overflow: auto;
+ font-size: 12px;
+ line-height: 1.6;
+ color: var(--el-text-color-regular);
+ background-color: var(--el-fill-color-light);
+ border: 1px solid var(--el-border-color-light);
+ border-radius: 4px;
+}
+
+:deep(.el-table__expand-icon) {
+ font-size: 16px;
color: #909399;
+ transition: all 0.2s ease;
+}
+
+:deep(.el-table__expand-icon:hover) {
+ color: var(--el-color-primary);
+ transform: scale(1.1);
+}
+
+:deep(.el-table__expand-icon--expanded) {
+ transform: rotate(90deg);
}
diff --git a/src/components/base/treeside-pageable-table/TreeSidePageableTable.vue b/src/components/base/treeside-pageable-table/TreeSidePageableTable.vue
index e802547..c20a529 100644
--- a/src/components/base/treeside-pageable-table/TreeSidePageableTable.vue
+++ b/src/components/base/treeside-pageable-table/TreeSidePageableTable.vue
@@ -96,18 +96,54 @@ watch(treeSelect, loadData);