eachForm.vue 6.3 KB

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