index.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <template>
  2. <div v-loading="loading" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 0, 0, 0.8)" class="PublicPageForm">
  3. <el-form ref="ruleForm" :model="tableForm" :label-width="labelWidth">
  4. <el-row :gutter="20">
  5. <el-col v-for="(item, index) in formItemArr" :key=" index" :span="formType == 'horizontal' ? formSpan : 24">
  6. <el-form-item :rules="fromDataReq(item)" :prop="item.pagecode" :label="item.pagename">
  7. <template v-if="fromDataType(item.datatype) == 'SELECT'">
  8. <el-select class="input-shadow" size="small" filterable default-first-option style="width: 100%" v-model="tableForm[item.pagecode]" @change="changeSelect(item.pagecode, item)" placeholder="请选择" clearable @clear="tableForm[item.pagecode] = ''">
  9. <el-option v-for="itemParams in tableOptions[item.pagecode]" :key="itemParams[item['dropdownlistid']]" :label="itemParams[item['dropdownlistlable']]" :value="itemParams[item['dropdownlistid']]">
  10. </el-option>
  11. </el-select>
  12. </template>
  13. <template v-else-if="fromDataType(item.datatype) == 'TEXT' || fromDataType(item.datatype) == 'VARCHAR'">
  14. <el-input size="small" @change="inputChangeHandler(item.pagecode)" v-model="tableForm[item.pagecode]"></el-input>
  15. </template>
  16. <template v-else-if="fromDataType(item.datatype) == 'TEXTAREA'">
  17. <el-input type="textarea" v-model="tableForm[item.pagecode]"></el-input>
  18. </template>
  19. <template v-else-if="fromDataType(item.datatype) == 'UPLOAD'">
  20. <upload ref="upload" />
  21. </template>
  22. <template v-else-if="fromDataType(item.datatype) == 'SWITCH'">
  23. <el-switch v-model="tableForm[item.pagecode]"></el-switch>
  24. </template>
  25. <template v-else-if="fromDataType(item.datatype) == 'CASCADER'">
  26. <el-cascader v-model="tableForm[item.pagecode]" :options="tableOptions[item.pagecode]"></el-cascader>
  27. </template>
  28. <template v-else-if="fromDataType(item.datatype) == 'CHECKBOX'">
  29. <el-checkbox-group v-model="tableForm[item.pagecode]">
  30. <el-checkbox v-for="itemParams in tableOptions[item.pagecode]" :key="itemParams[item['dropdownlistid']]" :label="itemParams[item['dropdownlistid']]" name="type">{{ [item['dropdownlistlable']] }}</el-checkbox>
  31. </el-checkbox-group>
  32. </template>
  33. <template v-else-if="fromDataType(item.datatype) == 'RADIO'">
  34. <el-radio-group v-model="tableForm[item.pagecode]">
  35. <el-radio v-for="itemParams in tableOptions[item.pagecode]" :key="itemParams[item['dropdownlistid']]" :label="itemParams[item['dropdownlistid']]" name="type">{{ [item['dropdownlistlable']] }}</el-radio>
  36. </el-radio-group>
  37. </template>
  38. <template v-else-if="fromDataType(item.datatype) == 'TIME'">
  39. <el-time-picker :picker-options="{selectableRange: '00:00:00 - 23:59:59'}" v-model="tableForm[item.pagecode]" placeholder="选择任意时间段" @change="inputChangeHandler(item.pagecode)">
  40. </el-time-picker>
  41. </template>
  42. <template v-else-if="fromDataType(item.datatype) == 'DATE'">
  43. <el-date-picker class="datetimes" value-format="yyyy-MM-dd" v-model="tableForm[item.pagecode]" type="date" placeholder="选择日期" @change="inputChangeHandler(item.pagecode)">
  44. </el-date-picker>
  45. </template>
  46. <template v-else-if="fromDataType(item.datatype) == 'DATETIME'">
  47. <el-date-picker class="datetimes" value-format="yyyy-MM-dd HH:mm:ss" v-model="tableForm[item.pagecode]" type="datetime" placeholder="选择日期时间" @change="inputChangeHandler(item.pagecode)">
  48. </el-date-picker>
  49. </template>
  50. <template v-else-if="fromDataType(item.datatype) == 'INT' || fromDataType(item.datatype) == 'tinyint' || fromDataType(item.datatype) == 'NUMBER'">
  51. <el-input size="small" v-model.number="tableForm[item.pagecode]" onkeyup="value=value.replace(/[^1-9]/g,'')" @change="inputChangeHandler(item.pagecode)"></el-input>
  52. </template>
  53. <template v-else>
  54. <el-input size="small" v-model="tableForm[item.pagecode]" @change="inputChangeHandler(item.pagecode)"></el-input>
  55. </template>
  56. </el-form-item>
  57. </el-col>
  58. </el-row>
  59. </el-form>
  60. </div>
  61. </template>
  62. <script>
  63. import { Query } from "@/api/webApi"
  64. import Upload from './upload.vue'
  65. export default {
  66. name: 'PublicPageForm',
  67. components: { Upload },
  68. props: {
  69. formType: {
  70. type: String,
  71. default: 'vertical' //horizontal--水平布局 默认一行3列
  72. },
  73. formItem: {
  74. type: Array,
  75. default: () => new Array()
  76. },
  77. formData: {
  78. type: Object,
  79. default: () => new Object()
  80. },
  81. formSpan: {
  82. type: Number,
  83. default: 8
  84. },
  85. labelWidth: {
  86. type: String,
  87. default: '80px'
  88. }
  89. },
  90. data () {
  91. return {
  92. tableForm: {},
  93. tableOptions: {},
  94. formItemArr: [],
  95. loading: false
  96. }
  97. },
  98. watch: {
  99. formItem: {
  100. handler (array) {
  101. this.getSelectData(array)
  102. },
  103. deep: true,
  104. immediate: true
  105. },
  106. formData: {
  107. handler (obj) {
  108. this.tableForm = obj
  109. },
  110. deep: true,
  111. immediate: true
  112. }
  113. },
  114. computed: {
  115. //设置新增修改表单类型
  116. fromDataType () {
  117. return function (type) {
  118. if (type) {
  119. return type.replace(/\([^\)]*\)/g, "");
  120. }
  121. }
  122. },
  123. //设置新增修改表单必填类型
  124. fromDataReq () {
  125. return function (item) {
  126. const { dropdownlist, datatype, pagename, isrequired, formatrule } = item
  127. const itemType = datatype.replace(/\([^\)]*\)/g, "")
  128. const itemReq = isrequired ? true : false
  129. const itemRule = formatrule ? true : false
  130. if (dropdownlist || dropdownlist == 0) return [{ required: itemReq, message: `${pagename}不能为空`, trigger: 'change' }]
  131. else if (itemType == 'date' || itemType == 'datetime') return [{ required: itemReq, type: 'date', message: `${pagename}不能为空`, trigger: 'change' }]
  132. else
  133. if (itemReq && itemRule) return [{ required: itemReq, message: `${pagename}不能为空`, trigger: 'blur' }, { pattern: new RegExp(formatrule), message: `请输入合法的${pagename}规则`, trigger: 'blur' }]
  134. return [{ required: itemReq, message: `${pagename}不能为空`, trigger: 'blur' }]
  135. }
  136. },
  137. },
  138. methods: {
  139. //格式化传递参数数据
  140. formatDefault (item) {
  141. if (typeof item != 'string') return {}
  142. const filterItem = {}
  143. const parameters = item.replace('{', '').replace('}', '')
  144. const parametersSplit = parameters?.split(',')
  145. parametersSplit.map(item => {
  146. const [key, val] = item?.split(':')
  147. filterItem[key] = val
  148. })
  149. return filterItem
  150. },
  151. //获取表单下拉数据
  152. getSelectData (formItem = []) {
  153. if (!formItem.length || !Array.isArray(formItem)) return
  154. const formItemCopy = _.cloneDeep(formItem)
  155. const [allResult, allResultKey] = [[], []]
  156. formItemCopy.map(({ dropdownlist, pagecode, defaultfilter }) => {
  157. if (dropdownlist || dropdownlist == 0) {
  158. const datacontent = dropdownlist == 19 ? this.formatDefault(defaultfilter) : { filter: { 1: 1 } }
  159. allResultKey.push(pagecode)
  160. allResult.push(Query({ serviceid: dropdownlist, datacontent, event: '0' }))
  161. }
  162. })
  163. this.getAnscyData(allResultKey, allResult, formItem)
  164. },
  165. //获取异步数据
  166. async getAnscyData (allResultKey = [], allResult = [], formItem = []) {
  167. this.loading = true
  168. if (allResult.length && allResultKey.length) {
  169. const results = await Promise.allSettled(allResult)
  170. results.map((item, index) => {
  171. const { status, value } = item
  172. if (status == 'fulfilled') {
  173. const { code, returnData } = value
  174. this.tableOptions[allResultKey[index]] = code == 0 && returnData?.length ? this.formatData(returnData) : []
  175. }
  176. })
  177. this.formItemArr = formItem
  178. } else {
  179. this.formItemArr = formItem
  180. }
  181. this.loading = false
  182. },
  183. formatData (returnData) {
  184. return typeof returnData == 'string' ? JSON.parse(returnData) : returnData
  185. },
  186. //设置下拉数据
  187. formatSelectData () {
  188. },
  189. //获取表单下拉数据
  190. changeSelect (code, item) { },
  191. inputChangeHandler (data) {
  192. if (!this.tableForm[data]) this.tableForm[data] = null
  193. },
  194. restForm () {
  195. this.$refs['ruleForm'].resetFields()
  196. },
  197. // 新增/编辑-确认
  198. submitClickHandler () {
  199. let flag = false
  200. this.$refs["ruleForm"].validate((valid) => {
  201. if (valid) {
  202. flag = true
  203. } else {
  204. flag = false;
  205. }
  206. });
  207. return flag
  208. }
  209. }
  210. }
  211. </script>