Explorar o código

在线简历-求职意向、教育经历新增编辑

Xiao_123 hai 6 meses
pai
achega
8bfe5100fc

+ 57 - 33
api/resume.js

@@ -60,20 +60,30 @@ export const getResumeEduExp = async () => {
   })
 }
 
-// // 删除-教育经历
-// export const deleteResumeEduExp = async (id) => {
-//   return await request.delete({
-//     url: '/app-api/menduner/system/person/resume/edu/exp/remove?id=' + id
-//   })
-// }
+// 删除-教育经历
+export const deleteResumeEduExp = async (id) => {
+  return request({
+    url: '/app-api/menduner/system/person/resume/edu/exp/remove?id=' + id,
+    method: 'DELETE',
+    custom: {
+      auth: true,
+      showLoading: false
+    }
+  })
+}
 
-// // 保存-教育经历
-// export const saveResumeEduExp = async (data) => {
-//   return await request.post({
-//     url: '/app-api/menduner/system/person/resume/edu/exp/save',
-//     data
-//   })
-// }
+// 保存-教育经历
+export const saveResumeEduExp = async (data) => {
+  return request({
+    url: '/app-api/menduner/system/person/resume/edu/exp/save',
+    method: 'POST',
+    data,
+    custom: {
+      showLoading: false,
+      auth: true
+    }
+  })
+}
 
 // 获取-工作经历
 export const getResumeWorkExp = async () => {
@@ -176,13 +186,17 @@ export const saveResumeJobInterested = async (data) => {
   })
 }
 
