feat: 完成会员消息触达模块页面与交互

This commit is contained in:
2026-03-04 11:36:49 +08:00
parent 058ec9c142
commit 3056b56082
26 changed files with 3485 additions and 0 deletions

View File

@@ -0,0 +1,101 @@
<script setup lang="ts">
import type { MemberMessageTemplateDto } from '#/api/member/message-reach';
import type { MessageTemplatePager } from '#/views/member/message-reach/types';
import { Button, Empty, Pagination, Spin, Tag } from 'ant-design-vue';
import {
formatInteger,
MESSAGE_TEMPLATE_CATEGORY_COLOR_MAP,
MESSAGE_TEMPLATE_CATEGORY_TEXT_MAP,
} from '../composables/message-reach-page/helpers';
defineProps<{
canManage: boolean;
loading: boolean;
pager: MessageTemplatePager;
}>();
const emit = defineEmits<{
(event: 'delete', templateId: string): void;
(event: 'edit', templateId: string): void;
(event: 'pageChange', page: number, pageSize: number): void;
(event: 'use', template: MemberMessageTemplateDto): void;
}>();
</script>
<template>
<div class="mmr-template-wrap">
<Spin :spinning="loading">
<div v-if="pager.items.length > 0" class="mmr-template-grid">
<article
v-for="item in pager.items"
:key="item.templateId"
class="mmr-template-card"
>
<div class="mmr-template-head">
<div class="mmr-template-name">{{ item.name }}</div>
<Tag :color="MESSAGE_TEMPLATE_CATEGORY_COLOR_MAP[item.category]">
{{ MESSAGE_TEMPLATE_CATEGORY_TEXT_MAP[item.category] }}
</Tag>
</div>
<div class="mmr-template-preview">
{{ item.content }}
</div>
<div class="mmr-template-foot">
<span class="mmr-template-usage">
已使用 {{ formatInteger(item.usageCount) }}
</span>
<div class="mmr-template-actions">
<Button
size="small"
type="primary"
:disabled="!canManage"
@click="emit('use', item)"
>
使用
</Button>
<Button
type="link"
size="small"
class="mmr-action-link"
:disabled="!canManage"
@click="emit('edit', item.templateId)"
>
编辑
</Button>
<Button
type="link"
size="small"
danger
class="mmr-action-link"
:disabled="!canManage"
@click="emit('delete', item.templateId)"
>
删除
</Button>
</div>
</div>
</article>
</div>
<div v-else class="mmr-template-empty">
<Empty description="暂无消息模板" />
</div>
</Spin>
<div class="mmr-pagination">
<Pagination
:current="pager.page"
:page-size="pager.pageSize"
:total="pager.totalCount"
show-size-changer
:show-total="(value) => `${value}`"
:page-size-options="['12', '24', '48']"
@change="(page, pageSize) => emit('pageChange', page, pageSize)"
/>
</div>
</div>
</template>