UserAssignRoleForm.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import React, { useState, useImperativeHandle, forwardRef } from 'react';
  2. import { Modal, Form, Input, Select, message } from 'antd';
  3. import { userPermissionApi } from '../../api/user/permission';
  4. import { systemApi } from '../../api/System';
  5. import { UserVO, RoleVO } from '../../types';
  6. import { useTranslation } from 'react-i18next';
  7. interface UserAssignRoleFormProps {
  8. onSuccess?: () => void;
  9. }
  10. export interface UserAssignRoleFormRef {
  11. open: (row: UserVO) => void;
  12. }
  13. const UserAssignRoleForm = forwardRef<UserAssignRoleFormRef, UserAssignRoleFormProps>(({ onSuccess }, ref) => {
  14. const { t } = useTranslation();
  15. const [dialogVisible, setDialogVisible] = useState(false);
  16. const [formLoading, setFormLoading] = useState(false);
  17. const [form] = Form.useForm();
  18. const [roleList, setRoleList] = useState<RoleVO[]>([]);
  19. const [userId, setUserId] = useState<number | null>(null);
  20. // 打开弹窗
  21. const open = async (row: UserVO) => {
  22. setDialogVisible(true);
  23. setUserId(row.id);
  24. form.resetFields();
  25. // 设置用户信息
  26. form.setFieldsValue({
  27. username: row.username,
  28. nickname: row.nickname,
  29. roleIds: [],
  30. });
  31. // 加载角色列表
  32. try {
  33. const roles = await systemApi.getSimpleRoleList();
  34. setRoleList(roles || []);
  35. } catch (error) {
  36. console.error('加载角色列表失败:', error);
  37. message.error(t('common.loadRoleListFailed'));
  38. }
  39. // 获取用户角色列表
  40. setFormLoading(true);
  41. try {
  42. const roleIds = await userPermissionApi.getUserRoleList(row.id);
  43. form.setFieldsValue({
  44. roleIds: roleIds || [],
  45. });
  46. } catch (error: any) {
  47. console.error('获取用户角色失败:', error);
  48. message.error(error.message || t('common.getUserRoleFailed'));
  49. } finally {
  50. setFormLoading(false);
  51. }
  52. };
  53. useImperativeHandle(ref, () => ({
  54. open,
  55. }));
  56. // 提交表单
  57. const submitForm = async () => {
  58. try {
  59. const values = await form.validateFields();
  60. setFormLoading(true);
  61. try {
  62. const params = {
  63. userId: userId!,
  64. roleIds: values.roleIds || [],
  65. };
  66. console.log('分配角色参数:', params);
  67. await userPermissionApi.assignUserRole(params);
  68. message.success(t('common.assignSuccess'));
  69. setDialogVisible(false);
  70. onSuccess?.();
  71. } catch (error: any) {
  72. message.error(error.message || t('common.assignFailed'));
  73. } finally {
  74. setFormLoading(false);
  75. }
  76. } catch (error) {
  77. // 表单验证失败
  78. }
  79. };
  80. return (
  81. <Modal
  82. title={t('common.assignRoleTitle')}
  83. open={dialogVisible}
  84. onCancel={() => setDialogVisible(false)}
  85. onOk={submitForm}
  86. confirmLoading={formLoading}
  87. okText={t('common.confirm')}
  88. cancelText={t('common.cancel')}
  89. destroyOnClose
  90. >
  91. <Form
  92. form={form}
  93. layout="vertical"
  94. initialValues={{
  95. roleIds: [],
  96. }}
  97. >
  98. <Form.Item label={t('common.userName')} name="username">
  99. <Input disabled />
  100. </Form.Item>
  101. <Form.Item label={t('common.nickname')} name="nickname">
  102. <Input disabled />
  103. </Form.Item>
  104. <Form.Item label={t('common.assignRole')} name="roleIds">
  105. <Select
  106. mode="multiple"
  107. placeholder={t('common.selectRole')}
  108. options={roleList.map(role => ({
  109. label: role.name,
  110. value: role.id,
  111. }))}
  112. />
  113. </Form.Item>
  114. </Form>
  115. </Modal>
  116. );
  117. });
  118. UserAssignRoleForm.displayName = 'UserAssignRoleForm';
  119. export default UserAssignRoleForm;