left.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <template>
  2. <div>
  3. <div class="left-top">
  4. <v-badge
  5. bordered
  6. offset-x="10"
  7. offset-y="50"
  8. :color="baseInfo?.sex ? (baseInfo?.sex === '1' ? '#1867c0' : 'error') : 'error'"
  9. :icon="baseInfo?.sex ? (baseInfo?.sex === '1' ? 'mdi-gender-male' : 'mdi-gender-female') : 'mdi-gender-female'">
  10. <v-avatar size="x-large" :image="getUserAvatar(baseInfo?.avatar, baseInfo?.sex)"></v-avatar>
  11. </v-badge>
  12. <div class="ml-5 content">
  13. <div class="username">
  14. <span class="mr-2">{{ baseInfo?.name || userInfo.phone }}</span>
  15. </div>
  16. <div class="userInfo">
  17. {{ baseInfo?.expTypeText || $t('common.currentlyUnavailable') }}<span class="septal-line"></span>{{ baseInfo?.eduTypeText || $t('common.currentlyUnavailable') }}
  18. </div>
  19. <div class="mt-3">
  20. <v-select
  21. v-model="selectVal"
  22. :items="items"
  23. density="compact"
  24. variant="outlined"
  25. item-title="label"
  26. item-value="value"
  27. hide-details
  28. color="primary"
  29. @update:model-value="handleChangeJobStatus"
  30. ></v-select>
  31. </div>
  32. </div>
  33. <div class="otherInfo">
  34. <div>
  35. <span>{{ $t('resume.phoneNumber') }}:{{ baseInfo?.phone || $t('common.currentlyUnavailable') }}</span>
  36. </div>
  37. <div class="my-3">
  38. <span>{{ $t('resume.userEmail') }}:{{ baseInfo?.email || $t('common.currentlyUnavailable') }}</span>
  39. </div>
  40. <div>
  41. <span>{{ $t('resume.dateOfBirth') }}:{{ baseInfo?.birthdayText || $t('common.currentlyUnavailable') }}</span>
  42. </div>
  43. <div class="mt-3">{{ $t('resume.currentAddress') }}: {{ baseInfo?.areaName || $t('common.currentlyUnavailable') }}</div>
  44. </div>
  45. <div class="slider-btn">
  46. <v-btn class="slider-btn-item" rounded variant="outlined" color="primary" append-icon="mdi-menu-right" to="/recruit/personal/resume">{{ $t('resume.onlineResume') }}</v-btn>
  47. </div>
  48. </div>
  49. <div class="left-tabs mt-3">
  50. <v-tabs v-model="tab" align-tabs="start" color="primary" bg-color="#fff">
  51. <v-tab v-for="(val, i) in list" :key="i" :value="i">{{ val.title }}</v-tab>
  52. </v-tabs>
  53. </div>
  54. <div :class="['left-bottom', {'mt-3': list[tab].path !== interview && list[tab].path !== interested}]">
  55. <component :is="list[tab].path"></component>
  56. </div>
  57. </div>
  58. </template>
  59. <script setup>
  60. defineOptions({ name: 'personal-center-left'})
  61. import { getDict } from '@/hooks/web/useDictionaries'
  62. import { ref, watch } from 'vue'
  63. import { useUserStore } from '@/store/user'
  64. import { updateJobStatus } from '@/api/recruit/personal/resume'
  65. import { useI18n } from '@/hooks/web/useI18n'
  66. import Snackbar from '@/plugins/snackbar'
  67. // import communication from '../components/communication.vue'
  68. import delivery from '../components/delivery.vue'
  69. import interview from '../components/interview/index.vue'
  70. import interested from '../components/interested.vue'
  71. import seenMe from '../components/seenMe.vue'
  72. import { getUserAvatar } from '@/utils/avatar'
  73. const { t } = useI18n()
  74. const list = [
  75. // { title: t('position.throughCommunication'), path: communication },
  76. { title: t('position.delivered'), path: delivery },
  77. { title: t('position.interview'), path: interview },
  78. { title: t('position.interested'), path: interested },
  79. { title: t('position.haveSeenMe'), path: seenMe }
  80. ]
  81. const tab = ref(0)
  82. import { useRoute } from 'vue-router'; const route = useRoute()
  83. import { useRouter } from 'vue-router'; const router = useRouter()
  84. watch(() => route.query, (newQuery) => { // newQuery, oldQuery
  85. if (newQuery?.showInterviewScheduleMore) { // 去掉面试日程参数
  86. tab.value = 2
  87. const query = { ...route.query }
  88. delete query.showInterviewScheduleMore
  89. const path = route.path
  90. router.replace({ path, query })
  91. }
  92. }, { deep: true, immediate: true })
  93. const selectVal = ref('0')
  94. const items = ref([])
  95. const userStore = useUserStore()
  96. // 求职类型字典
  97. getDict('menduner_job_status').then(({ data }) => {
  98. data = data?.length && data || []
  99. items.value = data
  100. })
  101. let baseInfo = ref({})
  102. let userInfo = ref({})
  103. const getBasicInfo = () => {
  104. baseInfo.value = JSON.parse(localStorage.getItem('baseInfo')) // 人才信息
  105. userInfo.value = JSON.parse(localStorage.getItem('userInfo')) // 人才信息
  106. selectVal.value = baseInfo?.value?.jobStatus || '0'
  107. }
  108. getBasicInfo()
  109. // 求职类型更换
  110. const handleChangeJobStatus = async () => {
  111. await updateJobStatus(selectVal.value)
  112. Snackbar.success('更新成功')
  113. await userStore.getUserBaseInfos(baseInfo.value.userId)
  114. getBasicInfo()
  115. }
  116. </script>
  117. <style scoped lang="scss">
  118. .left-top {
  119. display: flex;
  120. align-items: center;
  121. padding: 12px 0 12px 12px;
  122. height: 144px;
  123. border-radius: 12px;
  124. background-color: #fff;
  125. .content {
  126. height: 100%;
  127. .username {
  128. font-weight: 500;
  129. font-size: 20px;
  130. color: var(--color-222);
  131. height: 24px;
  132. line-height: 24px;
  133. }
  134. .userInfo {
  135. height: 21px;
  136. margin-top: 8px;
  137. color: var(--color-666);
  138. font-size: 14px;
  139. }
  140. }
  141. .otherInfo {
  142. flex: 1;
  143. height: 100%;
  144. margin-left: 50px;
  145. font-size: 14px;
  146. font-weight: 500;
  147. color: var(--color-333);
  148. text-align: left;
  149. .salary {
  150. font-size: 16px;
  151. font-family: 'kanzhun-Regular';
  152. font-weight: 500;
  153. color: var(--v-error-base);
  154. margin: -1px 0 0 16px;
  155. }
  156. .edu-time {
  157. color: var(--color-999);
  158. font-weight: 400;
  159. margin-left: 20px;
  160. }
  161. .edu {
  162. margin: 12px 0;
  163. }
  164. }
  165. .slider-btn {
  166. position: relative;
  167. min-width: 188px;
  168. height: 100%;
  169. overflow: hidden;
  170. .slider-btn-item {
  171. position: absolute;
  172. top: 4px;
  173. right: -15px;
  174. }
  175. }
  176. }
  177. </style>