screen.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. })
  43. const selected = ref()
  44. const bounty = ref(null)
  45. const list = ref([
  46. {
  47. title: '应聘岗位',
  48. defaultTitle: '应聘岗位',
  49. key: 'jobId',
  50. selected: [],
  51. api: getJobAdvertised,
  52. items: []
  53. },
  54. {
  55. title: '学历',
  56. defaultTitle: '学历',
  57. key: 'eduType',
  58. dictTypeName: 'menduner_education_type',
  59. selected: [],
  60. items: []
  61. },
  62. {
  63. title: '工作经验',
  64. defaultTitle: '工作经验',
  65. key: 'expType',
  66. dictTypeName: 'menduner_exp_type',
  67. selected: [],
  68. items: []
  69. },
  70. {
  71. title: '求职状态',
  72. defaultTitle: '求职状态',
  73. key: 'jobStatus',
  74. dictTypeName: 'menduner_job_status',
  75. selected: [],
  76. items: []
  77. }
  78. ])
  79. // 获取字典数据
  80. list.value.forEach(k => {
  81. if (k.dictTypeName) {
  82. getDict(k.dictTypeName).then(({ data }) => {
  83. data = data?.length && data || []
  84. k.items = data
  85. })
  86. }
  87. if (k.api) {
  88. k.api({}).then(data => {
  89. if (data.length) {
  90. const list = dealDictArrayData([], data)
  91. k.items = list.map(e => {
  92. return { label: `${e.name}${e.areaName ? '_' + e.areaName : ''} ${e.payFrom ? e.payFrom + '-' : ''}${e.payTo}${e.payName ? '/' + e.payName : ''}`, value: e.id }
  93. })
  94. }
  95. })
  96. }
  97. })
  98. // 单击
  99. const handleClick = (item, val) => {
  100. const obj = val.selected.includes(item.value)
  101. val.selected = obj ? val.selected.filter(i => i !== item.value) : [item.value]
  102. val.title = obj ? val.defaultTitle : item.label
  103. emit('search', { key: val.key, value: obj ? '' : item.value })
  104. }
  105. // 重置
  106. const handleReset = () => {
  107. list.value.map(e => {
  108. e.selected = []
  109. e.title = e.defaultTitle
  110. return e
  111. })
  112. selected.value = ''
  113. bounty.value = null
  114. emit('reset')
  115. }
  116. // 新投递&已查看选择
  117. const handleChangeSelected = (e) => {
  118. emit('select', e)
  119. }
  120. // 赏金职位
  121. const handleChangeBounty = (e) => {
  122. emit('change', e)
  123. }
  124. watch(
  125. () => props.tab,
  126. () => {
  127. handleReset()
  128. }
  129. )
  130. </script>
  131. <style scoped lang="scss">
  132. .reset-text {
  133. font-size: 14px;
  134. color: var(--color-666);
  135. &:hover {
  136. color: var(--v-primary-base);
  137. }
  138. }
  139. </style>