first commit

This commit is contained in:
2026-09-08 19:49:21 +08:00
commit ebffbab428
7320 changed files with 1477614 additions and 0 deletions
@@ -0,0 +1,638 @@
<!--#
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>
<!--#
}
#-->
@@ -0,0 +1,41 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div style="padding: 10px">
<header class="header navbar bg-white shadow">
<div class="btn-group tool-button m5">
<a class="el-button el-button--default el-button--medium" href="${base}/platform/sys/msg/user/all" data-pjax><i
class="ti-angle-left"></i>返回</a>
</div>
</header>
<div class="content-wrap">
<div class="wrapper" style="min-height:500px;">
<section class="panel">
<div class="row mb10">
<div class="col-lg-12">
<!--#if(!isEmpty(obj)){#-->
<div style="text-align:center">
<h4>${obj.title!}</h4>
</div>
<div style="text-align:center;font-size: 14px;line-height: 24px;">
${@date.getDate(obj.sendAt)}
</div>
<div style="margin-top: 16px !important;border-bottom: 1px solid #DDD;"></div>
<div style="margin-top: 16px !important;">
${obj.note!}
</div>
<!--#}else{#-->
消息不存在,或您没有阅读权限!
<!--#}#-->
</div>
</div>
</section>
</div>
</div>
</div>
<!--#
}
#-->
@@ -0,0 +1,37 @@
<!--#
layout("/layouts/platform.html"){
#-->
<header class="header navbar bg-white shadow">
<div class="btn-group tool-button m5">
<a class="el-button el-button--default el-button--medium" href="${base}/platform/sys/msg/user/read" data-pjax><i
class="ti-angle-left"></i>返回</a>
</div>
</header>
<div class="content-wrap">
<div class="wrapper" style="min-height:500px;">
<section class="panel">
<div class="row mb10">
<div class="col-lg-12">
<!--#if(!isEmpty(obj)){#-->
<div style="text-align:center">
<h4>${obj.title!}</h4>
</div>
<div style="text-align:center;font-size: 14px;line-height: 24px;">
${@date.getDate(obj.sendAt)}
</div>
<div style="margin-top: 16px !important;border-bottom: 1px solid #DDD;"></div>
<div style="margin-top: 16px !important;">
${obj.note!}
</div>
<!--#}else{#-->
消息不存在,或您没有阅读权限!
<!--#}#-->
</div>
</div>
</section>
</div>
</div>
<!--#
}
#-->
@@ -0,0 +1,37 @@
<!--#
layout("/layouts/platform.html"){
#-->
<header class="header navbar bg-white shadow">
<div class="btn-group tool-button m5">
<a class="el-button el-button--default el-button--medium" href="${base}/platform/sys/msg/user/unread" data-pjax><i
class="ti-angle-left"></i>返回</a>
</div>
</header>
<div class="content-wrap">
<div class="wrapper" style="min-height:500px;">
<section class="panel">
<div class="row mb10">
<div class="col-lg-12">
<!--#if(!isEmpty(obj)){#-->
<div style="text-align:center">
<h4>${obj.title!}</h4>
</div>
<div style="text-align:center;font-size: 14px;line-height: 24px;">
${@date.getDate(obj.sendAt)}
</div>
<div style="margin-top: 16px !important;border-bottom: 1px solid #DDD;"></div>
<div style="margin-top: 16px !important;">
${obj.note!}
</div>
<!--#}else{#-->
消息不存在,或您没有阅读权限!
<!--#}#-->
</div>
</div>
</section>
</div>
</div>
<!--#
}
#-->
@@ -0,0 +1,290 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-msg-active {
background-color: #546478;
color: #ffffff;
}
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button">
<a href="${base}/platform/sys/msg/user/all" data-pjax class="el-button el-button--default el-button--medium"
:class="{'el-msg-active':'all'==pageForm.searchType}">
全部类型消息
</a>
</div>
<div class="btn-group tool-button">
<a href="${base}/platform/sys/msg/user/all?type=system" data-pjax
class="el-button el-button--default el-button--medium"
:class="{'el-msg-active':'system'==pageForm.searchType}">
系统消息<span v-if="unreadnum.system>0">({{unreadnum.system}})</span>
</a>
</div>
<div class="btn-group tool-button">
<a href="${base}/platform/sys/msg/user/all?type=user" data-pjax
class="el-button el-button--default el-button--medium"
:class="{'el-msg-active':'user'==pageForm.searchType}">
用户消息<span v-if="unreadnum.user>0">({{unreadnum.user}})</span>
</a>
</div>
<div class="pull-right offscreen-right">
<el-button size="medium" @click="readMore" :disabled="selectData.length==0">标记已读</el-button>
<el-button size="medium" @click="readAll" :disabled="tableData.length==0">全部已读</el-button>
<el-button size="medium" @click="delMore" type="danger" :disabled="selectData.length==0"><i
class="el-icon-delete"></i>删除
</el-button>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<el-table
:data="tableData"
@sort-change='pageOrder'
size="small"
header-align="center"
style="width: 100%"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="35">
</el-table-column>
<el-table-column
prop="status"
width="45">
<template slot-scope="scope">
<span v-if="0==scope.row.status"><i class="fa fa-circle text-info ml5"></i></span>
</template>
</el-table-column>
<el-table-column
prop="type"
label="消息类型"
header-align="center" align="center" width="120">
<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
prop="title"
label="标题"
header-align="center"
:show-overflow-tooltip="true">
<template slot-scope="scope">
<a :href="'${base}/platform/sys/msg/user/all/detail/'+scope.row.msgid"
data-pjax>{{scope.row.title}}</a>
</template>
</el-table-column>
<el-table-column
prop="opat"
label="接收时间"
header-align="center" align="center">
<template slot-scope="scope">
{{formatAt(scope.row.opat)}}
</template>
</el-table-column>
</el-table>
<el-pagination
style="float: left"
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-card>
</guava>
</div>
<script>
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"
},
selectData: [],
unreadnum: {
system: 0,
user: 0
}
}
},
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/user/data/all", 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");
},
formatAt: function (val) {
if (val && val > 0)
return moment(val).format("YYYY-MM-DD HH:mm");
return "";
},
handleSelectionChange: function (val) {
this.selectData = val;
},
unreadData: function () {//加载分页数据
var self = this;
$.post(base + "/platform/sys/msg/user/unread_num", {}, function (data) {
if (data.code == 0) {
self.unreadnum = data.data;
}
}, "json");
},
readMore: function () {
var self = this;
if (self.selectData.length == 0) {
self.$message({
message: "请选择消息",
type: 'warning'
});
return false;
}
var ids = [];
self.selectData.forEach(function (val) {
ids.push(val.id);
});
self.$confirm('您确定要标记选中的 ' + ids.length + ' 条消息为已读吗? ', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/msg/user/status/read", {ids: ids.toString()}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
self.unreadData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
readAll: function () {
var self = this;
self.$confirm('您确定要标记全部消息为已读吗? ', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/msg/user/status/readAll", {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
self.unreadData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
delMore: function () {
var self = this;
if (self.selectData.length == 0) {
self.$message({
message: "请选择消息",
type: 'warning'
});
return false;
}
var ids = [];
self.selectData.forEach(function (val) {
ids.push(val.id);
});
self.$confirm('您确定要删除选中的 ' + ids.length + ' 条消息? ', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/msg/user/delete", {ids: ids.toString()}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
self.unreadData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
},
created: function () {
this.pageData();
this.unreadData();
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,211 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-msg-active {
background-color: #546478;
color: #ffffff;
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar shadow">
<div class="btn-group tool-button mt5">
<a href="${base}/platform/sys/msg/user/read" data-pjax class="el-button el-button--default el-button--medium"
:class="{'el-msg-active':'all'==pageForm.searchType}">
全部类型消息
</a>
</div>
<div class="btn-group tool-button mt5">
<a href="${base}/platform/sys/msg/user/read?type=system" data-pjax
class="el-button el-button--default el-button--medium"
:class="{'el-msg-active':'system'==pageForm.searchType}">
系统消息<span v-if="unreadnum.system>0">({{unreadnum.system}})</span>
</a>
</div>
<div class="btn-group tool-button mt5">
<a href="${base}/platform/sys/msg/user/read?type=user" data-pjax
class="el-button el-button--default el-button--medium"
:class="{'el-msg-active':'user'==pageForm.searchType}">
用户消息<span v-if="unreadnum.user>0">({{unreadnum.user}})</span>
</a>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="delMore" type="danger" :disabled="selectData.length==0"><i class="el-icon-delete"></i>删除</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table
:data="tableData"
@sort-change='pageOrder'
size="small"
header-align="center"
style="width: 100%"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="35">
</el-table-column>
<el-table-column
prop="status"
width="45">
<template slot-scope="scope">
<span v-if="0==scope.row.status"><i class="fa fa-circle text-info ml5"></i></span>
</template>
</el-table-column>
<el-table-column
prop="type"
label="消息类型"
header-align="center" align="center" width="120">
<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
prop="title"
label="标题"
header-align="center"
:show-overflow-tooltip="true">
<template slot-scope="scope">
<a :href="'${base}/platform/sys/msg/user/read/detail/'+scope.row.msgid" data-pjax>{{scope.row.title}}</a>
</template>
</el-table-column>
<el-table-column
prop="opat"
label="接收时间"
header-align="center" align="center">
<template slot-scope="scope">
{{formatAt(scope.row.opat)}}
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
style="float: left"
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</div>
<script>
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"
},
selectData: [],
unreadnum: {
system: 0,
user: 0
}
}
},
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/user/data/read", 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");
},
formatAt: function (val) {
if (val && val > 0)
return moment(val).format("YYYY-MM-DD HH:mm");
return "";
},
handleSelectionChange: function (val) {
this.selectData = val;
},
delMore: function () {
var self = this;
if (self.selectData.length == 0) {
self.$message({
message: "请选择消息",
type: 'warning'
});
return false;
}
var ids = [];
self.selectData.forEach(function (val) {
ids.push(val.id);
});
self.$confirm('您确定要删除选中的 '+ids.length+' 条消息? ', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/msg/user/delete", {ids: ids.toString()}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
},
created: function () {
this.pageData();
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,288 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-msg-active {
background-color: #546478;
color: #ffffff;
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar shadow">
<div class="btn-group tool-button mt5">
<a href="${base}/platform/sys/msg/user/unread" data-pjax class="el-button el-button--default el-button--medium"
:class="{'el-msg-active':'all'==pageForm.searchType}">
全部类型消息
</a>
</div>
<div class="btn-group tool-button mt5">
<a href="${base}/platform/sys/msg/user/unread?type=system" data-pjax
class="el-button el-button--default el-button--medium"
:class="{'el-msg-active':'system'==pageForm.searchType}">
系统消息<span v-if="unreadnum.system>0">({{unreadnum.system}})</span>
</a>
</div>
<div class="btn-group tool-button mt5">
<a href="${base}/platform/sys/msg/user/unread?type=user" data-pjax
class="el-button el-button--default el-button--medium"
:class="{'el-msg-active':'user'==pageForm.searchType}">
用户消息<span v-if="unreadnum.user>0">({{unreadnum.user}})</span>
</a>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="readMore" :disabled="selectData.length==0">标记已读</el-button>
<el-button size="medium" @click="readAll" :disabled="tableData.length==0">全部已读</el-button>
<el-button size="medium" @click="delMore" type="danger" :disabled="selectData.length==0"><i class="el-icon-delete"></i>删除</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table
:data="tableData"
@sort-change='pageOrder'
size="small"
header-align="center"
style="width: 100%"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="35">
</el-table-column>
<el-table-column
prop="status"
width="45">
<template slot-scope="scope">
<span v-if="0==scope.row.status"><i class="fa fa-circle text-info ml5"></i></span>
</template>
</el-table-column>
<el-table-column
prop="type"
label="消息类型"
header-align="center" align="center" width="120">
<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
prop="title"
label="标题"
header-align="center"
:show-overflow-tooltip="true">
<template slot-scope="scope">
<a :href="'${base}/platform/sys/msg/user/unread/detail/'+scope.row.msgid" data-pjax>{{scope.row.title}}</a>
</template>
</el-table-column>
<el-table-column
prop="opat"
label="接收时间"
header-align="center" align="center">
<template slot-scope="scope">
{{formatAt(scope.row.opat)}}
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
style="float: left"
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</div>
<script>
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"
},
selectData: [],
unreadnum: {
system: 0,
user: 0
}
}
},
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/user/data/unread", 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");
},
formatAt: function (val) {
if (val && val > 0)
return moment(val).format("YYYY-MM-DD HH:mm");
return "";
},
handleSelectionChange: function (val) {
this.selectData = val;
},
unreadData: function () {//加载分页数据
var self = this;
$.post(base + "/platform/sys/msg/user/unread_num", {}, function (data) {
if (data.code == 0) {
self.unreadnum = data.data;
}
}, "json");
},
readMore: function () {
var self = this;
if (self.selectData.length == 0) {
self.$message({
message: "请选择消息",
type: 'warning'
});
return false;
}
var ids = [];
self.selectData.forEach(function (val) {
ids.push(val.id);
});
self.$confirm('您确定要标记选中的 '+ids.length+' 条消息为已读吗? ', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/msg/user/status/read", {ids: ids.toString()}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
self.unreadData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
readAll: function () {
var self = this;
self.$confirm('您确定要标记全部消息为已读吗? ', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/msg/user/status/readAll", {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
self.unreadData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
delMore: function () {
var self = this;
if (self.selectData.length == 0) {
self.$message({
message: "请选择消息",
type: 'warning'
});
return false;
}
var ids = [];
self.selectData.forEach(function (val) {
ids.push(val.id);
});
self.$confirm('您确定要删除选中的 '+ids.length+' 条消息? ', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/msg/user/delete", {ids: ids.toString()}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
self.unreadData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
},
created: function () {
this.pageData();
this.unreadData();
}
});
</script>
<!--#
}
#-->