ソースを参照

保存基本信息

lifanagju_citu 11 ヶ月 前
コミット
d8f636341d
5 ファイル変更167 行追加211 行削除
  1. 8 0
      src/api/resume.js
  2. 1 0
      src/locales/en.js
  3. 1 0
      src/locales/zh-CN.js
  4. 20 3
      src/store/user.js
  5. 137 208
      src/views/resume/components/basicInfo.vue

+ 8 - 0
src/api/resume.js

@@ -1,5 +1,13 @@
 import request from '@/config/axios'
 
+// 保存基本信息
+export const saveResumeBasicInfo = async (data) => {
+  return await request.post({
+    url: '/app-api/menduner/system/person/resume/save/info',
+    data
+  })
+}
+
 // 保存个人优势
 export const saveResumeAdvantage = async (data) => {
   return await request.post({

+ 1 - 0
src/locales/en.js

@@ -71,6 +71,7 @@ export default {
     trainingExperience: 'Training Experience',
     educationExp: 'Educational Experience',
     projectExperience: 'Project Experience',
+    firstWorkTime: 'First Work Time',
     expand: 'Expand',
     retract: 'Retract'
   }

+ 1 - 0
src/locales/zh-CN.js

@@ -71,6 +71,7 @@ export default {
     trainingExperience: '培训经历',
     educationExp: '教育经历',
     projectExperience: '项目经历',
+    firstWorkTime: '首次工作时间',
     expand: '展开',
     retract: '收起'
   }

+ 20 - 3
src/store/user.js

@@ -5,6 +5,8 @@ import { smsLogin, passwordLogin, getBaseInfo } from '@/api/common/index'
 import { logout } from '@/api/common/index'
 import { getUserInfo } from '@/api/personal/user'
 import Snackbar from '@/plugins/snackbar'
+import { timesTampChange } from '@/utils/date'
+
 
 export const useUserStore = defineStore('user',
   () => {
@@ -56,15 +58,29 @@ export const useUserStore = defineStore('user',
     }
 
     // 获取当前登录账户的基本信息(人才信息)
-    const getUserBaseInfos = async () => {
+    const getUserBaseInfos = async (userId = null) => {
       try {
-        const data = await getBaseInfo({ userId: accountInfo.userId })
-        baseInfo = data
+        const data = await getBaseInfo({ userId: userId || accountInfo.userId })
+        // baseInfo = data
+        baseInfo = getFieldText(data)
         localStorage.setItem('baseInfo', JSON.stringify(data))
       } catch (error) {
         Snackbar.error(error.msg)
       }
     }
+    // 字典对应中文
+    const getFieldText = (data) => {
+      if (data.areaId && data.areaId !== 0) data.areaText = '广州' // 现居住地text
+      if (data.birthday && data.birthday !== 0) data.birthdayText = timesTampChange(data.birthday).slice(0, 10) // 出生日期
+      if (data.eduType && data.eduType !== 0) data.eduTypeText = '硕士' // 学历
+      if (data.expType && data.expType !== 0) data.expTypeText = '1-3年' // 工作经验
+      if (data.sex && data.sex !== 0) data.sexTypeText = '男' // 性别
+      if (data.maritalStatus && data.maritalStatus !== 0) data.maritalText = '未婚' // 	婚姻状况
+      if (data.jobStatus && data.jobStatus !== 0) data.jobStatusText = '离职-随时到岗' // 	求职状态
+      if (data.jobType && data.jobType !== 0) data.jobTypeText = '全职' // 	求职类型
+      if (data.firstWorkTime && data.firstWorkTime !== 0) data.firstWorkTimeText = timesTampChange(data.firstWorkTime).slice(0, 10) // 首次工作时间
+      return data
+    }
 
     // 退出登录
     const userLogout = async () => {
@@ -78,6 +94,7 @@ export const useUserStore = defineStore('user',
     return {
       userInfo,
       baseInfo,
+      getUserBaseInfos,
       handleSmsLogin,
       userLogout,
       handlePasswordLogin

+ 137 - 208
src/views/resume/components/basicInfo.vue

@@ -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>