feat: 全量更新前后端代码及文档 - 社区/定制/优惠券/活动/会员等模块

This commit is contained in:
Developer
2026-03-21 18:35:41 +08:00
parent a8aaf15bfb
commit 942465b758
590 changed files with 27840 additions and 14720 deletions

View File

@@ -0,0 +1,188 @@
<template>
<div class="community-manage">
<a-card title="社群申请审核">
<template #extra>
<a-radio-group v-model:value="statusFilter" button-style="solid" @change="loadData">
<a-radio-button value="">全部</a-radio-button>
<a-radio-button value="pending">待审核</a-radio-button>
<a-radio-button value="approved">已通过</a-radio-button>
<a-radio-button value="rejected">已拒绝</a-radio-button>
</a-radio-group>
</template>
<a-table
:columns="columns"
:data-source="list"
:loading="loading"
:pagination="pagination"
row-key="id"
@change="handleTableChange"
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'status'">
<a-tag :color="statusColor(record.status)">{{ statusLabel(record.status) }}</a-tag>
</template>
<template v-if="column.key === 'createdAt'">
{{ formatTime(record.createdAt) }}
</template>
<template v-if="column.key === 'reviewedAt'">
{{ record.reviewedAt ? formatTime(record.reviewedAt) : '-' }}
</template>
<template v-if="column.key === 'action'">
<template v-if="record.status === 'pending'">
<a-button type="primary" size="small" @click="showApproveModal(record)">通过并发券</a-button>
<a-button danger size="small" style="margin-left: 8px" @click="handleReject(record)">拒绝</a-button>
</template>
<span v-else>{{ record.adminRemark || '-' }}</span>
</template>
</template>
</a-table>
</a-card>
<a-modal
v-model:open="approveVisible"
title="审核通过 - 选择优惠券模板"
@ok="handleApprove"
:confirm-loading="approving"
ok-text="确认发券"
cancel-text="取消"
>
<a-form layout="vertical">
<a-form-item label="优惠券模板" required>
<a-select v-model:value="approveForm.templateId" placeholder="请选择要下发的优惠券模板" :loading="templatesLoading">
<a-select-option v-for="t in templates" :key="t.id" :value="t.id">
{{ t.name }} ({{ t.type === 'discount' ? t.discountRate + '' : '' + t.thresholdAmount + '' + t.discountAmount }})
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="备注">
<a-input v-model:value="approveForm.remark" placeholder="可选备注" />
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { message, Modal } from 'ant-design-vue'
import { adminApi } from '@/service/apiService'
const loading = ref(false)
const list = ref([])
const statusFilter = ref('pending')
const pagination = reactive({ current: 1, pageSize: 10, total: 0 })
const columns = [
{ title: 'ID', dataIndex: 'id', key: 'id', width: 80 },
{ title: '用户ID', dataIndex: 'userId', key: 'userId', width: 100 },
{ title: '状态', key: 'status', width: 100 },
{ title: '申请时间', key: 'createdAt', width: 180 },
{ title: '审核时间', key: 'reviewedAt', width: 180 },
{ title: '操作/备注', key: 'action' }
]
const statusColor = (s) => ({ pending: 'orange', approved: 'green', rejected: 'red' }[s] || 'default')
const statusLabel = (s) => ({ pending: '待审核', approved: '已通过', rejected: '已拒绝' }[s] || s)
const formatTime = (t) => t ? new Date(t).toLocaleString('zh-CN') : '-'
const loadData = async () => {
loading.value = true
try {
const res = await adminApi.getCommunityRequests({
status: statusFilter.value || undefined,
pageNum: pagination.current,
pageSize: pagination.pageSize
})
const page = res.data
list.value = page.records || []
pagination.total = page.total || 0
} catch (e) {
message.error('加载失败')
} finally {
loading.value = false
}
}
const handleTableChange = (pag) => {
pagination.current = pag.current
pagination.pageSize = pag.pageSize
loadData()
}
// 优惠券模板
const templates = ref([])
const templatesLoading = ref(false)
const loadTemplates = async () => {
templatesLoading.value = true
try {
const res = await adminApi.getCouponTemplates({ pageNum: 1, pageSize: 100 })
templates.value = (res.data?.records || []).filter(t => t.status === 'active')
} catch { /* ignore */ } finally {
templatesLoading.value = false
}
}
// 审核通过
const approveVisible = ref(false)
const approving = ref(false)
const currentRecord = ref(null)
const approveForm = reactive({ templateId: null, remark: '' })
const showApproveModal = (record) => {
currentRecord.value = record
approveForm.templateId = null
approveForm.remark = ''
approveVisible.value = true
if (templates.value.length === 0) loadTemplates()
}
const handleApprove = async () => {
if (!approveForm.templateId) {
message.warning('请选择优惠券模板')
return
}
approving.value = true
try {
await adminApi.approveCommunityRequest(currentRecord.value.id, approveForm.templateId, approveForm.remark)
message.success('审核通过,优惠券已下发')
approveVisible.value = false
loadData()
} catch (e) {
message.error(e.response?.data?.message || '操作失败')
} finally {
approving.value = false
}
}
// 拒绝
const handleReject = (record) => {
Modal.confirm({
title: '确认拒绝',
content: `确定拒绝用户 ${record.userId} 的社群申请?`,
okText: '拒绝',
okType: 'danger',
cancelText: '取消',
async onOk() {
try {
await adminApi.rejectCommunityRequest(record.id, '不符合条件')
message.success('已拒绝')
loadData()
} catch (e) {
message.error(e.response?.data?.message || '操作失败')
}
}
})
}
onMounted(() => {
loadData()
loadTemplates()
})
</script>
<style scoped>
.community-manage {
max-width: 1200px;
}
</style>