<template> <BorderRadiusImage class="Card" borderRadius="2px" borderColor="linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0))" borderWidth="2px" > <div class="info" :style="{ gap }"> <p v-for="(item, index) in keyMap" :key="index"> <span>{{ item.label }}: </span> <span> <slot :name="`form-${item.key}`" :data="cardData"> {{ getValue(item.key) }}{{ item.suffix }} </slot> </span> </p> </div> <div class="bottom" v-if="hasBtn"> <slot name="button"> <Button> {{ buttonText }} </Button> </slot> </div> <!-- <div class="status" :style="{ background: 'linear-gradient(123deg, #00B3CC 0%, rgba(0, 179, 204, 0) 100%)' }"> <span class="text">正常</span> </div> --> </BorderRadiusImage> </template> <script> import Button from "@screen/components/Buttons/Button.vue"; import BorderRadiusImage from "@screen/components/BorderRadiusImage.vue"; import { get as pathGet } from "lodash"; export default { name: "Card", components: { Button, BorderRadiusImage, }, props: { cardData: { type: Object, default: () => ({ source: "济菏运管中心", location: "长清大学城收费站", direction: "117.123456", direction2: "37.12234", state: 1, }), }, keyMap: { type: Array, default: () => [ { key: "source", label: "机构名称", }, { key: "location", label: "机构地址", }, { key: "direction", label: "经度", }, { key: "direction2", label: "纬度", }, { key: "direction3", label: "救援外协单位", }, ], }, buttonIcon: { type: String, default: "images/insert.svg", }, buttonText: { type: String, default: "修改", }, gap: { type: String, default: "6px", }, hasBtn: { type: Boolean, default: true, }, }, data() { return { stateMap: { 1: "confirmed", 2: "comfortable", 3: "congestion", 4: "normal", }, }; }, methods: { getValue(key) { return pathGet(this.cardData, key) ?? "-"; }, }, }; </script> <style lang="scss" scoped> .Card { color: #fff; display: flex; background: #133242; opacity: 1; padding: 18px 12px; gap: 12px; height: 100%; overflow: hidden; position: relative; flex-direction: column; .info { flex: 1; display: flex; flex-direction: column; // align-items: center; // justify-content: space-between; > p { // height: 21px; font-size: 14px; // font-family: PingFang SC, PingFang SC; font-weight: 400; line-height: 21px; display: flex; & > :first-child { margin-right: 6px; flex: 1; } & > :last-child { flex: 2; color: #ffffff; } } } .bottom { display: flex; justify-content: end; gap: 9px; } .status { position: absolute; right: 0; top: 0; width: 51px; height: 51px; clip-path: polygon(60% 0, 100% 39%, 100% 100%, 0 0); display: flex; justify-content: center; font-size: 12px; .text { transform: rotate(42deg); display: block; line-height: 30px; } &::after { content: ""; position: absolute; background: linear-gradient( -147deg, #ffffff 0%, rgba(255, 255, 255, 0) 0%, #ffffff 46%, rgba(255, 255, 255, 0) 100% ); height: 1px; width: 124%; transform: rotate(45deg); right: calc(-25% - 1px); transform-origin: left top; } } } </style>