user.edit.vue 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <script setup lang="ts">
  2. import type { CheckboxInstance, FormInstance } from 'vant';
  3. import type { UserModel } from '@/request/model/manage.model';
  4. import { useForm } from 'alova/client';
  5. import { useRequest } from 'alova/client';
  6. import { editUser, getRoles } from '@/request/api/manage';
  7. const props = defineProps<Partial<UserModel>>();
  8. const emits = defineEmits<{
  9. complete: [model: UserModel];
  10. cancel: [];
  11. }>();
  12. const { data: roles, loading } = useRequest(getRoles);
  13. const {
  14. form,
  15. loading: submitting,
  16. send: submit,
  17. } = useForm(
  18. (model) => {
  19. const rawRoles = [];
  20. for (const id of model.roleIds) {
  21. const role = roles.value.find((role) => role.id === id);
  22. if (role) rawRoles.push(role.__raw__);
  23. }
  24. return editUser({ ...model, roles: rawRoles, roleIds: model.roleIds.join(',') });
  25. },
  26. { immediate: false, initialForm: { pid: '', userid: '', username: '', roleIds: [] as string[], stateSel: '0' } }
  27. ).onSuccess(({ data }) => emits('complete', data));
  28. watchEffect(() => {
  29. form.value.pid = props.id ?? '';
  30. form.value.userid = props.account ?? '';
  31. form.value.username = props.name ?? '';
  32. form.value.roleIds = props.roles?.map((item) => item.id) ?? [];
  33. });
  34. const formRef = useTemplateRef<FormInstance>('form');
  35. const checkboxRefs = useTemplateRef<CheckboxInstance[]>('checkbox');
  36. const toggle = (index: number) => {
  37. if (submitting.value) return;
  38. checkboxRefs.value?.[index].toggle();
  39. formRef.value?.validate('role_menus');
  40. };
  41. </script>
  42. <template>
  43. <van-form class="form-wrapper" @submit="submit(form)" label-align="top" required :readonly="submitting">
  44. <van-cell-group inset>
  45. <van-field name="user_id" label="账号" placeholder="请输入登录账号" v-model="form.userid" :rules="[{ required: true, message: '请输入登录账号' }]" />
  46. <van-field name="user_name" label="姓名" placeholder="请输入真实姓名" v-model="form.username" :rules="[{ required: true, message: '请输入真实姓名' }]" />
  47. <van-field name="user_roles" :rules="[{ required: true, message: '请选择角色' }]">
  48. <template #label>用户角色<van-loading v-if="loading" class="ml-2" size="18" /> </template>
  49. <template #input>
  50. <van-checkbox-group v-model="form.roleIds" direction="horizontal" shape="square">
  51. <van-cell-group inset>
  52. <van-cell v-for="(item, index) in roles" clickable :key="item.id" :title="`复选框 ${item}`" @click="toggle(index)">
  53. <template #title>
  54. <div class="flex">
  55. <van-checkbox :name="item.id" ref="checkbox" :disabled="submitting" @click.stop />
  56. {{ item.name }}
  57. </div>
  58. </template>
  59. </van-cell>
  60. </van-cell-group>
  61. </van-checkbox-group>
  62. </template>
  63. </van-field>
  64. </van-cell-group>
  65. <div style="padding: 16px">
  66. <van-button round block type="primary" native-type="submit" :loading="submitting">提交</van-button>
  67. </div>
  68. </van-form>
  69. </template>
  70. <style scoped lang="scss">
  71. .form-wrapper {
  72. :deep(.van-field__control) {
  73. .van-checkbox-group,
  74. .van-checkbox-group .van-cell-group {
  75. --van-cell-group-inset-padding: 0;
  76. flex: auto;
  77. }
  78. .van-checkbox-group {
  79. max-height: 40vh;
  80. overflow-y: auto;
  81. }
  82. }
  83. }
  84. </style>