|
@@ -7,55 +7,75 @@
|
|
|
<div class="d-flex align-center">
|
|
|
<!-- 头像 -->
|
|
|
<div class="avatarsBox" @mouseover="showIcon = true" @mouseleave="showIcon = false">
|
|
|
- <v-img class="img" cover src="https://cdn.vuetifyjs.com/images/john.jpg"></v-img>
|
|
|
+ <v-img class="img" cover :src="baseInfo.avatar"></v-img>
|
|
|
<div v-show="showIcon" class="mdi mdi-camera-outline"></div>
|
|
|
</div>
|
|
|
<!-- 基础信息 -->
|
|
|
<div style="flex: 1;" class="mr-8 mt-5">
|
|
|
<!-- 编辑 -->
|
|
|
<div v-if="isEdit">
|
|
|
- <CtForm :items="formList" style="width: 100%;">
|
|
|
- <template v-slot:phoneNum>
|
|
|
+ <CtForm ref="CtFormRef" :items="formList" style="width: 100%;">
|
|
|
+ <template v-slot:phone>
|
|
|
<v-btn variant="text" class="ml-2" color="primary">更改</v-btn>
|
|
|
</template>
|
|
|
</CtForm>
|
|
|
+ <div class="text-end">
|
|
|
+ <v-btn class="half-button mr-3" variant="tonal" @click="isEdit = false">{{ $t('common.cancel') }}</v-btn>
|
|
|
+ <v-btn color="primary" class="half-button" @click="handleSave">{{ $t('common.save') }}</v-btn>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<!-- 展示 -->
|
|
|
<div v-else>
|
|
|
- <span style="font-size: 20px; font-weight: 500;">{{ info.name }}</span>
|
|
|
+ <span style="font-size: 20px; font-weight: 500;">{{ baseInfo.name }}</span>
|
|
|
<span style="font-size: 22px;" class="ml-1">
|
|
|
- <span v-if="info.sex" class="mdi mdi-gender-male" style="color: blue"></span>
|
|
|
+ <span v-if="baseInfo.sex" class="mdi mdi-gender-male" style="color: blue"></span>
|
|
|
<span v-else class="mdi mdi-gender-female" style="color: red"></span>
|
|
|
</span>
|
|
|
<div class="mt-3 d-flex">
|
|
|
<div class="listBox" :style="{ height: isExpand ? 'auto' : '68px' }">
|
|
|
- <div>
|
|
|
+ <!-- <div>
|
|
|
<span class="mdi mdi-account-outline"></span>
|
|
|
- <span>{{ info.name }}</span>
|
|
|
- </div>
|
|
|
+ <span>{{ baseInfo.name }}</span>
|
|
|
+ </div> -->
|
|
|
<div>
|
|
|
<span class="mdi mdi-map-marker-outline"></span>
|
|
|
- <span>{{ info.city }}</span>
|
|
|
+ <span>{{ baseInfo.areaText }}</span>
|
|
|
</div>
|
|
|
<div>
|
|
|
<span class="mdi mdi-phone-outline"></span>
|
|
|
- <span>{{ info.phoneNum }}</span>
|
|
|
+ <span>{{ baseInfo.phone }}</span>
|
|
|
</div>
|
|
|
<div>
|
|
|
<span class="mdi mdi-email-outline"></span>
|
|
|
- <span>{{ info.email }}</span>
|
|
|
+ <span>{{ baseInfo.email }}</span>
|
|
|
</div>
|
|
|
<div>
|
|
|
<span class="mdi mdi-calendar-blank-outline"></span>
|
|
|
- <span>{{ info.workExperience }}</span>
|
|
|
+ <span>{{ baseInfo.expTypeText }}</span>
|
|
|
</div>
|
|
|
<div>
|
|
|
<span class="mdi mdi-school-outline"></span>
|
|
|
- <span>{{ info.edu }}</span>
|
|
|
+ <span>{{ baseInfo.eduTypeText }}</span>
|
|
|
</div>
|
|
|
+ <!-- <div>
|
|
|
+ <span class="mdi mdi-briefcase-outline"></span>
|
|
|
+ <span>{{ baseInfo.jobTypeText }}</span>
|
|
|
+ </div> -->
|
|
|
<div>
|
|
|
- <span class="mdi mdi-school-outline"></span>
|
|
|
- <span>测试收起、展开</span>
|
|
|
+ <span class="mdi mdi-tag-outline"></span>
|
|
|
+ <span>{{ baseInfo.jobStatusText }}</span>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <span class="mdi mdi-cake-variant-outline"></span>
|
|
|
+ <span>{{ baseInfo.birthdayText }}</span>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <span class="mdi mdi-account-heart"></span>
|
|
|
+ <span>{{ baseInfo.maritalText }}</span>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <span>{{ $t('resume.firstWorkTime') }}:</span>
|
|
|
+ <span>{{ baseInfo.firstWorkTimeText }}</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="ml-3">
|
|
@@ -75,29 +95,30 @@
|
|
|
|
|
|
<script setup>
|
|
|
import CtForm from '@/components/CtForm'
|
|
|
+import Snackbar from '@/plugins/snackbar'
|
|
|
+import { getDict } from '@/hooks/web/useDictionaries'
|
|
|
+import { getTimeStamp, timesTampChange } from '@/utils/date'
|
|
|
// import { getYearMonth20YearsAgo, generateYearMonthDataArray } from './../utils/generateYearMonthData'
|
|
|
-import { ref } from 'vue';
|
|
|
+import { saveResumeBasicInfo } from '@/api/resume'
|
|
|
+import { useUserStore } from '@/store/user'
|
|
|
+import { ref, shallowRef } from 'vue';
|
|
|
|
|
|
defineOptions({name: 'resume-components-basicInfo'})
|
|
|
+const userStore = useUserStore()
|
|
|
+const CtFormRef = ref()
|
|
|
const isEdit = ref(false)
|
|
|
const showIcon = ref(false)
|
|
|
const isExpand = ref(false)
|
|
|
// const defaultYearMonthValue = ref(getYearMonth20YearsAgo())
|
|
|
// const yearMonth = ref(generateYearMonthDataArray())
|
|
|
+
|
|
|
const welfareList = ref(['热情活泼', '理性冷静', '富有创新', '热爱生活', '有幽默感'])
|
|
|
-const info = {
|
|
|
- name: '陈芊芊',
|
|
|
- sex: false,
|
|
|
- birth: '2021年05月03日',
|
|
|
- phoneNum: '18466958635',
|
|
|
- cityCode: '01111',
|
|
|
- city: '广州',
|
|
|
- email: '69852936@qq.com',
|
|
|
- workExperienceCode: '3',
|
|
|
- workExperience: '1年以内',
|
|
|
- eduCode: '5',
|
|
|
- edu: '硕士',
|
|
|
+let baseInfo = ref({})
|
|
|
+const getBasicInfo = () => { // 获取基础信息
|
|
|
+ baseInfo.value = JSON.parse(localStorage.getItem('baseInfo')) // 人才信息
|
|
|
}
|
|
|
+getBasicInfo()
|
|
|
+
|
|
|
const formList = ref({
|
|
|
options: [
|
|
|
{
|
|
@@ -113,38 +134,37 @@ const formList = ref({
|
|
|
{
|
|
|
type: 'ifRadio',
|
|
|
key: 'sex',
|
|
|
- value: true,
|
|
|
- default: true,
|
|
|
+ value: 0,
|
|
|
+ default: 0,
|
|
|
label: '性别',
|
|
|
col: 6,
|
|
|
width: 70,
|
|
|
- items: [{ label: '男', value: true }, { label: '女', value: false }],
|
|
|
+ items: [{ label: '男', value: 0 }, { label: '女', value: 1 }],
|
|
|
},
|
|
|
{
|
|
|
- type: 'text',
|
|
|
- key: 'birth',
|
|
|
- value: '2021年05月03日',
|
|
|
+ type: 'datepicker',
|
|
|
+ key: 'birthday',
|
|
|
+ value: shallowRef(null),
|
|
|
default: null,
|
|
|
- label: '出生日期',
|
|
|
col: 6,
|
|
|
- outlined: true,
|
|
|
+ label: '出生日期 *',
|
|
|
+ // outlined: true,
|
|
|
disabled: true,
|
|
|
},
|
|
|
{
|
|
|
type: 'text',
|
|
|
- key: 'phoneNum',
|
|
|
+ key: 'phone',
|
|
|
value: null,
|
|
|
default: null,
|
|
|
label: '电话号码',
|
|
|
col: 6,
|
|
|
outlined: true,
|
|
|
disabled: true,
|
|
|
- slotName: 'phoneNum',
|
|
|
- rules: [v => !!v || '请输入电话号码']
|
|
|
+ slotName: 'phone',
|
|
|
},
|
|
|
{
|
|
|
type: 'autocomplete',
|
|
|
- key: 'cityCode',
|
|
|
+ key: 'areaId',
|
|
|
value: null,
|
|
|
default: null,
|
|
|
label: '所在城市 *',
|
|
@@ -153,7 +173,7 @@ const formList = ref({
|
|
|
itemText: 'label',
|
|
|
itemValue: 'value',
|
|
|
rules: [v => !!v || '请选择所在城市'],
|
|
|
- items: [{ label: '广州', value: '01111'}]
|
|
|
+ items: [{ label: '广州', value: '440100'}]
|
|
|
},
|
|
|
{
|
|
|
type: 'text',
|
|
@@ -167,7 +187,7 @@ const formList = ref({
|
|
|
},
|
|
|
{
|
|
|
type: 'autocomplete',
|
|
|
- key: 'workExperience',
|
|
|
+ key: 'expType',
|
|
|
value: null,
|
|
|
default: null,
|
|
|
label: '工作经验 *',
|
|
@@ -176,53 +196,12 @@ const formList = ref({
|
|
|
itemText: 'label',
|
|
|
itemValue: 'value',
|
|
|
rules: [v => !!v || '请选择工作经验'],
|
|
|
- items: [
|
|
|
- {
|
|
|
- id: 1600,
|
|
|
- label: "在校生",
|
|
|
- value: "0",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1601,
|
|
|
- label: "应届生",
|
|
|
- value: "1",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1602,
|
|
|
- label: "经验不限",
|
|
|
- value: "2",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1603,
|
|
|
- label: "1年以内",
|
|
|
- value: "3",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1604,
|
|
|
- label: "1-3年",
|
|
|
- value: "4",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1605,
|
|
|
- label: "3-5年",
|
|
|
- value: "5",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1606,
|
|
|
- label: "5-10年",
|
|
|
- value: "6",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1607,
|
|
|
- label: "10年以上",
|
|
|
- value: "7",
|
|
|
- }
|
|
|
- ]
|
|
|
+ items: []
|
|
|
},
|
|
|
{
|
|
|
type: 'autocomplete',
|
|
|
- key: 'edu',
|
|
|
- value: '4',
|
|
|
+ key: 'eduType',
|
|
|
+ value: null,
|
|
|
default: null,
|
|
|
label: '最高学历 *',
|
|
|
col: 6,
|
|
@@ -230,53 +209,12 @@ const formList = ref({
|
|
|
itemText: 'label',
|
|
|
itemValue: 'value',
|
|
|
rules: [v => !!v || '请选择最高学历'],
|
|
|
- items: [
|
|
|
- {
|
|
|
- id: 1552,
|
|
|
- label: "初中及以下",
|
|
|
- value: "0"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1553,
|
|
|
- label: "中专/中技",
|
|
|
- value: "1"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1554,
|
|
|
- label: "高中",
|
|
|
- value: "2"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1555,
|
|
|
- label: "大专",
|
|
|
- value: "3"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1556,
|
|
|
- label: "本科",
|
|
|
- value: "4"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1557,
|
|
|
- label: "硕士",
|
|
|
- value: "5"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1558,
|
|
|
- label: "博士",
|
|
|
- value: "6"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1559,
|
|
|
- label: "其他",
|
|
|
- value: "99"
|
|
|
- }
|
|
|
- ]
|
|
|
+ items: []
|
|
|
},
|
|
|
{
|
|
|
type: 'autocomplete',
|
|
|
- key: 'workType',
|
|
|
- value: '0',
|
|
|
+ key: 'jobType',
|
|
|
+ value: null,
|
|
|
default: null,
|
|
|
label: '求职类型 *',
|
|
|
col: 6,
|
|
@@ -284,104 +222,95 @@ const formList = ref({
|
|
|
itemText: 'label',
|
|
|
itemValue: 'value',
|
|
|
rules: [v => !!v || '请选择求职类型'],
|
|
|
- items:
|
|
|
- [
|
|
|
- {
|
|
|
- id: 1548,
|
|
|
- label: "全职",
|
|
|
- value: "0"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1549,
|
|
|
- label: "兼职",
|
|
|
- value: "1"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1550,
|
|
|
- label: "临时",
|
|
|
- value: "2"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1551,
|
|
|
- label: "实习",
|
|
|
- value: "3"
|
|
|
- }
|
|
|
- ]
|
|
|
+ items: []
|
|
|
},
|
|
|
{
|
|
|
type: 'autocomplete',
|
|
|
- key: 'sale',
|
|
|
- value: '5',
|
|
|
+ key: 'jobStatus',
|
|
|
+ value: null,
|
|
|
default: null,
|
|
|
- label: '薪资要求 *',
|
|
|
+ label: '求职状态 *',
|
|
|
col: 6,
|
|
|
outlined: true,
|
|
|
itemText: 'label',
|
|
|
itemValue: 'value',
|
|
|
- rules: [v => !!v || '请选择薪资要求'],
|
|
|
- items:
|
|
|
- [
|
|
|
- {
|
|
|
- id: 1612,
|
|
|
- label: "不限",
|
|
|
- value: "0"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1613,
|
|
|
- label: "3K以下",
|
|
|
- value: "1"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1614,
|
|
|
- label: "3-5K",
|
|
|
- value: "2"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1615,
|
|
|
- label: "5-10K",
|
|
|
- value: "3"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1616,
|
|
|
- label: "10-20K",
|
|
|
- value: "4"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1617,
|
|
|
- label: "20-50K",
|
|
|
- value: "5"
|
|
|
- },
|
|
|
- {
|
|
|
- id: 1618,
|
|
|
- label: "50K以上",
|
|
|
- value: "6"
|
|
|
- }
|
|
|
- ]
|
|
|
+ rules: [v => !!v || '请选择求职状态'],
|
|
|
+ items: [{ label: '离职-随时到岗 ', value: 0 }, { label: '在职-月内到岗', value: 1 }, { label: '在职-考虑机会', value: 2 }, { label: '在职-暂不考虑', value: 3 }]
|
|
|
},
|
|
|
{
|
|
|
- type: 'text',
|
|
|
- key: 'name',
|
|
|
- value: '酒店经理',
|
|
|
+ type: 'autocomplete',
|
|
|
+ key: 'maritalStatus',
|
|
|
+ value: null,
|
|
|
default: null,
|
|
|
- label: '期望职位',
|
|
|
+ label: '婚姻状况 *',
|
|
|
col: 6,
|
|
|
- outlined: true
|
|
|
+ outlined: true,
|
|
|
+ itemText: 'label',
|
|
|
+ itemValue: 'value',
|
|
|
+ rules: [v => !!v || '请选择婚姻状况'],
|
|
|
+ items: [{ label: '未婚 ', value: 0 }, { label: '已婚', value: 1 }, { label: '离异', value: 2 }, { label: '保密', value: 3 }]
|
|
|
},
|
|
|
{
|
|
|
- type: 'text',
|
|
|
- key: 'name',
|
|
|
- value: '行业不限',
|
|
|
+ type: 'datepicker',
|
|
|
+ key: 'firstWorkTime',
|
|
|
+ value: shallowRef(null),
|
|
|
default: null,
|
|
|
- label: '期望行业',
|
|
|
col: 6,
|
|
|
- outlined: true
|
|
|
- }
|
|
|
+ label: '首次工作时间 *',
|
|
|
+ // outlined: true,
|
|
|
+ rules: [v => !!v || '请选择首次工作时间']
|
|
|
+ },
|
|
|
]
|
|
|
})
|
|
|
-formList.value.options.forEach((_e, index) => {
|
|
|
- if ((index + 2) % 2 === 0) _e.flexStyle = 'mr-3'
|
|
|
+const transformList = ['expType', 'eduType','jobType', 'areaId']
|
|
|
+formList.value.options.forEach((e, index) => {
|
|
|
+ if ((index + 2) % 2 === 0) e.flexStyle = 'mr-3'
|
|
|
+ // 回显
|
|
|
+ if (baseInfo.value[e.key]) e.value = baseInfo.value[e.key]
|
|
|
+ // 数字转为字符串
|
|
|
+ if (transformList.includes(e.key) && e.value && e.value !== 0) e.value = e.value.toString()
|
|
|
+ // 日期相关
|
|
|
+ if (e.type === 'datepicker') e.value = timesTampChange(e.value).slice(0, 10)
|
|
|
})
|
|
|
|
|
|
+
|
|
|
+// 保存-基础信息
|
|
|
+const handleSave = async () => {
|
|
|
+ const { valid } = await CtFormRef.value.formRef.validate()
|
|
|
+ if (!valid) return
|
|
|
+ const obj = {}
|
|
|
+ formList.value.options.forEach(e => {
|
|
|
+ if (e.noReturn) return
|
|
|
+ else if (e.type === 'datepicker') obj[e.key] = getTimeStamp(e.value)
|
|
|
+ else if (transformList.includes(e.key) && e.value && e.value !== 0) obj[e.key] = e.value - 0
|
|
|
+ else obj[e.key] = e.value
|
|
|
+ })
|
|
|
+ await saveResumeBasicInfo(obj)
|
|
|
+ Snackbar.success('保存成功!')
|
|
|
+ isEdit.value = false
|
|
|
+ // 获取当前登录账户信息
|
|
|
+ await userStore.getUserBaseInfos(baseInfo.value.userId)
|
|
|
+ await getBasicInfo()
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// 获取字典内容
|
|
|
+const getDictData = async (obj) => {
|
|
|
+ const item = formList.value.options.find(e => e.key === obj.key)
|
|
|
+ if (item) { // && !item.items?.length
|
|
|
+ const { data } = await getDict(obj.type)
|
|
|
+ item.items = data
|
|
|
+ }
|
|
|
+}
|
|
|
+const getOptions = () => {
|
|
|
+ const dictList = [
|
|
|
+ { type: 'menduner_exp_type', key: 'expType' },
|
|
|
+ { type: 'menduner_education_type', key: 'eduType' },
|
|
|
+ { type: 'menduner_job_type', key: 'jobType' }
|
|
|
+ ]
|
|
|
+ dictList.forEach(obj => getDictData(obj))
|
|
|
+}
|
|
|
+getOptions()
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|
|
|
|