-
-// // 删除求职意向
-// export const deleteResumeJobInterested = async (id) => {
-//   return await request.delete({
-//     url: '/app-api/menduner/system/person/resume/job/interested/remove?id=' + id
-//   })
-// }
+// 删除求职意向
+export const deleteResumeJobInterested = async (id) => {
+  return request({
+    url: '/app-api/menduner/system/person/resume/job/interested/remove?id=' + id,
+    method: 'DELETE',
+    custom: {
+      auth: true,
+      showLoading: false
+    }
+  })
+}
 
 // // 获取求职意向
 export const getResumeJobInterested = async () => {
@@ -197,20 +211,30 @@ export const getResumeJobInterested = async () => {
 }
 
 // // 根据专业名称模糊搜索
-// export const schoolMajorByName = async (params) => {
-//   return await request.get({
-//     url: '/app-api/menduner/system/major/search/by/name',
-//     params
-//   })
-// }
+export const schoolMajorByName = async (params) => {
+  return request({
+    url: '/app-api/menduner/system/major/search/by/name',
+    params,
+    method: 'GET',
+    custom: {
+      showLoading: false,
+      auth: true
+    }
+  })
+}
 
-// // 根据学校名称模糊搜索
-// export const schoolSearchByName = async (params) => {
-//   return await request.get({
-//     url: '/app-api/menduner/system/school/search/by/name',
-//     params
-//   })
-// }
+// 根据学校名称模糊搜索
+export const schoolSearchByName = async (params) => {
+  return request({
+    url: '/app-api/menduner/system/school/search/by/name',
+    params,
+    method: 'GET',
+    custom: {
+      showLoading: false,
+      auth: true
+    }
+  })
+}
 
 // // 根据企业名称模糊搜索
 // export const enterpriseSearchByName = async (params) => {

+ 6 - 3
components/Navbar/index.vue

@@ -16,20 +16,23 @@ defineProps({
 
 <style scoped lang="scss">
 .navbar-box {
-  height: 64px;
+  height: 80px;
   width: 100%;
   position: relative;
   background: linear-gradient(90deg, #66BB6A 0, #64FFDA 100%);
   &-logo {
+    position: absolute;
+    top: 50%;
+    transform: translateY(-50%);
     width: 100px;
     height: 42px;
-    margin: 10px 0 0 10px;
+    margin-left: 10px;
   }
   &-title {
     position: absolute;
     top: 50%;
     left: 50%;
-    transform: translate(-50%, -50%);
+    transform: translate(-30%, 0);
     color: #fff;
   }
 }

+ 12 - 0
pages.json

@@ -68,6 +68,18 @@
 						"navigationBarTitleText": "个人优势"
 					}
 				},
+				{
+					"path": "resumeOnline/jobIntention",
+					"style": {
+						"navigationBarTitleText": "求职意向"
+					}
+				},
+				{
+					"path": "resumeOnline/educationExp",
+					"style": {
+						"navigationBarTitleText": "教育经历"
+					}
+				},
 				{
 					"path": "resume/index",
 					"style": {

+ 1 - 1
pages/index/position.vue

@@ -98,7 +98,7 @@ const gridList = [
 const handleGrid = (e) => {
   uni.showToast({
     icon: 'none',
-    title: '建设中...,敬请期待'
+    title: '请前往网页版门墩儿查看'
   })
 }
 

+ 1 - 1
pagesA/resumeOnline/dict.js

@@ -78,7 +78,7 @@ export const dealJobData = (list) => {
       if (item.isArray) {
         if (e[item.key] && e[item.key].length) {
           const result = e[item.key].map(val => {
-            return obj = dictObj[item.value].find(i => i[item.itemKey] === val)
+            return obj = dictObj[item.value].find(i => Number(i[item.itemKey]) === Number(val))
           })
           e[item.label] = result && result.length ? result.filter(Boolean) : []
         }

+ 166 - 2
pagesA/resumeOnline/educationExp.vue

@@ -1,9 +1,173 @@
-<!--  -->
+<!-- 教育经历 -->
 <template>
-  <view>教育经历</view>
+  <view class="ss-m-x-30 ss-m-y-30">
+    <uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="90px">
+      <uni-forms-item label="学校名称" name="schoolName" required>
+				<uni-combox :candidates="schoolData" placeholder="学校名称" v-model="formData.schoolName" @input="handleSearchSchool"></uni-combox>
+			</uni-forms-item>
+      <uni-forms-item label="所学专业" name="major" required>
+				<uni-combox :candidates="majorData" placeholder="所学专业" v-model="formData.major" @input="handleSearchMajor"></uni-combox>
+			</uni-forms-item>
+      <uni-forms-item label="学历" name="educationType" required>
+        <uni-data-select v-model="formData.educationType" :localdata="searchData.eduType"></uni-data-select>
+			</uni-forms-item>
+      <uni-forms-item label="学制类型" name="educationSystemType" required>
+        <uni-data-select v-model="formData.educationSystemType" :localdata="searchData.eduSystemType"></uni-data-select>
+			</uni-forms-item>
+      <uni-forms-item label="开始时间" name="startTime" required>
+				<picker mode="date" :value="formData.startTime" fields="month" :end="endDate" @change="e => formData.startTime = e.detail.value">
+					<view class="uni-input ss-m-t-20">{{ formData.startTime }}</view>
+				</picker>
+			</uni-forms-item>
+      <uni-forms-item label="结束时间" name="endTime" required>
+				<picker mode="date" :value="formData.endTime" fields="month" :end="endDate" @change="e => formData.endTime = e.detail.value">
+					<view class="uni-input ss-m-t-20">{{ formData.endTime }}</view>
+				</picker>
+			</uni-forms-item>
+      <uni-forms-item label="在校经历" name="content">
+				<uni-easyinput type="textarea" v-model="formData.content" autoHeight  placeholder="请输入内容"></uni-easyinput>
+			</uni-forms-item>
+    </uni-forms>
+    <view class="f-horizon-center">
+      <button v-if="editId" size="default" class="delete-button commonBtnStyle" @click="handleDelete">删 除</button>
+      <button size="default" :class="{'save-button': editId, 'commonBtnStyle': editId, 'send-button': !editId}"  @click="submit">保 存</button>
+    </view>
+  </view>
 </template>
 
 <script setup>
+import { ref, unref } from 'vue'
+import { dictObj } from '@/utils/position.js'
+import { convertYearMonthToTimestamp, timesTampChange } from '@/utils/date.js'
+import { schoolSearchByName, schoolMajorByName, saveResumeEduExp, getResumeEduExp, deleteResumeEduExp } from '@/api/resume.js'
+import { onLoad } from '@dcloudio/uni-app'
+import { cloneDeep } from 'lodash-es'
+
+let formData = ref({
+  startTime: '2014-01',
+  endTime: '2018-01'
+})
+const editId = ref(null)
+const majorData = ref([])
+const schoolData = ref([])
+const form = ref()
+const date = new Date()
+const endDate = date.getFullYear() + '-' + (date.getMonth() + 1) // 不可选时间
+const searchData = ref({
+  school: [],
+  major: [],
+  eduType: dictObj.edu.map(e => ({ text: e.label, value: e.value})),
+  eduSystemType: dictObj.eduSystemType.map(e => ({ text: e.label, value: e.value}))
+})
+
+const rules = {
+	schoolName:{
+		rules: [{required: true, errorMessage: '请输入学校名称' }]
+	},
+	major:{
+		rules: [{required: true, errorMessage: '请输入所学专业' }]
+	},
+	educationType:{
+		rules: [{required: true, errorMessage: '请选择学历' }]
+	},
+	educationSystemType:{
+		rules: [{required: true, errorMessage: '请选择学制类型' }]
+	},
+	startTime:{
+		rules: [{required: true, errorMessage: '请选择开始时间' }]
+	},
+	endTime:{
+		rules: [{required: true, errorMessage: '请选择结束时间' }]
+	}
+}
+const getEduExp = async (id) => {
+  const { data } = await getResumeEduExp()
+  if (!data || !data.length) {
+    return
+  }
+  const obj = data.find(e => e.id == id)
+  formData.value = cloneDeep(obj)
+  formData.value.startTime = timesTampChange(obj.startTime, 'Y-M')
+  formData.value.endTime = timesTampChange(obj.endTime, 'Y-M')
+  handleSearchSchool(obj.schoolName)
+  handleSearchMajor(obj.major)
+}
+
+onLoad((options) => {
+  if (options.id) {
+    editId.value = options.id
+    getEduExp(options.id)
+  }
+})
+
+// 学校搜索
+const handleSearchSchool = (e) => {
+  if (!e) return schoolData.value = []
+  schoolSearchByName({ name: e }).then(res => {
+    searchData.value.school = res.data
+    schoolData.value = res.data && res.data?.length ? res.data.map(e => e.value) : []
+  })
+}
+
+// 专业搜索
+const handleSearchMajor = (e) => {
+  if (!e) return majorData.value = []
+  schoolMajorByName({ name: e }).then(res => {
+    searchData.value.major = res.data
+    majorData.value = res.data && res.data?.length ? res.data.map(e => e.nameCn) : []
+  })
+}
+
+// 保存
+const submit = async () => {
+  const valid = await unref(form).validate()
+  if (!valid) return
+  formData.value.majorId = searchData.value.major.find(e => e.nameCn === formData.value.major)?.id
+  formData.value.schoolId = searchData.value.school.find(e => e.value === formData.value.schoolName)?.key
+  try {
+    formData.value.startTime = convertYearMonthToTimestamp(formData.value.startTime)
+    formData.value.endTime = convertYearMonthToTimestamp(formData.value.endTime)
+    await saveResumeEduExp(formData.value)
+    uni.showToast({
+			icon: 'success',
+			title: '保存成功'
+		})
+		setTimeout(() => {
+      editId.value = null
+      uni.navigateBack({
+        delta: 1
+      })
+    }, 1000)
+  } catch (err) {
+		uni.showToast({
+			icon: 'none',
+			title: err.msg
+		})
+	}
+}
+
+// 删除
+const handleDelete = async () => {
+	try {
+		await deleteResumeEduExp(editId.value)
+		uni.showToast({
+			icon: 'success',
+			title: '删除成功'
+		})
+		setTimeout(() => {
+			editId.value = null
+			uni.navigateBack({
+				delta: 1
+			})
+		}, 1000)
+	} catch (err) {
+		uni.showToast({
+			icon: 'none',
+			title: err.msg
+		})
+	}
+}
 </script>
+
 <style lang="scss" scoped>
 </style>

+ 29 - 39
pagesA/resumeOnline/index.vue

@@ -1,5 +1,6 @@
 <template>
   <layout-page>
+    <!-- 基本信息 -->
     <view class="baseInfo borderLine" @tap="handleTo('baseInfoEdit')">
       <view>
         <view class="baseInfo-name">
@@ -30,6 +31,7 @@
         />
       </view>
     </view>
+    <!-- 个人画像 -->
     <view class="characteristic borderLine">
       <view class="titleBox">
         <text class="title">个人画像</text>
@@ -51,6 +53,7 @@
         </view>
       </view>
     </view>
+    <!-- 个人优势 -->
     <view class="advantage borderLine">
       <view class="titleBox">
         <text class="title">个人优势</text>
@@ -64,6 +67,7 @@
       </view>
       <view class="ellipsis-2 text px-20">{{ baseInfo.advantage ? baseInfo.advantage : '请填写您的个人优势...' }}</view>
     </view>
+    <!-- 求职意向 -->
     <view class="intention borderLine">
       <view class="titleBox">
         <text class="title">求职意向</text>
@@ -72,7 +76,7 @@
           color="#666"
           custom-prefix="iconfont"
           size="18"
-          @tap="popupOpen('jobIntention')"
+          @tap="handleTo('jobIntention')"
         ></uni-icons>
       </view>
       <view class="content">
@@ -82,7 +86,9 @@
             v-for="int in intention"
             :key="int.id"
             :border="false"
+            :clickable="true"
             showArrow
+            @click="handleTo('jobIntention', int.id)"
           >
             <template v-slot:body>
               <view class="item">
@@ -91,7 +97,7 @@
                   <text class="mr-20">{{ int.position}}</text>
                   <text>{{ int.payFrom }} {{ int.payFrom  && int.payTo ? '-' : ''}} {{ int.payTo}}</text>
                 </view>
-                <view>{{ int.workArea }}</view>
+                <view>{{ int.interestedArea && int.interestedArea.length ? int.workArea + ',' + int.interestedArea.map(e => e.name).join(',') : int.workArea }}</view>
                 <view class="item-tags">
                   <view v-for="industry in int.industry" :key="industry.id" class="tag">{{ industry.nameCn }}</view>
                 </view>
@@ -101,6 +107,7 @@
         </uni-list>
       </view>
     </view>
+    <!-- 教育经历 -->
     <view class="educationExp borderLine">
       <view class="titleBox">
         <text class="title">教育经历</text>
@@ -109,6 +116,7 @@
           color="#666"
           custom-prefix="iconfont"
           size="18"
+          @tap="handleTo('educationExp')"
         ></uni-icons>
       </view>
       <view class="content">
@@ -119,13 +127,16 @@
             :key="education.id"
             showArrow
             :border="false"
+            :clickable="true"
             :title="education.schoolName"
             :note="`${education.major} ${education.educationTypeText}`"
             :rightText="education.time"
+            @click="handleTo('educationExp', education.id)"
           />
         </uni-list>
       </view>
     </view>
+    <!-- 工作经历 -->
     <view class="workExp borderLine">
       <view class="titleBox">
         <text class="title">工作经历</text>
@@ -159,6 +170,7 @@
         </view>
       </view>
     </view>
+    <!-- 培训经历 -->
     <view class="workExp trainExp borderLine">
       <view class="titleBox">
         <text class="title">培训经历</text>
@@ -192,6 +204,7 @@
         </view>
       </view>
     </view>
+    <!-- 职业技能 -->
     <view class="characteristic">
       <view class="titleBox">
         <text class="title">职业技能</text>
@@ -212,19 +225,6 @@
         </view>
       </view>
     </view>
-    <!-- 底部弹出 Popup -->
-    <uni-popup ref="popupRef" type="bottom" :mask-click="true" background-color="#fff">
-      <view class="popupBox">
-        <view class="handleBtnBox borderLine">
-          <view class="save" @click="null"></view>
-          <view class="close" @click="popupRef.close()"><uni-icons type="closeempty" size="18"></uni-icons></view>
-          <!-- <view class="save" @click="null">保存</view> -->
-        </view>
-        <view class="popupContent">
-          <jobIntention></jobIntention>
-        </view>
-      </view>
-    </uni-popup>
   </layout-page>
 </template>
 
@@ -244,7 +244,6 @@ import { userStore } from '@/store/user'
 import { dealJobData } from './dict'
 import layoutPage from '@/layout'
 import { onShow } from '@dcloudio/uni-app'
-import jobIntention from './jobIntention.vue'
 import { getUserAvatar } from '@/utils/avatar'
 
 const useUserStore = userStore()
@@ -256,8 +255,8 @@ const workExp = ref([])
 const trainExp = ref([])
 const skillExp = ref([])
 
-function handleTo (str) {
-  uni.navigateTo({ url: `/pagesA/resumeOnline/${str}` })
+function handleTo (str, id) {
+  uni.navigateTo({ url: id ? `/pagesA/resumeOnline/${str}?id=${id}` : `/pagesA/resumeOnline/${str}` })
 }
 
 // 获取基础信息
@@ -298,7 +297,7 @@ async function getEduExp () {
     return {
       ...e,
       educationTypeText: item?.label ?? '',
-      time: `${timesTampChange(e.startTime ,'Y')}-${timesTampChange(e.endTime ,'Y')} `
+      time: `${timesTampChange(e.startTime ,'Y-M')}-${timesTampChange(e.endTime ,'Y-M')} `
     }
   })
   // 完成度展示
@@ -367,28 +366,19 @@ async function getSkillExpData () {
   })
 }
 
-const popupRef = ref()
-const popupOpen = (type) => {
-  popupRef.value.open()
-}
-
-// 求职状态字典
-// getJobStatus()
-// 获取基础信息
-getBaseInfo()
-// 获取求职意向
-getJobInterested()
-// 获取教育经历
-getEduExp()
-// 获取工作经验
-getWorkExp()
-// 培训经历
-getTrainExpData()
-// 职业技能
-getSkillExpData()
-
 onShow(() => {
+  // 获取基础信息
   getBaseInfo()
+  // 获取求职意向
+  getJobInterested()
+  // 获取教育经历
+  getEduExp()
+  // 获取工作经验
+  getWorkExp()
+  // 培训经历
+  getTrainExpData()
+  // 职业技能
+  getSkillExpData()
 })
 </script>
 

+ 88 - 16
pagesA/resumeOnline/jobIntention.vue

@@ -1,51 +1,122 @@
 <!--  -->
 <template>
-  <view>
-    <uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="100%" label-align="left" label-position="top">
-      <uni-forms-item label="期望岗位" name="positionId">
+  <view class="ss-m-x-30 ss-m-y-30">
+    <uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="90px">
+      <uni-forms-item label="期望岗位" name="positionId" required>
 				<uni-data-picker popup-title="请选择期望岗位" v-model="formData.positionId" :localdata="dictObj?.positionTreeData || []" :clear-icon="false" :map="{ text: 'nameCn', value: 'id'}"></uni-data-picker>
 			</uni-forms-item>
-      <uni-forms-item label="期望行业" name="industryIdList">
+      <uni-forms-item label="期望行业" name="industryIdList" required>
 				<uni-data-picker popup-title="请选择期望行业" v-model="formData.industryIdList" :localdata="dictObj?.industryTreeData || []" :clear-icon="false" :map="{ text: 'nameCn', value: 'id'}"></uni-data-picker>
 			</uni-forms-item>
-      <uni-forms-item label="期望薪资(最低要求)" name="payFrom">
-        <uni-number-box v-model="formData.payFrom" :min="1" :max="999999999" :step="100" :width="150" @change="payChange"></uni-number-box>
+      <uni-forms-item label="最低薪资" name="payFrom" required>
+        <uni-number-box v-model="formData.payFrom" :min="1" :max="999999999" :step="1000" :width="150" @change="payChange"></uni-number-box>
 			</uni-forms-item>
-      <uni-forms-item label="期望薪资(最高要求)" name="payTo">
-        <uni-number-box v-model="formData.payTo" :min="payToMin" :max="999999999" :step="100" :width="150"></uni-number-box>
+      <uni-forms-item label="最高薪资" name="payTo" required>
+        <uni-number-box v-model="formData.payTo" :min="payToMin" :max="999999999" :step="1000" :width="150"></uni-number-box>
 			</uni-forms-item>
-      <uni-forms-item label="求职类型" name="jobType">
+      <uni-forms-item label="求职类型" name="jobType" required>
 				<uni-data-picker popup-title="请选择求职类型" v-model="formData.jobType" :localdata="dictObj?.jobType || []" :clear-icon="false" :map="{ text: 'label', value: 'value'}"></uni-data-picker>
 			</uni-forms-item>
-      <uni-forms-item label="工作城市" name="workAreaProvinceId">
-				<uni-data-picker popup-title="请选择工作城市" v-model="formData.workAreaProvinceId" :localdata="dictObj?.areaTreeData || []" :clear-icon="false" :map="{ text: 'name', value: 'id'}"></uni-data-picker>
+      <uni-forms-item label="工作城市" name="workAreaId" required>
+				<uni-data-picker popup-title="请选择工作城市" v-model="formData.workAreaId" :localdata="dictObj?.areaTreeData || []" :clear-icon="false" :map="{ text: 'name', value: 'id'}"></uni-data-picker>
 			</uni-forms-item>
       <uni-forms-item label="其它感兴趣的城市" name="interestedAreaIdList">
 				<uni-data-picker popup-title="其它感兴趣的城市" v-model="formData.interestedAreaIdList" :localdata="dictObj?.areaTreeData || []" :clear-icon="false" :map="{ text: 'name', value: 'id'}"></uni-data-picker>
 			</uni-forms-item>
     </uni-forms>
     <view class="f-horizon-center">
-      <button type="primary" size="default" class="send-button"  @click="submit">确 认</button>
+      <button v-if="editId" size="default" class="delete-button commonBtnStyle" @click="handleDelete">删 除</button>
+      <button size="default" :class="{'save-button': editId, 'commonBtnStyle': editId, 'send-button': !editId}"  @click="submit">保 存</button>
     </view>
-    <!-- <view style="text-align: center; font-size: 13px; color: gray;">已加载全部</view> -->
   </view>
 </template>
 
 <script setup>
-import { ref, reactive } from 'vue'
+import { ref, unref } from 'vue'
 import { dictObj } from '@/utils/position.js'
+import { saveResumeJobInterested, getResumeJobInterested, deleteResumeJobInterested } from '@/api/resume.js'
+import { onLoad } from '@dcloudio/uni-app'
+import { cloneDeep } from 'lodash-es'
 
-const formData = reactive({ positionId: '', payFrom: 0, payTo: 0 })
+let formData = ref({ positionId: '', payFrom: 0, payTo: 0 })
 const form = ref()
+const editId = ref(null)
+
+// 获取求职意向
+async function getJobInterested (id) {
+  const { data } = await getResumeJobInterested()
+  if (!data || !data.length) {
+    return
+  }
+  const obj = data.find(k => k.id === id)
+	formData.value = cloneDeep(obj)
+	formData.value.industryIdList = obj.industryIdList.length ? obj.industryIdList[0] : ''
+	formData.value.interestedAreaIdList = obj.interestedAreaIdList.length ? Number(obj.interestedAreaIdList[0]) : ''
+}
+
+onLoad((options) => {
+	if (options.id) {
+		editId.value = options.id
+		getJobInterested(options.id)
+	}
+})
+
+// 提交
 const submit = async () => {
   const valid = await unref(form).validate()
   if (!valid) return
+	// 后续做多选
+	formData.value.industryIdList = [formData.value.industryIdList]
+	formData.value.interestedAreaIdList = [formData.value.interestedAreaIdList]
+	try {
+		await saveResumeJobInterested(formData.value)
+		uni.showToast({
+			icon: 'success',
+			title: '保存成功'
+		})
+		setTimeout(() => {
+			editId.value = null
+			uni.navigateBack({
+				delta: 1
+			})
+		}, 1000)
+	} catch (err) {
+		uni.showToast({
+			icon: 'none',
+			title: err.msg
+		})
+	}
+}
+
+// 删除
+const handleDelete = async () => {
+	try {
+		await deleteResumeJobInterested(editId.value)
+		uni.showToast({
+			icon: 'success',
+			title: '删除成功'
+		})
+		setTimeout(() => {
+			editId.value = null
+			uni.navigateBack({
+				delta: 1
+			})
+		}, 1000)
+	} catch (err) {
+		uni.showToast({
+			icon: 'none',
+			title: err.msg
+		})
+	}
 }
 
 const rules = {
 	positionId:{
 		rules: [{required: true, errorMessage: '请选择期望岗位' }]
 	},
+	industryIdList:{
+		rules: [{required: true, errorMessage: '请选择期望行业' }]
+	},
 	payFrom:{
 		rules: [{required: true, errorMessage: '请输入薪资最低要求' }]
 	},
@@ -63,9 +134,10 @@ const rules = {
 const payToMin = ref(1)
 const payChange = (val) => {
   payToMin.value = val
-  if (val > formData.payTo) formData.payTo = val
+  if (val > formData.value.payTo) formData.value.payTo = val
 }
 
 </script>
+
 <style lang="scss" scoped>
 </style>

+ 1 - 1
pagesA/resumeOnline/portrait.vue

@@ -67,7 +67,7 @@ const select = ref([])
 // 获取基础信息
 function getBaseInfo () {
   const baseInfo = useUserStore.baseInfo
-  select.value = baseInfo?.tagList?.length ? tagList : []
+  select.value = baseInfo.tagList &&  baseInfo.tagList?.length ? baseInfo.tagList : []
 }
 
 // 获取基础信息

+ 44 - 68
static/style/index.css

@@ -40,6 +40,16 @@
   text-align: center;
 }
 
+.vertical80-center {
+  text-align: center;
+  line-height: 80vh;
+}
+
+.vertical-center {
+  text-align: center;
+  line-height: 80vh;
+}
+
 .d-flex {
   display: flex;
 }
@@ -184,80 +194,27 @@
   margin: 5rpx;
 }
 
-/* 列表触底暂无更多 */
-.noMore {
-  text-align: center;
-  color: grey;
-}
-
-.salary-text {
-  float: right;
-  color: #fe574a;
-}
-
-.list-shape {
-  padding: 10px 30rpx 10px;
-  margin-top: 10px;
-  background-color: #fff;
-}
-
-.tag-gap {
-  margin: 10rpx 10rpx 10rpx 0;
-}
-
-.tag-gap1 {
-  margin: 10rpx;
-}
-
-.viewider {
-  margin: 0 10rpx;
-}
-
-.mt {
-  margin-top: 10rpx;
-}
-
-.mb {
-  margin-bottom: 10rpx;
-}
-
-.ml {
-  margin-left: 20rpx;
-}
-
-.mr {
-  margin-right: 20rpx;
-}
-
-.cer-end {
-  position: absolute;
-  top: 85%;
-  right: 16%;
-}
-
-.cer-text {
-  text-decoration: underline;
-  margin: 0 5rpx;
-}
-
-.dis {
-  display: flex;
-  align-items: center;
+.salary {
+  color: var(--v-error-base);
+  line-height: 41px;
+  font-weight: 600;
+  height: auto;
+  display: inline-block;
+  vertical-align: sub;
 }
 
-.show-more {
-  width: 26vw;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
+.bold {
+  font-weight: bold;
 }
 
-.mr-10 {
-  margin-right: 10rpx;
+.w-600 {
+  font-weight: 600;
 }
 
-.divider {
-  color: #e4d4d2;
+.horizontalDividingLine {
+  height: 1px;
+  color: #EDEDED;
+  width: 100%;
 }
 
 .default-active {
@@ -9099,6 +9056,25 @@
   color: #fff;
 }
 
+.commonBtnStyle {
+  width: 45vw;
+  height: 44px;
+  line-height: 44px;
+  color: #fff;
+}
+
+.save-button {
+  margin: 20px 0 20px 20px;
+  background-color: #00897B !important;
+}
+
+.delete-button {
+  margin: 20px auto;
+  color: #FE574A !important;
+  background-color: #fff !important;
+  border: 1px solid #FE574A;
+}
+
 .disabled-button {
   width: 85%;
   height: 44px;

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
static/style/index.min.css


+ 17 - 0
static/style/index.scss

@@ -431,6 +431,23 @@
 	// border-radius: 25px;
 	color: #fff;
 }
+
+.commonBtnStyle {
+  width: 45vw;
+  height: 44px;
+  line-height: 44px;
+  color: #fff;
+}
+.save-button {
+  margin: 20px 0 20px 20px;
+  background-color: #00897B !important;
+}
+.delete-button {
+  margin: 20px auto;
+	color: #FE574A !important;
+  background-color: #fff !important;
+	border: 1px solid #FE574A;
+}
 //禁用按钮
 .disabled-button {
 	width: 85%;

+ 1 - 1
uni_modules/uni-combox/components/uni-combox/uni-combox.vue

@@ -205,7 +205,7 @@
 		border: 1px solid #EBEEF5;
 		border-radius: 6px;
 		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-		z-index: 2;
+		z-index: 9;
 		padding: 4px 0;
 	}
 

+ 12 - 0
utils/date.js

@@ -24,4 +24,16 @@ export const getAgeByBirthdayTimestamp = (timestamp) => {
   const birthday = new Date(timestamp)
   const age = now.getFullYear() - birthday.getFullYear()
   return age
+}
+
+// 将YYYY-MM转换为时间戳
+export const convertYearMonthToTimestamp = (yearMonth) => {  
+  const regex = /^\d{4}-\d{2}$/
+  if (!regex.test(yearMonth)) {  
+    throw new Error("Invalid input format. Expected 'YYYY-MM'.")
+  }
+  const [year, month] = yearMonth.split('-').map(Number)
+  const date = new Date(Date.UTC(year, month - 1, 1))
+  const timestamp = date.getTime()
+  return timestamp  
 }

+ 3 - 13
utils/position.js

@@ -14,7 +14,8 @@ export const dictObj = reactive({
   financing: [], // 融资阶段
   sex: [],
   jobType: [],
-  areaTreeData: []
+  areaTreeData: [],
+  eduSystemType: []
 })
 const dictList = ref([
   { type: 'menduner_pay_unit', value: 'payUnit', key: 'payUnit', label: 'payName' },
@@ -26,6 +27,7 @@ const dictList = ref([
   { type: 'menduner_marital_status', value: 'marital', key: 'maritalStatus', label: 'maritalStatusName' },
   { type: 'menduner_industry_type', value: 'industry', key: 'industryId', label: 'industryName', params: {}, apiType: 'industryList', nameKey: 'nameCn', valueKey: 'id' },
   { type: 'menduner_education_type', value: 'edu', key: 'eduType', label: 'eduName' },
+  { type: 'menduner_education_system_type', value: 'eduSystemType', key: 'eduSystemType', label: 'eduSystemName' },
   { type: 'menduner_exp_type', value: 'exp', key: 'expType', label: 'expName' },
   { type: 'menduner_area_type', value: 'area', key: 'areaId', label: 'areaName', params: {}, apiType: 'areaList', nameKey: 'name', valueKey: 'id' },
   { type: 'positionData', value: 'position', key: 'positionId', label: 'positionName', params: {}, apiType: 'positionData', nameKey: 'nameCn', valueKey: 'id' },
@@ -78,18 +80,6 @@ export const dealDictObjData = (res, obj) => {
   return res
 }
 
-// 获取单个字典对应的数值
-export const getDictValueWithLabel = (dict, value, valueKey = 'value', labelKey = 'label') => {
-  let result = ''
-  getDict(dict).then(({ data }) => {
-    if (!data || !data.length) return
-    const obj = data.find(e => e[valueKey] === value)
-    if (!obj) return
-    result = obj[labelKey]
-  })
-  return result
-}
-
 // 计算众聘佣金
 let data
 const list = ['headhuntRate', 'recommendRate', 'cvRate'] // 平台、推荐人、投递人

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio