index.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <!-- 检索列表页 - 职位检索 -->
  2. <template>
  3. <div class="default-width">
  4. <div class="py-3" style="z-index: 998; background-color: #fff">
  5. <div class="stickyBox">
  6. <headSearch
  7. v-model="headSearchText"
  8. text="中国"
  9. @handleSearch="val => handleQueryChange('content', val)"
  10. ></headSearch>
  11. </div>
  12. <cityFilter class="mx-5 mb-3" ref="cityFilterRef" @change="handleQueryChange"></cityFilter>
  13. <div v-if="showConditionFilter" class="d-flex justify-space-between mx-5 mb-3">
  14. <conditionFilter ref="conditionFilterRef" @change="handleQueryChange"></conditionFilter>
  15. <span class="clearFilterCriteria" @click="handleClearConditionFilter">{{ $t('common.clearFilterCriteria') }}</span>
  16. </div>
  17. </div>
  18. <div class="d-flex mt-3">
  19. <div class="mr-3" style="min-width: 884px;">
  20. <Empty v-if="!items?.length"></Empty>
  21. <PositionLongStrip v-else :items="items"></PositionLongStrip>
  22. </div>
  23. <rightRecommend></rightRecommend>
  24. </div>
  25. <CtPagination
  26. v-if="total > 0"
  27. :total="total"
  28. :page="pageInfo.pageNo"
  29. :limit="pageInfo.pageSize"
  30. @handleChange="handleChangePage"
  31. ></CtPagination>
  32. </div>
  33. </template>
  34. <script setup>
  35. import rightRecommend from './components/rightRecommend'
  36. import cityFilter from './components/cityFilter'
  37. import conditionFilter from './components/conditionFilter'
  38. import headSearch from '@/components/headSearch'
  39. import PositionLongStrip from '@/components/PositionLongStrip/item.vue'
  40. import Empty from '@/components/Empty'
  41. import { getJobAdvertisedSearch } from '@/api/position'
  42. import CtPagination from '@/components/CtPagination'
  43. import { provide, reactive, ref } from 'vue'
  44. import { dealDictObjData } from '@/views/recruit/personal/position/components/dict'
  45. import { useRoute, useRouter } from 'vue-router'
  46. defineOptions({name: 'retrieval-position-page'})
  47. const route = useRoute(); const router = useRouter()
  48. const cityFilterRef = ref(); const conditionFilterRef = ref()
  49. const showConditionFilter = ref(true)
  50. const pageInfo = { pageNo: 1, pageSize: 20}
  51. const items = ref([])
  52. const total = ref(0)
  53. let routeQuery = (route?.query && route.query && Object.keys(route?.query).length) ? reactive(route.query) : reactive({})
  54. // if (routeQuery && Object.keys(routeQuery).length) {
  55. // if ()
  56. // }
  57. provide('routeQuery', routeQuery)
  58. const headSearchText = ref(routeQuery?.content || '')
  59. // 职位搜索
  60. const getData = async () => {
  61. const pageReqVO = { ...pageInfo }
  62. // route.query参数
  63. if (routeQuery && Object.keys(routeQuery).length) {
  64. const passingStrings = ['content'] // 传递字符串
  65. const passingOneId = ['positionId'] // 单选且传递整型
  66. Object.keys(routeQuery).forEach(key => {
  67. if (routeQuery[key] === '') return
  68. if (key === 'city') { // 工作地区id集合,示例值([])
  69. const city = routeQuery[key]
  70. const areaIds = []
  71. const levelCountArr = city.split('__')
  72. levelCountArr?.forEach(levelIds => {
  73. const idArr = levelIds.split('_')
  74. if (idArr?.length) {
  75. idArr.forEach(idItem => {if (idItem) areaIds.push(idItem)})
  76. }
  77. })
  78. if (areaIds?.length) pageReqVO.areaIds = areaIds
  79. }
  80. else if (passingStrings.includes(key)) pageReqVO[key] = routeQuery[key] // 传给后端字符串
  81. else if (passingOneId.includes(key)) pageReqVO[key] = +routeQuery[key] // 传给后端单选且传递整型
  82. else pageReqVO[key] = routeQuery[key].split('_') // 传给后端Arr
  83. })
  84. }
  85. // console.log('getData参数pageReqVO', pageReqVO)
  86. const { list, total: number } = await getJobAdvertisedSearch(pageReqVO)
  87. items.value = list.map(e => {
  88. e.job = { ...e.job, ...dealDictObjData({}, e.job) }
  89. e.enterprise = { ...e.enterprise, ...dealDictObjData({}, e.enterprise) }
  90. return e
  91. })
  92. total.value = number
  93. }
  94. // 页面刷新
  95. if (routeQuery && Object.keys(routeQuery).length) getData()
  96. // 参数改变后刷新路由,触发数据刷新
  97. const updateRouter = () => {
  98. const str = Object.keys(routeQuery).length ? Object.keys(routeQuery).reduce((res, _key) => {
  99. if (routeQuery[_key] !== '') res += `${res ? '&' : ''}${_key}=${routeQuery[_key]}`
  100. return res
  101. }, '') : ''
  102. router.push(`${route.path}?${str}`)
  103. pageInfo.pageNo = 1
  104. getData()
  105. }
  106. // 参数改变
  107. const handleQueryChange = (key, val) => { // val为字符串,数组的话用_下划线分隔
  108. routeQuery[key] = val
  109. updateRouter()
  110. }
  111. // 清空筛选条件
  112. const handleClearConditionFilter = async () => {
  113. if (conditionFilterRef.value?.ids) {
  114. showConditionFilter.value = false
  115. const ids = conditionFilterRef.value.ids
  116. Object.keys(ids).forEach(key => {
  117. if (routeQuery[key]) delete routeQuery[key]
  118. })
  119. await updateRouter()
  120. showConditionFilter.value = true
  121. }
  122. }
  123. // 分页
  124. const handleChangePage = (index) => {
  125. pageInfo.pageNo = index
  126. getData()
  127. }
  128. </script>
  129. <style lang="scss" scoped>
  130. .clearFilterCriteria {
  131. cursor: pointer;
  132. line-height: 28px;
  133. margin-right: 12px;
  134. font-size: 14px;
  135. color: #999;
  136. &:hover {
  137. color: var(--v-primary-base);
  138. }
  139. }
  140. </style>