From 9237488b17f53419bc1ca6b1481a033f3e113c31 Mon Sep 17 00:00:00 2001 From: zhongzm Date: Mon, 11 Aug 2025 11:21:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=91=8A=E8=AD=A6=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/api/alert/alert.ts | 33 +++ .../src/locales/langs/en-US/alert.json | 16 ++ .../src/locales/langs/zh-CN/alert.json | 16 ++ apps/web-antd/src/views/alert/data.ts | 192 ++++++++++++++++++ apps/web-antd/src/views/alert/index.vue | 191 +++++++++++++++++ 5 files changed, 448 insertions(+) create mode 100644 apps/web-antd/src/api/alert/alert.ts create mode 100644 apps/web-antd/src/locales/langs/en-US/alert.json create mode 100644 apps/web-antd/src/locales/langs/zh-CN/alert.json create mode 100644 apps/web-antd/src/views/alert/data.ts create mode 100644 apps/web-antd/src/views/alert/index.vue diff --git a/apps/web-antd/src/api/alert/alert.ts b/apps/web-antd/src/api/alert/alert.ts new file mode 100644 index 0000000..bfa4183 --- /dev/null +++ b/apps/web-antd/src/api/alert/alert.ts @@ -0,0 +1,33 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace AlertApi { + export interface Alert { + id: number; + users: []; + days: []; + content: string; + status: number; + templateCode: string; + remark: string; + createTime: string; + } + + export interface AlertPageReq extends PageParam { + reminderName?: string; + expireTime?: string; + reminderDays?: number; + } +} +// 获取告警列表 +export function getAlertPage(params: PageParam) { + return requestClient.get>('/license/alert/page', { + params, + }); +} + +// 修改告警配置 +export function updateAlert(data: AlertApi.Alert) { + return requestClient.put('/license/alert/update', data); +} diff --git a/apps/web-antd/src/locales/langs/en-US/alert.json b/apps/web-antd/src/locales/langs/en-US/alert.json new file mode 100644 index 0000000..7c3abcf --- /dev/null +++ b/apps/web-antd/src/locales/langs/en-US/alert.json @@ -0,0 +1,16 @@ +{ + "list": "Alert Configuration List", + "reminderName": "Reminder Person", + "reminderNamePlaceholder": "Please enter reminder person name", + "expireTime": "Expire Time", + "expireTimePlaceholder": "Please select expire time", + "reminderDays": "Reminder Days", + "reminderDaysPlaceholder": "Please enter reminder days", + "email": "Email", + "emailPlaceholder": "Please enter email address", + "description": "Description", + "descriptionPlaceholder": "Please enter description", + "createTime": "Create Time", + "updateTime": "Update Time", + "operation": "Operation" +} diff --git a/apps/web-antd/src/locales/langs/zh-CN/alert.json b/apps/web-antd/src/locales/langs/zh-CN/alert.json new file mode 100644 index 0000000..13f3a2d --- /dev/null +++ b/apps/web-antd/src/locales/langs/zh-CN/alert.json @@ -0,0 +1,16 @@ +{ + "list": "告警配置列表", + "reminderName": "提醒人", + "reminderNamePlaceholder": "请输入提醒人姓名", + "expireTime": "到期时间", + "expireTimePlaceholder": "请选择到期时间", + "reminderDays": "提醒天数", + "reminderDaysPlaceholder": "请输入提醒天数", + "email": "邮箱", + "emailPlaceholder": "请输入邮箱地址", + "description": "描述", + "descriptionPlaceholder": "请输入描述信息", + "createTime": "创建时间", + "updateTime": "更新时间", + "operation": "操作" +} diff --git a/apps/web-antd/src/views/alert/data.ts b/apps/web-antd/src/views/alert/data.ts new file mode 100644 index 0000000..634b7a3 --- /dev/null +++ b/apps/web-antd/src/views/alert/data.ts @@ -0,0 +1,192 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { OnActionClickFn, VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { AlertApi } from '#/api/alert/alert'; + +import { h, ref } from 'vue'; + +import { $t } from '#/locales'; + +export const formData = ref(); + +export function useGridColumns(onActionClick: OnActionClickFn) { + const columns: VxeTableGridOptions['columns'] = [ + { + title: $t('alert.reminderName'), + field: 'reminderName', + width: 200, + showOverflow: true, + }, + { + title: $t('alert.expireTime'), + field: 'expireTime', + width: 180, + formatter: ({ cellValue }) => { + return cellValue ? new Date(cellValue).toLocaleString() : '-'; + }, + }, + { + title: $t('alert.reminderDays'), + field: 'reminderDays', + width: 120, + formatter: ({ cellValue }) => { + return cellValue ? `${cellValue}天` : '-'; + }, + }, + { + title: $t('alert.createTime'), + field: 'createTime', + width: 180, + formatter: ({ cellValue }) => { + return cellValue ? new Date(cellValue).toLocaleString() : '-'; + }, + }, + { + title: $t('alert.operation'), + field: 'actions', + width: 120, + fixed: 'right', + slots: { + default: ({ row }) => [ + h( + 'div', + { + class: 'flex items-center gap-1', + }, + [ + h( + 'button', + { + class: 'text-primary hover:text-primary-dark', + onClick: () => onActionClick({ code: 'edit', row }), + }, + [ + h('span', { class: 'i-mdi:pencil text-sm' }), + h('span', { class: 'ml-1' }, $t('ui.actionTitle.edit')), + ], + ), + h( + 'button', + { + class: 'text-destructive hover:text-destructive-dark', + onClick: () => onActionClick({ code: 'delete', row }), + }, + [ + h('span', { class: 'i-mdi:delete text-sm' }), + h('span', { class: 'ml-1' }, $t('ui.actionTitle.delete')), + ], + ), + ], + ), + ], + }, + }, + ]; + + return columns; +} + +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'reminderName', + label: $t('alert.reminderName'), + component: 'Input', + componentProps: { + allowClear: true, + }, + }, + { + fieldName: 'expireTime', + label: $t('alert.expireTime'), + component: 'RangePicker', + componentProps: { + allowClear: true, + }, + }, + { + fieldName: 'reminderDays', + label: $t('alert.reminderDays'), + component: 'Input', + componentProps: { + allowClear: true, + }, + }, + { + fieldName: 'email', + label: $t('alert.email'), + component: 'Input', + componentProps: { + allowClear: true, + }, + }, + ]; +} + +export function useAlertFormSchema( + userOptions: any = [], + daysOptions: any = [], +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'users', + label: '提醒人', + rules: 'required', + component: 'Select', + componentProps: { + placeholder: '请选择提醒人', + mode: 'multiple', + allowClear: true, + showSearch: true, + filterOption: (input: string, option: any) => { + return option?.label?.toLowerCase().includes(input.toLowerCase()); + }, + options: userOptions, + }, + }, + { + fieldName: 'days', + label: '提醒天数', + rules: 'required', + component: 'Select', + componentProps: { + placeholder: '请选择提醒天数', + mode: 'multiple', + allowClear: true, + options: daysOptions, + }, + }, + { + fieldName: 'content', + label: '提醒内容', + rules: 'required', + component: 'Textarea', + componentProps: { + placeholder: '请输入提醒内容', + rows: 4, + showCount: true, + maxlength: 500, + }, + }, + { + fieldName: 'status', + label: '启用状态', + component: 'Switch', + componentProps: { + checkedChildren: '启用', + unCheckedChildren: '禁用', + checkedValue: 1, + unCheckedValue: 2, + style: { width: 'auto' }, + }, + defaultValue: 1, + }, + ]; +} diff --git a/apps/web-antd/src/views/alert/index.vue b/apps/web-antd/src/views/alert/index.vue new file mode 100644 index 0000000..9a82c08 --- /dev/null +++ b/apps/web-antd/src/views/alert/index.vue @@ -0,0 +1,191 @@ + + +