From 3a28df1eccec424a37649cca968bce59739e0b35 Mon Sep 17 00:00:00 2001 From: zhangxiao <898441624@qq.com> Date: 星期五, 23 八月 2024 18:55:10 +0800 Subject: [PATCH] fix: table修改 --- src/views/oneThree/comprehensive/index.vue | 117 ++++++++++++++ src/views/components/the-box-card/index.vue | 3 src/views/components/the-icon-card/index.vue | 1 src/views/components/the-img-card/index.vue | 131 ++++++++++++++++ src/views/components/the-a-table/index.vue | 171 +++++++++++++++++++++ src/styles/transition.scss | 9 + 6 files changed, 432 insertions(+), 0 deletions(-) diff --git a/src/styles/transition.scss b/src/styles/transition.scss index 35753e4..67acbba 100644 --- a/src/styles/transition.scss +++ b/src/styles/transition.scss @@ -40,6 +40,15 @@ .fade-transform-enter-active { transition: all 0.5s; } +.overSpread1 { + width: 100%; + height: 100%; + position: fixed; + top: 0px; + left: 0px; + background: rgba(0, 0, 0, 0); + z-index: 10; +} .fade-transform-enter { opacity: 0; diff --git a/src/views/components/the-a-table/index.vue b/src/views/components/the-a-table/index.vue new file mode 100644 index 0000000..f30be7a --- /dev/null +++ b/src/views/components/the-a-table/index.vue @@ -0,0 +1,171 @@ +<template> + <!-- 琛ㄦ牸 --> + <div class="the-a-table" :class="currentThemeMode === 'dark' ? 'a-table-dark' : ''"> + <div class="overSpread1" v-show="iscolopen" @click="onMaskClick"></div> + <div class="table-select" v-if="colOpenShow"> + <div class="select-box"> + <icon-list class="box-icon" @click="checkcol" :size="24" /> + <a-scrollbar + class="box-scrollbar" + type="track" + style="height: 200px; overflow: auto" + v-show="iscolopen" + > + <a-space class="box-post" direction="vertical" size="large"> + <a-checkbox-group direction="vertical" @change="selCeckBoxList" v-model="checkedValue"> + <a-checkbox v-for="(item, index) in columns" :value="item.title" :key="index"> + {{ item.title }} + </a-checkbox> + </a-checkbox-group> + </a-space> + </a-scrollbar> + </div> + </div> + <a-space direction="vertical" size="large" fill> + <a-table + row-key="id" + :loading="loading" + :pagination="pagination" + :data="data" + :columns="tableColumns" + :bordered="bordered" + :size="size" + @page-change="onPageChange" + :max-height="documentHeight" + :scroll="{ x: 1000 }" + :row-selection="rowSelection" + @select-all="selectTabAll" + @selection-change="selectTabChange" + > + <!-- <template #columns> + <a-table-column + v-for="(list, index) in columns" + :key="list.key" + :title="list.title" + :dataIndex="list.dataIndex" + > + </a-table-column> + </template> --> + <template v-for="(item, key, i) in slots" :key="i" v-slot:[key]="{ record, rowIndex, column }"> + <slot :name="key" v-bind="{ rowIndex: rowIndex, record: record, column: column }"></slot> + </template> + </a-table> + </a-space> + + <!-- <a-select v-model="selectedColumns" mode="multiple" :options="allColumns" @change="handleColumnsChange" /> --> + </div> +</template> +<script lang="ts" setup name="TheIconCard"> +import { useTheme } from "@/hooks/useTheme"; +import { Svg } from "@easyfe/admin-component"; +import { useSlots } from "vue"; + +const slots = useSlots(); + +const { themeModeOptions, currentThemeMode, handleThemeChange } = useTheme(); + +const props = withDefaults( + defineProps<{ + columns?: Array<any>; + data?: Array<any>; + colOpenShow?: boolean; + loading?: boolean; + pagination?: boolean; + checkedValue?: Array<any>; + bordered?: boolean; + showSelection?: boolean; + }>(), + { + columns: () => [], //琛ㄥご + data: () => [], //鏁版嵁 + colOpenShow: true, // 閰嶇疆鍒楄〃 琛ㄥご + loading: false, + pagination: false, + checkedValue: () => [], + bordered: true, + showSelection: false + } +); + +const emits = defineEmits<{ + (e: "selTableCol", data: object): void; +}>(); + +const iscolopen = ref(false); +const checkedAll = ref(false); +const checkedArr = ref([]); +const checkedValue = computed(() => props.checkedValue); +const tableColumns = computed(() => { + return props.columns.filter((item) => { + return checkedValue.value.includes(item.title); + }); +}); +const data = computed(() => props.data); +const loading = computed(() => props.loading); +// const pagination = computed(() => props.pagination); + +const checkcol = () => { + iscolopen.value = !iscolopen.value; +}; +const onMaskClick = () => { + iscolopen.value = false; +}; + +const showSelection = computed(() => props.showSelection); + +const rowSelection = showSelection.value + ? { + type: "checkbox", + showCheckedAll: true, + onlyCurrent: false + + // onChange: (selectedRowKeys: any, selectedRows: any) => {} + } + : ""; + +//涓嬫媺閫夋嫨 +const selCeckBoxList = (val: any) => { + console.log(val); + emits("selTableCol", val); +}; + +const selectTabAll = (val: any) => { + console.log(val, "鍏ㄩ��"); + checkedAll.value = val; +}; +const selectTabChange = (val: any) => { + console.log(val, "鍗曢��"); + checkedArr.value = val; +}; +</script> +<style lang="scss" scoped> +.a-table-dark { +} + +.table-select { + display: flex; + justify-content: flex-end; + // margin-bottom: 10px; + cursor: pointer; + .select-box { + position: relative; + .box-post { + // position: absolute; + // top: 20px; + // right: 0px; + // z-index: 1; + padding: 10px; + width: 180px; + // height: 200px; + // background-color: var(--color-bg-3); + // border-radius: 4px; + } + :deep(.box-scrollbar) { + position: absolute !important; + background-color: var(--color-bg-3) !important; + right: 0px; + z-index: 100; + } + } +} +</style> diff --git a/src/views/components/the-box-card/index.vue b/src/views/components/the-box-card/index.vue index d6fa661..9fc2dc9 100644 --- a/src/views/components/the-box-card/index.vue +++ b/src/views/components/the-box-card/index.vue @@ -1,4 +1,5 @@ <template> + <!-- 灏忓崱鐗� --> <div class="the-box-card" :class="currentThemeMode === 'dark' ? 'box-card-dark' : ''"> <a-card class="card-box"> <div class="card-title"> @@ -155,6 +156,7 @@ .card-more { color: var(--color-text-3); font-size: 14px; + cursor: pointer; } } .card-content { @@ -170,6 +172,7 @@ border-radius: 5px; padding: 10px; line-height: 26px; + cursor: pointer; .card-box-title { display: flex; justify-content: space-between; diff --git a/src/views/components/the-icon-card/index.vue b/src/views/components/the-icon-card/index.vue index d6811c4..59e36f7 100644 --- a/src/views/components/the-icon-card/index.vue +++ b/src/views/components/the-icon-card/index.vue @@ -1,4 +1,5 @@ <template> + <!-- 甯con棣栭〉 --> <div class="icon-card" :class="currentThemeMode === 'dark' ? 'card-dark' : ''"> <a-card class="card-box"> <div class="card-icon" :style="dynamicStyle"> diff --git a/src/views/components/the-img-card/index.vue b/src/views/components/the-img-card/index.vue new file mode 100644 index 0000000..da5365d --- /dev/null +++ b/src/views/components/the-img-card/index.vue @@ -0,0 +1,131 @@ +<template> + <!-- 甯﹀ご鍍忛椤� --> + <div class="the-img-card" :class="currentThemeMode === 'dark' ? 'card-img-dark' : ''"> + <div class="img-box-card"> + <div class="card-icon" :style="dynamicStyle"> + <a-image + width="140" + height="140" + border-radius="14px" + :preview="false" + src="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp" + /> + </div> + <div class="card-content"> + <div class="card-content-top"> + <div class="card-name"> + <span class="name">寮犱笁</span> + <icon-woman v-if="sex && sex === 'woman'" /> + <icon-man v-if="!sex && sex === 'woman'" /> + </div> + <div @click="handleChange" class="card-detail">璇︽儏 ></div> + </div> + <div> + <span>浜哄憳缂栧彿</span>锛� + <span>H324343</span> + </div> + <div> + <span>鍑虹幇澶╂暟</span>锛� + <span>2澶�</span> + </div> + <div> + <span>灞呬綇鍦板潃</span>锛� + <span>缁忔祹蹇�熺瓑绾ц�冭瘯</span> + </div> + <div> + <span>韬唤璇佸彿</span>锛� + <span>3673672627722</span> + </div> + </div> + </div> + </div> +</template> +<script lang="ts" setup name="TheIconCard"> +import { useTheme } from "@/hooks/useTheme"; +import { Svg } from "@easyfe/admin-component"; + +const { themeModeOptions, currentThemeMode, handleThemeChange } = useTheme(); +const props = withDefaults( + defineProps<{ + icon?: string; + title?: string; + unit?: string; + metering?: number; + colorBg?: string; + sex?: boolean; + isIcon?: boolean; + }>(), + { + icon: "", + title: "", + unit: "", + metering: 0, + colorBg: "#fff", + sex: true, + isIcon: true + } +); + +const colorBg = computed(() => { + return props.colorBg; +}); +const dynamicStyle = { + backgroundColor: colorBg.value // 鍔ㄦ�佽儗鏅壊 +}; + +const emits = defineEmits<{ + (e: "handleChange", data: object): void; +}>(); +const handleChange = (item: any) => { + emits("handleChange", item); + console.log("handleChange", item); +}; +</script> +<style lang="scss" scoped> +.card-img-dark { + .card-box { + display: flex; + align-items: center; + // justify-content: center; + } +} +.the-img-card { + width: 100%; + border-radius: 4px; + box-sizing: border-box; + .img-box-card { + display: flex; + align-items: center; + width: 100%; + // justify-content: center; + .card-icon { + width: 140px; + height: 140px; + border-radius: 20px; + } + } + + .card-content { + margin-left: 10px; + line-height: 24px; + color: var(--color-text-1); + font-size: 12px; + width: 100%; + .card-content-top { + display: flex; + justify-content: space-between; + align-items: center; + } + .card-name { + font-size: 16px; + .name { + margin-right: 4px; + } + } + // .metering { + // font-size: 14px; + // margin-right: 4px; + // } + } +} +</style> diff --git a/src/views/oneThree/comprehensive/index.vue b/src/views/oneThree/comprehensive/index.vue index f8c8eb8..eda980c 100644 --- a/src/views/oneThree/comprehensive/index.vue +++ b/src/views/oneThree/comprehensive/index.vue @@ -34,6 +34,46 @@ ></the-box-card> </div> <div> + <a-card class="card-box"> + <the-img-card></the-img-card> + <div class="card-box-right"> + <div> + <a-space> + <a-button type="primary" size="mini">涓婅</a-button> + <a-button type="primary" status="danger" size="mini">娑夋瘨</a-button> + </a-space> + </div> + + <div> + <a-space> + <icon-book /> + <icon-bar-chart /> + </a-space> + </div> + </div> + </a-card> + </div> + <div> + <the-a-table + :columns="columns" + :data="data" + :pagination="false" + :checkedValue="checkedValue" + :colOpenShow="true" + :showSelection="false" + @selTableCol="selTableCol" + > + <template #index="{ record, rowIndex, column }"> + {{ rowIndex + 1 }} + </template> + <template #action="{ record, rowIndex, column }"> + <a-button type="text" size="small">鏌ョ湅</a-button> + <a-button type="text" size="small">绠$悊</a-button> + <a-button type="text" size="small">鍏抽棴</a-button> + </template> + </the-a-table> + </div> + <div> <a-pagination :total="50" show-total show-jumper show-page-size /> </div> </div> @@ -113,6 +153,72 @@ closes: 54 } ]); + +//鍒楄〃 +const columns = [ + { + title: "搴忓彿", + key: "1", + dataIndex: "index", + slotName: "index", + width: 80 + }, + { + title: "Name", + dataIndex: "name", + key: "2" + }, + { + title: "Address", + dataIndex: "address", + key: "3" + }, + { + title: "Email", + + dataIndex: "email", + key: "4" + }, + { + title: "鎿嶄綔", + key: "5", + slotName: "action", + width: 200 + } + + // 鏇村鍒�... +]; + +const checkedValue = ref<string[]>(["搴忓彿", "Name", "Email", "鎿嶄綔"]); + +// const onChange = (checkedValues: string[]) => { +// console.log("checked = ", checkedValues); +// checkedValue.value = checkedValues; +// }; + +const data = [ + { + id: "1", + name: "John Doe", + age: 32, + email: "john@example.com", + address: "New York No. 1 Lake Park" + }, + { + id: "2", + name: "Jane Smith", + age: 28, + email: "jane@example.com", + address: "London No. 1 Lake Park" + } + // 鏇村鏁版嵁椤�... +]; + +const selTableCol = (val: any) => { + checkedValue.value = val; + console.log(val); +}; + const handleClick = (item: any) => { console.log(item, 888); }; @@ -123,8 +229,19 @@ <style lang="scss" scoped> .comprehensive { + padding: 20px; .top-title { display: flex; } + .card-box { + width: 391px; + height: 202px; + border-radius: 5px; + } + .card-box-right { + margin-top: 10px; + display: flex; + justify-content: space-between; + } } </style> -- Gitblit v1.8.0