OkkiAccountForm.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <template>
  2. <a-spin :spinning="confirmLoading">
  3. <a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol">
  4. <a-row>
  5. <a-col :span="24">
  6. <a-form-item label="名称" v-bind="validateInfos.name">
  7. <a-input v-model:value="formData.name" placeholder="请输入名称" :disabled="disabled"></a-input>
  8. </a-form-item>
  9. </a-col>
  10. <a-col :span="24">
  11. <a-form-item label="邮箱账号" v-bind="validateInfos.account">
  12. <a-input v-model:value="formData.account" placeholder="请输入邮箱账号" :disabled="(disabled||formData.id>0)?true:false"></a-input>
  13. </a-form-item>
  14. </a-col>
  15. <a-col :span="24">
  16. <a-form-item label="密码" v-bind="validateInfos.password">
  17. <a-input v-model:value="formData.password" placeholder="请输入密码" :disabled="(disabled||formData.id>0)?true:false"></a-input>
  18. </a-form-item>
  19. </a-col>
  20. <a-col :span="24">
  21. <a-form-item label="手机号" v-bind="validateInfos.phone">
  22. <a-input v-model:value="formData.phone" placeholder="请输入手机号" :disabled="disabled"></a-input>
  23. </a-form-item>
  24. </a-col>
  25. <!-- <a-col :span="24">-->
  26. <!-- <a-form-item label="关联站点" v-bind="validateInfos.siteIds">-->
  27. <!-- <j-vxe-site-select-cell v-model:value="formData.siteIds" :disabled="(disabled||formData.id>0)?true:false"/>-->
  28. <!-- </a-form-item>-->
  29. <!-- </a-col>-->
  30. <a-col :span="24">
  31. <a-form-item label="用户角色" v-bind="validateInfos.userRole">
  32. <j-dict-select-tag type='radio' v-model:value="formData.userRole" dictCode="user_role" placeholder="请选择用户角色" :disabled="(disabled||formData.id>0)?true:false"/>
  33. </a-form-item>
  34. </a-col>
  35. <a-col :span="24">
  36. <a-form-item label="所属人员" v-bind="validateInfos.sysUserCode">
  37. <j-select-user v-model:value="formData.sysUserCode" :disabled="disabled"/>
  38. </a-form-item>
  39. </a-col>
  40. </a-row>
  41. </a-form>
  42. </a-spin>
  43. </template>
  44. <script lang="ts" setup>
  45. import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
  46. import { useMessage } from '/@/hooks/web/useMessage';
  47. import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
  48. import JSelectUser from '/@/components/Form/src/jeecg/components/JSelectUser.vue';
  49. import JVxeSiteSelectCell from '/@/components/JVxeCustom/site/JVxeSiteSelectCell.vue';
  50. import { getValueType } from '/@/utils';
  51. import { saveOrUpdate } from '../OkkiAccount.api';
  52. import { Form } from 'ant-design-vue';
  53. const props = defineProps({
  54. formDisabled: { type: Boolean, default: false },
  55. formData: { type: Object, default: ()=>{} },
  56. formBpm: { type: Boolean, default: true }
  57. });
  58. const formRef = ref();
  59. const useForm = Form.useForm;
  60. const emit = defineEmits(['register', 'ok']);
  61. const formData = reactive<Record<string, any>>({
  62. id: '',
  63. name:'',
  64. account: '',
  65. password: '',
  66. phone:'',
  67. siteIds: '',
  68. sysUserCode: '',
  69. userRole: undefined,
  70. });
  71. const { createMessage } = useMessage();
  72. const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
  73. const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
  74. const confirmLoading = ref<boolean>(false);
  75. //表单验证
  76. const validatorRules = {
  77. name: [{ required: true, message: '请输入名称!'},],
  78. account: [{ required: true, message: '请输入邮箱账号!'},],
  79. password: [{ required: true, message: '请输入密码!'},],
  80. phone: [{ required: true, message: '请输入手机号!'},],
  81. userRole: [{ required: true, message: '请选择用户角色!'},],
  82. };
  83. const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
  84. // 表单禁用
  85. const disabled = computed(()=>{
  86. if(props.formBpm === true){
  87. if(props.formData.disabled === false){
  88. return false;
  89. }else{
  90. return true;
  91. }
  92. }
  93. return props.formDisabled;
  94. });
  95. /**
  96. * 新增
  97. */
  98. function add() {
  99. edit({});
  100. }
  101. /**
  102. * 编辑
  103. */
  104. function edit(record) {
  105. nextTick(() => {
  106. resetFields();
  107. const tmpData = {};
  108. Object.keys(formData).forEach((key) => {
  109. if(record.hasOwnProperty(key)){
  110. tmpData[key] = record[key]
  111. }
  112. })
  113. //赋值
  114. Object.assign(formData, tmpData);
  115. });
  116. }
  117. /**
  118. * 提交数据
  119. */
  120. async function submitForm() {
  121. // 触发表单验证
  122. await validate();
  123. confirmLoading.value = true;
  124. const isUpdate = ref<boolean>(false);
  125. //时间格式化
  126. let model = formData;
  127. if (model.id) {
  128. isUpdate.value = true;
  129. }
  130. //循环数据
  131. for (let data in model) {
  132. //如果该数据是数组并且是字符串类型
  133. if (model[data] instanceof Array) {
  134. let valueType = getValueType(formRef.value.getProps, data);
  135. //如果是字符串类型的需要变成以逗号分割的字符串
  136. if (valueType === 'string') {
  137. model[data] = model[data].join(',');
  138. }
  139. }
  140. }
  141. await saveOrUpdate(model, isUpdate.value)
  142. .then((res) => {
  143. if (res.success) {
  144. createMessage.success(res.message);
  145. emit('ok');
  146. } else {
  147. createMessage.warning(res.message);
  148. }
  149. })
  150. .finally(() => {
  151. confirmLoading.value = false;
  152. });
  153. }
  154. defineExpose({
  155. add,
  156. edit,
  157. submitForm,
  158. });
  159. </script>
  160. <style lang="less" scoped>
  161. .antd-modal-form {
  162. height: 500px !important;
  163. overflow-y: auto;
  164. padding: 14px;
  165. }
  166. </style>