RoleEdit.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <script setup lang="ts">
  2. import type { RoleModel } from '@/model/system.model';
  3. import { editRoleMethod, getRoleMenusMethod, roleMethod } from '@/request/api/system.api';
  4. import { useRequest } from 'alova/client';
  5. import { type VxeFormListeners, type VxeFormProps, type VxeTreeInstance } from 'vxe-pc-ui';
  6. type FormModel = Partial<RoleModel>
  7. const defaultModel = {};
  8. const props = defineProps<{ data: FormModel }>();
  9. const emits = defineEmits<{
  10. submit: [ data?: RoleModel ],
  11. }>();
  12. const menusRef = ref<VxeTreeInstance>();
  13. const menus = shallowRef<any[]>([]);
  14. const selected = ref<string[]>([]);
  15. // @ts-ignore
  16. const { loading: menusLoading } = useRequest(() => getRoleMenusMethod(props.data), { initialData: [] }).onSuccess(
  17. ({ data }) => {
  18. menus.value = data.menus;
  19. nextTick(() => {
  20. menusRef.value?.setAllExpandNode(true);
  21. selected.value = [ ...data.selected ];
  22. });
  23. });
  24. const { loading, send: load } = useRequest(roleMethod, { immediate: false, initialData: props.data ?? defaultModel })
  25. .onSuccess(({ data }) => {
  26. formProps.data = { ...data };
  27. });
  28. const { loading: submitting, send: submit } = useRequest(editRoleMethod, { immediate: false }).onSuccess(({ data }) => {
  29. emits('submit');
  30. });
  31. const formProps = reactive<VxeFormProps<FormModel>>({
  32. titleWidth: 100,
  33. titleAlign: 'right',
  34. titleColon: true,
  35. data: { ...props.data },
  36. items: [
  37. { field: 'roleName', title: '角色名', span: 24, itemRender: { name: 'VxeInput' } },
  38. {
  39. field: 'dataScope', title: '数据权限', span: 24, itemRender: {
  40. name: 'VxeRadioGroup',
  41. options: [
  42. { label: '本人', value: '5' },
  43. { label: '本机构', value: '4' },
  44. ],
  45. },
  46. },
  47. { field: 'menuIds', title: '菜单权限', span: 24, slots: { default: 'menus' } },
  48. { align: 'center', span: 24, slots: { default: 'active' } },
  49. ],
  50. rules: {
  51. roleName: [ { required: true, message: '请输入角色名' } ],
  52. dataScope: [ { required: true, message: '请选择数据权限' } ],
  53. },
  54. });
  55. const formEmits: VxeFormListeners<FormModel> = {
  56. submit({ data }) { submit({ roleSort: 0, status: 0, ...data, menuIds: selected.value }); },
  57. reset() { formProps.data = { ...props.data }; },
  58. };
  59. onBeforeMount(() => {
  60. if ( props.data?.roleId ) load(props.data);
  61. });
  62. </script>
  63. <template>
  64. <vxe-form class-name="role-edit-form" v-bind="formProps" v-on="formEmits" :loading>
  65. <template #menus>
  66. <vxe-tree
  67. ref="menusRef" :data="menus" :loading="menusLoading"
  68. show-checkbox v-model:checkNodeKeys="selected"
  69. title-field="label" value-field="id" key-field="id"
  70. />
  71. </template>
  72. <template #active>
  73. <vxe-button type="submit" status="primary" content="提交" :loading="submitting"></vxe-button>
  74. <vxe-button type="reset" content="重置" :disabled="submitting"></vxe-button>
  75. </template>
  76. </vxe-form>
  77. </template>
  78. <style scoped lang="scss">
  79. .role-edit-form {
  80. :deep(.vxe-tree) {
  81. max-height: 400px;
  82. }
  83. }
  84. </style>