AIoT前端公共UI

Card.vue 5.4KB

    <!-- * @Author: Devin * @Date: 2023-01-11 17:13:35 * @LastEditors: Devin * @LastEditTime: 2023-02-22 14:51:54 * @Description: 卡片 --> <template> <div class="__common-card" :class="layer === 'row' ? '__common-card-row' : '__common-card-col'" > <!-- 卡片图片 --> <div class="__card-img-box"> <common-icon icon-name="bianyuanwangguan" size="18"></common-icon> <img class="__card-img" :src="cardInfo?.url" alt="" /> </div> <div class="__card-info" :class="layer === 'row' ? '__card-info-row' : '__card-info-col'" > <!-- 卡片头部 --> <div class="__card-header"> <h4 class="__card-title text-line-1">{{ cardInfo.title }}</h4> <el-tag v-for="tag in cardInfo?.tags" :key="tag.label" class="__card-tag" :type="tag.type" > {{ tag.label }} </el-tag> </div> <!-- 卡片副标题 --> <div class="__card-subtitle">{{ cardInfo.subTitle }}</div> <!-- 卡片信息列表 --> <ul v-if="cardInfos && cardInfos.length" class="__card-infos"> <li v-for="info in cardInfos" :key="info['label']" class="__card-info-item" > <span>{{ info['label'] }}:</span> <span class="__card-info-content"> {{ cardInfo.infos[info['name']] }} </span> </li> </ul> <!-- 描述信息 --> <div class="__card-desc text-line-3">{{ cardInfo.desc }}</div> <!-- 卡片数据列表 --> <div v-if="cardNumbers && cardNumbers.length" class="__card-numbers"> <el-row :gutter="10"> <el-col v-for="(info, index) in cardNumbers" :key="index" :span="24 / cardNumbers.length" > <div class="_common-card-btn"> <common-icon class="__card-icon" :name="info['icon']" :color="info['color']" ></common-icon> <span>{{ info['label'] }}</span> </div> <div class="__card-number"> {{ cardInfo.numbers[info['name']] }} </div> </el-col> </el-row> </div> <!-- 卡片按键列表 --> <div v-if="btns && btns.length" class="__card-btns"> <el-row :gutter="10"> <el-col v-for="(btn, index) in btns" :key="index" class="__card-btn" :span="24 / btns.length" > <div class="_common-card-btn" @click.stop="btn['onClick']"> <common-icon class="__card-icon" :name="btn['icon']" :color="btn['color']" ></common-icon> <span>{{ btn['label'] }}</span> </div> </el-col> </el-row> </div> </div> </div> </template> <script setup lang="ts"> import { defineProps } from 'vue'; defineProps({ infos: { type: Array, default: () => [] }, btns: { type: Array, default: () => [] }, cardInfo: { type: Object, default: () => {} }, layer: { type: String, default: () => 'col' // row/col/row-col }, cardInfos: { type: Array, default: () => [] }, cardNumbers: { type: Array, default: () => [] } }); </script> <script lang="ts"> export default { name: 'CommonCard' }; </script> <style scoped lang="scss"> .__common-card { display: flex; width: 100%; overflow: hidden; background: #fff; border-radius: 4px; margin-bottom: 16px; .__card-img-box { width: 150px; flex: shrink; .__card-img { width: 100%; height: 100%; } } .__card-img-row { // padding: 16px; } .__card-img-col { } } .__common-card-row { flex-direction: row; justify-content: flex-start; } .__common-card-col { flex-direction: column; } .__card-info { padding: 18px 16px; width: calc(100% - 150px); box-sizing: border-box; .__card-header { display: flex; align-items: center; width: 100%; .__card-title { margin-right: 8px; color: #2d3e53; font-weight: 500; font-size: 14px; } .__card-tag { margin-right: 8px; } } .__card-subtitle { color: #7b93a7; line-height: 16px; font-size: 12px; font-weight: 400; margin-top: 5px; } .__card-infos { margin-top: 16px; color: #455a74; font-size: 12px; .__card-info-item { line-height: 16px; margin-bottom: 8px; } .__card-info-content { color: #2d3e53; } } .__card-desc { line-height: 16px; font-size: 12px; color: #455a74; margin-bottom: 16px; } .__card-numbers { color: #7b93a7; text-align: center; margin-top: 16px; .__card-number { margin-top: 8px; color: #2d3e53; font-size: 14px; } } .__card-btns { color: #7b93a7; text-align: center; margin-top: 16px; .__card-btn { position: relative; &:not(:last-child):after { content: ''; position: absolute; top: 0px; right: 1px; height: 16px; width: 1px; background-color: #ebebeb; } ._common-card-btn { display: flex; align-items: center; justify-content: center; color: #7b93a7; cursor: pointer; .__card-icon { margin-right: 17px; } } } } } .__card-info-col { width: 100%; } .card-info-row { } </style>