Loop tree and checkbox related selection processing

<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],
},
];