generate-form.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <template>
  2. <view>
  3. <u--form labelWidth="100px" class="u-form" labelPosition="left" >
  4. <u-form-item :label="item.name" borderBottom v-if="item.readable" v-for="(item,index) in formData" :key="index">
  5. <!-- <view class="title">
  6. <text class="red-color " v-if="item.options.required">* </text> {{item.name}}
  7. </view> -->
  8. <template v-if="item.type=='input'">
  9. <!-- 普通输入框 -->
  10. <u--input :placeholder='item.placeholder' :disabled="!item.writable" v-model="item.value" border="none"></u--input>
  11. </template>
  12. <template v-if="item.type=='textarea' || item.type=='editor'">
  13. <!-- 多行文本输入框 -->
  14. <u--textarea :placeholder='item.placeholder' :disabled="!item.writable" v-model="item.value" border="none"></u--textarea>
  15. </template>
  16. <template v-if="item.type=='number'">
  17. <!-- 计数器 -->
  18. <u-number-box :placeholder='item.placeholder' :disabled="!item.writable" v-model="item.value"></u-number-box>
  19. </template>
  20. <template v-if="item.type=='radio'">
  21. <!-- 单选框 -->
  22. <u-radio-group
  23. v-if="item.options.remote === 3"
  24. v-model="item.value"
  25. :disabled="!item.writable"
  26. placement="column"
  27. >
  28. <u-radio
  29. :customStyle="{margin: '8px'}"
  30. v-for="(option, index) in $dictUtils.getDictList(item.options.dictType)"
  31. :key="index"
  32. :label="option.label"
  33. :name="option.value"
  34. >
  35. </u-radio>
  36. </u-radio-group>
  37. <u-radio-group
  38. v-else-if="item.options.showLabel"
  39. v-model="item.value"
  40. :disabled="!item.writable"
  41. placement="column"
  42. >
  43. <u-radio
  44. :customStyle="{margin:'8px'}"
  45. v-for="(option, index) in item.options.options"
  46. :key="index"
  47. :label="option.label"
  48. :name="option.value"
  49. >
  50. </u-radio>
  51. </u-radio-group>
  52. <u-radio-group
  53. v-else
  54. v-model="item.value"
  55. :disabled="!item.writable"
  56. placement="column"
  57. >
  58. <u-radio
  59. :customStyle="{margin:'8px'}"
  60. v-for="(option, index) in item.options.options"
  61. :key="index"
  62. :label="option.value"
  63. :name="option.value"
  64. >
  65. </u-radio>
  66. </u-radio-group>
  67. </template>
  68. <template v-if="item.type=='checkbox'">
  69. <u-checkbox-group
  70. v-if="item.options.remote === 3"
  71. v-model="item.value"
  72. :disabled="!item.writable"
  73. placement="column"
  74. >
  75. <u-checkbox
  76. :customStyle="{margin: '8px'}"
  77. v-for="(option, index) in $dictUtils.getDictList(item.options.dictType)"
  78. :key="index"
  79. :label="option.label || option.value"
  80. :name="option.value"
  81. >
  82. </u-checkbox>
  83. </u-checkbox-group>
  84. <u-checkbox-group
  85. v-else-if="item.options.showLabel"
  86. v-model="item.value"
  87. :disabled="!item.writable"
  88. placement="column"
  89. >
  90. <u-checkbox
  91. :customStyle="{margin: '8px'}"
  92. v-for="(option, index) in item.options.options"
  93. :key="index"
  94. :label="option.label"
  95. :name="option.value"
  96. >
  97. </u-checkbox>
  98. </u-checkbox-group>
  99. <u-checkbox-group
  100. v-else
  101. v-model="item.value"
  102. :disabled="!item.writable"
  103. placement="column"
  104. >
  105. <u-checkbox
  106. :customStyle="{margin: '8px'}"
  107. v-for="(option, index) in item.options.options"
  108. :key="index"
  109. :label="option.value"
  110. :name="option.value"
  111. >
  112. </u-checkbox>
  113. </u-checkbox-group>
  114. </template>
  115. <template v-if="item.type=='time'">
  116. <!-- 时间控件 -->
  117. <jp-datetime-picker v-model="item.value" :placeholder='item.placeholder' :disabled="!item.writable" mode="time"></jp-datetime-picker>
  118. </template>
  119. <template v-if="item.type=='date'">
  120. <!-- 日期控件 -->
  121. <jp-datetime-picker v-model="item.value" :placeholder='item.placeholder' :disabled="!item.writable" mode="date"></jp-datetime-picker>
  122. </template>
  123. <template v-if="item.type=='rate'">
  124. <!-- 评分 -->
  125. <u-rate :disabled="!item.writable" :count="item.options.max" v-model="item.value"></u-rate>
  126. </template>
  127. <template v-if="item.type=='color'">
  128. <!-- 颜色选择框 -->
  129. <jp-color-picker :disabled="!item.writable" v-model="item.value" ></jp-color-picker>
  130. </template>
  131. <template v-if="item.type=='select'">
  132. <!-- 选择框 -->
  133. <jp-picker :disabled="!item.writable" v-if="item.options.remote === 3" v-model="item.value" :range="$dictUtils.getDictList(item.options.dictType)">
  134. </jp-picker>
  135. <jp-picker :disabled="!item.writable" v-else-if="item.options.showLabel" v-model="item.value" :range="item.options.options">
  136. </jp-picker>
  137. <jp-picker :disabled="!item.writable" v-else v-model="item.value" rangeKey="value" :range="item.options.options">
  138. </jp-picker>
  139. </template>
  140. <template v-if="item.type=='switch'">
  141. <!-- 开关 -->
  142. <u-switch :placeholder="item.placeholder" :disabled="!item.writable" v-model="item.value"></u-switch>
  143. </template>
  144. <template v-if="item.type=='cascader'">
  145. <!-- 开关 -->
  146. <uni-data-picker :localdata="item.options.options" v-model="item.value" :map="{text:'label', value: 'value'}" :popup-title="item.placeholder" ></uni-data-picker>
  147. </template>
  148. <template v-if="item.type=='slider'">
  149. <!-- 滑块 -->
  150. <u-slider :placeholder='item.placeholder' :disabled="!item.writable" step="20" min="30" max="100" v-model="item.value"></u-slider>
  151. </template>
  152. <template v-if="item.type=='text'">
  153. <!-- 普通输入框 -->
  154. <text>{{item.value}}</text>
  155. </template>
  156. <template v-if="item.type=='html'">
  157. <!-- 普通输入框 -->
  158. <view v-html="item.value"></view>
  159. </template>
  160. <!--步骤条-->
  161. <template v-if="item.type == 'steps'">
  162. <u-steps :current="item.value">
  163. <u-steps-item v-for="(item, index) in item.options.steps" :title="item.title"></u-steps-item>
  164. </u-steps>
  165. </template>
  166. <template v-if="item.type=='imgupload' || item.type=='fileupload'">
  167. <!-- 图片上传 -->
  168. <jp-form-upload :disabled="!item.writable" v-model="item.value"></jp-form-upload>
  169. </template>
  170. <template v-if="item.type=='user'">
  171. <!-- 用户选择框 -->
  172. <user-select :placeholder='item.placeholder' :disabled="!item.writable" v-model="item.value"></user-select>
  173. </template>
  174. <template v-if="item.type=='office'">
  175. <!-- 机构选择框 -->
  176. <jp-office-select :placeholder='item.placeholder' :disabled="!item.writable" v-model="item.value"></jp-office-select>
  177. </template>
  178. <template v-if="item.type=='area'">
  179. <!-- 普通输入框 -->
  180. <jp-area-select :disabled="!item.writable" v-model="item.value"></jp-area-select>
  181. </template>
  182. <template v-if="item.type=='dict'">
  183. <!-- 字典 -->
  184. <jp-picker :disabled="!item.writable" v-model="item.value" :range="$dictUtils.getDictList(item.options.dictType)"></jp-picker>
  185. </template>
  186. </u-form-item>
  187. </u--form>
  188. </view>
  189. </template>
  190. <script>
  191. export default {
  192. watch:{
  193. formData:{
  194. handler (val) {
  195. console.log(this.formData)
  196. },
  197. immediate: true,
  198. deep: false
  199. }
  200. },
  201. props: {
  202. formData:{
  203. type:Array,
  204. default:function(){
  205. return []
  206. }
  207. }
  208. },
  209. methods: {
  210. }
  211. }
  212. </script>
  213. <style lang="scss">
  214. .uni-list-cell {
  215. justify-content: flex-start
  216. }
  217. .cu-form-group{
  218. uni-checkbox-group{
  219. text-align: right;
  220. }
  221. uni-radio-group {
  222. text-align: right;
  223. }
  224. uni-checkbox, uni-radio {
  225. position: relative;
  226. margin-top: 7px;
  227. margin-left:7px;
  228. margin-bottom: 7px;
  229. }
  230. }
  231. </style>