x-form.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <template>
  2. <!-- 表单 -->
  3. <view style="margin: 0rpx 20rpx 0rpx 30rpx;">
  4. <u-form :model="model" :rules="rules" labelPosition="left" ref="uForm" labelWidth="70">
  5. <view v-for="(item,index) in list" :key="index">
  6. <u-form-item :required="item.required ? true : false" :label="item.label" :prop="item.field"
  7. v-if="item.type == 'input' && customerName(item)">
  8. <view class="card_form_item">
  9. <u-input v-model="model[`${item.field}`]" :disabled="item.disabled ? true : false"
  10. :placeholder="item.placeholder"></u-input>
  11. </view>
  12. </u-form-item>
  13. <u-form-item :required="item.required ? true : false" :label="item.label" :prop="item.field"
  14. v-else-if="item.type == 'select'">
  15. <view class="card_form_item">
  16. <u-input :placeholder="item.placeholder" suffixIcon="arrow-down"
  17. v-model="model[`${item.field}`]" @focus="change(item)"></u-input>
  18. </view>
  19. </u-form-item>
  20. <u-form-item :required="item.required ? true : false" :label="item.label" :prop="item.field"
  21. v-else-if="item.type == 'textarea'">
  22. <view class="card_form_item">
  23. <u-textarea v-model="model[`${item.field}`]" autoHeight
  24. :placeholder="item.placeholder"></u-textarea>
  25. </view>
  26. </u-form-item>
  27. <u-form-item :required="item.required ? true : false" :label="item.label" :prop="item.field"
  28. v-else-if="item.type == 'upload' && !item.visible">
  29. <view class="card_form_item">
  30. <u-upload :fileList="fileList1" name="1" multiple :maxCount="10" @afterRead="afterRead"
  31. @delete="deletePic"></u-upload>
  32. </view>
  33. </u-form-item>
  34. </view>
  35. </u-form>
  36. <u-picker :defaultIndex="findIndex(model[fieldType], columns[0])" :show="show" :columns="columns"
  37. keyName="label" @confirm="confirm($event, fieldType)" @cancel="cancel"></u-picker>
  38. </view>
  39. </template>
  40. <script>
  41. const ENV = require('@/.env.js')
  42. export default {
  43. name: 'x-form',
  44. props: {
  45. list: {
  46. type: Array,
  47. default () {
  48. return []
  49. }
  50. },
  51. model: {
  52. type: Object,
  53. default () {
  54. return {}
  55. }
  56. },
  57. rules: {
  58. type: Object,
  59. default () {
  60. return {}
  61. }
  62. },
  63. },
  64. data() {
  65. return {
  66. show: false,
  67. columns: [],
  68. fieldType: '',
  69. fileList1: [],
  70. }
  71. },
  72. // 必须要在onReady生命周期,因为onLoad生命周期组件可能尚未创建完毕
  73. onReady() {
  74. this.$refs.uForm.setRules(this.rules);
  75. },
  76. methods: {
  77. customerName(value) {
  78. var userInfo = this.$cache.getCache('userInfo')
  79. if (userInfo.userType == 'customer') {
  80. if (value.field != 'customerName') {
  81. if (value.type == 'input') {
  82. return true
  83. }
  84. }
  85. } else {
  86. if (value.type == 'input') {
  87. return true
  88. }
  89. }
  90. },
  91. change(e) {
  92. this.columns = []
  93. this.fieldType = e.field
  94. this.show = true
  95. this.$nextTick(() => {
  96. this.columns.push(e.options)
  97. })
  98. },
  99. // 选择确定
  100. confirm(value, type) {
  101. this.show = false
  102. this.model[type] = value.value[0].label
  103. },
  104. // 点击确定
  105. cancel() {
  106. this.show = false
  107. },
  108. findIndex(code, list) {
  109. if (!code || !list) {
  110. return [0]
  111. }
  112. return [list.findIndex((item) => (item.label === code || item.label === code))]
  113. },
  114. // 新增图片
  115. async afterRead(event) {
  116. // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
  117. let lists = [].concat(event.file)
  118. let fileListLen = this[`fileList${event.name}`].length
  119. lists.map((item) => {
  120. this[`fileList${event.name}`].push({
  121. ...item,
  122. status: 'uploading',
  123. message: '上传中'
  124. })
  125. })
  126. uni.showLoading({
  127. title: '上传中',
  128. mask: true,
  129. })
  130. for (let i = 0; i < lists.length; i++) {
  131. const result = await this.uploadFilePromise(lists[i].url)
  132. let item = this[`fileList${event.name}`][fileListLen]
  133. this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
  134. status: 'success',
  135. message: '',
  136. url: result
  137. }))
  138. fileListLen++
  139. }
  140. var arr = []
  141. this.fileList1.forEach(item1 => {
  142. arr.push(item1.url)
  143. })
  144. uni.hideLoading();
  145. this.model.tamperProofLabelImg = arr.join()
  146. this.$refs.uForm.validateField('tamperProofLabelImg')
  147. },
  148. // 删除图片
  149. deletePic(event) {
  150. this[`fileList${event.name}`].splice(event.index, 1)
  151. var arr = []
  152. this.fileList1.forEach(item1 => {
  153. arr.push(item1.url)
  154. })
  155. uni.hideLoading();
  156. this.model.tamperProofLabelImg = arr.join()
  157. },
  158. uploadFilePromise(url) {
  159. return new Promise((resolve, reject) => {
  160. let a = uni.uploadFile({
  161. url: ENV.APP_DEV_URL + '/api/upload', // 仅为示例,非真实的接口地址
  162. filePath: url,
  163. name: 'file',
  164. // formData: {
  165. // user: 'test'
  166. // },
  167. header: {
  168. 'Authorization': 'Bearer ' + uni.getStorageSync('access_token'),
  169. },
  170. success: (res) => {
  171. let state = JSON.parse(res.data)
  172. setTimeout(() => {
  173. if (state.code == 200) {
  174. resolve(state.data)
  175. }
  176. }, 100)
  177. }
  178. });
  179. })
  180. },
  181. //子组件校验,传递到父组件
  182. async validateForm() {
  183. let flag = null
  184. await this.$refs.uForm.validate(valid => {}).then(res => {
  185. flag = true
  186. }).catch(err => {
  187. flag = false
  188. })
  189. return flag
  190. }
  191. },
  192. }
  193. </script>
  194. <style lang="scss">
  195. .card_form_item {
  196. width: 100%;
  197. }
  198. </style>