UNIVPLMDataIntegration/Web/src/views/home/notice/index.vue

192 lines
7.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="notice-container">
<el-card shadow="hover" :body-style="{ padding: '5px 5px 0 5px', display: 'flex', width: '100%', height: '100%', alignItems: 'start' }">
<el-form :model="state.queryParams" ref="queryForm" :show-message="false" :inlineMessage="true" label-width="auto" style="flex: 1 1 0%">
<el-row :gutter="10">
<el-col class="mb5" :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
<el-form-item label="标题" prop="title">
<el-input v-model="state.queryParams.title" placeholder="标题" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col class="mb5" :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
<el-form-item label="类型" prop="type">
<el-select v-model="state.queryParams.type" placeholder="类型" clearable @clear="state.queryParams.type = undefined">
<el-option label="通知" :value="1" />
<el-option label="公告" :value="2" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-divider style="height: calc(100% - 5px); margin: 0 10px" direction="vertical" />
<el-row>
<el-col>
<el-button-group>
<el-button type="primary" icon="ele-Search" @click="handleQuery" :loading="options.loading"> 查询 </el-button>
<el-button icon="ele-Refresh" @click="resetQuery" :loading="options.loading"> 重置 </el-button>
</el-button-group>
</el-col>
</el-row>
</el-card>
<el-card class="full-table" shadow="hover" style="margin-top: 5px">
<vxe-grid ref="xGrid" class="xGrid-style" v-bind="options" v-on="gridEvents" @cell-dblclick="({ row }: any) => handleView(row)">
<template #toolbar_buttons> </template>
<template #toolbar_tools> </template>
<template #empty>
<el-empty :image-size="200" />
</template>
<template #row_type="{ row }">
<el-tag v-if="row.sysNotice.type === 1" type="success">通知</el-tag>
<el-tag v-else type="warning">公告</el-tag>
</template>
<template #row_readStatus="{ row }">
<el-tag v-if="row.readStatus === 1" type="info">已读</el-tag>
<el-tag v-else type="danger">未读</el-tag>
</template>
<template #row_buttons="{ row }">
<el-tooltip content="详情" placement="top">
<el-button icon="ele-InfoFilled" text type="primary" @click="handleView(row)"> </el-button>
</el-tooltip>
</template>
</vxe-grid>
</el-card>
<el-dialog v-model="state.isShowDialog" draggable width="769px">
<template #header>
<div style="color: #fff">
<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Bell /> </el-icon>
<span> 消息详情 </span>
</div>
</template>
<div class="w-e-text-container">
<div v-html="state.content" data-slate-editor></div>
</div>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="state.isShowDialog = false">确认</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script setup lang="ts" name="notice">
import { onMounted, reactive, ref } from 'vue';
import commonFunction from '/@/utils/commonFunction';
import '@wangeditor/editor/dist/css/style.css';
import { VxeGridInstance, VxeGridListeners, VxeGridPropTypes } from 'vxe-table';
import { useVxeTable } from '/@/hooks/useVxeTableOptionsHook';
import { Local } from '/@/utils/storage';
import { getAPI } from '/@/utils/axios-utils';
import { SysNoticeApi } from '/@/api-services/api';
import { SysNoticeUser, PageNoticeInput } from '/@/api-services/models';
const xGrid = ref<VxeGridInstance>();
const { removeHtml } = commonFunction();
const state = reactive({
queryParams: {
title: undefined,
type: undefined,
},
localPageParam: {
pageSize: 50 as number,
defaultSort: { field: 'id', order: 'asc', descStr: 'desc' },
},
isShowDialog: false,
title: '',
content: '',
});
// 本地存储参数
const localPageParamKey = 'localPageParam:sysNoticeUser';
// 表格参数配置
const options = useVxeTable<SysNoticeUser>(
{
id: 'sysNoticeUser',
name: '消息/站内信',
columns: [
// { type: 'checkbox', width: 40, fixed: 'left' },
{ type: 'seq', title: '序号', width: 60, fixed: 'left' },
{ field: 'sysNotice.title', title: '标题', minWidth: 200, showOverflow: 'tooltip' },
{ field: 'sysNotice.content', title: '内容', minWidth: 180, showOverflow: 'tooltip', slots: { default: (scope: any) => removeHtml(scope.row.sysNotice.content) } },
{ field: 'sysNotice.type', title: '类型', minWidth: 100, showOverflow: 'tooltip', slots: { default: 'row_type' } },
{ field: 'sysNotice.createTime', title: '创建时间', minWidth: 150, showOverflow: 'tooltip' },
{ field: 'readStatus', title: '阅读状态', minWidth: 100, showOverflow: 'tooltip', slots: { default: 'row_readStatus' } },
{ field: 'sysNotice.publicUserName', title: '发布者', minWidth: 120, showOverflow: 'tooltip' },
{ field: 'sysNotice.publicTime', title: '发布时间', minWidth: 150, showOverflow: 'tooltip' },
{ title: '操作', fixed: 'right', width: 100, showOverflow: true, slots: { default: 'row_buttons' } },
],
},
// vxeGrid配置参数(此处可覆写任何参数)参考vxe-table官方文档
{
// 代理配置
proxyConfig: { autoLoad: true, ajax: { query: ({ page, sort }) => handleQueryApi(page, sort) } },
// 排序配置
sortConfig: { defaultSort: Local.get(localPageParamKey)?.defaultSort || state.localPageParam.defaultSort },
// 分页配置
pagerConfig: { pageSize: Local.get(localPageParamKey)?.pageSize || state.localPageParam.pageSize },
// 工具栏配置
toolbarConfig: { export: false },
}
);
// 页面初始化
onMounted(() => {
state.localPageParam = Local.get(localPageParamKey) || state.localPageParam;
});
// 查询api
const handleQueryApi = async (page: VxeGridPropTypes.ProxyAjaxQueryPageParams, sort: VxeGridPropTypes.ProxyAjaxQuerySortCheckedParams) => {
const params = Object.assign(state.queryParams, { page: page.currentPage, pageSize: page.pageSize, field: sort.field, order: sort.order, descStr: 'desc' }) as PageNoticeInput;
return getAPI(SysNoticeApi).apiSysNoticePageReceivedPost(params);
};
// 查询操作
const handleQuery = async () => {
// 调用vxe-grid的commitProxy(query)方法,触发表格重新加载数据
options.loading = true;
await xGrid.value?.commitProxy('query');
options.loading = false;
};
// 重置操作
const resetQuery = async () => {
state.queryParams.title = undefined;
state.queryParams.type = undefined;
await xGrid.value?.commitProxy('reload');
};
// 查看详情
const handleView = async (row: any) => {
state.content = row.sysNotice.content;
state.isShowDialog = true;
row.readStatus = 1;
// mittBus.emit('noticeRead', row.sysNotice.id);
await getAPI(SysNoticeApi).apiSysNoticeSetReadPost({ id: row.sysNotice.id });
};
// 表格事件
const gridEvents: VxeGridListeners<PagePosOutput> = {
// 只对 pager-config 配置时有效,分页发生改变时会触发该事件
async pageChange({ pageSize }) {
state.localPageParam.pageSize = pageSize;
Local.set(localPageParamKey, state.localPageParam);
},
// 当排序条件发生变化时会触发该事件
async sortChange({ field, order }) {
state.localPageParam.defaultSort = { field: field, order: order!, descStr: 'desc' };
Local.set(localPageParamKey, state.localPageParam);
},
};
</script>
<style lang="scss" scoped>
:deep(.el-dialog__body) {
min-height: 600px;
}
</style>