2025-05-09 16:37:41 +08:00
|
|
|
<template>
|
2025-05-12 17:18:25 +08:00
|
|
|
<a-spin
|
|
|
|
|
:spinning="spinning"
|
|
|
|
|
:tip="tipContent"
|
2025-05-09 16:37:41 +08:00
|
|
|
>
|
2025-05-12 17:18:25 +08:00
|
|
|
<a-form
|
|
|
|
|
:model="form"
|
|
|
|
|
ref="formRef"
|
|
|
|
|
label-align="left"
|
|
|
|
|
:label-col="{ span: 6 }"
|
|
|
|
|
:wrapper-col="{ span: 18 }"
|
|
|
|
|
>
|
|
|
|
|
<a-row>
|
|
|
|
|
<a-col :span="24">
|
|
|
|
|
<a-form-item
|
|
|
|
|
label="角色名称"
|
|
|
|
|
:label-col="{ span: 4 }"
|
|
|
|
|
:wrapper-col="{ span: 12 }"
|
|
|
|
|
name="roleName"
|
|
|
|
|
required
|
|
|
|
|
:rules="[{ required: true, message: '请输角色名称' }]"
|
|
|
|
|
>
|
|
|
|
|
<a-input
|
|
|
|
|
v-model:value="form.roleName"
|
|
|
|
|
placeholder="请输角色名称"
|
|
|
|
|
/>
|
|
|
|
|
</a-form-item>
|
|
|
|
|
</a-col>
|
|
|
|
|
</a-row>
|
|
|
|
|
<a-row>
|
|
|
|
|
<a-col :span="24">
|
|
|
|
|
<a-form-item
|
|
|
|
|
label="角色描述"
|
|
|
|
|
:label-col="{ span: 4 }"
|
|
|
|
|
:wrapper-col="{ span: 12 }"
|
|
|
|
|
name="roleDescription"
|
|
|
|
|
>
|
|
|
|
|
<a-input
|
|
|
|
|
v-model:value="form.roleDescription"
|
|
|
|
|
placeholder="请输入角色描述"
|
|
|
|
|
/>
|
|
|
|
|
</a-form-item>
|
|
|
|
|
</a-col>
|
|
|
|
|
</a-row>
|
|
|
|
|
<a-row>
|
|
|
|
|
<a-col :span="24">
|
|
|
|
|
<a-form-item
|
|
|
|
|
label="菜单权限配置"
|
|
|
|
|
:label-col="{ span: 4 }"
|
|
|
|
|
:wrapper-col="{ span: 21 }"
|
|
|
|
|
name="roleDescription"
|
|
|
|
|
>
|
|
|
|
|
<a-tabs v-model:activeKey="activeKey">
|
|
|
|
|
<a-tab-pane
|
|
|
|
|
key="1"
|
|
|
|
|
tab="运营后台"
|
|
|
|
|
>
|
|
|
|
|
<div style="border: solid 1px #ddd;margin-top: -15px;">
|
|
|
|
|
<a-tree
|
|
|
|
|
v-if="treeDataByWeb.length"
|
|
|
|
|
defaultExpandAll
|
|
|
|
|
v-model:checkedKeys="checkedKeysByWeb"
|
|
|
|
|
@check="checkNodeByWeb"
|
|
|
|
|
v-model:tree-data="treeDataByWeb"
|
|
|
|
|
checkable
|
|
|
|
|
>
|
|
|
|
|
<template #title="{ description }">
|
|
|
|
|
{{ description }}
|
|
|
|
|
</template>
|
|
|
|
|
</a-tree>
|
|
|
|
|
</div>
|
2025-05-09 16:37:41 +08:00
|
|
|
|
2025-05-12 17:18:25 +08:00
|
|
|
</a-tab-pane>
|
|
|
|
|
<a-tab-pane
|
|
|
|
|
key="2"
|
|
|
|
|
tab="运维小程序"
|
|
|
|
|
force-render
|
|
|
|
|
>
|
|
|
|
|
<div style="border: solid 1px #ddd;margin-top: -15px;">
|
|
|
|
|
<a-tree
|
|
|
|
|
v-if="treeDataByApplet.length"
|
|
|
|
|
v-model:checkedKeys="checkedKeysByApplet"
|
|
|
|
|
@check="checkNodeByApplet"
|
|
|
|
|
:tree-data="treeDataByApplet"
|
|
|
|
|
defaultExpandAll
|
|
|
|
|
checkable
|
|
|
|
|
>
|
|
|
|
|
<template #title="{ description }">
|
|
|
|
|
{{ description }}
|
|
|
|
|
</template>
|
|
|
|
|
</a-tree>
|
|
|
|
|
</div>
|
|
|
|
|
</a-tab-pane>
|
|
|
|
|
</a-tabs>
|
|
|
|
|
</a-form-item>
|
|
|
|
|
</a-col>
|
|
|
|
|
</a-row>
|
|
|
|
|
</a-form>
|
|
|
|
|
</a-spin>
|
2025-05-09 16:37:41 +08:00
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup>
|
|
|
|
|
import { ref } from 'vue'
|
|
|
|
|
import { callUser } from '@/apis/call.js'
|
|
|
|
|
import { message } from 'ant-design-vue'
|
2025-05-12 17:18:25 +08:00
|
|
|
import _, { constant } from 'lodash'
|
2025-05-09 16:37:41 +08:00
|
|
|
|
|
|
|
|
const formRef = ref();
|
|
|
|
|
const form = ref({});
|
|
|
|
|
const activeKey = ref("1")
|
2025-05-09 17:56:34 +08:00
|
|
|
const checkedKeysByWeb = ref([])
|
|
|
|
|
const checkedKeysByApplet = ref([])
|
2025-05-09 16:37:41 +08:00
|
|
|
const treeDataByWeb = ref([])
|
|
|
|
|
const treeDataByApplet = ref([])
|
|
|
|
|
const treeDataList = ref([])
|
2025-05-12 17:18:25 +08:00
|
|
|
const roleIdRef = ref(null);
|
|
|
|
|
const isAdd = ref(true);
|
|
|
|
|
const spinning = ref(false);
|
|
|
|
|
const tipContent = ref("加载中...");
|
2025-05-09 16:37:41 +08:00
|
|
|
|
|
|
|
|
const openForm = (params = {}) => {
|
2025-05-12 17:18:25 +08:00
|
|
|
isAdd.value = true;
|
2025-05-09 17:56:34 +08:00
|
|
|
form.value = { ...params }
|
|
|
|
|
loadPermissionsList(params['roleId']);
|
2025-05-09 16:37:41 +08:00
|
|
|
};
|
|
|
|
|
|
2025-05-09 17:56:34 +08:00
|
|
|
const loadPermissionsList = (roleId = null) => {
|
2025-05-09 16:37:41 +08:00
|
|
|
callUser("/permissions/list", {}, "get").then((res) => {
|
|
|
|
|
if (res.code != 200) {
|
|
|
|
|
message.error(res.message)
|
2025-05-09 17:56:34 +08:00
|
|
|
treeDataByWeb.value = []
|
|
|
|
|
treeDataByApplet.value = []
|
2025-05-09 16:37:41 +08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
const dataList = res.data.map((item) => {
|
|
|
|
|
return { ...item, key: item.permId }
|
|
|
|
|
})
|
|
|
|
|
treeDataList.value = dataList;
|
2025-05-09 17:56:34 +08:00
|
|
|
const newDataListByWeb = buildTreeWithChildren(dataList, 1)
|
|
|
|
|
const newDataList = buildTreeWithChildren(dataList, 2)
|
|
|
|
|
treeDataByWeb.value = [{ description: "全部", key: "all", children: [...newDataListByWeb] }]
|
|
|
|
|
treeDataByApplet.value = [{ description: "全部", key: "all", children: [...newDataList] }]
|
|
|
|
|
if (roleId) {
|
2025-05-12 17:18:25 +08:00
|
|
|
isAdd.value = false;
|
|
|
|
|
roleIdRef.value = roleId
|
2025-05-09 17:56:34 +08:00
|
|
|
callUser("/rolePermissions/getRolePermissionsByRoleId/" + roleId, {}, "get").then((res) => {
|
|
|
|
|
if (res.code == 200) {
|
2025-05-12 17:18:25 +08:00
|
|
|
const webKeys = res.data.filter(item => item['permType'] == "1").map(item => {
|
|
|
|
|
return item['permId']
|
|
|
|
|
});
|
|
|
|
|
const appletKeys = res.data.filter(item => item['permType'] == "2").map(item => {
|
|
|
|
|
return item['permId']
|
|
|
|
|
});
|
|
|
|
|
checkedKeysByWeb.value = webKeys;
|
|
|
|
|
checkedKeysByApplet.value = appletKeys;
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
} else {
|
|
|
|
|
callOperate("/ebikesysrcostset/createSnowflakeId", {}, "get").then(res => {
|
|
|
|
|
if (res.code == 200) {
|
|
|
|
|
roleIdRef.value = res.data;
|
2025-05-09 17:56:34 +08:00
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
2025-05-09 16:37:41 +08:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-12 17:18:25 +08:00
|
|
|
const checkNodeByWeb = (checkKeys, nodes) => {
|
|
|
|
|
const checkNodes = nodes.checkedNodes.filter(item => item['key'] != "all")
|
|
|
|
|
const leafKeys = getLeafKeys(checkNodes);
|
|
|
|
|
checkedKeysByWeb.value = leafKeys
|
2025-05-09 16:37:41 +08:00
|
|
|
}
|
|
|
|
|
|
2025-05-12 17:18:25 +08:00
|
|
|
const checkNodeByApplet = (checkKeys, nodes) => {
|
|
|
|
|
const checkNodes = nodes.checkedNodes.filter(item => item['key'] != "all")
|
|
|
|
|
const leafKeys = getLeafKeys(checkNodes);
|
|
|
|
|
checkedKeysByApplet.value = leafKeys
|
2025-05-09 16:37:41 +08:00
|
|
|
}
|
|
|
|
|
|
2025-05-12 17:18:25 +08:00
|
|
|
const getLeafKeys = (nodes) => {
|
|
|
|
|
let leafKeys = [];
|
|
|
|
|
nodes.forEach(node => {
|
|
|
|
|
if (!node.children || node.children.length === 0) {
|
|
|
|
|
leafKeys.push(node.key);
|
|
|
|
|
} else {
|
|
|
|
|
getLeafKeys(node.children)
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
return leafKeys;
|
|
|
|
|
};
|
|
|
|
|
|
2025-05-09 16:37:41 +08:00
|
|
|
const buildTreeWithChildren = (data, where) => {
|
|
|
|
|
const map = new Map();
|
|
|
|
|
const roots = [];
|
|
|
|
|
data.forEach(item => {
|
|
|
|
|
map.set(item.permId, { ...item });
|
|
|
|
|
});
|
|
|
|
|
data.forEach(item => {
|
|
|
|
|
if (item['permType'] == where) {
|
|
|
|
|
const child = map.get(item.permId);
|
|
|
|
|
child.code = child.permCode;
|
|
|
|
|
if (item.parentId === null || item.parentId === undefined) {
|
|
|
|
|
roots.push(child);
|
|
|
|
|
} else {
|
|
|
|
|
const parent = map.get(item.parentId);
|
|
|
|
|
if (parent) {
|
|
|
|
|
parent.children = parent.children || [];
|
|
|
|
|
child.code = child.permCode.replace(parent.permCode + ".", '');
|
|
|
|
|
parent.children.push(child);
|
|
|
|
|
} else {
|
|
|
|
|
roots.push(child);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
return roots;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const formSave = (callBack) => {
|
|
|
|
|
formRef.value.validate().then((res) => {
|
2025-05-12 17:18:25 +08:00
|
|
|
tipContent.value = "保存中..."
|
|
|
|
|
spinning.value = true;
|
|
|
|
|
let url = "rolePermissionsAdd";
|
|
|
|
|
if (!isAdd.value) {
|
|
|
|
|
url = "rolePermissionsUpdate"
|
|
|
|
|
}
|
2025-05-13 17:18:03 +08:00
|
|
|
isAdd.value = false;
|
2025-05-12 17:18:25 +08:00
|
|
|
const params = _.cloneDeep(form.value);
|
|
|
|
|
params['roleId'] = roleIdRef.value;
|
|
|
|
|
params['rolePermissions'] = []
|
|
|
|
|
checkedKeysByWeb.value.map(item => {
|
|
|
|
|
params['rolePermissions'].push({ permId: item })
|
|
|
|
|
})
|
|
|
|
|
checkedKeysByApplet.value.map(item => {
|
|
|
|
|
params['rolePermissions'].push({ permId: item })
|
|
|
|
|
})
|
|
|
|
|
callUser("/roles/" + url, params).then((res) => {
|
|
|
|
|
if (res.code == 200) {
|
2025-05-13 17:18:03 +08:00
|
|
|
message.success(res.message)
|
2025-05-12 17:18:25 +08:00
|
|
|
if (callBack) {
|
|
|
|
|
res.data = params;
|
|
|
|
|
callBack(res);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
message.error(res.message)
|
|
|
|
|
spinning.value = false;
|
|
|
|
|
}
|
|
|
|
|
})
|
2025-05-09 16:37:41 +08:00
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const resetAll = (callBack) => {
|
|
|
|
|
formRef.value.resetFields();
|
|
|
|
|
if (callBack) {
|
|
|
|
|
callBack(true, form.value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
defineExpose({ openForm, formSave, resetAll });
|
|
|
|
|
</script>
|
|
|
|
|
|