index.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <template>
  2. <div>
  3. <el-form-item label="字段配置">
  4. <el-button type="primary" size="small" @click="$refs.column.visible = true">字段配置</el-button>
  5. </el-form-item>
  6. <el-form-item label="边框">
  7. <el-switch v-model="data.children.border"></el-switch>
  8. </el-form-item>
  9. <el-form-item label="label">
  10. <el-input v-model="data.props.label" placeholder="label" clearable></el-input>
  11. </el-form-item>
  12. <el-form-item label="value">
  13. <el-input v-model="data.props.value" placeholder="value" clearable></el-input>
  14. </el-form-item>
  15. <el-form-item label="请求地址">
  16. <el-input v-model="data.children.props.url" type="textarea" placeholder="请求地址" autosize></el-input>
  17. </el-form-item>
  18. <el-form-item label="请求方法">
  19. <el-select v-model="data.children.props.method" placeholder="请求方法" clearable>
  20. <el-option label="GET" value="get"></el-option>
  21. <el-option label="POST" value="post"></el-option>
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item label="分页">
  25. <el-switch v-model="data.children.props.needPage"></el-switch>
  26. </el-form-item>
  27. <el-form-item label="当前页" v-if="data.children.props.needPage">
  28. <el-input v-model="data.children.props.currentPageKey" placeholder="当前页" clearable></el-input>
  29. </el-form-item>
  30. <el-form-item label="每页条数" v-if="data.children.props.needPage">
  31. <el-input v-model="data.children.props.pageSizeKey" placeholder="每页条数" clearable></el-input>
  32. </el-form-item>
  33. <el-form-item label="总条数" v-if="data.children.props.needPage">
  34. <el-input v-model="data.children.props.totalKey" placeholder="总条数" clearable></el-input>
  35. </el-form-item>
  36. <el-form-item label="列表" v-if="data.children.props.needPage">
  37. <el-input v-model="data.children.props.recordsKey" placeholder="列表" clearable></el-input>
  38. </el-form-item>
  39. <el-form-item label="返回层级">
  40. <el-input v-model="data.children.props.resKey" placeholder="返回层级" clearable></el-input>
  41. </el-form-item>
  42. <el-form-item label="自动生成">
  43. <el-switch v-model="data.children.props.auto"></el-switch>
  44. </el-form-item>
  45. <div class="el-form--label-top">
  46. <div class="el-form-item">
  47. <label class="el-form-item__label" style="padding: 0;">
  48. <el-popover
  49. placement="top-start"
  50. :width="200"
  51. trigger="hover"
  52. content="填写以上配置后会自动生成,若觉得生成的不对请自行修改或关闭自动生成"
  53. >
  54. <template #reference>
  55. <el-link
  56. href="https://avuejs.com/form/form-input-table.html"
  57. :underline="false"
  58. target="_blank"
  59. >
  60. onLoad:
  61. <i class="el-icon-question"></i>
  62. </el-link>
  63. </template>
  64. </el-popover>
  65. </label>
  66. <div class="el-form-item__content">
  67. <monaco-editor
  68. v-model="onLoad"
  69. height="200"
  70. :keyIndex="`table-onload-${data.prop}`"
  71. :options="options"
  72. ></monaco-editor>
  73. </div>
  74. </div>
  75. <div class="el-form-item">
  76. <label class="el-form-item__label" style="padding: 0;">formatter:</label>
  77. <div class="el-form-item__content">
  78. <monaco-editor
  79. v-model="formatter"
  80. height="200"
  81. :keyIndex="`table-formatter-${data.prop}`"
  82. :options="options"
  83. ></monaco-editor>
  84. </div>
  85. </div>
  86. </div>
  87. <afd-column ref="column" :column="data.children.column" @submit="handleColumn"></afd-column>
  88. </div>
  89. </template>
  90. <script>
  91. import MonacoEditor from '../../utils/monaco-editor'
  92. import AfdColumn from './column.vue'
  93. export default {
  94. name: 'config-table',
  95. components: { MonacoEditor, AfdColumn },
  96. props: ['data'],
  97. watch: {
  98. 'data.prop': {
  99. handler() {
  100. const { onLoad, formatter } = this.data
  101. this.onLoad = onLoad ? onLoad + '' : ''
  102. this.formatter = formatter ? formatter + '' : ''
  103. },
  104. immediate: true
  105. },
  106. 'data.children.props': {
  107. handler(val) {
  108. this.handleOnLoad(val)
  109. },
  110. deep: true
  111. },
  112. onLoad: {
  113. handler(val) {
  114. try {
  115. this.data.onLoad = eval(val)
  116. } catch (e) {
  117. console.error(e)
  118. }
  119. }
  120. }
  121. },
  122. data() {
  123. return {
  124. options: {
  125. fullScreen: true,
  126. minimap: {
  127. enabled: false,
  128. },
  129. },
  130. onLoad: '',
  131. formatter: ''
  132. }
  133. },
  134. methods: {
  135. handleColumn(column) {
  136. this.data.children.column = column
  137. },
  138. handleOnLoad(obj) {
  139. const { url, method, needPage, currentPageKey, pageSizeKey, totalKey, recordsKey, resKey, auto } = obj
  140. if (!auto) return
  141. if (!url) {
  142. this.onLoad = `(res, cb) => { }`
  143. return
  144. }
  145. let { props } = this.data
  146. if (!props) props = { label: 'label', value: 'value' }
  147. const { value } = props
  148. const onLoad = `(res, cb) => {
  149. let { page, value, data } = res
  150. if (!page) page = { currentPage: 1, pageSize: 10 }
  151. const { currentPage, pageSize } = page
  152. let params = { ...data, ${currentPageKey || 'current'}: currentPage, ${pageSizeKey || 'page'}: pageSize }
  153. if (value) params['${value}'] = value
  154. if ('${method || 'get'}' == 'get') params = { params: { ...params } }
  155. this.$axios['${method}']('${url}', params).then(res => {
  156. const response = this.getAsVal(res, '${resKey || 'data.data'}')
  157. if (!response) this.$message.error('未查询到数据或者返回层级配置错误')
  158. let result = {}
  159. if (${needPage}) {
  160. const total = this.getAsVal(response, '${totalKey || 'total'}')
  161. if (total || total == 0) {
  162. result.total = total
  163. } else {
  164. this.$message.error('总条数配置错误')
  165. return
  166. }
  167. const records = this.getAsVal(response, '${recordsKey || 'records'}')
  168. if (records) {
  169. result.data = records
  170. } else {
  171. this.$message.error('列表配置错误')
  172. return
  173. }
  174. } else result = { total: response.length, data: response }
  175. if (value) {
  176. const records = result.data
  177. if (records && records.length > 0) cb(records[0])
  178. else this.$message.error('根据${value}: ' + value + ' 查询不到结果')
  179. } else cb(result)
  180. })
  181. }`
  182. this.onLoad = onLoad
  183. },
  184. }
  185. }
  186. </script>