Commit 3613688cbcc568e1bb249ba70577b3b5c81461e5

Authored by xp.Huang
2 parents e8658d2a 97d08c4f

Merge branch 'sqy_dev' into 'main'

fix:修改首页通知信息,修改我的通知UI,解决之前遗留的bug

See merge request huang/yun-teng-iot-front!46
... ... @@ -89,7 +89,7 @@ export const notifyMyGetDetailApi = (id: string) => {
89 89 };
90 90
91 91 /**
92   - * 查询我的通知表格
  92 + * 查询我的通知表格分页
93 93 * @param params pageSize page name
94 94 */
95 95 export const notifyMyGetrPageApi = (params?: NoticeQueryParam) => {
... ...
... ... @@ -16,6 +16,8 @@ import {
16 16 ChangeAccountParams,
17 17 RoleListItem,
18 18 } from './model/systemModel';
  19 +import { USER_INFO_KEY } from '/@/enums/cacheEnum';
  20 +import { getAuthCache } from '/@/utils/auth';
19 21 import { defHttp } from '/@/utils/http/axios';
20 22
21 23 enum Api {
... ... @@ -84,10 +86,20 @@ export const getAllRoleList = async (params?: RoleParams) => {
84 86 return defHttp.post<RoleListGetResultModel>({ url: Api.GetAllRoleList, params });
85 87 };
86 88
87   -// 过滤角色列表----过滤掉不是PLATFORM_ADMIN的角色
88   -export const filterRoleList = async (params?: RoleParams) => {
89   - const res = await defHttp.post<RoleListGetResultModel>({ url: Api.GetAllRoleList, params });
90   - const options = res.filter((item) => item.roleType === 'PLATFORM_ADMIN');
  89 +// 过滤角色列表----根据登录的账号所属的角色-过滤掉其他平台类型的角色
  90 +export const filterRoleList = async () => {
  91 + const res = await defHttp.post<RoleListGetResultModel>({ url: Api.GetAllRoleList });
  92 + const userInfo: any = getAuthCache(USER_INFO_KEY);
  93 + const role = userInfo.roles[0];
  94 + const options = res.filter((item) => {
  95 + if (role === 'SYS_ADMIN') {
  96 + return item.roleType === 'PLATFORM_ADMIN';
  97 + } else if (role === 'PLATFORM_ADMIN') {
  98 + return item.roleType === 'PLATFORM_ADMIN';
  99 + } else {
  100 + return item.roleType === 'CUSTOMER_USER';
  101 + }
  102 + });
91 103 return Promise.resolve<RoleListItem[]>(options);
92 104 };
93 105
... ...
... ... @@ -63,7 +63,7 @@
63 63 const BMap = (window as any).BMap;
64 64 if (!wrapEl) return;
65 65 const map = new BMap.Map(wrapEl);
66   - const point = new BMap.Point(116.14282, 35.19515);
  66 + const point = new BMap.Point(104.04666605565338, 30.543516387560476);
67 67
68 68 map.centerAndZoom(point, 15);
69 69 map.enableScrollWheelZoom(true);
... ...
1 1 <template>
2 2 <div>
3   - <PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
  3 + <PageWrapper dense contentFullHeight contentClass="flex">
4 4 <OrganizationIdTree
5 5 class="w-1/4 xl:w-1/5"
6 6 @select="handleSelect"
... ... @@ -12,7 +12,7 @@
12 12 <a-button
13 13 type="primary"
14 14 color="error"
15   - @click="handleDeleteOrBatchDelete.bind(null)"
  15 + @click="handleDeleteOrBatchDelete(null)"
16 16 :disabled="hasBatchDelete"
17 17 >
18 18 批量删除
... ... @@ -120,7 +120,7 @@
120 120 }
121 121 };
122 122 // 删除或批量删除
123   - const handleDeleteOrBatchDelete = async (record?: Recordable) => {
  123 + const handleDeleteOrBatchDelete = async (record: Recordable | null) => {
124 124 if (record) {
125 125 try {
126 126 await deleteAlarmContact([record.id]);
... ...
... ... @@ -14,35 +14,43 @@
14 14 :bodyStyle="{ padding: 0 }"
15 15 >
16 16 <div v-if="activeKey === 'tab1'">
17   - <List item-layout="horizontal" :data-source="data">
  17 + <List item-layout="horizontal" :dataSource="dataSource">
18 18 <template #renderItem="{ item }">
19 19 <ListItem>
20   - <ListItemMeta :description="item.description">
21   - <template #title>
22   - <a href="https://www.antdv.com/">{{ item.title }}</a>
23   - </template>
  20 + <ListItemMeta>
24 21 <template #avatar>
25   - <Avatar :src="item.avatar" />
  22 + <Avatar src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png" />
  23 + </template>
  24 + <template #description>
  25 + <span
  26 + @click="go('/stationnotification/mynotification')"
  27 + class="cursor-pointer noticeTitle"
  28 + >{{ item.sysNotice.title }}
  29 + </span>
  30 + </template>
  31 + <template #title>
  32 + <span>{{ item.user.realName }}</span>
26 33 </template>
27 34 </ListItemMeta>
28   - <template #extra> {{ item.date }} </template>
  35 + <template #extra>
  36 + <Time :value="item.sysNotice.senderDate" />
  37 + </template>
29 38 </ListItem>
30 39 </template>
31 40 </List>
  41 + <Card hoverable title="联系我们" :bordered="false">
  42 + <template #cover>
  43 + <img :src="getQrCode" alt="" style="width: 150px; height: 150px; margin: 50px auto" />
  44 + </template>
  45 + <CardMeta>
  46 + <template #description>
  47 + <p>联系人: {{ getContacts }}</p>
  48 + <p>联系电话: {{ getTel }}</p>
  49 + <p>联系地址: {{ getAddress }} </p>
  50 + </template>
  51 + </CardMeta>
  52 + </Card>
32 53 </div>
33   - <div v-else>222</div>
34   - </Card>
35   - <Card hoverable title="联系我们" :bordered="false">
36   - <template #cover>
37   - <img :src="getQrCode" alt="" style="width: 150px; height: 150px; margin: 50px auto" />
38   - </template>
39   - <CardMeta>
40   - <template #description>
41   - <p>联系人: {{ getContacts }}</p>
42   - <p>联系电话: {{ getTel }}</p>
43   - <p>联系地址: {{ getAddress }} </p>
44   - </template>
45   - </CardMeta>
46 54 </Card>
47 55 </Card>
48 56 </template>
... ... @@ -52,6 +60,9 @@
52 60 import { Card, AnchorLink, List, ListItem, ListItemMeta, Avatar, CardMeta } from 'ant-design-vue';
53 61 import { useUserStore } from '/@/store/modules/user';
54 62 import { getEnterPriseDetail } from '/@/api/oem';
  63 + import { notifyMyGetrPageApi } from '/@/api/stationnotification/stationnotifyApi';
  64 + import { Time } from '/@/components/Time';
  65 + import { useGo } from '/@/hooks/web/usePage';
55 66 export default defineComponent({
56 67 components: {
57 68 Card,
... ... @@ -60,6 +71,7 @@
60 71 ListItem,
61 72 ListItemMeta,
62 73 Avatar,
  74 + Time,
63 75 CardMeta,
64 76 },
65 77 setup() {
... ... @@ -90,57 +102,13 @@
90 102 const tabListTitle = [
91 103 {
92 104 key: 'tab1',
93   - tab: '通知公告',
94   - },
95   - {
96   - key: 'tab2',
97   - tab: '系统公告',
  105 + tab: '我的通知',
98 106 },
99 107 ];
100 108 const onTabChange = (key) => {
101 109 activeKey.value = key;
102 110 };
103 111
104   - // 列表
105   - interface DataItem {
106   - title: string;
107   - description: string;
108   - avatar: string;
109   - date: string;
110   - }
111   - const data: DataItem[] = [
112   - {
113   - title: '企业管理员',
114   - description: '现在就来开创新的记录吧!',
115   - avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png',
116   - date: '5分钟前',
117   - },
118   - {
119   - title: '企业管理员',
120   - description: '有新的告警数据需要处理,现在去查看吧',
121   - avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png',
122   - date: '7小时前',
123   - },
124   - {
125   - title: '管理员',
126   - description: '有新的告警数据需要处理,现在去查看吧',
127   - avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png',
128   - date: '6小时前',
129   - },
130   - {
131   - title: '管理员',
132   - description: '现在就来开创新的记录吧!',
133   - avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png',
134   - date: '1小时前',
135   - },
136   - {
137   - title: '管理员',
138   - description: '现在就来开创新的记录吧!',
139   - avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png',
140   - date: '7小时前',
141   - },
142   - ];
143   -
144 112 const userStore = useUserStore();
145 113 const getContacts = computed(() => {
146 114 return userStore.enterPriseInfo?.contacts;
... ... @@ -155,19 +123,32 @@
155 123 return userStore.enterPriseInfo?.qrCode;
156 124 });
157 125
  126 + // 通知数据
  127 + const dataSource = ref([]);
  128 + const go = useGo();
  129 + onMounted(async () => {
  130 + const res = await notifyMyGetrPageApi({ page: 1, pageSize: 5 });
  131 + dataSource.value = res.items;
  132 + });
  133 +
158 134 return {
159 135 activeKey,
160 136 tabListTitle,
161 137 onTabChange,
162   - data,
163 138 helpDoc,
164 139 getQrCode,
165 140 getContacts,
166 141 getAddress,
167 142 getTel,
  143 + dataSource,
  144 + go,
168 145 };
169 146 },
170 147 });
171 148 </script>
172 149
173   -<style lang="less" scoped></style>
  150 +<style lang="less" scoped>
  151 + .noticeTitle:hover {
  152 + border-bottom: 1px solid #ccc;
  153 + }
  154 +</style>
... ...
... ... @@ -34,7 +34,7 @@
34 34 import { useDrawerInner } from '/@/components/Drawer';
35 35 import { columns, searchFormSchema } from './email.data';
36 36 import { useMessage } from '/@/hooks/web/useMessage';
37   - import { deleteSmsLog, mailLogPage } from '/@/api/message/records';
  37 + import { deleteSmsLog, mailLogPage, deleteMailLog } from '/@/api/message/records';
38 38 import { useModal } from '/@/components/Modal';
39 39 import EmailDetail from '/@/views/message/records/item/EmailDetail.vue';
40 40 export default defineComponent({
... ... @@ -77,7 +77,7 @@
77 77
78 78 function handleDelete(record: Recordable) {
79 79 let ids = [record.id];
80   - deleteSmsLog(ids).then((result) => {
  80 + deleteMailLog(ids).then((result) => {
81 81 createMessage.success(result.message);
82 82 handleSuccess();
83 83 });
... ...
  1 +<template>
  2 + <div>
  3 + <BasicModal
  4 + v-bind="$attrs"
  5 + @register="registerModal"
  6 + :showFooter="false"
  7 + :title="dataSource?.sysNotice?.title"
  8 + width="50%"
  9 + centered
  10 + :showCancelBtn="false"
  11 + :showOkBtn="false"
  12 + @cancel="handleClose"
  13 + >
  14 + <PageWrapper dense contentFullHeight contentBackground>
  15 + <div class="detail-notice-info">
  16 + <span class="mr-6"
  17 + ><UserOutlined class="mr-2" />发送者:{{ dataSource?.user?.realName }}</span
  18 + >
  19 + <span class="mr-6"
  20 + ><SolutionOutlined class="mr-2" />通知类型:{{
  21 + dataSource?.sysNotice?.type === 'NOTICE'
  22 + ? '公告'
  23 + : dataSource?.sysNotice?.type === 'MEETING'
  24 + ? '会议'
  25 + : dataSource?.sysNotice?.type === 'OTHER'
  26 + ? '其他'
  27 + : ''
  28 + }}</span
  29 + >
  30 + <span class="mr-6"
  31 + ><FieldTimeOutlined class="mr-2" />发送时间{{ dataSource?.sysNotice.senderDate }}</span
  32 + >
  33 + </div>
  34 + <p v-html="dataSource?.sysNotice?.content"></p>
  35 + </PageWrapper>
  36 + </BasicModal>
  37 + </div>
  38 +</template>
  39 +<script lang="ts">
  40 + import { defineComponent, ref, unref } from 'vue';
  41 + import { BasicModal, useModalInner } from '/@/components/Modal';
  42 + import { UserOutlined, SolutionOutlined, FieldTimeOutlined } from '@ant-design/icons-vue';
  43 + import { PageWrapper } from '/@/components/Page';
  44 + import { notifyMyGetDetailApi } from '/@/api/stationnotification/stationnotifyApi';
  45 + export default defineComponent({
  46 + name: 'MyNoticeDrawer',
  47 + components: { BasicModal, PageWrapper, UserOutlined, SolutionOutlined, FieldTimeOutlined },
  48 + emits: ['success', 'register'],
  49 + setup(_, { emit }) {
  50 + const dataSource = ref();
  51 + const [registerModal] = useModalInner(async (data) => {
  52 + dataSource.value = data.record;
  53 + });
  54 + const handleClose = async () => {
  55 + await notifyMyGetDetailApi(unref(dataSource).id);
  56 + emit('success');
  57 + };
  58 + return {
  59 + registerModal,
  60 + handleClose,
  61 + dataSource,
  62 + };
  63 + },
  64 + });
  65 +</script>
  66 +
  67 +<style lang="less" scoped>
  68 + .detail-notice-info {
  69 + color: #999;
  70 + border-top: 1px solid #ccc;
  71 + border-bottom: 1px solid #ccc;
  72 + padding-top: 5px;
  73 + padding-bottom: 5px;
  74 + }
  75 +</style>
... ...
... ... @@ -7,11 +7,8 @@ import { h } from 'vue';
7 7 export const columns: BasicColumn[] = [
8 8 {
9 9 title: '标题',
10   - dataIndex: 'title',
  10 + dataIndex: 'sysNotice.title',
11 11 width: 200,
12   - format: (text: string, record: Recordable) => {
13   - return record.sysNotice.title ?? '无';
14   - },
15 12 },
16 13 {
17 14 title: '类型',
... ... @@ -29,15 +26,12 @@ export const columns: BasicColumn[] = [
29 26 },
30 27 {
31 28 title: '发送者',
32   - dataIndex: 'senderName',
  29 + dataIndex: 'user.realName',
33 30 width: 200,
34   - format: (text: string, record: Recordable) => {
35   - return record.sysNotice.senderName ?? '无';
36   - },
37 31 },
38 32 {
39 33 title: '发送时间',
40   - dataIndex: 'createTime',
  34 + dataIndex: 'sysNotice.senderDate',
41 35 width: 200,
42 36 },
43 37 {
... ...
... ... @@ -14,21 +14,21 @@
14 14 />
15 15 </template>
16 16 </BasicTable>
17   - <NotifyDetailDrawer @register="registerDrawer" @success="handleSuccess" />
  17 + <CatNoticeModal @register="registerModal" @success="handleSuccess" />
18 18 </div>
19 19 </template>
20 20 <script lang="ts">
21 21 import { defineComponent } from 'vue';
22 22 import { BasicTable, useTable, TableAction } from '/@/components/Table';
23   - import { useDrawer } from '/@/components/Drawer';
24   - import NotifyDetailDrawer from './useDrawer.vue';
  23 + import { useModal } from '/@/components/Modal';
  24 + import CatNoticeModal from './CatNoticeModal.vue';
25 25 import { columns, searchFormSchema } from './config.d';
26 26 import { notifyMyGetrPageApi } from '/@/api/stationnotification/stationnotifyApi';
27 27 export default defineComponent({
28 28 name: 'LoginForm',
29   - components: { BasicTable, NotifyDetailDrawer, TableAction },
  29 + components: { BasicTable, CatNoticeModal, TableAction },
30 30 setup() {
31   - const [registerDrawer, { openDrawer }] = useDrawer();
  31 + const [registerModal, { openModal }] = useModal();
32 32 const [registerTable, { reload }] = useTable({
33 33 api: notifyMyGetrPageApi,
34 34 columns,
... ... @@ -50,7 +50,7 @@
50 50 });
51 51
52 52 function handleView(record: Recordable) {
53   - openDrawer(true, {
  53 + openModal(true, {
54 54 record,
55 55 });
56 56 }
... ... @@ -60,7 +60,7 @@
60 60 }
61 61 return {
62 62 registerTable,
63   - registerDrawer,
  63 + registerModal,
64 64 handleView,
65 65 handleSuccess,
66 66 };
... ...
1   -<template>
2   - <div>
3   - <BasicDrawer
4   - v-bind="$attrs"
5   - @register="registerDrawer"
6   - :showFooter="false"
7   - title="通知详情"
8   - width="70%"
9   - @close="handleClose"
10   - >
11   - <div v-html="DescInfo?.content"></div>
12   - <Description @register="registerDesc" />
13   - </BasicDrawer>
14   - </div>
15   -</template>
16   -<script lang="ts">
17   - import { defineComponent, ref } from 'vue';
18   - import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
19   - import { Description, useDescription } from '/@/components/Description/index';
20   - import { DescDetailSchema } from './config.d';
21   - import {
22   - noticeByIdGetInfo,
23   - notifyMyGetDetailApi,
24   - } from '/@/api/stationnotification/stationnotifyApi';
25   - export default defineComponent({
26   - name: 'MyNoticeDrawer',
27   - components: { BasicDrawer, Description },
28   - emits: ['success', 'register'],
29   - setup(_, { emit }) {
30   - const dataSource = ref();
31   - let DescInfo = ref();
32   - const [registerDrawer] = useDrawerInner(async (data) => {
33   - dataSource.value = data.record;
34   - const id = data.record.noticeId;
35   - let getDescInfo = await noticeByIdGetInfo(id);
36   - DescInfo.value = getDescInfo;
37   - });
38   - const [registerDesc] = useDescription({
39   - bordered: false,
40   - schema: DescDetailSchema,
41   - data: dataSource,
42   - });
43   - const handleClose = async () => {
44   - await notifyMyGetDetailApi(dataSource.value.id);
45   - emit('success');
46   - };
47   - return {
48   - DescInfo,
49   - registerDesc,
50   - registerDrawer,
51   - handleClose,
52   - };
53   - },
54   - });
55   -</script>
1 1 <template>
2 2 <div>
3   - <BasicTable
4   - :rowSelection="{ type: 'checkbox' }"
5   - @selection-change="useSelectionChange"
6   - @register="registerTable"
7   - >
  3 + <BasicTable @register="registerTable">
8 4 <template #toolbar>
9 5 <a-button type="primary" @click="handleAdd"> 新增 </a-button>
10   - <a-button color="error" @click="handleToolbarDel"> 删除 </a-button>
  6 + <a-button color="error" @click="handleToolbarDel" :disabled="hasBatchDelete">
  7 + 批量删除
  8 + </a-button>
11 9 </template>
12 10 <template #action="{ record }">
13 11 <TableAction
... ... @@ -46,7 +44,7 @@
46 44 </div>
47 45 </template>
48 46 <script lang="ts">
49   - import { defineComponent, reactive } from 'vue';
  47 + import { defineComponent, computed, unref, ref } from 'vue';
50 48 import { BasicTable, useTable, TableAction } from '/@/components/Table';
51 49 import { useDrawer } from '/@/components/Drawer';
52 50 import NotifyManagerDrawer from './useDrawer.vue';
... ... @@ -56,15 +54,27 @@
56 54 import { notifyGetTableApi, notifyDeleteApi } from '/@/api/stationnotification/stationnotifyApi';
57 55
58 56 export default defineComponent({
59   - name: 'Index',
  57 + name: 'Notificationmannager',
60 58 components: { BasicTable, NotifyManagerDrawer, TableAction, tableViewChild },
61 59 setup() {
62   - let selectedRowKeys = reactive<string[]>([]);
63   -
64 60 const [registerDrawer, { openDrawer }] = useDrawer();
65 61 const [registerAdd, { openDrawer: openDrawerAdd }] = useDrawer();
66 62 const { createMessage } = useMessage();
67   - const [registerTable, { reload, getSelectRowKeys }] = useTable({
  63 + // 批量删除
  64 + const selectedRowIds = ref<string[]>([]);
  65 + const hasBatchDelete = computed(() => unref(selectedRowIds).length <= 0);
  66 + const onSelectRowChange = (selectedRowKeys: string[]) => {
  67 + selectedRowIds.value = selectedRowKeys;
  68 + console.log(selectedRowKeys);
  69 + };
  70 + async function handleToolbarDel() {
  71 + await notifyDeleteApi(selectedRowIds.value);
  72 + createMessage.success('批量删除成功');
  73 + selectedRowIds.value = [];
  74 + reload();
  75 + }
  76 +
  77 + const [registerTable, { reload }] = useTable({
68 78 clickToRowSelect: false,
69 79 api: notifyGetTableApi,
70 80 columns,
... ... @@ -72,6 +82,10 @@
72 82 labelWidth: 120,
73 83 schemas: searchFormSchema,
74 84 },
  85 + rowSelection: {
  86 + onChange: onSelectRowChange,
  87 + type: 'checkbox',
  88 + },
75 89 rowKey: 'id',
76 90 useSearchForm: true,
77 91 showTableSetting: true,
... ... @@ -92,15 +106,6 @@
92 106 });
93 107 }
94 108
95   - const useSelectionChange = () => {
96   - selectedRowKeys = getSelectRowKeys();
97   - };
98   -
99   - async function handleToolbarDel() {
100   - await notifyDeleteApi(selectedRowKeys);
101   - createMessage.success('删除成功');
102   - reload();
103   - }
104 109 const handleView = (record: Recordable) => {
105 110 openDrawer(true, {
106 111 record,
... ... @@ -122,9 +127,9 @@
122 127 reload();
123 128 }
124 129 return {
  130 + hasBatchDelete,
125 131 handleView,
126 132 registerAdd,
127   - useSelectionChange,
128 133 registerTable,
129 134 registerDrawer,
130 135 handleAdd,
... ... @@ -132,6 +137,7 @@
132 137 handleEdit,
133 138 handleDelete,
134 139 handleSuccess,
  140 + onSelectRowChange,
135 141 };
136 142 },
137 143 });
... ...
... ... @@ -37,22 +37,22 @@
37 37 label: '发送者',
38 38 },
39 39 {
40   - field: 'senderDate',
41   - label: '发送时间',
42   - },
43   - {
44 40 field: 'type',
45 41 label: '类型:',
46   - render: (_, data) => {
47   - return data.type === 'NOTICE'
  42 + render: (_, { type }) => {
  43 + return type === 'NOTICE'
48 44 ? '公告'
49   - : data.type === 'MEETING'
  45 + : type === 'MEETING'
50 46 ? '会议'
51   - : data.type === 'OTHER'
  47 + : type === 'OTHER'
52 48 ? '其他'
53 49 : '';
54 50 },
55 51 },
  52 + {
  53 + field: 'senderDate',
  54 + label: '发送时间',
  55 + },
56 56 ];
57 57 export default defineComponent({
58 58 name: 'ConfigDrawer',
... ...
... ... @@ -90,7 +90,7 @@
90 90
91 91 const formData = reactive({
92 92 account: 'sysadmin',
93   - password: 'password',
  93 + password: 'Sysadmin@123',
94 94 });
95 95
96 96 const { validForm } = useFormValid(formRef);
... ...