from.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <template>
  2. <div>
  3. <div v-for="(item, index) in dataList" :key="index">
  4. <el-form-item :label="item.title + ':'" :prop="item.name" class="form-item" v-if="item.types === 'input'">
  5. <el-input v-model="formData[item.name]" :placeholder="'请输入' + item.title" @input="saveData()" :readonly="disable" />
  6. </el-form-item>
  7. <el-form-item :label="item.title + ':'" :prop="item.name" class="form-item" v-if="item.types === 'textarea'">
  8. <el-input v-model="formData[item.name]" type="textarea" @input="saveData()" :readonly="disable" />
  9. </el-form-item>
  10. <el-form-item v-if="item.types === 'date'" :label="item.title + ':'">
  11. <el-date-picker v-model="formData[item.name]" :default-value="item.value" type="date" value-format="YYYY-MM-DD" placeholder="请选择时间" class="w100" clearable @change="saveData()" :readonly="disable" />
  12. </el-form-item>
  13. <el-form-item :label="item.title + ':'" prop="path" v-if="item.types === 'file'">
  14. <el-upload class="avatar-uploader" :action="uploadUrl" :headers="headers" :show-file-list="false" :on-success="customCallback(item.name)" :disabled="disable">
  15. <img v-if="formData[item.name]" :src="formData[item.name]" class="avatar" />
  16. <el-icon v-else class="avatar-uploader-icon" v-if="!disable">
  17. <Plus />
  18. </el-icon>
  19. </el-upload>
  20. </el-form-item>
  21. </div>
  22. </div>
  23. </template>
  24. <script lang="ts">
  25. import {onMounted, defineComponent, reactive, toRefs} from 'vue'
  26. import getOrigin from '/@/utils/origin'
  27. import { Plus } from '@element-plus/icons-vue'
  28. interface FromState {
  29. dataList: any,
  30. formData: any,
  31. disable: boolean,
  32. }
  33. export default defineComponent({
  34. name: 'dossierFromData',
  35. props: {
  36. DataList: {
  37. type: Array,
  38. default: () => [],
  39. },
  40. disable: {
  41. type: Boolean,
  42. default: () => false,
  43. }
  44. },
  45. setup(prop, { emit }) {
  46. const uploadUrl = getOrigin(import.meta.env.VITE_API_URL + '/common/singleFile')
  47. const headers = {
  48. Authorization: 'Bearer ' + localStorage.token,
  49. }
  50. // const emit = defineEmits(['SetSaveData'])
  51. const state = reactive<FromState>({
  52. dataList: prop.DataList,
  53. formData: {},
  54. disable: prop.disable,
  55. })
  56. onMounted(() => {
  57. initFormData();
  58. });
  59. const initFormData = () => {
  60. for (const item of state.dataList) {
  61. state.formData[item.name] = item.value ? item.value : ''
  62. }
  63. }
  64. const customCallback = (customValue: string) => {
  65. return function (file: any) {
  66. state.formData[customValue] = file.data.full_path
  67. saveData();
  68. }
  69. }
  70. const saveData = () => {
  71. const updatedData = []
  72. for (const item of state.dataList) {
  73. updatedData.push({
  74. productKey: item.productKey,
  75. name: item.name,
  76. value: state.formData[item.name], // 更新为formData的实际值
  77. fieldName: item.fieldName,
  78. })
  79. }
  80. emit('SetSaveData', updatedData)
  81. }
  82. return {
  83. headers,
  84. uploadUrl,
  85. customCallback,
  86. saveData,
  87. ...toRefs(state),
  88. };
  89. },
  90. components: {Plus},
  91. })
  92. </script>
  93. <style scoped lang="scss">
  94. .form-item {
  95. flex: 0 0 25%;
  96. }
  97. .avatar-uploader .avatar {
  98. width: 178px;
  99. height: 178px;
  100. display: block;
  101. }
  102. </style>
  103. <style scoped>
  104. .avatar-uploader .el-upload {
  105. border: 1px dashed var(--el-border-color);
  106. border-radius: 6px;
  107. cursor: pointer;
  108. position: relative;
  109. overflow: hidden;
  110. transition: var(--el-transition-duration-fast);
  111. }
  112. .avatar-uploader .el-upload:hover {
  113. border-color: var(--el-color-primary);
  114. }
  115. .el-icon.avatar-uploader-icon {
  116. font-size: 28px;
  117. color: #8c939d;
  118. width: 178px;
  119. height: 178px;
  120. text-align: center;
  121. }
  122. </style>