From beddbf97ee530fb29cab4075adf150fc72414d0e Mon Sep 17 00:00:00 2001 From: liangzai <2440983361@qq.com> Date: Sat, 18 Apr 2026 12:05:45 +0800 Subject: [PATCH] f --- .../src/api/notification/index.ts | 21 +++++++- .../bdrp-admin-web/src/views/notification.zip | Bin 0 -> 5977 bytes .../src/views/notification/data.ts | 20 +++---- .../src/views/notification/list.vue | 49 +++++++++++++----- apps/bdrp-admin-web/src/views/system/role.zip | Bin 0 -> 6496 bytes .../src/views/system/role/data.ts | 1 - 6 files changed, 65 insertions(+), 26 deletions(-) create mode 100644 apps/bdrp-admin-web/src/views/notification.zip create mode 100644 apps/bdrp-admin-web/src/views/system/role.zip diff --git a/apps/bdrp-admin-web/src/api/notification/index.ts b/apps/bdrp-admin-web/src/api/notification/index.ts index c74fcb3..04041c3 100644 --- a/apps/bdrp-admin-web/src/api/notification/index.ts +++ b/apps/bdrp-admin-web/src/api/notification/index.ts @@ -58,11 +58,29 @@ async function getNotificationList(params: Recordable) { return requestClient.get( '/notification/list', { - params, + // 某些环境下 GET 列表会被缓存,导致编辑后 query/search 仍看到旧数据。 + // 增加时间戳参数与 no-cache 头,确保每次都拿最新列表。 + params: { + ...params, + _ts: Date.now(), + }, + headers: { + 'Cache-Control': 'no-cache', + Pragma: 'no-cache', + }, }, ); } +/** + * 获取通知详情(按 ID) + */ +async function getNotificationDetail(id: number) { + return requestClient.get( + `/notification/detail/${id}`, + ); +} + /** * 创建通知 */ @@ -100,6 +118,7 @@ async function deleteNotification(id: number) { export { createNotification, deleteNotification, + getNotificationDetail, getNotificationList, updateNotification, }; diff --git a/apps/bdrp-admin-web/src/views/notification.zip b/apps/bdrp-admin-web/src/views/notification.zip new file mode 100644 index 0000000000000000000000000000000000000000..40099975890e562a3538c63c905d6424da7c4932 GIT binary patch literal 5977 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 literal 0 HcmV?d00001 diff --git a/apps/bdrp-admin-web/src/views/notification/data.ts b/apps/bdrp-admin-web/src/views/notification/data.ts index 2590926..2d82b55 100644 --- a/apps/bdrp-admin-web/src/views/notification/data.ts +++ b/apps/bdrp-admin-web/src/views/notification/data.ts @@ -58,18 +58,18 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'Input', fieldName: 'title', label: '通知标题', + componentProps: { + allowClear: true, + placeholder: '模糊匹配标题', + }, }, { - component: 'Select', + component: 'Input', fieldName: 'notification_page', label: '通知页面', componentProps: { allowClear: true, - options: [ - { label: '首页', value: 'home' }, - { label: '个人中心', value: 'profile' }, - { label: '订单页', value: 'order' }, - ], + placeholder: '模糊匹配路径', }, }, { @@ -79,8 +79,8 @@ export function useGridFormSchema(): VbenFormSchema[] { componentProps: { allowClear: true, options: [ - { label: '启用', value: 'active' }, - { label: '禁用', value: 'inactive' }, + { label: '启用', value: 1 }, + { label: '禁用', value: 0 }, ], }, }, @@ -115,7 +115,7 @@ export function useColumns( width: 200, }, { - field: 'show_date', + field: 'start_date', title: '展示日期', width: 300, formatter: ({ row }) => { @@ -125,7 +125,7 @@ export function useColumns( }, }, { - field: 'show_time', + field: 'start_time', title: '展示时间', width: 300, formatter: ({ row }) => { diff --git a/apps/bdrp-admin-web/src/views/notification/list.vue b/apps/bdrp-admin-web/src/views/notification/list.vue index ada6e94..f893602 100644 --- a/apps/bdrp-admin-web/src/views/notification/list.vue +++ b/apps/bdrp-admin-web/src/views/notification/list.vue @@ -15,6 +15,7 @@ import { Button, message, Modal } from 'ant-design-vue'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteNotification, + getNotificationDetail, getNotificationList, updateNotification, } from '#/api/notification'; @@ -36,23 +37,51 @@ const columns = useColumns( }, ); +function buildNotificationListParams(formValues: Recordable) { + const params: Recordable = { ...formValues }; + delete params.date_range; + + for (const key of ['title', 'notification_page']) { + const v = params[key]; + if (v === '' || v === undefined || v === null) { + delete params[key]; + } + } + + const statusRaw = params.status; + if (statusRaw === '' || statusRaw === undefined || statusRaw === null) { + delete params.status; + } else { + const n = Number(String(statusRaw).trim()); + if (n === 0 || n === 1) { + params.status = n; + } else { + delete params.status; + } + } + + return params; +} + const [Grid, gridApi] = useVbenVxeGrid({ formOptions: { - fieldMappingTime: [['date', ['startDate', 'endDate']]], + // 与表单字段 date_range 一致;后端 form 为 start_date / end_date + fieldMappingTime: [['date_range', ['start_date', 'end_date']]], schema: useGridFormSchema(), submitOnChange: true, }, gridOptions: { columns, height: 'auto', - keepSource: true, + // 该页不做行内编辑,关闭 source 缓存避免同 key 行数据刷新延迟。 + keepSource: false, proxyConfig: { ajax: { query: async ({ page }, formValues) => { return await getNotificationList({ page: page.currentPage, pageSize: page.pageSize, - ...formValues, + ...buildNotificationListParams(formValues), }); }, }, @@ -125,17 +154,8 @@ async function onStatusChange( `你要将通知"${row.title}"的状态切换为【${status[newStatus]}】吗?`, '切换状态', ); - // 获取完整的通知数据 - const notification = await getNotificationList({ - page: 1, - pageSize: 1, - id: row.id, - }); - const fullData = notification.items[0]; - if (!fullData) { - message.error('获取通知数据失败'); - return false; - } + // 列表接口不支持按 id 筛选,必须用详情接口取完整字段再更新 + const fullData = await getNotificationDetail(row.id); await updateNotification(row.id, { id: row.id, status: newStatus, @@ -147,6 +167,7 @@ async function onStatusChange( end_date: fullData.end_date, end_time: fullData.end_time, }); + onRefresh(); return true; } catch { return false; diff --git a/apps/bdrp-admin-web/src/views/system/role.zip b/apps/bdrp-admin-web/src/views/system/role.zip new file mode 100644 index 0000000000000000000000000000000000000000..dc4a50833ddeaf19746134a8b7297904b53cc829 GIT binary patch literal 6496 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 dM