<template> <div class="container-wrap layout-padding"> <el-card shadow="hover" class="top-card"> <div class="system-user-search"> <el-form :inline="true" :model="state.filters" ref="searchConditions"> <el-form-item label="Organization name" class="row-padding-bottom"> <el-input v-model="state.filters.org_name" size="default" placeholder="Please enter the organization name" clearable style="width: 220px"> </el-input> </el-form-item> <el-form-item label="" class="row-padding-bottom"> <el-button size="default" type="primary" class="ml10" @click="getTableData"> Query </el-button> <el-button size="default" class="ml10" @click="resetTableData"> Reset </el-button> </el-form-item> </el-form> </div> </el-card> <el-card shadow="hover"> <div class="header"> <div class="title">Permission group management</div> <div> <el-button v-hasBtn="'Button:roleManage:add'" size="default" type="primary" @click="openDialog('add')"> New </el-button> </div> </div> <el-table :data="state.tableData.data" v-loading="state.tableData.loading" style="width: 100%" :row-style="{ height: '44px' }" :header-cell-style="{ background: '#FAFAFA', height: '44px', color: '#333333' }" > <el-table-column prop="name" label="Permission group name"></el-table-column> <el-table-column prop="org_name" label="Organization name"></el-table-column> <el-table-column label="Operation" fixed="right"> <template #default="scope"> <el-link type="primary" @click="openDialog('detail', scope.row)" style="margin-right: 10px">Browse</el-link> <el-link type="primary" v-hasBtn="'Button:roleManage:update'" @click="openDialog('edit', scope.row)" style="margin-right: 10px" >Edit</el-link > <el-link type="primary" v-hasBtn="'Button:roleManage:del'" @click="toDel(scope.row)">Delete</el-link> </template> </el-table-column> </el-table> <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" class="mt15" :pager-count="5" :page-sizes="[10, 20, 30]" :current-page="state.filters.page_index" background :page-size="state.filters.page_size" layout="total, sizes, prev, pager, next, jumper" :total="state.tableData.total" > </el-pagination> <div v-if="state.dialog.isShowDialog" class="system-user-dialog-container"> <el-dialog :title="state.dialog.title" v-model="state.dialog.isShowDialog" width="900px" @close="onCancel"> <el-form ref="ruleFormRef" :model="state.ruleForm" :rules="state.rules" :disabled="state.dialog.title == 'Browse'" size="default" label-width="100px" > <el-row :gutter="35"> <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20"> <el-form-item label="Permission group name" prop="name"> <el-input v-model="state.ruleForm.name" placeholder="Please enter" maxlength="20" clearable></el-input> </el-form-item> </el-col> <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="mb20"> <el-form-item label="Organization name" prop="org_id" class="row-padding-bottom"> <el-select v-model="state.ruleForm.org_id" placeholder="Please select" clearable> <el-option v-for="(item, index) in state.orgsOption" :key="index" :label="item.name" :value="item.id"></el-option> </el-select> </el-form-item> </el-col> <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> <div class="small-title">Function permissions</div> <div class="small-title" style="padding-left: 52px">Data permissions</div> </el-col> <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> <el-form-item v-for="(item, i) in state.listPers" :key="i" :label="item.name" class="row-padding-bottom"> <div class="half-transfer"> <div class="el-transfer-panel"> <div class="all"> <el-checkbox v-model="state.selectTreeAll[i]" @change="handleSelectTreeAll($event, i)">All</el-checkbox> </div> <div class="input-wrap"> <el-input v-model="state.searchTreeInput[i]" placeholder="Please enter search content" clearable @clear="clearTreeSearch(i)"></el-input> </div> <div class="el-transfer__list"> <el-tree :ref="getTreeRef(i)" :data="item.perm_tree" :props="state.defaultProps" node-key="id" :default-expand-all="true" show-checkbox :default-checked-keys="item.perm_ids" :filter-node-method="filterNode" @check="handleCheckChange(i)" ></el-tree> </div> </div> </div> <!-- Whether to display the right side --> <div class="half-transfer" v-if="item.org_flag === 1" style="margin-right: 0"> <div class="el-transfer-panel"> <div class="all"> <el-checkbox v-model="state.selectOrgAll[i]" @change="handleSelectOrgAll($event, i)">All</el-checkbox> </div> <div class="input-wrap"> <el-input v-model="state.searchOrgInput[i]" placeholder="Please enter search content" clearable @clear="clearOrgSearch(i)"></el-input> </div> <div class="el-transfer__list"> <el-checkbox-group v-model="item.org_ids" @change="handleCheckbox($event, i)" class="el-transfer__list"> <el-checkbox v-for="(item, index) in filteredOptions[i]" :key="index" :label="item.id">{<!-- -->{ item.name }}< /el-checkbox> </el-checkbox-group> </div> </div> </div> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <span v-if="state.dialog.title != 'Browse'" class="dialog-footer"> <el-button @click="onCancel" size="default">Cancel</el-button> <el-button v-throttle type="primary" @click="onSubmit" size="default">OK</el-button> </span> </template> </el-dialog> </div> </el-card> </div> </template> <script setup name="perGroupManage"> import { ElMessageBox, ElMessage } from 'element-plus'; import { getRolelList, getListperm, getOrgslList, addRole, updateRole, delRole } from '/@/api/system.js'; const ruleFormRef = ref(null); //Define variable content const state = reactive({ // List query conditions filters: { page_index: 1, page_size: 10, }, tableData: { data: [], total: 0, loading: false, }, listPers: [], // Function permissions ruleForm: {}, currentStatus: true, orgsOption: [], // Institution rules: { name: [ { required: true, message: 'Please enter the permission group name', trigger: 'blur', }, ], org_id: [ { required: true, message: 'Please select an organization name', trigger: 'change', }, ], }, dialog: { isShowDialog: false, type: '', title: 'New', }, defaultProps: { children: 'children', label: 'name', value: 'id', }, selectTreeAll: [false], selectOrgAll: [false], searchTreeInput: [''], // Function permission tree search searchOrgInput: [''], //Multi-select search for data permissions role_id: '', }); const resetTableData = () => { state.filters = { page_index: 1, page_size: 10, }; getTableData(); }; //Data permission query const filteredOptions = computed(() => { return state.listPers.map((item, index) => { const searchText = state.searchOrgInput[index]; if (!searchText) { return item.orgsOption; } const filtered = item.orgsOption.filter((option) => option.name.toLowerCase().includes(searchText.toLowerCase())); return filtered; }); }); const treeRefs = ref([]); const getTreeRef = (index) => { return (el) => { treeRefs.value[index] = el; }; }; // tree search query watch( state.searchTreeInput, (newVal) => { try { for (let i in newVal) { treeRefs.value[i].filter(newVal[i]); } } catch (error) { console.log('error', error); } }, { deep: true } ); const filterNode = (value, data) => { if (!value) return true; return data.name.includes(value); }; //Select all user center trees const handleSelectTreeAll = (checked, i) => { console.log(11111, checked, i, getAllNodeKeys(state.listPers[i].perm_tree)); if (checked) { state.listPers[i].perm_ids = getAllNodeKeys(state.listPers[i].perm_tree); } else { state.listPers[i].perm_ids = []; treeRefs.value[i].setCheckedKeys([]); } }; // Data permissions select/unselect all const handleSelectOrgAll = (checked, i) => { console.log(2222, checked, i); if (checked) { state.listPers[i].org_ids = state.orgsOption.map((option) => option.id); } else { state.listPers[i].org_ids = []; } }; const getAllNodeKeys = (treeData) => { const keys = []; const traverse = (nodes) => { for (const node of nodes) { keys.push(node.id); if (node.children & amp; & amp; node.children.length > 0) { traverse(node.children); } } }; traverse(treeData); return keys; }; const handleCheckChange = (i) => { const checkedKeys = treeRefs.value[i].getCheckedKeys(); console.log(checkedKeys); state.listPers[i].perm_ids = checkedKeys; nextTick(() => { if (treeRefs.value[i]) { const nodes = treeRefs.value[i].root.childNodes; console.log(12345, nodes); const allChecked = nodes.every((node) => node.checked); state.selectTreeAll[i] = allChecked; } }); }; // Data permission selection problem const handleCheckbox = (data, i) => { console.log(1111111, data, i, state.listPers); if (state.listPers[i].org_ids.length === state.orgsOption.length) { state.selectOrgAll[i] = true; } else { state.selectOrgAll[i] = false; } }; const clearTreeSearch = (i) => { state.searchTreeInput[i] = ''; }; //Data permission search cleared const clearOrgSearch = (i) => { state.searchOrgInput[i] = ''; }; //Initialize table data const getTableData = () => { getRolelList(state.filters) .then((res) => { if (res.data.code === 1) { let data = res.data.data; state.tableData.data = data.rows; state.tableData.total = data.total; } }) .catch((error) => {}); }; // organization const getOption = () => { let params = { page_index: 1, page_size: 0, }; getOrgslList(params) .then((res) => { if (res.data.code === 1) { let data = res.data.data; state.orgsOption = data.rows; } }) .catch((error) => { console.log(error); }); }; //Page changes const onHandleCurrentChange = (val) => { state.filters.page_index = val; getTableData(); }; //Quantity per page const onHandleSizeChange = (val) => { state.filters.page_size = val; getTableData(); }; // edit const openDialog = async (type, row) => { state.dialog.isShowDialog = true; if (type === 'add') { state.dialog.title = 'New'; state.ruleForm = {}; state.role_id = ''; } else { state.role_id = row.id; const { name, org_id } = row; state.ruleForm.name = name; state.ruleForm.org_id = org_id; } if (type == 'edit') state.dialog.title = 'edit'; if (type == 'detail') state.dialog.title = 'Browse'; state.listPers = []; await getOption(); await getDiaListperm(type); }; //Query permission group const getDiaListperm = (type) => { getListperm({ role_id: state.role_id }) .then((res) => { if (res.data.code === 1) { state.listPers = res.data.data; for (let i = 0; i < state.listPers.length; i + + ) { if (!state.listPers[i].hasOwnProperty('orgsOption')) { state.listPers[i].orgsOption = []; // Add an empty array as the initial value } if (type === 'edit') { if (state.listPers[i].perm_tree.length > 0) { let arr1 = getAllLeaf(state.listPers[i].perm_tree); let arr2 = state.listPers[i].perm_ids; let arr3 = arr1.filter((item) => { return arr2.includes(item); }); state.listPers[i].perm_ids = arr3; } } state.listPers[i].orgsOption.push(...state.orgsOption); } console.log(12345678, state.listPers) } }) .catch((error) => { console.log(error); }); }; // Submit Add/Modify const onSubmit = () => { if (!ruleFormRef) return; ruleFormRef.value.validate((valid) => { if (valid) { // Data and function permissions must be selected const hasAnyValues = state.listPers.some((item) => item.perm_ids?.length || item.org_ids?.length); if (!hasAnyValues) { ElMessage.error('Please select at least one data and function permission'); return; } if (state.dialog.title === 'New') { saveAdd(); } else { saveUpdate(); } } else { return false; } }); }; // Add to const saveAdd = () => { state.ruleForm.modules = state.listPers; addRole(state.ruleForm) .then((res) => { if (res.data.code === 1) { ElMessage.success('Add successfully'); \t\t\t\t// refresh the list getTableData(); state.dialog.isShowDialog = false; } }) .catch((error) => {}); }; // Revise const saveUpdate = () => { state.ruleForm.id = state.role_id; state.ruleForm.modules = state.listPers; updateRole(state.ruleForm) .then((res) => { if (res.data.code === 1) { ElMessage.success('Editing successful'); \t\t\t\t// refresh the list getTableData(); state.dialog.isShowDialog = false; } }) .catch((error) => {}); }; // delete const toDel = (row) => { ElMessageBox.confirm(`Are you sure to delete the permission group?`, 'Prompt', { confirmButtonText: 'Confirm', cancelButtonText: 'Cancel', type: 'warning', }) .then(() => { delRole(`role_id=${row.id}`) .then((res) => { if (res.data.code === 1) { ElMessage.success('Deletion successful'); \t\t\t\t\t\t// refresh the list getTableData(); } }) .catch((error) => { return; }); }) .catch(() => {}); }; // Cancel const onCancel = () => { // Clear validation ruleFormRef.value.clearValidate(); state.dialog.isShowDialog = false; }; //Last level leaf node const getAllLeaf = function (data) { let result = []; function getParentIds(data) { data.forEach((item) => { if (item.children.length < 1) { result.push(item.id); //Add parent node ID } else { getParentIds(item.children); } }); } getParentIds(data); return result; }; //When the page loads onMounted(() => { getTableData(); }); </script> <style scoped lang="scss"> .container-wrap { position: relative; :deep(.el-card__body) { display: flex; flex-direction: column; flex: 1; overflow-y: auto; } } .el-select { width: 100%; } .small-title { padding: 8px 30px; width: 50%; float: left; height: 36px; background: #f4f4f4; font-weight: 600; color: #333333; } .half-transfer { margin-right: 46px; margin-bottom: 10px; width: 333px; height: 260px; border-radius: 4px; border: 1px solid #dddddd; } .el-transfer-panel { display: flex; flex-direction: column; // height: 100%; .all { padding: 4px 20px; border-bottom: 1px solid #f4f4f4; } .input-wrap { padding: 10px 20px; } } .el-transfer__list { overflow-y: auto; border-radius: 4px; margin-top: 4px; } .el-transfer__list .el-checkbox-group { padding: 0 10px 20px 20px; } .el-transfer__list .el-checkbox { display: flex; line-height: 24px; } .el-transfer__list .el-checkbox:last-child { margin-bottom: 0; } .el-transfer__list .el-scrollbar { background-color: #f5f7fa; } </style>
[ { module: 'user', perm_ids: [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 2, 3, 4], org_ids: [1, 2], name: 'User Center', perm_tree: [ { res_id: 'EnterMenu:user', name: 'User Center', res_type: 'EnterMenu', res_url: '', res_order: 1, icon: 'user', p_id: null, id: 1, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [ { res_id: 'ConsoleMenu:org', name: 'Organization Management', res_type: 'ConsoleMenu', res_url: '/system/hospitalConfig', res_order: 1, icon: 'icon-jigouguanli', p_id: 'EnterMenu:user', id: 6, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [ { res_id: 'Button:orgManage:view', name: 'View', res_type: 'Button', res_url: null, res_order: 1, icon: null, p_id: 'ConsoleMenu:org', id: 9, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:orgManage:update', name: 'edit', res_type: 'Button', res_url: null, res_order: 2, icon: null, p_id: 'ConsoleMenu:org', id: 10, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:orgManage:add', name: 'New', res_type: 'Button', res_url: null, res_order: 3, icon: null, p_id: 'ConsoleMenu:org', id: 11, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:orgManage:del', name: 'delete', res_type: 'Button', res_url: null, res_order: 4, icon: null, p_id: 'ConsoleMenu:org', id: 12, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, ], }, { res_id: 'ConsoleMenu:role', name: 'Permission Group Management', res_type: 'ConsoleMenu', res_url: '/system/perGroupManage', res_order: 2, icon: 'icon-quanxianzuguanli ', p_id: 'EnterMenu:user', id: 7, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [ { res_id: 'Button:roleManage:view', name: 'View', res_type: 'Button', res_url: null, res_order: 1, icon: null, p_id: 'ConsoleMenu:role', id: 13, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:roleManage:update', name: 'edit', res_type: 'Button', res_url: null, res_order: 2, icon: null, p_id: 'ConsoleMenu:role', id: 14, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:roleManage:add', name: 'New', res_type: 'Button', res_url: null, res_order: 3, icon: null, p_id: 'ConsoleMenu:role', id: 15, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:roleManage:del', name: 'delete', res_type: 'Button', res_url: null, res_order: 4, icon: null, p_id: 'ConsoleMenu:role', id: 16, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, ], }, { res_id: 'ConsoleMenu:user', name: 'User Management', res_type: 'ConsoleMenu', res_url: '/system/userManage', res_order: 3, icon: 'icon-yonghuguanli', p_id: 'EnterMenu:user', id: 8, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [ { res_id: 'Button:userManage:view', name: 'View', res_type: 'Button', res_url: null, res_order: 1, icon: null, p_id: 'ConsoleMenu:user', id: 17, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:userManage:update', name: 'edit', res_type: 'Button', res_url: null, res_order: 2, icon: null, p_id: 'ConsoleMenu:user', id: 18, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:userManage:add', name: 'New', res_type: 'Button', res_url: null, res_order: 3, icon: null, p_id: 'ConsoleMenu:user', id: 19, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:userManage:del', name: 'delete', res_type: 'Button', res_url: null, res_order: 4, icon: null, p_id: 'ConsoleMenu:user', id: 20, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:userManage:pwd', name: 'Reset password', res_type: 'Button', res_url: null, res_order: 5, icon: null, p_id: 'ConsoleMenu:user', id: 21, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, ], }, ], }, { res_id: 'EnterMenu:image', name: 'Image Center', res_type: 'EnterMenu', res_url: '', res_order: 2, icon: 'image', p_id: null, id: 2, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'EnterMenu:sci', name: 'Scientific Research Platform', res_type: 'EnterMenu', res_url: '/html/demo-3d/', res_order: 3, icon: 'scientific', p_id: null, id: 3, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'EnterMenu:teach', name: 'Teaching Platform', res_type: 'EnterMenu', res_url: '/html/teach', res_order: 4, icon: 'teach', p_id: null, id: 4, module: 'user', belong: null, org_flag: null, hide: null, selected: true, children: [], }, ], org_flag: 1, orgsOption: [ { id: 1, name: 'Default Organization', module: null, role_id: null, create_time: '2023-08-21 16:35:49', }, { id: 2, name: 'Union Hospital', module: null, role_id: null, create_time: '2023-08-21 16:39:54', }, ], }, { module: 'teach', perm_ids: [43, 44, 45, 49, 50, 51, 52, 53, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 57, 58, 59, 60], org_ids: [], name: 'Teaching Platform', perm_tree: [ { res_id: 'MainMenu:1', name: 'Basic course', res_type: 'MainMenu', res_url: '/base', res_order: 1, icon: null, p_id: null, id: 43, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'MainMenu:2', name: 'Case Teaching', res_type: 'MainMenu', res_url: '/case', res_order: 2, icon: null, p_id: null, id: 44, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'MainMenu:3', name: 'Practical operation', res_type: 'MainMenu', res_url: '/operate', res_order: 3, icon: null, p_id: null, id: 45, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'MainMenu:4', name: 'Examination Center', res_type: 'MainMenu', res_url: '/testCenter', res_order: 4, icon: null, p_id: null, id: 46, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [ { res_id: 'ExamMenu:1', name: 'My exam', res_type: 'ExamMenu', res_url: '/testCenter/myTest', res_order: 1, icon: 'icon-wodekaoshi', p_id: 'MainMenu:4', id: 49, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'ExamMenu:2', name: 'My results', res_type: 'ExamMenu', res_url: '/testCenter/myScore', res_order: 2, icon: 'icon-chengjichaxun', p_id: 'MainMenu:4', ID: 50, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, ], }, { res_id: 'MainMenu:5', name: 'Personal Center', res_type: 'MainMenu', res_url: '/me', res_order: 5, icon: null, p_id: null, id: 47, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [ { res_id: 'UserCenterMenu:1', name: 'Message notification', res_type: 'UserCenterMenu', res_url: '/me/message', res_order: 1, icon: 'icon-xiaoxizhongxin', p_id: 'MainMenu:5', id: 51, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'UserCenterMenu:2', name: 'My Collection', res_type: 'UserCenterMenu', res_url: '/me/favorites', res_order: 2, icon: 'icon-wodeshoucang', p_id: 'MainMenu:5', ID: 52, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'UserCenterMenu:3', name: 'ability evaluation', res_type: 'UserCenterMenu', res_url: '/me/analysis', res_order: 3, icon: 'icon-nenglipingjia', p_id: 'MainMenu:5', ID: 53, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, ], }, { res_id: 'MainMenu:6', name: 'Backend management', res_type: 'MainMenu', res_url: '/systemSet', res_order: 6, icon: null, p_id: null, id: 48, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [ { res_id: 'ConsoleMenu:3', name: 'Course Management', res_type: 'ConsoleMenu', res_url: '/systemSet/courseManage', res_order: 3, icon: 'icon-a-kechengguanlixin', p_id: 'MainMenu:6', id: 54, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [ { res_id: 'Button:courseManage:view', name: 'View', res_type: 'Button', res_url: null, res_order: 1, icon: null, p_id: 'ConsoleMenu:3', id: 61, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:courseManage:update', name: 'edit', res_type: 'Button', res_url: null, res_order: 2, icon: null, p_id: 'ConsoleMenu:3', id: 62, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:courseManage:add', name: 'New', res_type: 'Button', res_url: null, res_order: 3, icon: null, p_id: 'ConsoleMenu:3', id: 63, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:courseManage:del', name: 'delete', res_type: 'Button', res_url: null, res_order: 4, icon: null, p_id: 'ConsoleMenu:3', id: 64, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:courseManage:audit', name: 'Audit', res_type: 'Button', res_url: null, res_order: 5, icon: null, p_id: 'ConsoleMenu:3', id: 65, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:courseManage:offline', name: 'online and offline', res_type: 'Button', res_url: null, res_order: 6, icon: null, p_id: 'ConsoleMenu:3', id: 66, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, ], }, { res_id: 'ConsoleMenu:4', name: 'Case Management', res_type: 'ConsoleMenu', res_url: '/systemSet/caseManage', res_order: 4, icon: 'icon-anliguanli', p_id: 'MainMenu:6', id: 55, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [ { res_id: 'Button:caseManage:view', name: 'View', res_type: 'Button', res_url: null, res_order: 1, icon: null, p_id: 'ConsoleMenu:4', id: 67, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:caseManage:update', name: 'edit', res_type: 'Button', res_url: null, res_order: 2, icon: null, p_id: 'ConsoleMenu:4', id: 68, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:caseManage:add', name: 'New', res_type: 'Button', res_url: null, res_order: 3, icon: null, p_id: 'ConsoleMenu:4', id: 69, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'Button:caseManage:del', name: 'delete', res_type: 'Button', res_url: null, res_order: 4, icon: null, p_id: 'ConsoleMenu:4', ID: 70, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, ], }, { res_id: 'ConsoleMenu:5', name: 'Examination Management', res_type: 'ConsoleMenu', res_url: '/examManage', res_order: 5, icon: 'icon-kaoshiguanli', p_id: 'MainMenu:6', id: 56, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [ { res_id: 'ExamCtrMenu:1', name: 'Question Bank Management', res_type: 'ExamCtrMenu', res_url: '/systemSet/examManage/examQuestionManage', res_order: 1, icon: null, p_id: 'ConsoleMenu:5', ID: 57, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'ExamCtrMenu:2', name: 'Exam Paper Management', res_type: 'ExamCtrMenu', res_url: '/systemSet/examManage/testPaperManage', res_order: 2, icon: null, p_id: 'ConsoleMenu:5', id: 58, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'ExamCtrMenu:3', name: 'Examination Arrangement', res_type: 'ExamCtrMenu', res_url: '/systemSet/examManage/examSchedule', res_order: 3, icon: null, p_id: 'ConsoleMenu:5', id: 59, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, { res_id: 'ExamCtrMenu:4', name: 'score statistics', res_type: 'ExamCtrMenu', res_url: '/systemSet/examManage/examStatistics', res_order: 4, icon: null, p_id: 'ConsoleMenu:5', id: 60, module: 'teach', belong: null, org_flag: null, hide: null, selected: true, children: [], }, ], }, ], }, ], org_flag: 0, orgsOption: [ { id: 1, name: 'Default Organization', module: null, \t\t\t\trole_id: null, \t\t\t\tcreate_time: '2023-08-21 16:35:49', \t\t\t}, { \t\t\t\tid: 2, \t\t\t\tname: '协和医院', \t\t\t\tmodule: null, \t\t\t\trole_id: null, \t\t\t\tcreate_time: '2023-08-21 16:39:54', \t\t\t}, \t\t], }, { \t\tmodule: 'image', \t\tperm_ids: [], \t\torg_ids: [], \t\tname: '影像中心', \t\tperm_tree: [], \t\torg_flag: 1, \t\torgsOption: [ { \t\t\t\tid: 1, \t\t\t\tname: '默认机构', \t\t\t\tmodule: null, \t\t\t\trole_id: null, \t\t\t\tcreate_time: '2023-08-21 16:35:49', \t\t\t}, { \t\t\t\tid: 2, \t\t\t\tname: '协和医院', \t\t\t\tmodule: null, \t\t\t\trole_id: null, \t\t\t\tcreate_time: '2023-08-21 16:39:54', \t\t\t}, \t\t], }, { \t\tmodule: 'sci', \t\tperm_ids: [], \t\torg_ids: [], \t\tname: '科研平台', \t\tperm_tree: [], \t\torg_flag: 0, \t\torgsOption: [ { \t\t\t\tid: 1, \t\t\t\tname: '默认机构', \t\t\t\tmodule: null, \t\t\t\trole_id: null, \t\t\t\tcreate_time: '2023-08-21 16:35:49', \t\t\t}, { \t\t\t\tid: 2, \t\t\t\tname: '协和医院', \t\t\t\tmodule: null, \t\t\t\trole_id: null, \t\t\t\tcreate_time: '2023-08-21 16:39:54', \t\t\t}, \t\t], }, ];