index.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <!-- 检索列表页 - 职位检索 -->
  2. <template>
  3. <div class="default-width">
  4. <div style="width: 100%; height: 20px;"></div>
  5. <v-card style="z-index: 998">
  6. <div class="stickyBox my-3">
  7. <headSearch
  8. @handleJobClick="val => dealParams(val, 'positionId')"
  9. @handleSearch="val => dealParams(val, 'content')"
  10. ></headSearch>
  11. </div>
  12. <cityFilter class="mx-5 mb-3" ref="cityFilterRef" @updateCheckedInput="updateRouteQuery('cityFilterRef')"></cityFilter>
  13. <conditionFilter class="mx-5 mb-3" ref="conditionFilterRef" @conditionFilterChange="updateRouteQuery('conditionFilterRef')"></conditionFilter>
  14. </v-card>
  15. <div class="d-flex mt-3">
  16. <div class="mr-3" style="min-width: 884px;">
  17. <Empty v-if="!items?.length"></Empty>
  18. <PositionLongStrip v-else :items="items"></PositionLongStrip>
  19. </div>
  20. <rightRecommend></rightRecommend>
  21. </div>
  22. <CtPagination
  23. v-if="total > 0"
  24. :total="total"
  25. :page="pageInfo.pageNo"
  26. :limit="pageInfo.pageSize"
  27. @handleChange="handleChangePage"
  28. ></CtPagination>
  29. </div>
  30. </template>
  31. <script setup>
  32. import rightRecommend from './components/rightRecommend'
  33. import cityFilter from './components/cityFilter'
  34. import conditionFilter from './components/conditionFilter'
  35. import headSearch from '@/components/headSearch'
  36. import PositionLongStrip from '@/components/PositionLongStrip/item.vue'
  37. import Empty from '@/components/Empty'
  38. import { getJobAdvertisedSearch } from '@/api/position'
  39. import CtPagination from '@/components/CtPagination'
  40. import { provide, reactive, ref } from 'vue'
  41. import { dealDictData } from '@/views/recruit/position/components/dict'
  42. import { useRoute, useRouter } from 'vue-router'
  43. defineOptions({name: 'retrieval-position-page'})
  44. const route = useRoute(); const router = useRouter()
  45. const cityFilterRef = ref(); const conditionFilterRef = ref()
  46. const pageInfo = { pageNo: 1, pageSize: 20}
  47. const items = ref([])
  48. const total = ref(0)
  49. const routeQuery = (route?.query && route.query && Object.keys(route?.query).length) ? route.query : null
  50. provide('routeQuery', routeQuery)
  51. let pageReqVO = reactive({
  52. ...pageInfo
  53. })
  54. // 职位搜索
  55. const getPositionList = async () => {
  56. const { list, total: number } = await getJobAdvertisedSearch(pageReqVO)
  57. items.value = list.map(e => {
  58. e.job = { ...e.job, ...dealDictData({}, e.job) }
  59. e.enterprise = { ...e.enterprise, ...dealDictData({}, e.enterprise) }
  60. return e
  61. })
  62. total.value = number
  63. }
  64. const removeEmptyStringsAndReturnNew = (obj) => {
  65. const result = {}
  66. Object.keys(obj).forEach(function(key) {
  67. if (obj[key]) {
  68. result[key] = obj[key]
  69. }
  70. })
  71. return result
  72. }
  73. const updateRouteQuery = (ref, val, key) => {
  74. ref
  75. const queryObj = { cityFilter: {}, conditionFilter: {} }
  76. if (cityFilterRef.value?.getQuery) {
  77. queryObj.cityFilter = removeEmptyStringsAndReturnNew(cityFilterRef.value?.getQuery())
  78. }
  79. if (conditionFilterRef.value?.getQuery) {
  80. const objData = conditionFilterRef.value?.getQuery()
  81. if (val && key) objData[key] = val
  82. queryObj.conditionFilter = removeEmptyStringsAndReturnNew(objData)
  83. }
  84. let queryArr = []
  85. if (queryObj) {
  86. Object.keys(queryObj)?.forEach(_k => {
  87. const newObj = queryObj[_k]
  88. if (newObj) {
  89. const arr = Object.keys(newObj).map(itemKey => {
  90. return `${itemKey}=${newObj[itemKey]}`
  91. })
  92. if (arr?.length) queryArr = [ ...queryArr, ...arr]
  93. }
  94. })
  95. }
  96. const str = queryArr?.join('&')
  97. if (str) router.push(`${route.path}?${str}`)
  98. handleSearchPosition(val, key)
  99. }
  100. // 职位搜索
  101. const handleSearchPosition = () => {
  102. const conditionParams = conditionFilterRef.value?.params
  103. const cityParams = cityFilterRef.value?.getQuery
  104. pageReqVO = { ...pageReqVO, ...conditionParams, ...cityParams, content: pageReqVO.content }
  105. getPositionList()
  106. }
  107. // 职位类型、关键字
  108. const dealParams = (val, key) => {
  109. pageReqVO[key] = val
  110. updateRouteQuery('cityFilterRef')
  111. updateRouteQuery('conditionFilterRef', val, key)
  112. }
  113. // 刷新后有参数则进行搜索
  114. if (routeQuery) {
  115. for (let i in routeQuery) {
  116. if (routeQuery[i].indexOf('_') !== -1) pageReqVO[i] = routeQuery[i].split('_')
  117. else pageReqVO[i] = routeQuery[i]
  118. }
  119. if (routeQuery.content) updateRouteQuery('conditionFilterRef', routeQuery.content, 'content')
  120. getPositionList()
  121. } else getPositionList()
  122. // 分页
  123. const handleChangePage = (index) => {
  124. pageInfo.pageNo = index
  125. getPositionList()
  126. }
  127. </script>