index.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <template>
  2. <el-dialog :title="title" v-model="open" width="700px" append-to-body>
  3. <el-form ref="dialogFormRef" :model="form" :label-width="labelWidth">
  4. <template v-for="item in column" :key="item.prop">
  5. <!-- 输入框 -->
  6. <el-form-item :label="item.label" v-if="item.type === 'input'" :prop="item.prop" :rules="item.rules">
  7. <el-input v-model="form[item.prop]" :placeholder="'请输入' + item.label" clearable :disabled="disables[item.prop]">
  8. <template v-if="item.dese" #append>{{ item.dese }}</template>
  9. </el-input>
  10. </el-form-item>
  11. <!-- 文本域 -->
  12. <el-form-item :label="item.label" v-if="item.type === 'textarea'&& (item.show ? item.show(form): true)" :prop="item.prop" :rules="item.rules">
  13. <el-input v-model="form[item.prop]" type="textarea"
  14. :autosize="{ minRows: 2, maxRows: 4 }"
  15. :placeholder="'请输入' + item.label" clearable :disabled="disables[item.prop]"/>
  16. </el-form-item>
  17. <el-form-item :label="item.label" v-if="item.type === 'radio'" :prop="item.prop" :rules="item.rules">
  18. <el-radio-group v-model="form[item.prop]" :disabled="disables[item.prop]">
  19. <el-radio v-for="dict in item.options" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
  20. </el-radio-group>
  21. </el-form-item>
  22. <!-- 时间选择 -->
  23. <el-form-item :label="item.label" v-if="item.type === 'date'" :prop="item.prop" :rules="item.rules">
  24. <el-date-picker v-model="form[item.prop]" value-format="YYYY-MM-DD" type="daterange"
  25. range-separator="-" start-placeholder="开始日期" clearable end-placeholder="结束日期" :disabled="disables[item.prop]"></el-date-picker>
  26. </el-form-item>
  27. <!-- 下拉框选择 -->
  28. <el-form-item :label="item.label" v-if="item.type === 'select' && item.dictionary" :prop="item.prop" :rules="item.rules">
  29. <el-select v-model="form[item.prop]" :placeholder="'请选择' + item.label" clearable :disabled="disables[item.prop]">
  30. <el-option v-for="dict in dictionaryOptions[item.dictionary]" :key="dict.value"
  31. :label="dict.label" :value="dict.value"></el-option>
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item :label="item.label" v-if="item.type === 'select' && item.options" :prop="item.prop" :rules="item.rules">
  35. <el-select v-model="form[item.prop]" :placeholder="'请选择' + item.label" clearable :disabled="disables[item.prop]">
  36. <el-option v-for="dict in item.options" :key="dict.value"
  37. :label="dict.label" :value="dict.value"></el-option>
  38. </el-select>
  39. </el-form-item>
  40. <!-- 联动选择框 -->
  41. <el-form-item :label="item.label" v-if="item.type === 'cascader' " :prop="item.prop">
  42. <el-cascader v-model="form[item.prop]" :options="item.options || []" style="width: 100%;"
  43. :props="item.props" :disabled="disables[item.prop]"/>
  44. </el-form-item>
  45. <!-- 图片预览 -->
  46. <el-form-item :label="item.label" v-if="item.type === 'img' " :prop="item.prop">
  47. <el-space wrap>
  48. <div v-for="(imgItem,imgIndex) in getImages(item.prop)" :key="imgIndex">
  49. <img :src="imgItem" alt="" srcset="" style="width: 180px;" />
  50. </div>
  51. </el-space>
  52. </el-form-item>
  53. </template>
  54. <el-form-item v-if="form.appStatus === '3'" label="驳回原因" prop="rejectReason" :rules="{ required: true, message: '请输入驳回原因', trigger: 'blur' }">
  55. <el-input v-model="form.rejectReason" type="textarea"
  56. :autosize="{ minRows: 2, maxRows: 4 }"
  57. placeholder="请输入驳回原因" clearable :disabled="disables.appStatus"/>
  58. </el-form-item>
  59. </el-form>
  60. <template #footer>
  61. <div class="dialog-footer">
  62. <el-button type="primary" @click="submitForm">确 定</el-button>
  63. <el-button @click="cancel">取 消</el-button>
  64. </div>
  65. </template>
  66. </el-dialog>
  67. </template>
  68. <script setup>
  69. import { computed, reactive } from 'vue';
  70. const { proxy } = getCurrentInstance();
  71. const props = defineProps({
  72. title: {
  73. type: String,
  74. default: '新增',
  75. },
  76. column: {
  77. type: Object,
  78. default: [],
  79. required: true
  80. },
  81. labelWidth: {
  82. type: String,
  83. default: '120px',
  84. },
  85. })
  86. const open = ref(false);
  87. const form = ref({});
  88. const dictionaryOptions = reactive({})
  89. const emit = defineEmits(['submit']);
  90. const dialogFormRef = ref(null);
  91. const disables = ref({});
  92. const getImages = (key) => {
  93. const imgs = form.value[key];
  94. console.log(233,imgs,key);
  95. if(!imgs){
  96. return [];
  97. }
  98. return imgs.split(',')
  99. }
  100. const handleInit = () => {
  101. try {
  102. const keys = props.column.map(item => {
  103. if (item.type === 'select' && item.dictionary) {
  104. return item.dictionary;
  105. }
  106. }).filter(Boolean);
  107. if(keys && keys.length > 0){
  108. const res = proxy.useDict(keys);
  109. Object.assign(dictionaryOptions, res)
  110. }
  111. } catch (error) {
  112. console.log('error', error);
  113. }
  114. }
  115. onMounted(() => {
  116. handleInit();
  117. })
  118. const handleDialog = (status,data) => {
  119. console.log('status',status);
  120. if(data){
  121. form.value = data;
  122. }
  123. open.value = status;
  124. }
  125. const submitForm = () => {
  126. proxy.$refs["dialogFormRef"].validate(valid => {
  127. if (valid) {
  128. console.log('form', form.value);
  129. emit('submit',form.value)
  130. }
  131. });
  132. }
  133. const cancel = () => {
  134. open.value = false;
  135. disables.value = {};
  136. dialogFormRef.value.resetFields();
  137. console.log('cancel');
  138. }
  139. const initForm = (data,disableData) => {
  140. console.log('initForm',data);
  141. form.value = data;
  142. if(disableData){
  143. disables.value = disableData;
  144. }
  145. }
  146. defineExpose({
  147. handleDialog,
  148. initForm
  149. })
  150. </script>
  151. <style lang='scss' scoped></style>