| @@ -5,8 +5,8 @@ | |||
| <link rel="icon" type="image/svg+xml" href="/logo_1.jpg" /> | |||
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||
| <title>菊城人才市场后台管理</title> | |||
| <script type="module" crossorigin src="/assets/index-FqUzogG2.js"></script> | |||
| <link rel="stylesheet" crossorigin href="/assets/index-16BdRqwF.css"> | |||
| <script type="module" crossorigin src="/assets/index-hNvYYgrW.js"></script> | |||
| <link rel="stylesheet" crossorigin href="/assets/index-y3nhvaGm.css"> | |||
| </head> | |||
| <body> | |||
| <div id="app"></div> | |||
| @@ -16,7 +16,7 @@ | |||
| "echarts": "^5.4.3", | |||
| "he": "^1.2.0", | |||
| "moment": "^2.30.1", | |||
| "vue": "^3.2.36", | |||
| "vue": "^3.4.21", | |||
| "vue-router": "^4.2.5", | |||
| "vuex": "^4.1.0" | |||
| }, | |||
| @@ -4,7 +4,7 @@ | |||
| <template> | |||
| <a-config-provider :locale="zhCN"> | |||
| <router-view></router-view> | |||
| <router-view></router-view> | |||
| </a-config-provider> | |||
| </template> | |||
| @@ -145,32 +145,32 @@ export const PostJobapplicantAddcontact = postModel(url.JobapplicantAddcontact); | |||
| export const PostJobapplicantDelcontact = postModel(url.JobapplicantDelcontact); | |||
| export const PostJobapplicantUpdatecontact = postModel(url.JobapplicantUpdatecontact); | |||
| export const PostJobapplicantListcontact = getModel(url.JobapplicantListcontact); | |||
| export const PostJobapplicantContactdetail = getModel(url.JobapplicantContactdetail); | |||
| export const GetJobapplicantContactdetail = getModel(url.JobapplicantContactdetail); | |||
| // 证书技能 | |||
| export const PostJobapplicantAddskill = postModel(url.JobapplicantAddskill); | |||
| export const PostJobapplicantDelskill = postModel(url.JobapplicantDelskill); | |||
| export const PostJobapplicantUpdateskill = postModel(url.JobapplicantUpdateskill); | |||
| export const PostJobapplicantListskill = getModel(url.JobapplicantListskill); | |||
| export const PostJobapplicantSkilldetail = getModel(url.JobapplicantSkilldetail); | |||
| // 培训经历 | |||
| // 培训经历 | |||
| export const PostJobapplicantAddtraining = postModel(url.JobapplicantAddtraining); | |||
| export const PostJobapplicantDeltraining = postModel(url.JobapplicantDeltraining); | |||
| export const PostJobapplicantUpdatetraining = postModel(url.JobapplicantUpdatetraining); | |||
| export const PostJobapplicantListtraining = getModel(url.JobapplicantListtraining); | |||
| export const PostJobapplicantTrainingdetail = getModel(url.JobapplicantTrainingdetail); | |||
| // 求职意向-基本 | |||
| // 求职意向-基本 | |||
| export const PostJobapplicantAdddesirebase = postModel(url.JobapplicantAdddesirebase); | |||
| export const PostJobapplicantDeldesirebase = postModel(url.JobapplicantDeldesirebase); | |||
| export const PostJobapplicantUpdatedesirebase = postModel(url.JobapplicantUpdatedesirebase); | |||
| export const PostJobapplicantListdesirebase = getModel(url.JobapplicantListdesirebase); | |||
| // export const PostJobapplicantListdesirebase = getModel(url.JobapplicantListdesirebase); | |||
| export const PostJobapplicantDesirebasedetail = getModel(url.JobapplicantDesirebasedetail); | |||
| // 求职意向-地区 | |||
| // 求职意向-地区 | |||
| export const PostJobapplicantAdddesirearea = postModel(url.JobapplicantAdddesirearea); | |||
| export const PostJobapplicantDeldesirearea = postModel(url.JobapplicantDeldesirearea); | |||
| export const PostJobapplicantUpdatedesirearea = postModel(url.JobapplicantUpdatedesirearea); | |||
| export const PostJobapplicantListdesirearea = getModel(url.JobapplicantListdesirearea); | |||
| export const PostJobapplicantDesireareadetail = getModel(url.JobapplicantDesireareadetail); | |||
| // 求职意向-职位 | |||
| // 求职意向-职位 | |||
| export const PostJobapplicantAdddesireindustry = postModel(url.JobapplicantAdddesireindustry); | |||
| export const PostJobapplicantDeldesireindustry = postModel(url.JobapplicantDeldesireindustry); | |||
| export const PostJobapplicantUpdatedesireindustry = postModel(url.JobapplicantUpdatedesireindustry); | |||
| @@ -184,6 +184,7 @@ export const PostJobapplicantListexperience = getModel(url.JobapplicantListexper | |||
| export const PostJobapplicantExperiencedetail = getModel(url.JobapplicantExperiencedetail); | |||
| // 证书 | |||
| export const PostJobapplicantAddcertificate = postModel(url.JobapplicantAddcertificate); | |||
| export const PostJobapplicantDelcertificate = postModel(url.JobapplicantDelcertificate); | |||
| export const PostJobapplicantUpdatecertificate = postModel(url.JobapplicantUpdatecertificate); | |||
| export const PostJobapplicantListcertificate = getModel(url.JobapplicantListcertificate); | |||
| export const PostJobapplicantCertificatedetail = getModel(url.JobapplicantCertificatedetail); | |||
| @@ -195,7 +196,6 @@ export const PostJobapplicantDelintroduction = postModel(url.JobapplicantDelintr | |||
| export const PostJobapplicantUpdateintroduction = postModel(url.JobapplicantUpdateintroduction); // 个人介绍 | |||
| export const GetJobapplicantListintroduction = getModel(url.JobapplicantListintroduction); // 个人介绍 | |||
| export const GetJobapplicantIntroductiondetail = getModel(url.JobapplicantIntroductiondetail); // 个人详情 | |||
| // 统计 | |||
| export const GetStatsMajor = getModel(url.StatsMajor); | |||
| export const GetStatsCertificate = getModel(url.StatsCertificate); | |||
| @@ -224,7 +224,7 @@ export const GetFeedbackDetail = getModel(url.FeedbackDetail); | |||
| // 反馈 | |||
| export const PostCustomerAdd = postModel(url.CustomerAdd); | |||
| export const PostCustomerDel = postModel(url.CustomerDel); | |||
| export const GetCustomerUpdate = getModel(url.CustomerUpdate); | |||
| export const PostCustomerUpdate = postModel(url.CustomerUpdate); | |||
| export const GetCustomerList = getModel(url.CustomerList); | |||
| export const GetCustomerDetail = getModel(url.CustomerDetail); | |||
| @@ -131,64 +131,64 @@ export const url : urlType.url = { | |||
| 'JobseekerList': admin + '/jobseeker/list', // 查看 | |||
| 'JobseekerDetail': admin + '/jobseeker/detail', // 详情 | |||
| // 基本资料 | |||
| 'JobapplicantAdd': admin + '/jobapplicant/add', // 添加 | |||
| 'JobapplicantDel': admin + '/jobapplicant/del', // 删除 | |||
| 'JobapplicantUpdate': admin + '/jobapplicant/update', // 修改 | |||
| 'JobapplicantList': admin + '/jobapplicant/list', // 查看 | |||
| 'JobapplicantDetail': admin + '/jobapplicant/detail', // 详情 | |||
| 'JobapplicantAdd': admin + '/jobapplicant/add', // 添加 | |||
| 'JobapplicantDel': admin + '/jobapplicant/del', // 删除 | |||
| 'JobapplicantUpdate': admin + '/jobapplicant/update', // 修改 | |||
| 'JobapplicantList': admin + '/jobapplicant/list', // 查看 | |||
| 'JobapplicantDetail': admin + '/jobapplicant/detail', // 详情 | |||
| // 个人介绍 | |||
| 'JobapplicantAddintroduction': '/admin/jobapplicant/addintroduction', | |||
| 'JobapplicantDelintroduction': admin + '/jobapplicant/delintroduction', // 删除 | |||
| 'JobapplicantUpdateintroduction': admin + '/jobapplicant/updateintroduction', // 修改 | |||
| 'JobapplicantDelintroduction': admin + '/jobapplicant/delintroduction', // 删除 | |||
| 'JobapplicantUpdateintroduction': admin + '/jobapplicant/updateintroduction', // 修改 | |||
| 'JobapplicantListintroduction': '/admin/jobapplicant/listintroduction', | |||
| 'JobapplicantIntroductiondetail': '/admin/jobapplicant/introductiondetail', | |||
| // 联系信息 | |||
| 'JobapplicantAddcontact': admin + '/jobapplicant/addcontact', // 添加 | |||
| 'JobapplicantDelcontact': admin + '/jobapplicant/delcontact', // 删除 | |||
| 'JobapplicantUpdatecontact': admin + '/jobapplicant/updatecontact', // 修改 | |||
| 'JobapplicantListcontact': admin + '/jobapplicant/listcontact', // 查看 | |||
| 'JobapplicantContactdetail': admin + '/jobapplicant/contactdetail', // 详情 | |||
| 'JobapplicantAddcontact': admin + '/jobapplicant/addcontact', // 添加 | |||
| 'JobapplicantDelcontact': admin + '/jobapplicant/delcontact', // 删除 | |||
| 'JobapplicantUpdatecontact': admin + '/jobapplicant/updatecontact', // 修改 | |||
| 'JobapplicantListcontact': admin + '/jobapplicant/listcontact', // 查看 | |||
| 'JobapplicantContactdetail': admin + '/jobapplicant/contactdetail', // 详情 | |||
| // 专业技能 | |||
| 'JobapplicantAddskill': admin + '/jobapplicant/addskill', // 添加 | |||
| 'JobapplicantDelskill': admin + '/jobapplicant/delskill', // 删除 | |||
| 'JobapplicantUpdateskill': admin + '/jobapplicant/updateskill', // 修改 | |||
| 'JobapplicantListskill': admin + '/jobapplicant/listskill', // 查看 | |||
| 'JobapplicantSkilldetail': admin + '/jobapplicant/skilldetail', // 详情 | |||
| 'JobapplicantAddskill': admin + '/jobapplicant/addskill', // 添加 | |||
| 'JobapplicantDelskill': admin + '/jobapplicant/delskill', // 删除 | |||
| 'JobapplicantUpdateskill': admin + '/jobapplicant/updateskill', // 修改 | |||
| 'JobapplicantListskill': admin + '/jobapplicant/listskill', // 查看 | |||
| 'JobapplicantSkilldetail': admin + '/jobapplicant/skilldetail', // 详情 | |||
| // 培训经历 | |||
| 'JobapplicantAddtraining': admin + '/jobapplicant/addtraining', // 添加 | |||
| 'JobapplicantDeltraining': admin + '/jobapplicant/deltraining', // 删除 | |||
| 'JobapplicantUpdatetraining': admin + '/jobapplicant/updatetraining', // 修改 | |||
| 'JobapplicantListtraining': admin + '/jobapplicant/listtraining', // 查看 | |||
| 'JobapplicantTrainingdetail': admin + '/jobapplicant/trainingdetail', // 详情 | |||
| 'JobapplicantAddtraining': admin + '/jobapplicant/addtraining', // 添加 | |||
| 'JobapplicantDeltraining': admin + '/jobapplicant/deltraining', // 删除 | |||
| 'JobapplicantUpdatetraining': admin + '/jobapplicant/updatetraining', // 修改 | |||
| 'JobapplicantListtraining': admin + '/jobapplicant/listtraining', // 查看 | |||
| 'JobapplicantTrainingdetail': admin + '/jobapplicant/trainingdetail', // 详情 | |||
| // 求职意向-基本 | |||
| 'JobapplicantAdddesirebase': '/admin/jobapplicant/adddesirebase', // 添加 | |||
| 'JobapplicantDeldesirebase': '/admin/jobapplicant/deldesirebase', // 删除 | |||
| 'JobapplicantUpdatedesirebase': '/admin/jobapplicant/updatedesirebase', // 修改 | |||
| 'JobapplicantDesirebasedetail': '/admin/jobapplicant/desirebasedetail', // 详情 | |||
| // 求职意向-地区 | |||
| 'JobapplicantAdddesirearea': admin + '/jobapplicant/adddesirearea', // 添加 | |||
| 'JobapplicantDeldesirearea': admin + '/jobapplicant/deldesirearea', // 删除 | |||
| 'JobapplicantUpdatedesirearea': admin + '/jobapplicant/updatedesirearea', // 修改 | |||
| 'JobapplicantListdesirearea': admin + '/jobapplicant/listdesirearea', // 查看 | |||
| 'JobapplicantDesireareadetail': admin + '/jobapplicant/desireareadetail', // 详情 | |||
| 'JobapplicantAdddesirearea': admin + '/jobapplicant/adddesirearea', // 添加 | |||
| 'JobapplicantDeldesirearea': admin + '/jobapplicant/deldesirearea', // 删除 | |||
| 'JobapplicantUpdatedesirearea': admin + '/jobapplicant/updatedesirearea', // 修改 | |||
| 'JobapplicantListdesirearea': admin + '/jobapplicant/listdesirearea', // 查看 | |||
| 'JobapplicantDesireareadetail': admin + '/jobapplicant/desireareadetail', // 详情 | |||
| // 求职意向-职位 | |||
| 'JobapplicantAdddesireindustry': admin + '/jobapplicant/adddesireindustry', // 添加 | |||
| 'JobapplicantDeldesireindustry': admin + '/jobapplicant/deldesireindustry', // 删除 | |||
| 'JobapplicantUpdatedesireindustry': admin + '/jobapplicant/updatedesireindustry', // 修改 | |||
| 'JobapplicantListdesireindustry': admin + '/jobapplicant/listdesireindustry', // 查看 | |||
| 'JobapplicantDesireindustrydetail': admin + '/jobapplicant/desireindustrydetail', // 详情 | |||
| 'JobapplicantAdddesireindustry': admin + '/jobapplicant/adddesireposition', // 添加 | |||
| 'JobapplicantDeldesireindustry': admin + '/jobapplicant/deldesireposition', // 删除 | |||
| 'JobapplicantUpdatedesireindustry': admin + '/jobapplicant/updatedesireposition', // 修改 | |||
| 'JobapplicantListdesireindustry': admin + '/jobapplicant/listdesireposition', // 查看 | |||
| 'JobapplicantDesireindustrydetail': admin + '/jobapplicant/desirepositiondetail', // 详情 | |||
| // 证书 | |||
| 'JobapplicantAddcertificate': admin + '/jobapplicant/addcertificate', // 添加 | |||
| 'JobapplicantDelcertificate': admin + '/jobapplicant/delcertificate', // 删除 | |||
| 'JobapplicantUpdatecertificate': admin + '/jobapplicant/updatecertificate', // 修改 | |||
| 'JobapplicantListcertificate': admin + '/jobapplicant/listcertificate', // 查看 | |||
| 'JobapplicantCertificatedetail': admin + '/jobapplicant/certificatedetail', // 详情 | |||
| 'JobapplicantAddcertificate': admin + '/jobapplicant/addcertificate', // 添加 | |||
| 'JobapplicantDelcertificate': admin + '/jobapplicant/delcertificate', // 删除 | |||
| 'JobapplicantUpdatecertificate': admin + '/jobapplicant/updatecertificate', // 修改 | |||
| 'JobapplicantListcertificate': admin + '/jobapplicant/listcertificate', // 查看 | |||
| 'JobapplicantCertificatedetail': admin + '/jobapplicant/certificatedetail', // 详情 | |||
| // 工作经历 | |||
| 'JobapplicantAddexperience': admin + '/jobapplicant/addexperience', // 添加 | |||
| 'JobapplicantDelexperience': admin + '/jobapplicant/delexperience', // 删除 | |||
| 'JobapplicantUpdateexperience': admin + '/jobapplicant/updateexperience', // 修改 | |||
| 'JobapplicantListexperience': admin + '/jobapplicant/listexperience', // 查看 | |||
| 'JobapplicantExperiencedetail': admin + '/jobapplicant/experiencedetail', // 详情 | |||
| 'JobapplicantAddexperience': admin + '/jobapplicant/addexperience', // 添加 | |||
| 'JobapplicantDelexperience': admin + '/jobapplicant/delexperience', // 删除 | |||
| 'JobapplicantUpdateexperience': admin + '/jobapplicant/updateexperience', // 修改 | |||
| 'JobapplicantListexperience': admin + '/jobapplicant/listexperience', // 查看 | |||
| 'JobapplicantExperiencedetail': admin + '/jobapplicant/experiencedetail', // 详情 | |||
| // 统计 | |||
| StatsMajor: admin + '/stats/major', // 求职者专业统计 | |||
| @@ -1,5 +1,5 @@ | |||
| <template> | |||
| <a-c-form :createForm="createForm"> | |||
| <a-form :model="createForm" layout="vertical"> | |||
| <a-form-item required label="简历是否可见" name="简历是否可见"> | |||
| <a-radio-group v-model:value="createForm.hide_resume" button-style="solid"> | |||
| <a-radio-button value="1">是</a-radio-button> | |||
| @@ -25,7 +25,8 @@ | |||
| </a-radio-group> | |||
| </a-form-item> | |||
| <a-form-item required label="出生日期" name="dob"> | |||
| <a-date-picker v-model:value="createForm.dob" :locale="locale" :format="dateFormat" @panelChange="dobChange"/> | |||
| <a-date-picker v-model:value="createForm.dob" :locale="locale" :format="dateFormat" | |||
| @panelChange="dobChange" /> | |||
| </a-form-item> | |||
| <a-form-item required label="工作经验(年)" name="work_experience"> | |||
| <a-input v-model:value="createForm.work_experience" placeholder="请输入工作经验" /> | |||
| @@ -34,10 +35,10 @@ | |||
| <a-c-select :dict="2006" :placeholder="educationPlaceholder" @saveSelect="saveEducation"></a-c-select> | |||
| </a-form-item> | |||
| <a-form-item label="户口所在地"> | |||
| <a-c-cascader :dict="2009" @saveCascader="regLevelSave" placeholder="请选择户口所在地" ></a-c-cascader> | |||
| <a-c-cascader :dict="2009" @saveCascader="regLevelSave" placeholder="请选择户口所在地"></a-c-cascader> | |||
| </a-form-item> | |||
| <a-form-item label="现居地"> | |||
| <a-c-cascader :dict="2009" @saveCascader="nowLevelSave" placeholder="请选择现居地" ></a-c-cascader> | |||
| <a-c-cascader :dict="2009" @saveCascader="nowLevelSave" placeholder="请选择现居地"></a-c-cascader> | |||
| </a-form-item> | |||
| <a-form-item label="职称"> | |||
| <a-c-select :dict="2014" :placeholder="titlePlaceholder" @saveSelect="saveTitle"></a-c-select> | |||
| @@ -60,13 +61,13 @@ | |||
| @saveSelect="savePoliticalStatus"></a-c-select> | |||
| </a-form-item> | |||
| <a-form-item label="籍贯"> | |||
| <a-c-cascader :dict="2009" @saveCascader="nativePlaceSave" placeholder="请选择籍贯"></a-c-cascader> | |||
| <a-c-cascader :dict="2009" @saveCascader="nativePlaceSave" placeholder="请选择籍贯"></a-c-cascader> | |||
| </a-form-item> | |||
| <a-form-item :wrapper-col="{ span: 14, offset: 4 }"> | |||
| <a-button type="primary" @click="onSubmit">保存</a-button> | |||
| <a-button style="margin-left: 10px">重置</a-button> | |||
| </a-form-item> | |||
| </a-c-form> | |||
| </a-form> | |||
| </template> | |||
| <script lang="ts" setup> | |||
| @@ -133,14 +134,14 @@ | |||
| native_place: 0 | |||
| } | |||
| } | |||
| // 出生日期 | |||
| const dateFormat = ref('YYYY-MM-DD'); | |||
| const dobChange = (val) => { | |||
| moment(val, 'YYYY-MM-DD'); | |||
| console.log(val) | |||
| } | |||
| // 学历 | |||
| const educationPlaceholder = ref('请选择学历'); | |||
| const saveEducation = (data) => { | |||
| @@ -0,0 +1,60 @@ | |||
| <template> | |||
| <a-cascader v-model:value="cascaderParentId" @change="parentChange" :options="listOptions" | |||
| :fieldNames="listFieldNames" :changeOnSelect="true" :placeholder="placeholder" style="width: 100%" | |||
| change-on-select :size="size" /> | |||
| </template> | |||
| <script lang="ts" setup> | |||
| import { ref, onMounted, defineProps, watch, defineEmits } from 'vue'; | |||
| import { GetDictTree } from '@/apis/models'; | |||
| const props = defineProps({ | |||
| dict: { | |||
| type: String, | |||
| default: '' | |||
| }, | |||
| placeholder: { | |||
| type: String, | |||
| default: '' | |||
| }, | |||
| cascader_content: { | |||
| type: Array, | |||
| default: [] | |||
| }, | |||
| size: { | |||
| type: String, | |||
| default: 'mini' | |||
| }, | |||
| }); | |||
| let listOptions = ref([]); | |||
| let cascaderParentId = ref<Number>([]); | |||
| const listFieldNames = ref({ label: 'name', value: 'id', children: 'children' }); | |||
| let placeholder = ref('请选择'); | |||
| let size = ref('large'); | |||
| watch(() => [props.dict, props.cascader_content, props.placeholder, props.size], | |||
| (newVal, oldVal) => { | |||
| GetDictTree({ | |||
| code: newVal[0] | |||
| }).then(res => { | |||
| listOptions.value = res.data.dicts | |||
| }) | |||
| cascaderParentId.value = newVal[1] | |||
| placeholder.value = newVal[2] | |||
| size.value = newVal[3] | |||
| },{immediate: true}) | |||
| onMounted(() => { | |||
| GetDictTree({ | |||
| code: props.dict | |||
| }).then(res => { | |||
| listOptions.value = res.data.dicts | |||
| }) | |||
| }) | |||
| const emit = defineEmits(); | |||
| const parentChange = (val, selectedOptions) => { | |||
| console.log(val) | |||
| emit('saveCascader', { arr1: val, arr2: selectedOptions }); | |||
| } | |||
| </script> | |||
| <style> | |||
| </style> | |||
| @@ -22,6 +22,7 @@ import ACSelectCommon from '@/components/cSelect/common.vue'; | |||
| import UploadOne from '@/components/upload/one.vue'; | |||
| import UploadFile from '@/components/upload/file.vue'; | |||
| import ImageContainer from '@/components/form/image-container.vue'; | |||
| import AJilian from '@/components/form/jilian.vue'; | |||
| import { Model } from 'node_modules/echarts/index'; | |||
| // router.beforeEach(async (to, from, next) => { | |||
| // document.title = `${to.meta.title} - 菊城人才市场后台管理`; | |||
| @@ -87,6 +88,7 @@ app.component('a-c-select-common', ACSelectCommon); | |||
| app.component('QuillEditor', QuillEditor) | |||
| app.component('upload-one', UploadOne) | |||
| app.component('upload-file', UploadFile) | |||
| app.component('a-jilian', AJilian); | |||
| app.use(router); | |||
| app.use(store); | |||
| app.use(Antd); | |||
| @@ -159,6 +159,15 @@ const JokSeekerRoute : AppRouteRecordRaw = { | |||
| icon: HomeOutlined | |||
| }, | |||
| }, | |||
| { | |||
| path: '/customer/list', | |||
| name: 'customerList', | |||
| component: routerList.CustomerList, | |||
| meta: { | |||
| title: '账号列表', | |||
| icon: HomeOutlined | |||
| }, | |||
| } | |||
| ] | |||
| }; | |||
| @@ -81,3 +81,10 @@ button:focus-visible { | |||
| background-color: #f9f9f9; | |||
| } | |||
| } | |||
| .resume-form { | |||
| background-color: #f8f8f8; | |||
| padding: 16px; | |||
| margin: 16px 0; | |||
| border-radius: 8px; | |||
| } | |||
| @@ -457,7 +457,7 @@ | |||
| // 学历要求 | |||
| const saveSchoolDegree = (data) => { | |||
| createForm.value.school_degree = data.val.keyl; | |||
| createForm.value.school_degree = data.val.key; | |||
| } | |||
| // 职称要求 | |||
| @@ -1,5 +1,5 @@ | |||
| declare namespace CustomerListType { | |||
| type addrFormType = { | |||
| type addFormType = { | |||
| role?: Number, | |||
| mobile?: String, | |||
| username?: String, | |||
| @@ -3,14 +3,6 @@ | |||
| @cancel="cancelModal" width="50%"> | |||
| <a-form :model="createForm" :label-col="{span: 4}" labelAlign="right"> | |||
| <a-row gutter="20"> | |||
| <a-col span="24"> | |||
| <a-form-item required label="角色" name="role"> | |||
| <a-select v-model:value="createForm.role" placeholder="请选择角色"> | |||
| <a-select-option v-for="(item,index) in role_list" :key="id" | |||
| :value="item.id">{{item.name}}</a-select-option> | |||
| </a-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-form-item required label="手机号" name="mobile"> | |||
| <a-input v-model:value="createForm.mobile" placeholder="请输入手机号" /> | |||
| @@ -34,23 +26,13 @@ | |||
| <script setup lang="ts"> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue'; | |||
| import { PostCustomerAdd, GetCustomerUpdate,GetCustomerDetail, GetRoleList } from '@/apis/models'; | |||
| import { PostCustomerAdd, PostCustomerUpdate,GetCustomerDetail } from '@/apis/models'; | |||
| import { dataForm, otherDataForm, reset } from '@/views/customer/list/add/data.ts'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, openAddModel, hideModal, message, richOption } = useCommon(); | |||
| const emit = defineEmits(); | |||
| let props = defineProps(['edit_record']); | |||
| let title = ref<String>('新增账号'); | |||
| let role_list = ref([]) | |||
| onMounted(() => { | |||
| getRole() | |||
| }) | |||
| const getRole = () => { | |||
| GetRoleList({page: 1, pagesize: 100}).then(res => { | |||
| role_list.value = res.data.roles | |||
| }) | |||
| } | |||
| let title = ref<String>('新增求职者账号'); | |||
| let createForm = ref<CustomerListType.addFormType>(dataForm) | |||
| @@ -65,7 +47,7 @@ | |||
| }).catch(err => { | |||
| }) | |||
| } else { | |||
| GetCustomerUpdate(createForm.value).then(res => { | |||
| PostCustomerUpdate(createForm.value).then(res => { | |||
| message.success('修改账号成功'); | |||
| hideModal(); | |||
| resetForm(); | |||
| @@ -90,22 +72,18 @@ | |||
| }) | |||
| watch(() => props.edit_record, (newVal) => { | |||
| GetRoleList() | |||
| if (newVal) { | |||
| title.value = '编辑账号'; | |||
| title.value = '编辑求职者账号'; | |||
| createForm.value = { | |||
| id: newVal.id, | |||
| name: newVal.name, | |||
| address: newVal.address, | |||
| telephone:newVal.telephone, | |||
| fax: newVal.fax, | |||
| postal: newVal.postal, | |||
| role: 1, | |||
| mobile: newVal.mobile, | |||
| username: newVal.username, | |||
| password: newVal.password, | |||
| email: newVal.email, | |||
| content: newVal.content, | |||
| } | |||
| } else { | |||
| title.value = '新增账号'; | |||
| title.value = '新增求职者账号'; | |||
| } | |||
| }) | |||
| </script> | |||
| @@ -1,6 +1,6 @@ | |||
| export let dataForm = { | |||
| role: null, | |||
| role: 1, | |||
| mobile: '', | |||
| username: '', | |||
| password: '', | |||
| @@ -12,7 +12,7 @@ export let otherDataForm = { | |||
| export const reset = () => { | |||
| dataForm = { | |||
| role: null, | |||
| role: 1, | |||
| mobile: '', | |||
| username: '', | |||
| password: '', | |||
| @@ -1,15 +1,28 @@ | |||
| export const cols = <ColType.type[]>[ | |||
| { | |||
| title: '用户', | |||
| dataIndex: 'name' | |||
| dataIndex: 'username' | |||
| }, | |||
| { | |||
| title: '邮箱', | |||
| dataIndex: 'email' | |||
| }, | |||
| { | |||
| title: '消息内容', | |||
| dataIndex: 'content' | |||
| title: '联系方式', | |||
| dataIndex: 'mobile' | |||
| }, | |||
| { | |||
| title: '登录次数', | |||
| dataIndex: 'login_count' | |||
| }, | |||
| { | |||
| title: '账号状态', | |||
| dataIndex: 'status', | |||
| slots: { customRender: 'status' }, | |||
| }, | |||
| { | |||
| title: '注册日期', | |||
| dataIndex: 'created_at' | |||
| }, | |||
| { | |||
| title: '操作', | |||
| @@ -1,14 +1,32 @@ | |||
| <template> | |||
| <list-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></list-search> | |||
| <a-c-operation @refresh="clearData"> | |||
| </a-c-operation> | |||
| <a-c-table :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||
| @page="getPage" :loading="loading"> | |||
| <template #status="{ record }"> | |||
| <div v-if="record.status == 1"> | |||
| <a-popconfirm title="是否禁用该求职者账号?" @confirm="handleUser(record, 2)"> | |||
| <a-space> | |||
| <a-tag color="green" >使用中</a-tag> | |||
| <a-button type="primary" size="small" danger>禁用该账号</a-button> | |||
| </a-space> | |||
| </a-popconfirm> | |||
| </div> | |||
| <div v-if="record.status == 2"> | |||
| <a-popconfirm title="是否启用该求职者账号?" @confirm="handleUser(record, 1)"> | |||
| <a-space> <a-tag color="red">已禁用</a-tag> | |||
| <a-button type="primary" size="small">启用该账号</a-button> | |||
| </a-space> | |||
| </a-popconfirm> | |||
| </div> | |||
| </template> | |||
| <template #default="{ record }"> | |||
| <a-row :gutter="10"> | |||
| <a-col><a-button type="primary" size="small" primary @click="edit(record)">编辑</a-button></a-col> | |||
| <a-popconfirm title="是否删除该反馈消息?" @confirm="del(record.id)"> | |||
| <a-popconfirm title="是否删除该求职者账号?" @confirm="del(record.id)"> | |||
| <a-col><a-button type="primary" size="small" danger>删除</a-button></a-col> | |||
| </a-popconfirm> | |||
| </a-row> | |||
| @@ -19,13 +37,14 @@ | |||
| <script lang="ts" setup> | |||
| import { ref, onMounted, watch, computed } from 'vue'; | |||
| import { ref, onMounted, watch, computed, createVNode } from 'vue'; | |||
| import ListSearch from '@/views/customer/list/search/index.vue'; | |||
| import ListAdd from '@/views/customer/list/add/add.vue'; | |||
| import { GetCustomerList, GetCustomerDetail, PostCustomerDel } from '@/apis/models'; | |||
| import { GetCustomerList, GetCustomerDetail, PostCustomerUpdate, PostCustomerDel } from '@/apis/models'; | |||
| import { UserOutlined, DownOutlined } from '@ant-design/icons-vue'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| import { cols } from '@/views/customer/list/columns'; | |||
| let { store, commomParams, showModal, showOtherModal1, message } = useCommon(); | |||
| let { store, commomParams, showModal, showOtherModal1, message, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| let loading = ref<Boolean>(true); | |||
| onMounted(() => { | |||
| getData(commomParams.value.search); | |||
| @@ -44,7 +63,7 @@ | |||
| page: 1, | |||
| pagesize: 10, | |||
| sort: 'id', | |||
| sortby: 'asc', | |||
| sortby: 'desc', | |||
| keyword: '' | |||
| } | |||
| } | |||
| @@ -62,7 +81,7 @@ | |||
| loading.value = true; | |||
| let res = await GetCustomerList(commomParams.value.search); | |||
| loading.value = false; | |||
| commomParams.value.table.data = res.data.feedbacks; | |||
| commomParams.value.table.data = res.data.customers; | |||
| commomParams.value.table.columns = cols; | |||
| commomParams.value.page = { | |||
| current: commomParams.value.search.page, | |||
| @@ -91,6 +110,14 @@ | |||
| edit_record.value = null; | |||
| } | |||
| // 禁用 | |||
| const handleUser = (record : object, status : Number) => { | |||
| PostCustomerUpdate({ id: record.id, status: status }).then(res => { | |||
| getData(); | |||
| Modal.destroyAll(); | |||
| }) | |||
| } | |||
| // 删除 | |||
| const del = (id : number) => { | |||
| @@ -100,8 +127,6 @@ | |||
| getData(); | |||
| }) | |||
| } | |||
| </script> | |||
| <style lang="less" scoped> | |||
| @@ -1,15 +1,25 @@ | |||
| <template> | |||
| <a-drawer :width="500" title="搜索" placement="right" :open="openSearchModel" @close="onClose"> | |||
| <template #extra> | |||
| <a-button style="margin-right: 8px" @click="clearSearch">清空搜索</a-button> | |||
| <a-button type="primary" @click="getData">搜索</a-button> | |||
| <a-button style="margin-right: 8px" @click="clearSearch">清空搜索</a-button> | |||
| <a-button type="primary" @click="getData">搜索</a-button> | |||
| </template> | |||
| <a-form :model="commomParams.search"> | |||
| <a-row :gutter="[10]"> | |||
| <a-col span="24"> | |||
| <a-form-item> | |||
| <a-input addon-before="配置项名称" v-model:value="commomParams.search.keyword" | |||
| placeholder="请输入配置项名称" /> | |||
| <a-input addon-before="关键字" v-model:value="commomParams.search.keyword" | |||
| placeholder="请输入关键字" @keyup.enter="getData"/> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-form-item> | |||
| <a-select v-model:value="commomParams.search.status" placeholder="请选择账号状态" | |||
| @change="statusChange"> | |||
| <a-select-option :value="0">全部</a-select-option> | |||
| <a-select-option :value="1">使用中</a-select-option> | |||
| <a-select-option :value="2">已禁用</a-select-option> | |||
| </a-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| </a-row> | |||
| @@ -28,11 +38,16 @@ | |||
| return store.state.openSearchModel; | |||
| }) | |||
| interface listType { | |||
| status : Number | 0, | |||
| } | |||
| commomParams.value.search = commomParams.value.search as listType; | |||
| commomParams.value.search.status = null; | |||
| watch(() => props.search_params, (newVal) => { | |||
| emit('searchData', commomParams.value.search) | |||
| }) | |||
| // watch(() => props.search_params, (newVal) => { | |||
| // emit('searchData', commomParams.value.search) | |||
| // }) | |||
| const getData = () => { | |||
| emit('searchData', commomParams.value.search); | |||
| @@ -45,7 +60,7 @@ | |||
| page: 1, | |||
| pagesize: 10, | |||
| sort: 'id', | |||
| sortby: 'asc', | |||
| sortby: 'desc', | |||
| keyword: '' | |||
| } | |||
| } | |||
| @@ -54,6 +69,10 @@ | |||
| clearSearch() | |||
| hideSearch() | |||
| } | |||
| const statusChange = (val) => { | |||
| getData() | |||
| } | |||
| </script> | |||
| <style> | |||
| @@ -1,9 +1,22 @@ | |||
| <template> | |||
| <a-modal v-model:visible="show_add" title="新增求职简历" ok-text="提交" cancel-text="取消" | |||
| @cancel="hideModal" width="100%" > | |||
| <a-collapse v-model:activeKey="activeKey" accordion> | |||
| <a-modal v-model:visible="openAddModel" :title="title" ok-text="提交" cancel-text="取消" @ok="sumbitForm" :footer="null" | |||
| @cancel="cancelModal" width="80%"> | |||
| <a-space direction="vertical" style="width: 100%;"> | |||
| <a-segmented v-model:value="activeKey" @change="resumeModeChange" :options="['基本资料', '联系信息','个人简介', '专业技能掌握程度','培训经历', '求职意向','工作经历', '证书']" size="large" block> | |||
| </a-segmented> | |||
| <resume-basic v-if="openAddModel && activeKey == '基本资料'" :customer_record="customer_record"></resume-basic> | |||
| <resume-contact v-if="openAddModel && activeKey == '联系信息'" :customer_record="customer_record"></resume-contact> | |||
| <resume-introduction v-if="openAddModel && activeKey == '个人简介'" :customer_record="customer_record"></resume-introduction> | |||
| <resume-skill v-if="openAddModel && activeKey == '专业技能掌握程度'" :customer_record="customer_record"></resume-skill> | |||
| <resume-train v-if="openAddModel && activeKey == '培训经历'" :customer_record="customer_record"></resume-train> | |||
| <resume-intention v-if="openAddModel && activeKey == '求职意向'" :customer_record="customer_record"></resume-intention> | |||
| <resume-experience v-if="openAddModel && activeKey=='工作经历'" :customer_record=" customer_record"></resume-experience> | |||
| <resume-credential v-if="openAddModel && activeKey == '证书'" :customer_record="customer_record"></resume-credential> | |||
| </a-space> | |||
| <!-- <a-collapse v-model:activeKey="activeKey" accordion> | |||
| <a-collapse-panel key="1" header="基本资料"> | |||
| <resume-basic @toNext="toNext" :customer_record="customer_record"></resume-basic> | |||
| </a-collapse-panel> | |||
| <a-collapse-panel key="2" header="联系信息"> | |||
| <resume-contact @toNext="toNext" :customer_record="customer_record"></resume-contact> | |||
| @@ -26,11 +39,12 @@ | |||
| <a-collapse-panel key="8" header="证书"> | |||
| <resume-credential @toNext="toNext" :customer_record="customer_record"></resume-credential> | |||
| </a-collapse-panel> | |||
| </a-collapse> | |||
| </a-collapse> --> | |||
| </a-modal> | |||
| </template> | |||
| <script setup lang="ts"> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue'; | |||
| import ResumeBasic from '@/views/jobSeeker/resume/add/basic/basic.vue'; | |||
| import ResumeContact from '@/views/jobSeeker/resume/add/contact/contact.vue'; | |||
| import ResumeCredential from '@/views/jobSeeker/resume/add/credential/credential.vue'; | |||
| @@ -39,31 +53,38 @@ | |||
| import ResumeIntroduction from '@/views/jobSeeker/resume/add/introduction/introduction.vue'; | |||
| import ResumeSkill from '@/views/jobSeeker/resume/add/skill/skill.vue'; | |||
| import ResumeTrain from '@/views/jobSeeker/resume/add/train/train.vue'; | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue'; | |||
| import { PostRoleAdd, updateRole } from '@/apis/models'; | |||
| import { message } from 'ant-design-vue'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, openAddModel, hideModal, dayjs, disabledDate, richOption, message, imageprefix } = useCommon(); | |||
| const emit = defineEmits(); | |||
| let props = defineProps(['edit_record']); | |||
| let show_add = ref<Boolean>(true) | |||
| let activeKey = ref<String>("1") | |||
| let title = ref<String>('编辑简历'); | |||
| let activeKey = ref<String>("基本资料") | |||
| let customer_record = ref<Object>(props.edit_record) | |||
| onMounted(() => { | |||
| if (props.edit_record) { | |||
| openAddModel = computed(() => { | |||
| return store.state.openAddModel; | |||
| }) | |||
| watch(() => props.edit_record, async (newVal) => { | |||
| if (newVal) { | |||
| title.value = '编辑简历'; | |||
| customer_record.value = props.edit_record | |||
| } else { | |||
| title.value = '编辑简历'; | |||
| } | |||
| }) | |||
| const toNext = (data) => { | |||
| console.log(data) | |||
| activeKey.value = data.activeKey | |||
| } | |||
| const hideModal = () => { | |||
| show_add.value = false; | |||
| emit('closeAdd', { show: false }); | |||
| const resumeModeChange = (data) => { | |||
| activeKey.value = data | |||
| } | |||
| const cancelModal = () => { | |||
| emit('closeAdd'); | |||
| hideModal(); | |||
| } | |||
| </script> | |||
| <style> | |||
| @@ -1,5 +1,5 @@ | |||
| declare namespace basicType { | |||
| type addBasicType = { | |||
| declare namespace JobseekerBasicType { | |||
| type JobseekerBasicFormType = { | |||
| id ?: Number, | |||
| customer_id ?: Number, | |||
| hide_resume ?: Number, | |||
| @@ -27,4 +27,9 @@ declare namespace basicType { | |||
| political_status ?: Number, | |||
| native_place ?: Number, | |||
| } | |||
| type OtherFormType = { | |||
| dob?: String, | |||
| reg_level_cascader?: String, | |||
| } | |||
| } | |||
| @@ -1,268 +1,208 @@ | |||
| <template> | |||
| <a-form :model="createForm" :label-col="{span: 4}" labelAlign="left"> | |||
| <a-row gutter="20"> | |||
| <a-col span="24"> | |||
| <a-form-item required label="简历是否可见" name="hide_resume" :label-col="{span: 0}"> | |||
| <a-radio-group v-model:value="createForm.hide_resume" button-style="solid"> | |||
| <a-radio-button :value="1">是</a-radio-button> | |||
| <a-radio-button :value="2">否</a-radio-button> | |||
| </a-radio-group> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-form-item required label="家政版块是否可见" name="house_keeping_status" :label-col="{span: 0}"> | |||
| <a-radio-group v-model:value="createForm.house_keeping_status" button-style="solid"> | |||
| <a-radio-button :value="1">是</a-radio-button> | |||
| <a-radio-button :value="2">否</a-radio-button> | |||
| </a-radio-group> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-form-item required label="性别" name="createForm.gender" :label-col="{span: 0}"> | |||
| <a-radio-group v-model:value="createForm.gender" button-style="solid"> | |||
| <a-radio-button value="男">男</a-radio-button> | |||
| <a-radio-button value="女">女</a-radio-button> | |||
| </a-radio-group> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="出生日期" name="dob"> | |||
| <a-date-picker v-model:value="createForm.dob" @Change="dobChange" style="width: 100%;" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <div style="width: 100%;"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="24"> | |||
| <a-form-item required label="上传相片" name="photo"> | |||
| <upload upload_txt="上传相片" @uploadSuccess="uploadPhotoSuccess" | |||
| :success_image="addOtherForm.photo_img" images_length="1" image_type="1"></upload> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="简历是否可见" name="hide_resume"> | |||
| <a-radio-group v-model:value="createForm.hide_resume" button-style="solid" size="mini"> | |||
| <a-radio-button :value="1" style="width: 50%;">是</a-radio-button> | |||
| <a-radio-button :value="2" style="width: 50%;">否</a-radio-button> | |||
| </a-radio-group> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="家政版块是否可见" name="house_keeping_status"> | |||
| <a-radio-group v-model:value="createForm.house_keeping_status" button-style="solid" | |||
| size="mini"> | |||
| <a-radio-button :value="1" style="width: 50%;">是</a-radio-button> | |||
| <a-radio-button :value="2" style="width: 50%;">否</a-radio-button> | |||
| </a-radio-group> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="性别" name="gender"> | |||
| <a-radio-group v-model:value="createForm.gender" button-style="solid" size="mini" | |||
| > | |||
| <a-radio-button value="男" style="width: 50%;">男</a-radio-button> | |||
| <a-radio-button value="女" style="width: 50%;">女</a-radio-button> | |||
| </a-radio-group> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="姓名"> | |||
| <a-input v-model:value="createForm.name" placeholder="请输入姓名" size="mini" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="出生日期" name="dob"> | |||
| <a-date-picker v-model:value="addOtherForm.dob" @Change="dobChange" style="width: 100%;" | |||
| size="mini" :disabledDate="disabledDateFront" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="身份证" name="id_number"> | |||
| <a-input v-model:value="createForm.id_number" placeholder="请输入身份证" size="mini" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="工作经验(年)" name="work_experience"> | |||
| <a-input-number :min="0" type="number" v-model:value="createForm.work_experience" | |||
| placeholder="请输入工作经验" style="width: 100%;" size="mini" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="学历" name="education"> | |||
| <a-xuanze :dict="2006" placeholder="请选择学历" @saveSelect="saveEducation" | |||
| :select_content="createForm.education"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="户口所在地"> | |||
| <a-jilian :dict="2009" @saveCascader="regLevelSave" placeholder="请选择户口所在地" | |||
| :cascader_content="addOtherForm.reg_level_cascader"></a-jilian> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="现居地"> | |||
| <a-jilian :dict="2009" @saveCascader="nowLevelSave" placeholder="请选择现居地" | |||
| :cascader_content="addOtherForm.now_level_cascader"></a-jilian> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="职称"> | |||
| <a-xuanze :dict="2014" placeholder="请选择职称" @saveSelect="saveTitle" | |||
| :select_content="createForm.title"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="婚姻状况"> | |||
| <a-xuanze :dict="2011" placeholder="请选择婚姻状况" @saveSelect="saveMaritalStatus" | |||
| :select_content="createForm.marital_status"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="民族"> | |||
| <a-xuanze :dict="208" placeholder="请选择民族" @saveSelect="saveEthnicity" | |||
| :select_content="createForm.ethnicity"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="姓名" name="name"> | |||
| <a-input v-model:value="createForm.name" placeholder="请输入姓名" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="身份证" name="id_number"> | |||
| <a-input v-model:value="createForm.id_number" placeholder="请输入身份证" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="工作经验" name="work_experience"> | |||
| <a-input-number :min="0" type="number" v-model:value="createForm.work_experience" | |||
| placeholder="请输入工作经验" style="width: 100%;" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="学历" name="education"> | |||
| <a-c-select :dict="2006" :placeholder="educationPlaceholder" | |||
| @saveSelect="saveEducation"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="户口所在地"> | |||
| <a-c-cascader :dict="2009" @saveCascader="regLevelSave" placeholder="请选择户口所在地"></a-c-cascader> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="现居地"> | |||
| <a-c-cascader :dict="2009" @saveCascader="nowLevelSave" placeholder="请选择现居地"></a-c-cascader> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="职称"> | |||
| <a-c-select :dict="2014" :placeholder="titlePlaceholder" @saveSelect="saveTitle"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="婚姻状况"> | |||
| <a-c-select :dict="2011" :placeholder="maritalStatusPlaceholder" | |||
| @saveSelect="saveMaritalStatus"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="民族"> | |||
| <a-c-select :dict="2012" :placeholder="ethnicityPlaceholder" | |||
| @saveSelect="saveEthnicity"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="政治面貌"> | |||
| <a-c-select :dict="2010" :placeholder="politicalStatusPlaceholder" | |||
| @saveSelect="savePoliticalStatus"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="籍贯"> | |||
| <a-c-cascader :dict="2009" @saveCascader="nativePlaceSave" placeholder="请选择籍贯"></a-c-cascader> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="身高(厘米cm)"> | |||
| <a-input-number :min="0" type="number" v-model:value="createForm.height" placeholder="请输入身高" | |||
| style="width: 100%;" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="体重(千克kg)"> | |||
| <a-input-number :min="0" type="number" v-model:value="createForm.weight" placeholder="请输入体重" | |||
| style="width: 100%;" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| </a-row> | |||
| <a-row gutter="20"> | |||
| <a-col> | |||
| <a-button type="primary" @click="onSubmit">保存</a-button> | |||
| </a-col> | |||
| <a-col> | |||
| <a-button style="margin-left: 10px">重置</a-button> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| <a-col span="8"> | |||
| <a-form-item label="政治面貌"> | |||
| <a-xuanze :dict="2010" placeholder="请选择政治面貌" @saveSelect="savePoliticalStatus" | |||
| :select_content="createForm.political_status"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="籍贯"> | |||
| <a-jilian :dict="2009" @saveCascader="nativePlaceSave" placeholder="请选择籍贯" | |||
| :cascader_content="addOtherForm.native_place_txt"></a-jilian> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="身高(厘米cm)"> | |||
| <a-input-number :min="0" type="number" v-model:value="createForm.height" placeholder="请输入身高" | |||
| style="width: 100%;" size="mini" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="体重(千克kg)"> | |||
| <a-input-number :min="0" type="number" v-model:value="createForm.weight" placeholder="请输入体重" | |||
| style="width: 100%;" size="mini" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm" size="mini">取消</a-button> | |||
| <a-button type="primary" @click="sumbitForm" size="mini">保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| </div> | |||
| </template> | |||
| <script lang="ts" setup> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue'; | |||
| import { message } from 'ant-design-vue'; | |||
| import { PostJobapplicantAdd, PostJobapplicantUpdate } from '@/apis/models'; | |||
| import dayjs from 'dayjs'; | |||
| import 'dayjs/locale/zh-cn'; | |||
| <script setup lang="ts"> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue'; | |||
| import { PostJobapplicantAdd, PostJobapplicantUpdate, GetJobapplicantDetail } from '@/apis/models'; | |||
| import Upload from '@/components/upload/one.vue'; | |||
| import { intersectionAlike } from '@/utils/dataHelper'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/basic/data.ts'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, dayjs, richOption, ExclamationCircleOutlined, Modal, imageprefix, disabledDateFront } = useCommon(); | |||
| const dayjsRef = ref(dayjs); | |||
| let props = defineProps(['customer_record']); | |||
| const emit = defineEmits(); | |||
| dayjs.locale('zh-cn'); | |||
| let createForm = ref<basicType.addBasicType>({ | |||
| id: 0, | |||
| customer_id: 0, | |||
| hide_resume: 0, | |||
| house_keeping_status: 0, | |||
| photo: 'aaa.jpg', | |||
| name: '', | |||
| id_number: '', | |||
| gender: "女", | |||
| dob: '', | |||
| work_experience: 0, | |||
| education: 0, | |||
| reg_level1: 0, | |||
| reg_level2: 0, | |||
| reg_level3: 0, | |||
| reg_level4: 0, | |||
| now_level1: 0, | |||
| now_level2: 0, | |||
| now_level3: 0, | |||
| now_level4: 0, | |||
| title: 0, | |||
| marital_status: 0, | |||
| ethnicity: 0, | |||
| height: 0, | |||
| weight: 0, | |||
| political_status: 0, | |||
| native_place: 0 | |||
| }) | |||
| let createForm = ref<JobseekerBasicType.JobseekerBasicFormType>(dataForm) | |||
| let addOtherForm = ref<JobseekerBasicType.OtherFormType>(otherDataForm) | |||
| onMounted(() => { | |||
| if (props.customer_record) { | |||
| createForm.value = { | |||
| id: props.customer_record.id, | |||
| customer_id: props.customer_record.customer_id, | |||
| hide_resume: props.customer_record.hide_resume, | |||
| house_keeping_status: props.customer_record.house_keeping_status, | |||
| photo: props.customer_record.photo?props.customer_record.photo: 'aaa.jpg', | |||
| name: props.customer_record.seekername, | |||
| id_number: props.customer_record.id_number, | |||
| gender: props.customer_record.gender, | |||
| dob: props.customer_record.dob, | |||
| work_experience: props.customer_record.work_experience, | |||
| education: props.customer_record.education, | |||
| reg_level1: props.customer_record.reg_level1, | |||
| reg_level2: props.customer_record.reg_level2, | |||
| reg_level3: props.customer_record.reg_level3, | |||
| reg_level4: props.customer_record.reg_level4, | |||
| now_level1: props.customer_record.now_level1, | |||
| now_level2: props.customer_record.now_level2, | |||
| now_level3: props.customer_record.now_level3, | |||
| now_level4: props.customer_record.now_level4, | |||
| title: props.customer_record.title, | |||
| marital_status: props.customer_record.marital_status, | |||
| ethnicity: props.customer_record.ethnicity, | |||
| height: props.customer_record.height, | |||
| weight: props.customer_record.weight, | |||
| political_status: props.customer_record.political_status, | |||
| native_place: props.customer_record.native_place | |||
| } | |||
| } | |||
| getBasic() | |||
| }) | |||
| const onSubmit = () => { | |||
| PostJobapplicantUpdate(createForm.value).then(res => { | |||
| message.success('基本资料编辑成功') | |||
| emit('toNext', {activeKey: "2"}) | |||
| const getBasic = () => { | |||
| GetJobapplicantDetail({customer_id: props.customer_record.customer_id}).then(res => { | |||
| createForm.value = intersectionAlike(createForm.value, res.data) | |||
| createForm.value.id = res.data.id; | |||
| createForm.value.customer_id = res.data.customer_id; | |||
| addOtherForm.value = { | |||
| dob: dayjsRef.value(res.data.dob), | |||
| reg_level_cascader: [res.data.reg_level1, res.data.reg_level2, res.data.reg_level3, res.data.reg_level4], | |||
| now_level_cascader: [res.data.now_level1, res.data.now_level2, res.data.now_level3, res.data.now_level4], | |||
| native_place_txt: res.data.native_place_txt, | |||
| photo_img: imageprefix + res.data.photo | |||
| } | |||
| }) | |||
| } | |||
| const resetForm = () => { | |||
| createForm.value = { | |||
| id: 0, | |||
| customer_id: 0, | |||
| hide_resume: 0, | |||
| house_keeping_status: 0, | |||
| photo: 'aaa.jpg', | |||
| name: '', | |||
| id_number: '', | |||
| gender: "女", | |||
| dob: '', | |||
| work_experience: 0, | |||
| education: 0, | |||
| reg_level1: 0, | |||
| reg_level2: 0, | |||
| reg_level3: 0, | |||
| reg_level4: 0, | |||
| now_level1: 0, | |||
| now_level2: 0, | |||
| now_level3: 0, | |||
| now_level4: 0, | |||
| title: 0, | |||
| marital_status: 0, | |||
| ethnicity: 0, | |||
| height: 0, | |||
| weight: 0, | |||
| political_status: 0, | |||
| native_place: 0 | |||
| } | |||
| // 营业执照 | |||
| const uploadPhotoSuccess = (data : Object) => { | |||
| addOtherForm.value.photo_img = imageprefix + data | |||
| createForm.value.photo = data | |||
| } | |||
| // 出生日期 | |||
| const dayjsRef = ref(dayjs); | |||
| const dobChange = (val) => { | |||
| dayjsRef.value(val).format('YYYY-MM-DD'); | |||
| createForm.value.dob = dayjsRef.value(val).format('YYYY-MM-DD'); | |||
| } | |||
| // 学历 | |||
| const educationPlaceholder = ref('请选择学历'); | |||
| const saveEducation = (data) => { | |||
| createForm.value.education = data.val; | |||
| createForm.value.education = data.val.key; | |||
| } | |||
| // 职称 | |||
| const titlePlaceholder = ref('请选择职称') | |||
| const saveTitle = (data) => { | |||
| createForm.value.title = data.val; | |||
| createForm.value.title = data.val.key; | |||
| } | |||
| // 婚姻状态 | |||
| const maritalStatusPlaceholder = ref('请选择婚姻状态') | |||
| const saveMaritalStatus = (data) => { | |||
| createForm.value.marital_status = data.val; | |||
| createForm.value.marital_status = data.val.key; | |||
| } | |||
| // 民族 | |||
| const ethnicityPlaceholder = ref('请选择民族') | |||
| const saveEthnicity = (data) => { | |||
| createForm.value.ethnicity = data.val; | |||
| createForm.value.ethnicity = data.val.key; | |||
| } | |||
| // 政治面貌 | |||
| const politicalStatusPlaceholder = ref('请选择政治面貌') | |||
| const savePoliticalStatus = (data) => { | |||
| createForm.value.political_status = data.val; | |||
| createForm.value.political_status = data.val.key; | |||
| } | |||
| @@ -288,6 +228,32 @@ | |||
| createForm.value.native_place = data.arr1[1]; | |||
| } | |||
| } | |||
| const sumbitForm = () => { | |||
| if (createForm.value.id) { | |||
| PostJobapplicantUpdate(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| getBasic(); | |||
| }).catch(err => { | |||
| }) | |||
| } else { | |||
| PostJobapplicantAdd(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| getBasic(); | |||
| }).catch(err => { | |||
| }) | |||
| } | |||
| } | |||
| const resetForm = () => { | |||
| createForm.value = reset().dataForm as JobseekerBasicType.JobseekerBasicFormType; | |||
| addOtherForm.value = reset().otherDataForm as JobseekerBasicType.OtherFormType; | |||
| } | |||
| // watch(() => [props.form_state], (newVal) => { | |||
| // state.value = newVal[0]; | |||
| // getBasic(); | |||
| // }) | |||
| </script> | |||
| <style> | |||
| @@ -0,0 +1,77 @@ | |||
| export let dataForm = { | |||
| id: 0, | |||
| customer_id: 0, | |||
| hide_resume: 0, | |||
| house_keeping_status: 0, | |||
| photo: 'aaa.jpg', | |||
| name: '', | |||
| id_number: '', | |||
| gender: "女", | |||
| dob: '', | |||
| work_experience: 0, | |||
| education: 0, | |||
| reg_level1: 0, | |||
| reg_level2: 0, | |||
| reg_level3: 0, | |||
| reg_level4: 0, | |||
| now_level1: 0, | |||
| now_level2: 0, | |||
| now_level3: 0, | |||
| now_level4: 0, | |||
| title: 0, | |||
| marital_status: 0, | |||
| ethnicity: 0, | |||
| height: 0, | |||
| weight: 0, | |||
| political_status: 0, | |||
| native_place: 0, | |||
| } | |||
| export let otherDataForm = { | |||
| dob: '', | |||
| reg_level_cascader: '', | |||
| now_level_cascader: '', | |||
| native_place_txt: '', | |||
| photo_img: '' | |||
| } | |||
| export const reset = () => { | |||
| dataForm = { | |||
| id: 0, | |||
| customer_id: 0, | |||
| hide_resume: 0, | |||
| house_keeping_status: 0, | |||
| photo: 'aaa.jpg', | |||
| name: '', | |||
| id_number: '', | |||
| gender: "女", | |||
| dob: '', | |||
| work_experience: 0, | |||
| education: 0, | |||
| reg_level1: 0, | |||
| reg_level2: 0, | |||
| reg_level3: 0, | |||
| reg_level4: 0, | |||
| now_level1: 0, | |||
| now_level2: 0, | |||
| now_level3: 0, | |||
| now_level4: 0, | |||
| title: 0, | |||
| marital_status: 0, | |||
| ethnicity: 0, | |||
| height: 0, | |||
| weight: 0, | |||
| political_status: 0, | |||
| native_place: 0 | |||
| } | |||
| otherDataForm = { | |||
| dob: '', | |||
| reg_level_cascader: '', | |||
| now_level_cascader: '', | |||
| native_place_txt: '', | |||
| photo_img: '' | |||
| } | |||
| return { dataForm, otherDataForm } | |||
| } | |||
| @@ -1,5 +1,5 @@ | |||
| declare namespace contactType { | |||
| type addContactType = { | |||
| declare namespace JobseekerContactType { | |||
| type JobseekerContactFormType = { | |||
| id ?: Number, | |||
| customer_id ?: Number, | |||
| landline?: String, | |||
| @@ -9,4 +9,5 @@ declare namespace contactType { | |||
| mailing_address?: String, | |||
| postal_code?: String, | |||
| } | |||
| } | |||
| @@ -1,113 +1,105 @@ | |||
| <template> | |||
| <a-form :model="createForm" :label-col="{span: 4}" labelAlign="left"> | |||
| <a-row gutter="20"> | |||
| <a-col span="8"> | |||
| <a-form-item label="固话" name="landline"> | |||
| <a-input v-model:value="createForm.landline" placeholder="请输入固话" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="移动电话" name="mobile"> | |||
| <a-input v-model:value="createForm.mobile" placeholder="请输入移动电话" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="QQ" name="qq"> | |||
| <a-input v-model:value="createForm.qq" placeholder="请输入QQ" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="个人网站" name="personal_website"> | |||
| <a-input v-model:value="createForm.personal_website" placeholder="请输入个人网站" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="通信地址" name="mailing_address"> | |||
| <a-input v-model:value="createForm.mailing_address" placeholder="请输入通信地址" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="邮编" name="postal_code"> | |||
| <a-input v-model:value="createForm.postal_code" placeholder="请输入邮编" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| </a-row> | |||
| <a-row gutter="20"> | |||
| <a-col> | |||
| <a-button type="primary" @click="onSubmit">保存</a-button> | |||
| </a-col> | |||
| <a-col> | |||
| <a-button style="margin-left: 10px">重置</a-button> | |||
| </a-col> | |||
| <a-col> | |||
| <a-popconfirm title="是否要联系信息?删除后不可恢复" @confirm="onDel(createForm.customer_id)"> | |||
| <a-button danger >删除全部</a-button> | |||
| </a-popconfirm> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| <template> | |||
| <div style="width: 100%;"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="8"> | |||
| <a-form-item label="固话" name="landline"> | |||
| <a-input v-model:value="createForm.landline" placeholder="请输入固话" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="移动电话" name="mobile"> | |||
| <a-input v-model:value="createForm.mobile" placeholder="请输入移动电话" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="QQ" name="qq"> | |||
| <a-input v-model:value="createForm.qq" placeholder="请输入QQ" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="个人网站" name="personal_website"> | |||
| <a-input v-model:value="createForm.personal_website" placeholder="请输入个人网站" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="通信地址" name="mailing_address"> | |||
| <a-input v-model:value="createForm.mailing_address" placeholder="请输入通信地址" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="邮编" name="postal_code"> | |||
| <a-input v-model:value="createForm.postal_code" placeholder="请输入邮编" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm" >取消</a-button> | |||
| <a-button type="primary" @click="sumbitForm" >保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| </div> | |||
| </template> | |||
| <script lang="ts" setup> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue'; | |||
| import { message } from 'ant-design-vue'; | |||
| import { PostJobapplicantAddcontact, PostJobapplicantDelcontact, PostJobapplicantUpdatecontact, PostJobapplicantContactdetail } from '@/apis/models'; | |||
| <script setup lang="ts"> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue'; | |||
| import { PostJobapplicantAddcontact, PostJobapplicantDelcontact, PostJobapplicantUpdatecontact, GetJobapplicantContactdetail } from '@/apis/models'; | |||
| import { intersectionAlike } from '@/utils/dataHelper'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/contact/data.ts'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| const dayjsRef = ref(dayjs); | |||
| let props = defineProps(['customer_record']); | |||
| const emit = defineEmits(); | |||
| const props = defineProps(['customer_record']); | |||
| let createForm = ref<JobseekerContactType.JobseekerContactFormType>(dataForm) | |||
| let createForm = ref<contactType.addContactType>({ | |||
| landline: '', | |||
| mobile: '', | |||
| qq: '', | |||
| personal_website: '', | |||
| mailing_address: '', | |||
| postal_code: '', | |||
| }) | |||
| onMounted(() => { | |||
| if (props.customer_record) { | |||
| createForm.value = { | |||
| id: props.customer_record.id ? props.customer_record.id : 0, | |||
| customer_id: props.customer_record.customer_id, | |||
| landline: props.customer_record.landline, | |||
| mobile: props.customer_record.mobile, | |||
| qq: props.customer_record.qq, | |||
| personal_website: props.customer_record.personal_website, | |||
| mailing_address: props.customer_record.mailing_address, | |||
| postal_code: props.customer_record.postal_code, | |||
| } | |||
| } | |||
| getBasic() | |||
| }) | |||
| const onSubmit = () => { | |||
| // PostJobapplicantAdd(createForm.value).then(res => { | |||
| // message.success('基本资料保存成功') | |||
| // emit('toNext', {activeKey: "2"}) | |||
| // }) | |||
| emit('toNext', { activeKey: "3" }) | |||
| const getBasic = () => { | |||
| GetJobapplicantContactdetail({customer_id: props.customer_record.customer_id}).then(res => { | |||
| createForm.value = intersectionAlike(createForm.value, res.data) | |||
| createForm.value.id = res.data.id; | |||
| createForm.value.customer_id = res.data.customer_id; | |||
| }) | |||
| } | |||
| const resetForm = () => { | |||
| createForm.value = { | |||
| customer_id: props.customer_record.customer_id, | |||
| landline: '', | |||
| mobile: '', | |||
| qq: '', | |||
| personal_website: '', | |||
| mailing_address: '', | |||
| postal_code: '', | |||
| const sumbitForm = () => { | |||
| if(createForm.value.id) { | |||
| PostJobapplicantUpdatecontact(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| getBasic(); | |||
| // resetForm() | |||
| }).catch(err => { | |||
| }) | |||
| } else { | |||
| PostJobapplicantAddcontact(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| getBasic(); | |||
| // resetForm() | |||
| }).catch(err => { | |||
| }) | |||
| } | |||
| console.log(createForm.value) | |||
| } | |||
| const onDel = (id: Number) => { | |||
| PostJobapplicantDelcontact({id: id}).then(res => { | |||
| message.success('删除成功'); | |||
| resetForm(); | |||
| }) | |||
| const resetForm = () => { | |||
| createForm.value = reset().dataForm as JobseekerContactType.JobseekerContactFormType; | |||
| } | |||
| // watch(() => [props.form_state], (newVal) => { | |||
| // state.value = newVal[0]; | |||
| // getBasic(); | |||
| // }) | |||
| </script> | |||
| <style> | |||
| </style> | |||
| </style> | |||
| @@ -0,0 +1,29 @@ | |||
| export let dataForm = { | |||
| landline: '', | |||
| mobile: '', | |||
| qq: '', | |||
| personal_website: '', | |||
| mailing_address: '', | |||
| postal_code: '', | |||
| } | |||
| export let otherDataForm = { | |||
| } | |||
| export const reset = () => { | |||
| dataForm = { | |||
| landline: '', | |||
| mobile: '', | |||
| qq: '', | |||
| personal_website: '', | |||
| mailing_address: '', | |||
| postal_code: '', | |||
| } | |||
| otherDataForm = { | |||
| } | |||
| return { dataForm, otherDataForm } | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| declare namespace JobseekerCredentialType { | |||
| type JobseekerCredentialFormType = { | |||
| id ?: Number, | |||
| name ?: String, | |||
| description ?: String, | |||
| certificate_photo ?: String, | |||
| } | |||
| type OtherFormType = { | |||
| photo_img ?: String, | |||
| } | |||
| } | |||
| @@ -1,32 +1,202 @@ | |||
| <template> | |||
| <a-c-form :createForm="createForm"> | |||
| <a-form-item label="证书名称" name="name"> | |||
| <a-input v-model:value="createForm.name" placeholder="请输入证书名称" /> | |||
| </a-form-item> | |||
| <a-form-item required label="证书描述" name="description"> | |||
| <a-input v-model:value="createForm.description" placeholder="请输入证书描述" /> | |||
| </a-form-item> | |||
| <a-button type="primary" @click="addForm()">添加证书</a-button> | |||
| <a-list :data-source="certificateList"> | |||
| <template #loadMore v-if="certificateList.length > 0"> | |||
| <a-flex justify="center"> | |||
| <a-space> | |||
| <div v-if="!loading"> | |||
| <a-button @click="onLoadMore">加载更多</a-button> | |||
| </div> | |||
| </a-space> | |||
| </a-flex> | |||
| </template> | |||
| <template #renderItem="{ item, index }"> | |||
| <a-list-item> | |||
| <a-skeleton avatar :title="false" :loading="!!loading" active> | |||
| <a-card :title="item.name" style="width: 100%"> | |||
| <template #extra> | |||
| <a-space> | |||
| <a-button v-if="item.id" @click="toEdit(item, index)" type="primary" size="small"> | |||
| 编辑 | |||
| </a-button> | |||
| <a-popconfirm title="是否删除该证书信息" @confirm="del(item.id)"> | |||
| <a-button v-if="item.id" size="small" danger> | |||
| 删除 | |||
| </a-button> | |||
| </a-popconfirm> | |||
| </a-space> | |||
| </template> | |||
| <a-form :model="createForm" layout="vertical" v-if="item.edit" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="12"> | |||
| <a-form-item required label="证书名称" name="name"> | |||
| <a-input v-model:value="createForm.name" placeholder="请输入证书名称" size="large" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="证书描述" name="description"> | |||
| <a-input v-model:value="createForm.description" placeholder="请输入证书描述" | |||
| size="large" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="上传证书" name="photo"> | |||
| <upload upload_txt="上传证书" @uploadSuccess="uploadPhotoSuccess" | |||
| :success_image="addOtherForm.photo_img" images_length="1" image_type="3"> | |||
| </upload> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm(index)">取消</a-button> | |||
| <a-button type="primary" @click="saveForm(index)">保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| <template v-else> | |||
| <p>证书描述: {{item.description}}</p> | |||
| <image-container | |||
| :imgObj="{src: item.certificate_photo ,width: '150px',height:'210px'}"></image-container> | |||
| </template> | |||
| </a-card> | |||
| </a-skeleton> | |||
| </a-list-item> | |||
| </template> | |||
| </a-list> | |||
| </a-c-form> | |||
| </template> | |||
| <script lang="ts" setup> | |||
| import { ref, onMounted, watch, computed } from 'vue'; | |||
| let createForm = ref({ | |||
| name: '', | |||
| description: '', | |||
| certificate_photo: '', | |||
| <script setup lang="ts"> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue'; | |||
| import { PostJobapplicantAddcertificate, PostJobapplicantDelcertificate, PostJobapplicantUpdatecertificate, PostJobapplicantListcertificate, PostJobapplicantCertificatedetail } from '@/apis/models'; | |||
| import Upload from '@/components/upload/one.vue'; | |||
| import { intersectionAlike } from '@/utils/dataHelper'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/credential/data.ts'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal, imageprefix } = useCommon(); | |||
| const dayjsRef = ref(dayjs); | |||
| let props = defineProps(['customer_record']); | |||
| const emit = defineEmits(); | |||
| let loading = ref<Boolean>(true); | |||
| let certificateList = ref([]); | |||
| let createForm = ref<JobseekerCredentialType.JobseekerCredentialFormType>(dataForm) | |||
| let addOtherForm = ref<JobseekerCredentialType.OtherFormType>(otherDataForm) | |||
| onMounted(() => { | |||
| commomParams.value.search.customer_id = props.customer_record.customer_id | |||
| getData(); | |||
| }) | |||
| const resetForm = () => { | |||
| createForm.value = { | |||
| name: '', | |||
| description: '', | |||
| certificate_photo: '', | |||
| const getPage = (data : object) => { | |||
| commomParams.value.search.page = data.current; | |||
| commomParams.value.search.pagesize = data.pageSize; | |||
| getData(); | |||
| } | |||
| const getData = async () => { | |||
| try { | |||
| let res = await PostJobapplicantListcertificate(commomParams.value.search); | |||
| loading.value = false; | |||
| if (!res.data.jobapplicantcertificates || res.data.jobapplicantcertificates.length <= 0) { | |||
| warnToast('无更多数据') | |||
| commomParams.value.search.page = 1 | |||
| } | |||
| res.data.jobapplicantcertificates.map(item => { | |||
| item.certificate_photo = imageprefix + item.certificate_photo | |||
| }) | |||
| certificateList.value = res.data.jobapplicantcertificates ? certificateList.value.concat(res.data.jobapplicantcertificates) : certificateList.value.concat([]); | |||
| certificateList.value.map(item => { | |||
| return item.edit = false | |||
| }) | |||
| } catch { | |||
| loading.value = false; | |||
| } | |||
| } | |||
| const onLoadMore = () => { | |||
| commomParams.value.search.page = commomParams.value.search.page + 1; | |||
| getData(); | |||
| } | |||
| const addForm = () => { | |||
| certificateList.value.unshift({ edit: true }) | |||
| createForm.value.customer_id = props.customer_record.customer_id; | |||
| } | |||
| // 详情 | |||
| const getDetail = (val) => { | |||
| PostJobapplicantCertificatedetail({ id: val.id, customer_id: val.customer_id }).then(res => { | |||
| createForm.value = intersectionAlike(createForm.value, res.data) | |||
| createForm.value.id = res.data.id; | |||
| createForm.value.customer_id = res.data.customer_id; | |||
| addOtherForm.value = { | |||
| photo_img: imageprefix + res.data.certificate_photo | |||
| } | |||
| }) | |||
| } | |||
| const uploadPhotoSuccess = (data : Object) => { | |||
| addOtherForm.value.photo_img = imageprefix + data | |||
| createForm.value.certificate_photo = data | |||
| } | |||
| const saveForm = (index : Number) => { | |||
| if (createForm.value.id) { | |||
| PostJobapplicantUpdatecertificate(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| resetForm(index) | |||
| }).catch(err => { | |||
| }) | |||
| } else { | |||
| PostJobapplicantAddcertificate(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| resetForm(index) | |||
| }).catch(err => { | |||
| }) | |||
| } | |||
| } | |||
| const resetForm = (index : Number) => { | |||
| certificateList.value = []; | |||
| createForm.value = reset().dataForm as JobseekerCredentialType.JobseekerCredentialFormType; | |||
| addOtherForm.value = reset().otherDataForm as JobseekerCredentialType.OtherFormType; | |||
| getData(); | |||
| } | |||
| // watch(() => [props.form_state], (newVal) => { | |||
| // state.value = newVal[0]; | |||
| // }) | |||
| const toEdit = (item : Object, index : Number) => { | |||
| createForm.value.id = item.id; | |||
| getDetail(item) | |||
| certificateList.value[index].edit = true | |||
| } | |||
| const del = (id : number) => { | |||
| commomParams.value.delParam = { id: id }; | |||
| PostJobapplicantDelcertificate(commomParams.value.delParam).then(res => { | |||
| successToast('删除成功'); | |||
| certificateList.value = []; | |||
| getData(); | |||
| }) | |||
| } | |||
| </script> | |||
| <style> | |||
| <style scoped> | |||
| :deep(.ant-list-item) { | |||
| padding: 12px 0 !important; | |||
| border-block-end: none !important; | |||
| } | |||
| </style> | |||
| @@ -0,0 +1,23 @@ | |||
| export let dataForm = { | |||
| name: '', | |||
| description: '', | |||
| certificate_photo: '', | |||
| } | |||
| export let otherDataForm = { | |||
| photo_img: '' | |||
| } | |||
| export const reset = () => { | |||
| dataForm = { | |||
| name: '', | |||
| description: '', | |||
| certificate_photo: '', | |||
| } | |||
| otherDataForm = { | |||
| photo_img: '' | |||
| } | |||
| return { dataForm, otherDataForm } | |||
| } | |||
| @@ -0,0 +1,33 @@ | |||
| export let dataForm = { | |||
| start_year: 0, | |||
| start_month: 0, | |||
| end_year: 0, | |||
| end_month: 0, | |||
| end_today: 0, | |||
| company_name: '', | |||
| position: '', | |||
| reason_for_leaving: '' | |||
| } | |||
| export let otherDataForm = { | |||
| } | |||
| export const reset = () => { | |||
| dataForm = { | |||
| start_year: 0, | |||
| start_month: 0, | |||
| end_year: 0, | |||
| end_month: 0, | |||
| end_today: 0, | |||
| company_name: '', | |||
| position: '', | |||
| reason_for_leaving: '' | |||
| } | |||
| otherDataForm = { | |||
| } | |||
| return { dataForm, otherDataForm } | |||
| } | |||
| @@ -0,0 +1,13 @@ | |||
| declare namespace JobseekerExperienceType { | |||
| type JobseekerExperienceFormType = { | |||
| id ?: Number, | |||
| start_year ?: Number, | |||
| start_month ?: Number, | |||
| end_year ?: Number, | |||
| end_month ?: Number, | |||
| end_today ?: Number, | |||
| company_name ?: String, | |||
| position ?: String, | |||
| reason_for_leaving ?: String, | |||
| } | |||
| } | |||
| @@ -1,79 +1,210 @@ | |||
| <template> | |||
| <a-form :model="createForm" :label-col="{span: 4}" labelAlign="left"> | |||
| <a-row gutter="20"> | |||
| <a-col span="24"> | |||
| <a-form-item required label="是否至今" name="是否至今"> | |||
| <a-radio-group v-model:value="createForm.end_today" button-style="solid"> | |||
| <a-radio-button value="1">非至今</a-radio-button> | |||
| <a-radio-button value="2">至今</a-radio-button> | |||
| </a-radio-group> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="公司名称" name="company_name"> | |||
| <a-input v-model:value="createForm.company_name" placeholder="请输入公司名称" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="职位" name="position"> | |||
| <a-input v-model:value="createForm.position" placeholder="请输入职位" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="离职原因" name="reason_for_leaving"> | |||
| <a-input v-model:value="createForm.reason_for_leaving" placeholder="请输入离职原因" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| </a-row> | |||
| <a-row gutter="20"> | |||
| <a-col> | |||
| <a-button type="primary" @click="onSubmit">保存</a-button> | |||
| </a-col> | |||
| <a-col> | |||
| <a-button style="margin-left: 10px">重置</a-button> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| <a-button type="primary" @click="addForm()">添加工作经历</a-button> | |||
| <a-list :data-source="experienceList"> | |||
| <template #loadMore v-if="experienceList.length > 0"> | |||
| <a-flex justify="center"> | |||
| <a-space> | |||
| <div v-if="!loading"> | |||
| <a-button @click="onLoadMore">加载更多</a-button> | |||
| </div> | |||
| </a-space> | |||
| </a-flex> | |||
| </template> | |||
| <template #renderItem="{ item, index }"> | |||
| <a-list-item> | |||
| <a-skeleton avatar :title="false" :loading="!!loading" active> | |||
| <a-card :title="item.company_name" style="width: 100%"> | |||
| <template #extra> | |||
| <a-space> | |||
| <a-button v-if="item.id" @click="toEdit(item, index)" type="primary" size="small"> | |||
| 编辑 | |||
| </a-button> | |||
| <a-popconfirm title="是否删除该经历" @confirm="del(item.id)"> | |||
| <a-button v-if="item.id" size="small" danger> | |||
| 删除 | |||
| </a-button> | |||
| </a-popconfirm> | |||
| </a-space> | |||
| </template> | |||
| <a-form :model="createForm" layout="vertical" v-if="item.edit" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="12"> | |||
| <a-form-item required label="工作时间"> | |||
| <a-range-picker v-model:value="time" @Change="getRange" picker="month" | |||
| style="width: 100%;" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="是否至今"> | |||
| <a-radio-group v-model:value="createForm.end_today" button-style="solid" | |||
| style="width: 100%;"> | |||
| <a-radio-button :value="1" style="width: 50%;">非至今</a-radio-button> | |||
| <a-radio-button :value="2" style="width: 50%;">至今</a-radio-button> | |||
| </a-radio-group> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="公司名称" name="company_name"> | |||
| <a-input v-model:value="createForm.company_name" placeholder="请输入公司名称" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="职位" name="position"> | |||
| <a-input v-model:value="createForm.position" placeholder="请输入职位" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="离职原因" name="reason_for_leaving"> | |||
| <a-input v-model:value="createForm.reason_for_leaving" placeholder="请输入离职原因" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm(index)">取消</a-button> | |||
| <a-button type="primary" @click="saveForm(index)">保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| <template v-else> | |||
| <p>工作角色:{{item.position}}</p> | |||
| <p>工作时间:{{item.start_year}}.{{item.start_month}}至{{item.end_year}}.{{item.end_month}}</p> | |||
| <p>离职原因:{{item.reason_for_leaving}}</p> | |||
| </template> | |||
| </a-card> | |||
| </a-skeleton> | |||
| </a-list-item> | |||
| </template> | |||
| </a-list> | |||
| </template> | |||
| <script lang="ts" setup> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue'; | |||
| import { message } from 'ant-design-vue'; | |||
| import { PostJobapplicantAdd, PostJobapplicantUpdate } from '@/apis/models'; | |||
| <script setup lang="ts"> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue'; | |||
| import { PostJobapplicantAddexperience, PostJobapplicantDelexperience, PostJobapplicantUpdateexperience, PostJobapplicantListexperience, PostJobapplicantExperiencedetail } from '@/apis/models'; | |||
| import { intersectionAlike } from '@/utils/dataHelper'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/experience/data.ts'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| const dayjsRef = ref(dayjs); | |||
| let props = defineProps(['customer_record']); | |||
| const emit = defineEmits(); | |||
| const onSubmit = () => { | |||
| // PostJobapplicantAdd(createForm.value).then(res => { | |||
| // message.success('基本资料保存成功') | |||
| // emit('toNext', {activeKey: "2"}) | |||
| // }) | |||
| emit('toNext', { activeKey: "8" }) | |||
| } | |||
| let createForm = ref({ | |||
| start_year: 0, | |||
| start_month: 0, | |||
| end_year: 0, | |||
| end_month: 0, | |||
| end_today: 0, | |||
| company_name: '', | |||
| position: '', | |||
| reason_for_leaving: '' | |||
| let loading = ref<Boolean>(true); | |||
| let experienceList = ref([]); | |||
| let createForm = ref<JobseekerExperienceType.JobseekerExperienceFormType>(dataForm) | |||
| let time = ref('') | |||
| onMounted(() => { | |||
| commomParams.value.search.customer_id = props.customer_record.customer_id | |||
| getData(); | |||
| }) | |||
| const resetForm = () => { | |||
| createForm.value = { | |||
| start_year: 0, | |||
| start_month: 0, | |||
| end_year: 0, | |||
| end_month: 0, | |||
| end_today: 0, | |||
| company_name: '', | |||
| position: '', | |||
| reason_for_leaving: '' | |||
| const getPage = (data : object) => { | |||
| commomParams.value.search.page = data.current; | |||
| commomParams.value.search.pagesize = data.pageSize; | |||
| getData(); | |||
| } | |||
| const getData = async () => { | |||
| try { | |||
| let res = await PostJobapplicantListexperience(commomParams.value.search); | |||
| loading.value = false; | |||
| if (!res.data.jobapplicantexperiences || res.data.jobapplicantexperiences.length <= 0) { | |||
| warnToast('无更多数据') | |||
| commomParams.value.search.page = 1 | |||
| } | |||
| experienceList.value = res.data.jobapplicantexperiences ? experienceList.value.concat(res.data.jobapplicantexperiences) : experienceList.value.concat([]); | |||
| experienceList.value.map(item => { | |||
| return item.edit = false | |||
| }) | |||
| } catch { | |||
| loading.value = false; | |||
| } | |||
| } | |||
| const onLoadMore = () => { | |||
| commomParams.value.search.page = commomParams.value.search.page + 1; | |||
| getData(); | |||
| } | |||
| const addForm = () => { | |||
| experienceList.value.unshift({ edit: true }) | |||
| createForm.value.customer_id = props.customer_record.customer_id; | |||
| } | |||
| // 详情 | |||
| const getDetail = (val) => { | |||
| PostJobapplicantExperiencedetail({ id: val.id, customer_id: val.customer_id }).then(res => { | |||
| createForm.value = intersectionAlike(createForm.value, res.data) | |||
| createForm.value.id = res.data.id; | |||
| createForm.value.customer_id = res.data.customer_id; | |||
| time.value = [dayjsRef.value(`${res.data.start_year}-${res.data.start_month}`), dayjsRef.value(`${res.data.end_year}-${res.data.end_month}`)] | |||
| }) | |||
| } | |||
| const getRange = (val) => { | |||
| let day1 = dayjsRef.value(val[0]).format('YYYY-MM-DD').split('-'); | |||
| let day2 = dayjsRef.value(val[1]).format('YYYY-MM-DD').split('-'); | |||
| createForm.value.start_year = parseInt(day1[0], 10); | |||
| createForm.value.start_month = parseInt(day1[1], 10); | |||
| createForm.value.end_year = parseInt(day2[0], 10); | |||
| createForm.value.end_month = parseInt(day2[1], 10); | |||
| } | |||
| const saveForm = (index : Number) => { | |||
| if (createForm.value.id) { | |||
| PostJobapplicantUpdateexperience(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| resetForm(index) | |||
| }).catch(err => { | |||
| }) | |||
| } else { | |||
| PostJobapplicantAddexperience(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| resetForm(index) | |||
| }).catch(err => { | |||
| }) | |||
| } | |||
| } | |||
| const resetForm = (index : Number) => { | |||
| experienceList.value = []; | |||
| time.value = '' | |||
| createForm.value = reset().dataForm as JobseekerExperienceType.JobseekerExperienceFormType; | |||
| getData(); | |||
| } | |||
| // watch(() => [props.form_state], (newVal) => { | |||
| // state.value = newVal[0]; | |||
| // }) | |||
| const toEdit = (item : Object, index : Number) => { | |||
| createForm.value.id = item.id; | |||
| getDetail(item) | |||
| experienceList.value[index].edit = true | |||
| } | |||
| const del = (id : number) => { | |||
| commomParams.value.delParam = { id: id }; | |||
| PostJobapplicantDelexperience(commomParams.value.delParam).then(res => { | |||
| successToast('删除成功'); | |||
| experienceList.value = []; | |||
| getData(); | |||
| }) | |||
| } | |||
| </script> | |||
| <style> | |||
| <style scoped> | |||
| :deep(.ant-list-item) { | |||
| padding: 12px 0 !important; | |||
| border-block-end: none !important; | |||
| } | |||
| </style> | |||
| @@ -0,0 +1,60 @@ | |||
| export let dataAreaForm = { | |||
| level1: 0, | |||
| level2: 0, | |||
| level3: 0, | |||
| level4: 0, | |||
| } | |||
| export let dataPositionForm = { | |||
| level1: 0, | |||
| level2: 0, | |||
| } | |||
| export let dataBasicForm = { | |||
| job_type: 0, | |||
| talent_type: 0, | |||
| work_experience: 0, | |||
| other_positions: '', | |||
| salary_range: 0, | |||
| available_date: 0, | |||
| title_requirement: 0, | |||
| skill_certification: 0, | |||
| accommodation_requirement: 0, | |||
| holiday_rest: 0, | |||
| } | |||
| export let otherDataForm = { | |||
| area: [], | |||
| position: [] | |||
| } | |||
| export const reset = () => { | |||
| dataAreaForm = { | |||
| level1: 0, | |||
| level2: 0, | |||
| level3: 0, | |||
| level4: 0, | |||
| } | |||
| dataPositionForm = { | |||
| level1: 0, | |||
| level2: 0, | |||
| } | |||
| dataBasicForm = { | |||
| job_type: 0, | |||
| talent_type: 0, | |||
| work_experience: 0, | |||
| other_positions: '', | |||
| salary_range: 0, | |||
| available_date: 0, | |||
| title_requirement: 0, | |||
| skill_certification: 0, | |||
| accommodation_requirement: 0, | |||
| holiday_rest: 0, | |||
| } | |||
| otherDataForm = { | |||
| area: [], | |||
| position: [] | |||
| } | |||
| return { dataAreaForm, dataPositionForm, dataBasicForm, otherDataForm } | |||
| } | |||
| @@ -0,0 +1,34 @@ | |||
| declare namespace JobseekerIntentionType { | |||
| type JobseekerIntentionAreaFormType = { | |||
| id ?: Number, | |||
| level1 ?: Number, | |||
| level2 ?: Number, | |||
| level3 ?: Number, | |||
| level4 ?: Number, | |||
| } | |||
| type JobseekerIntentionPositionFormType = { | |||
| id ?: Number, | |||
| level1 ?: Number, | |||
| level2 ?: Number, | |||
| } | |||
| type JobseekerIntentionBasicFormType = { | |||
| id ?: Number, | |||
| job_type?: Number, | |||
| talent_type ?: Number, | |||
| work_experience ?: Number, | |||
| other_positions: '', | |||
| salary_range ?: Number, | |||
| available_date ?: Number, | |||
| title_requirement ?: Number, | |||
| skill_certification ?: Number, | |||
| accommodation_requirement ?: Number, | |||
| holiday_rest ?: Number, | |||
| } | |||
| type OtherFormType = { | |||
| area ?: Number[], | |||
| position?: Number[], | |||
| } | |||
| } | |||
| @@ -1,199 +1,449 @@ | |||
| <template> | |||
| <a-form :model="createForm" :label-col="{span: 4}" labelAlign="left"> | |||
| <a-row gutter="20"> | |||
| <a-col span="8"> | |||
| <a-form-item label="意向地区"> | |||
| <a-c-cascader :dict="2009" @saveCascader="areaSave"></a-c-cascader> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="意向职位一"> | |||
| <a-c-cascader :dict="2004" @saveCascader="positionSave"></a-c-cascader> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="意向职位二"> | |||
| <a-c-cascader :dict="2004" @saveCascader="positionSave"></a-c-cascader> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="意向职位三"> | |||
| <a-c-cascader :dict="2004" @saveCascader="positionSave"></a-c-cascader> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="求职类型"> | |||
| <a-c-select :dict="2019" placeholder="请选择求职类型" @saveSelect="saveJobType"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="人才类型"> | |||
| <a-c-select :dict="2020" placeholder="请选择求职类型" @saveSelect="saveTalentType"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="工作经验" name="work_experience"> | |||
| <a-input v-model:value="createForm.base.work_experience" placeholder="请输入工作经验" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="其他职位" name="other_positions"> | |||
| <a-input v-model:value="createForm.base.other_positions" placeholder="请输入其他职位" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="月薪要求范围"> | |||
| <a-c-select :dict="2005" placeholder="请选择月薪要求范围" @saveSelect="saveSalaryRange"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="可到职日期"> | |||
| <a-c-select :dict="2013" placeholder="请选择可到职日期" @saveSelect="saveAvailableDate"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="职称要求"> | |||
| <a-c-select :dict="2014" placeholder="请选择职称要求" @saveSelect="saveTitleRequirement"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="技能认证"> | |||
| <a-c-select :dict="2015" placeholder="请选择技能认证" @saveSelect="saveSkillCertification"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="食宿要求"> | |||
| <a-c-select :dict="2016" placeholder="请选择食宿要求" @saveSelect="saveAccommodationRequirement"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="节假日休息情况" :label-col="{span: 6}"> | |||
| <a-c-select :dict="2017" placeholder="请选择节假日休息情况" @saveSelect="saveHolidayRest"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| </a-row> | |||
| <a-row gutter="20"> | |||
| <a-col> | |||
| <a-button type="primary" @click="onSubmit">保存</a-button> | |||
| </a-col> | |||
| <a-col> | |||
| <a-button style="margin-left: 10px">重置</a-button> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| <div> | |||
| <a-button type="primary" @click="addPositionForm()">添加意向职位</a-button> | |||
| <a-list :data-source="positionList"> | |||
| <template #renderItem="{ item, index }"> | |||
| <a-list-item> | |||
| <a-card style="width: 100%"> | |||
| <template #title> | |||
| <div> | |||
| {{item.level1_txt}} | |||
| <span v-if="item.level2_txt">/</span> | |||
| {{item.level2_txt}} | |||
| </div> | |||
| </template> | |||
| <template #extra> | |||
| <a-space> | |||
| <a-button v-if="item.id" @click="toPositionEdit(item, index)" type="primary" | |||
| size="small"> | |||
| 编辑 | |||
| </a-button> | |||
| <a-popconfirm title="是否删除该意向职位" @confirm="delPosition(item.id)"> | |||
| <a-button v-if="item.id" size="small" danger> | |||
| 删除 | |||
| </a-button> | |||
| </a-popconfirm> | |||
| </a-space> | |||
| </template> | |||
| <a-form :model="positionForm" layout="vertical" v-if="item.edit" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="24"> | |||
| <a-form-item required label="意向职位"> | |||
| <a-jilian :dict="2004" @saveCascader="positionSave" placeholder="请选择意向职位" | |||
| :cascader_content="addOtherForm.position"></a-jilian> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm('position')" size="large">取消</a-button> | |||
| <a-button type="primary" @click="sumbitPositionForm" | |||
| size="large">保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| </a-card> | |||
| </a-list-item> | |||
| </template> | |||
| </a-list> | |||
| <a-button type="primary" @click="addAreaForm()">添加意向地区</a-button> | |||
| <a-list :data-source="areaList"> | |||
| <template #renderItem="{ item, index }"> | |||
| <a-list-item> | |||
| <a-card style="width: 100%"> | |||
| <template #title> | |||
| <div> | |||
| {{item.level1_txt}} | |||
| <span v-if="item.level2_txt">/</span> | |||
| {{item.level2_txt}} | |||
| <span v-if="item.level3_txt">/</span> | |||
| {{item.level3_txt}} | |||
| <span v-if="item.level4_txt">/</span> | |||
| {{item.level4_txt}} | |||
| </div> | |||
| </template> | |||
| <template #extra> | |||
| <a-space> | |||
| <a-button v-if="item.id" @click="toAreaEdit(item, index)" type="primary" size="small"> | |||
| 编辑 | |||
| </a-button> | |||
| <a-popconfirm title="是否删除该意向地区" @confirm="delArea(item.id)"> | |||
| <a-button v-if="item.id" size="small" danger> | |||
| 删除 | |||
| </a-button> | |||
| </a-popconfirm> | |||
| </a-space> | |||
| </template> | |||
| <a-form :model="createForm" layout="vertical" v-if="item.edit" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="24"> | |||
| <a-form-item required label="意向地区"> | |||
| <a-jilian :dict="2009" @saveCascader="areaSave" placeholder="请选择意向地区" | |||
| :cascader_content="addOtherForm.area"></a-jilian> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm('area')" size="large">取消</a-button> | |||
| <a-button type="primary" @click="sumbitAreaForm" size="large">保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| </a-card> | |||
| </a-list-item> | |||
| </template> | |||
| </a-list> | |||
| <a-typography-title :level="4"> | |||
| 其他意向 | |||
| </a-typography-title> | |||
| <a-form layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="12"> | |||
| <a-form-item label="其他职位"> | |||
| <a-input v-model:value="basicForm.other_positions" placeholder="请输入其他职位" size="large" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="求职类型"> | |||
| <a-xuanze :dict="2019" placeholder="请选择求职类型" @saveSelect="saveJobType" | |||
| :select_content="basicForm.job_type"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="人才类型"> | |||
| <a-xuanze :dict="2020" placeholder="请选择人才类型" @saveSelect="saveTalentType" | |||
| :select_content="basicForm.talent_type"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="工作经验" name="work_experience"> | |||
| <a-xuanze :dict="2021" placeholder="请选择求工作经验" @saveSelect="saveWorkExperience" | |||
| :select_content="basicForm.work_experience"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="月薪要求范围"> | |||
| <a-xuanze :dict="2005" placeholder="请选择月薪要求范围" @saveSelect="saveSalaryRange" | |||
| :select_content="basicForm.salary_range"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="可到职日期"> | |||
| <a-xuanze :dict="2013" placeholder="请选择可到职日期" @saveSelect="saveAvailableDate" | |||
| :select_content="basicForm.available_date"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item label="职称要求"> | |||
| <a-xuanze :dict="2014" placeholder="请选择职称要求" @saveSelect="saveTitleRequirement" | |||
| :select_content="basicForm.title_requirement"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item label="技能认证"> | |||
| <a-xuanze :dict="2015" placeholder="请选择技能认证" @saveSelect="saveSkillCertification" | |||
| :select_content="basicForm.skill_certification"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item label="食宿要求"> | |||
| <a-xuanze :dict="2016" placeholder="请选择食宿要求" @saveSelect="saveAccommodationRequirement" | |||
| :select_content="basicForm.accommodation_requirement"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item label="节假日休息情况"> | |||
| <a-xuanze :dict="2017" placeholder="请选择节假日休息情况" @saveSelect="saveHolidayRest" | |||
| :select_content="basicForm.holiday_rest"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm('basic')" size="large">取消</a-button> | |||
| <a-button type="primary" @click="sumbitBasicForm" size="large">保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| </div> | |||
| </template> | |||
| <script lang="ts" setup> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue'; | |||
| import { message } from 'ant-design-vue'; | |||
| import { PostJobapplicantAdd, PostJobapplicantUpdate } from '@/apis/models'; | |||
| <script setup lang="ts"> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue'; | |||
| import { PostJobapplicantAdddesirearea, PostJobapplicantDeldesirearea, PostJobapplicantUpdatedesirearea, PostJobapplicantListdesirearea, PostJobapplicantDesireareadetail, PostJobapplicantAdddesireindustry, PostJobapplicantDeldesireindustry, PostJobapplicantUpdatedesireindustry, PostJobapplicantListdesireindustry, PostJobapplicantDesireindustrydetail, PostJobapplicantAdddesirebase, PostJobapplicantDeldesirebase, PostJobapplicantUpdatedesirebase, PostJobapplicantDesirebasedetail } from '@/apis/models'; | |||
| import { intersectionAlike } from '@/utils/dataHelper'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| import { dataAreaForm, dataPositionForm, dataBasicForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/intention/data.ts'; | |||
| import { EditOutlined, FileSearchOutlined, RedoOutlined, DeleteOutlined } from '@ant-design/icons-vue'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, dayjs, commomParams, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| const dayjsRef = ref(dayjs); | |||
| let props = defineProps(['customer_record']); | |||
| const emit = defineEmits(); | |||
| const onSubmit = () => { | |||
| // PostJobapplicantAdd(createForm.value).then(res => { | |||
| // message.success('基本资料保存成功') | |||
| // emit('toNext', {activeKey: "2"}) | |||
| // }) | |||
| emit('toNext', { activeKey: "7" }) | |||
| } | |||
| let createForm = ref({ | |||
| area: { | |||
| level1: 0, | |||
| level2: 0, | |||
| level3: 0, | |||
| level4: 0, | |||
| }, | |||
| position: { | |||
| industry: 0, | |||
| }, | |||
| base: { | |||
| job_type: 0, | |||
| talent_type: 0, | |||
| work_experience: 0, | |||
| other_positions: '', | |||
| salary_range: 0, | |||
| available_date: 0, | |||
| title_requirement: 0, | |||
| skill_certification: 0, | |||
| accommodation_requirement: 0, | |||
| holiday_rest: 0, | |||
| } | |||
| let state = ref<Boolean>(false) | |||
| let loading = ref<Boolean>(true); | |||
| let basic = ref<Object>(null) | |||
| let positionList = ref<Object[]>([]) | |||
| let areaList = ref<Object[]>([]) | |||
| let activeKey = ref<Number>(1) | |||
| let areaForm = ref<JobseekerIntentionType.JobseekerIntentionAreaFormType>(dataAreaForm) | |||
| let positionForm = ref<JobseekerIntentionType.JobseekerIntentionPositionFormType>(dataPositionForm) | |||
| let basicForm = ref<JobseekerIntentionType.JobseekerIntentionBasicFormType>(dataBasicForm) | |||
| let addOtherForm = ref<JobseekerIntentionType.OtherFormType>(otherDataForm) | |||
| onMounted(() => { | |||
| getBasic() | |||
| getPosition() | |||
| getArea() | |||
| }) | |||
| const resetForm = () => { | |||
| createForm.value = { | |||
| area: { | |||
| level1: 0, | |||
| level2: 0, | |||
| level3: 0, | |||
| level4: 0, | |||
| }, | |||
| position: { | |||
| industry: 0, | |||
| }, | |||
| base: { | |||
| job_type: 0, | |||
| talent_type: 0, | |||
| work_experience: 0, | |||
| other_positions: '', | |||
| salary_range: 0, | |||
| available_date: 0, | |||
| title_requirement: 0, | |||
| skill_certification: 0, | |||
| accommodation_requirement: 0, | |||
| holiday_rest: 0, | |||
| } | |||
| } | |||
| const getBasic = () => { | |||
| PostJobapplicantDesirebasedetail({ customer_id: props.customer_record.customer_id }).then(res => { | |||
| basic.value = res.data | |||
| basicForm.value = intersectionAlike(basicForm.value, res.data) | |||
| basicForm.value.id = res.data.id; | |||
| basicForm.value.customer_id = props.customer_record.customer_id; | |||
| }) | |||
| } | |||
| const getArea = () => { | |||
| PostJobapplicantListdesirearea({ page: 1, pagesize: 100, customer_id: props.customer_record.customer_id, sortby: 'desc' }).then(res => { | |||
| areaList.value = res.data.jobapplicantareas | |||
| areaForm.value = intersectionAlike(areaForm.value, res.data) | |||
| }) | |||
| } | |||
| const getPosition = () => { | |||
| PostJobapplicantListdesireindustry({ page: 1, pagesize: 100, customer_id: props.customer_record.customer_id, sortby: 'desc' }).then(res => { | |||
| positionList.value = res.data.jobapplicantpositions | |||
| positionForm.value = intersectionAlike(positionForm.value, res.data) | |||
| }) | |||
| } | |||
| // 意向地区 | |||
| const addAreaForm = () => { | |||
| areaList.value.unshift({ edit: true }) | |||
| areaForm.value.customer_id = props.customer_record.customer_id; | |||
| } | |||
| const areaSave = (data) => { | |||
| for (let i = 0; i < 4; i++) { | |||
| createForm.value[`now_level${i + 1}`] = data.arr1[i] || 0; | |||
| areaForm.value[`level${i + 1}`] = data.arr1[i] || 0; | |||
| } | |||
| } | |||
| // 保存意向地区 | |||
| const sumbitAreaForm = () => { | |||
| if (areaForm.value.id) { | |||
| PostJobapplicantUpdatedesirearea(areaForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| resetForm('area') | |||
| }).catch(err => { | |||
| }) | |||
| } else { | |||
| PostJobapplicantAdddesirearea(areaForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| resetForm('area') | |||
| }).catch(err => { | |||
| }) | |||
| } | |||
| } | |||
| const toAreaEdit = (item : Object, index : Number) => { | |||
| areaForm.value.id = item.id; | |||
| getAreaDetail(item) | |||
| areaList.value[index].edit = true | |||
| } | |||
| // 详情 | |||
| const getAreaDetail = (val) => { | |||
| PostJobapplicantDesireareadetail({ id: val.id, customer_id: val.customer_id }).then(res => { | |||
| areaForm.value = intersectionAlike(areaForm.value, res.data) | |||
| areaForm.value.id = res.data.id; | |||
| areaForm.value.customer_id = res.data.customer_id; | |||
| for (var i = 1; i <= 4; i++) { | |||
| if (res.data['level' + i]) { | |||
| addOtherForm.value.area.push(res.data['level' + i]); | |||
| } | |||
| } | |||
| }) | |||
| } | |||
| const delArea = (id : number) => { | |||
| commomParams.value.delParam = { id: id }; | |||
| PostJobapplicantDeldesirearea(commomParams.value.delParam).then(res => { | |||
| successToast('删除成功'); | |||
| areaList.value = []; | |||
| getArea(); | |||
| }) | |||
| } | |||
| // 意向求职 | |||
| const addPositionForm = () => { | |||
| positionList.value.unshift({ edit: true }) | |||
| positionForm.value.customer_id = props.customer_record.customer_id; | |||
| } | |||
| const positionSave = (data) => { | |||
| for (let i = 0; i < 4; i++) { | |||
| createForm.value[`now_level${i + 1}`] = data.arr1[i] || 0; | |||
| for (let i = 0; i < 2; i++) { | |||
| positionForm.value[`level${i + 1}`] = data.arr1[i] || 0; | |||
| } | |||
| console.log(positionForm.value) | |||
| } | |||
| const sumbitPositionForm = () => { | |||
| if (positionForm.value.id) { | |||
| PostJobapplicantUpdatedesireindustry(positionForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| resetForm('position') | |||
| }).catch(err => { | |||
| }) | |||
| } else { | |||
| PostJobapplicantAdddesireindustry(positionForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| resetForm('position') | |||
| }).catch(err => { | |||
| }) | |||
| } | |||
| } | |||
| const toPositionEdit = (item : Object, index : Number) => { | |||
| positionForm.value.id = item.id; | |||
| getPositionDetail(item) | |||
| positionList.value[index].edit = true | |||
| } | |||
| // 详情 | |||
| const getPositionDetail = (val) => { | |||
| PostJobapplicantDesireindustrydetail({ id: val.id, customer_id: val.customer_id }).then(res => { | |||
| positionForm.value = intersectionAlike(positionForm.value, res.data) | |||
| positionForm.value.id = res.data.id; | |||
| positionForm.value.customer_id = res.data.customer_id; | |||
| for (var i = 1; i <= 2; i++) { | |||
| if (res.data['level' + i]) { | |||
| addOtherForm.value.position.push(res.data['level' + i]); | |||
| } | |||
| } | |||
| }) | |||
| } | |||
| const delPosition = (id : number) => { | |||
| commomParams.value.delParam = { id: id }; | |||
| PostJobapplicantDeldesireindustry(commomParams.value.delParam).then(res => { | |||
| successToast('删除成功'); | |||
| positionList.value = []; | |||
| getPosition(); | |||
| }) | |||
| } | |||
| // 求职类型 | |||
| const saveJobType = (data) => { | |||
| createForm.value.job_type = data.val; | |||
| basicForm.value.job_type = data.val.key; | |||
| } | |||
| // 人才类型 | |||
| const saveTalentType = (data) => { | |||
| createForm.value.base.talent_type = data.val; | |||
| basicForm.value.talent_type = data.val.key; | |||
| } | |||
| // 工作经验 | |||
| const saveWorkExperience = (data) => { | |||
| basicForm.value.work_experience = data.val.key; | |||
| } | |||
| // 月薪要求范围 | |||
| const saveSalaryRange = (data) => { | |||
| createForm.value.base.salary_range = data.val; | |||
| basicForm.value.salary_range = data.val.key; | |||
| } | |||
| // 可到职日期 | |||
| const saveAvailableDate = (data) => { | |||
| createForm.value.base.available_date = data.val; | |||
| basicForm.value.available_date = data.val.key; | |||
| } | |||
| // 职称要求 | |||
| const saveTitleRequirement = (data) => { | |||
| createForm.value.base.title_requirement = data.val; | |||
| basicForm.value.title_requirement = data.val.key; | |||
| } | |||
| // 技能认证 | |||
| const saveSkillCertification = (data) => { | |||
| createForm.value.base.skill_certification = data.val; | |||
| basicForm.value.skill_certification = data.val.key; | |||
| } | |||
| // 食宿要求 | |||
| const saveAccommodationRequirement = (data) => { | |||
| createForm.value.base.accommodation_requirement = data.val; | |||
| basicForm.value.accommodation_requirement = data.val.key; | |||
| } | |||
| // 节假日休息情况 | |||
| const saveHolidayRest = (data) => { | |||
| createForm.value.base.holiday_rest = data.val; | |||
| basicForm.value.holiday_rest = data.val.key; | |||
| } | |||
| </script> | |||
| <style> | |||
| const sumbitBasicForm = () => { | |||
| if (basicForm.value.id) { | |||
| PostJobapplicantUpdatedesirebase(basicForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| resetForm('basic') | |||
| }).catch(err => { | |||
| }) | |||
| } else { | |||
| PostJobapplicantAdddesirebase(basicForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| resetForm('basic') | |||
| }).catch(err => { | |||
| }) | |||
| } | |||
| } | |||
| // const toBasicEdit = (item : Object) => { | |||
| // getBasic() | |||
| // activeKey.value = 3 | |||
| // emit("editEdit") | |||
| // } | |||
| const delBasic = (id : number) => { | |||
| commomParams.value.delParam = { id: id }; | |||
| PostJobapplicantDeldesirebase(commomParams.value.delParam).then(res => { | |||
| successToast('删除成功'); | |||
| basic.value = null; | |||
| getBasic(); | |||
| }) | |||
| } | |||
| const resetForm = (val) => { | |||
| if (val == 'area') { | |||
| areaForm.value = reset().dataAreaForm as JobseekerIntentionType.JobseekerIntentionAreaFormType; | |||
| getArea(); | |||
| } | |||
| if (val == 'position') { | |||
| positionForm.value = reset().dataPositionForm as JobseekerIntentionType.JobseekerIntentionPositionFormType; | |||
| getPosition(); | |||
| } | |||
| if (val == 'basic') { | |||
| basicForm.value = reset().dataBasicForm as JobseekerIntentionType.JobseekerIntentionBasicFormType; | |||
| getBasic(); | |||
| } | |||
| addOtherForm.value = reset().otherDataForm as JobseekerIntentionType.OtherFormType; | |||
| } | |||
| // watch(() => [props.form_state], (newVal) => { | |||
| // state.value = newVal[0]; | |||
| // getBasic(); | |||
| // getPosition(); | |||
| // getArea(); | |||
| // }) | |||
| </script> | |||
| <style scoped> | |||
| :deep(.ant-list-item) { | |||
| padding: 12px 0 !important; | |||
| border-block-end: none !important; | |||
| } | |||
| </style> | |||
| @@ -0,0 +1,21 @@ | |||
| export let dataForm = { | |||
| id: 0, | |||
| description: '', | |||
| } | |||
| export let otherDataForm = { | |||
| description: '', | |||
| } | |||
| export const reset = () => { | |||
| dataForm = { | |||
| id: 0, | |||
| description: '', | |||
| } | |||
| otherDataForm = { | |||
| description: '', | |||
| } | |||
| return { dataForm, otherDataForm } | |||
| } | |||
| @@ -0,0 +1,10 @@ | |||
| declare namespace JobseekerIntroductionType { | |||
| type JobseekerIntroductionFormType = { | |||
| id ?: Number, | |||
| description ?: String, | |||
| } | |||
| type OtherFormType = { | |||
| description ?: String, | |||
| } | |||
| } | |||
| @@ -1,56 +1,91 @@ | |||
| <template> | |||
| <a-form :model="createForm" labelAlign="left"> | |||
| <a-row gutter="20"> | |||
| <a-col span="24"> | |||
| <a-form-item label="个人简介" name="description"> | |||
| <QuillEditor theme="snow" :options="options" toolbar="full"/> | |||
| </a-form-item> | |||
| </a-col> | |||
| </a-row> | |||
| <a-row gutter="20"> | |||
| <a-col> | |||
| <a-button type="primary" @click="onSubmit">保存</a-button> | |||
| </a-col> | |||
| <a-col> | |||
| <a-button style="margin-left: 10px">重置</a-button> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| <div> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="24"> | |||
| <a-form-item required label="个人简介" name="description"> | |||
| <QuillEditor theme="snow" :options="richOption" toolbar="full" | |||
| v-model:content="addOtherForm.description" @update:content="onEditorUpdate($event)" | |||
| contentType="html" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm" size="large">取消</a-button> | |||
| <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| </div> | |||
| </template> | |||
| <script lang="ts" setup> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue'; | |||
| import { message } from 'ant-design-vue'; | |||
| import { PostJobapplicantAdd, PostJobapplicantUpdate } from '@/apis/models'; | |||
| import { QuillEditor } from '@vueup/vue-quill' | |||
| import '@vueup/vue-quill/dist/vue-quill.snow.css'; | |||
| <script setup lang="ts"> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue'; | |||
| import { PostJobapplicantAddintroduction, PostJobapplicantUpdateintroduction, GetJobapplicantIntroductiondetail } from '@/apis/models'; | |||
| import { intersectionAlike } from '@/utils/dataHelper'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/introduction/data.ts'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| const dayjsRef = ref(dayjs); | |||
| let props = defineProps(['customer_record']); | |||
| const emit = defineEmits(); | |||
| const onSubmit = () => { | |||
| // PostJobapplicantAdd(createForm.value).then(res => { | |||
| // message.success('基本资料保存成功') | |||
| // emit('toNext', {activeKey: "2"}) | |||
| // }) | |||
| emit('toNext', { activeKey: "4" }) | |||
| } | |||
| let createForm = ref<JobseekerIntroductionType.JobseekerIntroductionFormType>(dataForm) | |||
| let addOtherForm = ref<JobseekerIntroductionType.OtherFormType>(otherDataForm) | |||
| const options = ref({ | |||
| debug: 'info', | |||
| modules: { | |||
| }, | |||
| placeholder: '请输入个人简介', | |||
| theme: 'snow' | |||
| onMounted(() => { | |||
| getBasic() | |||
| }) | |||
| const getBasic = () => { | |||
| GetJobapplicantIntroductiondetail({ customer_id: props.customer_record.customer_id }).then(res => { | |||
| createForm.value = intersectionAlike(createForm.value, res.data) | |||
| createForm.value.id = res.data.id; | |||
| createForm.value.customer_id = res.data.customer_id; | |||
| addOtherForm.value = { | |||
| description: res.data.description, | |||
| } | |||
| }) | |||
| } | |||
| let createForm = ref({ | |||
| description: '', | |||
| }) | |||
| // 富文本 | |||
| const onEditorUpdate = (data) => { | |||
| createForm.value.description = data | |||
| } | |||
| const resetForm = () => { | |||
| createForm.value = { | |||
| description: '', | |||
| const sumbitForm = () => { | |||
| if (createForm.value.id) { | |||
| PostJobapplicantUpdateintroduction(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| // resetForm() | |||
| getBasic(); | |||
| }).catch(err => { | |||
| }) | |||
| } else { | |||
| PostJobapplicantAddintroduction(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| // resetForm() | |||
| getBasic(); | |||
| }).catch(err => { | |||
| }) | |||
| } | |||
| } | |||
| const resetForm = () => { | |||
| createForm.value = reset().dataForm as JobseekerIntroductionType.JobseekerIntroductionFormType; | |||
| addOtherForm.value = reset().otherDataForm as JobseekerIntroductionType.OtherFormType; | |||
| } | |||
| // watch(() => [props.form_state], (newVal) => { | |||
| // state.value = newVal[0]; | |||
| // getBasic(); | |||
| // }) | |||
| </script> | |||
| <style> | |||
| @@ -0,0 +1,27 @@ | |||
| export let dataForm = { | |||
| english: 0, | |||
| mandarin: 0, | |||
| cantonese: 0, | |||
| other_language: 0, | |||
| computer_skills: "" | |||
| } | |||
| export let otherDataForm = { | |||
| } | |||
| export const reset = () => { | |||
| dataForm = { | |||
| english: 0, | |||
| mandarin: 0, | |||
| cantonese: 0, | |||
| other_language: 0, | |||
| computer_skills: "" | |||
| } | |||
| otherDataForm = { | |||
| } | |||
| return { dataForm, otherDataForm } | |||
| } | |||
| @@ -0,0 +1,11 @@ | |||
| declare namespace JobseekerSkillType { | |||
| type JobseekerSkillFormType = { | |||
| id ?: Number, | |||
| english?: Number, | |||
| mandarin?: Number, | |||
| cantonese?: Number, | |||
| other_language?: Number, | |||
| computer_skills?: String, | |||
| } | |||
| } | |||
| @@ -1,94 +1,123 @@ | |||
| <template> | |||
| <a-form :model="createForm" :label-col="{span: 4}" labelAlign="left"> | |||
| <a-row gutter="20"> | |||
| <a-col span="8"> | |||
| <a-form-item label="英语" name="english"> | |||
| <a-c-select :dict="2008" placeholder="请选择掌握程度" @saveSelect="saveEnglish"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="国语" name="mandarin"> | |||
| <a-c-select :dict="2008" placeholder="请选择掌握程度" @saveSelect="saveMandarin"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="粤语" name="cantonese"> | |||
| <a-c-select :dict="2008" placeholder="请选择掌握程度" @saveSelect="saveCantonese"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="第二外语" name="other_language"> | |||
| <a-c-select :dict="2007" placeholder="请选择掌握程度" @saveSelect="saveOtherLanguage"></a-c-select> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="计算机能力" name="computer_skills"> | |||
| <a-input v-model:value="createForm.computer_skills" placeholder="请输入计算机能力" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| </a-row> | |||
| <a-row gutter="20"> | |||
| <a-col> | |||
| <a-button type="primary" @click="onSubmit">保存</a-button> | |||
| </a-col> | |||
| <a-col> | |||
| <a-button style="margin-left: 10px">重置</a-button> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| <div style="width: 100%;"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="8"> | |||
| <a-form-item required label="英语" name="english"> | |||
| <a-xuanze :dict="2008" placeholder="请选择掌握程度" @saveSelect="saveEnglish" | |||
| :select_content="createForm.english"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="国语" name="mandarin"> | |||
| <a-xuanze :dict="2008" placeholder="请选择掌握程度" @saveSelect="saveMandarin" | |||
| :select_content="createForm.mandarin"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="粤语" name="cantonese"> | |||
| <a-xuanze :dict="2008" placeholder="请选择掌握程度" @saveSelect="saveCantonese" | |||
| :select_content="createForm.cantonese"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="第二外语" name="other_language"> | |||
| <a-xuanze :dict="2007" placeholder="请选择掌握程度" @saveSelect="saveOtherLanguage" | |||
| :select_content="createForm.other_language"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="计算机能力" name="computer_skills"> | |||
| <a-input v-model:value="createForm.computer_skills" placeholder="请输入计算机能力"/> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm" >取消</a-button> | |||
| <a-button type="primary" @click="sumbitForm" >保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| </div> | |||
| </template> | |||
| <script lang="ts" setup> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue'; | |||
| import { message } from 'ant-design-vue'; | |||
| import { PostJobapplicantAdd, PostJobapplicantUpdate } from '@/apis/models'; | |||
| <script setup lang="ts"> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue'; | |||
| import { PostJobapplicantAddskill, PostJobapplicantUpdateskill, PostJobapplicantSkilldetail } from '@/apis/models'; | |||
| import { intersectionAlike } from '@/utils/dataHelper'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/skill/data.ts'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| const dayjsRef = ref(dayjs); | |||
| let props = defineProps(['customer_record']); | |||
| const emit = defineEmits(); | |||
| const onSubmit = () => { | |||
| // PostJobapplicantAdd(createForm.value).then(res => { | |||
| // message.success('基本资料保存成功') | |||
| // emit('toNext', {activeKey: "2"}) | |||
| // }) | |||
| emit('toNext', { activeKey: "5" }) | |||
| } | |||
| let createForm = ref({ | |||
| english: 0, | |||
| mandarin: 0, | |||
| cantonese: 0, | |||
| other_language: 0, | |||
| computer_skills: "" | |||
| let createForm = ref<JobseekerSkillType.JobseekerSkillFormType>(dataForm) | |||
| onMounted(() => { | |||
| getBasic() | |||
| }) | |||
| const resetForm = () => { | |||
| createForm.value = { | |||
| english: 0, | |||
| mandarin: 0, | |||
| cantonese: 0, | |||
| other_language: 0, | |||
| computer_skills: "" | |||
| } | |||
| const getBasic = () => { | |||
| PostJobapplicantSkilldetail({customer_id: props.customer_record.customer_id}).then(res => { | |||
| createForm.value = intersectionAlike(createForm.value, res.data) | |||
| createForm.value.id = res.data.id; | |||
| createForm.value.customer_id = res.data.customer_id; | |||
| }) | |||
| } | |||
| // 英语 | |||
| const saveEnglish = (data) => { | |||
| createForm.value.english = data.val; | |||
| createForm.value.english = data.val.key; | |||
| } | |||
| // 国语 | |||
| const saveMandarin = (data) => { | |||
| createForm.value.mandarin = data.val; | |||
| createForm.value.mandarin = data.val.key; | |||
| } | |||
| // 粤语 | |||
| const saveCantonese = (data) => { | |||
| createForm.value.cantonese = data.val; | |||
| createForm.value.cantonese = data.val.key; | |||
| } | |||
| // 第二外语 | |||
| const saveOtherLanguage = (data) => { | |||
| createForm.value.english = data.val; | |||
| createForm.value.other_language = data.val.key; | |||
| } | |||
| const sumbitForm = () => { | |||
| if (createForm.value.id) { | |||
| PostJobapplicantUpdateskill(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| getBasic(); | |||
| // resetForm() | |||
| }).catch(err => { | |||
| }) | |||
| } else { | |||
| PostJobapplicantAddskill(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| getBasic(); | |||
| // resetForm() | |||
| }).catch(err => { | |||
| }) | |||
| } | |||
| } | |||
| const resetForm = () => { | |||
| createForm.value = reset().dataForm as JobseekerSkillType.JobseekerSkillFormType; | |||
| } | |||
| // watch(() => [props.form_state], (newVal) => { | |||
| // state.value = newVal[0]; | |||
| // getBasic(); | |||
| // }) | |||
| </script> | |||
| <style> | |||
| </style> | |||
| </style> | |||
| @@ -0,0 +1,37 @@ | |||
| export let dataForm = { | |||
| start_year: 0, | |||
| start_month: 0, | |||
| end_year: 0, | |||
| end_month: 0, | |||
| end_today: 0, | |||
| school_or_institution: '', | |||
| major: '', | |||
| certificate: '', | |||
| awards: '', | |||
| positions_held: '', | |||
| } | |||
| export let otherDataForm = { | |||
| } | |||
| export const reset = () => { | |||
| dataForm = { | |||
| start_year: 0, | |||
| start_month: 0, | |||
| end_year: 0, | |||
| end_month: 0, | |||
| end_today: 0, | |||
| school_or_institution: '', | |||
| major: '', | |||
| certificate: '', | |||
| awards: '', | |||
| positions_held: '', | |||
| } | |||
| otherDataForm = { | |||
| } | |||
| return { dataForm, otherDataForm } | |||
| } | |||
| @@ -1,5 +1,6 @@ | |||
| declare namespace trainType { | |||
| type addTrainType = { | |||
| declare namespace JobseekerTrainType { | |||
| type JobseekerTrainFormType = { | |||
| id ?:Number, | |||
| start_year ?: Number, | |||
| start_month ?: Number, | |||
| end_year ?: Number, | |||
| @@ -1,92 +1,224 @@ | |||
| <template> | |||
| <a-form :model="createForm" :label-col="{span: 4}" labelAlign="left"> | |||
| <a-row gutter="20"> | |||
| <a-col span="24"> | |||
| <a-form-item required label="是否至今" name="是否至今" :label-col="{span: 0}"> | |||
| <a-radio-group v-model:value="createForm.end_today" button-style="solid"> | |||
| <a-radio-button :value="1">非至今</a-radio-button> | |||
| <a-radio-button :value="2">至今</a-radio-button> | |||
| </a-radio-group> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="学校/培训机构" name="school_or_institution" :label-col="{span: 5}"> | |||
| <a-input v-model:value="createForm.school_or_institution" placeholder="请输入学校/培训机构" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item required label="专业" name="major"> | |||
| <a-input v-model:value="createForm.major" placeholder="请输入专业" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="获得证书" name="certificate"> | |||
| <a-input v-model:value="createForm.certificate" placeholder="请输入获得证书" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="16"> | |||
| <a-form-item label="曾获学校奖项或技能比赛奖项" name="certificate" :label-col="{span: 4}"> | |||
| <a-input v-model:value="createForm.awards" placeholder="请输入曾获学校奖项或技能比赛奖项" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-form-item label="曾任职务" name="awards"> | |||
| <a-input v-model:value="createForm.awards" placeholder="请输入曾任职务" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| </a-row> | |||
| <a-row gutter="20"> | |||
| <a-col> | |||
| <a-button type="primary" @click="onSubmit">保存</a-button> | |||
| </a-col> | |||
| <a-col> | |||
| <a-button style="margin-left: 10px">重置</a-button> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| <a-button type="primary" @click="addForm()">添加培训经历</a-button> | |||
| <a-list :data-source="trainList"> | |||
| <template #loadMore v-if="trainList.length > 0"> | |||
| <a-flex justify="center"> | |||
| <a-space> | |||
| <div v-if="!loading"> | |||
| <a-button @click="onLoadMore">加载更多</a-button> | |||
| </div> | |||
| </a-space> | |||
| </a-flex> | |||
| </template> | |||
| <template #renderItem="{ item, index }"> | |||
| <a-list-item> | |||
| <a-skeleton avatar :title="false" :loading="!!loading" active> | |||
| <a-card :title="item.school_or_institution" style="width: 100%"> | |||
| <template #extra> | |||
| <a-space> | |||
| <a-button v-if="item.id" @click="toEdit(item, index)" type="primary" size="small"> | |||
| 编辑 | |||
| </a-button> | |||
| <a-popconfirm title="是否删除该经历" @confirm="del(item.id)"> | |||
| <a-button v-if="item.id" size="small" danger> | |||
| 删除 | |||
| </a-button> | |||
| </a-popconfirm> | |||
| </a-space> | |||
| </template> | |||
| <a-form :model="createForm" layout="vertical" v-if="item.edit" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="12"> | |||
| <a-form-item required label="培训/教育时间"> | |||
| <a-range-picker v-model:value="time" @Change="getRange" picker="month" | |||
| style="width: 100%;" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="是否至今"> | |||
| <a-radio-group v-model:value="createForm.end_today" button-style="solid" | |||
| style="width: 100%;"> | |||
| <a-radio-button :value="1" style="width: 50%;">非至今</a-radio-button> | |||
| <a-radio-button :value="2" style="width: 50%;">至今</a-radio-button> | |||
| </a-radio-group> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="学校/培训机构" name="school_or_institution"> | |||
| <a-input v-model:value="createForm.school_or_institution" | |||
| placeholder="请输入学校/培训机构" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="专业" name="major"> | |||
| <a-input v-model:value="createForm.major" placeholder="请输入专业" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="获得证书" name="certificate"> | |||
| <a-input v-model:value="createForm.certificate" placeholder="请输入获得证书" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="曾获学校奖项或技能比赛奖项" name="certificate"> | |||
| <a-input v-model:value="createForm.awards" placeholder="请输入曾获学校奖项或技能比赛奖项" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="曾任职务" name="positions_held"> | |||
| <a-input v-model:value="createForm.positions_held" placeholder="请输入曾任职务" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm(index)">取消</a-button> | |||
| <a-button type="primary" @click="saveForm(index)">保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| </a-col> | |||
| </a-row> | |||
| </a-form> | |||
| <template v-else> | |||
| <p>专业:{{item.major}}</p> | |||
| <p>教育/培训时间:{{item.start_year}}.{{item.start_month}}至{{item.end_year}}.{{item.end_month}}</p> | |||
| <p>曾担任的职务:{{item.positions_held}}</p> | |||
| <p>获得的证书:{{item.certificate}}</p> | |||
| <p>获得的奖项:{{item.awards}}</p> | |||
| </template> | |||
| </a-card> | |||
| </a-skeleton> | |||
| </a-list-item> | |||
| </template> | |||
| </a-list> | |||
| </template> | |||
| <script lang="ts" setup> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue'; | |||
| import { message } from 'ant-design-vue'; | |||
| import { PostJobapplicantAdd, PostJobapplicantUpdate } from '@/apis/models'; | |||
| <script setup lang="ts"> | |||
| import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue'; | |||
| import { PostJobapplicantAddtraining, PostJobapplicantDeltraining, PostJobapplicantUpdatetraining, PostJobapplicantListtraining, PostJobapplicantTrainingdetail } from '@/apis/models'; | |||
| import { intersectionAlike } from '@/utils/dataHelper'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/train/data.ts'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| const dayjsRef = ref(dayjs); | |||
| let props = defineProps(['customer_record']); | |||
| const emit = defineEmits(); | |||
| const onSubmit = () => { | |||
| // PostJobapplicantAdd(createForm.value).then(res => { | |||
| // message.success('基本资料保存成功') | |||
| // emit('toNext', {activeKey: "2"}) | |||
| // }) | |||
| emit('toNext', { activeKey: "6" }) | |||
| } | |||
| let createForm = ref({ | |||
| start_year: 0, | |||
| start_month: 0, | |||
| end_year: 0, | |||
| end_month: 0, | |||
| end_today: 0, | |||
| school_or_institution: '', | |||
| major: '', | |||
| certificate: '', | |||
| awards: '', | |||
| positions_held: '', | |||
| let state = ref<Boolean>(false) | |||
| let loading = ref<Boolean>(true); | |||
| let trainList = ref([]); | |||
| let createForm = ref<JobseekerTrainType.JobseekerTrainFormType>(dataForm) | |||
| let time = ref('') | |||
| onMounted(() => { | |||
| commomParams.value.search.customer_id = props.customer_record.customer_id | |||
| getData(); | |||
| }) | |||
| const resetForm = () => { | |||
| createForm.value = { | |||
| start_year: 0, | |||
| start_month: 0, | |||
| end_year: 0, | |||
| end_month: 0, | |||
| end_today: 0, | |||
| school_or_institution: '', | |||
| major: '', | |||
| certificate: '', | |||
| awards: '', | |||
| positions_held: '', | |||
| const getPage = (data : object) => { | |||
| commomParams.value.search.page = data.current; | |||
| commomParams.value.search.pagesize = data.pageSize; | |||
| getData(); | |||
| } | |||
| const getData = async () => { | |||
| try { | |||
| let res = await PostJobapplicantListtraining(commomParams.value.search); | |||
| loading.value = false; | |||
| if (!res.data.jobapplicanttrainings || res.data.jobapplicanttrainings.length <= 0) { | |||
| warnToast('无更多数据') | |||
| commomParams.value.search.page = 1 | |||
| } | |||
| trainList.value = res.data.jobapplicanttrainings ? trainList.value.concat(res.data.jobapplicanttrainings) : trainList.value.concat([]); | |||
| trainList.value.map(item => { | |||
| return item.edit = false | |||
| }) | |||
| } catch { | |||
| loading.value = false; | |||
| } | |||
| } | |||
| const onLoadMore = () => { | |||
| commomParams.value.search.page = commomParams.value.search.page + 1; | |||
| getData(); | |||
| } | |||
| const addForm = () => { | |||
| trainList.value.unshift({edit: true}) | |||
| createForm.value.customer_id = props.customer_record.customer_id; | |||
| } | |||
| // 详情 | |||
| const getDetail = (val) => { | |||
| PostJobapplicantTrainingdetail({ id: val.id, customer_id: val.customer_id }).then(res => { | |||
| createForm.value = intersectionAlike(createForm.value, res.data) | |||
| createForm.value.id = res.data.id; | |||
| createForm.value.customer_id = res.data.customer_id; | |||
| time.value = [dayjsRef.value(`${res.data.start_year}-${res.data.start_month}`), dayjsRef.value(`${res.data.end_year}-${res.data.end_month}`)] | |||
| }) | |||
| } | |||
| const getRange = (val) => { | |||
| let day1 = dayjsRef.value(val[0]).format('YYYY-MM-DD').split('-'); | |||
| let day2 = dayjsRef.value(val[1]).format('YYYY-MM-DD').split('-'); | |||
| createForm.value.start_year = parseInt(day1[0], 10); | |||
| createForm.value.start_month = parseInt(day1[1], 10); | |||
| createForm.value.end_year = parseInt(day2[0], 10); | |||
| createForm.value.end_month = parseInt(day2[1], 10); | |||
| } | |||
| const saveForm = (index : Number) => { | |||
| if (createForm.value.id) { | |||
| PostJobapplicantUpdatetraining(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| // getData(); | |||
| resetForm(index) | |||
| }).catch(err => { | |||
| }) | |||
| } else { | |||
| PostJobapplicantAddtraining(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| resetForm(index) | |||
| }).catch(err => { | |||
| }) | |||
| } | |||
| } | |||
| const resetForm = (index : Number) => { | |||
| trainList.value = []; | |||
| time.value = '' | |||
| createForm.value = reset().dataForm as JobseekerTrainType.JobseekerTrainFormType; | |||
| getData(); | |||
| } | |||
| // watch(() => [props.form_state], (newVal) => { | |||
| // state.value = newVal[0]; | |||
| // }) | |||
| const toEdit = (item : Object, index : Number) => { | |||
| createForm.value.id = item.id; | |||
| getDetail(item) | |||
| trainList.value[index].edit = true | |||
| } | |||
| const del = (id : number) => { | |||
| commomParams.value.delParam = { id: id }; | |||
| PostJobapplicantDeltraining(commomParams.value.delParam).then(res => { | |||
| successToast('删除成功'); | |||
| trainList.value = []; | |||
| getData(); | |||
| }) | |||
| } | |||
| </script> | |||
| <style> | |||
| <style scoped> | |||
| :deep(.ant-list-item) { | |||
| padding: 12px 0 !important; | |||
| border-block-end: none !important; | |||
| } | |||
| </style> | |||
| @@ -1,90 +1,91 @@ | |||
| <template> | |||
| <a-modal v-model:visible="openOtherModel_1" title="预览简历" ok-text="提交" cancel-text="取消" @ok="sumbitForm" | |||
| @cancel="cancelModal" width="50%" :footer="null"> | |||
| @cancel="cancelModal" width="60%" :footer="null"> | |||
| <a-spin :spinning="spinning"> | |||
| <a-typography> | |||
| <a-typography-title :level="4"> | |||
| <div class="text-decoration"> | |||
| <div class="text-content">基本资料</div> | |||
| </div> | |||
| </a-typography-title> | |||
| </a-typography-title> | |||
| <a-typography-paragraph> | |||
| <a-row :gutter="[20,20]"> | |||
| <a-col span="24"> | |||
| <a-row :gutter="[20,20]"> | |||
| <a-col span="10"> | |||
| <a-row> | |||
| <a-col span="24"> | |||
| 姓 名:{{detail.seekername}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 性 别:{{detail.gender}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 身份证号:{{detail.id_number}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 民 族:{{detail.ethnicity_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 身 高:{{detail.height}}cm | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 政治面貌:{{detail.political_status_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 联系方式:{{detail.mobile}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 邮 箱:{{detail.email}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24"> | |||
| 姓 名:{{detail.seekername}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 性 别:{{detail.gender}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 身份证号:{{detail.id_number}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 民 族:{{detail.ethnicity_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 身 高:{{detail.height}}cm | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 政治面貌:{{detail.political_status_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 联系方式:{{detail.mobile}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 邮 箱:{{detail.email}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-col> | |||
| <a-col span="10"> | |||
| <a-col span="8"> | |||
| <a-row> | |||
| <a-col span="24"> | |||
| 出生日期:{{detail.dob}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 婚姻状况:{{detail.marital_status_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 学 历:{{detail.education_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 体 重:{{detail.weight}}kg | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 现居地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 籍 贯:{{detail.native_place_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 户口地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24"> | |||
| 出生日期:{{detail.dob}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 婚姻状况:{{detail.marital_status_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 学 历:{{detail.education_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 体 重:{{detail.weight}}kg | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 现居地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 籍 贯:{{detail.native_place_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 户口地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-col> | |||
| <a-col span="4"> | |||
| <a-image :src="'https://rcsc-test.jcjob.cn/img'+detail.photo" /> | |||
| <a-col span="6"> | |||
| <image-container :need="true" | |||
| :imgObj="{src: detail.photo? imageprefix+detail.photo : '/images/gongzhonghao.png' ,width: '150px',height:'210px'}"></image-container> | |||
| </a-col> | |||
| </a-row> | |||
| </a-col> | |||
| </a-row> | |||
| </a-typography-paragraph> | |||
| <a-typography-title :level="4"> | |||
| <div class="text-decoration"> | |||
| <a-typography-title :level="4"><div class="text-decoration"> | |||
| <div class="text-content">个人简介</div> | |||
| </div> | |||
| </a-typography-title> | |||
| </div></a-typography-title> | |||
| <a-typography-paragraph> | |||
| <div v-html="detail.introduction"></div> | |||
| </a-typography-paragraph> | |||
| <a-typography-title :level="4"> | |||
| <div class="text-decoration"> | |||
| <a-typography-title :level="4"><div class="text-decoration"> | |||
| <div class="text-content">求职期望</div> | |||
| </div> | |||
| </a-typography-title> | |||
| </div></a-typography-title> | |||
| <a-typography-paragraph> | |||
| <a-row> | |||
| <a-col span="24"> | |||
| @@ -97,23 +98,29 @@ | |||
| <a-row> | |||
| <a-col span="8" v-if="detail.desire_areas"> | |||
| <a-row> | |||
| <a-col span="24" v-for="(item,index) in detail.desire_areas"> | |||
| 期望地址{{index + 1}}:{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}}{{item.level3_txt ? item.level3_txt : ''}}{{item.level4_txt ? item.level4_txt : ''}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24" v-for="(item,index) in detail.desire_areas"> | |||
| 期望地址{{index + 1}}:{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}}{{item.level3_txt ? item.level3_txt : ''}}{{item.level4_txt ? item.level4_txt : ''}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-col> | |||
| <a-col span="8" v-if="detail.desire_positions"> | |||
| <a-row> | |||
| <a-col span="24" v-for="(item,index) in detail.desire_positions"> | |||
| 期望职位{{index + 1}}:{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24" v-for="(item,index) in detail.desire_positions"> | |||
| 期望职位{{index + 1}}:{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-col> | |||
| <a-col span="8" v-if="detail.desire_industrys"> | |||
| <a-row> | |||
| <a-col span="24" v-for="(item,index) in detail.desire_industrys"> | |||
| 期望行业{{index + 1}}:{{item.industry_txt}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24" v-for="(item,index) in detail.desire_industrys"> | |||
| 期望行业{{index + 1}}:{{item.industry_txt}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-col> | |||
| </a-row> | |||
| @@ -121,36 +128,33 @@ | |||
| </a-row> | |||
| </a-typography-paragraph> | |||
| </a-typography> | |||
| <a-typography-title :level="4"> | |||
| <div class="text-decoration"> | |||
| <div class="text-content">专业技能掌握能力</div> | |||
| </div> | |||
| </a-typography-title> | |||
| <a-typography-title :level="4"><div class="text-decoration"> | |||
| <div class="text-content">专业技能掌握能力</div> | |||
| </div></a-typography-title> | |||
| <a-typography-paragraph> | |||
| <a-row> | |||
| <a-col span="24"> | |||
| 英 语:{{detail.english_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 国 语:{{detail.mandarin_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 粤 语:{{detail.cantonese_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 第二外语:{{detail.salary_range_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 计算机能力:{{detail.computer_skills}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24"> | |||
| 英 语:{{detail.english_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 国 语:{{detail.mandarin_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 粤 语:{{detail.cantonese_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 第二外语:{{detail.salary_range_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 计算机能力:{{detail.computer_skills}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-typography-paragraph> | |||
| <a-typography-title :level="4"> | |||
| <div class="text-decoration"> | |||
| <div class="text-content">工作经历</div> | |||
| </div> | |||
| </a-typography-title> | |||
| <a-typography-title :level="4"><div class="text-decoration"> | |||
| <div class="text-content">工作经历</div> | |||
| </div></a-typography-title> | |||
| <a-typography-paragraph> | |||
| <template v-for="(item,index) in detail.experiences"> | |||
| <a-card :title="item.company_name" style="margin-bottom: 10px;"> | |||
| @@ -160,10 +164,9 @@ | |||
| </a-card> | |||
| </template> | |||
| </a-typography-paragraph> | |||
| <a-typography-title :level="4"> | |||
| <div class="text-decoration"> | |||
| <div class="text-content">教育/培训经历</div> | |||
| </div></a-typography-title> | |||
| <a-typography-title :level="4"><div class="text-decoration"> | |||
| <div class="text-content">教育/培训经历</div> | |||
| </div></a-typography-title> | |||
| <a-typography-paragraph> | |||
| <template v-for="(item,index) in detail.trainings"> | |||
| <a-card :title="item.school_or_institution" style="margin-bottom: 10px;"> | |||
| @@ -184,12 +187,11 @@ | |||
| import { GetJobseekerDetail, GetJobapplicantIntroductiondetail, PostJobapplicantTrainingdetail, PostJobapplicantDesireindustrydetail, PostJobapplicantExperiencedetail } from '@/apis/models'; | |||
| import { message } from 'ant-design-vue'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, commomParams, hideOtherModal1, openOtherModel_1 } = useCommon(); | |||
| let { store, commomParams, hideOtherModal1, openOtherModel_1, imageprefix} = useCommon(); | |||
| const emit = defineEmits(); | |||
| let props = defineProps(['detail_record']); | |||
| let detailTitle = ref<String>('') | |||
| let detail = ref<Boolean>(true) | |||
| let activeKey = ref<String>(["1", "2", "3", "4", "5", "6", "7", "8"]); | |||
| let detail = ref<Object>({}) | |||
| let trainList = ref<Object[]>([]) | |||
| let experienceList = ref<Object[]>([]) | |||
| let introduction = ref<Object>({}) | |||
| @@ -198,32 +200,19 @@ | |||
| openOtherModel_1 = computed(() => { | |||
| return store.state.openOtherModel_1; | |||
| }) | |||
| const items = [ | |||
| { | |||
| title: '一般', | |||
| description: 'This is a Step 1.', | |||
| }, | |||
| { | |||
| title: '熟练', | |||
| description: 'This is a Step 2.', | |||
| }, | |||
| { | |||
| title: 'Step 3', | |||
| description: 'This is a Step 3.', | |||
| }, | |||
| ]; | |||
| watch(() => [props.detail_record], (newVal) => { | |||
| if (newVal[0]) { | |||
| spinning.value = false | |||
| GetJobseekerDetail({ customer_id: props.detail_record.customer_id }).then(res => { | |||
| GetJobseekerDetail({ customer_id: props.detail_record.customer_id, application_id: props.detail_record.id }).then(res => { | |||
| detail.value = res.data | |||
| console.log(detail.value) | |||
| }) | |||
| } | |||
| }) | |||
| }, { immediate: true }) | |||
| const cancelModal = () => { | |||
| emit('closePermission'); | |||
| hideOtherModal1() | |||
| } | |||
| </script> | |||
| @@ -249,13 +238,14 @@ | |||
| padding: 6px; | |||
| // padding-top: 6px; | |||
| } | |||
| .text-decoration { | |||
| position: relative; | |||
| display: inline-block; | |||
| overflow: visible; | |||
| } | |||
| .text-decoration::before { | |||
| content: ''; | |||
| width: 6px; | |||
| @@ -264,7 +254,7 @@ | |||
| position: absolute; | |||
| top: 4px | |||
| } | |||
| .text-content { | |||
| position: relative; | |||
| margin-left: 20px; | |||
| @@ -5,19 +5,21 @@ | |||
| @page="getPage" :loading="loading"> | |||
| <template #default="{ record }"> | |||
| <a-row :gutter="10"> | |||
| <!-- <a-col><a-button type="primary" size="small" primary @click="edit(record)">编辑</a-button></a-col> --> | |||
| <a-col><a-button type="primary" size="small" primary @click="edit(record)">编辑</a-button></a-col> | |||
| <a-col><a-button type="primary" size="small" primary @click="detail(record)">预览</a-button></a-col> | |||
| <a-popconfirm title="该简历通过审核?" @confirm="pass(record)"> | |||
| <a-col v-if="record.status == 1"><a-button type="primary" size="small" primary>通过</a-button></a-col> | |||
| <a-col v-if="record.status == 1"><a-button type="primary" size="small" >通过</a-button></a-col> | |||
| </a-popconfirm> | |||
| <a-col v-if="record.status == 1"><a-button type="primary" size="small" primary | |||
| <a-col v-if="record.status == 1"><a-button type="primary" size="small" | |||
| @click="interview(record)">不通过</a-button></a-col> | |||
| <a-popconfirm title="是否要推送该简历到ES?" @confirm="pushEs(record.customer_id)"> | |||
| <!-- <a-popconfirm title="是否要推送该简历到ES?" @confirm="pushEs(record.customer_id)"> | |||
| <a-col><a-button type="primary" size="small" primary>推送该简历到ES</a-button></a-col> | |||
| </a-popconfirm> | |||
| </a-popconfirm> --> | |||
| </a-row> | |||
| </template> | |||
| </a-c-table> | |||
| <resume-add v-if="openForm" :edit_record="edit_record" @successAdd="successAdd" @closeAdd="closeAdd"></resume-add> | |||
| <resume-detail :detail_record="detail_record" @closeAdd="closePermission"></resume-detail> | |||
| <a-modal v-model:open="openInterview" centered title="不通过原因" @ok="unpass"> | |||
| <a-textarea v-model:value="form.aduit_memo" placeholder="请输入不通过原因" /> | |||
| @@ -27,14 +29,17 @@ | |||
| <script lang="ts" setup> | |||
| import { ref, onMounted, watch, computed, createVNode } from 'vue'; | |||
| import ResumeSearch from '@/views/jobSeeker/resume/search/index.vue'; | |||
| // import ResumeAdd from '@/views/jobSeeker/resume/add/add.vue'; | |||
| import ResumeAdd from '@/views/jobSeeker/resume/add/add.vue'; | |||
| import ResumeDetail from '@/views/jobSeeker/resume/detail/detail.vue'; | |||
| import { PostJobseekerList, PostJobapplicantUpdate, PostEsJobseeker } from '@/apis/models'; | |||
| import { PostJobseekerList, PostJobapplicantUpdate, PostEsJobseeker , GetCustomerUpdate} from '@/apis/models'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| import { cols } from '@/views/jobSeeker/resume/columns'; | |||
| import { UserOutlined, DownOutlined } from '@ant-design/icons-vue'; | |||
| let { store, commomParams, showModal, showOtherModal1, message, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| let loading = ref<Boolean>(true); | |||
| let openForm = ref<Boolean>(false); | |||
| onMounted(() => { | |||
| commomParams.value.search.rand = false | |||
| getData(); | |||
| }) | |||
| @@ -44,6 +49,7 @@ | |||
| } | |||
| const clearData = (data : object) => { | |||
| commomParams.value.search.rand = false | |||
| if (data) { | |||
| commomParams.value.search = data | |||
| } else { | |||
| @@ -52,7 +58,8 @@ | |||
| pagesize: 10, | |||
| sort: 'id', | |||
| sortby: 'desc', | |||
| keyword: '' | |||
| keyword: '', | |||
| rand: false | |||
| } | |||
| } | |||
| getData(); | |||
| @@ -88,6 +95,7 @@ | |||
| // 编辑 | |||
| let edit_record = ref<Object>(null) | |||
| const edit = (record : object) => { | |||
| openForm.value = true | |||
| edit_record.value = record; | |||
| showModal() | |||
| } | |||
| @@ -122,15 +130,15 @@ | |||
| status: 3, | |||
| aduit_memo: '' | |||
| } | |||
| const interview = (record : Object) => { | |||
| openInterview.value = true | |||
| form.id = record.id; | |||
| form.customer_id = record.customer_id; | |||
| form.status = 3 | |||
| form.aduit_memo = '' | |||
| form.aduit_memo = '不通过' | |||
| } | |||
| const unpass = () => { | |||
| PostJobapplicantUpdate(form).then(res => { | |||
| @@ -44,12 +44,14 @@ | |||
| interface listType { | |||
| gender ?: String | |||
| education ?: Number | |||
| education ?: Number, | |||
| rand ?: Boolean | |||
| } | |||
| commomParams.value.search = commomParams.value.search as listType; | |||
| commomParams.value.search.gender = null; | |||
| commomParams.value.search.education = null; | |||
| commomParams.value.search.rand = false; | |||
| // watch(() => props.search_params, (newVal) => { | |||
| @@ -8,7 +8,7 @@ | |||
| <template #default="{ record }"> | |||
| <a-row :gutter="10"> | |||
| <a-col><a-button type="primary" size="small" primary @click="edit(record)">编辑</a-button></a-col> | |||
| <a-popconfirm title="是否删除该地址?" @confirm="del(record.id)"> | |||
| <a-popconfirm title="是否删除该配置项?" @confirm="del(record.id)"> | |||
| <a-col><a-button type="primary" size="small" danger>删除</a-button></a-col> | |||
| </a-popconfirm> | |||
| </a-row> | |||