通知公告更改

dev
Yunfei Du 2024-04-14 16:53:28 +08:00
parent 60c56e3ea7
commit 9f27722319
5 changed files with 405 additions and 9 deletions

View File

@ -9,6 +9,29 @@ export function listNotice(query) {
}) })
} }
export function updateAsUserDept(id) {
return request({
url: '/system/userDept/UpdateAsUserDept?id=' + id,
method: 'get'
})
}
export function getNum(id) {
return request({
url: '/system/userDept/GetNum?noticeId=' + id,
method: 'get'
})
}
export function getNoticeList(data) {
return request({
url: '/system/notice/GetNoticeList',
method: 'post',
data
})
}
// 查询公告详细 // 查询公告详细
export function getNotice(noticeId) { export function getNotice(noticeId) {
return request({ return request({
@ -42,3 +65,7 @@ export function delNotice(noticeId) {
method: 'delete' method: 'delete'
}) })
} }

View File

@ -8,6 +8,7 @@
<div class="right-menu"> <div class="right-menu">
<template v-if="device!=='mobile'"> <template v-if="device!=='mobile'">
<i class="el-icon-message-solid" @click="noticeTableList"></i>
<search id="header-search" class="right-menu-item"/> <search id="header-search" class="right-menu-item"/>
<screenfull id="screenfull" class="right-menu-item hover-effect"/> <screenfull id="screenfull" class="right-menu-item hover-effect"/>
@ -35,6 +36,80 @@
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</div> </div>
<el-dialog
title="公告"
:visible.sync="noticeTableVisible"
width="50%">
<el-radio-group v-model="form.noticeType" @change="getNoticeList">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button label="1">通知</el-radio-button>
<el-radio-button label="2">公告</el-radio-button>
</el-radio-group>
<br> <br>
<el-radio-group v-model="form.isRead" @change="getNoticeList">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button label="0">已读</el-radio-button>
<el-radio-button label="1">未读</el-radio-button>
</el-radio-group>
<br><br><br>
<el-card class="box-card" v-for="notice in noticeAttr">
<!-- <div slot="header" class="clearfix">-->
<!-- <span>卡片名称</span>-->
<!-- <el-button style="float: right"> </el-button>-->
<!-- </div>-->
<!-- <div v-for="o in 4" :key="o" class="text item">-->
<!-- {{'列表内容 ' + o }}-->
<!-- </div>-->
<el-descriptions class="margin-top" :title="notice.noticeTitle" :column="2" :size="'medium'" border>
<template slot="extra">
<el-button size="small" @click="readNotice(notice)"></el-button>
</template>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-user"></i>
消息发布时间
</template>
{{notice.createTime}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-user"></i>
消息发布人
</template>
{{notice.createBy}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-tickets"></i>
消息类型
</template>
<dict-tag :options="dict.type.sys_notice_type" :value="notice.noticeType"/>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-office-building"></i>
消息当前状态
</template>
<dict-tag :options="dict.type.is_read" :value="notice.isRead"/>
</el-descriptions-item>
</el-descriptions>
</el-card>
<span slot="footer" class="dialog-footer">
<el-button @click="noticeTableVisible = false"> </el-button>
<el-button type="primary" @click="noticeTableVisible = false"> </el-button>
</span>
</el-dialog>
<el-dialog
:title="noticeInfo.noticeTitle"
:visible.sync="noticeVisble"
width="30%">
<editor v-model="noticeInfo.noticeContent" :min-height="192"/>
<span slot="footer" class="dialog-footer">
<el-button @click="noticeVisble = false"> </el-button>
<el-button type="primary" @click="noticeVisble = false"> </el-button>
</span>
</el-dialog>
</div> </div>
</template> </template>
@ -46,8 +121,51 @@ import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull' import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect' import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch' import Search from '@/components/HeaderSearch'
import { getNoticeList, updateAsUserDept } from '@/api/system/notice'
export default { export default {
dicts: ['is_read', 'sys_notice_type'],
data() {
return {
noticeVisble: false,
noticeInfo: {},
noticeAttr: [
{
createTime: '',
createBy: 'admin',
noticeType: '1',
isRead: '1',
noticeTitle: '哈哈',
noticeContent: '嘻嘻嘻嘻嘻',
noticeId: 1,
},
{
createTime: '',
createBy: 'admin',
noticeType: '2',
isRead: '0',
noticeTitle: '哈撒大大哈',
noticeContent: '嘻嘻嘻嘻阿尽快嘻',
noticeId: 2,
},
{
createTime: '',
createBy: 'admin',
noticeType: '1',
isRead: '0',
noticeTitle: '哈哈是',
noticeContent: '嘻嘻嘻萨达嘻嘻',
noticeId: 3,
}
],
form: {
noticeType: '',
isRead: ''
},
messageTotal: undefined,
noticeTableVisible: false
}
},
components: { components: {
Breadcrumb, Breadcrumb,
TopNav, TopNav,
@ -80,6 +198,23 @@ export default {
} }
}, },
methods: { methods: {
getNoticeList() {
getNoticeList(this.form).then(res => {
console.log(res)
this.noticeAttr = res.data
})
},
readNotice(row) {
this.noticeInfo = row
this.noticeVisble = true
updateAsUserDept(row.id).then(res => {
this.getNoticeList()
})
},
noticeTableList() {
this.getNoticeList()
this.noticeTableVisible = true
},
toggleSideBar() { toggleSideBar() {
this.$store.dispatch('app/toggleSideBar') this.$store.dispatch('app/toggleSideBar')
}, },

View File

@ -1,5 +1,6 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="68px" size="small"> <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="68px" size="small">
<el-form-item label="公告标题" prop="noticeTitle"> <el-form-item label="公告标题" prop="noticeTitle">
<el-input <el-input
@ -86,6 +87,7 @@
<dict-tag :options="dict.type.sys_notice_type" :value="scope.row.noticeType"/> <dict-tag :options="dict.type.sys_notice_type" :value="scope.row.noticeType"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="状态" prop="status" width="100"> <el-table-column align="center" label="状态" prop="status" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<dict-tag :options="dict.type.sys_notice_status" :value="scope.row.status"/> <dict-tag :options="dict.type.sys_notice_status" :value="scope.row.status"/>
@ -99,6 +101,14 @@
</el-table-column> </el-table-column>
<el-table-column align="center" class-name="small-padding fixed-width" label="操作"> <el-table-column align="center" class-name="small-padding fixed-width" label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button
v-hasPermi="['system:notice:edit']"
icon="el-icon-edit"
size="mini"
type="text"
@click="noticeDetails(scope.row.noticeId)"
>通知详情
</el-button>
<el-button <el-button
v-hasPermi="['system:notice:edit']" v-hasPermi="['system:notice:edit']"
icon="el-icon-edit" icon="el-icon-edit"
@ -119,6 +129,7 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination <pagination
v-show="total>0" v-show="total>0"
:limit.sync="queryParams.pageSize" :limit.sync="queryParams.pageSize"
@ -148,7 +159,17 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col v-show="form.noticeType == 2">
<span style="margin-right: 15px;margin-left: 10px"><b>公告时间</b></span>
<el-date-picker
v-model="form.time"
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
</el-date-picker>
</el-col>
<el-col :span="12">
<el-form-item label="状态"> <el-form-item label="状态">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio <el-radio
@ -160,6 +181,21 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<div v-if="form.noticeType==2">
<el-form-item label="创建时间">
<el-date-picker
v-model="form.dateRange"
end-placeholder="结束日期"
range-separator="-"
start-placeholder="开始日期"
style="width: 240px"
type="daterange"
value-format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
</div>
</el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="内容"> <el-form-item label="内容">
<editor v-model="form.noticeContent" :min-height="192"/> <editor v-model="form.noticeContent" :min-height="192"/>
@ -167,22 +203,136 @@
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<template>
<div v-if="form.noticeType==1">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="部门" name="first" @click="handleClick1">
{{form.checkedDept}}
<el-tree
:data="partDate"
show-checkbox
node-key="id"
:default-expanded-keys="[2, 3]"
:default-checked-keys="[5]"
@check-change="handleCheckChange"
>
</el-tree>
</el-tab-pane>
<el-tab-pane label="特定人员" name="second">
{{form.ids}}
<el-select v-model="form.ids" multiple placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-tab-pane>
</el-tabs>
</div>
</template>
</el-dialog>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button> <el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button> <el-button @click="cancel"> </el-button>
</div> </div>
</el-dialog>
<el-dialog title="通知详细" :visible.sync="dialogTableVisible " width="40%">
<el-row :gutter="20">
<el-col :span="6">
<div>
<el-statistic
:value="asUserDeptNum.num"
title="总共通知数量"
></el-statistic>
</div>
</el-col>
<el-col :span="6">
<div>
<el-statistic
:value="asUserDeptNum.readNum"
title="已阅读通知数量"
></el-statistic>
</div>
</el-col>
<el-col :span="6">
<div>
<el-statistic
:value="asUserDeptNum.noReadNum"
title="未阅读通知数量"
></el-statistic>
</div>
</el-col>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogTableVisible = false"> </el-button>
<el-button type="primary" @click="dialogTableVisible = false"> </el-button>
</span>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import {addNotice, delNotice, getNotice, listNotice, updateNotice} from "@/api/system/notice"; import { addNotice, delNotice, getNotice, getNum, listNotice, updateNotice } from '@/api/system/notice'
import { listDept } from '@/api/system/dept'
import { listUser } from '@/api/system/user'
export default { export default {
name: "Notice", name: "Notice",
dicts: ['sys_notice_status', 'sys_notice_type'], dicts: ['sys_notice_status', 'sys_notice_type'],
data() { data() {
return { return {
asUserDeptNum: {},
dialogTableVisible : false,
options: [],
value:'',
partDate:[],
// partDate: [{
// id: 1,
// label: ' 2',
// children: [{
// id: 3,
// label: ' 2-1',
// children: [{
// id: 4,
// label: ' 3-1-1'
// }, {
// id: 5,
// label: ' 3-1-2',
// // disabled: true
// }]
// }, {
// id: 2,
// label: ' 2-2',
// disabled: true,
// children: [{
// id: 6,
// label: ' 3-2-1'
// }, {
// id: 7,
// label: ' 3-2-2',
// // disabled: true
// }]
// }]
// }],
defaultProps: {
children: 'children',
label: 'label'
},
activeName: 'second',
// //
loading: true, loading: true,
// //
@ -210,7 +360,11 @@ export default {
status: undefined status: undefined
}, },
// //
form: {}, form: {
dateRange:[],
checkedDept:[],
ids:[],
},
// //
rules: { rules: {
noticeTitle: [ noticeTitle: [
@ -224,8 +378,74 @@ export default {
}, },
created() { created() {
this.getList(); this.getList();
this.listDeptTree();
}, },
methods: { methods: {
noticeDetails(noticeId){
this.dialogTableVisible= true
getNum(noticeId).then(response=>{
this.asUserDeptNum= response.data
})
},
handleCheckChange(data,checked,node){
// console.log(data,checked,node)
if(checked && data.children==null){
console.log(data)
this.form.checkedDept.push(data.id)
}
},
handleClick1(val){
console.log(val)
},
listDeptTree(){
listUser().then(response=>{
console.log(response)
response.data.rows.forEach(
item =>{
if (item.userName){
this.options.push({"value":item.userId,"label":item.userName})
}
}
)
})
listDept().then(response => {
console.log(response)
const treeData = this.handleTree(response.data, "deptId");
// deptIddeptNameidlabelchildren
const convertedTreeData = this.convertDeptTree(treeData);
this.partDate = convertedTreeData;
console.log(this.partDate);
}).catch(error => {
//
console.error('Error fetching department list:', error);
});
},
convertDeptTree(deptList) {
console.log(deptList)
return deptList.map(item => {
const { deptId, deptName, children } = item;
return {
id: deptId,
label: deptName,
// leader:leader,
// children
children: children ? this.convertDeptTree(children) : undefined
};
});
},
handleClick(tab, event) {
console.log(tab, event);
},
/** 查询公告列表 */ /** 查询公告列表 */
getList() { getList() {
this.loading = true; this.loading = true;
@ -234,6 +454,7 @@ export default {
this.total = response.data.total; this.total = response.data.total;
this.loading = false; this.loading = false;
}); });
this.form.checkedDept=[]
}, },
// //
cancel() { cancel() {
@ -247,7 +468,11 @@ export default {
noticeTitle: undefined, noticeTitle: undefined,
noticeType: undefined, noticeType: undefined,
noticeContent: undefined, noticeContent: undefined,
status: "0" status: "0",
dateRange:[],
checkedDept:[],
ids:[],
}; };
this.resetForm("form"); this.resetForm("form");
}, },
@ -286,6 +511,9 @@ export default {
/** 提交按钮 */ /** 提交按钮 */
submitForm: function () { submitForm: function () {
this.$refs["form"].validate(valid => { this.$refs["form"].validate(valid => {
console.log(this.form)
if (valid) { if (valid) {
if (this.form.noticeId != undefined) { if (this.form.noticeId != undefined) {
updateNotice(this.form).then(response => { updateNotice(this.form).then(response => {

View File

@ -182,6 +182,9 @@ export default {
submitForm() { submitForm() {
const basicForm = this.$refs.basicInfo.$refs.basicInfoForm; const basicForm = this.$refs.basicInfo.$refs.basicInfoForm;
const genForm = this.$refs.genInfo.$refs.genInfoForm; const genForm = this.$refs.genInfo.$refs.genInfoForm;
console.log(basicForm)
console.log(genForm)
Promise.all([basicForm, genForm].map(this.getFormPromise)).then(res => { Promise.all([basicForm, genForm].map(this.getFormPromise)).then(res => {
const validateResult = res.data.every(item => !!item); const validateResult = res.data.every(item => !!item);
if (validateResult) { if (validateResult) {
@ -195,14 +198,17 @@ export default {
}; };
updateGenTable(genTable).then(res => { updateGenTable(genTable).then(res => {
this.$modal.msgSuccess(res.data.msg); this.$modal.msgSuccess(res.data.msg);
if (res.code === 200) { if (res.data.code === 200) {
this.close(); this.close();
} }
}); });
} else { } else {
this.$modal.msgError("表单校验未通过,请重新检查提交内容"); this.$modal.msgError("表单校验未通过,请重新检查提交内容");
} }
}); })
/* .catch(error=>{
console.log('表单验证过程中发生错误:',error)
}) */
}, },
getFormPromise(form) { getFormPromise(form) {
return new Promise(resolve => { return new Promise(resolve => {

View File

@ -35,7 +35,7 @@ module.exports = {
proxy: { proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy // detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: { [process.env.VUE_APP_BASE_API]: {
target: `http://10.1.123.73:8080`, target: `http://127.0.0.1:8080`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '' ['^' + process.env.VUE_APP_BASE_API]: ''