user-search.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <template>
  2. <ArtSearchBar
  3. ref="searchBarRef"
  4. v-model="formData"
  5. :items="formItems"
  6. :selectList="selectList"
  7. :rules="rules"
  8. :showExpand="false"
  9. :isExpand="true"
  10. @reset="handleReset"
  11. @search="handleSearch"
  12. >
  13. </ArtSearchBar>
  14. </template>
  15. <script setup lang="ts">
  16. import { ref, computed, onMounted, h } from 'vue'
  17. interface Props {
  18. modelValue: Record<string, any>
  19. selectList: Api.Common.SelectRelationInfo[],
  20. userList: Api.Common.SelectInfo[]
  21. }
  22. interface Emits {
  23. (e: 'update:modelValue', value: Record<string, any>): void
  24. (e: 'search', params: Record<string, any>): void
  25. (e: 'reset'): void
  26. }
  27. const props = defineProps<Props>()
  28. const emit = defineEmits<Emits>()
  29. // 表单数据双向绑定
  30. const searchBarRef = ref()
  31. const formData = computed({
  32. get: () => props.modelValue,
  33. set: (val) => emit('update:modelValue', val)
  34. })
  35. // 校验规则
  36. const rules = {
  37. // name: [{ required: true, message: '请输入用户名', trigger: 'blur' }]
  38. }
  39. const props1 = {
  40. checkStrictly: true
  41. }
  42. // 表单配置
  43. const formItems = computed(() => [
  44. {
  45. label: '手机号',
  46. key: 'phone',
  47. type: 'input',
  48. placeholder: '请输入手机号',
  49. clearable: true
  50. },
  51. {
  52. label: '学校',
  53. key: 'school',
  54. type: 'cascader',
  55. props: {
  56. options: props.selectList.map(item => ({
  57. value: item.id,
  58. label: item.name,
  59. children: item.children?.map(item => ({
  60. value: item.id,
  61. label: item.name
  62. }))
  63. })),
  64. style: { width: '280px' },
  65. filterable: true,
  66. placeholder: '可搜索',
  67. clearable: true,
  68. props: props1
  69. }
  70. },
  71. {
  72. label: '跟进人',
  73. key: 'user_id',
  74. type: 'select',
  75. filterable: true,
  76. props: {
  77. emptyValues:[0],
  78. valueOnClear:0,
  79. options: props.userList.map((item) => ({
  80. label: item.name,
  81. value: item.id
  82. })),
  83. },
  84. },
  85. {
  86. label: '跟进时间',
  87. span: 8,
  88. key: 'range_date',
  89. type: 'datetimerange',
  90. filterable: true,
  91. props: {
  92. type: 'datetimerange',
  93. valueFormat: 'YYYY-MM-DD HH:mm:ss',
  94. rangeSeparator: '至',
  95. startPlaceholder: '开始日期时间',
  96. endPlaceholder: '结束日期时间'
  97. }
  98. },
  99. ])
  100. // 事件
  101. function handleReset() {
  102. emit('reset')
  103. }
  104. async function handleSearch() {
  105. await searchBarRef.value.validate()
  106. emit('search', formData.value)
  107. }
  108. </script>