From 6f08eda851fe502699b3910bee6a30013bb58fa2 Mon Sep 17 00:00:00 2001 From: Kven <2955163637@qq.com> Date: Thu, 26 Dec 2024 10:36:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=B6=88=E6=81=AF=E6=A8=A1=E5=9D=97):=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B6=88=E6=81=AF=E7=9A=84=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E5=8F=8A=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.新增消息的头部展示 2.新增消息管理的增删改查功能 3.新增用户消息的查看 --- src/api/message-mgmt.ts | 52 ++ src/api/messages.ts | 82 +++ src/components/dynamic-form/index.vue | 601 ++++++++++++++++++ src/components/menu/index.vue | 31 +- src/components/message-box/index.vue | 67 +- src/components/message-box/list.vue | 46 +- src/store/index.ts | 12 +- src/store/modules/message-mgmt/index.ts | 52 ++ src/store/modules/message-mgmt/type.ts | 8 + src/store/modules/messages/index.ts | 49 ++ src/store/modules/messages/type.ts | 35 + .../message/components/message-edit.vue | 467 ++++++++++++++ src/views/system/message/index.vue | 360 +++++++++++ src/views/user/messages/index.vue | 279 ++++++++ 14 files changed, 2065 insertions(+), 76 deletions(-) create mode 100644 src/api/message-mgmt.ts create mode 100644 src/api/messages.ts create mode 100644 src/components/dynamic-form/index.vue create mode 100644 src/store/modules/message-mgmt/index.ts create mode 100644 src/store/modules/message-mgmt/type.ts create mode 100644 src/store/modules/messages/index.ts create mode 100644 src/store/modules/messages/type.ts create mode 100644 src/views/system/message/components/message-edit.vue create mode 100644 src/views/system/message/index.vue create mode 100644 src/views/user/messages/index.vue diff --git a/src/api/message-mgmt.ts b/src/api/message-mgmt.ts new file mode 100644 index 0000000..b9e65f0 --- /dev/null +++ b/src/api/message-mgmt.ts @@ -0,0 +1,52 @@ +import axios from 'axios'; + +export interface MessageRecord { + userId?: string; + title?: string; + type?: string; + name?: string; + system?: boolean; + isRead?: boolean; + createAtBegin?: string; + createAtEnd?: string; + current: number; + size: number; +} + +export interface MessageCreateRecord { + userId: string[]; + type: string; + email: string; + sms: string; + html: string; + title: string; + content: string; + attachmentIds?: string[]; +} + + + +// 查看详情 +export function queryMessage(userId: number, messageId: number) { + return axios.get(`/api/rest/message/${userId}/${messageId}`); +} +// 分页查询 +export function queryMessageList(data: MessageRecord) { + return axios({ + url: '/api/rest/message', + method: 'get', + params: data, + }); +} +// 创建消息 +export function createMessage(data: MessageCreateRecord) { + return axios.post('/api/rest/message', data); +} +// 获取消息推送方式 +export function getMessageTypes() { + return axios.get('/api/rest/message/setting'); +} +// 设置消息推送方式 +export function setMessageTypes(data: string[]) { + return axios.patch('/api/rest/message/setting', data); +} \ No newline at end of file diff --git a/src/api/messages.ts b/src/api/messages.ts new file mode 100644 index 0000000..5081bbd --- /dev/null +++ b/src/api/messages.ts @@ -0,0 +1,82 @@ +import axios from 'axios'; + +export interface Attachment { + id: string; + fileName: string; + mimeType: string; + uploadTime: string; + url: string; +} + +export interface MessagesList { + id?: number; + userId?: number | null; + user?: string | null; + messageId?: number | null; + message?: string | null; + isRead?: boolean | null; + readTime?: string | null; + username?: string | null; + name?: string | null; + avatar?: string | null; + address?: string | null; + type?: string; + system?: boolean; + email?: boolean; + sms?: boolean; + html?: boolean; + title?: string; + content?: string; + remark?: string; + createTime?: string; + createBy?: string; + updateTime?: string; + updateBy?: string; + attachments?: Attachment[]; +} + +export interface MessagesRecord { + userId?: string; + title?: string; + type?: string; + name?: string; + system?: number[]; + isRead?: boolean; + createAtBegin?: string; + createAtEnd?: string; + current: number; + size: number; +} + +export interface MessageStatus { + ids: string[]; +} + +export type MessageListType = MessagesList[]; + +// 查看详情 +export function queryMessage(id: number) { + return axios.get(`/api/rest/message/self/${id}`); +} +// 分页查询 +export function queryMessagesList(data: MessagesRecord) { + return axios({ + url: '/api/rest/message/self', + method: 'get', + params: data, + }); +} +// 未读消息数量 +export function queryMessagesCount() { + return axios.get('/api/rest/message/count-unread'); +} + +// 已读消息数量 +export function queryMessagesReadCount() { + return axios.get('/api/rest/message/acknowledge'); +} + +// 批量设置消息已读 +export function setMessageStatus(data: MessageStatus) { + return axios.patch('/api/rest/message/read', data); +} \ No newline at end of file diff --git a/src/components/dynamic-form/index.vue b/src/components/dynamic-form/index.vue new file mode 100644 index 0000000..2318f07 --- /dev/null +++ b/src/components/dynamic-form/index.vue @@ -0,0 +1,601 @@ + + + + + diff --git a/src/components/menu/index.vue b/src/components/menu/index.vue index 0702897..e61e9a6 100644 --- a/src/components/menu/index.vue +++ b/src/components/menu/index.vue @@ -39,7 +39,7 @@ } // Eliminate external link side effects const { hideInMenu, activeMenu } = item.meta as RouteMeta; - if (route.name === item.name && !hideInMenu && !activeMenu) { + if (route.name === item.name &&!hideInMenu &&!activeMenu) { selectedKey.value = [item.name as string]; return; } @@ -48,6 +48,7 @@ name: item.name, }); }; + const findMenuOpenKeys = (target: string) => { const result: string[] = []; let isFind = false; @@ -69,6 +70,7 @@ }); return result; }; + listenerRouteChange((newRoute) => { const { requiresAuth, activeMenu, hideInMenu } = newRoute.meta; if (requiresAuth && (!hideInMenu || activeMenu)) { @@ -76,7 +78,7 @@ (activeMenu || newRoute.name) as string ); - const keySet = new Set([...menuOpenKeys, ...openKeys.value]); + const keySet = new Set([...menuOpenKeys,...openKeys.value]); openKeys.value = [...keySet]; selectedKey.value = [ @@ -84,6 +86,7 @@ ]; } }, true); + const setCollapse = (val: boolean) => { if (appStore.device === 'desktop') appStore.updateSettings({ menuCollapse: val }); @@ -106,7 +109,7 @@ title: () => h(compile(t(element?.meta?.locale || ''))), }} > - {travel(element?.children)} + {travel(element?.children, [])} ) : ( goto(element)} > - {t(element?.meta?.locale || '')} + {element?.meta?.title} ); - nodes.push(node as never); + const meta = element.meta as RouteMeta; + if (meta.showInMenu!== false) { + nodes.push(node as never); + } }); } return nodes; } + return travel(menuTree.value); }; @@ -144,17 +151,3 @@ }, }); - - diff --git a/src/components/message-box/index.vue b/src/components/message-box/index.vue index e739d37..49b2f33 100644 --- a/src/components/message-box/index.vue +++ b/src/components/message-box/index.vue @@ -15,8 +15,11 @@ /> @@ -25,14 +28,10 @@ diff --git a/src/components/message-box/list.vue b/src/components/message-box/list.vue index b0c6488..d9a9389 100644 --- a/src/components/message-box/list.vue +++ b/src/components/message-box/list.vue @@ -25,9 +25,9 @@ - + + + + + + + + + + + + + +
import { PropType } from 'vue'; import { MessageRecord, MessageListType } from '@/api/message'; + import dayjs from 'dayjs'; const props = defineProps({ renderList: { @@ -85,9 +85,9 @@ }, }); const emit = defineEmits(['itemClick']); - const allRead = () => { - emit('itemClick', [...props.renderList]); - }; + // const allRead = () => { + // emit('itemClick', [...props.renderList]); + // }; const onItemClick = (item: MessageRecord) => { if (!item.status) { diff --git a/src/store/index.ts b/src/store/index.ts index 9be82dc..04bf168 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -5,8 +5,11 @@ import useUserStore from './modules/user'; import useTabBarStore from './modules/tab-bar'; import useRoleStore from './modules/role'; import useDeptStore from './modules/dept'; -import useTicketStore from './modules/ticket'; import useAuthStore from './modules/auth'; +import useBulletinsStore from './modules/bulletins'; +import useBulletinStore from './modules/bulle-mgmt'; +import useMessagesStore from './modules/messages'; +import useMessageStore from './modules/message-mgmt'; const pinia = createPinia(); pinia.use(piniaPluginPersistedstate); @@ -15,9 +18,12 @@ export { useAppStore, useUserStore, useTabBarStore, - useDeptStore, useRoleStore, - useTicketStore, + useDeptStore, useAuthStore, + useBulletinsStore, + useBulletinStore, + useMessagesStore, + useMessageStore, }; export default pinia; diff --git a/src/store/modules/message-mgmt/index.ts b/src/store/modules/message-mgmt/index.ts new file mode 100644 index 0000000..845ec1b --- /dev/null +++ b/src/store/modules/message-mgmt/index.ts @@ -0,0 +1,52 @@ +import { defineStore } from 'pinia'; +import { + MessageRecord, + MessageCreateRecord, + queryMessage, + queryMessageList, + createMessage, + getMessageTypes, + setMessageTypes, +} from '@/api/message-mgmt'; +import { messageStore } from '@/store/modules/message-mgmt/type'; + +const useMessageStore = defineStore('dept', { + state: ():messageStore => ({ + remark: undefined, + title: undefined, + top: undefined, + content: undefined, + attachmentIds: undefined, + }), + + getters: { + MessageInfo(state: messageStore): messageStore { + return { ...state }; + }, + }, + actions: { + async queryMessage(userId: number, messageId: number) { + return queryMessage(userId, messageId); + }, + + async queryMessageList(params: MessageRecord) { + return queryMessageList(params); + }, + + async createMessage(params: MessageCreateRecord) { + return createMessage(params); + }, + + async getMessageTypes() { + return getMessageTypes(); + }, + + async setMessageTypes(params: string[]) { + return setMessageTypes(params); + }, + + + }, +}); + +export default useMessageStore; \ No newline at end of file diff --git a/src/store/modules/message-mgmt/type.ts b/src/store/modules/message-mgmt/type.ts new file mode 100644 index 0000000..9332b84 --- /dev/null +++ b/src/store/modules/message-mgmt/type.ts @@ -0,0 +1,8 @@ +// export type bulletinsType = '' | '*' | 'admin' | 'user' | string[]; +export interface messageStore { + title?: string; + top?: string[]; + content?: string; + remark?: string; + attachmentIds?: string[]; +} \ No newline at end of file diff --git a/src/store/modules/messages/index.ts b/src/store/modules/messages/index.ts new file mode 100644 index 0000000..fe8bd11 --- /dev/null +++ b/src/store/modules/messages/index.ts @@ -0,0 +1,49 @@ +import { defineStore } from 'pinia'; +import { + MessagesRecord, + MessageStatus, + queryMessage, + queryMessagesList, + queryMessagesCount, + queryMessagesReadCount, + setMessageStatus, +} from '@/api/messages'; +import { messagesStore } from '@/store/modules/messages/type'; + +const useMessagesStore = defineStore('dept', { + state: ():messagesStore => ({ + remark: undefined, + title: undefined, + content: undefined, + attachments: undefined, + }), + + getters: { + MessagesInfo(state: messagesStore): messagesStore { + return { ...state }; + }, + }, + actions: { + async queryMessage(id: number){ + return queryMessage(id); + }, + + async queryMessagesList(data: MessagesRecord) { + return queryMessagesList(data); + }, + + async queryMessagesCount() { + return queryMessagesCount(); + }, + + async queryMessagesReadCount() { + return queryMessagesReadCount(); + }, + + async setMessageStatus(data: MessageStatus) { + return setMessageStatus(data); + }, + + }, +}); +export default useMessagesStore; \ No newline at end of file diff --git a/src/store/modules/messages/type.ts b/src/store/modules/messages/type.ts new file mode 100644 index 0000000..db38ab8 --- /dev/null +++ b/src/store/modules/messages/type.ts @@ -0,0 +1,35 @@ +// export type bulletinsType = '' | '*' | 'admin' | 'user' | string[]; +export interface Attachment { + id: string; + fileName: string; + mimeType: string; + uploadTime: string; + url: string; +} + +export interface messagesStore { + id?: number; + userId?: number | null; + user?: string | null; + messageId?: number | null; + message?: string | null; + isRead?: boolean | null; + readTime?: string | null; + username?: string | null; + name?: string | null; + avatar?: string | null; + address?: string | null; + type?: string; + system?: boolean; + email?: boolean; + sms?: boolean; + html?: boolean; + title?: string; + content?: string; + remark?: string; + createTime?: string; + createBy?: string; + updateTime?: string; + updateBy?: string; + attachments?: Attachment[]; +} diff --git a/src/views/system/message/components/message-edit.vue b/src/views/system/message/components/message-edit.vue new file mode 100644 index 0000000..e2a1867 --- /dev/null +++ b/src/views/system/message/components/message-edit.vue @@ -0,0 +1,467 @@ + + + + + diff --git a/src/views/system/message/index.vue b/src/views/system/message/index.vue new file mode 100644 index 0000000..d21075b --- /dev/null +++ b/src/views/system/message/index.vue @@ -0,0 +1,360 @@ + + + + + + \ No newline at end of file diff --git a/src/views/user/messages/index.vue b/src/views/user/messages/index.vue new file mode 100644 index 0000000..9671c5d --- /dev/null +++ b/src/views/user/messages/index.vue @@ -0,0 +1,279 @@ + + + + + \ No newline at end of file