From 9eb1356c4e5dafae6a2a438a19a1316f06fc6ac1 Mon Sep 17 00:00:00 2001 From: kailong321200875 <321200875@qq.com> Date: Tue, 9 Jan 2024 14:25:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=90=8C=E6=AD=A5master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 2 +- package.json | 69 ++++---- .../src/components/useRenderMenuTitle.tsx | 8 +- src/components/Table/src/Table.vue | 57 +++--- .../Table/src/components/ColumnSetting.vue | 165 ++++++++++++++++++ .../Table/src/components/TableActions.vue | 156 ++++++----------- src/constants/index.ts | 5 + src/hooks/web/useCrudSchemas.ts | 10 +- src/main.ts | 4 +- src/store/modules/locale.ts | 2 +- tsconfig.json | 1 + 11 files changed, 310 insertions(+), 169 deletions(-) create mode 100644 src/components/Table/src/components/ColumnSetting.vue diff --git a/.vscode/settings.json b/.vscode/settings.json index 8bafd70..ad7ff14 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,7 +2,7 @@ "typescript.tsdk": "node_modules/typescript/lib", "prettier.enable": false, "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": "explicit" }, "[vue]": { "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" diff --git a/package.json b/package.json index 8b7dc95..b4ae570 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-element-plus-admin", - "version": "2.0.0", + "version": "2.5.5", "description": "一套基于vue3、element-plus、typesScript、vite4的后台集成方案。", "author": "Archer <502431556@qq.com>", "private": false, @@ -29,59 +29,60 @@ "@faker-js/faker": "^8.3.1", "@iconify/iconify": "^3.1.1", "@iconify/vue": "^4.1.1", - "@vueuse/core": "^10.7.0", + "@vueuse/core": "^10.7.1", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.10", "@zxcvbn-ts/core": "^3.0.4", "animate.css": "^4.1.1", - "axios": "^1.6.2", + "axios": "^1.6.5", "cropperjs": "^1.6.1", "dayjs": "^1.11.10", "driver.js": "^1.3.1", "echarts": "^5.4.3", "echarts-wordcloud": "^2.1.0", - "element-plus": "^2.4.3", + "element-plus": "^2.4.4", "lodash-es": "^4.17.21", "mitt": "^3.0.1", "nprogress": "^0.2.0", "pinia": "^2.1.7", - "pinia-plugin-persistedstate": "^3.2.0", + "pinia-plugin-persistedstate": "^3.2.1", "qrcode": "^1.5.3", "qs": "^6.11.2", "url": "^0.11.3", - "vue": "3.3.10", - "vue-i18n": "9.8.0", - "vue-json-pretty": "^2.2.4", + "vue": "3.4.6", + "vue-draggable-plus": "^0.3.4", + "vue-i18n": "9.9.0", + "vue-json-pretty": "^2.3.0", "vue-router": "^4.2.5", "vue-types": "^5.1.1", - "xgplayer": "^3.0.10" + "xgplayer": "^3.0.11" }, "devDependencies": { - "@commitlint/cli": "^18.4.3", - "@commitlint/config-conventional": "^18.4.3", - "@iconify/json": "^2.2.153", - "@intlify/unplugin-vue-i18n": "^1.5.0", + "@commitlint/cli": "^18.4.4", + "@commitlint/config-conventional": "^18.4.4", + "@iconify/json": "^2.2.166", + "@intlify/unplugin-vue-i18n": "^2.0.0", "@types/fs-extra": "^11.0.4", "@types/inquirer": "^9.0.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.10.3", + "@types/node": "^20.10.7", "@types/nprogress": "^0.2.3", "@types/qrcode": "^1.5.5", - "@types/qs": "^6.9.10", + "@types/qs": "^6.9.11", "@types/sortablejs": "^1.15.7", - "@typescript-eslint/eslint-plugin": "^6.13.2", - "@typescript-eslint/parser": "^6.13.2", - "@unocss/transformer-variant-group": "^0.58.0", + "@typescript-eslint/eslint-plugin": "^6.18.1", + "@typescript-eslint/parser": "^6.18.1", + "@unocss/transformer-variant-group": "^0.58.3", "@vitejs/plugin-legacy": "^5.2.0", - "@vitejs/plugin-vue": "^4.5.1", + "@vitejs/plugin-vue": "^5.0.2", "@vitejs/plugin-vue-jsx": "^3.1.0", "autoprefixer": "^10.4.16", "chalk": "^5.3.0", "consola": "^3.2.3", - "eslint": "^8.55.0", + "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", - "eslint-define-config": "^2.0.0", - "eslint-plugin-prettier": "^5.0.1", + "eslint-define-config": "^2.1.0", + "eslint-plugin-prettier": "^5.1.2", "eslint-plugin-vue": "^9.19.2", "esno": "^4.0.0", "fs-extra": "^11.2.0", @@ -89,23 +90,23 @@ "inquirer": "^9.2.12", "less": "^4.2.0", "lint-staged": "^15.2.0", - "plop": "^4.0.0", - "postcss": "^8.4.32", + "plop": "^4.0.1", + "postcss": "^8.4.33", "postcss-html": "^1.5.0", "postcss-less": "^6.0.0", - "prettier": "^3.1.0", + "prettier": "^3.1.1", "rimraf": "^5.0.5", - "rollup": "^4.6.1", + "rollup": "^4.9.4", "rollup-plugin-visualizer": "^5.12.0", - "stylelint": "^15.11.0", + "stylelint": "^16.1.0", "stylelint-config-html": "^1.1.0", - "stylelint-config-recommended": "^13.0.0", - "stylelint-config-standard": "^34.0.0", - "stylelint-order": "^6.0.3", - "terser": "^5.25.0", + "stylelint-config-recommended": "^14.0.0", + "stylelint-config-standard": "^36.0.0", + "stylelint-order": "^6.0.4", + "terser": "^5.26.0", "typescript": "5.3.3", - "unocss": "^0.58.0", - "vite": "5.0.6", + "unocss": "^0.58.3", + "vite": "5.0.11", "vite-plugin-ejs": "^1.7.0", "vite-plugin-eslint": "^1.8.1", "vite-plugin-mock": "^2.9.6", @@ -113,7 +114,7 @@ "vite-plugin-purge-icons": "^0.10.0", "vite-plugin-style-import": "2.0.0", "vite-plugin-svg-icons": "^2.0.1", - "vue-tsc": "^1.8.25" + "vue-tsc": "^1.8.27" }, "packageManager": "pnpm@8.1.0", "engines": { diff --git a/src/components/Menu/src/components/useRenderMenuTitle.tsx b/src/components/Menu/src/components/useRenderMenuTitle.tsx index 6f7caff..8941d9d 100644 --- a/src/components/Menu/src/components/useRenderMenuTitle.tsx +++ b/src/components/Menu/src/components/useRenderMenuTitle.tsx @@ -10,10 +10,14 @@ export const useRenderMenuTitle = () => { return icon ? ( <> - {t(title as string)} + + {t(title as string)} + ) : ( - {t(title as string)} + + {t(title as string)} + ) } diff --git a/src/components/Table/src/Table.vue b/src/components/Table/src/Table.vue index 4eec3fc..ca7a9d4 100644 --- a/src/components/Table/src/Table.vue +++ b/src/components/Table/src/Table.vue @@ -17,7 +17,6 @@ import { set, get } from 'lodash-es' import { CSSProperties } from 'vue' import { getSlot } from '@/utils/tsxHelper' import TableActions from './components/TableActions.vue' -import { isImgPath } from '@/utils/is' import { createVideoViewer } from '@/components/VideoPlayer' import { Icon } from '@/components/Icon' import { BaseButton } from '@/components/Button' @@ -59,8 +58,13 @@ export default defineComponent({ type: Array as PropType, default: () => [] }, - // 是否自动预览 - preview: { + // 图片自动预览字段数组 + imagePreview: { + type: Array as PropType, + default: () => [] + }, + // 视频自动预览字段数组 + videoPreview: { type: Array as PropType, default: () => [] }, @@ -275,6 +279,10 @@ export default defineComponent({ setProps({ size }) } + const confirmSetColumn = (columns: TableColumn[]) => { + setProps({ columns }) + } + expose({ setProps, setColumn, @@ -335,7 +343,8 @@ export default defineComponent({ }) const renderTreeTableColumn = (columnsChildren: TableColumn[]) => { - const { align, headerAlign, showOverflowTooltip, preview } = unref(getProps) + const { align, headerAlign, showOverflowTooltip, imagePreview, videoPreview } = + unref(getProps) return columnsChildren.map((v) => { if (v.hidden) return null const props = { ...v } as any @@ -346,10 +355,10 @@ export default defineComponent({ const slots = { default: (...args: any[]) => { const data = args[0] - let isImageUrl = false - if (preview.length) { - isImageUrl = preview.some((item) => (item as string) === v.field) - } + let isPreview = false + isPreview = + imagePreview.some((item) => (item as string) === v.field) || + videoPreview.some((item) => (item as string) === v.field) return children && children.length ? renderTreeTableColumn(children) @@ -357,8 +366,8 @@ export default defineComponent({ ? props.slots.default(...args) : v?.formatter ? v?.formatter?.(data.row, data.column, get(data.row, v.field), data.$index) - : isImageUrl - ? renderPreview(get(data.row, v.field)) + : isPreview + ? renderPreview(get(data.row, v.field), v.field) : get(data.row, v.field) } } @@ -380,10 +389,11 @@ export default defineComponent({ }) } - const renderPreview = (url: string) => { + const renderPreview = (url: string, field: string) => { + const { imagePreview, videoPreview } = unref(getProps) return (
- {isImgPath(url) ? ( + {imagePreview.includes(field) ? ( - ) : ( + ) : videoPreview.includes(field) ? ( } @@ -404,7 +414,7 @@ export default defineComponent({ > 预览 - )} + ) : null}
) } @@ -419,7 +429,8 @@ export default defineComponent({ headerAlign, showOverflowTooltip, reserveSelection, - preview + imagePreview, + videoPreview } = unref(getProps) return (columnsChildren || columns).map((v) => { @@ -434,6 +445,7 @@ export default defineComponent({ align={v.align || align} headerAlign={v.headerAlign || headerAlign} label={v.label} + fixed={v.fixed} width="65px" > ) @@ -458,10 +470,10 @@ export default defineComponent({ default: (...args: any[]) => { const data = args[0] - let isImageUrl = false - if (preview.length) { - isImageUrl = preview.some((item) => (item as string) === v.field) - } + let isPreview = false + isPreview = + imagePreview.some((item) => (item as string) === v.field) || + videoPreview.some((item) => (item as string) === v.field) return children && children.length ? renderTreeTableColumn(children) @@ -469,8 +481,8 @@ export default defineComponent({ ? props.slots.default(...args) : v?.formatter ? v?.formatter?.(data.row, data.column, get(data.row, v.field), data.$index) - : isImageUrl - ? renderPreview(get(data.row, v.field)) + : isPreview + ? renderPreview(get(data.row, v.field), v.field) : get(data.row, v.field) } } @@ -543,11 +555,12 @@ export default defineComponent({ ) : ( <> - {unref(getProps).showAction ? ( + {unref(getProps).showAction && !unref(getProps).customContent ? ( ) : null} diff --git a/src/components/Table/src/components/ColumnSetting.vue b/src/components/Table/src/components/ColumnSetting.vue new file mode 100644 index 0000000..5d40b7b --- /dev/null +++ b/src/components/Table/src/components/ColumnSetting.vue @@ -0,0 +1,165 @@ + + + diff --git a/src/components/Table/src/components/TableActions.vue b/src/components/Table/src/components/TableActions.vue index 0b7f2ca..2eaab32 100644 --- a/src/components/Table/src/components/TableActions.vue +++ b/src/components/Table/src/components/TableActions.vue @@ -1,20 +1,11 @@