screen.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <template>
  2. <div class="d-flex align-center justify-space-between">
  3. <div class="d-flex align-center">
  4. <CommonStyle v-for="(val, i) in list" :key="i" :btnTitle="val.title">
  5. <v-list>
  6. <v-list-item
  7. v-for="(item, index) in val.items"
  8. :key="index"
  9. :active="val.selected.includes(item.value)"
  10. color="primary"
  11. :value="item.value"
  12. @click="handleClick(item, val)"
  13. >
  14. <v-list-item-title>{{ item.label }}</v-list-item-title>
  15. </v-list-item>
  16. </v-list>
  17. </CommonStyle>
  18. <div class="mr-5 d-flex align-center" v-if="props.tab === 0">
  19. <v-radio-group v-model="bounty" inline style="height: 28px;" @update:modelValue="handleChangeBounty">
  20. <v-radio v-model="bounty" label="普通职位" :value="false" color="primary" hide-details density="compact" class="mr-3"></v-radio>
  21. <v-radio v-model="bounty" label="赏金职位" :value="true" color="primary" hide-details density="compact"></v-radio>
  22. </v-radio-group>
  23. <v-radio-group class="ml-5" v-model="selected" inline style="height: 28px;" @update:modelValue="handleChangeSelected">
  24. <v-radio v-model="selected" label="新投递" value="0" color="primary" hide-details density="compact" class="mr-3"></v-radio>
  25. <v-radio v-model="selected" label="已查看" value="1" color="primary" hide-details density="compact"></v-radio>
  26. </v-radio-group>
  27. </div>
  28. </div>
  29. <div class="reset-text cursor-pointer ml-3" @click="handleReset">重置</div>
  30. </div>
  31. </template>
  32. <script setup>
  33. defineOptions({ name: 'screen-page'})
  34. import { ref, watch } from 'vue'
  35. import { getJobAdvertised } from '@/api/enterprise'
  36. import { getDict } from '@/hooks/web/useDictionaries'
  37. import { dealDictArrayData } from '@/utils/position'
  38. import CommonStyle from './commonStyle.vue'
  39. const emit = defineEmits(['search', 'reset', 'select', 'change'])
  40. const props = defineProps({
  41. tab: Number,
  42. jobId: String,
  43. hire: String
  44. })
  45. const selected = ref()
  46. const bounty = ref(null)
  47. const list = ref([
  48. {
  49. title: '应聘岗位',
  50. defaultTitle: '应聘岗位',
  51. key: 'jobId',
  52. selected: [],
  53. items: []
  54. },
  55. {
  56. title: '学历',
  57. defaultTitle: '学历',
  58. key: 'eduType',
  59. dictTypeName: 'menduner_education_type',
  60. selected: [],
  61. items: []
  62. },
  63. {
  64. title: '工作经验',
  65. defaultTitle: '工作经验',
  66. key: 'expType',
  67. dictTypeName: 'menduner_exp_type',
  68. selected: [],
  69. items: []
  70. },
  71. {
  72. title: '求职状态',
  73. defaultTitle: '求职状态',
  74. key: 'jobStatus',
  75. dictTypeName: 'menduner_job_seek_status',
  76. selected: [],
  77. items: []
  78. }
  79. ])
  80. const getJobList = async (k) => {
  81. const data = await getJobAdvertised()
  82. if (!data.length) return
  83. const list = dealDictArrayData([], data)
  84. k.items = list.map(e => {
  85. const salary = e.payFrom && e.payTo ? `${e.payFrom}-${e.payTo}${e.payName ? '/' + e.payName : ''}` : '面议'
  86. return { label: `${e.name}${e.areaName ? '_' + e.areaName : ''} ${salary}`, value: e.id }
  87. })
  88. return k.items
  89. }
  90. // 获取字典数据
  91. list.value.forEach(k => {
  92. if (k.dictTypeName) {
  93. getDict(k.dictTypeName).then(({ data }) => {
  94. data = data?.length && data || []
  95. k.items = data
  96. })
  97. } else getJobList(k)
  98. })
  99. // 单击
  100. const handleClick = (item, val) => {
  101. const obj = val.selected.includes(item.value)
  102. val.selected = obj ? val.selected.filter(i => i !== item.value) : [item.value]
  103. val.title = obj ? val.defaultTitle : item.label
  104. emit('search', { key: val.key, value: obj ? '' : item.value })
  105. }
  106. if (props.jobId) {
  107. const job = list.value.find(e => e.key === 'jobId')
  108. getJobList(job).then(data => {
  109. const id = data.find(e => e.value === props.jobId)
  110. handleClick(id, job)
  111. })
  112. if (props.hire) {
  113. bounty.value = props.hire === '1' ? true : false
  114. }
  115. }
  116. // 重置
  117. const handleReset = () => {
  118. list.value.map(e => {
  119. e.selected = []
  120. e.title = e.defaultTitle
  121. return e
  122. })
  123. selected.value = ''
  124. bounty.value = null
  125. emit('reset')
  126. }
  127. // 新投递&已查看选择
  128. const handleChangeSelected = (e) => {
  129. emit('select', e)
  130. }
  131. // 赏金职位
  132. const handleChangeBounty = (e) => {
  133. emit('change', e)
  134. }
  135. watch(
  136. () => props.tab,
  137. () => {
  138. handleReset()
  139. }
  140. )
  141. </script>
  142. <style scoped lang="scss">
  143. .reset-text {
  144. font-size: 14px;
  145. color: var(--color-666);
  146. &:hover {
  147. color: var(--v-primary-base);
  148. }
  149. }
  150. </style>