Commit 6000cf9a7a752b643e1036eeefba346096f3b3f9
1 parent
39cb4bc2
'修改首页顶部数据和ui,新增消息批量删除的功能,封装useBatchDelete批量删除的hook'
Showing
5 changed files
with
135 additions
and
84 deletions
src/hooks/web/useBatchDelete.ts
0 → 100644
1 | +import { ref, computed } from 'vue'; | ||
2 | +import { useMessage } from '/@/hooks/web/useMessage'; | ||
3 | +/** | ||
4 | + * | ||
5 | + * @param deleteFn 要删除的API接口方法 | ||
6 | + * @param handleSuccess 刷新表格的方法 | ||
7 | + * @returns { | ||
8 | + * hasBatchDelete: 是否可以删除 | ||
9 | + * selectionOptions 表格复选框配置项 | ||
10 | + * handleDeleteOrBatchDelete 删除方法,适用单一删除和批量删除。参数为null为批量删除 | ||
11 | + * } | ||
12 | + * | ||
13 | + */ | ||
14 | +export interface selectionOptions { | ||
15 | + rowKey: string; | ||
16 | + clickToRowSelect: boolean; | ||
17 | + rowSelection: { | ||
18 | + onChange: (selectedRowKeys: string[]) => void; | ||
19 | + type: 'radio' | 'checkbox'; | ||
20 | + }; | ||
21 | +} | ||
22 | +export const useBatchDelete = ( | ||
23 | + deleteFn: (deleteIds: string[]) => Promise<void>, | ||
24 | + handleSuccess: () => void | ||
25 | +) => { | ||
26 | + const { createMessage } = useMessage(); | ||
27 | + const selectedRowIds = ref<string[]>([]); | ||
28 | + const hasBatchDelete = computed(() => selectedRowIds.value.length <= 0); | ||
29 | + // 复选框事件 | ||
30 | + const onSelectRowChange = (selectedRowKeys: string[]) => { | ||
31 | + selectedRowIds.value = selectedRowKeys; | ||
32 | + }; | ||
33 | + const handleDeleteOrBatchDelete = async (record: Recordable | null) => { | ||
34 | + if (record) { | ||
35 | + try { | ||
36 | + await deleteFn([record.id]); | ||
37 | + createMessage.success('删除联系人成功'); | ||
38 | + handleSuccess(); | ||
39 | + } catch (e) { | ||
40 | + createMessage.error('删除失败'); | ||
41 | + } | ||
42 | + } else { | ||
43 | + try { | ||
44 | + await deleteFn(selectedRowIds.value); | ||
45 | + createMessage.success('批量删除联系人成功'); | ||
46 | + selectedRowIds.value = []; | ||
47 | + handleSuccess(); | ||
48 | + } catch (e) { | ||
49 | + createMessage.info('删除失败'); | ||
50 | + } | ||
51 | + } | ||
52 | + }; | ||
53 | + const selectionOptions: selectionOptions = { | ||
54 | + rowKey: 'id', | ||
55 | + clickToRowSelect: false, | ||
56 | + rowSelection: { | ||
57 | + onChange: onSelectRowChange, | ||
58 | + type: 'checkbox', | ||
59 | + }, | ||
60 | + }; | ||
61 | + return { hasBatchDelete, selectionOptions, handleDeleteOrBatchDelete }; | ||
62 | +}; |
@@ -45,6 +45,9 @@ | @@ -45,6 +45,9 @@ | ||
45 | </div> | 45 | </div> |
46 | <div class="flex-auto"> | 46 | <div class="flex-auto"> |
47 | <div class="flex justify-between" style="align-items: center"> | 47 | <div class="flex justify-between" style="align-items: center"> |
48 | + <div v-if="!isAdmin(role)" style="font-size: 1.625rem; color: #333">{{ | ||
49 | + growCardList?.alarmInfo?.sumCount | ||
50 | + }}</div> | ||
48 | <div style="font-size: 1.625rem; color: #333">{{ | 51 | <div style="font-size: 1.625rem; color: #333">{{ |
49 | growCardList?.tenantInfo?.sumCount | 52 | growCardList?.tenantInfo?.sumCount |
50 | }}</div> | 53 | }}</div> |
@@ -53,7 +56,10 @@ | @@ -53,7 +56,10 @@ | ||
53 | <div> {{ !isAdmin(role) ? `${currentMonth}月告警数(条)` : '租户总量(个)' }}</div> | 56 | <div> {{ !isAdmin(role) ? `${currentMonth}月告警数(条)` : '租户总量(个)' }}</div> |
54 | </div> | 57 | </div> |
55 | </div> | 58 | </div> |
56 | - <div class="ml-2 pt-4" style="border-top: 2px solid #f0f2f5"> | 59 | + <div v-if="!isAdmin(role)" class="ml-2 pt-4" style="border-top: 2px solid #f0f2f5"> |
60 | + 今日新增 {{ growCardList?.alarmInfo?.todayAdd }}</div | ||
61 | + > | ||
62 | + <div v-else class="ml-2 pt-4" style="border-top: 2px solid #f0f2f5"> | ||
57 | 今日新增 {{ growCardList?.tenantInfo?.todayAdd }}</div | 63 | 今日新增 {{ growCardList?.tenantInfo?.todayAdd }}</div |
58 | > | 64 | > |
59 | </Card> | 65 | </Card> |
@@ -66,27 +72,40 @@ | @@ -66,27 +72,40 @@ | ||
66 | style="width: 5rem; height: 5rem" | 72 | style="width: 5rem; height: 5rem" |
67 | /><img v-else src="/src/assets/images/kf.png" style="width: 5rem; height: 5rem" /> | 73 | /><img v-else src="/src/assets/images/kf.png" style="width: 5rem; height: 5rem" /> |
68 | </div> | 74 | </div> |
69 | - <div style="display: flex; align-items: center"> | ||
70 | - <div v-if="!isAdmin(role)"> | ||
71 | - <div> | 75 | + <div v-if="!isAdmin(role)" style="display: flex; align-items: center"> |
76 | + <div> | ||
77 | + <div class="flex" style="align-items: center"> | ||
72 | {{ `${currentMonth}月数据点(条)` }} | 78 | {{ `${currentMonth}月数据点(条)` }} |
73 | - <span>{{ growCardList?.messageInfo?.dataPointsCount }}</span> | 79 | + <span style="font-size: 1.625rem; color: #333"> |
80 | + {{ growCardList?.messageInfo?.dataPointsCount }}</span | ||
81 | + > | ||
74 | </div> | 82 | </div> |
75 | - <div> | 83 | + <div class="flex" style="align-items: center"> |
76 | {{ `${currentMonth}月消息量(条)` }} | 84 | {{ `${currentMonth}月消息量(条)` }} |
77 | - <span>{{ growCardList?.messageInfo?.messageCount }}</span> | 85 | + <span style="font-size: 1.625rem; color: #333"> |
86 | + {{ growCardList?.messageInfo?.messageCount }}</span | ||
87 | + > | ||
78 | </div> | 88 | </div> |
79 | </div> | 89 | </div> |
80 | - <div v-else>客户总量(个)</div> | ||
81 | </div> | 90 | </div> |
82 | - </div> | ||
83 | - <div class="ml-2 pt-4" style="border-top: 2px solid #f0f2f5"> | ||
84 | - <div> | ||
85 | - 今日新增 | ||
86 | - <span class="ml-8">数据点 ({{ growCardList?.messageInfo?.todayDataPointsAdd }})</span> | ||
87 | - <span class="ml-8">消息量 ({{ growCardList?.messageInfo?.todayMessageAdd }})</span> | 91 | + <div class="flex-auto" v-else> |
92 | + <div class="flex justify-between" style="align-items: center"> | ||
93 | + <div style="font-size: 1.625rem; color: #333">{{ | ||
94 | + growCardList?.customerInfo?.sumCount | ||
95 | + }}</div> | ||
96 | + <img src="/src/assets/images/tip.png" style="width: 1.4rem; height: 1.4rem" /> | ||
97 | + </div> | ||
98 | + <div>客户总量(个)</div> | ||
88 | </div> | 99 | </div> |
89 | </div> | 100 | </div> |
101 | + <div v-if="!isAdmin(role)" class="ml-2 pt-4" style="border-top: 2px solid #f0f2f5"> | ||
102 | + 今日新增 | ||
103 | + <span class="ml-8">数据点 ({{ growCardList?.messageInfo?.todayDataPointsAdd }})</span> | ||
104 | + <span class="ml-8">消息量 ({{ growCardList?.messageInfo?.todayMessageAdd }})</span> | ||
105 | + </div> | ||
106 | + <div v-else class="ml-2 pt-4" style="border-top: 2px solid #f0f2f5"> | ||
107 | + 今日新增 {{ growCardList?.customerInfo?.todayAdd }}</div | ||
108 | + > | ||
90 | </Card> | 109 | </Card> |
91 | </div> | 110 | </div> |
92 | </template> | 111 | </template> |
src/views/message/records/data.ts
renamed from
src/views/message/records/data.tsx
@@ -15,37 +15,3 @@ export const achieveList: TabItem[] = [ | @@ -15,37 +15,3 @@ export const achieveList: TabItem[] = [ | ||
15 | component: 'EmailLog', | 15 | component: 'EmailLog', |
16 | }, | 16 | }, |
17 | ]; | 17 | ]; |
18 | - | ||
19 | -export const actions: any[] = [ | ||
20 | - { icon: 'clarity:star-line', text: '156', color: '#018ffb' }, | ||
21 | - { icon: 'bx:bxs-like', text: '156', color: '#459ae8' }, | ||
22 | - { icon: 'bx:bxs-message-dots', text: '2', color: '#42d27d' }, | ||
23 | -]; | ||
24 | - | ||
25 | -export const articleList = (() => { | ||
26 | - const result: any[] = []; | ||
27 | - for (let i = 0; i < 4; i++) { | ||
28 | - result.push({ | ||
29 | - title: 'Vben Admin', | ||
30 | - description: ['Vben', '设计语言', 'Typescript'], | ||
31 | - content: '基于Vue Next, TypeScript, Ant Design实现的一套完整的企业级后台管理系统。', | ||
32 | - time: '2020-11-14 11:20', | ||
33 | - }); | ||
34 | - } | ||
35 | - return result; | ||
36 | -})(); | ||
37 | - | ||
38 | -export const applicationList = (() => { | ||
39 | - const result: any[] = []; | ||
40 | - for (let i = 0; i < 8; i++) { | ||
41 | - result.push({ | ||
42 | - title: 'Vben Admin', | ||
43 | - icon: 'emojione-monotone:letter-a', | ||
44 | - color: '#1890ff', | ||
45 | - active: '100', | ||
46 | - new: '1,799', | ||
47 | - download: 'bx:bx-download', | ||
48 | - }); | ||
49 | - } | ||
50 | - return result; | ||
51 | -})(); |
@@ -3,6 +3,14 @@ | @@ -3,6 +3,14 @@ | ||
3 | <BasicTable @register="registerTable"> | 3 | <BasicTable @register="registerTable"> |
4 | <template #toolbar> | 4 | <template #toolbar> |
5 | <a-button type="primary" @click="handleCreate"> 导出 </a-button> | 5 | <a-button type="primary" @click="handleCreate"> 导出 </a-button> |
6 | + <a-button | ||
7 | + type="primary" | ||
8 | + color="error" | ||
9 | + @click="handleDeleteOrBatchDelete(null)" | ||
10 | + :disabled="hasBatchDelete" | ||
11 | + > | ||
12 | + 批量删除 | ||
13 | + </a-button> | ||
6 | </template> | 14 | </template> |
7 | <template #action="{ record }"> | 15 | <template #action="{ record }"> |
8 | <TableAction | 16 | <TableAction |
@@ -18,7 +26,7 @@ | @@ -18,7 +26,7 @@ | ||
18 | color: 'error', | 26 | color: 'error', |
19 | popConfirm: { | 27 | popConfirm: { |
20 | title: '是否确认删除', | 28 | title: '是否确认删除', |
21 | - confirm: handleDelete.bind(null, record), | 29 | + confirm: handleDeleteOrBatchDelete.bind(null, record), |
22 | }, | 30 | }, |
23 | }, | 31 | }, |
24 | ]" | 32 | ]" |
@@ -33,16 +41,19 @@ | @@ -33,16 +41,19 @@ | ||
33 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; | 41 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; |
34 | import { useDrawerInner } from '/@/components/Drawer'; | 42 | import { useDrawerInner } from '/@/components/Drawer'; |
35 | import { columns, searchFormSchema } from './email.data'; | 43 | import { columns, searchFormSchema } from './email.data'; |
36 | - import { useMessage } from '/@/hooks/web/useMessage'; | ||
37 | import { mailLogPage, deleteMailLog } from '/@/api/message/records'; | 44 | import { mailLogPage, deleteMailLog } from '/@/api/message/records'; |
38 | import { useModal } from '/@/components/Modal'; | 45 | import { useModal } from '/@/components/Modal'; |
39 | import EmailDetail from '/@/views/message/records/item/EmailDetail.vue'; | 46 | import EmailDetail from '/@/views/message/records/item/EmailDetail.vue'; |
47 | + import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
40 | export default defineComponent({ | 48 | export default defineComponent({ |
41 | name: 'EmailLog', | 49 | name: 'EmailLog', |
42 | components: { EmailDetail, BasicTable, TableAction }, | 50 | components: { EmailDetail, BasicTable, TableAction }, |
43 | setup() { | 51 | setup() { |
44 | const [registerModal, { openModal }] = useModal(); | 52 | const [registerModal, { openModal }] = useModal(); |
45 | - const { createMessage } = useMessage(); | 53 | + const { hasBatchDelete, selectionOptions, handleDeleteOrBatchDelete } = useBatchDelete( |
54 | + deleteMailLog, | ||
55 | + handleSuccess | ||
56 | + ); | ||
46 | const [register] = useDrawerInner(() => {}); | 57 | const [register] = useDrawerInner(() => {}); |
47 | const [registerTable, { reload }] = useTable({ | 58 | const [registerTable, { reload }] = useTable({ |
48 | title: '邮件发送列表', | 59 | title: '邮件发送列表', |
@@ -64,7 +75,7 @@ | @@ -64,7 +75,7 @@ | ||
64 | slots: { customRender: 'action' }, | 75 | slots: { customRender: 'action' }, |
65 | fixed: 'right', | 76 | fixed: 'right', |
66 | }, | 77 | }, |
67 | - immediate: true, | 78 | + ...selectionOptions, |
68 | }); | 79 | }); |
69 | 80 | ||
70 | function handleCreate() {} | 81 | function handleCreate() {} |
@@ -75,14 +86,6 @@ | @@ -75,14 +86,6 @@ | ||
75 | }); | 86 | }); |
76 | } | 87 | } |
77 | 88 | ||
78 | - function handleDelete(record: Recordable) { | ||
79 | - let ids = [record.id]; | ||
80 | - deleteMailLog(ids).then((result) => { | ||
81 | - createMessage.success(result.message); | ||
82 | - handleSuccess(); | ||
83 | - }); | ||
84 | - } | ||
85 | - | ||
86 | function handleSuccess() { | 89 | function handleSuccess() { |
87 | reload(); | 90 | reload(); |
88 | } | 91 | } |
@@ -92,7 +95,8 @@ | @@ -92,7 +95,8 @@ | ||
92 | registerTable, | 95 | registerTable, |
93 | registerModal, | 96 | registerModal, |
94 | handleCreate, | 97 | handleCreate, |
95 | - handleDelete, | 98 | + hasBatchDelete, |
99 | + handleDeleteOrBatchDelete, | ||
96 | handleModal, | 100 | handleModal, |
97 | handleSuccess, | 101 | handleSuccess, |
98 | }; | 102 | }; |
@@ -2,7 +2,15 @@ | @@ -2,7 +2,15 @@ | ||
2 | <div style="background-color: #f0f2f5"> | 2 | <div style="background-color: #f0f2f5"> |
3 | <BasicTable @register="registerTable"> | 3 | <BasicTable @register="registerTable"> |
4 | <template #toolbar> | 4 | <template #toolbar> |
5 | - <a-button type="primary" @click="handleCreate"> 导出 </a-button> | 5 | + <a-button type="primary" @click="handleExport"> 导出 </a-button> |
6 | + <a-button | ||
7 | + type="primary" | ||
8 | + color="error" | ||
9 | + @click="handleDeleteOrBatchDelete(null)" | ||
10 | + :disabled="hasBatchDelete" | ||
11 | + > | ||
12 | + 批量删除 | ||
13 | + </a-button> | ||
6 | </template> | 14 | </template> |
7 | <template #action="{ record }"> | 15 | <template #action="{ record }"> |
8 | <TableAction | 16 | <TableAction |
@@ -18,7 +26,7 @@ | @@ -18,7 +26,7 @@ | ||
18 | color: 'error', | 26 | color: 'error', |
19 | popConfirm: { | 27 | popConfirm: { |
20 | title: '是否确认删除', | 28 | title: '是否确认删除', |
21 | - confirm: handleDelete.bind(null, record), | 29 | + confirm: handleDeleteOrBatchDelete.bind(null, record), |
22 | }, | 30 | }, |
23 | }, | 31 | }, |
24 | ]" | 32 | ]" |
@@ -29,21 +37,22 @@ | @@ -29,21 +37,22 @@ | ||
29 | </template> | 37 | </template> |
30 | <script lang="ts"> | 38 | <script lang="ts"> |
31 | import { defineComponent, h } from 'vue'; | 39 | import { defineComponent, h } from 'vue'; |
32 | - | ||
33 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; | 40 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; |
34 | - import { useDrawerInner } from '/@/components/Drawer'; | ||
35 | import { columns, searchFormSchema } from './sms.data'; | 41 | import { columns, searchFormSchema } from './sms.data'; |
36 | import { Modal } from 'ant-design-vue'; | 42 | import { Modal } from 'ant-design-vue'; |
37 | - import { useMessage } from '/@/hooks/web/useMessage'; | ||
38 | import { smsLogPage, deleteSmsLog } from '/@/api/message/records'; | 43 | import { smsLogPage, deleteSmsLog } from '/@/api/message/records'; |
39 | import { JsonPreview } from '/@/components/CodeEditor'; | 44 | import { JsonPreview } from '/@/components/CodeEditor'; |
45 | + import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
40 | 46 | ||
41 | export default defineComponent({ | 47 | export default defineComponent({ |
42 | name: 'SmsLog', | 48 | name: 'SmsLog', |
43 | components: { BasicTable, TableAction }, | 49 | components: { BasicTable, TableAction }, |
44 | setup() { | 50 | setup() { |
45 | - const { createMessage } = useMessage(); | ||
46 | - const [register] = useDrawerInner(() => {}); | 51 | + // 批量删除的hooks |
52 | + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete( | ||
53 | + deleteSmsLog, | ||
54 | + handleSuccess | ||
55 | + ); | ||
47 | const [registerTable, { reload }] = useTable({ | 56 | const [registerTable, { reload }] = useTable({ |
48 | title: '短信发送列表', | 57 | title: '短信发送列表', |
49 | api: smsLogPage, | 58 | api: smsLogPage, |
@@ -64,10 +73,8 @@ | @@ -64,10 +73,8 @@ | ||
64 | slots: { customRender: 'action' }, | 73 | slots: { customRender: 'action' }, |
65 | fixed: 'right', | 74 | fixed: 'right', |
66 | }, | 75 | }, |
76 | + ...selectionOptions, | ||
67 | }); | 77 | }); |
68 | - | ||
69 | - function handleCreate() {} | ||
70 | - | ||
71 | function handleQuery(record: Recordable) { | 78 | function handleQuery(record: Recordable) { |
72 | Modal.info({ | 79 | Modal.info({ |
73 | title: '当前配置', | 80 | title: '当前配置', |
@@ -75,26 +82,19 @@ | @@ -75,26 +82,19 @@ | ||
75 | content: h(JsonPreview, { data: JSON.parse(JSON.stringify(record.templateParam)) }), | 82 | content: h(JsonPreview, { data: JSON.parse(JSON.stringify(record.templateParam)) }), |
76 | }); | 83 | }); |
77 | } | 84 | } |
78 | - | ||
79 | - function handleDelete(record: Recordable) { | ||
80 | - let ids = [record.id]; | ||
81 | - deleteSmsLog(ids).then((result) => { | ||
82 | - createMessage.success(result.message); | ||
83 | - handleSuccess(); | ||
84 | - }); | ||
85 | - } | ||
86 | - | 85 | + // 导出 TODO:待做 |
86 | + const handleExport = () => {}; | ||
87 | + // 刷新表格 | ||
87 | function handleSuccess() { | 88 | function handleSuccess() { |
88 | reload(); | 89 | reload(); |
89 | } | 90 | } |
90 | 91 | ||
91 | return { | 92 | return { |
92 | - register, | 93 | + hasBatchDelete, |
93 | registerTable, | 94 | registerTable, |
94 | - handleCreate, | ||
95 | - handleDelete, | ||
96 | - handleSuccess, | 95 | + handleExport, |
97 | handleQuery, | 96 | handleQuery, |
97 | + handleDeleteOrBatchDelete, | ||
98 | }; | 98 | }; |
99 | }, | 99 | }, |
100 | }); | 100 | }); |