Search.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <template>
  2. <div>
  3. <el-form :inline="true" ref="searchRef" :model="formInline" class="demo-form-inline">
  4. <template v-for="item in column" :key="item.prop">
  5. <!-- 输入框 -->
  6. <el-form-item :label="item.label" v-if="item.type === 'input'" :prop="item.prop">
  7. <el-input v-model="formInline[item.prop]" :placeholder="'请输入' + item.label" clearable />
  8. </el-form-item>
  9. <!-- 时间选择 -->
  10. <el-form-item :label="item.label" v-if="item.type === 'date'" :prop="item.prop">
  11. <el-date-picker v-model="formInline[item.prop]" value-format="YYYY-MM-DD" type="daterange"
  12. range-separator="-" start-placeholder="开始日期" clearable end-placeholder="结束日期"></el-date-picker>
  13. </el-form-item>
  14. <!-- 下拉框选择 -->
  15. <el-form-item :label="item.label" v-if="item.type === 'select'" :prop="item.prop">
  16. <el-select v-model="formInline[item.prop]" :placeholder="'请选择' + item.label" clearable>
  17. <el-option v-for="dict in dictionaryOptions[item.dictionary]" :key="dict.value"
  18. :label="dict.label" :value="dict.value"></el-option>
  19. </el-select>
  20. </el-form-item>
  21. <!-- 联动选择框 -->
  22. <el-form-item :label="item.label" v-if="item.type === 'cascader' " :prop="item.prop">
  23. <el-cascader v-model="formInline[item.prop]" :options="item.options || []" style="width: 100%;"
  24. :props="item.props" />
  25. </el-form-item>
  26. </template>
  27. <el-form-item>
  28. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  29. <el-button @click="resetForm">重置</el-button>
  30. </el-form-item>
  31. </el-form>
  32. <el-row :gutter="10" class="mb8">
  33. <el-col :span="1.5" v-for="item in searchBtns" :key="item.key">
  34. <el-button :type="item.type || 'primary'" plain :icon="item.icon" @click="()=>item.func(formInline)"
  35. v-hasPermi="item.hasPermi">{{ item.label }}</el-button>
  36. </el-col>
  37. </el-row>
  38. </div>
  39. </template>
  40. <script setup>
  41. import { ref, onMounted, reactive } from 'vue'
  42. const { proxy } = getCurrentInstance();
  43. const props = defineProps({
  44. column: {
  45. type: Object,
  46. default: [],
  47. required: true
  48. },
  49. searchBtns: {
  50. type: Array,
  51. default: [],
  52. }
  53. })
  54. const emit = defineEmits(['submit', 'reset'])
  55. const formInline = reactive({
  56. user: '',
  57. region: '',
  58. date: '',
  59. })
  60. const searchRef = ref(null);
  61. const dictionaryOptions = reactive({})
  62. const handlerFormData = () => {
  63. const array = props.column;
  64. const parmas = {}
  65. for (let i = 0; i < array.length; i++) {
  66. const element = array[i];
  67. if (element.type === 'date' && formInline[element.prop].length>0) {
  68. parmas[element.keys[0]] = formInline[element.prop][0];
  69. parmas[element.keys[1]] = formInline[element.prop][1];
  70. } else if (formInline[element.prop]) {
  71. if(element.prop === 'businessManagementId'){
  72. console.log('formInline[element.prop]',formInline[element.prop]);
  73. parmas[element.prop] = formInline[element.prop][formInline[element.prop].length-1];
  74. }else{
  75. parmas[element.prop] = formInline[element.prop];
  76. }
  77. }
  78. }
  79. return parmas
  80. }
  81. const handleQuery = () => {
  82. const parmas = handlerFormData();
  83. console.log('parmas',parmas);
  84. emit('submit', parmas)
  85. }
  86. const resetForm = () => {
  87. if (!searchRef.value) return
  88. searchRef.value.resetFields();
  89. const parmas = handlerFormData();
  90. emit('reset', parmas)
  91. }
  92. const handleInit = () => {
  93. try {
  94. const keys = props.column.map(item => {
  95. if (item.type === 'select' && item.dictionary) {
  96. return item.dictionary;
  97. }
  98. }).filter(Boolean);
  99. if(keys && keys.length > 0){
  100. const res = proxy.useDict(keys);
  101. Object.assign(dictionaryOptions, res)
  102. }
  103. } catch (error) {
  104. console.log('error', error);
  105. }
  106. }
  107. onMounted(() => {
  108. handleInit();
  109. })
  110. </script>
  111. <style>
  112. .demo-form-inline .el-input {
  113. --el-input-width: 220px;
  114. }
  115. .demo-form-inline .el-select {
  116. --el-select-width: 220px;
  117. }
  118. </style>