diff --git a/src/utils/exportActivityListXlsx.ts b/src/utils/exportActivityListXlsx.ts index 1529162..346cbca 100644 --- a/src/utils/exportActivityListXlsx.ts +++ b/src/utils/exportActivityListXlsx.ts @@ -33,6 +33,12 @@ function stripHtml(html: unknown, max = 12000): string { .replace(//gi, '') .replace(//gi, '') .replace(/<[^>]+>/g, ' ') + .replace(/ /gi, ' ') + .replace(/&/gi, '&') + .replace(/</gi, '<') + .replace(/>/gi, '>') + .replace(/"/gi, '"') + .replace(/'/g, "'") .replace(/\s+/g, ' ') .trim() .slice(0, max) @@ -108,8 +114,16 @@ const BASE_COL_SPEC: { zh: string; format: (row: Record) => str { zh: '审核状态', format: (r) => auditStatusLabel(r.audit_status) }, { zh: '上架', format: (r) => yn(r.is_active) }, { zh: '热门', format: (r) => yn(r.is_hot) }, - { zh: '开始日期', format: (r) => ymdFromDateValue(r.start_at as string | null | undefined) }, - { zh: '结束日期', format: (r) => ymdFromDateValue(r.end_at as string | null | undefined) }, + { + zh: '活动时间', + format: (r) => { + const s = ymdFromDateValue(r.start_at as string | null | undefined) + const e = ymdFromDateValue(r.end_at as string | null | undefined) + if (!s && !e) return '' + if (s && e) return s === e ? s : `${s} 至 ${e}` + return s || e + }, + }, { zh: '联系人', format: (r) => str(r.contact_name) }, { zh: '联系电话', format: (r) => str(r.contact_phone) }, { zh: '详情正文', format: (r) => stripHtml(r.detail_html) }, diff --git a/src/views/activities/ActivityList.vue b/src/views/activities/ActivityList.vue index 186ede4..921cba5 100644 --- a/src/views/activities/ActivityList.vue +++ b/src/views/activities/ActivityList.vue @@ -136,6 +136,8 @@ const filters = reactive({ is_active: undefined as '1' | '0' | undefined, schedule_status: undefined as 'not_started' | 'ongoing' | 'ended' | undefined, audit_status: undefined as 'approved' | 'pending' | 'rejected' | undefined, + /** 活动开始日期区间 [start, end] YYYY-MM-DD */ + dateRange: undefined as string[] | undefined, }) const exportActivitiesLoading = ref(false) @@ -150,6 +152,8 @@ function buildActivitiesListParams(page: number, pageSize: number) { is_active: filters.is_active, schedule_status: filters.schedule_status, audit_status: filters.audit_status, + start_date: filters.dateRange?.[0] || undefined, + end_date: filters.dateRange?.[1] || undefined, } } @@ -163,7 +167,8 @@ async function exportActivitiesXlsx() { let total = Infinity while (all.length < total) { const { data } = await http.get('/activities', { - params: buildActivitiesListParams(page, pageSize), + // for_export:带回 detail_html / 媒体等列表接口默认剔除的字段 + params: { ...buildActivitiesListParams(page, pageSize), for_export: 1 }, }) const chunk = (data?.data ?? []) as Record[] total = Number(data?.total ?? 0) @@ -2138,6 +2143,13 @@ async function removeActivity(row: Activity) { 待审核 已退回 + 查询 新增活动 导出