Files
cz-web/src/views/profile/cpns/QualificationCard.vue
2026-10-13 15:48:57 +08:00

153 lines
3.7 KiB
Vue

<script setup lang="ts">
import { EllipsisText } from '@/components'
import type { Qualification, QualificationStatus } from '@/types/business/profile'
interface Props {
qualification: Qualification
}
defineProps<Props>()
const emit = defineEmits<{
edit: [qualification: Qualification]
delete: [qualification: Qualification]
reupload: [qualification: Qualification]
}>()
const STATUS_CLASS: Record<QualificationStatus, string> = {
已认证: 'is-certified',
审核中: 'is-reviewing',
未通过: 'is-rejected',
}
</script>
<template>
<article class="qual-row">
<div class="qual-row__col">
<p class="qual-row__label">资质类型</p>
<EllipsisText class="qual-row__value" :text="qualification.type" />
</div>
<div class="qual-row__col qual-row__col--name">
<p class="qual-row__label">证书名称</p>
<EllipsisText class="qual-row__value" :text="qualification.certName" />
</div>
<div class="qual-row__col">
<p class="qual-row__label">证书编号</p>
<EllipsisText class="qual-row__value" :text="qualification.certNo" />
</div>
<div class="qual-row__col">
<p class="qual-row__label">发证单位</p>
<EllipsisText class="qual-row__value" :text="qualification.issuer" />
</div>
<div class="qual-row__col qual-row__col--valid">
<p class="qual-row__label">有效期</p>
<EllipsisText
class="qual-row__value"
:text="qualification.validFrom + ' 至 ' + qualification.validTo"
/>
</div>
<div class="qual-row__col qual-row__col--status">
<p class="qual-row__label">状态</p>
<p class="qual-row__value qual-row__status" :class="STATUS_CLASS[qualification.status]">
{{ qualification.status }}
</p>
</div>
<div class="qual-row__actions">
<button type="button" class="qual-row__btn" @click="emit('delete', qualification)">
删除
</button>
<button
v-if="qualification.status === '未通过'"
type="button"
class="qual-row__btn"
@click="emit('reupload', qualification)"
>
重新上传
</button>
<button v-else type="button" class="qual-row__btn" @click="emit('edit', qualification)">
编辑
</button>
</div>
</article>
</template>
<style lang="less" scoped>
.qual-row {
position: relative;
display: grid;
grid-template-columns:
minmax(72px, 0.9fr)
minmax(100px, 1.2fr)
minmax(100px, 1.1fr)
minmax(100px, 1.1fr)
minmax(140px, 1.4fr)
minmax(64px, 0.7fr)
auto;
align-items: center;
gap: @spacing-base;
min-height: 72px;
padding: @spacing-base @spacing-lg;
border: 1px solid @border-color;
border-radius: @radius-base;
background: @bg-color-light;
box-sizing: border-box;
&__col {
min-width: 0;
}
&__label {
margin: 0;
font-size: @font-size-sm;
color: @text-color-secondary;
line-height: 1.4;
}
&__value {
margin-top: @spacing-xs;
font-size: @font-size-base;
font-weight: 600;
color: @profile-ink;
line-height: 1.4;
}
&__status {
&.is-reviewing {
color: @primary-strong;
}
&.is-certified {
color: @success-color;
}
&.is-rejected {
color: @danger-color;
}
}
&__actions {
.flex(row, flex-end, center);
flex-wrap: wrap;
gap: @spacing-sm;
}
&__btn {
height: 28px;
padding: 0 @spacing-sm;
border: 1px solid @border-color;
border-radius: @radius-round;
background: @white;
color: @text-color;
font-size: @font-size-sm;
white-space: nowrap;
cursor: pointer;
transition: all 0.2s;
&:hover {
border-color: @primary-strong;
color: @primary-strong;
}
}
}
</style>