from.vue 3.7 KB

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