pull/8/head
cwy 3 months ago
parent 0cc4c7b440
commit fa3736d39b

@ -1,187 +1,303 @@
<template> <template>
<!-- 使用 el-card 组件创建一个表单容器卡片设置阴影效果为无 -->
<el-card class="form-container" shadow="never"> <el-card class="form-container" shadow="never">
<!-- 使用 v-for 指令循环遍历 allResourceCate 数组中的每个元素cate同时传递索引index -->
<!-- 根据索引判断是否添加 'top-line' 类名第一个元素添加用于样式区分可能是添加顶部边框之类的效果并设置了唯一的 key -->
<div v-for="(cate,index) in allResourceCate" :class="index===0?'top-line':null" :key="'cate'+cate.id"> <div v-for="(cate,index) in allResourceCate" :class="index===0?'top-line':null" :key="'cate'+cate.id">
<!-- el-row 组件添加了 'table-layout' 类名用于样式布局设置了背景颜色 -->
<el-row class="table-layout" style="background: #F2F6FC;"> <el-row class="table-layout" style="background: #F2F6FC;">
<!-- el-checkbox 复选框组件双向绑定 cate 对象的 checked 属性通过调用 isIndeterminate 方法设置不确定状态绑定 change 事件到 handleCheckAllChange 方法 -->
<!-- 复选框显示的文本为 cate 对象的 name 属性值 -->
<el-checkbox v-model="cate.checked" <el-checkbox v-model="cate.checked"
:indeterminate="isIndeterminate(cate.id)" :indeterminate="isIndeterminate(cate.id)"
@change="handleCheckAllChange(cate)"> @change="handleCheckAllChange(cate)">
{{cate.name}} {{cate.name}}
</el-checkbox> </el-checkbox>
</el-row> </el-row>
<!-- 另一个 el-row 组件同样添加了 'table-layout' 类名用于样式布局 -->
<el-row class="table-layout"> <el-row class="table-layout">
<!-- 使用 v-for 指令循环遍历当前分类cate下的资源列表通过 getResourceByCate 方法获取每个资源对应一个 el-checkbox 组件 -->
<!-- 设置了 el-col 组件的占比为 8给每个复选框添加了上下内边距为 4px 的样式 -->
<el-col :span="8" v-for="resource in getResourceByCate(cate.id)" :key="resource.id" style="padding: 4px 0"> <el-col :span="8" v-for="resource in getResourceByCate(cate.id)" :key="resource.id" style="padding: 4px 0">
<!-- el-checkbox 复选框组件双向绑定 resource 对象的 checked 属性绑定 change 事件到 handleCheckChange 方法 -->
<!-- 复选框显示的文本为 resource 对象的 name 属性值 -->
<el-checkbox v-model="resource.checked" @change="handleCheckChange(resource)"> <el-checkbox v-model="resource.checked" @change="handleCheckChange(resource)">
{{resource.name}} {{resource.name}}
</el-checkbox> </el-checkbox>
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
<!-- 包含两个按钮的 div 容器设置了顶部外边距为 20px并使其内容居中对齐 -->
<div style="margin-top: 20px" align="center"> <div style="margin-top: 20px" align="center">
<!-- 保存按钮类型为主要primary点击时调用 handleSave 方法 -->
<el-button type="primary" @click="handleSave()"></el-button> <el-button type="primary" @click="handleSave()"></el-button>
<!-- 清空按钮点击时调用 handleClear 方法 -->
<el-button @click="handleClear()"></el-button> <el-button @click="handleClear()"></el-button>
</div> </div>
</el-card> </el-card>
</template> </template>
<script> <script>
import {fetchAllResourceList} from '@/api/resource'; // @/api/resource API
import {listAllCate} from '@/api/resourceCategory'; import {fetchAllResourceList} from '@/api/resource';
import {allocResource,listResourceByRole} from '@/api/role'; // @/api/resourceCategory API
import {listAllCate} from '@/api/resourceCategory';
// @/api/role API
import {allocResource, listResourceByRole} from '@/api/role';
export default { export default {
name: "allocResource", name: "allocResource",
data() { data() {
return { return {
roleId: null, // ID null
allResource: null, roleId: null,
allResourceCate: null // null API
}; allResource: null,
}, // null API
created() { allResourceCate: null
this.roleId = this.$route.query.roleId; };
this.getAllResourceCateList(); },
}, created() {
methods: { // ID roleId
getAllResourceList() { this.roleId = this.$route.query.roleId;
fetchAllResourceList().then(response => { //
this.allResource = response.data; this.getAllResourceCateList();
for (let i = 0; i < this.allResource.length; i++) { },
this.allResource[i].checked = false; methods: {
} //
this.getResourceByRole(this.roleId); getAllResourceList() {
}); // API Promise
}, fetchAllResourceList().then(response => {
getAllResourceCateList() { // allResource
listAllCate().then(response => { this.allResource = response.data;
this.allResourceCate = response.data; // checked false
for (let i = 0; i < this.allResourceCate.length; i++) {
this.allResourceCate[i].checked = false;
}
this.getAllResourceList();
});
},
getResourceByCate(categoryId) {
let cateResource = [];
if (this.allResource == null) return null;
for (let i = 0; i < this.allResource.length; i++) { for (let i = 0; i < this.allResource.length; i++) {
let resource = this.allResource[i]; this.allResource[i].checked = false;
if (resource.categoryId === categoryId) {
cateResource.push(resource);
}
}
return cateResource;
},
getResourceByRole(roleId){
listResourceByRole(roleId).then(response=>{
let allocResource = response.data;
this.allResource.forEach(item=>{
item.checked = this.getResourceChecked(item.id,allocResource);
});
this.allResourceCate.forEach(item=>{
item.checked = this.isAllChecked(item.id);
});
this.$forceUpdate();
});
},
getResourceChecked(resourceId,allocResource){
if(allocResource==null||allocResource.length===0) return false;
for(let i=0;i<allocResource.length;i++){
if(allocResource[i].id===resourceId){
return true;
}
}
return false;
},
isIndeterminate(categoryId) {
let cateResources = this.getResourceByCate(categoryId);
if (cateResources == null) return false;
let checkedCount = 0;
for (let i = 0; i < cateResources.length; i++) {
if (cateResources[i].checked === true) {
checkedCount++;
}
} }
return !(checkedCount === 0 || checkedCount === cateResources.length); // ID
}, this.getResourceByRole(this.roleId);
isAllChecked(categoryId) { });
let cateResources = this.getResourceByCate(categoryId); },
if (cateResources == null) return false; //
let checkedCount = 0; getAllResourceCateList() {
for (let i = 0; i < cateResources.length; i++) { // API Promise
if (cateResources[i].checked === true) { listAllCate().then(response => {
checkedCount++; // allResourceCate
} this.allResourceCate = response.data;
// checked false
for (let i = 0; i < this.allResourceCate.length; i++) {
this.allResourceCate[i].checked = false;
} }
if(checkedCount===0){ //
return false; this.getAllResourceList();
});
},
// ID
getResourceByCate(categoryId) {
//
let cateResource = [];
// null
if (this.allResource == null) return null;
//
for (let i = 0; i < this.allResource.length; i++) {
//
let resource = this.allResource[i];
// ID ID
if (resource.categoryId === categoryId) {
cateResource.push(resource);
} }
return checkedCount === cateResources.length; }
}, return cateResource;
handleSave() { },
this.$confirm('是否分配资源?', '提示', { // ID
confirmButtonText: '确定', getResourceByRole(roleId) {
cancelButtonText: '取消', // API ID Promise
type: 'warning' listResourceByRole(roleId).then(response => {
}).then(() => { // allocResource 便
let checkedResourceIds = new Set(); let allocResource = response.data;
if (this.allResource != null && this.allResource.length > 0) { // getResourceChecked
this.allResource.forEach(item => {
if (item.checked) {
checkedResourceIds.add(item.id);
}
});
}
let params = new URLSearchParams();
params.append("roleId", this.roleId);
params.append("resourceIds", Array.from(checkedResourceIds));
allocResource(params).then(response => {
this.$message({
message: '分配成功',
type: 'success',
duration: 1000
});
this.$router.back();
})
})
},
handleClear() {
this.allResourceCate.forEach(item => {
item.checked = false;
});
this.allResource.forEach(item => { this.allResource.forEach(item => {
item.checked = false; item.checked = this.getResourceChecked(item.id, allocResource);
});
// isAllChecked
this.allResourceCate.forEach(item => {
item.checked = this.isAllChecked(item.id);
}); });
//
this.$forceUpdate(); this.$forceUpdate();
}, });
handleCheckAllChange(cate) { },
let cateResources = this.getResourceByCate(cate.id); // ID
for (let i = 0; i < cateResources.length; i++) { getResourceChecked(resourceId, allocResource) {
cateResources[i].checked = cate.checked; // false
if (allocResource == null || allocResource.length === 0) return false;
//
for (let i = 0; i < allocResource.length; i++) {
// ID true
if (allocResource[i].id === resourceId) {
return true;
} }
this.$forceUpdate(); }
}, return false;
handleCheckChange(resource) { },
this.allResourceCate.forEach(item=>{ //
if(item.id===resource.categoryId){ isIndeterminate(categoryId) {
item.checked = this.isAllChecked(resource.categoryId); //
let cateResources = this.getResourceByCate(categoryId);
// false
if (cateResources == null) return false;
// 0
let checkedCount = 0;
//
for (let i = 0; i < cateResources.length; i++) {
if (cateResources[i].checked === true) {
checkedCount++;
}
}
// 0 true
return!(checkedCount === 0 || checkedCount === cateResources.length);
},
//
isAllChecked(categoryId) {
//
let cateResources = this.getResourceByCate(categoryId);
// false
if (cateResources == null) return false;
// 0
let checkedCount = 0;
//
for (let i = 0; i < cateResources.length; i++) {
if (cateResources[i].checked === true) {
checkedCount++;
}
}
// 0 false
if (checkedCount === 0) {
return false;
}
// true
return checkedCount === cateResources.length;
},
//
handleSave() {
// Set ID
let checkedResourceIds = new Set();
//
if (this.allResource!= null && this.allResource.length > 0) {
// checked true ID Set
this.allResource.forEach(item => {
if (item.checked) {
checkedResourceIds.add(item.id);
} }
}); });
this.$forceUpdate();
} }
// URLSearchParams
let params = new URLSearchParams();
// ID
params.append("roleId", this.roleId);
// ID Array.from
params.append("resourceIds", Array.from(checkedResourceIds));
// API Promise
allocResource(params).then(response => {
// success 1000
this.$message({
message: '分配成功',
type: 'success',
duration: 1000
});
//
this.$router.back();
})
},
//
handleClear() {
// checked false
this.allResourceCate.forEach(item => {
item.checked = false;
});
// checked false
this.allResource.forEach(item => {
item.checked = false;
});
//
this.$forceUpdate();
},
// /
handleCheckAllChange(cate) {
//
let cateResources = this.getResourceByCate(cate.id);
//
for (let i = 0; i < cateResources.length; i++) {
cateResources[i].checked = cate.checked;
}
//
this.$forceUpdate();
},
//
handleCheckChange(resource) {
//
this.allResourceCate.forEach(item => {
if (item.id === resource.categoryId) {
//
item.checked = this.isAllChecked(resource.categoryId);
}
});
//
this.$forceUpdate();
} }
} }
}
</script> </script>
<style scoped> <style scoped>
.table-layout { /* 定义了名为 'table-layout' 的类选择器样式规则,用于设置布局相关的样式 */
padding: 20px; .table-layout {
border-left: 1px solid #DCDFE6; /* 设置内边距为 20px使内部元素有合适的间距 */
border-right: 1px solid #DCDFE6; padding: 20px;
border-bottom: 1px solid #DCDFE6; /* 设置左边框样式,颜色为 #DCDFE6线条样式为实线宽度为 1px */
} border-left: 1px solid #DCDFE6;
/* 设置右边框样式,与左边框相同 */
border-right: 1px solid #DCDFE6;
/* 设置下边框样式,与左右边框相同 */
border-bottom: 1px solid #DCDFE6;
}
.top-line { /* 定义了名为 'top-line' 的类选择器样式规则,用于给元素添加顶部边框,可能用于区分不同部分等样式效果 */
border-top: 1px solid #DCDFE6; .top-line {
} border-top: 1px solid #DCDFE6;
}
</style><style scoped>
/* 定义了名为 'table-layout' 的类选择器样式规则,用于设置布局相关的样式 */
.table-layout {
/* 设置内边距为 20px使内部元素有合适的间距 */
padding: 20px;
/* 设置左边框样式,颜色为 #DCDFE6线条样式为实线宽度为 1px */
border-left: 1px solid #DCDFE6;
/* 设置右边框样式,与左边框相同 */
border-right: 1px solid #DCDFE6;
/* 设置下边框样式,与左右边框相同 */
border-bottom: 1px solid #DCDFE6;
}
/* 定义了名为 'top-line' 的类选择器样式规则,用于给元素添加顶部边框,可能用于区分不同部分等样式效果 */
.top-line {
border-top: 1px solid #DCDFE6;
}
</style><style scoped>
/* 定义了名为 'table-layout' 的类选择器样式规则,用于设置布局相关的样式 */
.table-layout {
/* 设置内边距为 20px使内部元素有合适的间距 */
padding: 20px;
/* 设置左边框样式,颜色为 #DCDFE6线条样式为实线宽度为 1px */
border-left: 1px solid #DCDFE6;
/* 设置右边框样式,与左边框相同 */
border-right: 1px solid #DCDFE6;
/* 设置下边框样式,与左右边框相同 */
border-bottom: 1px solid #DCDFE6;
}
/* 定义了名为 'top-line' 的类选择器样式规则,用于给元素添加顶部边框,可能用于区分不同部分等样式效果 */
.top-line {
border-top: 1px solid #DCDFE6;
}
</style> </style>

Loading…
Cancel
Save