| | |
| | | append-to-body |
| | | class="avue-dialog avue-dialog--top" |
| | | title="分类授权" |
| | | top="-45px" @close="closeDialog"> |
| | | top="-45px" |
| | | @close="closeDialog" |
| | | > |
| | | <el-table |
| | | :key="itemKey" |
| | | ref="dataTable" |
| | |
| | | @select-all="handleSelectionAll" |
| | | @selection-change="handleSelectionChange" |
| | | > |
| | | <el-table-column |
| | | type="selection" |
| | | width="55" |
| | | ></el-table-column> |
| | | <el-table-column type="selection" width="55"></el-table-column> |
| | | <el-table-column |
| | | v-for="(item, index) in classifyAuthHeader" |
| | | v-if="classifyAuthHeader.length !== 0" |
| | |
| | | v-if="item.type === 'select'" |
| | | slot="prepend" |
| | | v-model="row[item.prop]" |
| | | @change="selectChange(row.roleData,row)" |
| | | @change="selectChange(row.roleData, row)" |
| | | > |
| | | <el-option |
| | | v-for="optionItem in roleList" |
| | |
| | | <el-checkbox |
| | | v-if="item.type === 'checkbox'" |
| | | v-model="row[item.prop]" |
| | | :disabled="row.allDisabled ? true :row[item.code]"> |
| | | :disabled="row.authButton.allDisabled ? true : row.authButton[item.code]" |
| | | > |
| | | </el-checkbox> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button plain type="info" @click="selectAllButton">按钮全选</el-button> |
| | | <el-button class="el-icon-plus" plain type="success" @click="addClassifyAuth"></el-button> |
| | | <el-button class="el-icon-minus" plain type="warning" @click="subClassifyAuth"></el-button> |
| | | <el-button |
| | | class="el-icon-plus" |
| | | plain |
| | | type="success" |
| | | @click="addClassifyAuth" |
| | | ></el-button> |
| | | <el-button |
| | | class="el-icon-minus" |
| | | plain |
| | | type="warning" |
| | | @click="subClassifyAuth" |
| | | ></el-button> |
| | | <el-button plain type="primary" @click="submit">提 交</el-button> |
| | | <el-button plain type="danger" @click="isShowDialog = false">关 闭</el-button> |
| | | <el-button plain type="danger" @click="isShowDialog = false" |
| | | >关 闭</el-button |
| | | > |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | import {getButtonByParentCode} from "@/api/system/menu" |
| | | import {getPage} from "@/api/system/role" |
| | | import {saveOrUpdate, getClassifyAuthList, getButtonsByRoleId} from "@/api/system/classifyAuth" |
| | | import {v4 as uuidv4} from 'uuid'; |
| | | import { getButtonByParentCode } from "@/api/system/menu"; |
| | | import { getPage } from "@/api/system/role"; |
| | | import { |
| | | saveOrUpdate, |
| | | getClassifyAuthList, |
| | | getButtonsByRoleId, |
| | | } from "@/api/system/classifyAuth"; |
| | | import { v4 as uuidv4 } from "uuid"; |
| | | |
| | | export default { |
| | | name: "classifyAuthDialog.vue", |
| | |
| | | // 对话框显示控制 |
| | | isShowDialog: this.visible, |
| | | isLoading: false, |
| | | tableHeight: 'calc(100vh - 550px)', |
| | | tableHeight: "calc(100vh - 550px)", |
| | | classifyAuthData: [], |
| | | //列头 |
| | | classifyAuthHeader: [], |
| | |
| | | roleList: [], |
| | | //当前选中的表格行 |
| | | selectList: [], |
| | | itemKey: '', |
| | | itemKey: "", |
| | | addIndex: Number, |
| | | currentRow: {} |
| | | currentRow: {}, |
| | | }; |
| | | }, |
| | | computed: {}, |
| | | mounted() { |
| | | }, |
| | | created() { |
| | | }, |
| | | mounted() {}, |
| | | created() {}, |
| | | watch: { |
| | | // 监听父组件传的窗口显示隐藏的值 |
| | | visible() { |
| | | if (this.visible) { |
| | | this.isShowDialog = this.visible; |
| | | return new Promise((resolve, reject) => { |
| | | getButtonByParentCode({code: "classifyTree"}).then(res => { |
| | | // 记录按钮数据 |
| | | this.classifyAuthButton = res.data.data; |
| | | const list = res.data.data; |
| | | let tempData = []; |
| | | // 角色列 |
| | | tempData.push({ |
| | | label: "角色", |
| | | prop: "roleData", |
| | | type: "select", |
| | | width: 150, |
| | | }); |
| | | // 编码项分类授权 |
| | | tempData.push({ |
| | | label: "编码项分类授权", |
| | | prop: "classifyItem", |
| | | type: "text", |
| | | width: 180, |
| | | }); |
| | | list.forEach(item => { |
| | | let columnItem = { |
| | | label: item.name, |
| | | prop: item.id, |
| | | code: item.code, |
| | | type: "checkbox", |
| | | getButtonByParentCode({ code: "classifyTree" }) |
| | | .then((res) => { |
| | | // 记录按钮数据 |
| | | this.classifyAuthButton = res.data.data; |
| | | const list = res.data.data; |
| | | let tempData = []; |
| | | // 角色列 |
| | | tempData.push({ |
| | | label: "角色", |
| | | prop: "roleData", |
| | | type: "select", |
| | | width: 150, |
| | | }); |
| | | // 编码项分类授权 |
| | | tempData.push({ |
| | | label: "编码项分类授权", |
| | | prop: "classifyItem", |
| | | type: "text", |
| | | width: 180, |
| | | }; |
| | | tempData.push(columnItem); |
| | | }); |
| | | list.forEach((item) => { |
| | | let columnItem = { |
| | | label: item.name, |
| | | prop: item.id, |
| | | code: item.code, |
| | | type: "checkbox", |
| | | width: 180, |
| | | }; |
| | | tempData.push(columnItem); |
| | | }); |
| | | this.classifyAuthHeader = tempData; |
| | | resolve(); |
| | | }) |
| | | this.classifyAuthHeader = tempData; |
| | | resolve(); |
| | | }).catch(err => { |
| | | reject(err) |
| | | }); |
| | | .catch((err) => { |
| | | reject(err); |
| | | }); |
| | | // 获取角色列表 |
| | | getPage(1, -1, null).then(res => { |
| | | getPage(1, -1, null).then((res) => { |
| | | this.roleList = res.data.data.records; |
| | | }); |
| | | // 获取该分类下已授权的分类授权信息 |
| | | getClassifyAuthList({classifyId: this.classifyData.oid, authType: "classify_auth"}).then(res => { |
| | | getClassifyAuthList({ |
| | | classifyId: this.classifyData.oid, |
| | | authType: "classify_auth", |
| | | }).then((res) => { |
| | | //console.log(res.data.data); |
| | | let authDatas = res.data.data; |
| | | if (authDatas.length > 0) { |
| | |
| | | oid: authData.oid, |
| | | roleData: authData.roleId, |
| | | classifyItem: this.classifyData.label, |
| | | authButton:{}, |
| | | index: index, |
| | | uuid: uuidv4(),//生成唯一的id |
| | | } |
| | | uuid: uuidv4(), //生成唯一的id |
| | | }; |
| | | //将按钮设置进去 |
| | | authData.buttonIdList.forEach(data => { |
| | | authData.buttonIdList.forEach((data) => { |
| | | Vue.set(item, data, true); |
| | | }); |
| | | this.classifyAuthData.push(item); |
| | | this.addIndex = this.classifyAuthData.length - 1; //添加行下标等于classifyAuthData的长度-1 |
| | | this.roleHandlerMethods(authData.roleId, 'create', index) |
| | | this.roleHandlerMethods(authData.roleId, "create", index); |
| | | // console.log('index', index) |
| | | }) |
| | | }); |
| | | } |
| | | }); |
| | | }); |
| | |
| | | return; |
| | | } |
| | | |
| | | getButtonsByRoleId({roleId: id, code: 'classifyTree'}).then(res => { |
| | | getButtonsByRoleId({ roleId: id, code: "classifyTree" }).then((res) => { |
| | | // 找到this.classifyAuthButton中没有对应的属性 |
| | | const filteredItems = this.classifyAuthButton.filter(item => { |
| | | return !res.data.data.find(x => x.id === item.id); |
| | | const filteredItems = this.classifyAuthButton.filter((item) => { |
| | | return !res.data.data.find((x) => x.id === item.id); |
| | | }); |
| | | // console.log('禁用按钮',filteredItems) |
| | | // console.log('不禁用按钮',res.data.data) |
| | | //拿表格列头循环和没有对应的属性进行比较 |
| | | |
| | | this.classifyAuthHeader.forEach((item) => { |
| | | const isMatched = filteredItems.some(x => x.id === item.prop); |
| | | if (isMatched) { |
| | | this.$nextTick(() => { |
| | | if (this.classifyAuthData[index]) { |
| | | const isMatched = filteredItems.some((x) => x.id === item.prop); |
| | | this.$nextTick(() => { |
| | | if (this.classifyAuthData[index]) { |
| | | if (isMatched) { |
| | | Object.keys(this.classifyAuthData[index]).forEach((key) => { |
| | | |
| | | if (this.classifyAuthData[index].classify_view) { |
| | | this.$set(this.classifyAuthData[index], item.code, true); |
| | | } else { |
| | | this.classifyAuthData[index][item.code] = false; |
| | | } |
| | | // console.log(item.code) |
| | | // this.$set(this.classifyAuthData[index], item.code, true); |
| | | |
| | | this.$set(this.classifyAuthData[index].authButton,item.code,true); |
| | | }); |
| | | } else { |
| | | Object.keys(this.classifyAuthData[index]).forEach((key) => { |
| | | this.$set(this.classifyAuthData[index].authButton,item.code,false); |
| | | }); |
| | | } |
| | | }) |
| | | } else { |
| | | this.$nextTick(() => { |
| | | if (this.classifyAuthData[index]) { |
| | | Object.keys(this.classifyAuthData[index]).forEach((key) => { |
| | | if (item.prop === key) { |
| | | this.$set(this.classifyAuthData[index], item.code, false); |
| | | } |
| | | }); |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | }); |
| | | }); |
| | | |
| | | //添加 “查看全部禁用条件” |
| | | this.classifyAuthData.forEach((classkey, classIndex) => { |
| | | if (classkey.classify_view) { |
| | | this.$set(this.classifyAuthData[classIndex], 'allDisabled', true) |
| | | } else { |
| | | this.classifyAuthData[classIndex].allDisabled = false; |
| | | } |
| | | }); |
| | | // console.log('classifyAuthData',this.classifyAuthData) |
| | | if (this.classifyAuthData.authButton) { |
| | | this.classifyAuthData.forEach((classkey, classIndex) => { |
| | | if (classkey.authButton.classify_view) { |
| | | this.$set(this.classifyAuthData[classIndex].authButton,"allDisabled",true); |
| | | } else { |
| | | this.classifyAuthData[classIndex].authButton.allDisabled = false; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | //强制刷新表格 |
| | | this.itemKey = uuidv4(); |
| | | }) |
| | | }); |
| | | }, |
| | | async selectChange(row, currentRow) { |
| | | try { |
| | | this.currentRow = currentRow; |
| | | const res = await getButtonsByRoleId({roleId: row, code: 'classifyTree'}); |
| | | |
| | | const filteredItems = this.classifyAuthButton.filter(item => { |
| | | return !res.data.data.find(x => x.id === item.id); |
| | | const res = await getButtonsByRoleId({ |
| | | roleId: row, |
| | | code: "classifyTree", |
| | | }); |
| | | |
| | | this.classifyAuthHeader.forEach(item => { |
| | | const isMatched = filteredItems.some(x => x.id === item.prop); |
| | | const filteredItems = this.classifyAuthButton.filter((item) => { |
| | | return !res.data.data.find((x) => x.id === item.id); |
| | | }); |
| | | |
| | | this.classifyAuthHeader.forEach((item) => { |
| | | const isMatched = filteredItems.some((x) => x.id === item.prop); |
| | | this.$nextTick(() => { |
| | | if (currentRow) { |
| | | if (isMatched) { |
| | | Object.keys(currentRow).forEach(key => { |
| | | currentRow[item.code] = item.prop === key ? false : true; |
| | | if (!currentRow.classify_view) { |
| | | currentRow.allDisabled = false; |
| | | Object.keys(currentRow).forEach((key) => { |
| | | currentRow.authButton[item.code] = true; |
| | | if (!currentRow.authButton.classify_view) { |
| | | currentRow.authButton.allDisabled = false; |
| | | } |
| | | }); |
| | | } else { |
| | | Object.keys(currentRow).forEach(key => { |
| | | currentRow[item.code] = item.prop === key ? true : false; |
| | | if (!currentRow.classify_view) { |
| | | currentRow.allDisabled = false; |
| | | Object.keys(currentRow).forEach((key) => { |
| | | currentRow.authButton[item.code] = false; |
| | | if (!currentRow.authButton.classify_view) { |
| | | currentRow.authButton.allDisabled = false; |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | this.itemKey = uuidv4(); // 强制刷新表格 |
| | | }); |
| | | }); |
| | |
| | | }, |
| | | // 关闭对话框 |
| | | closeDialog() { |
| | | this.$emit('update:visible', false); |
| | | this.$emit("update:visible", false); |
| | | this.classifyAuthData = []; |
| | | }, |
| | | // 增加行 |
| | |
| | | let item = { |
| | | roleData: this.roleList[0].id, |
| | | classifyItem: this.classifyData.label, |
| | | authButton:{}, |
| | | index: this.addIndex, |
| | | uuid: uuidv4(),//生成唯一的id |
| | | } |
| | | uuid: uuidv4(), //生成唯一的id |
| | | }; |
| | | //将按钮设置进去 |
| | | this.classifyAuthButton.forEach(data => { |
| | | this.classifyAuthButton.forEach((data) => { |
| | | Vue.set(item, data.id, false); |
| | | }) |
| | | }); |
| | | this.classifyAuthData.push(item); |
| | | this.roleHandlerMethods(this.roleList[0].id, 'add', this.addIndex) |
| | | this.roleHandlerMethods(this.roleList[0].id, "add", this.addIndex); |
| | | }, |
| | | // 删除行 |
| | | subClassifyAuth() { |
| | | for (let item of this.selectList) { |
| | | let index = this.classifyAuthData.findIndex(data => data.index === item.index); |
| | | let index = this.classifyAuthData.findIndex( |
| | | (data) => data.index === item.index |
| | | ); |
| | | if (index !== -1) { |
| | | this.classifyAuthData.splice(index, 1); |
| | | } |
| | |
| | | // 保存分类授权信息 |
| | | submit() { |
| | | if (this.classifyAuthData.length <= 0) { |
| | | this.$message.warning('授权列表为空!') |
| | | this.$message.warning("授权列表为空!"); |
| | | return; |
| | | } |
| | | let isRepeat = false; |
| | |
| | | } |
| | | let form = []; |
| | | let flag = false; |
| | | this.classifyAuthData.forEach(item => { |
| | | this.classifyAuthData.forEach((item) => { |
| | | let itemButtonList = []; |
| | | //筛选出按钮勾选为true的列 |
| | | for (let key in item) { |
| | |
| | | classifyId: this.classifyData.oid, |
| | | buttonIds: itemButtonList.join(","), |
| | | authType: "classify_auth", |
| | | } |
| | | }; |
| | | form.push(data); |
| | | }); |
| | | if (flag) { |
| | | this.$message.warning('有未勾选操作的权限,不允许授权') |
| | | this.$message.warning("有未勾选操作的权限,不允许授权"); |
| | | return; |
| | | } |
| | | // console.log(form) |
| | | // 调用保存分类授权的接口 |
| | | saveOrUpdate(form).then(res => { |
| | | this.$message({ |
| | | type: "success", |
| | | message: res.data.msg, |
| | | }); |
| | | // this.isShowDialog = false |
| | | }, (error) => { |
| | | window.console.log(error); |
| | | }) |
| | | saveOrUpdate(form).then( |
| | | (res) => { |
| | | this.$message({ |
| | | type: "success", |
| | | message: res.data.msg, |
| | | }); |
| | | // this.isShowDialog = false |
| | | }, |
| | | (error) => { |
| | | window.console.log(error); |
| | | } |
| | | ); |
| | | }, |
| | | // 全选按钮 |
| | | selectAllButton() { |
| | |
| | | this.$message.warning("请只选择一行需要全选的按钮的数据行!"); |
| | | return; |
| | | } |
| | | this.classifyAuthButton.forEach(item => { |
| | | this.classifyAuthButton.forEach((item) => { |
| | | //console.log("item",item); |
| | | Vue.set(this.selectList[0], item.id, true); |
| | | }); |
| | |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | |
| | | // 滚动条样式修改 |
| | | // 滚动条的宽度 |
| | | /deep/ .el-table__body-wrapper::-webkit-scrollbar { |
| | |
| | | background: white; |
| | | border: white; |
| | | width: 10px; |
| | | |
| | | } |
| | | |
| | | // 滚动条的滑块 |
| | |
| | | /deep/ .el-table__body-wrapper { |
| | | height: calc(100% - 50px) !important; |
| | | } |
| | | |
| | | </style> |