|
@@ -2,22 +2,25 @@
|
|
|
<my-dialog
|
|
|
:visible="visible"
|
|
|
@close="emit('update:visible', false)"
|
|
|
- :header="`${isEdit ? '修改' : '新增'}用户`"
|
|
|
+ :header="`${isEdit ? '修改' : '新增'}角色`"
|
|
|
:width="800"
|
|
|
:closeOnOverlayClick="false"
|
|
|
>
|
|
|
- <t-form ref="formRef" :model="formData" labelWidth="120px">
|
|
|
- <t-form-item label="角色名称">
|
|
|
- <t-input v-model="formData.a"></t-input>
|
|
|
+ <t-form ref="formRef" :data="formData" :rules="rules" labelWidth="120px">
|
|
|
+ <t-form-item label="角色名称" name="name">
|
|
|
+ <t-input v-model="formData.name"></t-input>
|
|
|
</t-form-item>
|
|
|
<t-form-item label="绑定权限">
|
|
|
<!-- <t-tree-select v-model="formData.d" :data="treeData" multiple /> -->
|
|
|
|
|
|
<t-tree
|
|
|
+ v-model="treeChecked"
|
|
|
+ ref="treeRef"
|
|
|
:data="treeData"
|
|
|
hover
|
|
|
expand-all
|
|
|
:checkable="true"
|
|
|
+ value-mode="all"
|
|
|
@change="onTreeChange"
|
|
|
:keys="{ value: 'id', label: 'name' }"
|
|
|
></t-tree>
|
|
@@ -34,7 +37,7 @@
|
|
|
<script setup name="AddRoleDialog">
|
|
|
import useClearDialog from '@/hooks/useClearDialog';
|
|
|
import { ref, watch } from 'vue';
|
|
|
-import { getAllMenuResource } from '@/api/user';
|
|
|
+import { getAllMenuResource, addRole, getRoleDetail } from '@/api/user';
|
|
|
import { useRequest } from 'vue-request';
|
|
|
const props = defineProps({
|
|
|
visible: Boolean,
|
|
@@ -42,25 +45,97 @@ const props = defineProps({
|
|
|
});
|
|
|
const emit = defineEmits(['update:visible']);
|
|
|
const formRef = ref(null);
|
|
|
+const treeRef = ref(null);
|
|
|
+const curRoleBindIds = ref([]);
|
|
|
+const rules = {
|
|
|
+ name: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '请选择角色',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+};
|
|
|
+const initChecked = (res) => {
|
|
|
+ let privilegeIds = curRoleBindIds.value;
|
|
|
+ let leafNodes = [];
|
|
|
+ privilegeIds.forEach((id) => {
|
|
|
+ if (!treeFlatArr.value.find((item) => item.parentId == id)) {
|
|
|
+ leafNodes.push(id);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ console.log('leafNodes:', leafNodes);
|
|
|
+ treeChecked.value = leafNodes.map((item) => item.toString());
|
|
|
+};
|
|
|
const getDetail = async () => {
|
|
|
//编辑状态下获取回显数据的接口请求业务,如果curRow里的字段够用,就直接把curRow里的字段赋值给formData
|
|
|
- alert('获取详情中...');
|
|
|
+ formData.name = props.curRow.name;
|
|
|
+ getRoleDetail({ roleId: props.curRow.id }).then((res) => {
|
|
|
+ console.log('rrr', res);
|
|
|
+ curRoleBindIds.value = JSON.parse(res.privilegeIds || '[]');
|
|
|
+ if (treeFlatArr.value.length) {
|
|
|
+ initChecked();
|
|
|
+ }
|
|
|
+ });
|
|
|
};
|
|
|
const { formData, isEdit } = useClearDialog(
|
|
|
{
|
|
|
- a: '',
|
|
|
- b: '',
|
|
|
+ name: '',
|
|
|
},
|
|
|
props,
|
|
|
+ formRef,
|
|
|
getDetail
|
|
|
);
|
|
|
|
|
|
const { data: treeData } = useRequest(getAllMenuResource, {
|
|
|
manual: false,
|
|
|
});
|
|
|
-
|
|
|
+let treeFlatArr = ref([]);
|
|
|
+watch(treeData, () => {
|
|
|
+ treeFlatArr.value = treeToArr(treeData.value || []);
|
|
|
+ initChecked();
|
|
|
+});
|
|
|
+const treeToArr = (tree, arr = []) => {
|
|
|
+ for (let i = 0; i < tree.length; i++) {
|
|
|
+ arr.push(tree[i]);
|
|
|
+ if (tree[i].children && tree[i].children.length) {
|
|
|
+ treeToArr(tree[i].children, arr);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return arr;
|
|
|
+};
|
|
|
+const findParentIdById = (id, arr = []) => {
|
|
|
+ let item = treeFlatArr.value.find((v) => v.id == id);
|
|
|
+ if (item.parentId != '-1') {
|
|
|
+ let find = treeFlatArr.value.find((v) => v.id == item.parentId);
|
|
|
+ arr.push(find.id);
|
|
|
+ findParentIdById(find.id, arr);
|
|
|
+ }
|
|
|
+ return arr;
|
|
|
+};
|
|
|
+const treeChecked = ref([]);
|
|
|
+const checkedResult = ref([]);
|
|
|
const onTreeChange = (checked, context) => {
|
|
|
- console.info('onChange:', checked, context);
|
|
|
+ let allParentIds = [];
|
|
|
+ checked.forEach((id) => {
|
|
|
+ let parentIds = findParentIdById(id);
|
|
|
+ allParentIds.push(...parentIds);
|
|
|
+ });
|
|
|
+ checkedResult.value = Array.from(new Set([...allParentIds, ...checked]));
|
|
|
+};
|
|
|
+const addHandler = () => {
|
|
|
+ addRole({
|
|
|
+ name: formData.name,
|
|
|
+ privilegeIds: checkedResult.value,
|
|
|
+ id: props.curRow?.id || undefined,
|
|
|
+ }).then(() => {
|
|
|
+ emit('success');
|
|
|
+ });
|
|
|
+};
|
|
|
+const save = () => {
|
|
|
+ formRef.value.validate().then(async (result) => {
|
|
|
+ if (result === true) {
|
|
|
+ addHandler();
|
|
|
+ }
|
|
|
+ });
|
|
|
};
|
|
|
-const save = () => {};
|
|
|
</script>
|