|
@@ -0,0 +1,118 @@
|
|
|
+<template>
|
|
|
+ <div class="table">
|
|
|
+ <div class="table__content">
|
|
|
+ <div class="table__content_label">
|
|
|
+ <div class="label-t" v-for="(item, index) in columns" :key="`svvhbcth-${index}`" :style="{ flexBasis }">{{ item.name }}</div>
|
|
|
+ </div>
|
|
|
+ <Collapse ghost class="table__content_list" :style="{ height: contentHeight }">
|
|
|
+ <CollapsePanel v-for="(item, index) in data" :key="`svvhbct-${index}`" class="table__content_list_row" :showArrow="false">
|
|
|
+ <template #header>
|
|
|
+ <div v-for="(t, i) in columns" :key="`svvhbctr-${i}`" :style="{ flexBasis }">
|
|
|
+ <slot :name="t.prop" :scope="item">
|
|
|
+ <span>{{ get(item, t.prop) }}</span>
|
|
|
+ </slot>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template #default>
|
|
|
+ <p v-for="(t, i) in collapses" :key="`svvhbctc-${i}`" class="table__content_list_collapse"> {{ t.name }}:{{ get(item, t.prop) }} </p>
|
|
|
+ </template>
|
|
|
+ </CollapsePanel>
|
|
|
+ </Collapse>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+<script lang="ts" setup>
|
|
|
+ import { computed, defineProps } from 'vue';
|
|
|
+ import _ from 'lodash-es';
|
|
|
+ import { Collapse, CollapsePanel } from 'ant-design-vue';
|
|
|
+
|
|
|
+ let props = withDefaults(
|
|
|
+ defineProps<{
|
|
|
+ /** 列表表头配置,每个prop都有其对应的slot来提供定制化功能 */
|
|
|
+ columns: { prop: string; name: string }[];
|
|
|
+ collapses: { prop: string; name: string }[];
|
|
|
+ data: any[];
|
|
|
+ defaultValue: string;
|
|
|
+ contentHeight: string;
|
|
|
+ }>(),
|
|
|
+ {
|
|
|
+ columns: () => [],
|
|
|
+ collapses: () => [],
|
|
|
+ data: () => [],
|
|
|
+ defaultValue: '-',
|
|
|
+ contentHeight: '220px',
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ const flexBasis = computed(() => {
|
|
|
+ return Math.fround(100 / props.columns.length) + '%';
|
|
|
+ });
|
|
|
+
|
|
|
+ function get(o, p) {
|
|
|
+ const d = _.get(o, p, props.defaultValue);
|
|
|
+ return d === null ? props.defaultValue : d;
|
|
|
+ }
|
|
|
+</script>
|
|
|
+<style lang="less" scoped>
|
|
|
+ @font-face {
|
|
|
+ font-family: 'douyuFont';
|
|
|
+ src: url('@/assets/font/douyuFont.otf');
|
|
|
+ }
|
|
|
+
|
|
|
+ .table__content {
|
|
|
+ height: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ .table__content_label {
|
|
|
+ width: 366px;
|
|
|
+ height: 32px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-around;
|
|
|
+ align-items: center;
|
|
|
+ background: url('@/assets/images/company/content-label.png') no-repeat;
|
|
|
+ .label-t {
|
|
|
+ color: #3df6ff;
|
|
|
+ text-align: center;
|
|
|
+ font-size: 14px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .table__content_list {
|
|
|
+ height: calc(100% - 32px);
|
|
|
+ width: 378px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ // justify-content: space-around;
|
|
|
+ justify-content: flex-start;
|
|
|
+ padding: 5px 0px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ overflow-y: auto;
|
|
|
+ .table__content_list_row {
|
|
|
+ // width: 100%;
|
|
|
+ // display: flex;
|
|
|
+ // justify-content: space-around;
|
|
|
+ // align-items: flex-start;
|
|
|
+ background: url('@/assets/images/company/content-text.png') no-repeat;
|
|
|
+ color: @white;
|
|
|
+ padding: 5px 0;
|
|
|
+ // span {
|
|
|
+ // display: inline-block;
|
|
|
+ // text-align: center;
|
|
|
+ // }
|
|
|
+ }
|
|
|
+
|
|
|
+ .table__content_list_collapse {
|
|
|
+ text-align: left;
|
|
|
+ color: @white;
|
|
|
+ margin-left: 10px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .table__content :deep(.zxm-collapse > .zxm-collapse-item > .zxm-collapse-header) {
|
|
|
+ padding: 0;
|
|
|
+ color: @white;
|
|
|
+ }
|
|
|
+</style>
|