index.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <template>
  2. <div class="default-width">
  3. <buttons :current="2" style="position: sticky;" class="mx-4"></buttons>
  4. <div class="company-content">
  5. <div class="white-bgc pb-3 pt-5 mx-4">
  6. <headSearch v-model="content" placeholder="搜索公司关键字" @handleSearch="val => handleSearch(val, 'name')"></headSearch>
  7. <div class="px-5 mt-3 clear-parent">
  8. <!-- <areaType :isClear="clear" @handleClick="handleSearch"></areaType> -->
  9. <cityCascadeSelect @inputChange="inputChange"></cityCascadeSelect>
  10. <scaleType class="mt-5" :isClear="clear" @clear="clear = false" @handleClick="handleSearch"></scaleType>
  11. <div class="clear" @click="handleClear">清空筛选条件</div>
  12. </div>
  13. </div>
  14. <div v-if="items.length" class="mx-4">
  15. <companyItem class="mt-3" :list="items"></companyItem>
  16. <MPagination
  17. :total="total"
  18. :page="pages.pageNo"
  19. :limit="pages.pageSize"
  20. @handleChange="handleChangePage"
  21. ></MPagination>
  22. </div>
  23. <Empty v-else class="mt-3 mx-4" :message="noParams? '请输入或选择对应的条件查找公司' : '没有对应的公司,请更换搜索条件后再试'"></Empty>
  24. </div>
  25. </div>
  26. </template>
  27. <script setup>
  28. defineOptions({name: 'retrieval-company-page'})
  29. import buttons from '@/views/recruit/personal/components/buttons.vue'
  30. import { ref } from 'vue'
  31. import { useRoute, useRouter } from 'vue-router'
  32. import { getEnterpriseSearch } from '@/api/enterprise'
  33. import { dealDictObjData } from '@/utils/position'
  34. import headSearch from '@/components/headSearch'
  35. import scaleType from './components/scaleType'
  36. // import areaType from './components/areaType'
  37. import companyItem from './components/companyItem'
  38. import MPagination from '@/components/CtPagination'
  39. import cityCascadeSelect from '@/views/recruit/personal/position/components/conditionFilter/cityCascadeSelect.vue'
  40. // F:\work\menduner\src\views\recruit\personal\position\components\conditionFilter\cityCascadeSelect.vue
  41. import Snackbar from '@/plugins/snackbar'
  42. const route = useRoute()
  43. const router = useRouter()
  44. const clear = ref(false)
  45. const total = ref(0)
  46. const items = ref([])
  47. const pages = ref({
  48. pageNo: 1,
  49. pageSize: 9
  50. })
  51. const query = ref({})
  52. const dealRouteQuery = (data) => {
  53. data.date = new Date().getTime() // 用于前端刷新路由参数
  54. const arr = Object.keys(data).map(e => {
  55. if (data[e]) {
  56. return Array.isArray(data[e]) ? `${e}=${data[e].join('_')}` : `${e}=${data[e]}`
  57. }
  58. }).filter(Boolean)
  59. if (!arr.length) return router.push(route.path)
  60. const str = arr?.join('&')
  61. if (str) router.push(`${route.path}?${str}`)
  62. }
  63. const content = ref(route?.query?.name ? route.query?.name.includes('&') ? decodeURIComponent(route.query.name) : route.query.name : '')
  64. // 搜索
  65. const handleSearch = async (val, key) => {
  66. if (!val && key !== 'name') return
  67. if (key === 'name' && val === '&') return Snackbar.warning('请输入要查询的公司名称!')
  68. if (key === 'name') content.value = val
  69. if (val?.includes('&')) val = encodeURIComponent(val)
  70. pages.value.pageNo = 1
  71. query.value[key] = val
  72. dealRouteQuery(query.value)
  73. // await getCompanyData()
  74. }
  75. const inputChange = async({ idName: key, values }) => { // areaIds
  76. if (!values?.length) {
  77. values = null
  78. delete query.value[key]
  79. } else {
  80. query.value[key] = values
  81. }
  82. pages.value.pageNo = 1
  83. dealRouteQuery(query.value)
  84. // await getCompanyData()
  85. }
  86. const noParams = ref(true)
  87. const getCompanyData = async () => {
  88. noParams.value = true
  89. if (query.value?.date) delete query.value.date
  90. Object.keys(query.value).forEach(key => {
  91. // 没有筛选条件不请求数据
  92. if (query.value[key]) noParams.value = false
  93. })
  94. if (noParams.value === true) {
  95. items.value = []
  96. total.value = 0
  97. return
  98. }
  99. const params = { ...query.value, ...pages.value }
  100. if (params.name?.includes('&')) params.name = decodeURIComponent(params.name)
  101. const { list, total: number } = await getEnterpriseSearch(params)
  102. if (!list.length) {
  103. items.value = []
  104. total.value = 0
  105. return
  106. }
  107. total.value = number
  108. items.value = list.map(e => {
  109. e.enterprise = dealDictObjData({}, e.enterprise)
  110. if (e.jobList && e.jobList.length) e.job = dealDictObjData({}, e.jobList[0])
  111. return e
  112. })
  113. }
  114. const handleClear = () => {
  115. clear.value = true
  116. if (query.value.name || query.value.areaIds?.length) {
  117. dealRouteQuery({
  118. ...(query.value.name && { name: query.value.name }),
  119. ...(query.value.areaIds?.length && { areaIds: query.value.areaIds })
  120. })
  121. // getCompanyData()
  122. } else {
  123. router.push(route.path)
  124. items.value = []
  125. total.value = 0
  126. }
  127. }
  128. // 刷新页面时url中带有参数请求检索接口
  129. if (Object.keys(route.query).length) {
  130. const objData = {}
  131. Object.keys(route.query).map(e => {
  132. if (e === 'areaIds') return objData[e] = route.query[e].split('_')
  133. if (e === 'name') return objData[e] = route.query[e].includes('&') ? encodeURIComponent(route.query[e]) : route.query[e]
  134. else objData[e] = route.query[e]
  135. })
  136. if (Object.keys(objData).length) {
  137. pages.value.pageNo = 1
  138. query.value = Object.assign(query.value, objData)
  139. getCompanyData()
  140. }
  141. } else getCompanyData()
  142. // 分页
  143. const handleChangePage = (index) => {
  144. pages.value.pageNo = index
  145. getCompanyData()
  146. }
  147. </script>
  148. <style lang="scss" scoped>
  149. .clear-parent {
  150. position: relative
  151. }
  152. .clear {
  153. position: absolute;
  154. bottom: 0;
  155. right: 30px;
  156. color: var(--v-primary-base);
  157. font-size: 14px;
  158. cursor: pointer;
  159. }
  160. .company-content {
  161. height: calc(100vh - 100px);
  162. overflow-y: auto;
  163. }
  164. ::-webkit-scrollbar {
  165. width: 0;
  166. height: 0;
  167. }
  168. </style>