first commit

This commit is contained in:
2026-09-20 15:46:34 +08:00
parent 72fb5eae10
commit e558339dcc
3340 changed files with 671310 additions and 251 deletions
@@ -0,0 +1,16 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-alert
title="对不起,您没有权限访问该页面。"
type="error">
</el-alert>
</div>
<script>
new Vue({
el: "#app"
});
</script>
<!--#}#-->
@@ -0,0 +1,16 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-alert
title="对不起,您访问的页面不存在。"
type="error">
</el-alert>
</div>
<script>
new Vue({
el: "#app"
});
</script>
<!--#}#-->
@@ -0,0 +1,16 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-alert
title="对不起,服务器异常,请联系管理员。"
type="error">
</el-alert>
</div>
<script>
new Vue({
el: "#app"
});
</script>
<!--#}#-->
@@ -0,0 +1,297 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button 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"
@sort-change='pageOrder'
header-align="center"
style="width: 100%"
>
<el-table-column
align="center"
header-align="center"
label="应用名称"
prop="name"
sortable
width="120"
>
</el-table-column>
<el-table-column
header-align="center"
label="App Id"
prop="appid"
width="160"
>
</el-table-column>
<el-table-column
header-align="center"
label="App Key"
prop="appkey"
width="320">
<template slot-scope="scope">
<span class="bg-success" v-if="isVisable(scope.row.appid)">{{scope.row.appkey}}</span><a
@click="visiableData.push(scope.row.appid)"
style="padding-left:5px;color: #06C;cursor: pointer;"
v-if="!isVisable(scope.row.appid)">显示</a><a @click="setNotVisable(scope.row.appid)"
style="padding-left:5px;color: #06C;cursor: pointer;"
v-if="isVisable(scope.row.appid)">隐藏</a>
</template>
</el-table-column>
<el-table-column
align="center"
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="disabled"
sortable
>
<template slot-scope="scope">
<i class="fa fa-circle text-danger ml5" v-if="scope.row.disabled"></i>
<i class="fa fa-circle text-success ml5" v-if="!scope.row.disabled"></i>
</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:'enable',appid:scope.row.appid,name:scope.row.name,row:scope.row}">
启用
</el-dropdown-item>
<el-dropdown-item
:command="{type:'disable',appid:scope.row.appid,name:scope.row.name,row:scope.row}">
禁用
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',appid:scope.row.appid,name:scope.row.name}"
divided>
删除
</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="新建密钥"
:visible.sync="addDialogVisible"
width="50%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="name" label="应用名称">
<el-input maxlength="100" placeholder="应用名称"
v-model="formData.name"
auto-complete="off" tabindex="1" type="text"></el-input>
</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>
new Vue({
el: "#app",
data: function () {
return {
addDialogVisible: false,
editDialogVisible: false,
visiableData:[],
tableData: [],
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formData: {
id: ""
},
formRules: {
name: [
{required: true, message: '应用名称', trigger: 'blur'}
]
},
}
},
methods: {
isVisable:function(appid){
if(this.visiableData.indexOf(appid)>=0){
return true;
}
return false;
},
setNotVisable:function(appid){
var index=this.visiableData.indexOf(appid);
if(index>=0){
this.visiableData.splice(index,1);
}
},
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/api/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");
},
formatAt: function (val) {
if (val && val > 0)
return moment(val).format("YYYY-MM-DD HH:mm");
return "";
},
doSearch: function () {
this.pageForm.pageNumber = 1;
this.pageData();
},
openAdd: function () {
var self = this;
this.addDialogVisible = true;
this.formData = {};//打开新增窗口,表单先清空
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
},
doAdd: function () {
var self = this;
self.$refs["addForm"].validate(function (valid) {
if (valid) {
$.post(base + "/platform/sys/api/addDo", self.formData, 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");
}
});
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("enable" == command.type || "disable" == command.type) {
$.post(base + "/platform/sys/api/" + command.type + "/" + command.appid, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
if ("disable" == command.type) {
command.row.disabled = true;
}
if ("enable" == command.type) {
command.row.disabled = false;
}
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除密钥 ' + command.name, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/api/delete/" + command.appid, {}, 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,425 @@
<!--#
layout("/layouts/platform.html"){
#-->
<link rel="stylesheet" href="${base!}/assets/platform/plugins/codemirror/codemirror.css">
<script src="${base!}/assets/platform/plugins/codemirror/codemirror.js"></script>
<script src="${base!}/assets/platform/plugins/codemirror/vue-codemirror.js"></script>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<a class="el-button el-button--default el-button--medium" href="${base}/platform/sys/app" data-pjax><i
class="ti-angle-left"></i>返回</a>
<el-button size="medium" @click="openAdd">
<i class="ti-plus"></i>
添加配置
</el-button>
</div>
<div class="btn-group tool-button mt5">
<el-input @keyup.native="doSearch" placeholder="请输入内容" v-model="pageForm.confName" size="medium">
<template slot="prepend">实例名称</template>
</el-input>
</div>
</el-row>
<el-row class="el-table-container">
<el-table
:data="tableData"
@sort-change='pageOrder'
size="small"
header-align="center"
style="width: 100%"
:default-sort="{prop: 'createdAt', order: 'descending'}"
>
<el-table-column
sortable
prop="confName"
label="实例名称"
header-align="center"
align="center"
>
</el-table-column>
<el-table-column
sortable
prop="confVersion"
label="版本号"
width="100"
>
</el-table-column>
<el-table-column
label="文件下载"
header-align="center"
align="center">
<template slot-scope="scope">
<a style="color: #0e5996" :href="'${base!}/platform/sys/app/conf/download/'+scope.row.id"
target="_blank">{{scope.row.confName}}-{{scope.row.confVersion}}.properties</a>
</template>
</el-table-column>
<el-table-column
sortable
prop="createdAt"
label="上传时间"
header-align="center" align="center">
<template slot-scope="scope">
{{formatAt(scope.row.createdAt)}}
</template>
</el-table-column>
<el-table-column
sortable
prop="createdBy"
label="上传人"
header-align="center" align="center">
<template slot-scope="scope">
{{scope.row.user.loginname}}
</template>
</el-table-column>
<el-table-column
sortable
prop="disabled"
label="启用状态"
header-align="center"
align="center"
width="100"
>
<template slot-scope="scope">
<i v-if="scope.row.disabled" class="fa fa-circle text-danger ml5"></i>
<i v-if="!scope.row.disabled" class="fa fa-circle text-success ml5"></i>
</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:'copy',row:scope.row}">
复制
</el-dropdown-item>
<el-dropdown-item
:command="{type:'edit',row:scope.row}">
修改
</el-dropdown-item>
<el-dropdown-item
:command="{type:'enable',row:scope.row}">
启用
</el-dropdown-item>
<el-dropdown-item
:command="{type:'disable',row:scope.row}">
禁用
</el-dropdown-item>
<el-dropdown-item divided
:command="{type:'delete',row:scope.row}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@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>
<el-dialog
title="添加配置"
:visible.sync="addDialogVisible"
:close-on-click-modal="false"
width="60%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="confName" label="实例名称">
<el-autocomplete
class="inline-input"
v-model="formData.confName"
:fetch-suggestions="queryConfName"
placeholder="保持和配置文件中实例名称一致"
style="width: 220px;"
></el-autocomplete>
</el-form-item>
<el-form-item prop="confVersion" label="版本号">
<el-input maxlength="20" placeholder="版本号不可用特殊字符"
v-model="formData.confVersion"
auto-complete="off" tabindex="2" type="text"
style="width: 220px;"></el-input>
</el-form-item>
<el-form-item prop="confData" label-width="2px">
<codemirror v-model="formData.confData" :options="cmOptions"
style="line-height:20px;border:1px solid silver;"></codemirror>
</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>
<el-dialog
title="修改配置"
:visible.sync="editDialogVisible"
:close-on-click-modal="false"
width="60%">
<el-form :model="formData" ref="editForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="confName" label="实例名称">
{{formData.confName}}
</el-form-item>
<el-form-item prop="confVersion" label="版本号">
{{formData.confVersion}}
</el-form-item>
<el-form-item prop="confData" label-width="2px">
<codemirror v-model="formData.confData" :options="cmOptions"
style="line-height:20px;border:1px solid silver;"></codemirror>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
Vue.use(window.VueCodemirror);
new Vue({
el: "#app",
data: function () {
return {
addDialogVisible: false,
editDialogVisible: false,
visiableData: [],
tableData: [],
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "createdAt",
pageOrderBy: "descending",
confName: ""
},
formData: {
id: "",
},
formRules: {
confName: [
{required: true, message: '实例名称', trigger: 'blur'}
],
confVersion: [
{required: true, message: '版本号', trigger: 'blur'}
],
confData: [
{required: true, message: '配置内容', trigger: 'blur'}
],
},
cmOptions: {
// codemirror options
tabSize: 4,
mode: 'text/javascript',
theme: 'elegant',
lineNumbers: true,
line: true,
// more codemirror options, 更多 codemirror 的高级配置...
}
}
},
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/app/conf/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");
},
formatAt: function (val) {
if (val && val > 0)
return moment(val).format("YYYY-MM-DD HH:mm");
return "";
},
doSearch: function () {
this.pageForm.pageNumber = 1;
this.pageData();
},
openAdd: function () {
this.addDialogVisible = true;
this.formData = {
id: "",
confName: "",
confVersion: "",
confData: ""
};//打开新增窗口,表单先清空
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
},
doAdd: function () {
var self = this;
self.$refs["addForm"].validate(function (valid) {
if (valid) {
$.post(base + "/platform/sys/app/conf/addDo", self.formData, 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");
}
});
},
doEdit: function () {
var self = this;
var url = base + "/platform/sys/app/conf/editDo";
self.$refs["editForm"].validate(function (valid) {
if (valid) {
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.editDialogVisible = false;
self.pageData();//重新加载分页数据
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("copy" == command.type) {
$.post(base + "/platform/sys/app/conf/edit/" + command.row.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.formData.confVersion="";
self.addDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("edit" == command.type) {
$.post(base + "/platform/sys/app/conf/edit/" + command.row.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.editDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("enable" == command.type || "disable" == command.type) {
$.post(base + "/platform/sys/app/conf/" + command.type + "/" + command.row.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
if ("disable" == command.type) {
command.row.disabled = true;
}
if ("enable" == command.type) {
command.row.disabled = false;
}
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除 ' + command.row.confName + '-' + command.row.confVersion + '.properties', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/app/conf/delete/" + command.row.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");
}
}
});
}
},
queryConfName: function (confName, cb) {
$.post(base + "/platform/sys/app/conf/search", {confName: confName}, function (data) {
if (data.code == 0) {
var list = data.data;
var names = [];
list.forEach(function (obj) {
names.push({value: obj});
});
cb(names);
}
}, "json");
}
},
created: function () {
this.pageData();
}
});
</script>
<!--#
}
#-->
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,402 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-upload input[type=file] {
display: none;
}
.el-upload__text {
color: #606266;
font-size: 14px;
text-align: center;
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<a class="el-button el-button--default el-button--medium" href="${base}/platform/sys/app" data-pjax><i
class="ti-angle-left"></i>返回</a>
<el-button size="medium" @click="openAdd">
<i class="ti-plus"></i>
添加安装包
</el-button>
</div>
<div class="btn-group tool-button mt5">
<el-input @keyup.native="doSearch" placeholder="请输入内容" v-model="pageForm.appName" size="medium">
<template slot="prepend">实例名称</template>
</el-input>
</div>
</el-row>
<el-row class="el-table-container">
<el-table
:data="tableData"
@sort-change='pageOrder'
size="small"
header-align="center"
style="width: 100%"
:default-sort = "{prop: 'createdAt', order: 'descending'}"
>
<el-table-column
sortable
prop="appName"
label="实例名称"
header-align="center"
align="center"
>
</el-table-column>
<el-table-column
sortable
prop="appVersion"
label="版本号"
width="100"
>
</el-table-column>
<el-table-column
prop="fileSize"
label="文件大小"
width="120"
>
<template slot-scope="scope">
{{(scope.row.fileSize/1024/1024).toFixed(2)}}MB
</template>
</el-table-column>
<el-table-column
prop="filePath"
label="文件下载"
header-align="center">
<template slot-scope="scope">
{{scope.row.appName}}-{{scope.row.appVersion}}.jar
</template>
</el-table-column>
<el-table-column
sortable
prop="createdAt"
label="上传时间"
header-align="center" align="center">
<template slot-scope="scope">
{{formatAt(scope.row.createdAt)}}
</template>
</el-table-column>
<el-table-column
sortable
prop="createdBy"
label="上传人"
header-align="center" align="center">
<template slot-scope="scope">
{{scope.row.user.loginname}}
</template>
</el-table-column>
<el-table-column
sortable
prop="disabled"
label="启用状态"
header-align="center"
align="center"
width="100"
>
<template slot-scope="scope">
<i v-if="scope.row.disabled" class="fa fa-circle text-danger ml5"></i>
<i v-if="!scope.row.disabled" class="fa fa-circle text-success ml5"></i>
</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:'enable',row:scope.row}">
启用
</el-dropdown-item>
<el-dropdown-item
:command="{type:'disable',row:scope.row}">
禁用
</el-dropdown-item>
<el-dropdown-item divided
:command="{type:'delete',row:scope.row}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@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>
<el-dialog
title="添加安装包"
:visible.sync="addDialogVisible"
width="50%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="appName" label="实例名称">
<el-autocomplete
class="inline-input"
v-model="formData.appName"
:fetch-suggestions="queryAppName"
placeholder="保持和配置文件中实例名称一致"
style="width: 220px;"
></el-autocomplete>
</el-form-item>
<el-form-item prop="appVersion" label="版本号">
<el-input maxlength="20" placeholder="版本号不可用特殊字符"
v-model="formData.appVersion"
auto-complete="off" tabindex="2" type="text"
style="width: 220px;"></el-input>
</el-form-item>
<el-form-item prop="filePath" label="文件上传">
<el-upload
class="upload-demo"
drag
action="${base}/open/file/upload/file"
name="Filedata"
:show-file-list="false"
:before-upload="beforeJarUpload"
:on-success="function(resp,file,fileList){return handleJarSuccess(resp,file,fileList)}"
:on-progress="uploadFileProcess"
style="height:180px;"
v-if="!formData.fileSize||formData.fileSize==0"
>
<i class="el-icon-upload" v-if="!fileUploadFlag"></i>
<div class="el-upload__text" v-if="!fileUploadFlag">将文件拖到此处,或<em>点击上传</em></div>
<div class="el-upload__tip" slot="tip">只能上传 jar 文件,且不超过200MB</div>
<el-progress v-if="fileUploadFlag == true" type="circle" :percentage="fileUploadPercent" style="margin-top:20px;"></el-progress>
</el-upload>
<div v-if="formData.fileSize>0" style="color: green;font-size: 12px;">
文件大小: {{(formData.fileSize/1024/1024).toFixed(2)}}MB
</div>
</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>
new Vue({
el: "#app",
data: function () {
return {
addDialogVisible: false,
editDialogVisible: false,
visiableData: [],
tableData: [],
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "createdAt",
pageOrderBy: "descending",
appName: ""
},
formData: {
id: "",
fileSize: 0,
filePath: ""
},
formRules: {
appName: [
{required: true, message: '实例名称', trigger: 'blur'}
],
appVersion: [
{required: true, message: '版本号', trigger: 'blur'}
],
filePath: [
{required: true, message: '上传文件', trigger: 'blur'}
],
},
fileUploadFlag:false,
fileUploadPercent: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/app/jar/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");
},
formatAt: function (val) {
if (val && val > 0)
return moment(val).format("YYYY-MM-DD HH:mm");
return "";
},
doSearch: function () {
this.pageForm.pageNumber = 1;
this.pageData();
},
openAdd: function () {
this.addDialogVisible = true;
this.formData = {
id: "",
fileSize: 0,
filePath: ""
};//打开新增窗口,表单先清空
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
},
doAdd: function () {
var self = this;
self.$refs["addForm"].validate(function (valid) {
if (valid) {
$.post(base + "/platform/sys/app/jar/addDo", self.formData, 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");
}
});
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("enable" == command.type || "disable" == command.type) {
$.post(base + "/platform/sys/app/jar/" + command.type + "/" + command.row.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
if ("disable" == command.type) {
command.row.disabled = true;
}
if ("enable" == command.type) {
command.row.disabled = false;
}
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除 ' + command.row.appName+'-'+command.row.appVersion+'.jar', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/app/jar/delete/" + command.row.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");
}
}
});
}
},
beforeJarUpload: function (file) {
var isLt120M = file.size / 1024 / 1024 < 200;
if (".jar" != file.name.substring(file.name.lastIndexOf("."), file.name.length)) {
this.$message.error('只可上传jar文件');
return false;
}
if (!isLt120M) {
this.$message.error('文件大小不能超过200MB');
return false;
}
return true;
},
handleJarSuccess: function (response, file, fileList) {
if (response.code == 0) {
// 对象属性直接赋值不会触发试图更新,采用 Vue.set 、this.$set或者Object.assign({},this.obj)创建新对象
// 或者也可以定义一个 refresh 属性 ,当数据发生改变时,该属性同时变化,也会触发视图更新
this.$set(this.formData, "fileSize", response.data.file_size);
this.$set(this.formData, "filePath", response.data.file_url);
} else {
this.$message({
message: response.msg,
type: 'error'
});
this.$set(this.formData, "fileSize", 0);
this.$set(this.formData, "filePath", "");
}
this.fileUploadFlag=false;
},
uploadFileProcess:function(event, file, fileList){
this.fileUploadFlag=true;
this.fileUploadPercent = parseInt(event.percent);
},
queryAppName: function (appName, cb) {
$.post(base + "/platform/sys/app/jar/search", {appName: appName}, function (data) {
if (data.code == 0) {
var list=data.data;
var names=[];
list.forEach(function (obj) {
names.push({value:obj});
});
cb(names);
}
}, "json");
}
},
created: function () {
this.pageData();
}
});
</script>
<!--#
}
#-->
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,142 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-table-container {
padding-left: 0px;
margin-top: 5px;
padding-right: 0px;
}
</style>
<div id="app" v-cloak>
<guava>
<div style="padding-right: 10px">
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 120px;">
<el-option label="协会名称" value="club.name"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
</el-card>
<el-row class="el-table-container" style="padding-top: 0">
<el-table :data="tableData" style="width: 100%" row-key="id" v-loading="tabLoading">
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="协会名称" width="250px"
prop="name"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="协会总人数"
prop="total"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="在职人数"
prop="work"></el-table-column>
<el-table-column align="center" header-align="center" label="退休人数"
prop="retire"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="男"
prop="man"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="女"
prop="woman"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="理事机构人数"
prop="governing_body"></el-table-column>
<el-table-column align="center" header-align="center" label="协会确认" sortable
prop="club_has_confirm"></el-table-column>
<el-table-column align="center" header-align="center" label="协会待确认" sortable
prop="club_no_confirm"></el-table-column>
<el-table-column align="center" header-align="center" label="校工会确认" sortable
prop="school_has_confirm"></el-table-column>
<el-table-column align="center" header-align="center" label="校工会待确认" sortable width="160"
prop="school_no_confirm"></el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@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"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</div>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
tableData: [],
pageForm: {
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
searchName: 'club.name',
},
tabLoading: false,
}
},
methods: {
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
$.post(base + "/platform/sys/club/clubUserCount/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,784 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.w-e-text-container {
height: 200px !important;
}
input[type="file"] {
display: none
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend" style="width: 120px;"
v-model="pageForm.searchName">
<el-option label="协会名称" value="club.name"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button @click="doSearch" icon="el-icon-search" type="primary"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<!--#if(@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')){#-->
<el-button @click="openAdd" icon="el-icon-plus">创建协会</el-button>
<!--#}#-->
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" @sort-change="pageOrder" row-key="id" style="width: 100%"
v-loading="tabloading">
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="协会名称"
prop="name" width="300px"></el-table-column>
<el-table-column align="center" header-align="center" label="成立时间" prop="create_time" show-overflow-tooltip
sortable
width="100px"></el-table-column>
<el-table-column align="center" header-align="center" label="主要负责人" prop="fzrname" show-overflow-tooltip
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="负责人单位" prop="fzr_unit_name"
show-overflow-tooltip
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="负责人电话" prop="fzr_mobile"
show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="负责人邮箱" prop="fzr_email"
show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="协会人数" prop="cynum" show-overflow-tooltip
sortable
width="100px"></el-table-column>
<el-table-column align="center" header-align="center" label="状态" prop="isjs" show-overflow-tooltip
sortable
width="100px">
<template slot-scope="scope">
<el-tooltip content="正常" placement="top" v-if="!scope.row.isjs">
<i class="fa fa-circle text-success ml5"></i>
</el-tooltip>
<el-tooltip content="已解散" placement="top" v-else>
<i class="fa fa-circle text-danger ml5"></i>
</el-tooltip>
</template>
</el-table-column>
<!--#if(@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')){#-->
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="300px">
<template slot-scope="scope">
<el-button @click="openDetail(scope.row.id)" size="mini">查看</el-button>
<el-button @click="openEdit(scope.row.id)" size="mini" type="primary" v-if="!scope.row.isjs">编辑
</el-button>
<el-button @click="doDelete(scope.row.id)" size="mini" type="danger">删除</el-button>
<el-button @click="doDissolve(scope.row.id)" size="mini" type="danger" v-if="!scope.row.isjs">解散
</el-button>
</template>
</el-table-column>
<!--#}else if(@shiro.hasRole('D02')){#-->
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<template slot-scope="scope">
<el-button @click="openDetail(scope.row.id)" size="mini">查看</el-button>
<el-button @click="openEdit(scope.row.id)" size="mini" type="primary" v-if="!scope.row.isjs">编辑
</el-button>
</template>
</el-table-column>
<!--#}#-->
</el-table>
</el-row>
<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">
</el-pagination>
</el-row>
<el-dialog
:close-on-click-modal="false"
:visible.sync="addDialogVisible"
title="创建协会" top="3%" width="60%">
<el-divider content-position="left"><span style="color: rgb(121, 187, 255)">请填写以下协会信息</span>
</el-divider>
<el-form :model="formData" :rules="formRules" label-position="top" label-width="120px" ref="addForm"
size="small"
style="padding: 0 30px">
<el-row gutter="30">
<el-col :span="12">
<el-form-item label="协会名称" prop="name">
<el-input maxlength="100" placeholder="请输入协会名称" type="text"
v-model="formData.name"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="协会类型" prop="type">
<el-select placeholder="请选择协会类型" style="width: 100%"
v-model="formData.type">
<el-option
:key="item.id"
:label="item.name"
:value="item.code"
v-for="item in typeOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="30">
<el-col :span="12">
<el-form-item label="协会负责人" prop="fzr">
<el-select
:loading="userLoading"
:remote-method="userRemoteMethod"
@change="fzrChange"
filterable
placeholder="请输入姓名或工号查找"
remote
reserve-keyword
style="width: 100%"
v-model="formData.fzr">
<el-option
:key="item.id"
:label="item.username+'('+item.loginname+')'"
:value="item.id"
v-for="item in userOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责人单位" prop="fzr_unit_name">
<el-input disabled placeholder="" v-model="formData.fzr_unit_name"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="30">
<el-col :span="12">
<el-form-item label="负责人电话" prop="fzr_mobile">
<el-input placeholder="请填写负责人电话" v-model="formData.fzr_mobile"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :rules="[
{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
]" label="负责人邮箱" prop="fzr_email">
<el-input placeholder="请填写负责人邮箱" type="email" v-model="formData.fzr_email"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="协会介绍" prop="stjs">
<div id="stjsEditor"></div>
</el-form-item>
<el-form-item label="协会章程" prop="stzc">
<div id="stzcEditor"></div>
</el-form-item>
<el-form-item label="附件上传" prop="accessory">
<el-upload
:auto-upload="false"
:file-list="fileList"
:on-change="handleChange"
:on-remove="handleRemove"
action="**"
limit="1"
name="file"
ref="upload">
<el-button size="small" type="primary">选择文件</el-button>
</el-upload>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button :disabled="subDis" @click="doAdd" type="primary">确 定</el-button>
</span>
</el-dialog>
<el-dialog
:close-on-click-modal="false"
:visible.sync="editDialogVisible"
title="修改协会信息" top="3%" width="60%">
<el-divider content-position="left"><span style="color: rgb(121, 187, 255)">请填写以下协会信息</span>
</el-divider>
<el-form :model="formData" :rules="formRules" label-position="top" label-width="120px" ref="editForm"
size="small"
style="padding: 0 30px">
<el-row gutter="30">
<el-col :span="12">
<el-form-item label="协会名称" prop="name">
<el-input maxlength="100" placeholder="请输入协会名称" type="text"
v-model="formData.name"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="协会类型" prop="type">
<el-select placeholder="请选择协会类型" style="width: 100%"
v-model="formData.type">
<el-option
:key="item.id"
:label="item.name"
:value="item.code"
v-for="item in typeOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="30">
<el-col :span="12">
<el-form-item disabled label="协会负责人" prop="fzrname">
<el-input disabled placeholder="" v-model="formData.fzrname"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责人单位" prop="fzr_unit_name">
<el-input disabled placeholder="" v-model="formData.fzr_unit_name"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="30">
<el-col :span="12">
<el-form-item label="负责人电话" prop="fzr_mobile">
<el-input placeholder="请填写负责人电话" v-model="formData.fzr_mobile"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :rules="[
{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
]" label="负责人邮箱" prop="fzr_email">
<el-input placeholder="请填写负责人邮箱" type="email" v-model="formData.fzr_email"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="协会介绍" prop="stjs">
<div id="stjsEditor2"></div>
</el-form-item>
<el-form-item label="协会章程" prop="stzc">
<div id="stzcEditor2"></div>
</el-form-item>
<el-form-item label="附件上传" prop="accessory">
<el-upload
:auto-upload="false"
:file-list="fileList"
:on-change="handleChange"
:on-exceed="function(files, fileList){
$notify({
title: '警告',
message: '最多可选择一个文件!',
type: 'warning'
});
}"
:on-remove="handleRemove"
action="**"
limit="1"
name="file" ref="upload">
<el-button size="small" type="primary">选择文件</el-button>
</el-upload>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button :disabled="subDis" @click="doEdit" type="primary">确 定</el-button>
</span>
</el-dialog>
<el-dialog
:close-on-click-modal="false"
:visible.sync="viewDialogVisible"
custom-class="ViewDialogClass" title="详细信息" top="3%" width="60%">
<el-collapse accordion v-model="activeName">
<el-collapse-item name="1" title="协会详细信息">
<table class="tabInfo">
<tr>
<td class="title" colspan="4" style="font-size: 18px;">{{detailData.name}}</td>
</tr>
<tr>
<td class="title">协会负责人</td>
<td class="content">{{detailData.fzrname}}</td>
<td class="title">负责人单位</td>
<td class="content">{{detailData.fzr_unit_name}}</td>
</tr>
<tr>
<td class="title">负责人电话</td>
<td class="content">{{detailData.fzr_mobile}}</td>
<td class="title">负责人邮箱</td>
<td class="content">{{detailData.fzr_email}}</td>
</tr>
<tr>
<td class="title">成立时间</td>
<td class="content">{{detailData.create_time}}</td>
<td class="title">协会人数</td>
<td class="content">{{detailData.cynum}}</td>
</tr>
<tr>
<td class="title" colspan="4">协会介绍</td>
</tr>
<tr>
<td class="content" colspan="4">
<div class="textareaDiv" v-html="detailData.stjs"></div>
</td>
</tr>
<tr>
<td class="title" colspan="4">协会章程</td>
</tr>
<tr>
<td class="content" colspan="4">
<div class="textareaDiv" v-html="detailData.stzc"></div>
</td>
</tr>
</table>
</el-collapse-item>
<el-collapse-item name="2" title="协会成员列表">
<el-table :data="detailData.clubuser" :header-cell-style="{background:'#F5F5F5',color:'#606266'}" border
size="small">
<el-table-column align="center" header-align="center" label="人员身份" prop="sf" width="150px">
<template slot-scope="scope">
<el-lable v-if="scope.row.sf==1">负责人</el-lable>
<el-lable v-if="scope.row.sf==2">成员</el-lable>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="工号" prop="loginname"
width="150px"></el-table-column>
<el-table-column align="center" header-align="center" label="姓名" prop="username"
width="150px"></el-table-column>
<el-table-column align="center" header-align="center" label="性别" prop="sex"
width="150px"></el-table-column>
<el-table-column align="center" header-align="center" label="电话" prop="mobile"
width="150px"></el-table-column>
<el-table-column align="center" header-align="center" label="所属单位"
prop="unitname"></el-table-column>
<el-table-column align="center" header-align="center" label="是否缴费" prop="isjf"
width="150px">
<template slot-scope="scope">
<span class="text-success" v-if="scope.row.isjf">已缴费</span>
<span class="text-danger" v-else>未缴费</span>
</template>
</el-table-column>
</el-table>
</el-collapse-item>
</el-collapse>
<span class="dialog-footer" slot="footer">
<el-button @click="viewDialogVisible = false">关 闭</el-button>
</span>
</el-dialog>
</div>
<script>
var E = window.wangEditor
const vue = new Vue({
el: '#app',
data() {
return {
activeName: ['1'],
detailData: {clubuser: []},
typeOptions: [],
addDialogVisible: false,
editDialogVisible: false,
viewDialogVisible: false,
tabloading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "club.name",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formRules: {
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
type: [{required: false, message: '必填', trigger: ['blur', 'change']}],
fzr: [{required: true, message: '必填', trigger: ['blur', 'change']}],
fzr_unit_name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
fzrname: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subDis: false,
userOptions: [],
userLoading: false,
fileList: [],
delFiles: [],
}
},
methods: {
openDetail(id) {
$.get(base + "/platform/sys/club/mange/findOne", {id}, (data) => {
if (data.code == 0) {
this.detailData = data.data
this.activeName = ['1']
this.viewDialogVisible = true
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
doDissolve(id) {
this.$confirm('确定要解散该协会吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/club/mange/dissolve", {id: id}, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
doDelete(id) {
this.$confirm('确定要删除该协会吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/club/mange/delete", {id: id}, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
doEdit() {
this.$refs["editForm"].validate((valid) => {
if (valid) {
var formdata = new FormData();
for (let key in this.formData) {
formdata.append(key, this.formData[key] ? this.formData[key] : '');
}
this.fileList.forEach(function (val) {
if (val.status === 'ready') {
formdata.append("files", val.raw, val.raw.name);
}
});
formdata.append("delFiles", this.delFiles)
this.subDis = true
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.ajax({
url: "/platform/sys/club/mange/doEdit",
type: "post",
data: formdata,
processData: false,
contentType: false,
success: (data) => {
this.subDis = false
loading.close()
if (data.code === 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
this.editDialogVisible = false;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
},
error: data => {
this.subDis = false
loading.close()
this.$message({
message: data.msg,
type: 'error'
});
}
});
}
});
},
openEdit(id) {
this.fileList = []
this.delFiles = []
this.userOptions = []
this.formData = {}
$.get(base + "/platform/sys/club/mange/findOne", {id}, (data) => {
if (data.code == 0) {
this.formData = data.data
//files
data.data.files.forEach(v => {
this.fileList.push({id: v.id, name: v.filename, url: v.filepath, status: 'success'})
})
this.editDialogVisible = true
this.$nextTick(() => {
$("#stjsEditor2").html("")
$("#stzcEditor2").html("")
var stjsEditor = new E("#stjsEditor2")
stjsEditor.config.onchange = (html) => {
this.formData.stjs = html
}
var stzcEditor = new E("#stzcEditor2")
stzcEditor.config.onchange = (html) => {
this.formData.stzc = html
}
stjsEditor.create()
stzcEditor.create()
stjsEditor.txt.html(data.data.stjs)
stzcEditor.txt.html(data.data.stzc)
})
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
doAdd() {
this.$refs["addForm"].validate((valid) => {
if (valid) {
var formdata = new FormData();
for (let key in this.formData) {
formdata.append(key, this.formData[key] ? this.formData[key] : '');
}
this.fileList.forEach(function (val) {
formdata.append("files", val.raw, val.raw.name);
});
this.subDis = true
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.ajax({
url: "/platform/sys/club/mange/doAdd",
type: "post",
data: formdata,
processData: false,
contentType: false,
success: (data) => {
this.subDis = false
loading.close()
if (data.code === 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
this.addDialogVisible = false;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
},
error: data => {
this.subDis = false
loading.close()
this.$message({
message: data.msg,
type: 'error'
});
}
});
}
});
},
handleRemove(file, fileList) {
this.fileList = fileList;
if (file.status === "success") {
this.delFiles.push(file.id);
}
},
handleChange(file, fileList) {
const delFile = () => {
for (let i = 0; i < fileList.length; i++) {
if (file === fileList[i]) {
fileList.splice(i, 1);
}
}
}
if (this.size === 0) {
this.$message.warning("您选择的是空文件!");
delFile()
}
if (!uploadFileType.includes(file.name.split('.')[1])) {
this.$message.warning("文件格式不支持!");
delFile()
}
this.fileList = fileList;
},
fzrChange(id) {
const user = this.userOptions.find(v => {
return v.id == id
})
this.$set(this.formData, 'fzr_unit_name', user.unitname)
this.$set(this.formData, 'fzr_mobile', user.mobile)
this.$set(this.formData, 'fzr_email', user.email)
},
async userRemoteMethod(query) {
if (query) {
this.userOptions = []
this.userLoading = true
this.userOptions = await searchUser(query)
this.userLoading = false
}
},
openAdd() {
this.fileList = []
this.delFiles = []
this.userOptions = []
this.formData = {}
this.addDialogVisible = true;
this.$nextTick(() => {
$("#stjsEditor").html("")
$("#stzcEditor").html("")
var stjsEditor = new E("#stjsEditor")
stjsEditor.config.onchange = (html) => {
this.formData.stjs = html
}
var stzcEditor = new E("#stzcEditor")
stzcEditor.config.onchange = (html) => {
this.formData.stzc = html
}
stjsEditor.create()
stzcEditor.create()
})
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
}
,
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
}
,
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
}
,
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
}
,
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabloading = true
$.post(base + "/platform/sys/club/mange/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabloading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
,
},
async created() {
this.typeOptions = await getClubType()
this.pageData();
}
})
</script>
<!--#
}
#-->
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,251 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<div style="padding-right: 10px">
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend" style="width: 120px;"
v-model="pageForm.searchName">
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-select clearable filterable placeholder="请选择协会"
v-model="pageForm.clubid">
<el-option
:label="item.name"
:value="item.id"
v-for="item in clubOptions">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button @click="doSearch" icon="el-icon-search" type="primary"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button :disabled="subDis" @click="check(true)" icon="el-icon-check" plain type="success">同意
</el-button>
<el-button :disabled="subDis" @click="check(false)" icon="el-icon-close" plain type="danger">拒绝
</el-button>
</div>
<div class="pull-right offscreen-right mt5" style="margin-right: 40px">
<el-radio-group v-model="pageForm.radioType" @change="(val) => doSearch()">
<el-radio-button label="1">全部</el-radio-button>
<el-radio-button label="2">已审核</el-radio-button>
<el-radio-button label="3">未审核</el-radio-button>
</el-radio-group>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<el-table :data="tableData" :key="tabKey" @selection-change="handleSelectionChange" @sort-change="pageOrder"
ref="multipleTable"
row-key="id"
style="width: 100%" v-loading="tabloading">
<el-table-column :reserve-selection="true" v-if="pageForm.radioType !== '2'" :selectable="(row, index) => {return row.status === 3}"
type="selection"
width="55">
</el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="协会名称" show-overflow-tooltip sortable
prop="clubname"></el-table-column>
<el-table-column width="100" align="center" header-align="center" label="工号" sortable
prop="loginname"></el-table-column>
<el-table-column width="100" align="center" header-align="center" label="姓名" sortable
prop="username"></el-table-column>
<el-table-column width="80" align="center" header-align="center" label="性别" prop="sex" sortable
></el-table-column>
<el-table-column width="60" align="center" header-align="center" label="年龄"
prop="birthday">
<template scope="scope">
<span>{{getAge(scope.row)}}</span>
</template>
</el-table-column>
<el-table-column width="120" align="center" header-align="center" label="电话"
prop="mobile"></el-table-column>
<el-table-column width="80" align="center" header-align="center" label="是否会员"
prop="status">
<template scope="scope">
<span v-if="scope.row.status != 5">否</span>
<span v-if="scope.row.status === 5" style="color: #236eb4">是</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="人员类型" show-overflow-tooltip
prop="personType"></el-table-column>
<el-table-column width="100" align="center" header-align="center" label="在职状态"
prop="userState"></el-table-column>
<el-table-column align="center" header-align="center" label="所属单位" prop="unitname" show-overflow-tooltip
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="审核状态"
prop="status">
<template slot-scope="scope">
<el-tag v-if="scope.row.status==1" type="primary">待协会审核</el-tag>
<el-tag v-if="scope.row.status==2" type="danger">协会拒绝</el-tag>
<el-tag v-if="scope.row.status==3" type="primary">待校工会审核</el-tag>
<el-tag v-if="scope.row.status==4" type="danger">校工会拒绝</el-tag>
<el-tag v-if="scope.row.status==5" type="success">审核通过</el-tag>
</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">
</el-pagination>
</el-row>
</el-card>
</div>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
tabKey: '',
multipleSelection: [],
clubOptions: [],
tabloading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "u.username",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
radioType: 3
},
formRules: {
code: [{required: true, message: '必填', trigger: ['blur', 'change']}],
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subDis: false,
}
},
methods: {
getAge(row) {
if (row.birthday === null || row.birthday === undefined) {
return
}
const birthdayTime = new Date(row.birthday).getTime()
const nowTime = new Date().getTime()
return Math.ceil((nowTime - birthdayTime) / 31536000000)
},
check(flag) {
if (!this.multipleSelection.length) {
this.$notify({
title: '提示',
message: '请先勾选需要进行审核的人员!',
type: 'warning'
});
return
}
this.$confirm('您选择了' + this.multipleSelection.length + '个人,请确定是否' + (flag ? '同意?' : '拒绝?'), '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" === a) {
const ids = this.multipleSelection.map(v => {
return v.id
})
this.subDis = true
$.post(base + "/platform/sys/club/sh/check", {ids: JSON.stringify(ids), flag: flag, type: 2}, (data) => {
this.subDis = false
if (data.code === 0) {
this.$message({
message: '提交成功',
type: 'success'
});
this.multipleSelection = []
this.$refs.multipleTable.clearSelection();
this.doSearch()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
handleSelectionChange(val) {
this.multipleSelection = val;
},
doSearch() {
// this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
}
,
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
}
,
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
}
,
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
}
,
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabloading = true
this.pageForm.type = 2
$.post(base + "/platform/sys/club/sh/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabloading = false
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
async getMyMangeClub() {
const {data} = await $.get("/platform/sys/club/users/getMyMangeClub")
return data
},
},
async created() {
this.clubOptions = await this.getMyMangeClub()
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,265 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<div style="padding-right: 10px">
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend" style="width: 120px;"
v-model="pageForm.searchName">
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-select clearable filterable placeholder="请选择协会"
v-model="pageForm.clubid">
<el-option
:label="item.name"
:value="item.id"
v-for="item in clubOptions">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button @click="doSearch" icon="el-icon-search" type="primary"></el-button>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<vi-title2 title="温馨提醒:如下方没有数据,可能是其他理事成员已审核,审核信息请切换已审核查看">
<template #func>
<el-radio-group @change="(val) => doSearch()" style="margin-right: 6px"
v-model="pageForm.applyType">
<el-radio-button :label="1">申请加入</el-radio-button>
<el-radio-button :label="2">申请退会</el-radio-button>
</el-radio-group>
<el-radio-group @change="(val) => doSearch()" style="margin-right: 6px"
v-model="pageForm.radioType">
<el-radio-button label="1">全部</el-radio-button>
<el-radio-button label="2">已审核</el-radio-button>
<el-radio-button label="3">未审核</el-radio-button>
</el-radio-group>
<el-button :disabled="subDis" @click="check(true)" icon="el-icon-check" plain
type="success">通过
</el-button>
<el-button :disabled="subDis" @click="check(false)" icon="el-icon-close"
plain type="danger">不通过
</el-button>
</template>
</vi-title2>
<el-table :data="tableData" :key="tabKey" @selection-change="handleSelectionChange" @sort-change="pageOrder"
ref="multipleTable"
row-key="id"
style="width: 100%" v-loading="tabloading">
<el-table-column :reserve-selection="true" :selectable="(row, index) => {return row.status === 1 || row.exitStatus === 1}"
type="selection"
v-if="pageForm.radioType !== '2'"
width="55">
</el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="协会名称" show-overflow-tooltip sortable
prop="clubname"></el-table-column>
<el-table-column width="100" align="center" header-align="center" label="工号" sortable
prop="loginname"></el-table-column>
<el-table-column width="100" align="center" header-align="center" label="姓名" sortable
prop="username"></el-table-column>
<el-table-column width="80" align="center" header-align="center" label="性别" prop="sex" sortable
></el-table-column>
<el-table-column width="60" align="center" header-align="center" label="年龄"
prop="birthday">
<template scope="scope">
<span>{{getAge(scope.row)}}</span>
</template>
</el-table-column>
<el-table-column width="120" align="center" header-align="center" label="电话"
prop="mobile"></el-table-column>
<el-table-column width="80" align="center" header-align="center" label="是否会员"
prop="status">
<template scope="scope">
<span v-if="scope.row.status != 5">否</span>
<span v-if="scope.row.status === 5" style="color: #236eb4">是</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="人员类型" show-overflow-tooltip
prop="personType"></el-table-column>
<el-table-column width="100" align="center" header-align="center" label="在职状态"
prop="userState"></el-table-column>
<el-table-column align="center" header-align="center" label="所属单位" prop="unitname" show-overflow-tooltip
sortable></el-table-column>
<el-table-column v-if="pageForm.applyType === 1" align="center" header-align="center" label="入会状态"
prop="status">
<template slot-scope="scope">
<el-tag type="primary" v-if="scope.row.status==1">待社团审核</el-tag>
<el-tag type="danger" v-if="scope.row.status==2">社团不通过</el-tag>
<el-tag type="primary" v-if="scope.row.status==3">待校工会审核</el-tag>
<el-tag type="danger" v-if="scope.row.status==4">校工会不通过</el-tag>
<el-tag type="success" v-if="scope.row.status==5">审核通过</el-tag>
</template>
</el-table-column>
<el-table-column v-if="pageForm.applyType === 2" align="center" header-align="center" label="退会状态"
prop="exitStatus">
<template slot-scope="scope">
<el-tag type="primary" v-if="scope.row.exitStatus==1">待社团审核</el-tag>
<el-tag type="danger" v-if="scope.row.exitStatus==2">社团不通过</el-tag>
<el-tag type="primary" v-if="scope.row.exitStatus==3">待校工会审核</el-tag>
<el-tag type="danger" v-if="scope.row.exitStatus==4">校工会不通过</el-tag>
<el-tag type="success" v-if="scope.row.exitStatus==5">审核通过</el-tag>
</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">
</el-pagination>
</el-row>
</el-card>
</div>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
tabKey: '',
multipleSelection: [],
clubOptions: [],
tabloading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "u.username",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
radioType: 3,
applyType: 1,
},
formRules: {
code: [{required: true, message: '必填', trigger: ['blur', 'change']}],
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subDis: false,
}
},
methods: {
getAge(row) {
if (row.birthday === null || row.birthday === undefined) {
return
}
const birthdayTime = new Date(row.birthday).getTime()
const nowTime = new Date().getTime()
return Math.ceil((nowTime - birthdayTime) / 31536000000)
},
check(flag) {
if (!this.multipleSelection.length) {
this.$notify({
title: '提示',
message: '请先勾选需要进行审核的人员!',
type: 'warning'
});
return
}
const ids = this.multipleSelection.map(v => {
return v.id
})
this.subDis = true
$.post(base + "/platform/sys/club/sh/check", {
ids: JSON.stringify(ids),
flag: flag,
type: 1,
applyType: this.pageForm.applyType,
}, (data) => {
this.subDis = false
if (data.code === 0) {
this.$message({
message: '提交成功',
type: 'success'
});
this.multipleSelection = []
this.$refs.multipleTable.clearSelection();
this.doSearch()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
handleSelectionChange(val) {
this.multipleSelection = val;
},
doSearch() {
// this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
}
,
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
}
,
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
}
,
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
}
,
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabloading = true
this.pageForm.type = 1
$.post(base + "/platform/sys/club/sh/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabloading = false
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
async getMyMangeClub() {
const {data} = await $.get("/platform/sys/club/users/getMyMangeClub")
return data
},
},
async created() {
this.clubOptions = await this.getMyMangeClub()
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,455 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.w-e-text-container {
height: 200px !important;
}
input[type="file"] {
display: none
}
.el-descriptions :not(.is-bordered) .el-descriptions-item__cell {
width: 10%;
}
.el_tab {
margin-top: 6px;
}
.el-table-container {
padding-left: 0;
}
.el-table-container {
padding-top: 6px;
padding-right: 0px;
}
.el-tabs--card>.el-tabs__header .el-tabs__nav {
border: none;
}
.el-tabs__header {
margin: 0 0 6px;
background-color: white;
}
.el-tabs--card>.el-tabs__header .el-tabs__item {
border-bottom: none;
font-weight: bold;
font-size: 15px;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<div id="app" v-cloak>
<guava>
<transition name="el-zoom-in-center">
<div v-show="v=='index'" style="width: 100%;height: 100%;padding-right: 10px">
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 120px;">
<el-option label="协会名称" value="club.name"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
</el-card>
<el-tabs class="el-table-container el_tab" v-model="activeName" stretch @tab-click="handleClick" type="card">
<el-tab-pane :label="'可加入协会' + noJoinCount" name="false">
</el-tab-pane>
<el-tab-pane :label="'已加入协会' + hasJoinCount" name="true">
</el-tab-pane>
</el-tabs>
<el-row class="el-table-container" style="padding-top: 0">
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder">
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="协会名称" width="250px"
prop="name"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="协会编码" width="100px"
show-overflow-tooltip
prop="code"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="联系人" show-overflow-tooltip
prop="fzrname"></el-table-column>
<el-table-column align="center" header-align="center" label="联系人电话" show-overflow-tooltip
prop="fzr_mobile"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="联系人单位" show-overflow-tooltip
prop="fzr_unit_name"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="限定人数"
show-overflow-tooltip
prop="number"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="当前人数"
show-overflow-tooltip
prop="cynum"></el-table-column>
<el-table-column align="center" header-align="center" label="在职人数" show-overflow-tooltip
prop="worknum"></el-table-column>
<el-table-column align="center" header-align="center" label="退休人数" show-overflow-tooltip
prop="outnum"></el-table-column>
<el-table-column align="center" v-if="activeName=='true'" header-align="center" label="入会状态" sortable>
<template slot-scope="scope">
<el-tag v-if="scope.row.status==1" type="primary">待协会审核</el-tag>
<el-tag v-if="scope.row.status==2" type="danger">协会拒绝</el-tag>
<el-tag v-if="scope.row.status==3" type="primary">待校工会审核</el-tag>
<el-tag v-if="scope.row.status==4" type="danger">校工会拒绝</el-tag>
<el-tag v-if="scope.row.status==5" type="success">审核通过</el-tag>
</template>
</el-table-column>
<el-table-column align="center" v-if="activeName=='true'" header-align="center" label="退会状态" sortable>
<template slot-scope="scope">
<el-tag type="primary" v-if="scope.row.exitstatus==1">待社团审核</el-tag>
<el-tag type="danger" v-if="scope.row.exitstatus==2">社团不通过</el-tag>
<el-tag type="primary" v-if="scope.row.exitstatus==3">待校工会审核</el-tag>
<el-tag type="danger" v-if="scope.row.exitstatus==4">校工会不通过</el-tag>
<el-tag type="success" v-if="scope.row.exitstatus==5">审核通过</el-tag>
<el-tag type="success" v-if="!scope.row.exitstatus">暂无</el-tag>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="250px">
<template slot-scope="scope">
<el-button size="mini" @click="openDetail(scope.row.id)">查看</el-button>
<el-button size="mini" v-if="activeName=='false'" type="primary" @click="doSubmit(scope.row)">
申请加入
</el-button>
<el-button size="mini" v-if="activeName=='true'&&scope.row.status==1" type="danger"
@click="doRevocation(scope.row.id)">
撤销加入申请
</el-button>
<el-button size="mini" v-if="activeName=='true' && scope.row.status==5 && !scope.row.exitstatus" type="primary" @click="exitClub(scope.row)">
申请退会
</el-button>
<el-button size="mini" v-if="activeName=='true' && scope.row.status!=1 && scope.row.exitstatus==1"
type="danger"
@click="cancelExitClub(scope.row.id)">
撤销退会申请
</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@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"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</div>
</transition>
<transition name="el-zoom-in-center">
<div v-show="v=='view'" style="width: 100%;padding-right: 10px">
<el-card class="box-card v-box" shadow="never">
<div slot="header" class="clearfix">
<el-button icon="el-icon-back" type="text" @click="v='index'" style="font-size: 18px">返回
</el-button>
</div>
<div style="padding: 0 10%;height: calc(100vh - 150px);overflow: auto">
<vi-title title="协会信息"></vi-title>
<el-descriptions class="margin-top" title="" :column="3" border>
<el-descriptions-item span="3">
<template slot="label">协会名称</template>
<div v-html="detailData.name"></div>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">协会联系人</template>
{{detailData.fzrname}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">所在单位</template>
{{detailData.fzr_unit_name}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">联系人电话</template>
{{detailData.fzr_mobile}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">联系人邮箱</template>
{{detailData.fzr_email}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">成立时间</template>
{{detailData.create_time}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">会费标准</template>
{{detailData.dues_standard}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">介绍链接</template>
<span style="cursor: pointer; color: #236eb4"
@click="window.open(detailData.introduce_href.indexOf('http') !== -1 ? detailData.introduce_href : 'https://' + detailData.introduce_href)">{{detailData.introduce_href}}</span>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">限定人数</template>
{{detailData.number}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">当前人数</template>
{{detailData.cynum}}
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">协会介绍</template>
<div class="text-left" v-html="detailData.stjs"></div>
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">协会章程</template>
<div class="text-left" v-html="detailData.stzc"></div>
</el-descriptions-item>
</el-descriptions>
</div>
</el-card>
</div>
</transition>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
v: 'index',
detailData: {},
activeNames: [],
activeName: 'false',
addDialogVisible: false,
tabloading: false,
viewDialogVisible: false,
formData: {},
tableData: [],
pageForm: {
isjr: false,
searchName: "club.name",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formRules: {
users: [{required: true, message: '必选', trigger: ['blur', 'change']}],
isjf: [{required: true, message: '必选', trigger: ['blur', 'change']}],
},
subDis: false,
hasJoinCount: 0,
noJoinCount: 0,
}
},
methods: {
exitClub(row) {
this.$confirm('您确定要申请退会吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {//确认后再执行
const resp = await $.post('/platform/sys/club/sq/exitClub', {id: row.id})
if (resp.code === 0) {
await this.getCount()
this.pageData()
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
}
}
});
},
cancelExitClub(id) {
this.$confirm('您确定要撤销申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {//确认后再执行
const resp = await $.post('/platform/sys/club/sq/cancelExitClub', {id: id})
if (resp.code === 0) {
await this.getCount()
this.pageData()
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
}
}
});
},
doRevocation(id) {
this.$confirm('是否撤销申请?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" === a) {//确认后再执行
$.post(base + "/platform/sys/club/sq/revocation", {id}, (data) => {
if (data.code === 0) {
this.$message({
message: '撤销申请成功!',
type: 'success'
});
this.pageData();
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
async doSubmit(row) {
//当前人数+待审核人数
const num = row.cynum + row.approvalnum
if (num >= row.number) {
const str = '抱歉,该协会限定人数<span style="color: red">' + row.number + '</span>人,' +
'当前人数<span style="color: red">' + row.cynum + '</span>人,' +
'待审核人数<span style="color: red">' + row.approvalnum + '</span>人,名额不足!'
this.$alert(str, '提示', {
dangerouslyUseHTMLString: true,
type: 'warning'
});
return;
}
const {code, data} = await $.post('/platform/sys/club/sq/getInClubByCurUser')
let str = '您还没有参加协会'
if (data && data.length > 0) {
str = '您已经加入了'
data.forEach((item) => {
str += '【' + item.name + '】'
})
}
str += ',请确认是否申请加入【' + row.name + '】?'
this.$confirm(str, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" === a) {//确认后再执行
const id = row.id
$.post(base + "/platform/sys/club/sq/submit", {id}, (data) => {
if (data.code === 0) {
this.$message({
message: '提交申请成功!',
type: 'success'
});
this.pageData();
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
openDetail(id) {
$.get(base + "/platform/sys/club/mange/findOne", {id}, (data) => {
if (data.code === 0) {
this.detailData = data.data
this.activeNames = ['1']
this.v = 'view'
this.viewDialogVisible = true
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
handleClick(tab, event) {
this.pageForm.searchKeyword = ''
this.pageForm.isjr = tab.name
this.tableData = []
this.doSearch()
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabloading = true
$.post(base + "/platform/sys/club/sq/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabloading = false
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
async getCount() {
const resp = await $.post('/platform/sys/club/sq/getCount')
this.hasJoinCount = resp.data.hasJoinCount
this.noJoinCount = resp.data.noJoinCount
}
},
async created() {
await this.getCount()
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,352 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.w-e-text-container {
height: 200px !important;
}
input[type="file"] {
display: none
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend" style="width: 120px;"
v-model="pageForm.searchName">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-select filterable placeholder="请选择协会"
v-model="pageForm.clubid">
<el-option
:label="item.name"
:value="item.id"
v-for="item in clubOptions">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button @click="doSearch" icon="el-icon-search" type="primary"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button @click="openAdd" icon="el-icon-plus">添加成员</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" @sort-change="pageOrder" row-key="id" style="width: 100%"
v-loading="tabloading">
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="工号"
prop="loginname"></el-table-column>
<el-table-column align="center" header-align="center" label="姓名"
prop="username"></el-table-column>
<el-table-column align="center" header-align="center" label="性别" prop="sex" sortable
width="150px"></el-table-column>
<el-table-column align="center" header-align="center" label="电话"
prop="mobile"></el-table-column>
<el-table-column align="center" header-align="center" label="所属单位" prop="unitname"
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="是否缴费" prop="isjf" sortable
width="150px">
<template slot-scope="scope">
<el-tooltip content="已缴费" placement="top" v-if="scope.row.isjf">
<i class="fa fa-circle text-success ml5"></i>
</el-tooltip>
<el-tooltip content="未缴费" placement="top" v-else>
<i class="fa fa-circle text-danger ml5"></i>
</el-tooltip>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="人员身份" prop="sf">
<template slot-scope="scope">
<el-lable v-if="scope.row.sf==1">负责人</el-lable>
<el-lable v-if="scope.row.sf==2">成员</el-lable>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="协会名称"
prop="clubname"></el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作">
<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:'del',data:scope.row}" v-if="scope.row.sf==2">
移出协会
</el-dropdown-item>
<el-dropdown-item :command="{type:'jf',jf:true,data:scope.row}">
已缴费
</el-dropdown-item>
<el-dropdown-item :command="{type:'jf',jf:false,data:scope.row}">
未缴费
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<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">
</el-pagination>
</el-row>
<el-dialog
:close-on-click-modal="false"
:visible.sync="addDialogVisible" title="添加成员" width="40%">
<el-form :model="formData" :rules="formRules" label-width="100px"
ref="addForm">
<el-form-item label="成&emsp;&emsp;员" prop="users">
<el-select
:loading="userLoading"
:remote-method="userRemoteMethod"
filterable
multiple
placeholder="请输入姓名或工号查找"
remote
reserve-keyword
style="width: 100%"
v-model="formData.users">
<el-option
:key="item.id"
:label="item.username+'('+item.loginname+')'"
:value="item.id"
v-for="item in userOptions">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="是否缴费" prop="isjf">
<el-radio-group v-model="formData.isjf">
<el-radio border label="true">已缴费</el-radio>
<el-radio border label="false">未缴费</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button :disabled="subDis" @click="doAdd" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
clubOptions: [],
addDialogVisible: false,
tabloading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formRules: {
users: [{required: true, message: '必选', trigger: ['blur', 'change']}],
isjf: [{required: true, message: '必选', trigger: ['blur', 'change']}],
},
subDis: false,
userOptions: [],
userLoading: false,
}
},
methods: {
dropdownCommand: function (command) {
const {type, jf, data} = command
if (type == 'del') {
this.$confirm('确定要将' + data.username + '移出协会吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/club/users/delUser", {
clubid: data.clubid,
userid: data.userid,
}, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
} else if (type == 'jf') {
$.post(base + "/platform/sys/club/users/jf", {
clubid: data.clubid,
userid: data.userid,
jf: jf
}, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
},
doAdd() {
this.$refs["addForm"].validate((valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.post(base + "/platform/sys/club/users/doAddUser", {
clubid: this.pageForm.clubid,
users: JSON.stringify(this.formData.users),
isjf: this.formData.isjf
}, (data) => {
loading.close()
if (data.code == 0) {
this.addDialogVisible = false
this.$message({
message: '添加成功!',
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
async queryUser(clubid, query) {
const {data} = await $.get("/platform/sys/club/users/queryUser", {clubid, query})
return data
},
async userRemoteMethod(query) {
if (query) {
this.userLoading = true
const arr = await this.queryUser(this.pageForm.clubid, query)
this.userOptions = this.userOptions.filter(v => {
return this.formData.users.includes(v.id)
}).concat(arr.filter(v => {
return !this.formData.users.includes(v.id)
}));
this.userLoading = false
}
},
openAdd() {
this.userOptions = []
this.formData = {isjf: 'true'}
this.addDialogVisible = true;
this.$nextTick(() => {
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
})
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabloading = true
$.post(base + "/platform/sys/club/users/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabloading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
async getMyMangeClub() {
const {data} = await $.get("/platform/sys/club/users/getMyMangeClub")
return data
},
},
async created() {
this.clubOptions = await this.getMyMangeClub()
this.$set(this.pageForm, "clubid", this.clubOptions.length ? this.clubOptions[0].id : '')
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,292 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button 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"
@sort-change='pageOrder'
header-align="center"
style="width: 100%">
<el-table-column
header-align="center"
label="参数名"
prop="configKey"
sortable
width="200">
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
header-align="center"
label="参数值"
prop="configValue"
width="200">
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
header-align="center"
label="说明"
prop="note">
</el-table-column>
<el-table-column
label="操作"
prop="note"
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:'edit',id:scope.row.configKey}">
修改
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',id:scope.row.configKey}"
v-if="scope.row.configKey.indexOf('App')<0">
删除
</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="新增参数"
:visible.sync="addDialogVisible"
:close-on-click-modal="false"
width="40%">
<el-form :model="formData" ref="addForm" :rules="formRules" label-width="80px">
<el-form-item prop="configKey" label="参数名">
<el-input maxlength="100" placeholder="参数名"
v-model="formData.configKey"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="configValue" label="参数值">
<el-input maxlength="100" placeholder="参数值"
v-model="formData.configValue"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="note" label="说 明">
<el-input type="textarea" v-model="formData.note"></el-input>
</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>
<el-dialog
title="修改参数"
:visible.sync="editDialogVisible"
:close-on-click-modal="false"
width="40%">
<el-form :model="formData" ref="editForm" :rules="formRules" label-width="80px">
<el-form-item prop="configKey" label="参数名">
<el-input maxlength="100" placeholder="参数名"
v-model="formData.configKey"
auto-complete="off" tabindex="1" type="text" disabled></el-input>
</el-form-item>
<el-form-item prop="configValue" label="参数值">
<div v-if="'true'===formData.configValue||'false'===formData.configValue">
<el-radio-group v-model="formData.configValue">
<el-radio label="true">是</el-radio>
<el-radio label="false">否</el-radio>
</el-radio-group>
</div>
<div v-else>
<el-input maxlength="100" placeholder="参数值"
v-model="formData.configValue"
auto-complete="off" tabindex="2" type="text"></el-input>
</div>
</el-form-item>
<el-form-item prop="note" label="说 明">
<el-input type="textarea" v-model="formData.note"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
data: function () {
return {
addDialogVisible: false,
editDialogVisible: false,
tableData: [],
pageForm:{
pageSize: 10,
pageNumber: 1,
pageOrderName: "",
pageOrderBy: "",
totalCount: 0,
},
formData: {
configKey: "",
configValue: "",
note: ""
},
formRules: {
configKey: [
{required: true, message: '请输入参数名', trigger: 'blur'},
],
configValue: [
{required: true, message: '请输入参数值', trigger: 'blur'},
],
}
}
},
methods: {
openAdd: function () {
this.addDialogVisible = true;
this.formData = {};//打开新增窗口,表单先清空
},
doAdd: function () {
var self = this;
var url = base + "/platform/sys/conf/addDo";
self.$refs["addForm"].validate(function (valid) {
if (valid) {//表单验证通过
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.addDialogVisible = false;
self.pageData();//重新加载分页数据
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
doEdit: function () {
var self = this;
var url = base + "/platform/sys/conf/editDo";
self.$refs["editForm"].validate(function (valid) {
if (valid) {
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.editDialogVisible = false;
self.pageData();//重新加载分页数据
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
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/conf/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");
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("edit" == command.type) {
$.post(base + "/platform/sys/conf/edit/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.editDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除 ' + command.id, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/conf/delete/" + command.id, {}, 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,317 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.bg_box {
width: 575px;
height: 157px;
position: relative;
float: left;
box-shadow: 0 0 5px #666;
background: url(https://img.alicdn.com/tfs/TB1kd3jr3mTBuNjy1XbXXaMrVXa-250-230.png), url(https://img.alicdn.com/tfs/TB10DxPskCWBuNjy0FaXXXUlXXa-552-233.png);
background-size: 22%;
background-position: 100% 100%, 0 0;
background-repeat: no-repeat, repeat;
z-index: 9;
}
.bg_box .item_coupon_box .item_coupon_bg {
width: 63px;
height: 20px;
transform: skew(-16deg);
border: 1px solid #ff8a00;
border-radius: 2px;
position: relative;
overflow: hidden;
margin: 20px 0 0 20px;
}
.bg_box .item_coupon_box .item_price i {
font-style: normal;
font-size: 18px;
}
.bg_box .item_coupon_box .item_price span {
font-size: 40px;
}
.bg-box-content {
margin: 20px 20px;
}
.bg_box .item_coupon_box .item_coupon {
width: 63px;
height: 20px;
line-height: 20px;
text-align: center;
color: #ff8a00;
position: absolute;
top: 22px;
left: 20px;
overflow: hidden;
font-size: 12px;
}
.bg_box .item_coupon_box .item_price {
height: 40px;
line-height: 50px;
margin-left: 20px;
color: #ff8a00;
font-size: 14px;
letter-spacing: 2px;
}
.bg_box .item_limited {
width: 200px;
height: 157px;
margin-left: 350px;
top: -80px;
position: relative;
overflow: hidden;
float: left;
z-index: 9999;
}
.bg_box .item_limited .item_limited_url a{
display: block;
width: 160px;
height: 40px;
line-height: 40px;
text-align: center;
overflow: hidden;
font-size: 16px;
background: #00c1de;
color: #fff;
cursor: pointer;
}
.bg_box .item_coupon_box .item_desc {
width: 350px;
height: 36px;
line-height: 40px;
font-size: 14px;
color: #333;
margin-left: 20px;
overflow: hidden;
}
.bg-box-content2 {
width: 800px;
margin: 10px auto;
}
.wk a {
font-size: 12px;
text-decoration: none;
}
.bg-box-content-bywave {
margin: 20px 20px;
}
.bg_box-bywave .item_limited{
width: 200px;
height: 157px;
margin-left: 350px;
position: relative;
overflow: hidden;
float: left;
z-index: 9999;
top:-10px;
}
.bg_box-bywave .item_limited .item_bywave_url a{
display: block;
width: 160px;
height: 40px;
line-height: 40px;
text-align: center;
overflow: hidden;
font-size: 16px;
background: #fc68a6;
border: #fc68a6;
color: #fff;
cursor: pointer;
text-decoration: none;
}
.bg_box-bywave {
width: 575px;
height: 157px;
position: relative;
float: left;
box-shadow: 0 0 5px #666;
background-size: 22%;
background-position: 100% 100%, 0 0;
background-repeat: no-repeat, repeat;
z-index: 9;
}
.bg_box-bywave .text-title {
font-family: 'Poppins', sans-serif;
text-transform: uppercase;
font-weight: bold;
font-size: 35px;
letter-spacing: 1px;
margin-bottom: 10px;
color: #2f3538;
position: relative;
padding-left: 20px;
padding-top: 20px;
}
.bg_box-bywave .text-title span {
display: block;
font-size: 14px;
text-transform: capitalize;
font-weight: 500;
letter-spacing: 0;
font-family: 'Quicksand', sans-serif;
margin-bottom: 10px;
color: #aebfc7;
}
</style>
<div id="app" v-cloak>
<div class="el-row" style="padding: 20px;margin-bottom: 20px;display: flex;">
<div class="bg-box-content">
<div class="bg_box" style="position: relative;">
<div class="item_coupon_box">
<div class="item_coupon_bg"></div>
<div class="item_coupon">通用红包</div>
<div class="item_price">阿里云 ¥ </i><span>2000</span></div>
<p class="item_desc">云产品通用红包,可叠加官网常规优惠使用
</p>
</div>
<div class="item_limited">
<span class="item_limited_url"><a
href='https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=jfp1pk7u'
target='_blank'>立即领取</a></span>
</div>
</div>
</div>
<div class="bg-box-content-bywave">
<div class="bg_box-bywave" style="position: relative;">
<div class="text-title">
<span> 总是想窥探这个世界,却求而不得</span>现在有一把钥匙就在眼前
</div>
<div class="item_limited"><span class="item_bywave_url"><a
href="https://bywave.io/aff.php?aff=3368"
target="_blank"
>现在开始</a></span></div>
</div>
</div>
</div>
<el-row>
<el-col span="10">
<el-timeline :reverse="reverse" style="margin-top:10px;">
<el-timeline-item
v-for="(activity, index) in activities"
:key="index"
:timestamp="activity.timestamp"
:icon="activity.icon"
:type="activity.type"
:color="activity.color"
:size="activity.size"
>
{{ activity.content }}
</el-timeline-item>
</el-timeline>
</el-col>
<el-col span="14">
<el-alert
style="padding:10px 0 10px 0;"
title="物联网卡(三大运营商4G卡、NB卡),全网最低价,微信号:LJL568"
type="success"
close-text="知道了"
></el-alert>
<el-alert
style="padding:10px 0 10px 0;"
title="短信平台(通知类短信、营销类短信),全网最低价,微信号:LJL568"
type="warning"
close-text="知道了"
></el-alert>
<el-alert
style="padding:10px 0 10px 0;"
title="BudWk 系列软件订制开发、培训、合作,可联系作者,QQ:11624317,微信号:wizzer ,QQ交流群:24457628"
type="error"
close-text="知道了"
></el-alert>
<el-row class="wk">
<el-row style="margin-top:20px;">
<span>BudWk v6 源码地址</span>
</el-row>
<el-row style="margin-top:20px;">
<span><a href="https://github.com/budwk/budwk-nutzboot" target="_blank">https://github.com/budwk/budwk-nutzboot</a></span>
</el-row>
<el-row style="margin-top:20px;">
<span><a href="https://gitee.com/budwk/budwk-nutzboot" target="_blank">https://gitee.com/budwk/budwk-nutzboot</a></span>
</el-row>
<el-row style="margin-top:30px;">
<span>NutzWk v1 - v5 源码地址</span>
</el-row>
<el-row style="margin-top:20px;">
<span><a href="https://github.com/Wizzercn/NutzWk" target="_blank">https://github.com/Wizzercn/NutzWk</a></span>
</el-row>
<el-row style="margin-top:20px;">
<span><a href="https://gitee.com/Wizzer/NutzWk" target="_blank">https://gitee.com/Wizzer/NutzWk</a></span>
</el-row>
</el-row>
</el-col>
</el-row>
</div>
<script>
new Vue({
el: '#app',
data: function () {
return {
showDialog: false,
loading: false,
reverse: true,
activities: [
{
content: 'NutzWk V1.0.1 - 单应用 + EasyUI 发布',
timestamp: '2015-06'
},
{
content: 'NutzWk V3.0.0 - 单应用 + Bootstrap 发布',
timestamp: '2016-07'
},
{
content: 'NutzWk V4.0.1 - 模块化 + Bootstrap 发布',
timestamp: '2017-02'
},
{
content: 'NutzWk V5.0.1 - 微服务 + Bootstrap 发布',
timestamp: '2018-03'
},
{
content: 'NutzWk V5.1.0 - 微服务 + Vue ElemnetUI js混合开发 发布',
timestamp: '2018-11'
},
{
content: 'NutzWk 更名为 BudWk',
timestamp: '2019-12',
color: '#0bbd87'
},
{
content: 'BudWk V6.0.1 - 微服务 + Vue ElemnetUI 前后端完全分离 发布',
timestamp: '2020-01',
size: 'large',
type: 'primary',
icon: 'el-icon-more'
}
]
}
},
methods: {
open:function () {
this.showDialog=true
}
},
created: function () {
}
})
</script>
<style scoped>
</style>
<!--# } #-->
@@ -0,0 +1,429 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-button @click="openAdd" size="medium">
<i class="ti-plus"></i>
新建字典
</el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button @click="openSort" size="medium">
排序
</el-button>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<el-table :data="tableData" :highlight-current-row="true" :key="tableKey"
:load="loadChild" lazy row-key="id"
style="width: 100%">
<el-table-column :show-overflow-tooltip="true" align="left" header-align="center"
label="字典名称" prop="name" width="200">
</el-table-column>
<el-table-column :show-overflow-tooltip="true" header-align="center" label="字典代码"
prop="code">
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center" label="启用状态"
prop="disabled">
<template slot-scope="scope">
<i class="fa fa-circle text-danger ml5"
v-if="scope.row.disabled"></i>
<i class="fa fa-circle text-success ml5"
v-if="!scope.row.disabled"></i>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center"
label="操作" prop="website" 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:'add',id:scope.row.id,name:scope.row.name}">
添加子级
</el-dropdown-item>
<el-dropdown-item
:command="{type:'enable',id:scope.row.id,name:scope.row.name,row:scope.row}"
divided>
启用
</el-dropdown-item>
<el-dropdown-item
:command="{type:'disable',id:scope.row.id,name:scope.row.name,row:scope.row}">
禁用
</el-dropdown-item>
<el-dropdown-item :command="{type:'edit',id:scope.row.id,name:scope.row.name}"
divided>
修改
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',id:scope.row.id,name:scope.row.name}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-card>
</guava>
<el-dialog
title="新建字典"
:visible.sync="addDialogVisible"
:close-on-click-modal="false"
width="50%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="parentId" label="上级字典" label-width="80px">
<el-cascader v-if="!isAddFromSub" :props="props" :options="menuOptions" v-model="parentMenu"
placeholder="不选择则为顶级" style="width: 100%"></el-cascader>
<el-input v-if="isAddFromSub" type="text" v-model="formData.parentName" :disabled="true"></el-input>
</el-form-item>
<el-form-item prop="name" label="字典名称">
<el-input maxlength="100" placeholder="字典名称"
v-model="formData.name"
auto-complete="off" tabindex="3" type="text"></el-input>
</el-form-item>
<el-form-item prop="code" label="字典代码">
<el-input maxlength="100" placeholder="字典代码"
v-model="formData.code"
auto-complete="off" tabindex="5" type="text"></el-input>
</el-form-item>
<el-form-item prop="disabled" label="启用状态">
<el-switch
v-model="formData.disabled"
active-color="#ff4949"
inactive-color="#13ce66">
</el-switch>
</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>
<el-dialog
title="修改字典"
:visible.sync="editDialogVisible"
:close-on-click-modal="false"
width="50%">
<el-form :model="formData" ref="editForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="name" label="字典名称">
<el-input maxlength="100" placeholder="字典名称"
v-model="formData.name"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="code" label="字典代码">
<el-input maxlength="100" placeholder="字典代码"
v-model="formData.code"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="disabled" label="启用状态">
<el-switch
v-model="formData.disabled"
active-color="#ff4949"
inactive-color="#13ce66">
</el-switch>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
<el-dialog
title="字典排序"
:visible.sync="sortDialogVisible"
width="50%">
<el-tree
ref="sortMenuTree"
:data="sortMenuData"
draggable
:allow-drop="sortAllowDrop"
node-key="id"
:props="defaultProps"
>
<span class="custom-tree-node" slot-scope="scope">
<span>{{ scope.node.label }}</span>
</span>
</el-tree>
<span slot="footer" class="dialog-footer">
<el-button @click="sortDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doSort">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
data: function () {
return {
addDialogVisible: false,
editDialogVisible: false,
sortDialogVisible: false,
isAddFromSub: false,
tableData: [],//后台取出的数据
tableKey: "",
formData: {
id: "",
parentId: "",
parentName: "",
type: "menu",
target: "data-pjax",
children: "false",
},
formRules: {
name: [
{required: true, message: '字典名称', trigger: 'blur'}
],
code: [
{required: true, message: '字典代码', trigger: ['blur', 'change']}
]
},
menuOptions: [],
props: {
lazy: true,
checkStrictly: true,
multiple: false,
lazyLoad: function (node, resolve) {
var url = base + "/platform/sys/dict/tree";
$.post(url, {pid: node.value}, function (data) {
if (data.code == 0) {
resolve(data.data);
}
}, "json");
}
},
parentMenu: [],
sortMenuData: [],
defaultProps: {
children: 'children',
label: 'label'
},
}
},
methods: {
//排序树加载
sortMenuLoad: function () {
var self = this;
$.post(base + "/platform/sys/dict/menuAll", {}, function (data) {
if (data.code == 0) {
self.sortMenuData = data.data;
}
}, "json");
},
//排序树控制不可跨级拖拽
sortAllowDrop: function (moveNode, inNode, type) {
if (moveNode.data.parentId == inNode.data.parentId) {
return type == 'prev';
}
},
//打开排序功能
openSort: function () {
this.sortDialogVisible = true;
this.sortMenuLoad();
},
//递归获取所有的ID值
getTreeIds: function (ids, data) {
var self = this;
data.forEach(function (obj) {
ids.push(obj.id);
if (obj.children && obj.children.length > 0) {
self.getTreeIds(ids, obj.children);
}
});
},
//提交排序后的数据
doSort: function () {
var self = this;
var ids = [];
self.getTreeIds(ids, self.sortMenuData);
$.post(base + "/platform/sys/dict/sortDo", {ids: ids.toString()}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.sortDialogVisible = false;
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
openAdd: function () {
var self = this;
self.isAddFromSub = false;
self.addDialogVisible = true;
self.parentMenu = [];
self.menuOptions = [];
//表单还原为初始值
self.formData = {
id: "",
parentId: "",
parentName: "",
type: "menu",
target: "data-pjax",
children: "false",
};
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
},
doAdd: function () {
var self = this;
var url = base + "/platform/sys/dict/addDo";
self.$refs["addForm"].validate(function (valid) {
if (valid) {//表单验证通过
if (!self.isAddFromSub) {//如果不是添加子菜单,则从级联选择框取父节点ID
self.formData.parentId = self.parentMenu[self.parentMenu.length - 1] || "";
}
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.addDialogVisible = false;
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
doEdit: function () {
var self = this;
var url = base + "/platform/sys/dict/editDo";
self.$refs["editForm"].validate(function (valid) {
if (valid) {//表单验证通过
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.editDialogVisible = false;
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
initTreeTable: function () {
var self = this;
var url = base + "/platform/sys/dict/child";
$.post(url, {pid: ""}, function (data) {
if (data.code == 0) {
self.tableData = data.data;
self.tableKey = +new Date();
}
}, "json");
},
loadChild: function (tree, treeNode, resolve) {
var url = base + "/platform/sys/dict/child";
$.post(url, {pid: tree.id}, function (data) {
if (data.code == 0) {
resolve(data.data);
}
}, "json");
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("add" == command.type) {
self.openAdd();
self.formData.parentId = command.id;
self.formData.parentName = command.name;
self.isAddFromSub = true;
}
if ("edit" == command.type) {
$.post(base + "/platform/sys/dict/edit/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.editDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("enable" == command.type || "disable" == command.type) {
$.post(base + "/platform/sys/dict/" + command.type + "/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
if ("disable" == command.type) {
command.row.disabled = true;
}
if ("enable" == command.type) {
command.row.disabled = false;
}
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除 ' + command.name, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/dict/delete/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
}
},
created: function () {
this.initTreeTable();
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,209 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<!-- <el-card shadow="never">
</el-card>-->
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="模块中心">
<template #func>
<el-button size="small" type="primary" @click="openAdd">添加模块</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
align="center"
header-align="center">
<!--<el-table-column :index="indexMethod" align="center" header-align="center" label="序号" type="index"
width="80px"></el-table-column>-->
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='icon'">
<el-image
lazy
@click="viewImage(row.icon[0].id)"
style="height: 30px;width: 30px"
:src="APP_DOMAIN+FILE_STREAM_PREVIEW_ADDRESS+'?id='+row.icon[0].id"
fit="cover">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
</template>
<template scope="{row}" v-else-if="column.prop=='containsMenu'">
{{firstMenus.filter(v=>row.containsMenu.includes(v.id)).map(v=>v.name).join('、')}}
</template>
</el-table-column>
<el-table-column label="操作" width="200px">
<template scope="{row}">
<el-button @click="openEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<template #edit>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="form">
<el-form-item label="模块名称" prop="moduleName">
<el-input v-model="formData.moduleName" maxlength="8"></el-input>
</el-form-item>
<el-form-item label="模块图标" prop="icon">
<file-upload max="1" :type="['png']" :files.sync="formData.icon"></file-upload>
</el-form-item>
<el-form-item label="包含菜单" prop="containsMenu">
<el-checkbox-group v-model="formData.containsMenu">
<el-checkbox v-for="item in firstMenus" :label="item.id">
{{item.name}}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="排序编号" prop="sortNum">
<el-input-number v-model="formData.sortNum" :min="1" :precision="0"></el-input-number>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()">取消</el-button>
<el-button type="primary" @click="doSubmit">确定</el-button>
</el-row>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
formDialogVisible: false,
formData: {
id: null,
moduleName: null,
icon: [],
containsMenu: [],
sortNum: null
},
formRules: {
moduleName: [{required: true, message: '请填写', trigger: ['blur', 'change']}],
icon: [{required: true, message: '请填写', trigger: ['blur', 'change']}],
containsMenu: [{required: true, message: '请选择', trigger: ['blur', 'change']}],
sortNum: [{required: true, message: '请输入', trigger: ['blur', 'change']}],
},
firstMenus: [],
tableColumns: [
{label: '排序编号', prop: 'sortNum', sortable: true},
{label: '模块名称', prop: 'moduleName'},
{label: '模块图标', prop: 'icon'},
{label: '包含菜单', prop: 'containsMenu'}
]
}
},
watch: {
'formData.icon'(val) {
this.$refs.form.validateField('icon', (errMsg) => {
console.log(errMsg)
})
}
},
methods: {
openAdd() {
if (this.$refs.form) {
this.$refs.form.resetFields()
}
this.formData = {
id: null,
moduleName: null,
icon: [],
containsMenu: [],
sortNum: this.tableData.length + 1
}
this.$refs.guava.edit()
},
async findFirstMenus() {
const resp = await $.get(loc() + '/findFirstMenus')
if (resp.code === 0) {
this.firstMenus = resp.data
}
},
async doSubmit() {
const valid = await this.$refs.form.validate()
if (!valid) return
const {id} = this.formData
const url = loc() + (id ? '/doEdit' : '/doAdd')
const resp = await $.post(url, {entranceModule: JSON.stringify(this.formData)})
if (resp.code === 0) {
this.pageData()
this.notifySuccess(resp.msg)
this.$refs.guava.index()
if (headerNavBarVueApp) {
headerNavBarVueApp.init()
}
} else {
this.notifyWarning(resp.msg)
}
},
async pageData() {
sublime.showLoadingbar()
const resp = await $.post(loc() + '/pageData')
sublime.closeLoadingbar()
if (resp.code === 0) {
this.tableData = resp.data
} else {
this.notifyWarning(resp.msg)
}
},
async doDelete(id) {
const confirm = await this.$confirm('您确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm !== 'confirm') return
const resp = await $.post(loc() + '/doDelete/' + id)
if (resp.code === 0) {
this.doSearch()
this.notifySuccess(resp.msg)
if (headerNavBarVueApp) {
headerNavBarVueApp.init()
}
} else {
this.notifyWarning(resp.msg)
}
},
openEdit(row) {
this.$refs.guava.edit()
this.formData = {...row}
this.$nextTick(() => {
this.$refs.form.validateField('icon', (errMsg) => {
console.log(errMsg)
})
})
}
},
created() {
this.pageData()
this.findFirstMenus()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,365 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 120px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.gdhid" style="width: 200px" clearable
placeholder="请选择届次">
<el-option
v-for="item in gdhOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.roleid" style="width: 200px" clearable
placeholder="请选择身份">
<el-option
v-for="item in roles"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button icon="el-icon-plus" @click="openAdd">添加成员</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tabLoading">
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column label="工号" prop="loginname" header-align="center"
align="center"></el-table-column>
<el-table-column label="姓名" prop="username" header-align="center"
align="center"></el-table-column>
<el-table-column label="性别" prop="sex" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="电话" prop="mobile" header-align="center"
align="center"></el-table-column>
<el-table-column label="单位" prop="unitname" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="工代会" prop="gdhname" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="身份" prop="rolecode" header-align="center" sortable
align="center">
<template slot-scope="scope">
{{getRoleName(scope.row.roleid)}}
</template>
</el-table-column>
<el-table-column label="操作" header-align="center" align="center" width="200px">
<template slot-scope="scope">
<el-dropdown placement="bottom" style="margin-left: 10px;">
<el-button type="primary" size="mini">
设置身份<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="item in roles.filter(v => {
return v.id != scope.row.roleid
})"
@click.native="changeRole({userid:scope.row.userid,roleid:item.id,gdhid:scope.row.gdhid})">
{{item.name}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button size="mini" type="danger" @click="doDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@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"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
<el-dialog
title="添加成员"
:visible.sync="addDialogVisible" :close-on-click-modal="false" width="40%">
<el-form :model="formData" ref="addForm" :rules="formRules"
label-width="100px">
<el-form-item label="届&emsp;&emsp;次" prop="gdhid">
<el-select v-model="formData.gdhid" style="width: 100%"
placeholder="请选择工代会">
<el-option
v-for="item in gdhOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="成&emsp;&emsp;员" prop="users">
<el-select
style="width: 100%"
multiple
v-model="formData.users"
filterable
remote
reserve-keyword
placeholder="请输入姓名或工号查找"
:remote-method="userRemoteMethod"
:loading="userLoading">
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.username+'('+item.loginname+')'"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="身&emsp;&emsp;份" prop="roleid">
<el-radio v-model="formData.roleid" v-for="item in roles" :label="item.id">{{item.name}}</el-radio>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" :disabled="subDis" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
var E = window.wangEditor
const vue = new Vue({
el: '#app',
data() {
return {
roles: [],
gdhOptions: [],
addDialogVisible: false,
editDialogVisible: false,
viewDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formRules: {
gdhid: [{required: true, message: '必选', trigger: ['blur', 'change']}],
role: [{required: true, message: '必选', trigger: ['blur', 'change']}],
users: [{type: 'array', required: true, message: '必选', trigger: ['blur', 'change']}],
},
subDis: false,
userOptions: [],
userLoading: false,
fileList: [],
delFiles: [],
}
},
methods: {
changeRole(e) {
$.post(base + "/platform/sys/gdh/ghwyh/changeRole", e, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
getRoleName(roleid) {
const o = this.roles.find(v => {
return v.id == roleid
})
return o ? o.name : ''
},
doDelete(e) {
this.$confirm('确定要移除该人员吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
$.post("/platform/sys/gdh/ghwyh/del", e, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
doAdd() {
this.$refs["addForm"].validate((valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.post(base + "/platform/sys/gdh/ghwyh/addCy", {
gdhid: this.formData.gdhid,
roleid: this.formData.roleid,
users: JSON.stringify(this.formData.users)
}, (data) => {
loading.close()
if (data.code == 0) {
this.addDialogVisible = false
this.$message({
message: '添加成功',
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
async userRemoteMethod(query) {
if (!this.formData.gdhid) {
this.$message('请先选择届次');
return
}
if (query) {
this.userLoading = true
const arr = await this.queryUser(this.formData.gdhid, query)
this.userOptions = this.userOptions.filter(v => {
return this.formData.users.includes(v.id)
}).concat(arr.filter(v => {
return !this.formData.users.includes(v.id)
}));
this.userLoading = false
}
},
async queryUser(gdhid, query) {
const {data} = await $.get("/platform/sys/gdh/ghwyh/queryUser", {gdhid, query})
return data
},
openAdd() {
this.userOptions = []
this.formData = {users: []}
this.addDialogVisible = true;
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
}
,
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
}
,
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
}
,
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
}
,
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
$.post(base + "/platform/sys/gdh/ghwyh/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
async getRoles() {
const {data} = await $.get("/platform/sys/gdh/ghwyh/getRoles")
return data
}
},
async created() {
this.gdhOptions = await getGdh()
this.$set(this.pageForm, "gdhid", this.gdhOptions.length ? this.gdhOptions[0].id : '')
this.pageData();
this.roles = await this.getRoles()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,424 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<div class="block">
<el-date-picker
v-model="pageForm.year"
value-format="yyyy"
formData="yyyy"
type="year"
placeholder="选择年份">
</el-date-picker>
</div>
</div>
<div class="btn-group tool-button mt5">
<el-input placeholder="输入届数" v-model="pageForm.js" style="width: 200px" clearable
@keyup.enter.native="doSearch">
<template slot="prepend">届数</template>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-input placeholder="输入次数" v-model="pageForm.cs" style="width: 200px" clearable
@keyup.enter.native="doSearch">
<template slot="prepend">次数</template>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button icon="el-icon-plus" @click="openAdd">新建工代会</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tabLoading">
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column label="名称" prop="name" header-align="center"
align="center"></el-table-column>
<el-table-column label="年份" prop="year" header-align="center"
align="center"></el-table-column>
<el-table-column label="届数" prop="js" header-align="center"
align="center"></el-table-column>
<el-table-column label="次数" prop="cs" header-align="center"
align="center"></el-table-column>
<el-table-column label="创建时间" prop="create_time" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="开启状态" prop="open" header-align="center" sortable
align="center">
<template slot-scope="scope">
<el-switch v-if="scope.row.open" active-color="#13ce66"
inactive-color="#ff4949" :value="scope.row.open" @change="open(scope.row.id,false)">
</el-switch>
<el-switch v-if="!scope.row.open" active-color="#13ce66"
inactive-color="#ff4949" :value="scope.row.open" @change="open(scope.row.id,true)">
</el-switch>
</template>
</el-table-column>
<el-table-column label="操作" header-align="center"
align="center">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="openEdit(scope.row.id)">编辑</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@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"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
<el-dialog
title="新建工代会"
:visible.sync="addDialogVisible" :close-on-click-modal="false" width="40%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small"
label-width="120px">
<el-form-item label="工代会年份" prop="year">
<el-date-picker
v-model="formData.year"
type="year"
value-format="yyyy"
style="width: 50%"
placeholder="选择年份">
</el-date-picker>
</el-form-item>
<el-form-item label="工代会届数" prop="js">
<el-select v-model="formData.js" style="width: 50%"
placeholder="请选择届数">
<el-option
v-for="item in jsOptions"
:key="item.id"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="工代会次数" prop="cs">
<el-select v-model="formData.cs" style="width: 50%"
placeholder="请选择次数">
<el-option
v-for="item in csOptions"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="工代会描述" prop="ms">
<el-input type="textarea" v-model="formData.ms" maxlength="500" placeholder="请填写描述"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" :disabled="subDis" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
<el-dialog
title="修改工代会"
:visible.sync="editDialogVisible" :close-on-click-modal="false" width="40%">
<el-form :model="formData" ref="editForm" :rules="formRules" size="small"
label-width="120px">
<el-form-item label="工代会年份" prop="year">
<el-date-picker
v-model="formData.year"
type="year"
value-format="yyyy"
style="width: 50%"
placeholder="选择年份">
</el-date-picker>
</el-form-item>
<el-form-item label="工代会届数" prop="js">
<el-select v-model="formData.js" style="width: 50%"
placeholder="请选择届数">
<el-option
v-for="item in jsOptions"
:key="item.id"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="工代会次数" prop="cs">
<el-select v-model="formData.cs" style="width: 50%"
placeholder="请选择次数">
<el-option
v-for="item in csOptions"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="工代会描述" prop="ms">
<el-input type="textarea" v-model="formData.ms" maxlength="500" placeholder="请填写描述"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" :disabled="subDis" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
var E = window.wangEditor
const vue = new Vue({
el: '#app',
data() {
return {
csOptions: [
{name: '第一次', code: '一'},
{name: '第二次', code: '二'},
{name: '第三次', code: '三'},
],
jsOptions: [],
addDialogVisible: false,
editDialogVisible: false,
viewDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "club.name",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formRules: {
year: [{required: true, message: '必选', trigger: ['blur', 'change']}],
js: [{required: true, message: '必选', trigger: ['blur', 'change']}],
cs: [{required: true, message: '必选', trigger: ['blur', 'change']}],
},
subDis: false,
userOptions: [],
userLoading: false,
fileList: [],
delFiles: [],
}
},
methods: {
open(id, open) {
$.post(base + "/platform/sys/gdh/jc/open", {id, open}, (data) => {
if (data.code == 0) {
this.$message({
message: '修改成功',
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
openAdd() {
this.formData = {}
this.addDialogVisible = true;
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
openDetail(id) {
$.get(base + "/platform/sys/club/mange/findOne", {id}, (data) => {
if (data.code == 0) {
this.detailData = data.data
this.activeName = ['1']
this.viewDialogVisible = true
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
doDelete(id) {
this.$confirm('确定要删除该社团吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/club/mange/delete", {id: id}, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
doEdit() {
this.$refs["editForm"].validate((valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.post(base + "/platform/sys/gdh/jc/doEdit", this.formData, (data) => {
loading.close()
if (data.code == 0) {
this.editDialogVisible = false
this.$message({
message: '修改成功',
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
openEdit(id) {
this.formData = {}
$.get(base + "/platform/sys/gdh/jc/findOne", {id}, (data) => {
if (data.code == 0) {
data.data.year = data.data.year + ""
this.formData = data.data
this.editDialogVisible = true
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
doAdd() {
this.$refs["addForm"].validate((valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.post(base + "/platform/sys/gdh/jc/doAdd", this.formData, (data) => {
loading.close()
if (data.code == 0) {
this.addDialogVisible = false
this.$message({
message: '创建成功!',
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
}
,
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
}
,
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
}
,
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
}
,
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
$.post(base + "/platform/sys/gdh/jc/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
,
},
async created() {
this.jsOptions = await getJc()
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,365 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 120px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.gdhid" style="width: 200px" clearable
placeholder="请选择届次">
<el-option
v-for="item in gdhOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.roleid" style="width: 200px" clearable
placeholder="请选择身份">
<el-option
v-for="item in roles"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button icon="el-icon-plus" @click="openAdd">添加成员</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tabLoading">
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column label="工号" prop="loginname" header-align="center"
align="center"></el-table-column>
<el-table-column label="姓名" prop="username" header-align="center"
align="center"></el-table-column>
<el-table-column label="性别" prop="sex" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="电话" prop="mobile" header-align="center"
align="center"></el-table-column>
<el-table-column label="单位" prop="unitname" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="工代会" prop="gdhname" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="身份" prop="rolecode" header-align="center" sortable
align="center">
<template slot-scope="scope">
{{getRoleName(scope.row.roleid)}}
</template>
</el-table-column>
<el-table-column label="操作" header-align="center" align="center" width="200px">
<template slot-scope="scope">
<el-dropdown placement="bottom" style="margin-left: 10px;">
<el-button type="primary" size="mini">
设置身份<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="item in roles.filter(v => {
return v.id != scope.row.roleid
})"
@click.native="changeRole({userid:scope.row.userid,roleid:item.id,gdhid:scope.row.gdhid})">
{{item.name}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button size="mini" type="danger" @click="doDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@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"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
<el-dialog
title="添加成员"
:visible.sync="addDialogVisible" :close-on-click-modal="false" width="40%">
<el-form :model="formData" ref="addForm" :rules="formRules"
label-width="100px">
<el-form-item label="届&emsp;&emsp;次" prop="gdhid">
<el-select v-model="formData.gdhid" style="width: 100%"
placeholder="请选择工代会">
<el-option
v-for="item in gdhOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="成&emsp;&emsp;员" prop="users">
<el-select
style="width: 100%"
multiple
v-model="formData.users"
filterable
remote
reserve-keyword
placeholder="请输入姓名或工号查找"
:remote-method="userRemoteMethod"
:loading="userLoading">
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.username+'('+item.loginname+')'"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="身&emsp;&emsp;份" prop="roleid">
<el-radio v-model="formData.roleid" v-for="item in roles" :label="item.id">{{item.name}}</el-radio>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" :disabled="subDis" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
var E = window.wangEditor
const vue = new Vue({
el: '#app',
data() {
return {
roles: [],
gdhOptions: [],
addDialogVisible: false,
editDialogVisible: false,
viewDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formRules: {
gdhid: [{required: true, message: '必选', trigger: ['blur', 'change']}],
role: [{required: true, message: '必选', trigger: ['blur', 'change']}],
users: [{type: 'array', required: true, message: '必选', trigger: ['blur', 'change']}],
},
subDis: false,
userOptions: [],
userLoading: false,
fileList: [],
delFiles: [],
}
},
methods: {
changeRole(e) {
$.post(base + "/platform/sys/gdh/jfscwyh/changeRole", e, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
getRoleName(roleid) {
const o = this.roles.find(v => {
return v.id == roleid
})
return o ? o.name : ''
},
doDelete(e) {
this.$confirm('确定要移除该人员吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
$.post("/platform/sys/gdh/jfscwyh/del", e, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
doAdd() {
this.$refs["addForm"].validate((valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.post(base + "/platform/sys/gdh/jfscwyh/addCy", {
gdhid: this.formData.gdhid,
roleid: this.formData.roleid,
users: JSON.stringify(this.formData.users)
}, (data) => {
loading.close()
if (data.code == 0) {
this.addDialogVisible = false
this.$message({
message: '添加成功',
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
async userRemoteMethod(query) {
if (!this.formData.gdhid) {
this.$message('请先选择届次');
return
}
if (query) {
this.userLoading = true
const arr = await this.queryUser(this.formData.gdhid, query)
this.userOptions = this.userOptions.filter(v => {
return this.formData.users.includes(v.id)
}).concat(arr.filter(v => {
return !this.formData.users.includes(v.id)
}));
this.userLoading = false
}
},
async queryUser(gdhid, query) {
const {data} = await $.get("/platform/sys/gdh/jfscwyh/queryUser", {gdhid, query})
return data
},
openAdd() {
this.userOptions = []
this.formData = {users: []}
this.addDialogVisible = true;
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
}
,
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
}
,
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
}
,
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
}
,
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
$.post(base + "/platform/sys/gdh/jfscwyh/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
async getRoles() {
const {data} = await $.get("/platform/sys/gdh/jfscwyh/getRoles")
return data
}
},
async created() {
this.gdhOptions = await getGdh()
this.$set(this.pageForm, "gdhid", this.gdhOptions.length ? this.gdhOptions[0].id : '')
this.pageData();
this.roles = await this.getRoles()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,365 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 120px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.gdhid" style="width: 200px" clearable
placeholder="请选择届次">
<el-option
v-for="item in gdhOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.roleid" style="width: 200px" clearable
placeholder="请选择身份">
<el-option
v-for="item in roles"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button icon="el-icon-plus" @click="openAdd">添加成员</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tabLoading">
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column label="工号" prop="loginname" header-align="center"
align="center"></el-table-column>
<el-table-column label="姓名" prop="username" header-align="center"
align="center"></el-table-column>
<el-table-column label="性别" prop="sex" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="电话" prop="mobile" header-align="center"
align="center"></el-table-column>
<el-table-column label="单位" prop="unitname" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="工代会" prop="gdhname" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="身份" prop="rolecode" header-align="center" sortable
align="center">
<template slot-scope="scope">
{{getRoleName(scope.row.roleid)}}
</template>
</el-table-column>
<el-table-column label="操作" header-align="center" align="center" width="200px">
<template slot-scope="scope">
<el-dropdown placement="bottom" style="margin-left: 10px;">
<el-button type="primary" size="mini">
设置身份<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="item in roles.filter(v => {
return v.id != scope.row.roleid
})"
@click.native="changeRole({userid:scope.row.userid,roleid:item.id,gdhid:scope.row.gdhid})">
{{item.name}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button size="mini" type="danger" @click="doDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@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"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
<el-dialog
title="添加成员"
:visible.sync="addDialogVisible" :close-on-click-modal="false" width="40%">
<el-form :model="formData" ref="addForm" :rules="formRules"
label-width="100px">
<el-form-item label="届&emsp;&emsp;次" prop="gdhid">
<el-select v-model="formData.gdhid" style="width: 100%"
placeholder="请选择工代会">
<el-option
v-for="item in gdhOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="成&emsp;&emsp;员" prop="users">
<el-select
style="width: 100%"
multiple
v-model="formData.users"
filterable
remote
reserve-keyword
placeholder="请输入姓名或工号查找"
:remote-method="userRemoteMethod"
:loading="userLoading">
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.username+'('+item.loginname+')'"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="身&emsp;&emsp;份" prop="roleid">
<el-radio v-model="formData.roleid" v-for="item in roles" :label="item.id">{{item.name}}</el-radio>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" :disabled="subDis" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
var E = window.wangEditor
const vue = new Vue({
el: '#app',
data() {
return {
roles: [],
gdhOptions: [],
addDialogVisible: false,
editDialogVisible: false,
viewDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formRules: {
gdhid: [{required: true, message: '必选', trigger: ['blur', 'change']}],
role: [{required: true, message: '必选', trigger: ['blur', 'change']}],
users: [{type: 'array', required: true, message: '必选', trigger: ['blur', 'change']}],
},
subDis: false,
userOptions: [],
userLoading: false,
fileList: [],
delFiles: [],
}
},
methods: {
changeRole(e) {
$.post(base + "/platform/sys/gdh/njzgwyh/changeRole", e, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
getRoleName(roleid) {
const o = this.roles.find(v => {
return v.id == roleid
})
return o ? o.name : ''
},
doDelete(e) {
this.$confirm('确定要移除该人员吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
$.post("/platform/sys/gdh/njzgwyh/del", e, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
doAdd() {
this.$refs["addForm"].validate((valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.post(base + "/platform/sys/gdh/njzgwyh/addCy", {
gdhid: this.formData.gdhid,
roleid: this.formData.roleid,
users: JSON.stringify(this.formData.users)
}, (data) => {
loading.close()
if (data.code == 0) {
this.addDialogVisible = false
this.$message({
message: '添加成功',
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
async userRemoteMethod(query) {
if (!this.formData.gdhid) {
this.$message('请先选择届次');
return
}
if (query) {
this.userLoading = true
const arr = await this.queryUser(this.formData.gdhid, query)
this.userOptions = this.userOptions.filter(v => {
return this.formData.users.includes(v.id)
}).concat(arr.filter(v => {
return !this.formData.users.includes(v.id)
}));
this.userLoading = false
}
},
async queryUser(gdhid, query) {
const {data} = await $.get("/platform/sys/gdh/njzgwyh/queryUser", {gdhid, query})
return data
},
openAdd() {
this.userOptions = []
this.formData = {users: []}
this.addDialogVisible = true;
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
}
,
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
}
,
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
}
,
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
}
,
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
$.post(base + "/platform/sys/gdh/njzgwyh/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
async getRoles() {
const {data} = await $.get("/platform/sys/gdh/njzgwyh/getRoles")
return data
}
},
async created() {
this.gdhOptions = await getGdh()
this.$set(this.pageForm, "gdhid", this.gdhOptions.length ? this.gdhOptions[0].id : '')
this.pageData();
this.roles = await this.getRoles()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,365 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 120px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.gdhid" style="width: 200px" clearable
placeholder="请选择届次">
<el-option
v-for="item in gdhOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.roleid" style="width: 200px" clearable
placeholder="请选择身份">
<el-option
v-for="item in roles"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button icon="el-icon-plus" @click="openAdd">添加成员</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tabLoading">
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column label="工号" prop="loginname" header-align="center"
align="center"></el-table-column>
<el-table-column label="姓名" prop="username" header-align="center"
align="center"></el-table-column>
<el-table-column label="性别" prop="sex" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="电话" prop="mobile" header-align="center"
align="center"></el-table-column>
<el-table-column label="单位" prop="unitname" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="工代会" prop="gdhname" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="身份" prop="rolecode" header-align="center" sortable
align="center">
<template slot-scope="scope">
{{getRoleName(scope.row.roleid)}}
</template>
</el-table-column>
<el-table-column label="操作" header-align="center" align="center" width="200px">
<template slot-scope="scope">
<el-dropdown placement="bottom" style="margin-left: 10px;">
<el-button type="primary" size="mini">
设置身份<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="item in roles.filter(v => {
return v.id != scope.row.roleid
})"
@click.native="changeRole({userid:scope.row.userid,roleid:item.id,gdhid:scope.row.gdhid})">
{{item.name}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button size="mini" type="danger" @click="doDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@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"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
<el-dialog
title="添加成员"
:visible.sync="addDialogVisible" :close-on-click-modal="false" width="40%">
<el-form :model="formData" ref="addForm" :rules="formRules"
label-width="100px">
<el-form-item label="届&emsp;&emsp;次" prop="gdhid">
<el-select v-model="formData.gdhid" style="width: 100%"
placeholder="请选择工代会">
<el-option
v-for="item in gdhOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="成&emsp;&emsp;员" prop="users">
<el-select
style="width: 100%"
multiple
v-model="formData.users"
filterable
remote
reserve-keyword
placeholder="请输入姓名或工号查找"
:remote-method="userRemoteMethod"
:loading="userLoading">
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.username+'('+item.loginname+')'"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="身&emsp;&emsp;份" prop="roleid">
<el-radio v-model="formData.roleid" v-for="item in roles" :label="item.id">{{item.name}}</el-radio>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" :disabled="subDis" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
var E = window.wangEditor
const vue = new Vue({
el: '#app',
data() {
return {
roles: [],
gdhOptions: [],
addDialogVisible: false,
editDialogVisible: false,
viewDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formRules: {
gdhid: [{required: true, message: '必选', trigger: ['blur', 'change']}],
role: [{required: true, message: '必选', trigger: ['blur', 'change']}],
users: [{type: 'array', required: true, message: '必选', trigger: ['blur', 'change']}],
},
subDis: false,
userOptions: [],
userLoading: false,
fileList: [],
delFiles: [],
}
},
methods: {
changeRole(e) {
$.post(base + "/platform/sys/gdh/zytjwyh/changeRole", e, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
getRoleName(roleid) {
const o = this.roles.find(v => {
return v.id == roleid
})
return o ? o.name : ''
},
doDelete(e) {
this.$confirm('确定要移除该人员吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
$.post("/platform/sys/gdh/zytjwyh/del", e, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
doAdd() {
this.$refs["addForm"].validate((valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.post(base + "/platform/sys/gdh/zytjwyh/addCy", {
gdhid: this.formData.gdhid,
roleid: this.formData.roleid,
users: JSON.stringify(this.formData.users)
}, (data) => {
loading.close()
if (data.code == 0) {
this.addDialogVisible = false
this.$message({
message: '添加成功',
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
async userRemoteMethod(query) {
if (!this.formData.gdhid) {
this.$message('请先选择届次');
return
}
if (query) {
this.userLoading = true
const arr = await this.queryUser(this.formData.gdhid, query)
this.userOptions = this.userOptions.filter(v => {
return this.formData.users.includes(v.id)
}).concat(arr.filter(v => {
return !this.formData.users.includes(v.id)
}));
this.userLoading = false
}
},
async queryUser(gdhid, query) {
const {data} = await $.get("/platform/sys/gdh/zytjwyh/queryUser", {gdhid, query})
return data
},
openAdd() {
this.userOptions = []
this.formData = {users: []}
this.addDialogVisible = true;
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
}
,
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
}
,
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
}
,
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
}
,
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
$.post(base + "/platform/sys/gdh/zytjwyh/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
async getRoles() {
const {data} = await $.get("/platform/sys/gdh/zytjwyh/getRoles")
return data
}
},
async created() {
this.gdhOptions = await getGdh()
this.$set(this.pageForm, "gdhid", this.gdhOptions.length ? this.gdhOptions[0].id : '')
this.pageData();
this.roles = await this.getRoles()
}
})
</script>
<!--#
}
#-->
+733
View File
@@ -0,0 +1,733 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
#app {
background-color: rgb(245, 245, 245);
padding: 10px;
}
.el-col {
position: relative;
}
.header-welcome {
height: auto;
width: 100%;
}
.header-item {
line-height: 20px;
background-color: white;
border-radius: 7px;
padding: 10px 15px 0;
position: relative;
transition: all 500ms;
cursor: pointer;
margin-top: 25px;
box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04)
}
.header-item-title {
text-align: center;
font-size: 14px;
font-weight: bold;
}
.header-item-num {
height: 60px;
line-height: 70px;
font-size: 28px;
color: #409EFF
}
.header-item-label {
height: 40px;
line-height: 40px;
font-size: 14px;
color: rgb(180, 180, 180);
width: 100%;
word-break: break-all;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
}
.header-item:hover {
box-shadow: 0 0 20px rgb(220, 220, 220);
}
.header-item-icon {
position: absolute;
height: 60px;
width: 60px;
display: flex;
justify-content: center;
align-items: center;
right: 10px;
top: 0;
bottom: 0;
margin: auto;
}
.header-item-icon .fa {
font-size: 46px;
color: #409EFF;
}
.v-header .el-col {
margin-bottom: 15px;
}
.v-item {
border-radius: 7px;
background-color: white;
min-height: 100%;
padding: 0 15px;
}
.v-item-title {
width: 100%;
height: 50px;
line-height: 50px;
font-size: 14px;
color: rgb(120, 120, 120);
}
.v-item-col {
display: flex;
justify-content: center;
align-items: center;
height: 140px;
}
.v-item-handle {
width: 120px;
height: 120px;
background-color: rgb(248, 248, 248);
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
transition: all 500ms;
color: #0779e4;
cursor: pointer;
border-radius: 5px;
}
.v-item-handle .fa {
font-size: 66px;
color: #0779e4;
transition: all 500ms;
}
.v-item-handle-label {
font-size: 14px;
margin-top: 5px;
}
.v-item-handle:hover {
background-color: #0779e4;
color: white !important;
}
.v-item-handle:hover .fa {
color: white !important;
}
.v-item-handle span {
transition: all 500ms;
}
.v-item-handle:hover span {
color: white !important;
}
.el-carousel__button {
background-color: #c8c8cc !important;
opacity: .24;
}
.user-info-label {
font-size: 14px;
height: 50px;
line-height: 50px;
color: rgb(120, 120, 120);
}
.user-info-val {
font-size: 14px;
height: 50px;
line-height: 50px;
color: #409EFF;
}
.el-calendar-table .current {
height: 5px !important;
}
#calendar .el-calendar-table .el-calendar-day {
-webkit-box-sizing: border-box;
box-sizing: border-box;
height: calc(((1080px - 100vh) / 1080) * 40 + 45px);
border-radius: 50%;
}
.el-calendar__body {
padding: 0;
}
.el-calendar__header {
display: -webkit-box;
display: -ms-flexbox;
display: none;
-webkit-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
padding: 12px 20px;
border-bottom: 1px solid #EBEEF5;
}
#bgrl .el-calendar-table .current {
height: 120px !important;
}
.none {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column
}
.none .none_title {
margin-top: -40px;
font-size: 14px;
color: rgb(160, 160, 160);
}
.avatar {
position: absolute;
right: 9.55vw;
top: 70px;
width: 6vw;
height: 6vw;
}
</style>
<div id="app" v-cloak>
<transition name="el-zoom-in-center">
<div v-show="v=='index'" style="width: 100%;">
<!-- <el-row :gutter="15" class="v-header">-->
<!-- <el-col :span="24">-->
<!-- <div class="header-welcome">-->
<!-- <img src="/nuaa_logo.gif" width="100%" height="100%">-->
<!-- </div>-->
<!-- </el-col>-->
<!-- </el-row>-->
<el-row :gutter="15" type="flex" style=" align-items: stretch; ">
<el-col :span="16">
<div class="v-item">
<div class="v-item-title">快速入口</div>
<el-carousel :autoplay="false" :height="handleHeight">
<el-carousel-item v-for="index in Math.ceil(handleItems.length/12)" :key="index">
<el-row style="padding: 0" id="handle">
<el-col v-for="v in handleItems.slice((index-1)*12,index*12)" :sm="{span:8}"
:md="{span:8}"
:lg="{span:6}"
:xl="{span:4}"
class="v-item-col">
<!--<div class="v-item-handle" @click="JumpPjaxUrl(v.url)">
<i :class="v.iconClass" aria-hidden="true" :style="'color: '+v.color"></i>
<span class="v-item-handle-label"
:style="'color: '+v.color">{{v.label}}</span>
</div>-->
<div class="v-item-handle" :style="'background-color: ' + v.color"
@click="JumpPjaxUrl(v.url)">
<i v-if="v.iconClass" :class="v.iconClass" aria-hidden="true"
:style="'color: '+v.color"></i>
<image v-if="!v.iconClass" :src="v.imgUrl"></image>
<span class="v-item-handle-label"
style="color: white; font-size: 16px">{{v.label}}</span>
</div>
</el-col>
</el-row>
</el-carousel-item>
</el-carousel>
</div>
</el-col>
<el-col :span="9">
<div class="v-item" id="calendar">
<div class="v-item-title">日历</div>
<el-calendar>
<template slot="dateCell" slot-scope="{date, data}">
<p :class="data.isSelected ? 'is-selected' : ''" @click="v = 'calendar'">
{{ data.day.split('-').slice(1)[1] }}
<br/>
<span style="display: flex;justify-content: center">
<i v-for="item in noticeData"
v-if="data.day.toString()==moment(item.startTime).format('YYYY-MM-DD')"
style="color: #20A0FF;margin-right: 5px"
class="fa fa-dot-circle-o"></i>
</span>
</p>
</template>
</el-calendar>
</div>
</el-col>
</el-row>
<el-row :gutter="15" type="flex" style=" align-items: stretch;margin-top: 15px ">
<el-col :span="16">
<div class="v-item">
<div class="v-item-title">待办事项</div>
<el-carousel v-if="needItems.length" :autoplay="false" :height="needHeight">
<el-carousel-item v-for="index in Math.ceil(needItems.length/12)" :key="index">
<el-row style="padding:0 10px" id="need">
<el-col style="padding: 0 12px"
v-for="item in needItems.slice((index-1)*12,index*12)"
:xs="{span:12}" :sm="{span:12}" :md="{span:12}" :lg="{span:6}"
:xl="{span:6}">
<div class="header-item" @click="doNeed(item.url)">
<div class="header-item-title">{{item.title}}</div>
<div class="header-item-num">{{item.number}}</div>
<div class="header-item-label">{{item.label}}</div>
<div class="header-item-icon">
<i :class="item.iconClass" aria-hidden="true"></i>
</div>
</div>
</el-col>
</el-row>
</el-carousel-item>
</el-carousel>
<div class="none" v-else>
<img class="none_img" src="/none.png">
<div class="none_title">暂无待办事项</div>
</div>
</div>
</el-col>
<el-col :span="9">
<div class="v-item" style="padding-bottom: 15px;">
<div class="v-item-title">个人信息</div>
<div style="height: 40px;line-height: 40px;font-weight: bolder;color: #409EFF;font-size: 16px;margin-top: 40px">
<span>${@shiro.getPrincipalProperty('username')}(${@shiro.getPrincipalProperty('sex')})</span>
</div>
<div style="height: 40px;line-height: 30px;color: rgb(180,180,180)">
<span>
<!--#if(@shiro.getPrincipalProperty('unit')!=null){#-->
${@shiro.getPrincipalProperty('unit').getName()}
<!--#}else{#-->
暂无单位信息
<!--#}#-->
</span>
</div>
<el-image
class="avatar"
:src="avatar"
fit="cover">
<div slot="error" class="image-slot" style="width: 100%;height: 100%">
<div class="el-image__error">暂无照片</div>
</div>
</el-image>
<!-- <el-avatar shape="circle " :size="100" fit="cover" :src="avatar"></el-avatar>-->
<el-row style="margin-top: 60px">
<el-col :span="12">
<span class="user-info-label">工&emsp;&emsp;号:</span>
<span class="user-info-val">${@shiro.getPrincipalProperty('loginname')}</span>
</el-col>
<el-col :span="12">
<span class="user-info-label">工&emsp;&emsp;会:</span>
<span class="user-info-val"
style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">
<!--#if(@shiro.getPrincipalProperty('union')!=null){#-->
${@shiro.getPrincipalProperty('union').getUnionname()}
<!--#}#-->
</span>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<span class="user-info-label">联系电话:</span>
<span class="user-info-val">${@shiro.getPrincipalProperty('mobile')}</span>
</el-col>
<el-col :span="12">
<span class="user-info-label">职&emsp;&emsp;务:</span>
<span class="user-info-val">
<span class="user-info-val">${@shiro.getPrincipalProperty('position')}</span>
</span>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<span class="user-info-label">在职状态:</span>
<span class="user-info-val">${@shiro.getPrincipalProperty('userState')}</span>
</el-col>
<el-col :span="12">
<span class="user-info-label">民&emsp;&emsp;族:</span>
<span class="user-info-val">
<span class="user-info-val">${@shiro.getPrincipalProperty('nation')}</span>
</span>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<span class="user-info-label">用户身份:</span>
<span class="user-info-val" style="color: #f56c6c">
<!--#
for(role in @shiro.getPrincipalProperty('roles')){
#-->
${@role.getName()}
<!--#
}
#-->
</span>
</el-col>
</el-row>
</div>
</el-col>
</el-row>
<el-row :gutter="15" style="margin-top: 15px" style=" align-items: stretch; ">
</el-row>
</div>
</transition>
<transition name="el-zoom-in-center">
<div v-show="v=='calendar'" class="transition-item transition-item2">
<el-card class="box-card v-box guava-card" shadow="never">
<div slot="header" class="clearfix">
<el-button icon="el-icon-back" type="text" @click="v='index'" style="font-size: 16px">返回
</el-button>
</div>
<div id="bgrl">
<el-calendar>
<template slot="dateCell" slot-scope="{date, data}">
<p :class="data.isSelected ? 'is-selected' : ''">
{{ data.day.split('-').slice(1).join('-') }} {{ data.isSelected ? '✔️' : ''}}
</p>
<div v-for="item in noticeData">
<div v-if="data.day.toString()==moment(item.startTime).format('YYYY-MM-DD')">
<el-link
v-if="item.activityType===40001||item.activityType===40002||item.activityType===40003"
style="font-size: 8px" type="primary" target="_blank" @click="doLink(item)">
{{item.name}}
</el-link>
<el-link v-if="item.type===1" style="font-size: 8px" type="primary"
target="_blank"
@click="doLink(item)">
{{item.name}}
</el-link>
<el-link v-if="item.type===2" style="font-size: 8px" type="primary"
target="_blank"
@click="doLink(item)">
{{item.name}}
</el-link>
</div>
</div>
</template>
</el-calendar>
</div>
</el-card>
</div>
</transition>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
noticeData: [],
noticeKey: new Date().getTime(),
avatar: "/avatar_boy.svg",
colors: ['#409EFF', '#67C23A', '#E6A23C', '#F56C6C', '#00a2ae', '#7265e6', '#ffbf00', '#00a854'],
handleItems: [],
needItems: [],
handleHeight: '350px',
needHeight: '420px',
v: "index",
day: "",
}
},
methods: {
doNeed(url) {
this.JumpPjaxUrl(url)
},
doLink(item) {
if (item.activityType) {
this.$notify.warning('如需报名请前往手机端智慧工会')
}
if (item.type === 1) {
if ("${@shiro.hasRole('H04')}" === 'false' && "${@shiro.hasRole('sysadmin')}" === 'false' && item.applyWay.includes("1")) {
this.$notify.warning('如需报名请前往手机端智慧工会')
} else {
if ("${@shiro.hasRole('H04')}" === 'true' || "${@shiro.hasRole('sysadmin')}" === 'true') {
// sublime.jumpPagePjax('/platform/activity/apply')
this.JumpPjaxUrl('/platform/activity/apply')
} else {
this.$notify.warning('当前活动不支持个人报名,如需报名请联系分工会管理员!')
}
}
}
if (item.type === 2) {
this.$notify.warning('如需报名请前往健身走小程序')
}
},
setSize() {
this.$nextTick(() => {
this.handleHeight = $('#handle').height() + 50 + 'px';
this.needHeight = $('#need').height() + 50 + 'px';
})
},
async getUserRole() {
const resp = await $.get(loc() + "/getUserRole")
},
/**
* 获取日历信息
*/
async getCalendarNotice() {
const activityData = await this.getActivityData()
const fitnessData = await this.getFitnessData()
const activityWyData = await this.getWyActivityData()
const noticeData = activityData.concat(fitnessData ? fitnessData : [])
this.noticeData = noticeData.concat(activityWyData)
},
/**
* 获取校级活动报名信息
*/
async getActivityData() {
const {data} = await $.get(base + "/platform/activity/calendar/getData")
if (data && data.length > 0) {
data.forEach(v => {
v.type = 1
})
}
return data
},
/**
* 获取活动报名信息
*/
async getWyActivityData() {
const {data} = await $.get(base + "/platform/activity/calendar/getWyData")
return data
},
/**
* 获取健身走活动报名信息
*/
async getFitnessData() {
const {data} = await $.get("/platform/jsz/hdMange/getFitnessData")
if (data && data.length > 0) {
data.forEach(v => {
v.startTime = v.start_time
v.type = 2
})
}
return data
},
/**
* 提案待办
* @returns {Promise<void>}
*/
async getTaAgenda() {
const {data, code} = await $.get("/platform/proposal/agent/getAgenda")
if (code === 0) {
this.needItems = this.needItems.concat(data.filter(v => v.number > 0))
this.setSize()
}
},
/**困难帮扶待办
* @returns {Promise<void>}
*/
async getDifficultAgenda() {
const {data, code} = await $.get("/platform/difficult/agent/getAgenda")
if (code == 0) {
this.needItems = this.needItems.concat(data.filter(v => v.number > 0))
this.setSize()
}
},
/**慰问待办
* @returns {Promise<void>}
*/
async getCondolenceAgenda() {
const {data, code} = await $.get("/platform/condolence/agent/getAgenda")
if (code == 0) {
this.needItems = this.needItems.concat(data.filter(v => v.number > 0))
this.setSize()
}
},
/**活动报销
* @returns {Promise<void>}
*/
async getActivitybxAgenda() {
const {data, code} = await $.get("/platform/activitybx/agent/getAgenda")
if (code == 0) {
this.needItems = this.needItems.concat(data.filter(v => v.number > 0))
this.setSize()
}
},
/**疗休养
* @returns {Promise<void>}
*/
async getLxyAgenda() {
const {data, code} = await $.get("/platform/lxy/agent/getAgenda")
if (code == 0) {
console.log(data)
this.needItems = this.needItems.concat(data.filter(v => v.number > 0))
this.setSize()
}
},
/**
* 会员待办
* @returns {Promise<void>}
*/
async getMemberAgenda() {
const {data, code} = await $.get("/platform/member/agenda/getAgenda")
if (code == 0) {
this.needItems = this.needItems.concat(data.filter(v => v.number > 0))
this.setSize()
}
},
async getOfferAdviceAgenda() {
const {data, code} = await $.get("/platform/offerAdvice/agenda/getAgenda")
if (code == 0) {
this.needItems = this.needItems.concat(data.filter(v => v.number > 0))
this.setSize()
}
},
async getSyrAgenda() {
const {data, code} = await $.get("/platform/syr/dbxx/getSyrDbxx")
if (code == 0) {
this.needItems = this.needItems.concat(data.filter(v => v.number > 0))
this.setSize()
}
},
/**
* 入学登记待办
* @returns {Promise<void>}
*/
async getRxdjAgenda() {
const {data, code} = await $.get("/platform/rxdj/agent/getAgenda")
if (code == 0) {
this.needItems = this.needItems.concat(data.filter(v => v.number > 0))
this.setSize()
}
},
/**
* 快速入口
* @returns {Promise<void>}
*/
async getQuickentry() {
const {data, code} = await $.get("/platfotm/agenda/getQuickentry")
if (code == 0) {
this.handleItems = data;
this.setSize()
}
},
async findMaxParenMenuId(menu) {
const resp = await $.get('/platform/sys/entranceModule/getFirstMenus')
if (resp.code !== 0) return
if (!menu.path) return null
const parentMenuPath = menu.path.substr(0, 4)
const firstMenus = resp.data
const parentMenu = firstMenus.find(v => v.path === parentMenuPath)
if (parentMenu) {
return parentMenu.id
}
return null
},
async JumpPjaxUrl(url) {
const secondMenus = headerNavBarVueApp.secondMenus
const allMenus = Object.values(secondMenus).reduce((a, b) => a.concat(b))
const jumpMenu = allMenus.find(v => v.href === url)
//找出在哪一个模块当中
const entranceModules = headerNavBarVueApp.entranceModules
//找到这个菜单的一级父亲菜单
const maxParenMenuId = await this.findMaxParenMenuId(jumpMenu)
const module = entranceModules.find(v => v.containsMenu.includes(maxParenMenuId))
if (module) {
headerNavBarVueApp.selectEntranceModule = module
const resp = await $.get('/platform/sys/entranceModule/getFirstMenus', {entranceModuleId: module.id})
if (resp.code === 0) {
headerNavBarVueApp.firstMenus = resp.data
headerNavBarVueApp.setAttr(() => {
sublime.jumpPagePjax(url)
})
}
/*setTimeout(()=>{
sublime.jumpPagePjax(url)
},0)*/
} else {
$.pjax({
url: url,
container: '#container',
fragment: '#container',
timeout: 8000
});
}
}
},
beforeMount() {
window.addEventListener('resize', () => {
// this.setSize()
}, false);
},
mounted() {
this.setSize()
const FILE_DOMAIN = "${AppFileDomain!}"
const userAvatar = "${@shiro.getPrincipalProperty('avatar')}"
const sex = "${@shiro.getPrincipalProperty('sex')}"
if (userAvatar) {
this.avatar = APP_DOMAIN + FILE_STREAM_PREVIEW_ADDRESS + '?id=' + "${@shiro.getPrincipalProperty('avatar')}"
} else {
this.avatar = sex === '女' ? '/avatar_girl.svg' : '/avatar_boy.svg'
}
},
async created() {
this.getUserRole()
this.getLxyAgenda();
this.getQuickentry();
this.getCalendarNotice()
// this.getActivitybxAgenda();
this.getDifficultAgenda();
this.getCondolenceAgenda();
// this.getTaAgenda();
this.getRxdjAgenda();
// this.getMemberAgenda();
this.getSyrAgenda();
this.getOfferAdviceAgenda()
}
})
</script>
<!--# } #-->
@@ -0,0 +1,94 @@
const activity = {
template: /*language=HTML*/`
<div class="home-activity">
<el-card shadow="never">
<div class="card-title" slot="header">最新活动</div>
<div v-if="activityOptions && activityOptions.length > 0" v-for="item in activityOptions" :key="item.id">
<div style="width: 100%">
<div style="background-color: #fff; position: relative; margin-bottom: 10px">
<div style="display: flex; justify-content: center; align-items: center">
<el-image :src="'/file_server/fileStreamPreview?id='+item.cover.filepath" alt="" fit="fill"
style="margin: 3px 14px 0 0; width: 100px; height: 70px; border-radius: 8px">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
<div style="flex: 1">
<div style="line-height: 22px; color: #111">
<i class="el-icon-star-on" style="color: red; font-size: 17px"></i>{{item.activityName}}
<el-tag type="danger" v-if="moment(item.activitySignUpEndTime).valueOf()<moment().valueOf()" size="mini">报名已结束</el-tag>
</div>
<div style="font-size: 12px; line-height: 20px; color: #999">开始时间:{{moment(item.activitySignUpStartTime).format('YYYY-MM-DD HH:mm')}}</div>
<div style="font-size: 12px; line-height: 20px; color: #999">结束时间:{{moment(item.activitySignUpEndTime).format('YYYY-MM-DD HH:mm')}}</div>
</div>
<div @click="enterActivity(item)">
<el-tag style="cursor: pointer">查看<i class="el-icon-s-promotion"></i></el-tag>
</div>
</div>
</div>
</div>
</div>
<el-empty v-if="activityOptions.length === 0" description="暂无活动"></el-empty>
</el-card>
<open-qr-code :url="activityH5Url" ref="openQRCode"></open-qr-code>
</div>
`,
data() {
return {
activityOptions: [],
activityH5Url: null
}
},
components: {
"open-qr-code": httpVueLoader("/components/plugins/OpenQRCode.vue?v=" + new Date().getTime())
},
methods: {
/**
* 获取品牌活动信息
*/
async getTrainSingUpData() {
const {data} = await $.get(base + "/platform/trainSingUp/manage/activity/pageData", {
pageNumber: 1,
pageSize: 20
})
return data.list
},
/**
* 获取活动报名信息
*/
async getWyActivityData() {
const {data} = await $.get(base + "/platform/activity/calendar/getWyData")
return data
},
async getCalendarNotice() {
/* const activityData = await this.getActivityData()
const fitnessData = await this.getFitnessData()*/
/*const activityWyData = await this.getWyActivityData()
const noticeData = activityData.concat(fitnessData ? fitnessData : [])*/
const activityWyData = await this.getTrainSingUpData()
this.activityOptions = activityWyData
},
listActivity() {
$.get("/platform/home/listHomeActivity").then((resp) => {
if (resp.code === 0) {
this.activityOptions = resp.data
}
})
},
enterActivity(item) {
this.$refs.openQRCode.openCode("/platform/mobile/trainSignUpActivity/trainList", "该活动只支持手机端报名,请使用手机扫描二维码报名!")
/* sublime.jumpPagePjax(item.url)
if (item.url) {
sublime.jumpPagePjax(item.url)
} else if (item.url) {
this.$refs.openQRCode.openCode(item.url, "该活动只支持手机端报名,请使用手机扫描二维码报名!")
} else {
this.$message.warning("该活动不支持")
}*/
}
},
created() {
this.getCalendarNotice()
// this.listActivity()
}
}
@@ -0,0 +1,34 @@
const appModule = {
template: `
<div class="home-app-module">
<el-card shadow="never">
<div class="card-title" slot="header">平台入口</div>
<div style="display: flex;gap: 20px;overflow-x: auto">
<template v-for="item in entranceModules">
<div :key="item.id" class="v-item-handle" @click="enterEntranceModules(item)"
:class="item.id===selectEntranceModuleId?'appModuleCard':''">
<el-image :src="CREATE_PREVIEW_URL(item.icon[0].id)" style="height: 50px;width: 50px;border-radius: 50%"></el-image>
<span class="v-item-handle-label">
{{ item.moduleName }}
</span>
</div>
</template>
</div>
</el-card>
</div>
`,
store,
computed: {
entranceModules() {
return this.$store.state.moduleMenus
},
selectEntranceModuleId(){
return this.$store.state.activeMenuModuleId || null
}
},
methods: {
async enterEntranceModules(item) {
this.$store.commit('setActiveMenuModuleId', item.id)
}
}
}
@@ -0,0 +1,394 @@
<!--#
layout("/layouts/platform.html"){
#-->
<!--公共css-->
<style>
.el-card {
border-radius: 8px;
}
.image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: #f5f7fa;
color: #909399;
}
.el-icon-picture-outline {
font-size: 30px;
}
.ele-body {
padding: 10px;
}
.el-card {
height: 100%;
}
</style>
<!--个人信息css-->
<style>
.home-user-info .el-card {
width: 100%;
overflow: auto;
}
.home-user-info .info {
line-height: 40px;
color: black;
}
</style>
<!--待办css-->
<style>
.home-todo{
background: #ffffff;
padding: 15px;
border-radius: 8px;
overflow-y: auto;
}
.home-todo .el-tabs {
height: 100%;
}
.home-todo .el-tabs__content {
height: calc(100% - 55px);
overflow-y: auto;
}
.el-table__header,.el-table__body {
width: auto !important;
}
</style>
<!--快速入口css-->
<style>
.home-quick-entry .el-card {
width: 100%;
}
.home-quick-entry .el-card .el-card__body{
overflow-x: auto;
overflow-y: auto;
height: calc(100% - 53.5px);
}
.home-quick-entry .quickEntries {
overflow-y: auto;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
gap: 50px;
}
.home-quick-entry .quickEntries .quickEntryItem img {
max-width: 50px;
}
.home-quick-entry .quickEntries .quickEntryItem {
border-radius: 10px;
font-size: 27px;
height: 90px;
max-height: 90px;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
padding: 10px;
transition: transform 0.3s ease-in-out,
box-shadow 0.3s ease-in-out;
}
.home-quick-entry .quickEntries .quickEntryItem span {
margin-top: auto;
}
.home-quick-entry .quickEntries .quickEntryItem:hover {
cursor: pointer;
background: #f3f3f3;
}
.home-quick-entry .quickEntries .quickEntryItem:hover {
animation: shake 0.3s;
}
@keyframes shake {
0% {
transform: translateX(0);
}
25% {
transform: translateX(-5px);
}
50% {
transform: translateX(5px);
}
75% {
transform: translateX(-5px);
}
100% {
transform: translateX(0);
}
}
</style>
<!--活动css-->
<style>
.home-activity{
min-width: 500px;
}
.home-activity .el-card {
width: 100%;
overflow-y: auto;
}
.home-activity .el-empty {
padding: 40px 0 !important;
}
</style>
<!--平台入口css-->
<style>
.home-app-module .el-card {
width: 100%;
}
.home-app-module .el-card .el-card__body{
overflow-x: auto;
overflow-y: auto;
height: calc(100% - 53.5px);
}
.v-item-handle {
width: 120px;
height: 100px;
border: 1px solid #f3efef;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
transition: all 500ms;
color: #0779e4;
cursor: pointer;
border-radius: 5px;
flex: 0 0 auto;
margin-bottom: 10px;
}
.v-item-handle-label {
font-size: 14px;
margin-top: 5px;
}
.v-item-handle .el-image {
transition: width 0.3s ease,
height 0.3s ease;
transform-origin: center; /* 缩放的中心点 */
}
.v-item-handle:hover .el-image {
width: 60px !important;
height: 60px !important;
}
.v-item-handle:hover .fa {
color: white !important;
}
.v-item-handle span {
transition: all 500ms;
color: #000;
font-size: 16px;
}
.appModuleCard {
border: 3px solid #409EFF;
}
</style>
<!--工会新闻css-->
<style>
.home-news {
background: #ffffff;
padding: 15px;
border-radius: 8px;
overflow-y: auto;
}
.home-news .el-tabs {
height: 100%;
}
.home-news .el-tabs__content {
height: calc(100% - 55px);
overflow-y: auto;
}
.home-news .el-tab-pane {
line-height: 38px;
color: black;
}
.home-news .el-tab-pane .news_time {
color: white;
padding: 4px 10px;
border-radius: 10px;
background: #1867b0;
}
.home-news .el-tab-pane div {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
cursor: pointer;
height: 40px;
line-height: 40px;
}
.home-news .el-tab-pane .news_text:hover {
color: #1867b0;
}
</style>
<style>
.el-card__header {
padding: 15px 20px !important;
}
.layout-grid-container{
display: grid;
grid-template-columns: repeat(3, minmax(100px, 1fr));
grid-template-rows: 220px 255px auto;
gap: 10px;
width: calc(100% - 20px);
height: calc(100% - 20px);
margin: 10px auto;
overflow: hidden;
box-sizing: border-box;
}
.layout-grid-container .grid-item {
color: white;
border-radius: 8px;
}
.appModule-grid {
grid-column: 1 / 3; /* 元素1占据第1和第2列 */
grid-row: 1 / 2; /* 元素1占据第1行 */
}
.activity-grid {
grid-column: 3 / 4; /* 元素2占据第3列 */
grid-row: 1 / 3; /* 元素2跨越第1和第2行 */
}
.quickEntry-grid {
grid-column: 1 / 3; /* 元素3占据第1和第2列 */
grid-row: 2 / 3; /* 元素3占据第2行 */
}
.news-grid,
.todo-grid,
.user-grid {
grid-column: span 1; /* 每个元素占据1列 */
grid-row: 3 / 4; /* 所有元素都在第3行 */
}
</style>
<div id="app" v-cloak>
<div class="layout-grid-container">
<app-module class="appModule-grid grid-item"></app-module>
<quick-entry class="quickEntry-grid grid-item"></quick-entry>
<activity class="activity-grid grid-item"></activity>
<news class="news-grid grid-item"></news>
<todo class="todo-grid grid-item"></todo>
<user-info class="user-grid grid-item"></user-info>
</div>
<!-- <el-row type="flex" class="p10" style="column-gap: 10px;height: 100%">-->
<!-- <el-col :span="16">-->
<!-- <app-module class="appModule mb10"></app-module>-->
<!-- <quick-entry class="quickEntry mb10"></quick-entry>-->
<!-- <el-row :gutter="10">-->
<!-- <el-col :span="12">-->
<!-- <news></news>-->
<!-- </el-col>-->
<!-- <el-col :span="12">-->
<!-- <todo></todo>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <activity class="mb10"></activity>-->
<!-- <user-info></user-info>-->
<!-- </el-col>-->
<!-- </el-row>-->
</div>
<script>
<!--#include("userInfo.js"){}#-->
<!--#include("todo.js"){}#-->
<!--#include("quickEntry.js"){}#-->
<!--#include("activity.js"){}#-->
<!--#include("appModule.js"){}#-->
<!--#include("news.js"){}#-->
new Vue({
el: "#app",
components: {
"user-info": userInfo,
todo,
"quick-entry": quickEntry,
activity,
"app-module": appModule,
news: news
},
data: function () {
return {
quickEntries: [],
activityOptions: [],
processInstanceOptions: [],
icon: "alipay"
}
},
methods: {
listQuickEntry() {
$.post("/platform/home/listQuickEntry").then((res) => {
if (res.code === 0) {
this.quickEntries = res.data
}
})
},
listActivity() {
$.post("/platform/h5/listHomeActivity").then((resp) => {
if (resp.code === 0) {
this.activityOptions = resp.data
}
})
},
enterActivity(item) {
// this.$store.dispatch("pjaxRoute", item.url)
},
//查询流程实例
listProcessInstance() {
$.post("/platform/wf/processInstance/page", {
pageNumber: 1,
pageSize: 10
})
.then((resp) => {
if (resp.code === 0) {
this.processInstanceOptions = resp.data.list
}
})
}
},
created() {
}
})
</script>
<style scoped></style>
<!--# } #-->
@@ -0,0 +1,39 @@
const news = {
template: `
<div class="home-news">
<el-tabs v-model="activeName">
<el-tab-pane v-for="(item,index) in newsData" :key="index" :label="item.label" :name="item.label" v-if="item.value.length > 0">
<div v-for="(n,i) in item.value" :key="i" @click="openUrl(n.href)">
<span v-if="n.time" class="news_time">{{ n.time }}</span>
<span class="news_text">{{ n.text }}</span>
</div>
</el-tab-pane>
</el-tabs>
</div>
`,
data() {
return {
newsData: [],
activeName: 0
}
},
methods: {
async getNews() {
const resp = await $.post("/platform/home/getNews")
if (resp.data.length > 0) {
this.activeName = resp.data[0].label
}
this.newsData = resp.data
},
openUrl(href) {
const url = this.isHttpOrHttps(href) ? href : "https://gonghui.hhu.edu.cn/" + href
window.open(url)
},
isHttpOrHttps(url) {
return /^(http:\/\/|https:\/\/)/i.test(url)
}
},
async created() {
await this.getNews()
}
}
@@ -0,0 +1,47 @@
const quickEntry = {
template: `
<div class="home-quick-entry">
<el-card shadow="never">
<div class="card-title" slot="header">快速入口</div>
<div class="quickEntries">
<div v-for="item in quickEntries" :key="item.id" @click="menuClick(item)" class="quickEntryItem"
:style="'background-color: '+item.color">
<el-image :src="item.imgUrl" alt="" >
<div class="image-slot" slot="error">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
<span style="color: white; font-size: 16px">{{item.label}}</span>
</div>
</div>
</el-card>
</div>
`,
data() {
return {
quickEntries: []
}
},
methods: {
listQuickEntry() {
$.get("/platfotm/agenda/getQuickentry").then((res) => {
if (res.code === 0) {
this.quickEntries = res.data
}
})
/*$.get("/platform/quickEntry/getQuickentry").then((res) => {
if (res.code === 0) {
this.quickEntries = res.data
}
})*/
},
menuClick(item) {
// location.href=item.url
sublime.jumpPagePjax(item.url)
}
},
created() {
this.listQuickEntry()
}
}
@@ -0,0 +1,223 @@
const todo = {
template: `
<div class="home-todo">
<el-tabs v-model="todoActive " @tab-click="handleClick">
<el-tab-pane label="待处理" name="1">
<template slot="label">
<span>待处理</span>
<el-badge v-if="waitHandleCount > 0" :value="waitHandleCount" :max="99" class="item" style="margin-top:10px;">
</el-badge>
</template>
<el-table :data="todoList" v-loading="todoLoading">
<el-table-column label="序号" type="index" width="70"></el-table-column>
<el-table-column label="标题" prop="title" show-overflow-tooltip
width="150"></el-table-column>
<el-table-column label="发起人" prop="create_name"
width="140"></el-table-column>
<el-table-column label="发起时间" prop="create_time"
width="200"></el-table-column>
<el-table-column label="状态" prop="status" width="100">
<template scope="{row}">
{{ status[row.status] }}
</template>
</el-table-column>
<!-- <el-table-column label="我的处理环节" prop="taskNodeName"-->
<!-- v-if="todoActive!=='3'"></el-table-column>-->
<!-- <el-table-column label="流程流转环节" prop="nodeName"></el-table-column>-->
<el-table-column label="操作" width="100">
<template scope="{row}">
<!-- <el-button @click="sublime.jumpPagePjax(row.formUrl)" size="mini" type="primary">查看</el-button>-->
<el-button @click="handleTask(row)" size="mini" type="primary">查看</el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="已处理" name="2">
<el-table :data="todoList" v-loading="todoLoading">
<el-table-column label="序号" type="index" width="70"></el-table-column>
<el-table-column label="标题" prop="title" show-overflow-tooltip
width="100"></el-table-column>
<el-table-column label="发起人" prop="create_name"
width="100"></el-table-column>
<el-table-column label="发起时间" prop="create_time"
width="200"></el-table-column>
<el-table-column label="状态" prop="status" width="100">
<template scope="{row}">
{{ status[row.status] }}
</template>
</el-table-column>
<!-- <el-table-column label="我的处理环节" prop="taskNodeName"-->
<!-- v-if="todoActive!=='3'"></el-table-column>-->
<!-- <el-table-column label="流程流转环节" prop="nodeName"></el-table-column>-->
<el-table-column label="操作" width="100">
<template scope="{row}">
<!-- <el-button @click="sublime.jumpPagePjax(row.formUrl)" size="mini" type="primary">查看</el-button>-->
<el-button @click="handleTask(row)" size="mini" type="primary">查看</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="loadCompleteHandle"
@current-change="loadCompleteHandle"
: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-tab-pane>
<el-tab-pane label="我的发起" name="3">
<el-table :data="todoList" v-loading="todoLoading">
<el-table-column label="序号" type="index" width="70"></el-table-column>
<el-table-column label="标题" prop="title" show-overflow-tooltip
width="100"></el-table-column>
<el-table-column label="发起人" prop="create_name"
width="100"></el-table-column>
<el-table-column label="发起时间" prop="create_time" v-if="todoActive==='3'"
width="200"></el-table-column>
<el-table-column label="状态" prop="status" width="100">
<template scope="{row}">
{{ status[row.status] }}
</template>
</el-table-column>
<!-- <el-table-column label="我的处理环节" prop="taskNodeName"-->
<!-- v-if="todoActive!=='3'"></el-table-column>-->
<!-- <el-table-column label="流程流转环节" prop="nodeName"></el-table-column>-->
<el-table-column label="操作" width="100">
<template scope="{row}">
<!-- <el-button @click="sublime.jumpPagePjax(row.formUrl)" size="mini" type="primary">查看</el-button>-->
<el-button @click="handleTask(row)" size="mini" type="primary">查看</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="loadMineSendTask"
@current-change="loadMineSendTask"
: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-tab-pane>
</el-tabs>
<!-- <el-table :data="todoList" style="min-height: 250px" v-loading="todoLoading">-->
<!-- <el-table-column label="序号" type="index" width="70"></el-table-column>-->
<!-- <el-table-column label="标题" prop="processName" show-overflow-tooltip-->
<!-- width="200"></el-table-column>-->
<!-- <el-table-column label="发起人" prop="createdByUserName"-->
<!-- width="140"></el-table-column>-->
<!-- <el-table-column label="发起时间" prop="createdOn" v-if="todoActive==='3'"-->
<!-- width="150"></el-table-column>-->
<!-- <el-table-column label="我的处理环节" prop="taskNodeName"-->
<!-- v-if="todoActive!=='3'"></el-table-column>-->
<!-- <el-table-column label="流程流转环节" prop="nodeName"></el-table-column>-->
<!-- <el-table-column label="操作" width="100">-->
<!-- <template scope="{row}">-->
<!-- <el-button @click="sublime.jumpPagePjax(row.formUrl)" size="mini" type="primary">查看</el-button>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- </el-table>-->
</div>
`,
mixins: [initTableMixins],
data() {
return {
todoActive: "1",
todoList:[],
todoLoading: false,
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0
},
status:['草稿', '待处理', '已处理', '已驳回', '已撤回'],
waitHandleCount: 0
}
},
watch: {
todoActive: {
async handler(val) {
console.log("val--->", val)
this.pageForm = {
pageNumber: 1,
pageSize: 10,
totalCount: 0
}
this.todoList = []
try{
this.todoLoading = true
if(Number(val) === 1) {
await this.loadWaitHandle()
} else if(Number(val) === 2) {
await this.loadCompleteHandle()
} else if(Number(val) === 3) {
await this.loadMineSendTask()
}
this.todoLoading = false
} catch (e) {
this.todoLoading = false
}
}
}
},
methods: {
async handleClick() {
this.todoLoading = true
/* const {data, code} = await $.get("/platform/sys/localProcess/todoList", { mode: this.todoActive })
this.todoList = data*/
this.todoLoading = false
},
// 加载待处理数据
async loadWaitHandle() {
const res = await $.post('/oa/audit/instance/wait/handle')
console.log("待处理数据->", res)
if(res.code === 0) {
this.todoList = res.data
this.waitHandleCount = this.todoList.length
}
},
// 加载已办数据
async loadCompleteHandle() {
const res = await $.post('/oa/audit/instance/complete/handle', { ...this.pageForm })
console.log("已处理数据->", res)
this.todoList = res.list
this.pageForm.pageNumber = res.pageNo
this.pageForm.pageSize = res.pageSize
this.pageForm.totalCount = res.totalCount
},
// 加载我发起的
async loadMineSendTask() {
const res = await $.post('/oa/audit/instance/mine/send', { ...this.pageForm })
console.log("我发起数据->", res)
this.todoList = res.list
this.pageForm.pageNumber = res.pageNo
this.pageForm.pageSize = res.pageSize
this.pageForm.totalCount = res.totalCount
},
// 待处理任务处理
async handleTask(row) {
if(this.todoActive === '1') {
const urlObj = new URL(row.url)
console.log(urlObj)
window.location.href = urlObj.pathname + urlObj.search
} else {
const urlObj = new URL(row.done_url)
console.log(urlObj)
window.location.href = urlObj.pathname + urlObj.search
}
}
},
created() {
this.handleClick()
// 待处理
this.loadWaitHandle()
}
}
@@ -0,0 +1,67 @@
const userInfo = {
template: `
<div class="home-user-info">
<el-card shadow="never">
<div class="card-title" slot="header">个人信息</div>
<div class="info">
<div>👨‍🏫我的姓名:${@shiro.getPrincipalProperty('username')}</div>
<div>🆔我的工号:${@shiro.getPrincipalProperty('loginname')}</div>
<div>⭕我的性别:${@shiro.getPrincipalProperty('sex')}</div>
<div>🟢我的单位:${@shiro.getPrincipalProperty('unit').getName()}</div>
<div>🟤我的工会:${@shiro.getPrincipalProperty('union').getUnionname()}</div>
<div>📕系统角色:
<!--#for(role in @shiro.getPrincipalProperty('roles')){#-->
<span style="font-size: 14px;color: #666;">${@role.getName()}</span>
<!--#}#-->
</div>
</div>
</el-card>
<el-dialog :visible.sync="signatureDialogVisible" title="我的签字" width="35%">
<!-- <div class="flx">-->
<!-- <div v-if="!showSignature" class="p10">-->
<!-- <el-image style="width: 100%;border: 1px dashed #000" :src="userSignatureUrl" v-if="userSignatureUrl">-->
<!-- <template slot="error">获取签名失败</template>-->
<!-- </el-image>-->
<!-- <el-empty v-else description="暂无签名"></el-empty>-->
<!-- </div>-->
<!-- <div class="flx-center-center" style="flex-direction: column;">-->
<!-- <qrcode :options="{ width: 126 }" :value="signatureAddress" class="signature-qrcode"></qrcode>-->
<!-- <el-button icon="el-icon-refresh" size="small" type="primary" @click="getUserSignature(true)">刷新</el-button>-->
<!-- </div>-->
<!-- </div>-->
<!-- <el-alert title="扫描二维码可重新签名,手机上签名成功后可点击刷新查看。" type="success"></el-alert>-->
</el-dialog>
</div>
`,
data() {
return {
showSignature: false,
userSignatureUrl: null,
signatureDialogVisible: false,
signatureAddress: window.location.origin + "/platform/signature/scanPcCode?origin=user",
memberInfoDialogVisible:false
}
},
mounted() {},
methods: {
openSignature() {
this.signatureDialogVisible = true
this.getUserSignature()
},
getUserSignature(isRefresh = false) {
$.post("/platform/signature/get").then((res) => {
if (res.code === 0) {
if (isRefresh) {
this.$message.success("刷新成功")
} else {
if (!res.data.signature) {
this.$message.warning("未获取到签字信息")
}
}
this.userSignatureUrl = res.data.signature
}
})
},
}
}
@@ -0,0 +1,34 @@
<!--#if(!isEmpty(path)){
var secondMenus=@shiro.getPrincipalProperty('secondMenus');
#-->
<!--# for(firstMenu in @secondMenus.get(perpath)){ #-->
<li <!--# if(mpath==firstMenu.path){#-->class="active" <!--#}#--> <!--#if(@path.indexOf(firstMenu.path)==0){#-->class="open"<!--#}#-->>
<a <!--# if(!isEmpty(firstMenu.href)){ #-->href="<!--#if(@string.startWith(firstMenu.href,'/')){#-->${base}${firstMenu.href!}<!--#}else{#-->${firstMenu.href!}<!--#}#-->" <!--#if(@string.startWith(firstMenu.target,'_')){#-->target="${firstMenu.target!}"<!--#}else{#-->${firstMenu.target!}<!--#}#--> <!--# }else{ #-->href="javascript:;"<!--# } #--> <!--# if(mpath==firstMenu.path){#--> class="active" <!--#}#--> <!--#if(@path.indexOf(firstMenu.path)==0){#--> class="active"<!--#}#-->>
<!--# if(!isEmpty(@secondMenus.get(firstMenu.path))){ #-->
<i class="toggle-accordion"></i>
<!--# } #-->
<!--# if(!isEmpty(firstMenu.icon)){ #-->
<i class="${firstMenu.icon!}"></i>
<!--# }else{ #-->
<i class="ti-map"></i>
<!--# } #-->
<span><!--#if(lang=="zh_CN"){#-->${firstMenu.name}<!--#}else{#-->${firstMenu.aliasName}<!--#}#--></span>
</a>
<!--# if(!isEmpty(@secondMenus.get(firstMenu.path))){ #-->
<ul class="sub-menu" <!--#if(@path.indexOf(firstMenu.path)==0){#-->style="display: block"<!--#}#-->>
<!--# for(secondMenu in @secondMenus.get(firstMenu.path)){ #-->
<li <!--# if(mpath == secondMenu.path){ #-->class="active"<!--# }else if(path==secondMenu.path){ #-->class="open"<!--# } #--> >
<a <!--# if(!isEmpty(secondMenu.href)){ #-->href="<!--#if(@string.startWith(secondMenu.href,'/')){#-->${base}${secondMenu.href!}<!--#}else{#-->${secondMenu.href!}<!--#}#-->" <!--#if(@string.startWith(secondMenu.target,'_')){#-->target="${secondMenu.target!}"<!--#}else{#-->${secondMenu.target!}<!--#}#--> <!--# }else{ #-->href="javascript:;"<!--# } #-->>
<span>
<!--#if(lang=="zh_CN"){#-->${secondMenu.name}<!--#}else{#-->${secondMenu.aliasName}<!--#}#-->
</span>
</a>
</li>
<!--# } #--><!--# } #-->
</ul>
<!--# } #-->
</li>
<!--#}#-->
@@ -0,0 +1,244 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-select placeholder="请选择日志类型" size="medium"
v-model="pageForm.searchType"
>
<el-option
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in options"
>
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-date-picker
:default-time="['00:00:00', '23:59:59']"
:picker-options="pickerOptions"
align="right"
end-placeholder="结束日期"
range-separator="至"
size="medium"
start-placeholder="开始日期"
type="datetimerange"
v-model="searchDate"
value-format="yyyy-MM-dd HH:mm:ss"
>
</el-date-picker>
</div>
<div class="btn-group tool-button mt5">
<el-button @click="doSearch" icon="el-icon-search" size="medium" slot="append"></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
align="center"
header-align="center"
label="操作人"
prop="username" sortable>
<template slot-scope="scope">
{{scope.row.username+'/'+scope.row.loginname}}
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="操作时间"
prop="createdat"
sortable width="120">
<template slot-scope="scope">
{{formatAt(scope.row.createdat)}}
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="日志类型"
prop="type" width="120">
<template slot-scope="scope">
<span v-if="scope.row.type=='platform'">
平台日志
</span>
<span v-if="scope.row.type=='info'">
登录日志
</span>
<span v-if="scope.row.type=='api'">
接口日志
</span>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="执行动作"
prop="tag" width="120">
</el-table-column>
<el-table-column
header-align="left"
label="日志内容"
prop="msg"
>
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
header-align="left"
label="执行类"
prop="src"
>
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
header-align="left"
label="IP"
prop="ip"
>
</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>
</div>
<script>
new Vue({
el: "#app",
data: function () {
return {
options: [{
value: '',
label: '全部类型'
}, {
value: 'platform',
label: '平台日志'
}, {
value: 'info',
label: '登录日志'
}, {
value: 'api',
label: '接口日志'
}],
pickerOptions: {
disabledDate: function (time) {
var threeMonths = moment().add(-3, 'months').valueOf();
return time.getTime() > Date.now() || time.getTime() < threeMonths;
},
shortcuts: [{
text: '最近一周',
onClick:function(picker) {
var end = new Date();
var start = new Date();
var temp = moment().add(-1, 'weeks').valueOf();
start.setTime(temp);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近一个月',
onClick:function(picker) {
var end = new Date();
var start = new Date();
var temp = moment().add(-1, 'months').valueOf();
start.setTime(temp);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近三个月',
onClick:function(picker) {
var end = new Date();
var start = new Date();
var temp = moment().add(-3, 'months').valueOf();
start.setTime(temp);
picker.$emit('pick', [start, end]);
}
}]
},
tableData: [],
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "createdat",
pageOrderBy: "descending",
searchDate: "",
searchType: ""
},
searchDate: []
}
},
methods: {
formatAt: function (val) {
if (val > 0)
return moment(val).format("YYYY-MM-DD HH:mm");
return "";
},
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();
},
doSearch: function () {
this.pageForm.pageNumber = 1;
this.pageData();
},
pageData: function () {//加载分页数据
var self = this;
sublime.showLoadingbar();//显示loading
if (self.searchDate) {
self.pageForm.searchDate = self.searchDate.toString();
}else {
self.pageForm.searchDate="";
}
$.post(base + "/platform/sys/log/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");
},
},
created: function () {
this.pageData();
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,332 @@
<!DOCTYPE html>
<html lang="${lang,escape}">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
<meta name="description" content="${AppName!}">
<title>${AppName!}</title>
<meta charset="UTF-8">
<!-- import CSS -->
<link rel="stylesheet"
href="${base!}/assets/platform/plugins/element-ui/lib/theme-chalk/index.css">
<style>
html, body, #app {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, SimSun, sans-serif;
font-weight: 400;
-webkit-font-smoothing: antialiased;
-webkit-tap-highlight-color: transparent;
background-color: #f8f8f8;
font-size: 14px;
overflow: hidden;
position: relative;
}
.login-container {
width: 100%;
height: 100%;
position: relative;
background-color: #ffffff;
background-image: url("/login.png");
background-size: cover;
}
.mobile-login-img {
display: none;
}
.login-content {
width: 500px;
padding: 20px;
position: absolute;
left: 50% !important;
transform: translate(-50%, -50%) translate(0) !important;
top: 50%;
background-color: #ffffff;
border: 5px solid #d9ecff;
border-radius: 5px;
overflow: hidden;
z-index: 1;
min-height: 380px;
}
.login-content-main {
margin: 0 auto;
width: 80%;
}
.login-tabs {
width: 100%;
}
.login-container .login-content .login-content-main .login-content-title {
color: #303133;
font-weight: 500;
font-size: 22px;
text-align: center;
letter-spacing: 4px;
margin: 15px 0 30px;
white-space: nowrap;
z-index: 5;
position: relative;
transition: all .3s ease;
}
.login-form {
margin-top: 20px;
}
.login-button {
width: 100%;
border-radius: 20px;
letter-spacing: 5px;
font-weight: 300;
margin-top: 15px;
}
@media screen and (max-width: 576px) {
.login-container .login-content {
width: 100% !important;
height: 100% !important;
padding: 20px 0 !important;
border-radius: 0 !important;
box-shadow: unset !important;
border: none !important;
}
.login-container .login-content-main {
margin-top: 60px;
}
.login-container .mobile-login-img {
display: block;
}
.login-container {
background-image: unset !important;
background-size: unset !important;
}
}
.login-code{
display: inline-block;
float: right;
width: 38%;
height: 38px;
}
.login-code img{
vertical-align: middle;
cursor: pointer;
}
</style>
</head>
<body>
<!--[if lt IE 9]>
<div class="ie-must-go-die">
<div class="ie-container">
<h1>
您正在IE的世界中
</h1>
<p>
本系统不支持IE9以下版本浏览器访问。
</p>
<a href="https://browsehappy.com" target="_blank">
您可以点击此处,下载Chrome/Firefox后再次访问本页面。
</a>
</div>
</div>
<![endif]-->
<div id="app" v-cloak>
<div class="login-container">
<div class="login-content">
<div class="mobile-login-img">
<embed src="/m-login.svg" style="width: 100%" type="image/svg+xml"/>
</div>
<div class="login-content-main">
<h4 class="login-content-title ml15">
${AppName!}系统登录
</h4>
<el-tabs class="login-tabs">
<el-tab-pane label="用户名登录">
<el-form :model="loginForm" :rules="loginRules" auto-complete="on"
class="login-form"
ref="loginForm">
<el-form-item prop="username">
<el-input
placeholder="账号或手机号码"
prefix-icon="el-icon-user"
type="text"
v-model="loginForm.username"
>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
@keyup.enter.native="doLogin"
placeholder="密码"
prefix-icon="el-icon-lock"
type="password"
v-model="loginForm.password"
>
</el-input>
</el-form-item>
<el-form-item prop="platformCaptcha">
<el-input
@keyup.enter.native="doLogin"
placeholder="验证码"
prefix-icon="el-icon-lock"
style="width: 60%"
type="password"
v-model="loginForm.platformCaptcha"
>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" alt="">
</div>
</el-form-item>
<el-form-item>
<el-button :disabled="disabled"
:loading="loading"
@click.native.prevent="doLogin"
class="login-button"
type="primary">
<span v-if="!loading">登 录</span>
<span v-else>登录中...</span>
</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
</div>
</div>
</div>
</div>
</body>
<script src="${base!}/assets/platform/plugins/vue/vue.min.js"></script>
<script src="${base!}/assets/platform/plugins/element-ui/lib/index.js"></script>
<script src="${base!}/assets/platform/plugins/jquery/jquery-1.11.1.min.js"></script>
<script>
var vue = new Vue({
el: '#app',
data() {
return {
loginForm: {
username: '',
password: '',
platformKey: '',
platformCaptcha: "",
},
loginRules: {
username: [
{required: true, trigger: ['blur', 'change'], message: '用户名不能为空'},
],
password: [
{required: true, trigger: ['blur', 'change'], message: '密码不能为空'},
],
platformCaptcha: [
{required: true, trigger: ['blur', 'change'], message: '验证码不能为空'},
],
},
loading: false,
disabled: false,
codeUrl: "${base!}/platform/login/captcha",
}
},
methods: {
async doLogin() {
try {
const valid = await this.$refs['loginForm'].validate()
if (valid) {
this.loading = true
const resp = await $.post("${base!}/platform/login/doLogin", this.loginForm)
this.loading = false
if (resp.code === 0) {
this.$message.success(resp.msg)
this.disabled = true
setTimeout(() => {
const redirect = this.getQueryString("redirect")
if (redirect) {
window.location.href = redirect
} else if (this.isMobile()) {
window.location.href = "${base!}/mobile/index"
} else {
window.location.href = "${base!}/platform/home"
}
}, 1000)
} else {
this.$message.error(resp.msg)
this.getCode()
}
}
} catch (e) {
console.log(e)
}
},
getQueryString(name) {
const reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
let r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]);
return "";
},
isMobile() {
const userAgentInfo = navigator.userAgent;
const mobileAgents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
let isMobile = false;
//根据userAgent判断是否是手机
isMobile = mobileAgents.some(v => userAgentInfo.includes(v))
const screen_width = window.screen.width;
const screen_height = window.screen.height;
//根据屏幕分辨率判断是否是手机 电脑上调成手机模式 可进入手机端 (●'◡'●)
if (screen_width < 500 && screen_height < 800) {
isMobile = true;
}
return isMobile;
},
async getCode() {
const {data} = await $.get('/platform/login/captcha')
this.codeUrl = data.codeUrl
this.loginForm.platformKey = data.key
}
},
mounted() {
window.addEventListener('pageshow', (event) => {
console.log(event)
this.loading = false
this.disabled = false
})
},
created(){
this.getCode()
}
})
</script>
<script src="${base!}/assets/platform/plugins/vue/vue.min.js"></script>
<script src="${base!}/assets/platform/plugins/element-ui/lib/index.js"></script>
</html>
@@ -0,0 +1,753 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<el-row justify="end" type="flex">
<el-col>
<div class="search">
<div class="search-item">
<div class="search-item-label">菜单名称:</div>
<div class="search-item-option">
<el-input clearable placeholder="请填写名称查询" style="width: 100%;"
v-model="menuName" @keyup.enter.native="doSearch"></el-input>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-col>
<el-button @click="openAdd" size="medium" type="primary">
<i class="ti-plus"></i>
新建菜单
</el-button>
<el-button @click="openSort" size="medium" type="primary">
排序
</el-button>
</el-row>
</el-card>
<el-card class="mt10" shadow="never">
<el-table :data="tableData"
:highlight-current-row="true"
:key="tableKey"
:load="loadChild"
:expand-row-keys="expandedRowKeysRenew"
@expand-change="handleExpandChange"
ref="tableData"
lazy
row-key="id"
style="width: 100%">
<el-table-column :show-overflow-tooltip="true" align="left" header-align="center"
label="菜单名称" prop="name" width="200">
</el-table-column>
<el-table-column :show-overflow-tooltip="true" header-align="center" label="URL"
prop="href">
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center"
label="资源类型" prop="type">
<template slot-scope="scope">
<i style="font-weight: bold" v-if="scope.row.type=='menu'">菜单</i>
<i v-if="scope.row.type=='data'">数据</i>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center"
label="权限标识"
prop="permission">
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center"
label="启用状态"
prop="disabled">
<template slot-scope="scope">
<i class="fa fa-circle text-danger ml5"
v-if="scope.row.disabled"></i>
<i class="fa fa-circle text-success ml5"
v-if="!scope.row.disabled"></i>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center"
label="操作" prop="website" 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:'add',id:scope.row.id,name:scope.row.name}"
v-if="scope.row.type=='menu'">
添加子菜单
</el-dropdown-item>
<el-dropdown-item
:command="{type:'enable',id:scope.row.id,name:scope.row.name,row:scope.row}"
divided>
启用
</el-dropdown-item>
<el-dropdown-item
:command="{type:'disable',id:scope.row.id,name:scope.row.name,row:scope.row}">
禁用
</el-dropdown-item>
<el-dropdown-item
:command="{type:'editMenu',id:scope.row.id,name:scope.row.name}"
divided
v-if="scope.row.type=='menu'">
修改
</el-dropdown-item>
<el-dropdown-item
:command="{type:'editData',id:scope.row.id,name:scope.row.name}"
divided
v-if="scope.row.type=='data'">
修改
</el-dropdown-item>
<el-dropdown-item
:command="{type:'delete',id:scope.row.id,name:scope.row.name}"
v-if="scope.row.path!='0001'">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-card>
</guava>
<el-dialog
:close-on-click-modal="false"
:visible.sync="addDialogVisible"
title="新建菜单"
width="50%">
<el-form :model="formData" :rules="formRules" label-width="80px" ref="addForm" size="small">
<el-form-item label="上级菜单" label-width="80px" prop="parentId">
<el-cascader :options="menuOptions" :props="props" placeholder="不选择则为顶级"
style="width: 100%"
v-if="!isAddFromSub" v-model="parentMenu"></el-cascader>
<el-input :disabled="true" type="text" v-if="isAddFromSub"
v-model="formData.parentName"></el-input>
</el-form-item>
<el-form-item label="菜单名称" prop="name">
<el-input auto-complete="off" maxlength="100"
placeholder="菜单名称"
tabindex="3" type="text" v-model="formData.name"></el-input>
</el-form-item>
<el-form-item label="菜单别名" prop="aliasName">
<el-input auto-complete="off" maxlength="100"
placeholder="菜单名称"
tabindex="4" type="text" v-model="formData.aliasName"></el-input>
</el-form-item>
<el-form-item label="权限标识" prop="permission">
<el-input auto-complete="off" maxlength="100"
placeholder="权限标识,如 sys.manager.menu"
tabindex="5" type="text" v-model="formData.permission"></el-input>
</el-form-item>
<el-form-item label="URL" prop="href">
<el-input auto-complete="off" maxlength="100"
placeholder="URL"
tabindex="6" type="text" v-model="formData.href"></el-input>
</el-form-item>
<el-form-item label="图标" prop="icon">
<el-input auto-complete="off" maxlength="100"
placeholder="图标"
tabindex="7" type="text" v-model="formData.icon"></el-input>
<span :class="formData.icon"></span>
</el-form-item>
<!--<el-form-item label="操作指南" prop="description">
<file-upload :files.sync="formData.description" :max="1" :type="['doc','docx','pdf']">
</file-upload>
</el-form-item>-->
<el-form-item label="启用状态" prop="disabled">
<el-switch
active-color="#ff4949"
inactive-color="#13ce66"
v-model="formData.disabled">
</el-switch>
</el-form-item>
<el-form-item label="数据权限" prop="type">
<el-radio-group @change="formRadioChange" size="mini" v-model="formData.children">
<el-radio label="false">无</el-radio>
<el-radio label="true">有</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
:key="menu.key"
:label="'权限' + (index+1)"
:prop="'buttons[' + index + ']'"
:rules="{required: true,validator: validateMenu,trigger: ['blur','change']}"
v-for="(menu, index) in formData.buttons"
v-if="formData.children=='true'"
>
<el-row :gutter="2">
<el-col :span="6">
<el-input placeholder="权限名称" v-model="menu.name"></el-input>
</el-col>
<el-col :span="13">
<el-input placeholder="权限标识,如 sys.manager.menu.add"
v-model="menu.permission"></el-input>
</el-col>
<el-col :span="4">
<el-button @click.prevent="formRemoveMenu(menu)" icon="el-icon-delete"
size="small"></el-button>
</el-col>
</el-row>
</el-form-item>
<el-row style="text-align: right;padding-right: 17px;" v-if="formData.children=='true'">
<el-button @click="formAddMenu" icon="el-icon-circle-plus" size="small">添加
</el-button>
</el-row>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button @click="doAdd" type="primary">确 定</el-button>
</span>
</el-dialog>
<el-dialog
:close-on-click-modal="false"
:visible.sync="editMenuDialogVisible"
title="修改菜单"
width="50%">
<el-form :model="formData" :rules="formRules" label-width="80px" ref="editMenuForm"
size="small">
<el-form-item label="上级菜单" label-width="80px" prop="parentId">
<el-input :disabled="true" type="text" v-model="formData.parentName"></el-input>
</el-form-item>
<el-form-item label="菜单名称" prop="name">
<el-input auto-complete="off" maxlength="100"
placeholder="菜单名称"
tabindex="3" type="text" v-model="formData.name"></el-input>
</el-form-item>
<el-form-item label="菜单别名" prop="aliasName">
<el-input auto-complete="off" maxlength="100"
placeholder="菜单名称"
tabindex="4" type="text" v-model="formData.aliasName"></el-input>
</el-form-item>
<el-form-item label="权限标识" prop="permission">
<el-input auto-complete="off" maxlength="100"
placeholder="权限标识,如 sys.manager.menu"
tabindex="5" type="text" v-model="formData.permission"></el-input>
</el-form-item>
<el-form-item label="URL" prop="href">
<el-input auto-complete="off" maxlength="100"
placeholder="URL"
tabindex="6" type="text" v-model="formData.href"></el-input>
</el-form-item>
<el-form-item label="图标" prop="icon">
<el-input auto-complete="off" maxlength="100"
placeholder="图标"
tabindex="7" type="text" v-model="formData.icon"></el-input>
<span :class="formData.icon"></span>
</el-form-item>
<el-form-item label="操作指南" prop="description">
<file-upload :files.sync="formData.description" :max="1" :type="['doc','docx','pdf']">
</file-upload>
</el-form-item>
<el-form-item label="启用状态" prop="disabled">
<el-switch
active-color="#ff4949"
inactive-color="#13ce66"
v-model="formData.disabled">
</el-switch>
</el-form-item>
<el-form-item label="数据权限" prop="type">
<el-radio-group @change="formRadioChange" size="mini" v-model="formData.children">
<el-radio label="false">无</el-radio>
<el-radio label="true">有</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
:key="menu.key"
:label="'权限' + (index+1)"
:prop="'buttons[' + index + ']'"
:rules="{required: true,validator: validateMenu,trigger: ['blur','change']}"
v-for="(menu, index) in formData.buttons"
v-if="formData.children=='true'"
>
<el-row :gutter="2">
<el-col :span="6">
<el-input placeholder="权限名称" v-model="menu.name"></el-input>
</el-col>
<el-col :span="13">
<el-input placeholder="权限标识,如 sys.manager.menu.add"
v-model="menu.permission"></el-input>
</el-col>
<el-col :span="4">
<el-button @click.prevent="formRemoveMenu(menu)" icon="el-icon-delete"
size="small"></el-button>
</el-col>
</el-row>
</el-form-item>
<el-row style="text-align: right;padding-right: 17px;" v-if="formData.children=='true'">
<el-button @click="formAddMenu" icon="el-icon-circle-plus" size="small">添加
</el-button>
</el-row>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="editMenuDialogVisible = false">取 消</el-button>
<el-button @click="doEditMenu" type="primary">确 定</el-button>
</span>
</el-dialog>
<el-dialog
:visible.sync="editDataDialogVisible"
title="修改权限"
width="50%">
<el-form :model="formData2" :rules="formRules2" label-width="80px" ref="editDataForm"
size="small">
<el-form-item label="权限名称" prop="name">
<el-input auto-complete="off" maxlength="100"
placeholder="权限名称"
tabindex="1" type="text" v-model="formData2.name"></el-input>
</el-form-item>
<el-form-item label="权限标识" prop="permission">
<el-input auto-complete="off" maxlength="100"
placeholder="权限标识,如 sys.manager.menu.add"
tabindex="2" type="text" v-model="formData2.permission"></el-input>
</el-form-item>
<el-form-item label="启用状态" prop="disabled">
<el-switch
active-color="#ff4949"
inactive-color="#13ce66"
v-model="formData2.disabled">
</el-switch>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="editDataDialogVisible = false">取 消</el-button>
<el-button @click="doEditData" type="primary">确 定</el-button>
</span>
</el-dialog>
<el-dialog
:visible.sync="sortDialogVisible"
title="菜单排序"
width="50%">
<el-tree
:allow-drop="sortAllowDrop"
:data="sortMenuData"
:props="defaultProps"
draggable
node-key="id"
ref="sortMenuTree"
>
<span class="custom-tree-node" slot-scope="scope">
<span>{{ scope.node.label }}</span>
</span>
</el-tree>
<span class="dialog-footer" slot="footer">
<el-button @click="sortDialogVisible = false">取 消</el-button>
<el-button @click="doSort" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: "#app",
data: function () {
return {
menuName:'',
addDialogVisible: false,
editMenuDialogVisible: false,
editDataDialogVisible: false,
sortDialogVisible: false,
isAddFromSub: false,
tableData: [],//后台取出的数据
tableKey: "",
formData: {
id: "",
parentId: "",
parentName: "",
type: "menu",
target: "data-pjax",
children: "false",
buttons: []
},
formRules: {
name: [
{required: true, message: '菜单名称', trigger: 'blur'}
],
permission: [
{required: true, message: '权限标识', trigger: ['blur', 'change']}
]
},
formData2: {},
formRules2: {
name: [
{required: true, message: '权限名称', trigger: 'blur'}
],
permission: [
{required: true, message: '权限标识', trigger: ['blur', 'change']}
]
},
menuOptions: [],
parentMenu: [],
sortMenuData: [],
defaultProps: {
children: 'children',
label: 'label'
},
props: {
lazy: true,
checkStrictly: true,
multiple: false,
lazyLoad: function (node, resolve) {
var url = base + "/platform/sys/menu/tree";
$.post(url, {pid: node.value}, function (data) {
if (data.code == 0) {
resolve(data.data);
}
}, "json");
}
},
// 保存展开状态的数组
expandedRowKeysRenew: [],
tableTreeRefreshTool:[],
}
},
methods: {
doSearch(){
this.initTreeTable()
},
//验证动态添加行数据
validateMenu: function (rule, value, callback) {
if (value.name == '') {
callback(new Error('权限名称不能为空'));
} else if (value.permission == '') {
callback(new Error('权限标识不能为空'));
} else {
callback();
}
},
formRadioChange: function (val) {
this.formData.children = val;
if ("true" == val) {
this.formData.buttons = [{
name: '',
permission: '',
key: Date.now()
}];
} else {
this.formData.buttons = [];
}
},
formRemoveMenu: function (menu) {
var index = this.formData.buttons.indexOf(menu);
if (index !== -1) {
this.formData.buttons.splice(index, 1);
}
},
formAddMenu: function () {
this.formData.buttons.push({
name: '',
permission: '',
key: Date.now()
});
},
//排序树加载
sortMenuLoad: function () {
var self = this;
$.post(base + "/platform/sys/menu/menuAll", {}, function (data) {
if (data.code == 0) {
self.sortMenuData = data.data;
}
}, "json");
},
//排序树控制不可跨级拖拽
sortAllowDrop: function (moveNode, inNode, type) {
if (moveNode.data.parentId == inNode.data.parentId) {
return type == 'prev';
}
},
//打开排序功能
openSort: function () {
this.sortDialogVisible = true;
this.sortMenuLoad();
},
//递归获取所有的ID值
getTreeIds: function (ids, data) {
var self = this;
data.forEach(function (obj) {
ids.push(obj.id);
if (obj.children && obj.children.length > 0) {
self.getTreeIds(ids, obj.children);
}
});
},
//提交排序后的数据
doSort: function () {
var self = this;
var ids = [];
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
self.getTreeIds(ids, self.sortMenuData);
$.post(base + "/platform/sys/menu/sortDo", {ids: ids.toString()}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.sortDialogVisible = false;
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
loading.close()
}, "json");
},
openAdd: function () {
var self = this;
self.isAddFromSub = false;
self.addDialogVisible = true;
self.parentMenu = [];
self.menuOptions = [];
//表单还原为初始值
self.formData = {
id: "",
parentId: "",
parentName: "",
type: "menu",
target: "data-pjax",
children: "false",
buttons: []
};
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
},
doAdd: function () {
var self = this;
var url = base + "/platform/sys/menu/addDo";
self.$refs["addForm"].validate(function (valid) {
if (valid) {//表单验证通过
if (!self.isAddFromSub) {//如果不是添加子菜单,则从级联选择框取父节点ID
self.formData.parentId = self.parentMenu[self.parentMenu.length - 1] || "";
}
$.post(url, {
menu: JSON.stringify(self.formData),
buttons: JSON.stringify(self.formData.buttons)
}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.addDialogVisible = false;
self.loadChildByExpandedKeys();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
doEditMenu: function () {
var self = this;
var url = base + "/platform/sys/menu/editMenuDo";
self.$refs["editMenuForm"].validate(function (valid) {
if (valid) {//表单验证通过
$.post(url, {
menu: JSON.stringify(self.formData),
buttons: JSON.stringify(self.formData.buttons)
}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.editMenuDialogVisible = false;
self.loadChildByExpandedKeys();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
doEditData: function () {
var self = this;
var url = base + "/platform/sys/menu/editDataDo";
self.$refs["editDataForm"].validate(function (valid) {
if (valid) {//表单验证通过
$.post(url, self.formData2, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.editDataDialogVisible = false;
self.loadChildByExpandedKeys();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
initTreeTable: function () {
var self = this;
var url = base + "/platform/sys/menu/child";
// 在更新数据前保存当前的展开状态
$.post(url, {pid: "",menuName:this.menuName}, function (data) {
if (data.code === 0) {
self.tableData = data.data;
self.tableKey = +new Date();
// 恢复展开状态
}
}, "json");
},
loadChild: function (tree, treeNode, resolve) {
// 在之前声明的全局变量中,增加一个key为 本条数据的id,id可替换为你数据中的任意唯一值
this.tableTreeRefreshTool[tree.id] = {}
// 重要!保存resolve方法,以便后续使用
this.tableTreeRefreshTool[tree.id].resolve = resolve
// 记录展开次数,具体作用后续介绍
this.tableTreeRefreshTool[tree.id].expandCount = 0
var url = base + "/platform/sys/menu/child";
$.post(url, {pid: tree.id}, function (data) {
if (data.code == 0) {
resolve(data.data);
}
}, "json");
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("add" == command.type) {
self.openAdd();
self.formData.parentId = command.id;
self.formData.parentName = command.name;
self.isAddFromSub = true;
}
if ("editMenu" == command.type) {
$.post(base + "/platform/sys/menu/editMenu/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.editMenuDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("editData" == command.type) {
$.post(base + "/platform/sys/menu/editData/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData2 = data.data;//加载后台表单数据
self.editDataDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("enable" == command.type || "disable" == command.type) {
$.post(base + "/platform/sys/menu/" + command.type + "/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
if ("disable" == command.type) {
command.row.disabled = true;
}
if ("enable" == command.type) {
command.row.disabled = false;
}
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除 ' + command.name, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/menu/delete/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.loadChildByExpandedKeys();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
},
handleExpandChange(row, expanded) {
if ((row.parentId === '' || row.parentId == null) && !expanded) {
this.expandedRowKeysRenew = []
return
}
if (expanded) {
this.expandedRowKeysRenew.push(row.id)
} else {
const index = this.expandedRowKeysRenew.findIndex(v => v === row.id)
this.expandedRowKeysRenew.splice(index, 1)
}
},
loadChildByExpandedKeys() {
if (this.expandedRowKeysRenew && this.expandedRowKeysRenew.length > 0) {
this.expandedRowKeysRenew.forEach((v) => {
const curr = this.tableTreeRefreshTool[v]
// api请求
$.get('/platform/sys/menu/child', {pid: v}).then(res => {
curr.resolve(res.data)
})
})
} else {
this.initTreeTable()
}
}
},
created: function () {
this.initTreeTable();
}
});
</script>
<!--#
}
#-->
@@ -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,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/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>
<!--#
}
#-->
@@ -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,291 @@
<!--#
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/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 mt5">
<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 mt5">
<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 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/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-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/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>
<!--#
}
#-->
@@ -0,0 +1,18 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-alert
title="对不起,您没有权限访问该页面。"
type="error">
</el-alert>
</div>
<script>
new Vue({
el: "#app"
});
</script>
<!--#
}
#-->
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,359 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button 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"
@sort-change='pageOrder'
header-align="center"
style="width: 100%"
>
<el-table-column
header-align="center"
label="原路径"
prop="url"
sortable>
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
header-align="center"
label="指向路径"
prop="toUrl">
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="转发方式" prop="type">
<template slot-scope="scope">
<span v-if="scope.row.type=='hide'">隐性转发</span>
<span v-if="scope.row.type=='show'">显性转发</span>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="启用状态"
prop="disabled"
sortable
>
<template slot-scope="scope">
<i class="fa fa-circle text-danger ml5" v-if="scope.row.disabled"></i>
<i class="fa fa-circle text-success ml5" v-if="!scope.row.disabled"></i>
</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:'enable',id:scope.row.id,name:scope.row.name,row:scope.row}">
启用
</el-dropdown-item>
<el-dropdown-item
:command="{type:'disable',id:scope.row.id,name:scope.row.name,row:scope.row}">
禁用
</el-dropdown-item>
<el-dropdown-item :command="{type:'edit',id:scope.row.id}" divided>
修改
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',id:scope.row.id,url:scope.row.url}">
删除
</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="新建路由"
:visible.sync="addDialogVisible"
width="40%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="url" label="原路径">
<el-input maxlength="100" placeholder="原路径"
v-model="formData.url"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="toUrl" label="指向路径">
<el-input placeholder="指向路径"
v-model="formData.toUrl"
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="hide">隐性转发</el-radio>
<el-radio label="show">显性转发</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="disabled" label="启用状态">
<el-switch
v-model="formData.disabled"
active-color="#ff4949"
inactive-color="#13ce66">
</el-switch>
</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>
<el-dialog
title="修改路由"
:visible.sync="editDialogVisible"
width="40%">
<el-form :model="formData" ref="editForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="url" label="原路径">
<el-input maxlength="100" placeholder="原路径"
v-model="formData.url"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="toUrl" label="指向路径">
<el-input placeholder="指向路径"
v-model="formData.toUrl"
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="hide">隐性转发</el-radio>
<el-radio label="show">显性转发</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="disabled" label="启用状态">
<el-switch
v-model="formData.disabled"
active-color="#ff4949"
inactive-color="#13ce66">
</el-switch>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
data: function () {
return {
addDialogVisible: false,
editDialogVisible: false,
tableData: [],
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formData: {
id: "",
type: "hide"
},
formRules: {
url: [
{required: true, message: '原路径', trigger: 'blur'}
],
toUrl: [
{required: true, message: '指向路径', trigger: 'blur'}
]
},
}
},
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/route/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");
},
formatAt: function (val) {
if (val && val > 0)
return moment(val).format("YYYY-MM-DD HH:mm");
return "";
},
doSearch: function () {
this.pageForm.pageNumber = 1;
this.pageData();
},
openAdd: function () {
var self = this;
this.addDialogVisible = true;
this.formData = {
id: "", type: "hide"
};//打开新增窗口,表单先清空
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
},
doAdd: function () {
var self = this;
self.$refs["addForm"].validate(function (valid) {
if (valid) {
$.post(base + "/platform/sys/route/addDo", self.formData, 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");
}
});
},
doEdit: function () {
var self = this;
self.$refs["editForm"].validate(function (valid) {
if (valid) {
$.post(base + "/platform/sys/route/editDo", self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.doSearch();//查询是带条件的,加载新建用户选择的单位用户数据
//self.pageData();
self.editDialogVisible = false;
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("enable" == command.type || "disable" == command.type) {
$.post(base + "/platform/sys/route/" + command.type + "/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
if ("disable" == command.type) {
command.row.disabled = true;
}
if ("enable" == command.type) {
command.row.disabled = false;
}
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("edit" == command.type) {
$.post(base + "/platform/sys/route/edit/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.editDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除 ' + command.url, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/route/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,575 @@
<!DOCTYPE html>
<html>
<head>
<title>Cron表达式生成器</title>
<link href="${base}/assets/platform/cron/css/easyui.min.css" rel="stylesheet" type="text/css"/>
<style type="text/css">
.line {
height: 25px;
line-height: 25px;
margin: 3px;
}
.imp {
padding-left: 25px;
}
.col {
width: 95px;
}
ul {
list-style: none;
padding-left: 10px;
}
li {
height: 20px;
}
body {
text-align: center; /*IE*/
text-align: -moz-center; /*Firefox*/
text-align: -webkit-center; /*Chrome*/
}
</style>
<script>
var base = "${base!}";
</script>
</head>
<body>
<div class="easyui-layout" style="width:830px;height:560px; border: 1px rgb(202, 196, 196) solid;
border-radius: 5px;">
<div style="height: 100%;">
<div class="easyui-tabs" data-options="fit:true,border:false">
<div title="秒">
<div class="line">
<input type="radio" checked="checked" name="second" onclick="everyTime(this)">
每秒 允许的通配符[, - * /]
</div>
<div class="line">
<input type="radio" name="second" onclick="cycle(this)">
周期从
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:58" value="1"
id="secondStart_0">
-
<input class="numberspinner" style="width: 60px;" data-options="min:2,max:59" value="2"
id="secondEnd_0">
秒
</div>
<div class="line">
<input type="radio" name="second" onclick="startOn(this)">
从
<input class="numberspinner" style="width: 60px;" data-options="min:0,max:59" value="0"
id="secondStart_1">
秒开始,每
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:59" value="1"
id="secondEnd_1">
秒执行一次
</div>
<div class="line">
<input type="radio" name="second" id="sencond_appoint">
指定
</div>
<div class="imp secondList">
<input type="checkbox" value="0">00
<input type="checkbox" value="1">01
<input type="checkbox" value="2">02
<input type="checkbox" value="3">03
<input type="checkbox" value="4">04
<input type="checkbox" value="5">05
<input type="checkbox" value="6">06
<input type="checkbox" value="7">07
<input type="checkbox" value="8">08
<input type="checkbox" value="9">09
</div>
<div class="imp secondList">
<input type="checkbox" value="10">10
<input type="checkbox" value="11">11
<input type="checkbox" value="12">12
<input type="checkbox" value="13">13
<input type="checkbox" value="14">14
<input type="checkbox" value="15">15
<input type="checkbox" value="16">16
<input type="checkbox" value="17">17
<input type="checkbox" value="18">18
<input type="checkbox" value="19">19
</div>
<div class="imp secondList">
<input type="checkbox" value="20">20
<input type="checkbox" value="21">21
<input type="checkbox" value="22">22
<input type="checkbox" value="23">23
<input type="checkbox" value="24">24
<input type="checkbox" value="25">25
<input type="checkbox" value="26">26
<input type="checkbox" value="27">27
<input type="checkbox" value="28">28
<input type="checkbox" value="29">29
</div>
<div class="imp secondList">
<input type="checkbox" value="30">30
<input type="checkbox" value="31">31
<input type="checkbox" value="32">32
<input type="checkbox" value="33">33
<input type="checkbox" value="34">34
<input type="checkbox" value="35">35
<input type="checkbox" value="36">36
<input type="checkbox" value="37">37
<input type="checkbox" value="38">38
<input type="checkbox" value="39">39
</div>
<div class="imp secondList">
<input type="checkbox" value="40">40
<input type="checkbox" value="41">41
<input type="checkbox" value="42">42
<input type="checkbox" value="43">43
<input type="checkbox" value="44">44
<input type="checkbox" value="45">45
<input type="checkbox" value="46">46
<input type="checkbox" value="47">47
<input type="checkbox" value="48">48
<input type="checkbox" value="49">49
</div>
<div class="imp secondList">
<input type="checkbox" value="50">50
<input type="checkbox" value="51">51
<input type="checkbox" value="52">52
<input type="checkbox" value="53">53
<input type="checkbox" value="54">54
<input type="checkbox" value="55">55
<input type="checkbox" value="56">56
<input type="checkbox" value="57">57
<input type="checkbox" value="58">58
<input type="checkbox" value="59">59
</div>
</div>
<div title="分钟">
<div class="line">
<input type="radio" checked="checked" name="min" onclick="everyTime(this)">
分钟 允许的通配符[, - * /]
</div>
<div class="line">
<input type="radio" name="min" onclick="cycle(this)">
周期从
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:58" value="1"
id="minStart_0">
-
<input class="numberspinner" style="width: 60px;" data-options="min:2,max:59" value="2"
id="minEnd_0">
分钟
</div>
<div class="line">
<input type="radio" name="min" onclick="startOn(this)">
从
<input class="numberspinner" style="width: 60px;" data-options="min:0,max:59" value="0"
id="minStart_1">
分钟开始,每
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:59" value="1"
id="minEnd_1">
分钟执行一次
</div>
<div class="line">
<input type="radio" name="min" id="min_appoint">
指定
</div>
<div class="imp minList">
<input type="checkbox" value="0">00
<input type="checkbox" value="1">01
<input type="checkbox" value="2">02
<input type="checkbox" value="3">03
<input type="checkbox" value="4">04
<input type="checkbox" value="5">05
<input type="checkbox" value="6">06
<input type="checkbox" value="7">07
<input type="checkbox" value="8">08
<input type="checkbox" value="9">09
</div>
<div class="imp minList">
<input type="checkbox" value="10">10
<input type="checkbox" value="11">11
<input type="checkbox" value="12">12
<input type="checkbox" value="13">13
<input type="checkbox" value="14">14
<input type="checkbox" value="15">15
<input type="checkbox" value="16">16
<input type="checkbox" value="17">17
<input type="checkbox" value="18">18
<input type="checkbox" value="19">19
</div>
<div class="imp minList">
<input type="checkbox" value="20">20
<input type="checkbox" value="21">21
<input type="checkbox" value="22">22
<input type="checkbox" value="23">23
<input type="checkbox" value="24">24
<input type="checkbox" value="25">25
<input type="checkbox" value="26">26
<input type="checkbox" value="27">27
<input type="checkbox" value="28">28
<input type="checkbox" value="29">29
</div>
<div class="imp minList">
<input type="checkbox" value="30">30
<input type="checkbox" value="31">31
<input type="checkbox" value="32">32
<input type="checkbox" value="33">33
<input type="checkbox" value="34">34
<input type="checkbox" value="35">35
<input type="checkbox" value="36">36
<input type="checkbox" value="37">37
<input type="checkbox" value="38">38
<input type="checkbox" value="39">39
</div>
<div class="imp minList">
<input type="checkbox" value="40">40
<input type="checkbox" value="41">41
<input type="checkbox" value="42">42
<input type="checkbox" value="43">43
<input type="checkbox" value="44">44
<input type="checkbox" value="45">45
<input type="checkbox" value="46">46
<input type="checkbox" value="47">47
<input type="checkbox" value="48">48
<input type="checkbox" value="49">49
</div>
<div class="imp minList">
<input type="checkbox" value="50">50
<input type="checkbox" value="51">51
<input type="checkbox" value="52">52
<input type="checkbox" value="53">53
<input type="checkbox" value="54">54
<input type="checkbox" value="55">55
<input type="checkbox" value="56">56
<input type="checkbox" value="57">57
<input type="checkbox" value="58">58
<input type="checkbox" value="59">59
</div>
</div>
<div title="小时">
<div class="line">
<input type="radio" checked="checked" name="hour" onclick="everyTime(this)">
小时 允许的通配符[, - * /]
</div>
<div class="line">
<input type="radio" name="hour" onclick="cycle(this)">
周期从
<input class="numberspinner" style="width: 60px;" data-options="min:0,max:23" value="0"
id="hourStart_0">
-
<input class="numberspinner" style="width: 60px;" data-options="min:2,max:23" value="2"
id="hourEnd_1">
小时
</div>
<div class="line">
<input type="radio" name="hour" onclick="startOn(this)">
从
<input class="numberspinner" style="width: 60px;" data-options="min:0,max:23" value="0"
id="hourStart_1">
小时开始,每
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:23" value="1"
id="hourEnd_1">
小时执行一次
</div>
<div class="line">
<input type="radio" name="hour" id="hour_appoint">
指定
</div>
<div class="imp hourList">
AM:
<input type="checkbox" value="0">00
<input type="checkbox" value="1">01
<input type="checkbox" value="2">02
<input type="checkbox" value="3">03
<input type="checkbox" value="4">04
<input type="checkbox" value="5">05
<input type="checkbox" value="6">06
<input type="checkbox" value="7">07
<input type="checkbox" value="8">08
<input type="checkbox" value="9">09
<input type="checkbox" value="10">10
<input type="checkbox" value="11">11
</div>
<div class="imp hourList">
PM:
<input type="checkbox" value="12">12
<input type="checkbox" value="13">13
<input type="checkbox" value="14">14
<input type="checkbox" value="15">15
<input type="checkbox" value="16">16
<input type="checkbox" value="17">17
<input type="checkbox" value="18">18
<input type="checkbox" value="19">19
<input type="checkbox" value="20">20
<input type="checkbox" value="21">21
<input type="checkbox" value="22">22
<input type="checkbox" value="23">23
</div>
</div>
<div title="日">
<div class="line">
<input type="radio" checked="checked" name="day" onclick="everyTime(this)">
日 允许的通配符[, - * / L W]
</div>
<div class="line">
<input type="radio" name="day" onclick="unAppoint(this)">
不指定
</div>
<div class="line">
<input type="radio" name="day" onclick="cycle(this)">
周期从
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:31" value="1"
id="dayStart_0">
-
<input class="numberspinner" style="width: 60px;" data-options="min:2,max:31" value="2"
id="dayEnd_0">
日
</div>
<div class="line">
<input type="radio" name="day" onclick="startOn(this)">
从
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:31" value="1"
id="dayStart_1">
日开始,每
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:31" value="1"
id="dayEnd_1">
天执行一次
</div>
<div class="line">
<input type="radio" name="day" onclick="workDay(this)">
每月
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:31" value="1"
id="dayStart_2">
号最近的那个工作日
</div>
<div class="line">
<input type="radio" name="day" onclick="lastDay(this)">
本月最后一天
</div>
<div class="line">
<input type="radio" name="day" id="day_appoint">
指定
</div>
<div class="imp dayList">
<input type="checkbox" value="1">1
<input type="checkbox" value="2">2
<input type="checkbox" value="3">3
<input type="checkbox" value="4">4
<input type="checkbox" value="5">5
<input type="checkbox" value="6">6
<input type="checkbox" value="7">7
<input type="checkbox" value="8">8
<input type="checkbox" value="9">9
<input type="checkbox" value="10">10
<input type="checkbox" value="11">11
<input type="checkbox" value="12">12
<input type="checkbox" value="13">13
<input type="checkbox" value="14">14
<input type="checkbox" value="15">15
<input type="checkbox" value="16">16
</div>
<div class="imp dayList">
<input type="checkbox" value="17">17
<input type="checkbox" value="18">18
<input type="checkbox" value="19">19
<input type="checkbox" value="20">20
<input type="checkbox" value="21">21
<input type="checkbox" value="22">22
<input type="checkbox" value="23">23
<input type="checkbox" value="24">24
<input type="checkbox" value="25">25
<input type="checkbox" value="26">26
<input type="checkbox" value="27">27
<input type="checkbox" value="28">28
<input type="checkbox" value="29">29
<input type="checkbox" value="30">30
<input type="checkbox" value="31">31
</div>
</div>
<div title="月">
<div class="line">
<input type="radio" checked="checked" name="mouth" onclick="everyTime(this)">
月 允许的通配符[, - * /]
</div>
<div class="line">
<input type="radio" name="mouth" onclick="unAppoint(this)">
不指定
</div>
<div class="line">
<input type="radio" name="mouth" onclick="cycle(this)">
周期从
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:12" value="1"
id="mouthStart_0">
-
<input class="numberspinner" style="width: 60px;" data-options="min:2,max:12" value="2"
id="mouthEnd_0">
月
</div>
<div class="line">
<input type="radio" name="mouth" onclick="startOn(this)">
从
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:12" value="1"
id="mouthStart_1">
日开始,每
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:12" value="1"
id="mouthEnd_1">
月执行一次
</div>
<div class="line">
<input type="radio" name="mouth" id="mouth_appoint">
指定
</div>
<div class="imp mouthList">
<input type="checkbox" value="1">1
<input type="checkbox" value="2">2
<input type="checkbox" value="3">3
<input type="checkbox" value="4">4
<input type="checkbox" value="5">5
<input type="checkbox" value="6">6
<input type="checkbox" value="7">7
<input type="checkbox" value="8">8
<input type="checkbox" value="9">9
<input type="checkbox" value="10">10
<input type="checkbox" value="11">11
<input type="checkbox" value="12">12
</div>
</div>
<div title="周">
<div class="line">
<input type="radio" checked="checked" name="week" onclick="everyTime(this)">
周 允许的通配符[, - * / L #]
</div>
<div class="line">
<input type="radio" name="week" onclick="unAppoint(this)">
不指定
</div>
<div class="line">
<input type="radio" name="week" onclick="startOn(this)">
周期 从星期<input class="numberspinner" style="width: 60px;" data-options="min:1,max:7"
id="weekStart_0" value="1">
-
<input class="numberspinner" style="width: 60px;" data-options="min:2,max:7" value="2"
id="weekEnd_0"></div>
<div class="line">
<input type="radio" name="week" onclick="weekOfDay(this)">
第<input class="numberspinner" style="width: 60px;" data-options="min:1,max:4" value="1"
id="weekStart_1">
周 的星期<input class="numberspinner" style="width: 60px;" data-options="min:1,max:7"
id="weekEnd_1" value="1"></div>
<div class="line">
<input type="radio" name="week" onclick="lastWeek(this)">
本月最后一个星期<input class="numberspinner" style="width: 60px;" data-options="min:1,max:7"
id="weekStart_2" value="1"></div>
<div class="line">
<input type="radio" name="week" id="week_appoint">
指定
</div>
<div class="imp weekList">
<input type="checkbox" value="1">1
<input type="checkbox" value="2">2
<input type="checkbox" value="3">3
<input type="checkbox" value="4">4
<input type="checkbox" value="5">5
<input type="checkbox" value="6">6
<input type="checkbox" value="7">7
</div>
</div>
<div title="年">
<div class="line">
<input type="radio" checked="checked" name="year" onclick="unAppoint(this)">
不指定 允许的通配符[, - * /] 非必填
</div>
<div class="line">
<input type="radio" name="year" onclick="everyTime(this)">
每年
</div>
<div class="line">
<input type="radio" name="year" onclick="cycle(this)">周期 从
<input class="numberspinner" style="width: 90px;" data-options="min:2018,max:3000"
id="yearStart_0" value="2018">
-
<input class="numberspinner" style="width: 90px;" data-options="min:2020,max:3000"
id="yearEnd_0" value="2020"></div>
</div>
</div>
</div>
<div data-options="region:'south',border:false" style="height:250px">
<fieldset style="border-radius: 3px; height: 220px;">
<legend>表达式</legend>
<table style="height: 100px;">
<tbody>
<tr>
<td>
</td>
<td align="center">
秒
</td>
<td align="center">
分钟
</td>
<td align="center">
小时
</td>
<td align="center">
日
</td>
<td align="center">
月<br/>
</td>
<td align="center">
星期
</td>
<td align="center">
年
</td>
</tr>
<tr>
<td>
表达式字段:
</td>
<td>
<input type="text" name="v_second" class="col" value="*" readonly="readonly"/>
</td>
<td>
<input type="text" name="v_min" class="col" value="*" readonly="readonly"/>
</td>
<td>
<input type="text" name="v_hour" class="col" value="*" readonly="readonly"/>
</td>
<td>
<input type="text" name="v_day" class="col" value="*" readonly="readonly"/>
</td>
<td>
<input type="text" name="v_mouth" class="col" value="*" readonly="readonly"/>
</td>
<td>
<input type="text" name="v_week" class="col" value="?" readonly="readonly"/>
</td>
<td>
<input type="text" name="v_year" class="col" readonly="readonly"/>
</td>
</tr>
<tr>
<td>Cron 表达式:</td>
<td colspan="6"><input type="text" name="cron" style="width: 100%;" value="* * * * * ?" id="cron"
/></td>
<td><input type="button" value="反解析到UI " id="btnFan" onclick="btnFan()"/></td>
</tr>
<tr>
<td colspan="8">最近5次运行时间:</td>
</tr>
<tr>
<td colspan="8" id="runTime">
</td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div>
</div>
</div>
<script src="${base}/assets/platform/plugins/jquery/jquery-1.11.1.min.js" type="text/javascript"></script>
<script src="${base}/assets/platform/cron/js/cron.js" type="text/javascript"></script>
</body>
</html>
@@ -0,0 +1,381 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button 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"
@sort-change='pageOrder'
header-align="center"
style="width: 100%"
>
<el-table-column
header-align="center"
label="任务名称"
prop="name"
sortable>
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
header-align="center"
label="执行类"
prop="jobClass">
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
header-align="center"
label="执行参数"
prop="data">
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="定时规则" prop="cron">
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="执行时间" prop="exeAt">
<template slot-scope="scope">
{{formatAt(scope.row.exeAt)}}
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="启用状态"
prop="disabled"
sortable
>
<template slot-scope="scope">
<i class="fa fa-circle text-danger ml5" v-if="scope.row.disabled"></i>
<i class="fa fa-circle text-success ml5" v-if="!scope.row.disabled"></i>
</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:'enable',id:scope.row.id,name:scope.row.name,row:scope.row}">
启用
</el-dropdown-item>
<el-dropdown-item
:command="{type:'disable',id:scope.row.id,name:scope.row.name,row:scope.row}">
禁用
</el-dropdown-item>
<el-dropdown-item :command="{type:'edit',id:scope.row.id}" divided>
修改
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',id:scope.row.id,name:scope.row.name}">
删除
</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="新建任务"
:visible.sync="addDialogVisible"
:close-on-click-modal="false"
width="50%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="name" label="任务名称">
<el-input maxlength="100" placeholder="任务名称"
v-model="formData.name"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="jobClass" label="执行类">
<el-input placeholder="执行类"
v-model="formData.jobClass"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="cron" label="执行周期">
<el-input placeholder="Cron表达式"
v-model="formData.cron"
auto-complete="off" tabindex="3" type="text">
<template slot="append"><a href="${base}/platform/sys/task/cron" style="color: #409EFF" target="_blank">表达式生成器</a>
</template>
</el-input>
</el-form-item>
<el-form-item prop="data" label="执行参数(Json)">
<el-input type="textarea" v-model="formData.data" placeholder="{}" tabindex="4" ></el-input>
</el-form-item>
<el-form-item prop="disabled" label="启用状态">
<el-switch
v-model="formData.disabled"
active-color="#ff4949"
inactive-color="#13ce66">
</el-switch>
</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>
<el-dialog
title="修改任务"
:visible.sync="editDialogVisible"
:close-on-click-modal="false"
width="50%">
<el-form :model="formData" ref="editForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="name" label="任务名称">
<el-input maxlength="100" placeholder="任务名称"
v-model="formData.name"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="jobClass" label="执行类">
<el-input placeholder="执行类"
v-model="formData.jobClass"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="cron" label="执行周期">
<el-input placeholder="Cron表达式"
v-model="formData.cron"
auto-complete="off" tabindex="3" type="text">
<template slot="append"><a href="${base}/platform/sys/task/cron" style="color: #409EFF" target="_blank">表达式生成器</a>
</template>
</el-input>
</el-form-item>
<el-form-item prop="data" label="执行参数(Json)">
<el-input type="textarea" v-model="formData.data" placeholder="{}" tabindex="4" ></el-input>
</el-form-item>
<el-form-item prop="disabled" label="启用状态">
<el-switch
v-model="formData.disabled"
active-color="#ff4949"
inactive-color="#13ce66">
</el-switch>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
data: function () {
return {
addDialogVisible: false,
editDialogVisible: false,
tableData: [],
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formData: {
id: ""
},
formRules: {
name: [
{required: true, message: '任务名称', trigger: 'blur'}
],
jobClass: [
{required: true, message: '执行类', trigger: 'blur'}
],
cron: [
{required: true, message: '执行周期', trigger: 'blur'}
],
},
}
},
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/task/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");
},
formatAt: function (val) {
if (val && val > 0)
return moment(val).format("YYYY-MM-DD HH:mm:ss");
return "";
},
doSearch: function () {
this.pageForm.pageNumber = 1;
this.pageData();
},
openAdd: function () {
var self = this;
this.addDialogVisible = true;
this.formData = {};//打开新增窗口,表单先清空
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
},
doAdd: function () {
var self = this;
self.$refs["addForm"].validate(function (valid) {
if (valid) {
$.post(base + "/platform/sys/task/addDo", self.formData, 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");
}
});
},
doEdit: function () {
var self = this;
self.$refs["editForm"].validate(function (valid) {
if (valid) {
$.post(base + "/platform/sys/task/editDo", self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.doSearch();//查询是带条件的,加载新建用户选择的单位用户数据
//self.pageData();
self.editDialogVisible = false;
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("enable" == command.type || "disable" == command.type) {
$.post(base + "/platform/sys/task/" + command.type + "/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
if ("disable" == command.type) {
command.row.disabled = true;
}
if ("enable" == command.type) {
command.row.disabled = false;
}
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("edit" == command.type) {
$.post(base + "/platform/sys/task/edit/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.editDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除 ' + command.name, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/task/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>
<!--#
}
#-->
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,225 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava>
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-select clearable="true" placeholder="请选择高校" v-model="pageForm.searchName">
<el-option :label="gx.gxname" :value="gx.gxid" v-for="gx in gxlist"></el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入名称" v-model="pageForm.searchKeyword">
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button @click="pageData()" icon="el-icon-search" slot="append" type="primary"></el-button>
</div>
<div class="pull-right offscreen-right mt5" style="margin-right: 10px;">
<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" :highlight-current-row="true"
style="width: 100%">
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center"
label="校区名称" prop="dq_name">
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center"
label="所属高校" prop="gxname">
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center"
label="操作" prop="website" width="300">
<template slot-scope="scope">
<el-row>
<el-button @click="openEdit(scope.row)" size="mini" type="primary">修改
</el-button>
<el-button @click="dodel(scope.row.dq_id)" size="mini" type="danger">删除</el-button>
</el-row>
</template>
</el-table-column>
</el-table>
</el-card>
</guava>
<el-dialog
title="新增校区"
:visible.sync="addDialogVisible"
custom-class="ViewDialogClass"
width="30%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="dq_name" label="校区名称">
<el-input maxlength="100" placeholder="校区名称"
v-model="formData.dq_name"
auto-complete="off" type="text"></el-input>
</el-form-item>
<el-form-item prop="gx_id" label="所属高校">
<el-select placeholder="请选择高校" style="width: 100%" v-model="formData.gx_id" clearable="true">
<el-option v-for="gx in gxlist" :value="gx.gxid" :label="gx.gxname"></el-option>
</el-select>
</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>
<el-dialog
title="修改校区"
:visible.sync="editDialogVisible"
custom-class="ViewDialogClass"
width="30%">
<el-form :model="formData" ref="editForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="dq_name" label="校区名称">
<el-input maxlength="100" placeholder="校区名称"
v-model="formData.dq_name"
auto-complete="off" type="text"></el-input>
</el-form-item>
<el-form-item prop="gx_id" label="所属高校">
<el-select placeholder="请选择高校" style="width: 100%" v-model="formData.gx_id" clearable="true">
<el-option v-for="gx in gxlist" :value="gx.gxid" :label="gx.gxname"></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doedit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
var vm=new Vue({
el:"#app",
data:function () {
return{
pageForm:{
searchKeyword:"",
searchName:""
},
tableData:[],
formData:{},
addDialogVisible:false,
gxlist:[],
editDialogVisible:false,
formRules:{
dq_name: [
{ required: true, message: '请输入校区名称', trigger: 'blur' }
],
gx_id: [
{ required: true, message: '请选择高校', trigger: ['change','blur'] }
]
}
}
},
methods:{
pageData:function(){
var self=this;
$.post(base+"/platform/sys/dq/data",self.pageForm,function (data) {
if (data.data.dq==undefined||data.data.dq==""){
self.tableData=[]
}else{
self.tableData=data.data.dq;
}
self.gxlist=data.data.gx;
})
},
openAdd:function () {
this.formData={}
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
this.addDialogVisible=true;
},
openEdit:function(row){
this.formData=row
this.editDialogVisible=true;
},
doadd:function () {
var self=this;
self.$refs["addForm"].validate(function (valid) {
if (valid) {
$.post(base+"/platform/sys/dq/add",self.formData,function (data) {
if (data.code==0){
self.$message({
message: data.msg,
type: 'success'
});
self.addDialogVisible=false;
self.pageData();
} else{
self.$message({
message: data.msg,
type: 'error'
});
}
})
}
})
},
doedit:function () {
var self=this;
$.post(base+"/platform/sys/dq/upd",self.formData,function (data) {
if (data.code==0){
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
self.editDialogVisible=false;
} else{
self.$message({
message: data.msg,
type: 'error'
});
}
})
},
dodel:function (id) {
var self=this;
self.$confirm('此操作将删除此校区', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base+"/platform/sys/dq/del",{dq_id:id},function (data) {
if (data.code==0){
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
} else{
self.$message({
message: data.msg,
type: 'error'
});
}
})
}
}
})
}
},
created:function () {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,249 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-input @keyup.enter.native="doSearch" placeholder="请输入内容" v-model="searchForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend" style="width: 120px;" v-model="searchForm.searchName">
<el-option label="高校名称" value="gxname"></el-option>
<el-option label="高校编号" value="gxid"></el-option>
</el-select>
<el-button @click="doSearch" icon="el-icon-search" slot="append"></el-button>
</el-input>
</div>
<div class="pull-right offscreen-right mt5" style="margin-right: 10px;">
<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" :highlight-current-row="true"
style="width: 100%">
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center"
label="高校编号" prop="gxid">
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center"
label="高校名称" prop="gxname">
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center"
label="操作" prop="website" width="300">
<template slot-scope="scope">
<el-row>
<el-button @click="openedit(scope)" size="mini" type="primary">修改
</el-button>
<el-button @click="deletegx(scope)" size="mini" type="danger">删除</el-button>
</el-row>
</template>
</el-table-column>
</el-table>
</el-card>
</guava>
<el-dialog
title="新增高校"
:visible.sync="addDialogVisible"
custom-class="ViewDialogClass"
width="30%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="gxid" label="高校编码">
<el-input maxlength="100" placeholder="高校编码"
v-model="formData.gxid"
auto-complete="off" type="text"></el-input>
</el-form-item>
<el-form-item prop="gxname" label="高校名称">
<el-input maxlength="100" placeholder="高校名称"
v-model="formData.gxname"
auto-complete="off" type="text"></el-input>
</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>
<el-dialog
title="编辑高校"
:visible.sync="editDialogVisible"
custom-class="ViewDialogClass"
width="30%">
<el-form :model="formData" ref="editForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="gxname" label="高校名称">
<el-input maxlength="100" placeholder="高校名称"
v-model="formData.gxname"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
data: function () {
return {
addDialogVisible: false,
editDialogVisible: false,
tableData: [],//后台取出的数据
searchForm: {
searchName: "",
searchKeyword: "",
},
formData: {
gxid: "",
gxname: ""
},
formRules: {
gxid: [
{required: true, message: '高校编码', trigger: 'blur'}
],
gxname: [
{required: true, message: '高校名称', trigger: 'blur'}
]
},
options: [],
}
},
methods: {
doplAdd: function () {
var self = this;
var url = base + "/platform/sys/unit/pleditDo";
self.formData.parentId = self.parentUnit[self.parentUnit.length - 1] || "";
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
openAdd: function () {
var self = this;
this.addDialogVisible = true;
this.formData = {};//打开新增窗口,表单先清空
},
doAdd: function () {
var self = this;
var url = base + "/platform/sys/gx/addDo";
self.$refs["addForm"].validate(function (valid) {
if (valid) {//表单验证通过
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.addDialogVisible = false;
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
doEdit: function () {
var self = this;
var url = base + "/platform/sys/gx/editDo";
self.$refs["editForm"].validate(function (valid) {
if (valid) {//表单验证通过
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.editDialogVisible = false;
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
initTreeTable: function () {
var self = this;
var url = base + "/platform/sys/gx/data";
$.post(url, self.searchForm, function (data) {
if (data.code == 0) {
self.tableData = data.data;
}
}, "json");
},
doSearch: function () {
this.initTreeTable();
},
openedit: function (scope) {
var self = this;
$.post(base + "/platform/sys/gx/edit/" + scope.row.gxid, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.editDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
deletegx: function (scope) {
var self = this;
self.$confirm('此操作将删除 ' + scope.row.gxname, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/gx/delete/" + scope.row.gxid, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
},
created: function () {
this.initTreeTable();
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,318 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-button size="medium" @click="openAdd"><i class="ti-plus"></i> 新建单位</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :key="tableKey" :data="tableData" style="width: 100%" size="small"
:highlight-current-row="true" row-key="id" lazy
:load="loadChild">
<el-table-column label="单位名称" header-align="center" prop="name"
width="200" :show-overflow-tooltip="true" align="left">
</el-table-column>
<el-table-column label="地址" header-align="center" prop="address"
:show-overflow-tooltip="true" align="center">
</el-table-column>
<el-table-column label="电话" header-align="center" prop="telephone"
:show-overflow-tooltip="true" align="center">
</el-table-column>
<el-table-column label="网址" header-align="center" prop="website"
:show-overflow-tooltip="true" align="center">
</el-table-column>
<el-table-column label="操作" header-align="center" prop="website"
:show-overflow-tooltip="true" align="center" 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:'edit',id:scope.row.id,name:scope.row.name}">
修改
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',id:scope.row.id,name:scope.row.name}"
v-if="scope.row.path!='0001'">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<el-dialog
title="新建单位"
:visible.sync="addDialogVisible"
:close-on-click-modal="false"
width="40%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="parentId" label="上级单位" label-width="80px">
<el-cascader :props="props" :options="options" v-model="parentUnit" placeholder="不选择则为顶级" style="width: 100%"></el-cascader>
</el-form-item>
<el-form-item prop="name" label="单位名称">
<el-input maxlength="100" placeholder="单位名称"
v-model="formData.name"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="aliasName" label="单位别名">
<el-input maxlength="100" placeholder="单位别名"
v-model="formData.aliasName"
auto-complete="off" tabindex="3" type="text"></el-input>
</el-form-item>
<el-form-item prop="unitcode" label="机构编码">
<el-input maxlength="100" placeholder="机构编码"
v-model="formData.unitcode"
auto-complete="off" tabindex="4" type="text"></el-input>
</el-form-item>
<el-form-item prop="address" label="单位地址">
<el-input maxlength="100" placeholder="单位地址"
v-model="formData.address"
auto-complete="off" tabindex="5" type="text"></el-input>
</el-form-item>
<el-form-item prop="telephone" label="联系电话">
<el-input maxlength="100" placeholder="联系电话"
v-model="formData.telephone"
auto-complete="off" tabindex="6" type="text"></el-input>
</el-form-item>
<el-form-item prop="email" label="单位邮箱">
<el-input maxlength="100" placeholder="单位邮箱"
v-model="formData.email"
auto-complete="off" tabindex="7" type="text"></el-input>
</el-form-item>
<el-form-item prop="website" label="单位网站">
<el-input maxlength="100" placeholder="单位网站"
v-model="formData.website"
auto-complete="off" tabindex="8" type="text"></el-input>
</el-form-item>
<el-form-item prop="note" label="单位介绍">
<el-input type="textarea" v-model="formData.note"></el-input>
</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>
<el-dialog
title="编辑单位"
:visible.sync="editDialogVisible"
:close-on-click-modal="false"
width="40%">
<el-form :model="formData" ref="editForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="name" label="单位名称">
<el-input maxlength="100" placeholder="单位名称"
v-model="formData.name"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="aliasName" label="单位别名">
<el-input maxlength="100" placeholder="单位别名"
v-model="formData.aliasName"
auto-complete="off" tabindex="3" type="text"></el-input>
</el-form-item>
<el-form-item prop="unitcode" label="机构编码">
<el-input maxlength="100" placeholder="机构编码"
v-model="formData.unitcode"
auto-complete="off" tabindex="4" type="text"></el-input>
</el-form-item>
<el-form-item prop="address" label="单位地址">
<el-input maxlength="100" placeholder="单位地址"
v-model="formData.address"
auto-complete="off" tabindex="5" type="text"></el-input>
</el-form-item>
<el-form-item prop="telephone" label="联系电话">
<el-input maxlength="100" placeholder="联系电话"
v-model="formData.telephone"
auto-complete="off" tabindex="6" type="text"></el-input>
</el-form-item>
<el-form-item prop="email" label="单位邮箱">
<el-input maxlength="100" placeholder="单位邮箱"
v-model="formData.email"
auto-complete="off" tabindex="7" type="text"></el-input>
</el-form-item>
<el-form-item prop="website" label="单位网站">
<el-input maxlength="100" placeholder="单位网站"
v-model="formData.website"
auto-complete="off" tabindex="8" type="text"></el-input>
</el-form-item>
<el-form-item prop="note" label="单位介绍">
<el-input type="textarea" v-model="formData.note"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
data: function () {
return {
addDialogVisible: false,
editDialogVisible: false,
tableData: [],//后台取出的数据
tableKey:"",
formData: {
id: "",
parentId: ""
},
formRules: {
name: [
{required: true, message: '单位名称', trigger: 'blur'}
],
email: [
{required: false, message: '单位邮箱', trigger: 'blur'},
{type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change']}
]
},
options: [],
parentUnit: [],
props: {
lazy: true,
checkStrictly:true,
multiple:false,
lazyLoad: function (node, resolve) {
var url = base + "/platform/sys/unit/tree";
$.post(url, {pid: node.value}, function (data) {
if (data.code == 0) {
resolve(data.data);
}
}, "json");
}
}
}
},
methods: {
openAdd: function () {
this.addDialogVisible = true;
this.formData = {};//打开新增窗口,表单先清空
this.parentUnit = [];
this.options=[];
},
doAdd: function () {
var self = this;
var url = base + "/platform/sys/unit/addDo";
self.$refs["addForm"].validate(function (valid) {
if (valid) {//表单验证通过
self.formData.parentId = self.parentUnit[self.parentUnit.length - 1] || "";
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.addDialogVisible = false;
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
doEdit: function () {
var self = this;
var url = base + "/platform/sys/unit/editDo";
self.$refs["editForm"].validate(function (valid) {
if (valid) {//表单验证通过
self.formData.parentId = self.parentUnit[self.parentUnit.length - 1];
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.editDialogVisible = false;
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
initTreeTable: function () {
var self = this;
var url = base + "/platform/sys/unit/child";
$.post(url, {pid: ""}, function (data) {
if (data.code == 0) {
self.tableData = data.data;
self.tableKey=+new Date();
}
}, "json");
},
loadChild: function (tree, treeNode, resolve) {
var url = base + "/platform/sys/unit/child";
$.post(url, {pid: tree.id}, function (data) {
if (data.code == 0) {
resolve(data.data);
}
}, "json");
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("edit" == command.type) {
$.post(base + "/platform/sys/unit/edit/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.editDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除 ' + command.name, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/sys/unit/delete/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
}
},
created: function () {
this.initTreeTable();
}
});
</script>
<!--#
}
#-->
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,90 @@
<div class="el-dialog__header">
<button type="button" data-dismiss="modal" aria-hidden="true" aria-label="Close" class="el-dialog__headerbtn"><i
class="el-dialog__close el-icon el-icon-close"></i></button>
<h4 class="modal-title">${msg['index.custommenu']}</h4>
</div>
<div class="modal-body">
<div class="list-group" style="text-align: center;">
<table width="88%" id="menuTable">
<!--#
var firstMenus=@shiro.getPrincipalProperty('firstMenus');
var secondMenus=@shiro.getPrincipalProperty('secondMenus');
var customMenu=@shiro.getPrincipalProperty('customMenu');
#-->
<!--#for(firstMenu in firstMenus){#-->
<tr>
<td width="20%" align="left"><strong><!--#if(lang=="zh_CN"){#-->${firstMenu.name}<!--#}else{#-->${firstMenu.aliasName}<!--#}#--></strong></td>
<td width="80%" align="left">
</td>
</tr>
<!--# if(!isEmpty(@secondMenus.get(firstMenu.path))){
for(secondMenu in @secondMenus.get(firstMenu.path)){
#-->
<tr>
<td width="20%" align="left" style="padding-left: 20px;"><!--#if(lang=="zh_CN"){#-->${secondMenu.name}<!--#}else{#-->${secondMenu.aliasName}<!--#}#--></td>
<td width="80%" align="left">
<!--# if(!isEmpty(@secondMenus.get(secondMenu.path))){
for(thMenu in @secondMenus.get(secondMenu.path)){ #-->
<input type="checkbox" value="${thMenu.id}" onclick="chk()" <!--#if(customMenu!=null&&@customMenu.indexOf(thMenu.id)>-1){#-->checked<!--#}#-->>
<!--#if(lang=="zh_CN"){#-->${thMenu.name}<!--#}else{#-->${thMenu.aliasName}<!--#}#-->
<!--#}}#-->
</td>
</tr>
<!--#}}#-->
<!--#}#-->
</table>
</div>
</div>
<div class="el-dialog__footer">
<span class="dialog-footer">
<button type="button" class="el-button el-button--default" data-dismiss="modal">
<span>${msg['system.cancel']}</span>
</button>
<button type="button" class="el-button el-button--primary" id="okCustom">
<span>${msg['system.confirm']}</span>
</button>
</span>
</div>
<script type="text/javascript">
function chk(){
var ids=[];
$("#menuTable").find("input[type=checkbox]").each(function(){
if($(this).prop("checked")){
ids.push($(this).val());
}
});
if(ids.length>5){
ELEMENT.Message({
message: "最多可选择5个菜单",
type: 'error'
});
return ids;
}
return ids;
}
$(function () {
$("#okCustom").on("click",function(){
var ids =chk();
if (ids.length<6) {
$('#homeDetail').modal('hide');
$.post("${base}/platform/sys/user/customDo", {ids: ids.toString()}, function (data) {
if (data.code == 0) {
ELEMENT.Message({
message: data.msg,
type: 'success'
});
setTimeout(function () {
window.location.reload();
},520);
} else {
ELEMENT.Message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
});
</script>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,92 @@
<div id="infoApp">
<div class="el-dialog__header">
<button type="button" data-dismiss="modal" aria-hidden="true" aria-label="Close" class="el-dialog__headerbtn"><i
class="el-dialog__close el-icon el-icon-close"></i></button>
<h4 class="modal-title">个人资料</h4>
</div>
<div class="modal-body">
<el-form :model="infoForm" ref="infoForm" :rules="infoRules" label-width="100px">
<el-row style="padding-bottom: 2px;">
<el-alert
title="请完善个人资料"
type="warning">
</el-alert>
</el-row>
<el-form-item label="姓名" prop="username">
<el-input size="small" maxlength="20" placeholder="姓名"
v-model="infoForm.username"
auto-complete="off" tabindex="1" ></el-input>
</el-form-item>
<el-form-item label="手机号码" prop="mobile">
<el-input size="small" maxlength="11" placeholder="手机号码"
v-model="infoForm.mobile"
auto-complete="off" tabindex="2" ></el-input>
</el-form-item>
<el-form-item label="电子邮箱" prop="email">
<el-input size="small" maxlength="50" placeholder="Email"
v-model="infoForm.email"
auto-complete="off" tabindex="3"></el-input>
</el-form-item>
</el-form>
</div>
<div class="el-dialog__footer">
<span class="dialog-footer">
<button type="button" class="el-button el-button--default" data-dismiss="modal">
<span>${msg['system.cancel']}</span>
</button>
<button type="button" class="el-button el-button--primary" @click="doInfo">
<span>${msg['system.confirm']}</span>
</button>
</span>
</div>
</div>
<script type="text/javascript">
new Vue({
el: '#infoApp',
data: function () {
return {
infoForm: {
username: "<!--#if(user.username!=user.mobile){#-->${user.username!}<!--#}#-->",
mobile: "${user.mobile!}",
email: "${user.email!}"
},
infoRules: {
username: [
{required: true, message: '请输入姓名', trigger: ['blur','change']}
],
mobile: [
{required: true, message: '请输入手机号码', trigger: ['blur','change']},
{pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码'}
],
email: [
{required: true, message: '请输入Email', trigger: ['blur','change']},
{type: 'email', message: '请输入正确的Email'}
]
},
}
},
methods: {
doInfo: function () {
var self = this
self.$refs["infoForm"].validate(function (valid) {
if (valid) {
$.post(base + "/platform/sys/user/doChangeInfo", self.infoForm, function (data) {
if (data.code == 0) {
$('#homeDetail').modal('hide');
self.$message({
message: data.msg,
type: 'success'
});
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
}
}
});
</script>
@@ -0,0 +1,60 @@
<div class="el-dialog__header">
<button type="button" data-dismiss="modal" aria-hidden="true" aria-label="Close" class="el-dialog__headerbtn"><i
class="el-dialog__close el-icon el-icon-close"></i></button>
<h4 class="modal-title">${msg['index.user.mode']}</h4>
</div>
<div class="modal-body">
<form id="modeForm" role="form" class="form-horizontal parsley-form" method="post">
<div class="row" style="padding-top: 10px;">
<div class="col-lg-12">
<div class="form">
<div class="col-sm-8">
<input name="mode" value="true" type="radio"
<!--#if(@shiro.getPrincipalProperty('loginPjax')){#-->checked<!--#}#--> > PJAX加载方式<br>优点:占用带宽少,加载速度快;<br>缺点:不能使用前进、后退功能。
</div>
</div>
</div>
</div>
<div class="row" style="padding-top: 10px;">
<div class="col-lg-12">
<div class="form">
<div class="col-sm-8">
<input name="mode" value="false" type="radio"
<!--#if(!@shiro.getPrincipalProperty('loginPjax')){#-->checked<!--#}#--> > 传统加载方式<br>优点:可以使用前进、后退功能;<br>缺点:页面会重载、刷新,占用带宽大。
</div>
</div>
</div>
</div>
</form>
</div>
<div class="el-dialog__footer">
<span class="dialog-footer">
<button type="button" class="el-button el-button--default" data-dismiss="modal">
<span>${msg['system.cancel']}</span>
</button>
<button type="button" class="el-button el-button--primary" id="okMode">
<span>${msg['system.confirm']}</span>
</button>
</span>
</div>
<script type="text/javascript">
$(function () {
$("#okMode").on("click", function () {
$.post("${base}/platform/sys/user/modeDo", {mode: $("input[type='radio'][name='mode']:checked").val()}, function (data) {
if (data.code == 0) {
$('#homeDetail').modal('hide');
ELEMENT.Message({
message: data.msg,
type: 'success'
});
} else {
ELEMENT.Message({
message: data.msg,
type: 'error'
});
}
}, "json");
});
});
</script>
@@ -0,0 +1,92 @@
<div id="passApp">
<div class="el-dialog__header">
<button type="button" data-dismiss="modal" aria-hidden="true" aria-label="Close" class="el-dialog__headerbtn"><i
class="el-dialog__close el-icon el-icon-close"></i></button>
<h4 class="modal-title">${msg['index.user.password']}</h4>
</div>
<div class="modal-body">
<el-form :model="passForm" ref="passForm" :rules="passRules" label-width="100px">
<el-form-item label="${msg['index.user.oldpass']}" prop="oldPassword">
<el-input size="small" maxlength="20" placeholder="${msg['index.user.oldpass']}" v-model="passForm.oldPassword"
auto-complete="off" tabindex="1" type="password"></el-input>
</el-form-item>
<el-form-item label="输入新密码" prop="newPassword">
<el-input size="small" maxlength="20" placeholder="${msg['index.user.newpass']}" v-model="passForm.newPassword"
auto-complete="off" tabindex="2" type="password"></el-input>
</el-form-item>
<el-form-item label="确认新密码" prop="passwordAgain">
<el-input size="small" maxlength="20" placeholder="${msg['index.user.rightpass']}"
v-model="passForm.passwordAgain"
auto-complete="off" tabindex="3" type="password"></el-input>
</el-form-item>
</el-form>
</div>
<div class="el-dialog__footer">
<span class="dialog-footer">
<button type="button" class="el-button el-button--default" data-dismiss="modal">
<span>${msg['system.cancel']}</span>
</button>
<button type="button" class="el-button el-button--primary" @click="doPass">
<span>${msg['system.confirm']}</span>
</button>
</span>
</div>
</div>
<script type="text/javascript">
new Vue({
el: '#passApp',
data: function () {
var self = this;
var validatePass = function (rule, value, callback) {
if (value !== self.passForm.newPassword) {
callback(new Error('两次输入密码不一致!'));
} else {
callback();
}
};
return {
passForm: {
oldPassword: "",
newPassword: "",
passwordAgain: ""
},
passRules: {
oldPassword: [
{required: true, message: '请输入原密码', trigger: 'blur'}
],
newPassword: [
{required: true, message: '请输入新密码', trigger: 'blur'},
{min: 3, max: 20, message: '密码长度必须是3-20位', trigger: 'change'}
],
passwordAgain: [
{required: true, message: '请再次输入新密码', trigger: 'blur'},
{validator: validatePass, trigger: 'change'}
]
},
}
},
methods: {
doPass: function () {
var self = this
self.$refs["passForm"].validate(function (valid) {
if (valid) {
$.post(base + "/platform/sys/user/doChangePassword", self.passForm, function (data) {
if (data.code == 0) {
$('#homeDetail').modal('hide');
self.$message({
message: data.msg,
type: 'success'
});
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
}
}
});
</script>
File diff suppressed because it is too large Load Diff