eachForm.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <template>
  2. <span>
  3. <!-- input 输入框-->
  4. <el-form-item :label="item.label" v-if="item.type == 'input'" :rules="[{required:item.required}]">
  5. <el-input
  6. :name="item.name"
  7. clearable
  8. :show-password ="item.name == 'password'?true:false"
  9. :placeholder="item.placeholder"
  10. v-model.trim="ConfigData[item.name]"
  11. @change="drivreConfigChange($event,item.name)"
  12. ></el-input>
  13. </el-form-item>
  14. <!-- input-number 数字输入框-->
  15. <el-form-item :label="item.label" v-if="item.type == 'input-number'" :rules="[{required:item.required}]">
  16. <el-input-number
  17. style="width:100%"
  18. :min="1"
  19. :label="item.label"
  20. v-model.trim="ConfigData[item.name]"
  21. @change="drivreConfigChange($event,item.name)"
  22. ></el-input-number>
  23. </el-form-item>
  24. <!-- select 下拉 显示给定的值-->
  25. <el-form-item :label="item.label" v-if="item.type == 'select'" :rules="[{required:item.required}]">
  26. <el-select @change="drivreConfigChange($event,item.name)" v-model="ConfigData[item.name]" :placeholder="item.placeholder" style="width:100%">
  27. <el-option
  28. v-for="option in item.options"
  29. :key="option.value"
  30. :label="option.label"
  31. :value="option.value">
  32. </el-option>
  33. </el-select>
  34. </el-form-item>
  35. <!-- select-code 下拉 直接取字典值 -->
  36. <el-form-item :label="item.label" v-if="item.type == 'code-select'" :rules="[{required:item.required}]">
  37. <code-select v-model="ConfigData[item.name]" :inputName="item.name" :dictname="item.dictname" mystyle="width: 100%;" placeholder="请选择" @changed="drivreConfigChange($event,item.name)" />
  38. </el-form-item>
  39. <!-- textarea 文本框-->
  40. <el-form-item :label="item.label" v-if="item.type == 'textarea'" :rules="[{required:item.required}]">
  41. <el-input
  42. type="textarea"
  43. clearable
  44. autosize
  45. :placeholder="item.placeholder"
  46. v-model="ConfigData[item.name]"
  47. @change="drivreConfigChange($event,item.name)"
  48. ></el-input>
  49. </el-form-item>
  50. <!-- checkbox 多选框 -->
  51. <el-form-item :label="item.label" v-if="item.type == 'checkbox-group'" :rules="[{required:item.required}]">
  52. <el-checkbox-group v-model="ConfigData[item.name]" @change="drivreConfigChange($event,item.name)">
  53. <el-checkbox v-for="(option,index) in item.options" :key="index" :label="option">{{option}}</el-checkbox>
  54. </el-checkbox-group>
  55. </el-form-item>
  56. <!-- radio 单选框 -->
  57. <el-form-item :label="item.label" v-if="item.type == 'radio-group'" :rules="[{required:item.required}]">
  58. <el-radio-group v-model="ConfigData[item.name]" @change="drivreConfigChange($event,item.name)">
  59. <el-radio v-for="(option,index) in item.options" :key="index" :label="option">{{option}}</el-radio>
  60. </el-radio-group>
  61. </el-form-item>
  62. <!-- 文件上传 -->
  63. <el-form-item :label="item.label" v-if="item.type == 'upload'" :rules="[{required:item.required}]" class="elForm">
  64. <el-upload
  65. :action="uploadUrl"
  66. list-type="picture-card"
  67. :on-preview="handlePictureCardPreview"
  68. :on-success="(response, file, fileList) => handleSuccess(response, file, fileList, item.name)"
  69. :on-remove="(file, fileList) => handleRemove(file, fileList, item.name)"
  70. :class="ConfigData[item.name]?'hide_box':''"
  71. :file-list="ConfigData[item.name] | imgFilter"
  72. :limit="1"
  73. >
  74. <i class="el-icon-plus"></i>
  75. </el-upload>
  76. <el-dialog :visible.sync="dialogVisible">
  77. <img width="100%" :src="dialogImageUrl" alt="">
  78. </el-dialog>
  79. </el-form-item>
  80. </span>
  81. </template>
  82. <script>
  83. import CodeSelect from "@/components/codeSelect.vue";
  84. import axios from 'axios';
  85. export default {
  86. props: {
  87. value: {
  88. type: [Object, String],
  89. required: true,
  90. default:()=>{}
  91. },
  92. // element 单个组件信息值
  93. item:{
  94. type:Object,
  95. required: true,
  96. default:()=>{}
  97. }
  98. },
  99. components:{
  100. CodeSelect
  101. },
  102. data () {
  103. return {
  104. // inputVals:[],
  105. ConfigData:{
  106. payType: []
  107. }, // 要传递出去的数据
  108. formItemsArr: [],
  109. dialogImageUrl: '',
  110. dialogVisible: false,
  111. // fileList: [],
  112. uploadUrl: axios.defaults.baseURL + '/auth-service/file/upload'
  113. }
  114. },
  115. watch: {
  116. value(newValue, oldValue) {
  117. // console.log(newValue,"newValue");
  118. this.ConfigData = newValue
  119. },
  120. item(val){
  121. console.log(val, 'item233');
  122. }
  123. },
  124. computed: {},
  125. filters: {
  126. imgFilter(val){
  127. if(val) {
  128. return [{url: val}]
  129. }
  130. }
  131. },
  132. methods: {
  133. // 上传成功的回调
  134. handleSuccess(response, file, fileList, imgName) {
  135. let fileListArr = []
  136. fileList.forEach(el => {
  137. if(el) {
  138. fileListArr.push(el.response.repData)
  139. }
  140. })
  141. this.drivreConfigChange(fileListArr.join(','), imgName)
  142. },
  143. // 移除图片的回调
  144. handleRemove(file, fileList, imgName) {
  145. console.log(imgName)
  146. this.ConfigData[imgName] = ""
  147. },
  148. // 预览图片
  149. handlePictureCardPreview(file) {
  150. this.dialogImageUrl = file.url;
  151. this.dialogVisible = true;
  152. },
  153. // 无论哪个输入框改变 都需要触发事件 将值回传
  154. drivreConfigChange(val,key){
  155. const {ConfigData} = this
  156. // console.log(val,key,"方法方法付付");
  157. // 针对type是下拉框的处理
  158. if (val.extend) {
  159. this.$set(ConfigData,key,val.value);
  160. }else{
  161. this.$set(ConfigData,key,val);
  162. }
  163. this.$emit('input', ConfigData)
  164. this.$emit('eachChange', ConfigData)
  165. },
  166. //重新选择了 数据连接类型 就重置输入框的值
  167. clearInput(){
  168. // this.inputVals.forEach((item,index,arr) => this.$set(arr,index,''));
  169. // 清空 对象
  170. let obj = this.ConfigData
  171. Object.keys(obj).forEach(key => {
  172. if (obj[key]) obj[key] = "";
  173. });
  174. }
  175. }
  176. }
  177. </script>
  178. <style lang="scss" scoped>
  179. .elForm /deep/ .el-upload--picture-card{
  180. width: 80px;
  181. height: 80px;
  182. line-height: 83px;
  183. }
  184. .elForm /deep/ .el-upload-list__item {
  185. width: 80px;
  186. height: 80px;
  187. }
  188. .hide_box /deep/ .el-upload--picture-card{
  189. display: none;
  190. }
  191. </style>