index.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <!-- 检索列表页 - 职位检索 -->
  2. <template>
  3. <div class="default-width">
  4. <buttons :current="1" style="position: sticky;" class="mx-4"></buttons>
  5. <div class="position-content">
  6. <div class="pb-3 pt-5 mx-4" 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">
  15. <conditionFilter ref="conditionFilterRef" showCitySelect :showFilterList="showFilterList" @reset="handleReset" @change="handleQueryChange"></conditionFilter>
  16. </div>
  17. </div>
  18. <div class="mt-3 mx-4">
  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 class="text-center color-primary mt-5" v-if="noParams && items.length">输入筛选条件查看更多优选职位</div> -->
  29. </div>
  30. </div>
  31. </div>
  32. </template>
  33. <script setup>
  34. import buttons from '@/views/recruit/personal/components/buttons.vue'
  35. // import cityFilter from './components/cityFilter'
  36. import conditionFilter from './components/conditionFilter'
  37. import headSearch from '@/components/headSearch'
  38. import PositionLongStrip from '@/components/PositionLongStrip/item.vue'
  39. import Empty from '@/components/Empty'
  40. import { getJobAdvertisedSearch } from '@/api/position'
  41. import CtPagination from '@/components/CtPagination'
  42. import { reactive, ref } from 'vue'
  43. import { dealDictObjData } from '@/utils/position'
  44. import { useRoute, useRouter } from 'vue-router'
  45. defineOptions({name: 'retrieval-position-page'})
  46. const route = useRoute(); const router = useRouter()
  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. ]
  57. const pageInfo = { pageNo: 1, pageSize: 20 }
  58. const items = ref([])
  59. const total = ref(0)
  60. let routeQuery = (route?.query && route.query && Object.keys(route?.query).length) ? reactive(route.query) : reactive({})
  61. const noParams = ref(true)
  62. const headSearchText = ref(routeQuery?.content ? routeQuery?.content.includes('&') ? decodeURIComponent(routeQuery.content) : routeQuery.content : '')
  63. const getDataFun = async (params) => {
  64. const { list, total: number } = await getJobAdvertisedSearch(params)
  65. items.value = list.map(e => {
  66. e.job = { ...e.job, ...dealDictObjData({}, e.job) }
  67. e.enterprise = { ...e.enterprise, ...dealDictObjData({}, e.enterprise) }
  68. return e
  69. })
  70. total.value = number
  71. }
  72. // 职位搜索
  73. const getData = async () => {
  74. let pageReqVO = { ...pageInfo, areaIds: [] }
  75. const routerParams = {}
  76. // route.query参数
  77. if (routeQuery && Object.keys(routeQuery).length) {
  78. const passingStrings = ['content', 'payScope'] // 单选且传递字符串
  79. const passingOneId = ['positionId'] // 单选且传递整型
  80. Object.keys(routeQuery).forEach(key => {
  81. if (routeQuery[key] === '' || key === 'date') return
  82. else if (passingStrings.includes(key)) { // 传给后端字符串
  83. if (key === 'content') routerParams[key] = decodeURIComponent(routeQuery[key])
  84. else routerParams[key] = routeQuery[key]
  85. }
  86. else if (passingOneId.includes(key)) routerParams[key] = +routeQuery[key] // 传给后端单选且传递整型
  87. else routerParams[key] = routeQuery[key].split('_').filter(e => e !== '9999') // 传给后端Arr
  88. })
  89. }
  90. // 没有筛选条件不请求数据
  91. if (!Object.keys(routerParams).length && !headSearchText.value) {
  92. noParams.value = true
  93. items.value = []
  94. total.value = 0
  95. // getDataFun(pageInfo) // 没有筛选条件则展示最新职位列表
  96. return
  97. }
  98. pageReqVO = { ...pageReqVO, ...routerParams }
  99. noParams.value = false
  100. getDataFun(pageReqVO)
  101. }
  102. getData()
  103. // // 页面刷新
  104. // if (routeQuery && Object.keys(routeQuery).length) getData()
  105. // 参数改变后刷新路由,触发数据刷新
  106. const updateRouter = () => {
  107. let query = {}
  108. if (Object.keys(routeQuery).length) {
  109. query = Object.keys(routeQuery).reduce((obj, key) => {
  110. if (routeQuery[key] !== '') obj[key] = routeQuery[key]
  111. return obj
  112. }, {})
  113. }
  114. query.date = new Date().getTime() // 用于前端刷新路由参数
  115. if (query?.content && query.content.includes('%')) query.content = decodeURIComponent(query.content)
  116. router.push({ path: route.path, query })
  117. pageInfo.pageNo = 1
  118. // getData()
  119. }
  120. // 参数改变
  121. const handleQueryChange = (key, val) => {
  122. // val为字符串,数组的话用_下划线分隔
  123. routeQuery[key] = val
  124. if (!routeQuery[key]) delete routeQuery[key]
  125. updateRouter()
  126. }
  127. // 清空筛选条件
  128. const handleReset = () => {
  129. headSearchText.value = ''
  130. if (routeQuery.areaIds) delete routeQuery.areaIds
  131. if (routeQuery.content) delete routeQuery.content
  132. showFilterList.forEach(e => {if (routeQuery[e.key]) delete routeQuery[e.key]})
  133. updateRouter()
  134. }
  135. // 分页
  136. const handleChangePage = (index) => {
  137. pageInfo.pageNo = index
  138. getData()
  139. }
  140. </script>
  141. <style lang="scss" scoped>
  142. .position-content {
  143. height: calc(100vh - 100px);
  144. overflow-y: auto;
  145. }
  146. ::-webkit-scrollbar {
  147. width: 0;
  148. height: 0;
  149. }
  150. </style>