from.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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="t('message.property.dossier.form.inputPlaceholder', { title: 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="t('message.property.dossier.form.datePlaceholder')" 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-if="!disable" class="avatar-uploader-icon">
  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. import { getToken } from "/@/utils/auth";
  29. import { useI18n } from 'vue-i18n'
  30. interface FromState {
  31. dataList: any,
  32. formData: any,
  33. disable: boolean,
  34. }
  35. export default defineComponent({
  36. name: 'dossierFromData',
  37. props: {
  38. DataList: {
  39. type: Array,
  40. default: () => [],
  41. },
  42. disable: {
  43. type: Boolean,
  44. default: () => false,
  45. }
  46. },
  47. setup(prop, { emit }) {
  48. const { t } = useI18n()
  49. const uploadUrl = getOrigin('/common/singleFile')
  50. const headers = {
  51. Authorization: 'Bearer ' + getToken(),
  52. }
  53. // const emit = defineEmits(['SetSaveData'])
  54. const state = reactive<FromState>({
  55. dataList: prop.DataList,
  56. formData: {},
  57. disable: prop.disable,
  58. })
  59. onMounted(() => {
  60. initFormData();
  61. });
  62. const initFormData = () => {
  63. for (const item of state.dataList) {
  64. state.formData[item.name] = item.value ? item.value : ''
  65. }
  66. }
  67. const customCallback = (customValue: string) => {
  68. return function (file: any) {
  69. state.formData[customValue] = file.data.full_path
  70. saveData();
  71. }
  72. }
  73. const saveData = () => {
  74. const updatedData = []
  75. for (const item of state.dataList) {
  76. updatedData.push({
  77. productKey: item.productKey,
  78. name: item.name,
  79. value: state.formData[item.name], // 更新为formData的实际值
  80. fieldName: item.fieldName,
  81. })
  82. }
  83. emit('SetSaveData', updatedData)
  84. }
  85. return {
  86. headers,
  87. uploadUrl,
  88. customCallback,
  89. saveData,
  90. t,
  91. ...toRefs(state),
  92. };
  93. },
  94. components: {Plus},
  95. })
  96. </script>
  97. <style scoped lang="scss">
  98. .form-item {
  99. flex: 0 0 25%;
  100. }
  101. .avatar-uploader .avatar {
  102. width: 178px;
  103. height: 178px;
  104. display: block;
  105. }
  106. </style>
  107. <style scoped>
  108. .avatar-uploader .el-upload {
  109. border: 1px dashed var(--el-border-color);
  110. border-radius: 6px;
  111. cursor: pointer;
  112. position: relative;
  113. overflow: hidden;
  114. transition: var(--el-transition-duration-fast);
  115. }
  116. .avatar-uploader .el-upload:hover {
  117. border-color: var(--el-color-primary);
  118. }
  119. .el-icon.avatar-uploader-icon {
  120. font-size: 28px;
  121. color: #8c939d;
  122. width: 178px;
  123. height: 178px;
  124. text-align: center;
  125. }
  126. </style>