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

498 lines
22 KiB
HTML

<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
/* 隐藏掉el-tree中有disabled属性的框框 */
.el-checkbox__input.is-disabled{
//display: none;
}
.el-upload__tip {
display: none !important;
}
.uploadSource {
display: none!important;
}
.el-upload {
width: auto!important;
}
.el-tree {
height: 700px;
overflow-y: auto;
}
.svg-icon {
font-size: 60px;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label" v-html="'名&emsp;&emsp;称:'"></div>
<div class="search-item-option">
<el-input clearable placeholder="请填写名称查询" style="width: 350px;"
v-model="pageForm.name"></el-input>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="待办事项列表" ref="tableTool">
<template #func>
<el-button icon="el-icon-plus" @click="openAdd" size="small" type="primary">新增待办事项</el-button>
<el-button @click="openEdit" size="small" type="primary">批量编辑</el-button>
</template>
</table-tool>
<el-table :data="tableData" ref="table" :row-key="(row)=>row.id" @selection-change="(val)=>{selections = val}">
<el-table-column reserve-selection type="selection" width="55"></el-table-column>
<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"
>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="260">
<template v-slot="scope">
<el-button @click="openView(scope.row)" size="mini" type="primary">查看</el-button>
<el-button @click="doDelete(scope.row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
:current-page="pageForm.pageNumber"
:page-size="pageForm.pageSize"
:page-sizes="[5,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>
</template>
<template #edit>
<el-row :gutter="20">
<el-col :span="4">
<div>
<el-input
placeholder="输入关键字进行查找"
v-model="filterText">
</el-input>
</div>
<el-tree
class="tree-border"
:data="menuOptions"
:check-on-click-node="true"
show-checkbox
ref="tree"
:filter-node-method="filterNode"
:default-expanded-keys="defaultShowNodes"
node-key="id"
empty-text="加载中,请稍候"
@check-change="checkChange"
:props="defaultProps"
></el-tree>
</el-col>
<el-col :span="20">
<el-table :data="menuData" ref="menuData">
<el-table-column align="center" label="标题" prop="title">
<template v-slot="{row}">
<el-input v-model="row.title" placeholder="请填写标题"></el-input>
</template>
</el-table-column>
<el-table-column align="center" label="名称" prop="name">
<template v-slot="{row}">
<el-input v-model="row.name" placeholder="请填写名称"></el-input>
</template>
</el-table-column>
<el-table-column align="center" label="编码" prop="code">
<template v-slot="{row}">
<el-input v-model="row.code" placeholder="请填写编码"></el-input>
</template>
</el-table-column>
<el-table-column align="center" label="菜单地址" prop="href">
<template v-slot="{row}">
<el-input v-model="row.href" placeholder="请填写菜单地址"></el-input>
</template>
</el-table-column>
<el-table-column align="center" label="图标" prop="icon">
<template v-slot="{row, $index}">
<image-Upload :height="50" :width="50" :limit="1" :file-type="['png', 'jpg']" :file-size="1"
v-model="row.iconClass"></image-Upload>
</template>
</el-table-column>
<el-table-column align="center" label="颜色" prop="color">
<template v-slot="{row}">
<el-color-picker v-model="row.color"></el-color-picker>
</template>
</el-table-column>
<el-table-column align="center" label="移动端地址" prop="color">
<template v-slot="{row}">
<el-input v-model="row.mobileHref" placeholder="请填写移动端地址"></el-input>
</template>
</el-table-column>
<el-table-column align="center" label="表名" prop="queryTable">
<template v-slot="{row}">
<el-select @change="(val) => {queryTableChange(val, row)}" style="width: 100%"
filterable placeholder="请选择表名" v-model="row.queryTable">
<el-option
:key="item.TABLE_NAME"
:label="item.TABLE_NAME"
:value="item.TABLE_NAME"
v-for="item in queryTableList">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" label="字段名" prop="queryColumn">
<template v-slot="{row}">
<el-select style="width: 100%" placeholder="请选择字段名"
filterable v-model="row.queryColumn">
<el-option
:key="item.COLUMN_NAME"
:label="item.COLUMN_NAME"
:value="item.COLUMN_NAME"
v-for="item in row.columnList">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" label="审核值" prop="stateId">
<template v-slot="{row}">
<el-cascader :options="stateList" :props="props" v-model="row.stateArray"
:show-all-levels="false" @change="(node) => stateChange(node, row)"
filterable placeholder="请选择审核值" style="width: 100%"></el-cascader>
</template>
</el-table-column>
<el-table-column align="center" label="申请人id" prop="userIdColumn">
<template v-slot="{row}">
<el-select style="width: 100%" placeholder="请选择申请人id"
filterable v-model="row.userIdColumn">
<el-option
:key="item.COLUMN_NAME"
:label="item.COLUMN_NAME"
:value="item.COLUMN_NAME"
v-for="item in row.columnList">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" label="查询类型" prop="queryType">
<template v-slot="{row}">
<el-select style="width: 100%" placeholder="请选择查询类型"
filterable v-model="row.queryType">
<el-option key="1" label="无限制" value="all"></el-option>
<el-option key="2" label="本单位" value="unit"></el-option>
<el-option key="3" label="本工会" value="myUnion"></el-option>
<el-option key="4" label="本协会" value="club"></el-option>
<el-option key="5" label="本代表团" value="dbt"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作">
<template v-slot="{row, $index}">
<el-button @click="deleteRow(row, $index)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<div style="float: right;margin: 20px 0">
<el-button @click="$refs.guava.index()">取 消</el-button>
<el-button type="primary" @click="doHandle">确 定</el-button>
</div>
</el-col>
</el-row>
</template>
<template #view>
<el-descriptions :column="2" border>
<el-descriptions-item label="名称">{{ viewData.name }}</el-descriptions-item>
<el-descriptions-item label="编码">{{ viewData.code }}</el-descriptions-item>
<el-descriptions-item label="颜色">{{ viewData.color }}</el-descriptions-item>
<el-descriptions-item label="菜单地址">{{ viewData.href }}</el-descriptions-item>
<el-descriptions-item label="移动端地址">{{ viewData.mobileHref }}</el-descriptions-item>
<el-descriptions-item label="创建时间">{{ viewData.creatTime }}</el-descriptions-item>
<el-descriptions-item label="表名">{{ viewData.queryTable }}</el-descriptions-item>
<el-descriptions-item label="字段名">{{ viewData.queryColumn }}</el-descriptions-item>
<el-descriptions-item label="状态">{{ viewData.stateName }}</el-descriptions-item>
<el-descriptions-item label="图标" :span="2">
<img :src="CREATE_PREVIEW_URL(viewData.iconClass)" width="100" height="100"/>
</el-descriptions-item>
</el-descriptions>
</template>
</guava>
</div>
<script>
var vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{prop: 'title', label: '标题'},
{prop: 'name', label: '名称'},
{prop: 'code', label: '编码'},
],
defaultProps: {
children: "children",
label: "name"
},
menuOptions: [],
filterText: '',
menuData: [],
selections: [],
defaultShowNodes: [],
viewData: {},
dataBaseList: [],
stateList: [],
queryTableList: [],
stateOptions: [],
props: {
lazy: false,
checkStrictly: true,
multiple: false,
}
}
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
}
},
methods: {
stateChange(node, row) {
if(node.length > 0) {
row.stateId = node[node.length - 1]
}
},
queryTableChange(val, row) {
this.getColumnList(val, row)
},
async getColumnList(base, row) {
const resp = await $.get('/platform/needItems/columns', {
tableName: base,
})
this.$set(row, 'columnList', resp.data)
},
async doHandle() {
let isNext = false
this.menuData.forEach(item => {
if (item.name === '' || item.name === undefined) {
this.$message.warning('名称不能为空')
isNext = true
return
}
if (item.code === '' || item.code === undefined) {
this.$message.warning('编码不能为空')
isNext = true
return
}
if (item.queryTable === '' || item.queryTable === undefined) {
this.$message.warning('表名不能为空')
isNext = true
return
}
if (item.queryColumn === '' || item.queryColumn === undefined) {
this.$message.warning('字段名不能为空')
isNext = true
return
}
if (item.stateId === '' || item.stateId === undefined) {
this.$message.warning('状态不能为空')
isNext = true
return
}
})
if (isNext) {
return
}
for (const item of this.menuData) {
if(item.iconClass === undefined) {
this.$message.warning('图标不能为空')
isNext = true
return
}
}
if (isNext) {
return
}
const resp = await $.post('/platform/needItems/doHandle', {data: JSON.stringify(this.menuData)})
if(resp.code === 0) {
this.doSearch()
this.$message.success(resp.msg)
this.$refs.table.clearSelection()
this.$refs.guava.index()
}
},
deleteRow(row, index) {
this.menuData.splice(index, 1)
this.$refs.tree.setCheckedNodes(this.menuData)
},
openAdd() {
this.menuData = []
this.selections = []
this.defaultShowNodes = []
this.$refs.guava.edit()
this.$nextTick(() => {
this.$refs.table.clearSelection()
})
},
filterNode(value, data, node) {
if (!value) return true;
return data.menuName.indexOf(value) !== -1
},
async openView(row) {
this.stateList.forEach(item => {
item.children.forEach(o => {
if(o.value === row.stateId) {
row.stateName = o.label
}
})
})
this.viewData = row
this.$refs.guava.view()
},
async openEdit() {
if(this.selections.length === 0) {
this.$message.warning('请先在下方勾选')
return
}
for (const item of this.selections) {
await this.getColumnList(item.queryTable, item)
this.stateList.forEach(x => {
x.children.forEach(o => {
if(o.value === item.stateId) {
item.stateArray = [x.value, o.value]
}
})
})
}
this.$refs.guava.edit()
this.menuData = this.selections
this.$nextTick(() => {
this.$refs.tree.setCheckedKeys(this.menuData.map(o => o.menuId))
this.defaultShowNodes = this.menuData.map(o => o.menuId)
})
},
doDelete(id) {
this.$confirm('您确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {//确认后再执行
const resp = await $.post('/platform/needItems/doDelete', {id: id})
if(resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
}
}
}
})
},
pageData() {
$.post('/platform/needItems/pageData', this.pageForm).then(res => {
if (res.code === 0) {
this.tableData = res.data.list;
this.pageForm.totalCount = res.data.totalCount;
}
})
},
/** 查询菜单树结构 */
async getMenuTreeselect() {
const resp = await $.post('/platform/sys/menu/menuAll')
this.menuOptions = resp.data.filter(v=>!v.disabled)
this.setDisabled(this.menuOptions)
},
checkChange(currObj,isChecked) {
/* if(isChecked) { // 选中之后我们就重新设置下选中的节点(只设置当前选中的节点,即单选)
this.$refs.tree.setCheckedNodes([currObj])
} */
//this.menuData = this.$refs.tree.getCheckedNodes()
const array = []
this.$refs.tree.getCheckedNodes().forEach(item => {
let cloneItem = clone(item)
cloneItem.menuId = cloneItem.id
delete cloneItem.id
cloneItem.title = cloneItem.parentName
cloneItem.color = this.themeColor
const obj = this.selections.find(o => o.menuId === cloneItem.menuId)
array.push(obj !== undefined ? obj : cloneItem)
})
this.menuData = array
},
setDisabled(treeData) {
treeData.forEach(item => {
if(!item.href) {
item.disabled = true
}
if(item.children && item.children.length) {
this.setDisabled(item.children)
}
})
},
async getTableList() {
const resp = await $.get('/platform/needItems/getTableList')
this.queryTableList = resp.data
},
async getStateList() {
const resp = await $.get('/platform/needItems/getStateList')
this.stateList = resp.data
}
},
async created() {
await this.getMenuTreeselect()
await this.getTableList()
await this.getStateList()
this.pageData()
},
})
</script>
<!--#
}
#-->