Files
UNION_NSI/target/classes/views/platform/sys/msg/index.html
T
2026-09-08 19:49:21 +08:00

638 lines
26 KiB
HTML

<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-msg-active {
background-color: #546478;
color: #ffffff;
}
.note {
width: 100%;
height: 320px;
}
</style>
<link href="${base!}/assets/platform/plugins/umeditor/themes/default/css/umeditor.min.css" type="text/css"
rel="stylesheet">
<script src="${base!}/assets/platform/plugins/umeditor/umeditor.config.js"></script>
<script src="${base!}/assets/platform/plugins/umeditor/umeditor.js"></script>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<a :class="{'el-msg-active':'all'==pageForm.searchType}"
class="el-button el-button--default el-button--medium" data-pjax
href="${base}/platform/sys/msg">
全部类型消息
</a>
</div>
<div class="btn-group tool-button mt5">
<a :class="{'el-msg-active':'system'==pageForm.searchType}"
class="el-button el-button--default el-button--medium"
data-pjax
href="${base}/platform/sys/msg/list/system">
系统消息
</a>
</div>
<div class="btn-group tool-button mt5">
<a :class="{'el-msg-active':'user'==pageForm.searchType}"
class="el-button el-button--default el-button--medium"
data-pjax
href="${base}/platform/sys/msg/list/user">
用户消息
</a>
</div>
<div class="pull-right offscreen-right mt5">
<el-button @click="openAdd" size="medium"><i class="ti-plus"></i> 发送消息</el-button>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<el-table
:data="tableData"
:default-sort="{prop: 'createdAt', order: 'descending'}"
@sort-change='pageOrder'
header-align="center"
style="width: 100%"
>
<el-table-column type="expand">
<template slot-scope="scope">
<el-form class="el-table-expand-line" inline label-position="left" size="mini">
<el-form-item label="标题">
<span>{{ scope.row.title }}</span>
</el-form-item>
<el-form-item label="链接">
<span>{{ scope.row.url }}</span>
</el-form-item>
<el-form-item :show-overflow-tooltip="true" label="内容">
<span v-html="scope.row.note"></span>
</el-form-item>
</el-form>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="消息类型"
prop="type" sortable>
<template slot-scope="scope">
<span v-if="'system'==scope.row.type">系统消息</span>
<span v-if="'user'==scope.row.type">用户消息</span>
</template>
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
header-align="center"
label="标题"
prop="title">
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="总接收用户" prop="all_num">
<template slot-scope="scope">
<el-button @click="viewUserList('all',scope.row.id)" size="small">{{scope.row.all_num}}
</el-button>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="未读用户" prop="unread_num">
<template slot-scope="scope">
<el-button @click="viewUserList('unread',scope.row.id)" size="small">{{scope.row.unread_num}}
</el-button>
</template>
</el-table-column>
<el-table-column
header-align="center"
label="发送时间"
prop="createdAt"
sortable>
<template slot-scope="scope">
{{formatAt(scope.row.createdAt)}}
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="消息状态"
prop="delFlag" sortable>
<template slot-scope="scope">
<el-alert
:center="true"
:closable="false"
style="width: 90px;"
title="已删除"
type="error"
v-if="scope.row.delFlag">
</el-alert>
<el-alert
:center="true"
:closable="false"
style="width: 90px;"
title="已发送"
type="success"
v-if="!scope.row.delFlag">
</el-alert>
</template>
</el-table-column>
<el-table-column
label="操作"
width="120">
<template slot-scope="scope">
<el-dropdown @command="dropdownCommand">
<el-button size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'delete',id:scope.row.id,name:scope.row.title}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
:current-page="pageForm.pageNumber"
:page-size="pageForm.pageSize"
:page-sizes="[10, 20, 30, 50]"
:total="pageForm.totalCount"
@current-change="pageNumberChange"
@size-change="pageSizeChange"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
</el-row>
</el-card>
</guava>
<el-dialog
:title="viewUserTitle"
:visible.sync="viewDialogVisible"
width="65%">
<el-table
:data="viewTableData"
@sort-change='viewPageOrder'
header-align="center"
style="width: 100%;margin-top: 10px;margin-bottom: 10px;"
:default-sort="{prop: 'createdAt', order: 'descending'}"
size="small"
>
<el-table-column
fixed
prop="loginname"
label="用户名"
width="150">
</el-table-column>
<el-table-column
prop="username"
label="姓名"
width="120">
</el-table-column>
<el-table-column
prop="mobile"
label="手机">
</el-table-column>
<el-table-column
prop="email"
label="邮箱">
</el-table-column>
<el-table-column
prop="unitname"
label="所属单位">
</el-table-column>
</el-table>
<el-pagination
@size-change="viewPageSizeChange"
@current-change="viewPageNumberChange"
:current-page="viewPageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="viewPageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="viewPageForm.totalCount">
</el-pagination>
<span slot="footer" class="dialog-footer">
<el-button @click="viewDialogVisible = false"> 关 闭 </el-button>
</span>
</el-dialog>
<el-dialog
title="选择用户"
:visible.sync="selectDialogVisible"
width="65%">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" v-model="selectPageForm.searchKeyword" @keyup.enter.native="doSearch">
<el-select v-model="selectPageForm.searchName" slot="prepend" placeholder="查询类型" style="width: 120px;">
<el-option label="用户名" value="loginname"></el-option>
<el-option label="姓名" value="username"></el-option>
<el-option label="手机" value="mobile"></el-option>
<el-option label="邮箱" value="email"></el-option>
</el-select>
<el-button slot="append" icon="el-icon-search" @click="doSelectSearch"></el-button>
</el-input>
</div>
<el-table
:data="selectTableData"
@sort-change='selectPageOrder'
header-align="center"
style="width: 100%;margin-top: 10px;margin-bottom: 10px;"
:default-sort="{prop: 'createdAt', order: 'descending'}"
@selection-change="handleSelectionChange"
size="mini"
>
<el-table-column
type="selection"
width="35">
</el-table-column>
<el-table-column
fixed
prop="loginname"
label="用户名"
width="150">
</el-table-column>
<el-table-column
prop="username"
label="姓名"
width="120">
</el-table-column>
<el-table-column
prop="mobile"
label="手机"
width="120">
</el-table-column>
<el-table-column
prop="email"
label="邮箱"
width="120">
</el-table-column>
<el-table-column
prop="unit"
label="所属单位">
<template slot-scope="scope">
<span v-if="scope.row.unit!=null">
{{scope.row.unit.name}}
</span>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="selectPageSizeChange"
@current-change="selectPageNumberChange"
:current-page="selectPageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="selectPageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="selectPageForm.totalCount">
</el-pagination>
<span slot="footer" class="dialog-footer">
<el-button @click="selectDialogVisible = false"> 取 消 </el-button>
<el-button type="primary" @click="doSelect"> 确 定 </el-button>
</span>
</el-dialog>
<el-dialog
title="发送消息"
:visible.sync="addDialogVisible"
width="60%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="title" label="标题">
<el-input maxlength="255" placeholder="标题"
v-model="formData.title"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="url" label="链接地址">
<el-input placeholder="链接地址"
v-model="formData.url"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="type" label="消息类型">
<el-radio-group v-model="formData.type">
<el-radio label="system">系统消息</el-radio>
<el-radio label="user">用户消息</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="用户列表" v-if="'user'==formData.type">
<el-row>
<el-button icon="el-icon-search" @click="openSelect">选择用户</el-button>
<el-button icon="el-icon-delete" @click="clearSelect" type="danger">清空用户</el-button>
</el-row>
<el-table
:data="userTableData"
style="width: 100%"
size="small"
height="200">
<el-table-column
fixed
prop="loginname"
label="用户名"
width="150">
</el-table-column>
<el-table-column
prop="username"
label="姓名"
width="120">
</el-table-column>
<el-table-column
prop="mobile"
label="手机号"
width="120">
</el-table-column>
<el-table-column
prop="unit"
label="所属单位">
<template slot-scope="scope">
<span v-if="scope.row.unit!=null">
{{scope.row.unit.name}}
</span>
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-form-item prop="note" label="消息内容">
<!---->
<script type="text/plain" id="note" class="note"></script>
<!---->
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false"> 取 消 </el-button>
<el-button type="primary" @click="doAdd"> 确 定 </el-button>
</span>
</el-dialog>
</div>
<script>
var wo_shi_zhan_wei_fu;
new Vue({
el: "#app",
data: function () {
return {
addDialogVisible: false,
editDialogVisible: false,
selectDialogVisible: false,
viewDialogVisible: false,
tableData: [],
pageForm: {
searchType: GetQueryString('type'),
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "createdAt",
pageOrderBy: "descending"
},
formData: {
id: "",
type: "system"
},
formRules: {
title: [
{required: true, message: '标题', trigger: 'blur'}
],
},
selectPageForm: {
searchName: "",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "loginname",
pageOrderBy: "ascending"
},
selectTableData: [
{loginname: 'xxx', realname: "xx", unitname: "ccccccc"}
],
userTableData: [],
selectUsers: [],
viewTableData: [],
viewUserTitle: "",
viewPageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "loginname",
pageOrderBy: "descending",
type: "",
id: ""
},
}
},
methods: {
pageOrder: function (column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange: function (val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange: function (val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
pageData: function () {//加载分页数据
var self = this;
sublime.showLoadingbar();//显示loading
$.post(base + "/platform/sys/msg/data", self.pageForm, function (data) {
sublime.closeLoadingbar();//关闭loading
if (data.code == 0) {
self.tableData = data.data.list;
self.pageForm.totalCount = data.data.totalCount;
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
selectPageOrder: function (column) {//按字段排序
this.selectPageForm.pageOrderName = column.prop;
this.selectPageForm.pageOrderBy = column.order;
this.selectPageData();
},
selectPageNumberChange: function (val) {//页码更新操作
this.selectPageForm.pageNumber = val;
this.selectPageData();
},
selectPageSizeChange: function (val) {//分页大小更新操作
this.selectPageForm.pageSize = val;
this.selectPageData();
},
doSelectSearch: function () {
this.selectPageForm.pageNumber = 1;
this.selectPageData();
},
selectPageData: function () {//加载分页数据
var self = this;
$.post(base + "/platform/sys/msg/user_data", self.selectPageForm, function (data) {
if (data.code == 0) {
self.selectTableData = data.data.list;
self.selectPageForm.totalCount = data.data.totalCount;
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
handleSelectionChange: function (val) {
this.selectUsers = val;
},
formatAt: function (val) {
if (val && val > 0)
return moment(val).format("YYYY-MM-DD HH:mm");
return "";
},
doSearch: function (val) {
this.pageForm.pageNumber = 1;
this.pageData();
},
openSelect: function () {
this.selectDialogVisible = true;
this.selectPageData();
},
clearSelect: function () {
this.userTableData = [];
},
doSelect: function () {
var self = this;
this.selectDialogVisible = false;
this.selectUsers.forEach(function (o) {
self.userTableData.push(o);
});
},
openAdd: function () {
var self = this;
this.addDialogVisible = true;
this.formData = {
id: "", type: "system"
};//打开新增窗口,表单先清空
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
UM.getEditor("note");
setTimeout(function () {
UM.getEditor("note").setContent("",false);
},200);
},
doAdd: function () {
var self = this;
self.$refs["addForm"].validate(function (valid) {
if (valid) {
var users = [];
if (self.selectUsers) {
self.selectUsers.forEach(function (o) {
users.push(o.loginname);
});
}
if (self.formData.type == 'user' && users.length == 0) {
self.$message({
message: "请选择用户",
type: 'error'
});
return false;
}
$.post(base + "/platform/sys/msg/addDo", {
note: UM.getEditor("note").getContent(),
msg: JSON.stringify(self.formData),
users: users.toString()
}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.addDialogVisible = false;
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
self.pageData();//添加失败也可以入库,所以加载一下看看
}, "json");
}
});
},
viewPageOrder: function (column) {//按字段排序
this.viewPageForm.pageOrderName = column.prop;
this.viewPageForm.pageOrderBy = column.order;
this.viewPageLoad();
},
viewPageNumberChange: function (val) {//页码更新操作
this.viewPageForm.pageNumber = val;
this.viewPageLoad();
},
viewPageSizeChange: function (val) {//分页大小更新操作
this.viewPageForm.pageSize = val;
this.viewPageLoad();
},
viewPageLoad: function () {//加载分页数据
var self = this;
$.post(base + "/platform/sys/msg/user_view_data", self.viewPageForm, function (data) {
if (data.code == 0) {
self.viewTableData = data.data.list;
self.viewPageForm.totalCount = data.data.totalCount;
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
viewUserList: function (type, id) {
var self = this;
if ("all" == type) {
self.viewUserTitle = "全部用户";
}
if ("unread" == type) {
self.viewUserTitle = "未读用户";
}
self.viewDialogVisible = true;
self.viewPageForm.type = type;
self.viewPageForm.id = id;
self.viewPageLoad();
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("delete" == command.type) {
self.$confirm('此操作将删除 ' + command.name, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/msg/delete/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.doSearch();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
}
},
created: function () {
this.pageData();
}
});
</script>
<!--#
}
#-->