diff --git a/mock/role/index.mock.ts b/mock/role/index.mock.ts index 38d75c7..f658dc8 100644 --- a/mock/role/index.mock.ts +++ b/mock/role/index.mock.ts @@ -158,6 +158,14 @@ const adminList = [ meta: { title: 'router.tableVideoPreview' } + }, + { + path: 'card-table', + component: 'views/Components/Table/CardTable', + name: 'CardTable', + meta: { + title: 'router.cardTable' + } } // { // path: 'ref-table', @@ -659,6 +667,7 @@ const testList: string[] = [ '/components/table/table-image-preview', '/components/table/table-video-preview', '/components/table/ref-table', + '/components/table/card-table', '/components/editor-demo', '/components/editor-demo/editor', '/components/editor-demo/json-editor', diff --git a/mock/table/index.mock.ts b/mock/table/index.mock.ts index 58d412d..73a1450 100644 --- a/mock/table/index.mock.ts +++ b/mock/table/index.mock.ts @@ -176,6 +176,39 @@ for (let i = 0; i < count; i++) { }) } +const cardList = [ + { + logo: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', + name: 'Alipay', + desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + }, + { + logo: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', + name: 'Angular', + desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + }, + { + logo: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', + name: 'Bootstrap', + desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + }, + { + logo: 'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png', + name: 'React', + desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + }, + { + logo: 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', + name: 'Vue', + desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + }, + { + logo: 'https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png', + name: 'Webpack', + desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + } +] + export default [ // 树形列表接口 { @@ -294,5 +327,27 @@ export default [ } } } + }, + { + url: '/mock/card/list', + method: 'GET', + delay, + body: ({ query }) => { + const { name, pageIndex, pageSize } = query + const mockList = cardList.filter((item) => { + if (name && item.name.indexOf(name) < 0) return false + return true + }) + const pageList = mockList.filter( + (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1) + ) + return { + code: SUCCESS_CODE, + data: { + total: mockList.length, + list: pageList + } + } + } } ] diff --git a/src/api/table/index.ts b/src/api/table/index.ts index b07a1f9..c870f25 100644 --- a/src/api/table/index.ts +++ b/src/api/table/index.ts @@ -5,6 +5,10 @@ export const getTableListApi = (params: any) => { return request.get({ url: '/mock/example/list', params }) } +export const getCardTableListApi = (params: any) => { + return request.get({ url: '/mock/card/list', params }) +} + export const getTreeTableListApi = (params: any) => { return request.get({ url: '/mock/example/treeList', params }) } diff --git a/src/components/Table/src/Table.vue b/src/components/Table/src/Table.vue index 7bea582..a19511d 100644 --- a/src/components/Table/src/Table.vue +++ b/src/components/Table/src/Table.vue @@ -6,7 +6,9 @@ import { ComponentSize, ElTooltipProps, ElImage, - ElButton + ElButton, + ElEmpty, + ElCard } from 'element-plus' import { defineComponent, PropType, ref, computed, unref, watch, onMounted } from 'vue' import { propTypes } from '@/utils/propTypes' @@ -185,7 +187,25 @@ export default defineComponent({ default: 'fixed' }, scrollbarAlwaysOn: propTypes.bool.def(false), - flexible: propTypes.bool.def(false) + flexible: propTypes.bool.def(false), + // 自定义内容 + customContent: propTypes.bool.def(false), + cardBodyStyle: { + type: Object as PropType, + default: () => ({}) + }, + cardBodyClass: { + type: String as PropType, + default: '' + }, + cardWrapStyle: { + type: Object as PropType, + default: () => ({}) + }, + cardWrapClass: { + type: String as PropType, + default: '' + } }, emits: ['update:pageSize', 'update:currentPage', 'register', 'refresh'], setup(props, { attrs, emit, slots, expose }) { @@ -484,19 +504,60 @@ export default defineComponent({ return (
- {unref(getProps).showAction ? ( - - ) : null} - - {{ - default: () => renderTableColumn(), - ...tableSlots - }} - + {unref(getProps).customContent ? ( +
+ {unref(getProps)?.data?.length ? ( + unref(getProps)?.data.map((item) => { + const cardSlots = { + default: () => { + return getSlot(slots, 'content', item) + } + } + if (getSlot(slots, 'content-header')) { + cardSlots['header'] = () => { + return getSlot(slots, 'content-header', item) + } + } + if (getSlot(slots, 'content-footer')) { + cardSlots['footer'] = () => { + return getSlot(slots, 'content-footer', item) + } + } + return ( + + {cardSlots} + + ) + }) + ) : ( +
+ +
+ )} +
+ ) : ( + <> + {unref(getProps).showAction ? ( + + ) : null} + + {{ + default: () => renderTableColumn(), + ...tableSlots + }} + + + )} {unref(getProps).pagination ? (