selfEvaluation.vue 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <template>
  2. <div class="resume-box elevation-2 mb-3" id="selfEvaluation">
  3. <div class="resume-header">
  4. <div class="resume-title">{{ $t('resume.personalAdvantages') }}</div>
  5. <v-btn v-if="!isEdit" variant="text" color="primary" prepend-icon="mdi-square-edit-outline" @click="isEdit = true">{{ advantage ? $t('common.edit') : $t('common.add') }}</v-btn>
  6. </div>
  7. <div v-if="isEdit" class="mt-3 edit">
  8. <v-textarea
  9. v-model="advantage"
  10. :label="$t('resume.dataDefaultPrompt') + $t('resume.personalAdvantages') + '...'"
  11. variant="outlined"
  12. counter="300"
  13. color="primary"
  14. validate-on="input"
  15. :rules="advantageRules"
  16. ></v-textarea>
  17. <div class="text-end">
  18. <v-btn class="half-button mr-3" variant="tonal" @click="isEdit = false; getData()">{{ $t('common.cancel') }}</v-btn>
  19. <v-btn color="primary" class="half-button" @click="handleSave">{{ $t('common.save') }}</v-btn>
  20. </div>
  21. </div>
  22. <div v-else class="content-list mt-3">
  23. <div v-if="advantage" class="resumeNoDataText" v-html="advantage"></div>
  24. <div v-else class="resumeNoDataText">{{ $t('resume.dataDefaultPrompt') }}{{ $t('resume.personalAdvantages') }}...</div>
  25. </div>
  26. </div>
  27. </template>
  28. <script setup>
  29. defineOptions({ name: 'selfEvaluation'})
  30. import { ref } from 'vue'
  31. import { saveResumeAdvantage } from '@/api/recruit/personal/resume'
  32. import Snackbar from '@/plugins/snackbar'
  33. import { useUserStore } from '@/store/user'
  34. import DOMPurify from 'dompurify'
  35. const emit = defineEmits(['complete'])
  36. const isEdit = ref(false)
  37. const advantage = ref('')
  38. const useStore = useUserStore()
  39. // 获取个人优势
  40. const getData = async () => {
  41. await useStore.getUserBaseInfos(JSON.parse(localStorage.getItem('userInfo'))?.id)
  42. const baseInfo = JSON.parse(localStorage.getItem('baseInfo'))
  43. advantage.value = baseInfo?.advantage || ''
  44. // 完成度展示
  45. emit('complete', { status: Boolean(advantage.value), id: 'selfEvaluation' })
  46. }
  47. getData()
  48. const advantageRules = ref([
  49. value => {
  50. if (value) return true
  51. return '请输入您的个人优势'
  52. },
  53. value => {
  54. if (value?.length <= 300) return true
  55. return '请输入2-300个字符'
  56. }
  57. ])
  58. // 编辑
  59. const handleSave = async () => {
  60. advantage.value = DOMPurify.sanitize(advantage.value)
  61. if (!advantage.value) return Snackbar.warning('请先输入个人优势!')
  62. await saveResumeAdvantage({ content: advantage.value })
  63. isEdit.value = false
  64. Snackbar.success('编辑成功')
  65. await getData()
  66. }
  67. </script>
  68. <style scoped lang="scss">
  69. .content-list {
  70. white-space: pre-line;
  71. }
  72. .edit {
  73. background-color: var(--color-f8);
  74. padding: 15px 10px 8px;
  75. border-radius: 6px;
  76. }
  77. </style>