From c116b9ddafd4f50085477e6c67b1be8ae8a3a423 Mon Sep 17 00:00:00 2001 From: cshaptx4869 <994774638@qq.com> Date: Wed, 11 Jun 2025 15:26:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20:sparkles:=20=E9=9B=86=E6=88=90VxeTable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mock/menu.mock.ts | 13 + package.json | 3 +- src/main.ts | 1 + src/plugins/index.ts | 3 + src/plugins/vxeTable.ts | 70 ++++ src/styles/index.scss | 3 + src/styles/vxe-table.css | 92 +++++ src/styles/vxe-table.scss | 39 ++ src/views/demo/vxe-table/index.vue | 632 +++++++++++++++++++++++++++++ 9 files changed, 855 insertions(+), 1 deletion(-) create mode 100644 src/plugins/vxeTable.ts create mode 100644 src/styles/vxe-table.css create mode 100644 src/styles/vxe-table.scss create mode 100644 src/views/demo/vxe-table/index.vue diff --git a/mock/menu.mock.ts b/mock/menu.mock.ts index 02d72db0..6d7b8495 100644 --- a/mock/menu.mock.ts +++ b/mock/menu.mock.ts @@ -472,6 +472,19 @@ export default defineMock([ params: null, }, children: [ + { + path: "vxe-table", + component: "demo/vxe-table/index", + name: "VxeTable", + meta: { + title: "VxeTable", + icon: "el-icon-MagicStick", + hidden: false, + keepAlive: true, + alwaysShow: false, + params: null, + }, + }, { path: "icon-demo", component: "demo/icons", diff --git a/package.json b/package.json index eff8195a..3ffa2a77 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,8 @@ "vue": "^3.5.16", "vue-draggable-plus": "^0.6.0", "vue-i18n": "^11.1.5", - "vue-router": "^4.5.1" + "vue-router": "^4.5.1", + "vxe-table": "~4.6.25" }, "devDependencies": { "@commitlint/cli": "^19.8.1", diff --git a/src/main.ts b/src/main.ts index 38b64409..74fe30d9 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,6 +4,7 @@ import setupPlugins from "@/plugins"; // 暗黑主题样式 import "element-plus/theme-chalk/dark/css-vars.css"; +import "vxe-table/lib/style.css"; // 暗黑模式自定义变量 import "@/styles/dark/css-vars.css"; import "@/styles/index.scss"; diff --git a/src/plugins/index.ts b/src/plugins/index.ts index 98d26205..99077563 100644 --- a/src/plugins/index.ts +++ b/src/plugins/index.ts @@ -8,6 +8,7 @@ import { setupElIcons } from "./icons"; import { setupPermission } from "./permission"; import { setupWebSocket } from "./websocket"; import { InstallCodeMirror } from "codemirror-editor-vue3"; +import { setupVxeTable } from "./vxeTable"; export default { install(app: App) { @@ -25,6 +26,8 @@ export default { setupPermission(); // WebSocket服务 setupWebSocket(); + // vxe-table + setupVxeTable(app); // 注册 CodeMirror app.use(InstallCodeMirror); }, diff --git a/src/plugins/vxeTable.ts b/src/plugins/vxeTable.ts new file mode 100644 index 00000000..5826fafb --- /dev/null +++ b/src/plugins/vxeTable.ts @@ -0,0 +1,70 @@ +import type { App } from "vue"; +import VXETable from "vxe-table"; // https://vxetable.cn/v4.6/#/table/start/install + +// 全局默认参数 +VXETable.setConfig({ + // 全局尺寸 + size: "medium", + // 全局 zIndex 起始值,如果项目的的 z-index 样式值过大时就需要跟随设置更大,避免被遮挡 + zIndex: 9999, + // 版本号,对于某些带数据缓存的功能有用到,上升版本号可以用于重置数据 + version: 0, + // 全局 loading 提示内容,如果为 null 则不显示文本 + loadingText: null, + table: { + showHeader: true, + showOverflow: "tooltip", + showHeaderOverflow: "tooltip", + autoResize: true, + // stripe: false, + border: "inner", + // round: false, + emptyText: "暂无数据", + rowConfig: { + isHover: true, + isCurrent: true, + // 行数据的唯一主键字段名 + keyField: "_VXE_ID", + }, + columnConfig: { + resizable: false, + }, + align: "center", + headerAlign: "center", + }, + pager: { + // size: "medium", + // 配套的样式 + perfect: false, + pageSize: 10, + pagerCount: 7, + pageSizes: [10, 20, 50], + layouts: [ + "Total", + "PrevJump", + "PrevPage", + "Number", + "NextPage", + "NextJump", + "Sizes", + "FullJump", + ], + }, + modal: { + minWidth: 500, + minHeight: 400, + lockView: true, + mask: true, + // duration: 3000, + // marginSize: 20, + dblclickZoom: false, + showTitleOverflow: true, + transfer: true, + draggable: false, + }, +}); + +export function setupVxeTable(app: App) { + // Vxe Table 组件完整引入 + app.use(VXETable); +} diff --git a/src/styles/index.scss b/src/styles/index.scss index 95335687..22655067 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -1,5 +1,8 @@ @use "./reset"; @use "./element-plus"; +// Vxe Table +@use "./vxe-table"; +@import url("./vxe-table.css"); .app-container { padding: 15px; diff --git a/src/styles/vxe-table.css b/src/styles/vxe-table.css new file mode 100644 index 00000000..fc1fa4b3 --- /dev/null +++ b/src/styles/vxe-table.css @@ -0,0 +1,92 @@ +/** + * @description 所有主题模式下的 Vxe Table CSS 变量 + * @description 用 Element Plus 的 CSS 变量来覆写 Vxe Table 的 CSS 变量,目的是使 Vxe Table 支持多主题模式且样式统一 + * @description 在此查阅所有可自定义的变量:https://github.com/x-extends/vxe-table/blob/master/styles/css-variable.scss + */ + +:root { + /* color */ + --vxe-font-color: var(--el-text-color-regular); + --vxe-primary-color: var(--el-color-primary); + --vxe-success-color: var(--el-color-success); + --vxe-info-color: var(--el-color-info); + --vxe-warning-color: var(--el-color-warning); + --vxe-danger-color: var(--el-color-danger); + --vxe-font-lighten-color: var(--el-text-color-primary); + --vxe-primary-lighten-color: var(--el-color-primary-light-3); + --vxe-success-lighten-color: var(--el-color-success-light-3); + --vxe-info-lighten-color: var(--el-color-info-light-3); + --vxe-warning-lighten-color: var(--el-color-warning-light-3); + --vxe-danger-lighten-color: var(--el-color-danger-light-3); + --vxe-font-darken-color: var(--el-text-color-secondary); + --vxe-primary-darken-color: var(--el-color-primary-dark-2); + --vxe-success-darken-color: var(--el-color-success-dark-2); + --vxe-info-darken-color: var(--el-color-info-dark-2); + --vxe-warning-darken-color: var(--el-color-warning-dark-2); + --vxe-danger-darken-color: var(--el-color-danger-dark-2); + --vxe-font-disabled-color: var(--el-text-color-disabled); + --vxe-primary-disabled-color: var(--el-color-primary-light-5); + --vxe-success-disabled-color: var(--el-color-success-light-5); + --vxe-info-disabled-color: var(--el-color-info-light-5); + --vxe-warning-disabled-color: var(--el-color-warning-light-5); + --vxe-danger-disabled-color: var(--el-color-danger-light-5); + + /* input/radio/checkbox */ + --vxe-input-border-color: var(--el-border-color); + --vxe-input-disabled-color: var(--el-text-color-disabled); + --vxe-input-disabled-background-color: var(--el-fill-color-light); + --vxe-input-placeholder-color: var(--el-text-color-placeholder); + + /* popup */ + --vxe-table-popup-border-color: var(--el-border-color); + + /* table */ + --vxe-table-header-font-color: var(--el-text-color-regular); + --vxe-table-footer-font-color: var(--el-text-color-regular); + --vxe-table-border-color: var(--el-border-color-lighter); + --vxe-table-header-background-color: var(--el-bg-color); + --vxe-table-body-background-color: var(--el-bg-color); + --vxe-table-footer-background-color: var(--el-bg-color); + --vxe-table-row-hover-background-color: var(--el-fill-color-light); + --vxe-table-row-current-background-color: var(--el-fill-color-light); + --vxe-table-row-hover-current-background-color: var(--el-fill-color-light); + --vxe-table-checkbox-range-background-color: var(--el-fill-color-light); + + /* menu */ + --vxe-table-menu-background-color: var(--el-bg-color-overlay); + + /* loading */ + --vxe-loading-color: var(--el-color-primary); + --vxe-loading-background-color: var(--el-mask-color); + + /* validate */ + --vxe-table-validate-error-color: var(--el-color-danger); + + /* toolbar */ + --vxe-toolbar-background-color: var(--el-bg-color); + --vxe-toolbar-custom-active-background-color: var(--el-bg-color-overlay); + --vxe-toolbar-panel-background-color: var(--el-bg-color-overlay); + + /* pager */ + --vxe-pager-background-color: var(--el-bg-color); + + /* modal */ + --vxe-modal-header-background-color: var(--el-bg-color); + --vxe-modal-body-background-color: var(--el-bg-color); + --vxe-modal-border-color: var(--el-border-color); + + /* button */ + --vxe-button-default-background-color: var(--el-bg-color-overlay); + + /* input */ + --vxe-input-background-color: var(--el-fill-color-blank); + --vxe-input-panel-background-color: var(--el-fill-color-blank); + + /* form */ + --vxe-form-background-color: var(--el-bg-color); + --vxe-form-validate-error-color: var(--el-color-danger); + + /* select */ + --vxe-select-option-hover-background-color: var(--el-bg-color-overlay); + --vxe-select-panel-background-color: var(--el-bg-color); +} diff --git a/src/styles/vxe-table.scss b/src/styles/vxe-table.scss new file mode 100644 index 00000000..f7376ee5 --- /dev/null +++ b/src/styles/vxe-table.scss @@ -0,0 +1,39 @@ +// 自定义 Vxe Table 样式 + +.vxe-grid { + // 表单 + &--form-wrapper { + .vxe-form { + padding: 10px 20px; + margin-bottom: 20px; + } + } + + // 工具栏 + &--toolbar-wrapper { + .vxe-toolbar { + padding: 20px; + } + } + + // 分页 + &--pager-wrapper { + .vxe-pager { + height: 70px; + padding: 0 20px; + + &--wrapper { + // 参考 Bootstrap 的响应式设计 WIDTH = 768 + @media screen and (width <= 768px) { + .vxe-pager--total, + .vxe-pager--sizes, + .vxe-pager--jump, + .vxe-pager--jump-prev, + .vxe-pager--jump-next { + display: none; + } + } + } + } + } +} diff --git a/src/views/demo/vxe-table/index.vue b/src/views/demo/vxe-table/index.vue new file mode 100644 index 00000000..841aff80 --- /dev/null +++ b/src/views/demo/vxe-table/index.vue @@ -0,0 +1,632 @@ + + + + +