index.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <!-- 检索列表页 - 职位检索 -->
  2. <template>
  3. <div class="default-width">
  4. <buttons :current="1" style="position: sticky;"></buttons>
  5. <div class="position-content">
  6. <div class="pb-3 pt-5" style="z-index: 998; background-color: #fff">
  7. <div class="stickyBox mb-5">
  8. <headSearch
  9. v-model="headSearchText"
  10. @handleSearch="val => handleQueryChange('content', val)"
  11. ></headSearch>
  12. </div>
  13. <!-- <cityFilter class="mx-5 mb-3" ref="cityFilterRef" @change="handleQueryChange"></cityFilter> -->
  14. <div class="d-flex justify-space-between mx-5 mb-3">
  15. <conditionFilter ref="conditionFilterRef" showCitySelect :showFilterList="showFilterList" @reset="handleReset" @change="handleQueryChange"></conditionFilter>
  16. </div>
  17. </div>
  18. <div class="mt-3">
  19. <Empty v-if="!items?.length" :message="noParams? '请输入或选择对应的条件查找职位' : '没有相关的职位,请更换搜索条件后再试'"></Empty>
  20. <PositionLongStrip v-else :items="items"></PositionLongStrip>
  21. <CtPagination
  22. v-if="total > 0"
  23. :total="total"
  24. :page="pageInfo.pageNo"
  25. :limit="pageInfo.pageSize"
  26. @handleChange="handleChangePage"
  27. ></CtPagination>
  28. </div>
  29. </div>
  30. </div>
  31. </template>
  32. <script setup>
  33. import buttons from '@/views/recruit/personal/components/buttons.vue'
  34. // import cityFilter from './components/cityFilter'
  35. import conditionFilter from './components/conditionFilter'
  36. import headSearch from '@/components/headSearch'
  37. import PositionLongStrip from '@/components/PositionLongStrip/item.vue'
  38. import Empty from '@/components/Empty'
  39. import { getJobAdvertisedSearch } from '@/api/position'
  40. import CtPagination from '@/components/CtPagination'
  41. import { reactive, ref } from 'vue'
  42. import { dealDictObjData } from '@/utils/position'
  43. import { useRoute, useRouter } from 'vue-router'
  44. defineOptions({name: 'retrieval-position-page'})
  45. const route = useRoute(); const router = useRouter()
  46. // const cityFilterRef = ref()
  47. const conditionFilterRef = ref()
  48. const showFilterList = [
  49. { key: 'positionId', isSingle: true },
  50. { key: 'expType' },
  51. { key: 'payScope' },
  52. { key: 'eduType' },
  53. { key: 'jobType' },
  54. { key: 'scale' },
  55. { key: 'industryIds' },
  56. { key: 'financingStatus' },
  57. ]
  58. const pageInfo = { pageNo: 1, pageSize: 20}
  59. const items = ref([])
  60. const total = ref(0)
  61. let routeQuery = (route?.query && route.query && Object.keys(route?.query).length) ? reactive(route.query) : reactive({})
  62. // routeQuery.date = new Date().getTime()
  63. // router.push({ path: route.path, routeQuery })
  64. // if (routeQuery?.length) router.replace({ path: route.path, routeQuery })
  65. const noParams = ref(true)
  66. const headSearchText = ref(routeQuery?.content || '')
  67. // 职位搜索
  68. const getData = async () => {
  69. let pageReqVO = { ...pageInfo, areaIds: [] }
  70. const routerParams = {}
  71. // route.query参数
  72. if (routeQuery && Object.keys(routeQuery).length) {
  73. const passingStrings = ['content', 'payScope'] // 单选且传递字符串
  74. const passingOneId = ['positionId'] // 单选且传递整型
  75. Object.keys(routeQuery).forEach(key => {
  76. if (routeQuery[key] === '' || key === 'date') return
  77. else if (passingStrings.includes(key)) routerParams[key] = routeQuery[key] // 传给后端字符串
  78. else if (passingOneId.includes(key)) routerParams[key] = +routeQuery[key] // 传给后端单选且传递整型
  79. else routerParams[key] = routeQuery[key].split('_') // 传给后端Arr
  80. })
  81. }
  82. // 没有筛选条件不请求数据
  83. if (!Object.keys(routerParams).length && !headSearchText.value) {
  84. noParams.value = true
  85. items.value = []
  86. total.value = 0
  87. return
  88. }
  89. pageReqVO = { ...pageReqVO, ...routerParams }
  90. noParams.value = false
  91. //
  92. const { list, total: number } = await getJobAdvertisedSearch(pageReqVO)
  93. items.value = list.map(e => {
  94. e.job = { ...e.job, ...dealDictObjData({}, e.job) }
  95. e.enterprise = { ...e.enterprise, ...dealDictObjData({}, e.enterprise) }
  96. return e
  97. })
  98. total.value = number
  99. }
  100. getData()
  101. // // 页面刷新
  102. // if (routeQuery && Object.keys(routeQuery).length) getData()
  103. // 参数改变后刷新路由,触发数据刷新
  104. const updateRouter = () => {
  105. let query = {}
  106. if (Object.keys(routeQuery).length) {
  107. query = Object.keys(routeQuery).reduce((obj, key) => {
  108. if (routeQuery[key] !== '') obj[key] = routeQuery[key]
  109. return obj
  110. }, {})
  111. }
  112. query.date = new Date().getTime() // 用于前端刷新路由参数
  113. router.push({ path: route.path, query })
  114. pageInfo.pageNo = 1
  115. getData()
  116. }
  117. // 参数改变
  118. const handleQueryChange = (key, val) => { // val为字符串,数组的话用_下划线分隔
  119. routeQuery[key] = val
  120. updateRouter()
  121. }
  122. // 清空筛选条件
  123. const handleReset = () => {
  124. // routeQuery = {}
  125. showFilterList.forEach(e => {if (routeQuery[e.key]) delete routeQuery[e.key]})
  126. updateRouter()
  127. }
  128. // 分页
  129. const handleChangePage = (index) => {
  130. pageInfo.pageNo = index
  131. getData()
  132. }
  133. </script>
  134. <style lang="scss" scoped>
  135. .position-content {
  136. height: calc(100vh - 100px);
  137. overflow-y: auto;
  138. }
  139. ::-webkit-scrollbar {
  140. width: 0;
  141. height: 0;
  142. }
  143. </style>