| import{_ as r,r as s,o as d,c as p,a as e,b as a,w as c,d as l,p as i,e as u}from"./index-LmxcGnXN.js";const h={},t=o=>(i("data-v-80d1ee2a"),o=o(),u(),o),m={class:"nopage"},f=t(()=>e("span",{style:{color:"#0074D9"}},"4",-1)),v=t(()=>e("span",{style:{color:"#67C23A"}},"0",-1)),x=t(()=>e("span",{style:{color:"#0074D9"}},"4",-1)),y=t(()=>e("p",null,"你页面走丢了~",-1));function b(o,k){const n=s("a-button"),_=s("router-link");return d(),p("div",m,[f,v,x,e("div",null,[y,e("p",null,[a(_,{to:"/job/home"},{default:c(()=>[a(n,{type:"primary"},{default:c(()=>[l("返回首页")]),_:1})]),_:1})])])])}const w=r(h,[["render",b],["__scopeId","data-v-80d1ee2a"]]);export{w as default}; |
| .nopage[data-v-80d1ee2a]{margin-top:5vw;text-align:center}.nopage span[data-v-80d1ee2a]{font-size:10vw}.nopage p[data-v-80d1ee2a]{margin:1vw;font-size:2.5vw} |
| <meta charset="UTF-8" /> | <meta charset="UTF-8" /> | ||||
| <link rel="icon" type="image/svg+xml" href="/vite.svg" /> | <link rel="icon" type="image/svg+xml" href="/vite.svg" /> | ||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
| <title>Vite + Vue + TS</title> | |||||
| <script type="module" crossorigin src="/assets/index-M75Plfpg.js"></script> | |||||
| <link rel="stylesheet" crossorigin href="/assets/index-9Ic14vNC.css"> | |||||
| <script src="https://map.qq.com/api/gljs?v=1.exp&key=MPBBZ-HUICZ-EGRXB-7AHZI-R4GQZ-QWBSO"></script> | |||||
| <title>菊城人才网</title> | |||||
| <script type="module" crossorigin src="/assets/index-LmxcGnXN.js"></script> | |||||
| <link rel="stylesheet" crossorigin href="/assets/index-8AYdxV9j.css"> | |||||
| </head> | </head> | ||||
| <body> | <body> | ||||
| <div id="app"></div> | <div id="app"></div> |
| <meta charset="UTF-8" /> | <meta charset="UTF-8" /> | ||||
| <link rel="icon" type="image/svg+xml" href="/vite.svg" /> | <link rel="icon" type="image/svg+xml" href="/vite.svg" /> | ||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
| <title>Vite + Vue + TS</title> | |||||
| <script src="https://map.qq.com/api/gljs?v=1.exp&key=MPBBZ-HUICZ-EGRXB-7AHZI-R4GQZ-QWBSO"></script> | |||||
| <title>菊城人才网</title> | |||||
| </head> | </head> | ||||
| <body> | <body> | ||||
| <div id="app"></div> | <div id="app"></div> |
| case 403: | case 403: | ||||
| msgModel(response.data.msg) | msgModel(response.data.msg) | ||||
| break; | break; | ||||
| case 404: | |||||
| break; | |||||
| case 600: | case 600: | ||||
| if (response.data.errors && Object.keys(response.data.errors).length > 0 ) { | |||||
| if (response.data.errors && Object.keys(response.data.errors).length > 0) { | |||||
| msgModel(response.data.errors) | msgModel(response.data.errors) | ||||
| } else { | } else { | ||||
| msgModel(response.data.msg) | msgModel(response.data.msg) |
| export const GetRecruitmentbookList = getModel(url.RecruitmentbookList); // 列表 | export const GetRecruitmentbookList = getModel(url.RecruitmentbookList); // 列表 | ||||
| export const GetRecruitmentbookDetail = getModel(url.RecruitmentbookDetail); // 详情 | export const GetRecruitmentbookDetail = getModel(url.RecruitmentbookDetail); // 详情 | ||||
| // 收藏 | |||||
| // 收藏 | |||||
| export const PostJobseekAddfavorite = postModel(url.JobseekAddfavorite); | export const PostJobseekAddfavorite = postModel(url.JobseekAddfavorite); | ||||
| export const PostJobseekDelfavorite = postModel(url.JobseekDelfavorite); | export const PostJobseekDelfavorite = postModel(url.JobseekDelfavorite); | ||||
| export const PostJobseekUpdatefavorite = postModel(url.JobseekUpdatefavorite); | export const PostJobseekUpdatefavorite = postModel(url.JobseekUpdatefavorite); | ||||
| export const PostJobseekUpdateapplication = postModel(url.JobseekUpdateapplication); | export const PostJobseekUpdateapplication = postModel(url.JobseekUpdateapplication); | ||||
| export const GetJobseekListapplication = getModel(url.JobseekListapplication); | export const GetJobseekListapplication = getModel(url.JobseekListapplication); | ||||
| export const GetJobseekApplicationdetail = getModel(url.JobseekApplicationdetail); | export const GetJobseekApplicationdetail = getModel(url.JobseekApplicationdetail); | ||||
| export const GetJobseekerReommendJob = getModel(url.JobseekerReommendJob); | |||||
| export const PosCompanySearch = postModel(url.CompanySearch); | |||||
| // 简历 | // 简历 | ||||
| // 列表 | // 列表 | ||||
| export const PostJobapplicantUpdatetraining = postModel(url.JobapplicantUpdatetraining); | export const PostJobapplicantUpdatetraining = postModel(url.JobapplicantUpdatetraining); | ||||
| export const PostJobapplicantListtraining = getModel(url.JobapplicantListtraining); | export const PostJobapplicantListtraining = getModel(url.JobapplicantListtraining); | ||||
| export const PostJobapplicantTrainingdetail = getModel(url.JobapplicantTrainingdetail); | export const PostJobapplicantTrainingdetail = getModel(url.JobapplicantTrainingdetail); | ||||
| // 求职意向-基本 | |||||
| // 求职意向-基本 | |||||
| export const PostJobapplicantAdddesirebase = postModel(url.JobapplicantAdddesirebase); | export const PostJobapplicantAdddesirebase = postModel(url.JobapplicantAdddesirebase); | ||||
| export const PostJobapplicantDeldesirebase = postModel(url.JobapplicantDeldesirebase); | export const PostJobapplicantDeldesirebase = postModel(url.JobapplicantDeldesirebase); | ||||
| export const PostJobapplicantUpdatedesirebase = postModel(url.JobapplicantUpdatedesirebase); | 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 PostJobapplicantDesirebasedetail = getModel(url.JobapplicantDesirebasedetail); | ||||
| // 求职意向-地区 | |||||
| // 求职意向-地区 | |||||
| export const PostJobapplicantAdddesirearea = postModel(url.JobapplicantAdddesirearea); | export const PostJobapplicantAdddesirearea = postModel(url.JobapplicantAdddesirearea); | ||||
| export const PostJobapplicantDeldesirearea = postModel(url.JobapplicantDeldesirearea); | export const PostJobapplicantDeldesirearea = postModel(url.JobapplicantDeldesirearea); | ||||
| export const PostJobapplicantUpdatedesirearea = postModel(url.JobapplicantUpdatedesirearea); | export const PostJobapplicantUpdatedesirearea = postModel(url.JobapplicantUpdatedesirearea); | ||||
| export const PostJobapplicantListdesirearea = getModel(url.JobapplicantListdesirearea); | export const PostJobapplicantListdesirearea = getModel(url.JobapplicantListdesirearea); | ||||
| export const PostJobapplicantDesireareadetail = getModel(url.JobapplicantDesireareadetail); | export const PostJobapplicantDesireareadetail = getModel(url.JobapplicantDesireareadetail); | ||||
| // 求职意向-职位 | |||||
| // 求职意向-职位 | |||||
| export const PostJobapplicantAdddesireindustry = postModel(url.JobapplicantAdddesireindustry); | export const PostJobapplicantAdddesireindustry = postModel(url.JobapplicantAdddesireindustry); | ||||
| export const PostJobapplicantDeldesireindustry = postModel(url.JobapplicantDeldesireindustry); | export const PostJobapplicantDeldesireindustry = postModel(url.JobapplicantDeldesireindustry); | ||||
| export const PostJobapplicantUpdatedesireindustry = postModel(url.JobapplicantUpdatedesireindustry); | export const PostJobapplicantUpdatedesireindustry = postModel(url.JobapplicantUpdatedesireindustry); |
| 'JobseekListapplication': String, | 'JobseekListapplication': String, | ||||
| 'JobseekApplicationdetail':String, | 'JobseekApplicationdetail':String, | ||||
| JobseekerReommendJob: String, | |||||
| CompanySearch: String, | |||||
| // 简历 | // 简历 | ||||
| // 列表 | // 列表 |
| PersonInterviewList: web + '/person/interview_list', // 面试邀请记录 | PersonInterviewList: web + '/person/interview_list', // 面试邀请记录 | ||||
| PersonInterviewViewStatus: web + '/person/interview_view_status', // 是否参加面试 | PersonInterviewViewStatus: web + '/person/interview_view_status', // 是否参加面试 | ||||
| PersonInterviewDel: web + '/person/interview_del', // 删除面试邀请 | PersonInterviewDel: web + '/person/interview_del', // 删除面试邀请 | ||||
| JobseekerReommendJob: web + '/jobseeker/recommendjob', | |||||
| CompanySearch: web + '/company/search', | |||||
| // 收藏 | // 收藏 | ||||
| 'JobseekAddfavorite': web + '/jobseek/addfavorite', // 添加 | 'JobseekAddfavorite': web + '/jobseek/addfavorite', // 添加 | ||||
| 'JobapplicantListdesirearea': web + '/jobapplicant/listdesirearea', // 查看 | 'JobapplicantListdesirearea': web + '/jobapplicant/listdesirearea', // 查看 | ||||
| 'JobapplicantDesireareadetail': web + '/jobapplicant/desireareadetail', // 详情 | 'JobapplicantDesireareadetail': web + '/jobapplicant/desireareadetail', // 详情 | ||||
| // 求职意向-职位 | // 求职意向-职位 | ||||
| 'JobapplicantAdddesireindustry': web + '/jobapplicant/adddesireindustry', // 添加 | |||||
| 'JobapplicantDeldesireindustry': web + '/jobapplicant/deldesireindustry', // 删除 | |||||
| 'JobapplicantUpdatedesireindustry': web + '/jobapplicant/updatedesireindustry', // 修改 | |||||
| 'JobapplicantListdesireindustry': web + '/jobapplicant/listdesireindustry', // 查看 | |||||
| 'JobapplicantDesireindustrydetail': web + '/jobapplicant/desireindustrydetail', // 详情 | |||||
| 'JobapplicantAdddesireindustry': web + '/jobapplicant/adddesireposition', // 添加 | |||||
| 'JobapplicantDeldesireindustry': web + '/jobapplicant/deldesireposition', // 删除 | |||||
| 'JobapplicantUpdatedesireindustry': web + '/jobapplicant/updatedesireposition', // 修改 | |||||
| 'JobapplicantListdesireindustry': web + '/jobapplicant/listdesireposition', // 查看 | |||||
| 'JobapplicantDesireindustrydetail': web + '/jobapplicant/desirepositiondetail', // 详情 | |||||
| // 证书 | // 证书 | ||||
| 'JobapplicantAddcertificate': web + '/jobapplicant/addcertificate', // 添加 | 'JobapplicantAddcertificate': web + '/jobapplicant/addcertificate', // 添加 | ||||
| 'JobapplicantDelcertificate': web + '/jobapplicant/delcertificate', // 删除 | 'JobapplicantDelcertificate': web + '/jobapplicant/delcertificate', // 删除 |
| <template> | <template> | ||||
| <a-affix :offset-top="90"> | <a-affix :offset-top="90"> | ||||
| <a-menu v-model:selectedKeys="selectedKeys" @click="menuClick" style="width: 100%;" mode="inline"> | |||||
| <a-menu v-model:selectedKeys="selectedKeys" @click="menuClick" style="width: 100%;border-radius: 8px;" mode="inline"> | |||||
| <a-menu-item v-for="(item, index) in menuList" :key="item.key">{{item.title}}</a-menu-item> | <a-menu-item v-for="(item, index) in menuList" :key="item.key">{{item.title}}</a-menu-item> | ||||
| </a-menu> | </a-menu> | ||||
| </a-affix> | </a-affix> | ||||
| } | } | ||||
| </script> | </script> | ||||
| <style> | |||||
| <style scoped> | |||||
| :deep(.ant-menu-item-selected) { | |||||
| color: #4FBE70 !important; | |||||
| } | |||||
| </style> | </style> |
| <template> | <template> | ||||
| <div> | <div> | ||||
| <template v-if="state"> | <template v-if="state"> | ||||
| <a-form :model="createForm" layout="vertical"> | |||||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="企业名称" name="full_name"> | <a-form-item label="企业名称" name="full_name"> |
| <template> | <template> | ||||
| <template v-if="state"> | <template v-if="state"> | ||||
| <a-form :model="createForm" layout="vertical"> | |||||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="部门名称" name="name"> | <a-form-item label="部门名称" name="name"> | ||||
| </a-form> | </a-form> | ||||
| </template> | </template> | ||||
| <template v-else> | <template v-else> | ||||
| <a-search @searchData="searchData"></a-search> | |||||
| <!-- <a-search @searchData="searchData"></a-search> --> | |||||
| <a-list :data-source="departmengList"> | <a-list :data-source="departmengList"> | ||||
| <template #loadMore> | <template #loadMore> | ||||
| <div v-if="!loading" | <div v-if="!loading" | ||||
| </script> | </script> | ||||
| <style> | |||||
| <style scoped> | |||||
| :deep(.ant-list-item:last-child) { | |||||
| border-block-end: none !important; | |||||
| } | |||||
| </style> | </style> |
| <template> | <template> | ||||
| <div> | <div> | ||||
| <template v-if="state"> | <template v-if="state"> | ||||
| <a-form :model="createForm" layout="vertical"> | |||||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-form-item label="上传企业图片" name="photo"> | <a-form-item label="上传企业图片" name="photo"> | ||||
| <upload upload_txt="上传企业图片" @uploadSuccess="uploadPhotoSuccess" | <upload upload_txt="上传企业图片" @uploadSuccess="uploadPhotoSuccess" |
| <template> | <template> | ||||
| <div> | <div> | ||||
| <template v-if="state"> | <template v-if="state"> | ||||
| <a-form :model="createForm" layout="vertical"> | |||||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-form-item label="上传营业执照" name="photo"> | <a-form-item label="上传营业执照" name="photo"> | ||||
| <upload upload_txt="上传营业执照" @uploadSuccess="uploadPhotoSuccess" | <upload upload_txt="上传营业执照" @uploadSuccess="uploadPhotoSuccess" |
| <div class="steps-content"> | <div class="steps-content"> | ||||
| <div v-show="current == 0"> | <div v-show="current == 0"> | ||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="24"> | |||||
| <a-col span="12"> | |||||
| <a-form-item label="是否紧急" name="urgent"> | <a-form-item label="是否紧急" name="urgent"> | ||||
| <a-radio-group v-model:value="createForm.urgent" button-style="solid"> | |||||
| <a-radio-button :value="1">是</a-radio-button> | |||||
| <a-radio-button :value="2">否</a-radio-button> | |||||
| <a-radio-group v-model:value="createForm.urgent" button-style="solid" size="large" 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-radio-group> | ||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-form-item label="选择部门" name="department_id"> | <a-form-item label="选择部门" name="department_id"> | ||||
| <a-select v-model:value="addOtherForm.department_name" @change="departmentChange" | <a-select v-model:value="addOtherForm.department_name" @change="departmentChange" | ||||
| placeholder="请进行搜索选择部门" show-search :filter-option="false" label-in-value | placeholder="请进行搜索选择部门" show-search :filter-option="false" label-in-value | ||||
| @search="departmentSearch"> | |||||
| @search="departmentSearch" size="large"> | |||||
| <a-select-option v-for="item in department_list" :key="item.id" :value="item.id" | <a-select-option v-for="item in department_list" :key="item.id" :value="item.id" | ||||
| :label="item.name" label-in-value>{{item.name}}</a-select-option> | :label="item.name" label-in-value>{{item.name}}</a-select-option> | ||||
| </a-select> | </a-select> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item required label="职位名称" name="name"> | <a-form-item required label="职位名称" name="name"> | ||||
| <a-input v-model:value="createForm.name" placeholder="请输入职位名称" /> | |||||
| <a-input v-model:value="createForm.name" placeholder="请输入职位名称" size="large"/> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="招聘人数" name="invite_count"> | <a-form-item label="招聘人数" name="invite_count"> | ||||
| <a-input v-model:value="createForm.invite_count" placeholder="请输入招聘人数" /> | |||||
| <a-input v-model:value="createForm.invite_count" placeholder="请输入招聘人数" size="large"/> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item required label="有效天数" name="useful_life"> | <a-form-item required label="有效天数" name="useful_life"> | ||||
| <a-input-number :min="0" type="number" v-model:value="createForm.useful_life" | <a-input-number :min="0" type="number" v-model:value="createForm.useful_life" | ||||
| placeholder="请输入有效天数" style="width: 100%;" /> | |||||
| placeholder="请输入有效天数" style="width: 100%;" size="large" /> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item required label="到期日期"> | <a-form-item required label="到期日期"> | ||||
| <a-date-picker v-model:value="addOtherForm.daoqi_date" @Change="disabledDateChange" | <a-date-picker v-model:value="addOtherForm.daoqi_date" @Change="disabledDateChange" | ||||
| style="width: 100%;" /> | |||||
| style="width: 100%;" size="large"/> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="关键词"> | <a-form-item label="关键词"> | ||||
| <a-input v-model:value="createForm.key_word" placeholder="请输入关键词" /> | |||||
| <a-input v-model:value="createForm.key_word" placeholder="请输入关键词" size="large"/> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="最小年龄" name="age_min"> | <a-form-item label="最小年龄" name="age_min"> | ||||
| <a-input-number :min="0" type="number" v-model:value="createForm.age_min" | <a-input-number :min="0" type="number" v-model:value="createForm.age_min" | ||||
| placeholder="请输入最小年龄" style="width: 100%;" /> | |||||
| placeholder="请输入最小年龄" style="width: 100%;" size="large"/> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="最大年龄" name="age_max"> | <a-form-item label="最大年龄" name="age_max"> | ||||
| <a-input-number :min="0" type="number" v-model:value="createForm.age_max" | <a-input-number :min="0" type="number" v-model:value="createForm.age_max" | ||||
| placeholder="请输入最大年龄" style="width: 100%;" /> | |||||
| placeholder="请输入最大年龄" style="width: 100%;" size="large"/> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item required label="专业" name="major"> | <a-form-item required label="专业" name="major"> | ||||
| <a-input v-model:value="createForm.major" placeholder="请输入专业" /> | |||||
| <a-input v-model:value="createForm.major" placeholder="请输入专业" size="large"/> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| .steps-action { | .steps-action { | ||||
| margin-top: 12px; | margin-top: 12px; | ||||
| } | } | ||||
| :deep(.ant-steps-item-icon) { | |||||
| background-color: #4FBE70 !important; | |||||
| border-color: #4FBE70 !important; | |||||
| } | |||||
| </style> | </style> |
| <template> | <template> | ||||
| <a-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></a-search> | |||||
| <a-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></a-search> | |||||
| <a-biaoge :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | <a-biaoge :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | ||||
| @page="getPage" :loading="loading"> | @page="getPage" :loading="loading"> | ||||
| <template #default="{ record }"> | <template #default="{ record }"> | ||||
| <a-popconfirm title="是否要申请参加该招聘会?" @confirm="applyFor(record.id)"> | <a-popconfirm title="是否要申请参加该招聘会?" @confirm="applyFor(record.id)"> | ||||
| <a-col><a-button type="primary" size="small">申请</a-button></a-col> | <a-col><a-button type="primary" size="small">申请</a-button></a-col> | ||||
| </a-popconfirm> | </a-popconfirm> | ||||
| <a-popconfirm placement="topLeft" ok-text="关闭" @confirm="confirm"> | |||||
| <a-popconfirm placement="left" ok-text="关闭" @confirm="confirm"> | |||||
| <template #icon></template> | |||||
| <template #title> | <template #title> | ||||
| <a-typography> | |||||
| <a-typography-title :level="3">{{detailData.title}}</a-typography-title> | |||||
| <a-typography-paragraph>发布时间:{{detailData.created_at}}</a-typography-paragraph> | |||||
| <a-typography-text > | |||||
| <a-card style="width: 600px; overflow: auto;"> | |||||
| <a-card-meta :title="detailData.title" :description="'发布时间:'+detailData.created_at"> | |||||
| </a-card-meta> | |||||
| <a-divider /> | |||||
| <div style="height: 600px; overflow: auto;"> | |||||
| <div v-html="detailData.content"></div> | <div v-html="detailData.content"></div> | ||||
| </a-typography-text> | |||||
| </a-typography> | |||||
| </div> | |||||
| </a-card> | |||||
| </template> | </template> | ||||
| <a-button type="primary" size="small" @click="toDetail(record.id)">详情</a-button> | |||||
| <a-button type="primary" size="small" @click="toDetail(record)">详情</a-button> | |||||
| </a-popconfirm> | </a-popconfirm> | ||||
| </a-row> | </a-row> | ||||
| </template> | </template> | ||||
| // 申请 | // 申请 | ||||
| const applyFor = (val) => { | const applyFor = (val) => { | ||||
| PostRecruitmentbookAdd({ recruitment_id: val, company_id: 0}).then(res => { | |||||
| PostRecruitmentbookAdd({ recruitment_id: val, company_id: 0 }).then(res => { | |||||
| successToast('预定成功') | successToast('预定成功') | ||||
| }) | }) | ||||
| } | } | ||||
| // 详情 | // 详情 | ||||
| let detailData = ref<object>({}) | let detailData = ref<object>({}) | ||||
| const toDetail = (val) => { | |||||
| PostRecruitmentbookAdd({ id: val}).then(res => { | |||||
| detailData.value = res.data | |||||
| }) | |||||
| const toDetail = (data) => { | |||||
| detailData.value = data | |||||
| } | } | ||||
| </script> | </script> | ||||
| <StarOutlined /> | <StarOutlined /> | ||||
| 预览 | 预览 | ||||
| </a-button> | </a-button> | ||||
| <a-button> | |||||
| <StarOutlined /> | |||||
| 收藏 | |||||
| <a-button @click="putInTatent(item.customer_id)"> | |||||
| 放入人才库 | |||||
| </a-button> | </a-button> | ||||
| <a-button> | |||||
| <a-button @click="interview(item)"> | |||||
| 邀请面试 | 邀请面试 | ||||
| </a-button> | </a-button> | ||||
| </template> | </template> | ||||
| </a-flex> | </a-flex> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| <a-modal v-model:open="openInterview" centered title="面试邀请" @ok="interviewOk"> | |||||
| <a-space direction="vertical" style="width: 100%;"> | |||||
| <a-select v-model:value="position_name" @change="positionChange" placeholder="请进行搜索选择职位" show-search | |||||
| :filter-option="false" label-in-value @search="positionSearch" size="large" style="width: 100%;"> | |||||
| <a-select-option v-for="item in position_list" :key="item.id" :value="item.id" :label="item.name" | |||||
| label-in-value>{{item.name}}</a-select-option> | |||||
| </a-select> | |||||
| <a-date-picker v-model:value="time" @Change="timeChange" show-time style="width: 100%;" | |||||
| placeholder="请选择面试日期" size="large" :disabled-date="disabledDate" /> | |||||
| </a-space> | |||||
| </a-modal> | |||||
| <resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail> | <resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail> | ||||
| </template> | </template> | ||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, computed, onMounted, defineProps, watch } from 'vue'; | |||||
| import { ref, onMounted, computed, watch, defineEmits, createVNode } from 'vue'; | |||||
| import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue' | import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue' | ||||
| import { PostJobseekerList } from '@/apis/models'; | |||||
| import { PostJobseekerList, PostCompanyTalentPoolAdd, PostCompanyResumeInterviewAdd, PostCompanyJobList } from '@/apis/models'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | import { useCommon } from '@/hooks/useCommon'; | ||||
| let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal, showOtherModal1 } = useCommon(); | |||||
| let { store, commomParams, ExclamationCircleOutlined, Modal, dayjs, disabledDate, showOtherModal1 } = useCommon(); | |||||
| const dayjsRef = ref(dayjs); | |||||
| let props = defineProps(['search']); | let props = defineProps(['search']); | ||||
| let seekerList = ref<object[]>([]) | let seekerList = ref<object[]>([]) | ||||
| let loading = ref<Boolean>(true); | let loading = ref<Boolean>(true); | ||||
| detail_record.value = record; | detail_record.value = record; | ||||
| showOtherModal1() | showOtherModal1() | ||||
| } | } | ||||
| // onMounted(() => { | |||||
| // getData(); | |||||
| // }) | |||||
| // 邀请面试 | |||||
| let openInterview = ref<Boolean>(false); | |||||
| let form = { | |||||
| job_id: '', | |||||
| customer_id: '', | |||||
| interview_date_time: '' | |||||
| } | |||||
| const interview = (record : Object) => { | |||||
| positionSearch('') | |||||
| console.log(record) | |||||
| openInterview.value = true | |||||
| form.job_id = ''; | |||||
| form.customer_id = record.customer_id; | |||||
| form.interview_date_time = '' | |||||
| time.value = ''; | |||||
| position_name.value = null; | |||||
| } | |||||
| // 选择职位 | |||||
| let position_list = ref<Object[]>([]) | |||||
| let position_name = ref<String>(null) | |||||
| const positionSearch = (val) => { | |||||
| PostCompanyJobList({ keyword: val }).then(res => { | |||||
| position_list.value = res.data.list; | |||||
| }) | |||||
| } | |||||
| const positionChange = (val : Object) => { | |||||
| position_name.value = val.option.label; | |||||
| form.job_id = Number(val.key); | |||||
| } | |||||
| let time = ref<String>(''); | |||||
| const timeChange = (val) => { | |||||
| form.interview_date_time = dayjsRef.value(val).format('YYYY-MM-DD HH:mm:ss'); | |||||
| } | |||||
| const interviewOk = () => { | |||||
| console.log(form) | |||||
| if (!form.interview_date_time) { | |||||
| warnToast('请选择面试时间') | |||||
| return; | |||||
| } else { | |||||
| PostCompanyResumeInterviewAdd(form).then(res => { | |||||
| successToast('已发送邀请') | |||||
| openInterview.value = false | |||||
| getData(); | |||||
| }) | |||||
| } | |||||
| } | |||||
| // 放入人才库 | |||||
| const putInTatent = (id) => { | |||||
| Modal.confirm({ | |||||
| title: `是否要放入人才库`, | |||||
| centered: true, | |||||
| icon: createVNode(ExclamationCircleOutlined), | |||||
| onOk() { | |||||
| PostCompanyTalentPoolAdd({ customer_id: id }).then(res => { | |||||
| successToast('已放入人才库') | |||||
| getData(); | |||||
| }) | |||||
| }, | |||||
| onCancel() { | |||||
| }, | |||||
| }); | |||||
| } | |||||
| onMounted(() => { | |||||
| getData(); | |||||
| }) | |||||
| watch(() => [props.search], (newVal) => { | watch(() => [props.search], (newVal) => { | ||||
| if (newVal[0] ) { | |||||
| if (newVal[0]) { | |||||
| commomParams.value.search = newVal[0]; | commomParams.value.search = newVal[0]; | ||||
| getData(); | getData(); | ||||
| } | } |
| <template #overlay> | <template #overlay> | ||||
| <a-menu> | <a-menu> | ||||
| <a-menu-item key="1"> | <a-menu-item key="1"> | ||||
| <a-button @click="edit(record)" block>预览简历</a-button> | |||||
| <a-button @click="detail(record)" block>预览简历</a-button> | |||||
| </a-menu-item> | </a-menu-item> | ||||
| <a-menu-item key="2"> | <a-menu-item key="2"> | ||||
| <a-button @click="edit(record)" block>查看联系方式</a-button> | <a-button @click="edit(record)" block>查看联系方式</a-button> | ||||
| </a-row> | </a-row> | ||||
| </template> | </template> | ||||
| </a-biaoge> | </a-biaoge> | ||||
| <resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail> | |||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, onMounted, computed, defineEmits, createVNode } from 'vue'; | import { ref, onMounted, computed, defineEmits, createVNode } from 'vue'; | ||||
| import { GetCompanyResumeViewedContactList } from '@/apis/models'; | import { GetCompanyResumeViewedContactList } from '@/apis/models'; | ||||
| import ASearch from '@/components/company/resume/read/search.vue'; | import ASearch from '@/components/company/resume/read/search.vue'; | ||||
| import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue' | |||||
| import { useCommon } from '@/hooks/useCommon'; | import { useCommon } from '@/hooks/useCommon'; | ||||
| import { cols } from '@/components/company/resume/read/columns'; | import { cols } from '@/components/company/resume/read/columns'; | ||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | import { warnToast, successToast } from '@/utils/toastHelper'; | ||||
| import { DownOutlined } from '@ant-design/icons-vue'; | import { DownOutlined } from '@ant-design/icons-vue'; | ||||
| const emit = defineEmits(); | const emit = defineEmits(); | ||||
| let { commomParams, ExclamationCircleOutlined, Modal } = useCommon(); | |||||
| let { commomParams, ExclamationCircleOutlined, Modal, showOtherModal1 } = useCommon(); | |||||
| let loading = ref<Boolean>(true); | let loading = ref<Boolean>(true); | ||||
| onMounted(() => { | onMounted(() => { | ||||
| }); | }); | ||||
| } | } | ||||
| let detail_record = ref<Object>(null) | |||||
| const detail = (record) => { | |||||
| detail_record.value = record; | |||||
| showOtherModal1() | |||||
| } | |||||
| // const del = (id : number) => { | // const del = (id : number) => { | ||||
| // commomParams.value.delParam = { id: id }; | // commomParams.value.delParam = { id: id }; |
| <a-button @click="contact(record)" block>查看联系方式</a-button> | <a-button @click="contact(record)" block>查看联系方式</a-button> | ||||
| </a-menu-item> | </a-menu-item> | ||||
| <a-menu-item key="1"> | <a-menu-item key="1"> | ||||
| <a-button @click="interview(record)" block>预览简历</a-button> | |||||
| <a-button @click="detail(record)" block>预览简历</a-button> | |||||
| </a-menu-item> | </a-menu-item> | ||||
| <a-menu-item key="2"> | <a-menu-item key="2"> | ||||
| <a-button @click="interview(record)" block>邀请面试</a-button> | <a-button @click="interview(record)" block>邀请面试</a-button> | ||||
| </template> | </template> | ||||
| </a-biaoge> | </a-biaoge> | ||||
| <a-modal v-model:open="openInterview" centered title="面试邀请" @ok="interviewOk"> | <a-modal v-model:open="openInterview" centered title="面试邀请" @ok="interviewOk"> | ||||
| <a-date-picker v-model:value="time" @Change="timeChange" show-time style="width: 100%;" placeholder="请选择面试日期" size="large" | |||||
| :disabled-date="disabledDate" /> | |||||
| <a-date-picker v-model:value="time" @Change="timeChange" show-time style="width: 100%;" placeholder="请选择面试日期" | |||||
| size="large" :disabled-date="disabledDate" /> | |||||
| </a-modal> | </a-modal> | ||||
| <resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail> | |||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, onMounted, computed, defineEmits, createVNode } from 'vue'; | import { ref, onMounted, computed, defineEmits, createVNode } from 'vue'; | ||||
| import { GetCompanyResumeList, PostCompanyResumeInterviewAdd, PostCompanyTalentPoolAdd, PostCompanyResumeRecycle, GetJobapplicantContactdetail } from '@/apis/models'; | import { GetCompanyResumeList, PostCompanyResumeInterviewAdd, PostCompanyTalentPoolAdd, PostCompanyResumeRecycle, GetJobapplicantContactdetail } from '@/apis/models'; | ||||
| import ASearch from '@/components/company/resume/interview/search.vue'; | import ASearch from '@/components/company/resume/interview/search.vue'; | ||||
| import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue' | |||||
| import { useCommon } from '@/hooks/useCommon'; | import { useCommon } from '@/hooks/useCommon'; | ||||
| import { cols } from '@/components/company/resume/interview/columns'; | import { cols } from '@/components/company/resume/interview/columns'; | ||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | import { warnToast, successToast } from '@/utils/toastHelper'; | ||||
| import { DownOutlined } from '@ant-design/icons-vue'; | import { DownOutlined } from '@ant-design/icons-vue'; | ||||
| const emit = defineEmits(); | const emit = defineEmits(); | ||||
| let { commomParams, ExclamationCircleOutlined, Modal, dayjs, disabledDate } = useCommon(); | |||||
| let { commomParams, ExclamationCircleOutlined, Modal, dayjs, disabledDate, showOtherModal1 } = useCommon(); | |||||
| const dayjsRef = ref(dayjs); | const dayjsRef = ref(dayjs); | ||||
| let loading = ref<Boolean>(true); | let loading = ref<Boolean>(true); | ||||
| loading.value = false; | loading.value = false; | ||||
| } | } | ||||
| } | } | ||||
| const contact = () => { | const contact = () => { | ||||
| Modal.confirm({ | Modal.confirm({ | ||||
| title: `是否要放入人才库`, | title: `是否要放入人才库`, | ||||
| }) | }) | ||||
| }, | }, | ||||
| onCancel() { | onCancel() { | ||||
| }, | }, | ||||
| }); | }); | ||||
| } | } | ||||
| // 邀请面试 | // 邀请面试 | ||||
| let openInterview = ref<Boolean>(false); | let openInterview = ref<Boolean>(false); | ||||
| } else { | } else { | ||||
| PostCompanyResumeInterviewAdd(form).then(res => { | PostCompanyResumeInterviewAdd(form).then(res => { | ||||
| successToast('已发送邀请') | successToast('已发送邀请') | ||||
| openInterview.value = false | |||||
| getData(); | getData(); | ||||
| }) | }) | ||||
| } | } | ||||
| } | } | ||||
| let detail_record = ref<Object>(null) | |||||
| const detail = (record) => { | |||||
| detail_record.value = record; | |||||
| showOtherModal1() | |||||
| } | |||||
| <template v-else> | <template v-else> | ||||
| <a-list item-layout="horizontal" :data-source="articleList"> | <a-list item-layout="horizontal" :data-source="articleList"> | ||||
| <template #renderItem="{ item }"> | <template #renderItem="{ item }"> | ||||
| <a-list-item> | |||||
| <a-list-item-meta description="2020-11-12"> | |||||
| <template #title> | |||||
| {{ item.title }} | |||||
| </template> | |||||
| <a-list-item @click="toDetail(item)"> | |||||
| <a-list-item-meta :title="item.title" :description="'发布时间:'+item.created_at"> | |||||
| </a-list-item-meta> | </a-list-item-meta> | ||||
| <template #extra> | |||||
| <!-- <template #extra> | |||||
| <a-button @click="download(item.cover_img)">下载</a-button> | <a-button @click="download(item.cover_img)">下载</a-button> | ||||
| </template> | |||||
| </template> --> | |||||
| </a-list-item> | </a-list-item> | ||||
| </template> | </template> | ||||
| </a-list> | </a-list> | ||||
| <a-pagination v-model:current="current" :total="500" style="text-align: center;" /> | |||||
| <a-flex align="center" justify="center"> | |||||
| <a-pagination hideOnSinglePage v-model:current="current" | |||||
| :total="total" @change="pageChange" /> | |||||
| </a-flex> | |||||
| </template> | </template> | ||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| let articleList = ref<object[]>([]) | let articleList = ref<object[]>([]) | ||||
| let detail = ref<Object>(null) | let detail = ref<Object>(null) | ||||
| let key = ref<Number>(10) | let key = ref<Number>(10) | ||||
| let current = ref<Number>(1) | |||||
| let total = ref<Number>(0) | |||||
| const pageChange = (page) => { | |||||
| current.value = page | |||||
| getArticleList(key.value) | |||||
| } | |||||
| const getArticleList = (val) => { | const getArticleList = (val) => { | ||||
| GetArticleList({ section_id: val }).then(res => { | |||||
| articleList.value = res.data.articles | |||||
| GetArticleList({section_id: val, page: current.value}).then(res => { | |||||
| articleList.value = res.data.articles; | |||||
| total.value = res.data.total; | |||||
| }) | }) | ||||
| } | } | ||||
| const toDetail = (data) => { | const toDetail = (data) => { | ||||
| detail.value = data | detail.value = data | ||||
| } | } | ||||
| detail.value = null | detail.value = null | ||||
| } | } | ||||
| const download = (val) => { | |||||
| let url = 'https://rcsc-test.jcjob.cn/img' + val; | |||||
| window.open(url); | |||||
| } | |||||
| // const download = (val) => { | |||||
| // let url = 'https://rcsc-test.jcjob.cn/img' + val; | |||||
| // window.open(url); | |||||
| // } | |||||
| watch(() => props.key_id, (newVal) => { | watch(() => props.key_id, (newVal) => { |
| <template> | |||||
| <a-modal v-model:visible="openOtherModel_1" width="40%" centered @cancel="cancelModal" :footer="null"> | |||||
| <a-flex align="center" justify="center"> | |||||
| <!-- <a-flex vertical align="center" justify="space-between" :style="{ padding: '32px' }"> --> | |||||
| <a-flex justify="space-between" class="login-content"> | |||||
| <a-flex vertical align="center" justify="space-around" :style="{ padding: '0 36px' }"> | |||||
| <a-space direction="vertical" align="center" justify="space-between" :size="10"> | |||||
| <div> | |||||
| 小程序 | |||||
| </div> | |||||
| <image-container | |||||
| :imgObj="{src: '/images/xiaochengxu.jpg',width: '120px',height:'120px'}"></image-container> | |||||
| </a-space> | |||||
| <a-space direction="vertical" align="center" justify="space-between" :size="10"> | |||||
| <div> | |||||
| 公众号 | |||||
| </div> | |||||
| <image-container | |||||
| :imgObj="{src: '/images/gongzhonghao.png',width: '120px',height:'120px'}"></image-container> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| <a-flex vertical align="center" :style="{ width: '480px' }"> | |||||
| <a-row :gutter="[20, 20]" v-if="currentModule == 'login'"> | |||||
| <a-col span="24"> | |||||
| <a-segmented v-model:value="loginSegmentedValue" :options="['我要求职', '我要招聘']" | |||||
| @change="loginTypeChange" size="large" block> | |||||
| </a-segmented> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-input v-model:value="createForm.username" placeholder="手机号" size="large" /> | |||||
| </a-col> | |||||
| <template v-if="loginMethod == 'password'"> | |||||
| <a-col span="24"> | |||||
| <a-input v-model:value="createForm.password" placeholder="密码" size="large" /> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-input v-model:value="createForm.captcha" placeholder="验证码" size="large" /> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <image-container :imgObj="{src: codeImage,width: '100%',height: '40px', mode: 'fill'}" | |||||
| @click="getCaptcha"></image-container> | |||||
| </a-col> | |||||
| </template> | |||||
| <template v-if="loginMethod == 'message'"> | |||||
| <a-col span="12"> | |||||
| <a-input v-model:value="smsForm.captcha" placeholder="验证码" size="large" /> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <image-container :imgObj="{src: codeImage,width: '100%',height: '40px', mode: 'fill'}" | |||||
| @click="getCaptcha"></image-container> | |||||
| </a-col> | |||||
| <a-col span="18"> | |||||
| <a-input v-model:value="smsLoginForm.sms_code" placeholder="短信验证码" size="large" /> | |||||
| </a-col> | |||||
| <a-col span="6"> | |||||
| <a-button type="primary" block size="large" @click="sendCode" | |||||
| :disabled="state.disabled"> | |||||
| {{ state.codeTxt }}</a-button> | |||||
| </a-col> | |||||
| </template> | |||||
| <a-col span="24"> | |||||
| <a-button type="primary" block @click="login" size="large">登录</a-button> | |||||
| <a-flex justify="flex-end" :style="{ 'padding-top': '10px' }"> | |||||
| <div @click="toModule('register')" style="cursor: pointer;"> | |||||
| 没有账号?去注册 | |||||
| </div> | |||||
| </a-flex> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-flex justify="center"> | |||||
| <a-button v-if="loginMethod == 'password'" type="link" | |||||
| @click="changeLoginMethod('message')">短信验证码登录</a-button> | |||||
| <a-button v-if="loginMethod == 'message'" type="link" | |||||
| @click="changeLoginMethod('password')">密码登录</a-button> | |||||
| </a-flex> | |||||
| </a-col> | |||||
| </a-row> | |||||
| <a-row :gutter="[20, 20]" v-if="currentModule == 'register'"> | |||||
| <a-col span="24"> | |||||
| <a-segmented v-model:value="registerSegmentedValue" :options="['求职者注册', '企业注册']" | |||||
| @change="loginTypeChange" size="large" block> | |||||
| </a-segmented> | |||||
| </a-col> | |||||
| <template v-if="registerSegmentedValue == '求职者注册'"> | |||||
| <a-col span="24"> | |||||
| <a-input v-model:value="personalForm.mobile" placeholder="请输入手机号" size="large" /> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-input-password v-model:value="personalForm.password" placeholder="请输入密码" | |||||
| size="large" /> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-input v-model:value="personalForm.captcha" placeholder="验证码" size="large" /> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <image-container :imgObj="{src: codeImage,width: '100%',height: '40px', mode: 'fill'}" | |||||
| @click="getCaptcha"></image-container> | |||||
| </a-col> | |||||
| </template> | |||||
| <template v-if="registerSegmentedValue == '企业注册'"> | |||||
| <a-col span="24"> | |||||
| <a-input v-model:value="companyForm.contact_mobile" placeholder="请输入联系号码" | |||||
| size="large" /> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-input-password v-model:value="companyForm.password" placeholder="请输入密码" | |||||
| size="large" /> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-input-password v-model:value="companyForm.comform_password" placeholder="请输入确认密码" | |||||
| size="large" /> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-input v-model:value="companyForm.email" placeholder="请输入邮箱" size="large" /> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-input v-model:value="companyForm.full_name" placeholder="请输入企业名称" size="large" /> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-input v-model:value="companyForm.contact_name" placeholder="请输入联系人" size="large" /> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-input v-model:value="companyForm.contact_phone" placeholder="请输入联系固话" size="large" /> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-input v-model:value="companyForm.captcha" placeholder="验证码" size="large" /> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <image-container :imgObj="{src: codeImage,width: '100%',height: '40px', mode: 'fill'}" | |||||
| @click="getCaptcha"></image-container> | |||||
| </a-col> | |||||
| </template> | |||||
| <a-col span="24"> | |||||
| <a-button type="primary" block @click="register" size="large">注册</a-button> | |||||
| <a-flex justify="flex-end" :style="{ 'padding-top': '10px' }"> | |||||
| <div @click="toModule('login')" style="cursor: pointer;"> | |||||
| 已有账号,去登录 | |||||
| </div> | |||||
| </a-flex> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-flex> | |||||
| </a-flex> | |||||
| </a-flex> | |||||
| </a-modal> | |||||
| </template> | |||||
| <script lang="ts" setup> | |||||
| import { ref, onMounted, computed, onBeforeUnmount } from 'vue'; | |||||
| import { GetCaptcha, PostJobseekerlogin, PostCompanyLogin, PostSmsSend, PostJobseekerSmsLogin, PostCompanyLoginByMobile } from '@/apis/models'; | |||||
| import { store } from '@/store/index'; | |||||
| import { router } from '@/router/index'; | |||||
| import { dataForm, otherDataForm, personalDataForm, companyDataForm, smsDataForm, smsLoginDataForm, reset } from '@/views/login/data.ts'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | |||||
| let { store, commomParams, hideOtherModal1, openOtherModel_1 } = useCommon(); | |||||
| let currentModule = ref<String>('login') // 当前模块 login 登录 resiter 注册 | |||||
| let loginSegmentedValue = ref<String>('我要求职') // 个人或者企业 // 我要求职 个人求职 我要招聘 企业 | |||||
| let loginMethod = ref<String>('message') // 登录方式 // password 密码登录 message 短信登录 | |||||
| let registerSegmentedValue = ref<String>('求职者注册') // 注册方式 | |||||
| let createForm = ref<LoginType.LoginFormType>(dataForm) | |||||
| let smsLoginForm = ref<LoginType.SmsLoginFormType>(smsLoginDataForm) | |||||
| let smsForm = ref<LoginType.SmsFormType>(smsDataForm) | |||||
| let personalForm = ref<RegisterType.RegisterPersonalFormType>(personalDataForm) | |||||
| let companyForm = ref<RegisterType.RegisterCompanyFormType>(companyDataForm) | |||||
| let capt_id = ref<String>('') | |||||
| let codeImage = ref<String>('') | |||||
| interface State { | |||||
| count : number; | |||||
| sending : boolean; | |||||
| disabled : boolean; | |||||
| } | |||||
| const state = ref<State>({ | |||||
| count: 60, | |||||
| codeTxt: '获取验证码', | |||||
| disabled: false, | |||||
| }); | |||||
| let timer = ref<any>(null) | |||||
| const sendCode = () => { | |||||
| smsForm.value.mobile = createForm.value.username ? createForm.value.username : ''; | |||||
| smsForm.value.capt_id = capt_id.value; | |||||
| if (!smsForm.value.mobile) { | |||||
| warnToast('请输入手机号') | |||||
| return false; | |||||
| } | |||||
| if (!smsForm.value.captcha) { | |||||
| warnToast('请输入图形验证码') | |||||
| return false; | |||||
| } | |||||
| PostSmsSend(smsForm.value).then(res => { | |||||
| successToast('发送验证码成功,验证码有效期为一分钟'); | |||||
| timer.value = setInterval(function () { | |||||
| if (state.value.count > 1) { | |||||
| state.value.count = state.value.count - 1; | |||||
| state.value.codeTxt = '剩余' + (state.value.count - 1) + '秒'; | |||||
| state.value.disabled = true | |||||
| } else { | |||||
| clearInterval(timer.value); | |||||
| state.value.count = 60; | |||||
| state.value.codeTxt = '获取验证码'; | |||||
| state.value.disabled = false | |||||
| }; | |||||
| }, 1000) | |||||
| }) | |||||
| }; | |||||
| onBeforeUnmount(() => { | |||||
| clearInterval(timer.value); | |||||
| }) | |||||
| const loginTypeChange = () => { | |||||
| resetForm() | |||||
| } | |||||
| const changeLoginMethod = (val : string) => { | |||||
| loginMethod.value = val; | |||||
| resetForm() | |||||
| } | |||||
| const toModule = (val : string) => { | |||||
| currentModule.value = val; | |||||
| createForm.value = reset().dataForm as LoginType.LoginFormType; | |||||
| personalForm.value = reset().personalDataForm as RegisterType.RegisterPersonalFormType; | |||||
| companyForm.value = reset().companyDataForm as RegisterType.RegisterCompanyFormType; | |||||
| smsForm.value = reset().smsDataForm as LoginType.SmsFormType; | |||||
| smsLoginForm.value = reset().smsLoginDataForm as LoginType.SmsLoginFormType; | |||||
| getCaptcha() | |||||
| } | |||||
| const cancelModal = () => { | |||||
| resetForm() | |||||
| hideOtherModal1() | |||||
| } | |||||
| const resetForm = () => { | |||||
| createForm.value = reset().dataForm as LoginType.LoginFormType; | |||||
| personalForm.value = reset().personalDataForm as RegisterType.RegisterPersonalFormType; | |||||
| companyForm.value = reset().companyDataForm as RegisterType.RegisterCompanyFormType; | |||||
| smsForm.value = reset().smsDataForm as LoginType.SmsFormType; | |||||
| smsLoginForm.value = reset().smsLoginDataForm as LoginType.SmsLoginFormType; | |||||
| getCaptcha() | |||||
| } | |||||
| const getCaptcha = () => { | |||||
| capt_id.value = '' | |||||
| GetCaptcha().then(res => { | |||||
| capt_id.value = res.data.capt_id; | |||||
| codeImage.value = res.data.img; | |||||
| }) | |||||
| } | |||||
| const login = () => { | |||||
| if (loginSegmentedValue.value == '我要求职') { | |||||
| if (loginMethod.value == 'password') { | |||||
| createForm.value.capt_id = capt_id.value; | |||||
| PostJobseekerlogin(createForm.value).then(res => { | |||||
| successToast('登录成功'); | |||||
| store.commit('setShowLoginBox', { | |||||
| showLoginBox: false | |||||
| }) | |||||
| store.commit('getToken', { | |||||
| token: res.data.jwttoken.accesstoken | |||||
| }) | |||||
| store.commit('getRole', { | |||||
| role: 'personal' | |||||
| }) | |||||
| store.commit('getPageType', { | |||||
| pageType: 'personal' | |||||
| }) | |||||
| sessionStorage.setItem('token', res.data.jwttoken.accesstoken) | |||||
| sessionStorage.setItem('role', 'personal') | |||||
| sessionStorage.setItem('pageType', '') | |||||
| sessionStorage.setItem('id', res.data.customerid) | |||||
| resetForm() | |||||
| hideOtherModal1() | |||||
| location.reload() | |||||
| }).catch(err => { | |||||
| getCaptcha() | |||||
| }) | |||||
| } else { | |||||
| smsLoginForm.value.mobile = createForm.value.username ? createForm.value.username : ''; | |||||
| smsLoginForm.value.sms_code = Number(smsLoginForm.value.sms_code) | |||||
| PostJobseekerSmsLogin(smsLoginForm.value).then(res => { | |||||
| successToast('登录成功'); | |||||
| store.commit('setShowLoginBox', { | |||||
| showLoginBox: false | |||||
| }) | |||||
| store.commit('getToken', { | |||||
| token: res.data.jwttoken.accesstoken | |||||
| }) | |||||
| store.commit('getRole', { | |||||
| role: 'personal' | |||||
| }) | |||||
| store.commit('getPageType', { | |||||
| pageType: 'personal' | |||||
| }) | |||||
| sessionStorage.setItem('token', res.data.jwttoken.accesstoken) | |||||
| sessionStorage.setItem('role', 'personal') | |||||
| sessionStorage.setItem('pageType', '') | |||||
| sessionStorage.setItem('id', res.data.customerid) | |||||
| resetForm() | |||||
| hideOtherModal1() | |||||
| location.reload() | |||||
| }).catch(err => { | |||||
| getCaptcha() | |||||
| }) | |||||
| } | |||||
| } else { | |||||
| if (loginMethod.value == 'password') { | |||||
| createForm.value.capt_id = capt_id.value; | |||||
| PostCompanyLogin(createForm.value).then(res => { | |||||
| successToast('登录成功'); | |||||
| store.commit('setShowLoginBox', { | |||||
| showLoginBox: false | |||||
| }) | |||||
| store.commit('getToken', { | |||||
| token: res.data.jwttoken.accesstoken | |||||
| }) | |||||
| store.commit('getRole', { | |||||
| role: 'company' | |||||
| }) | |||||
| store.commit('getPageType', { | |||||
| pageType: 'company' | |||||
| }) | |||||
| sessionStorage.setItem('token', res.data.jwttoken.accesstoken) | |||||
| sessionStorage.setItem('role', 'company') | |||||
| sessionStorage.setItem('pageType', 'company') | |||||
| sessionStorage.setItem('id', res.data.company_id) | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| resetForm() | |||||
| hideOtherModal1() | |||||
| router.push('/manage/home') | |||||
| }).catch(err => { | |||||
| getCaptcha() | |||||
| }) | |||||
| } else { | |||||
| smsLoginForm.value.mobile = createForm.value.username ? createForm.value.username : ''; | |||||
| smsLoginForm.value.sms_code = Number(smsLoginForm.value.sms_code) | |||||
| PostCompanyLoginByMobile(smsLoginForm.value).then(res => { | |||||
| successToast('登录成功'); | |||||
| store.commit('setShowLoginBox', { | |||||
| showLoginBox: false | |||||
| }) | |||||
| store.commit('getToken', { | |||||
| token: res.data.jwttoken.accesstoken | |||||
| }) | |||||
| store.commit('getRole', { | |||||
| role: 'company' | |||||
| }) | |||||
| store.commit('getPageType', { | |||||
| pageType: 'company' | |||||
| }) | |||||
| sessionStorage.setItem('token', res.data.jwttoken.accesstoken) | |||||
| sessionStorage.setItem('role', 'company') | |||||
| sessionStorage.setItem('pageType', 'company') | |||||
| sessionStorage.setItem('id', res.data.company_id) | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| resetForm() | |||||
| hideOtherModal1() | |||||
| router.push('/manage/home') | |||||
| }).catch(err => { | |||||
| getCaptcha() | |||||
| }) | |||||
| } | |||||
| } | |||||
| } | |||||
| openOtherModel_1 = computed(() => { | |||||
| return store.state.openOtherModel_1; | |||||
| }) | |||||
| onMounted(() => { | |||||
| getCaptcha() | |||||
| }) | |||||
| </script> | |||||
| <style lang="less"> | |||||
| .login-box { | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| // background-image: linear-gradient(to bottom, #e0f2f4, #f2f4f7); | |||||
| // background-image: url('https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/V-_oS6r-i7wAAAAAAAAAAAAAFl94AQBr'); | |||||
| } | |||||
| .login-content { | |||||
| padding: 20px; | |||||
| border-radius: 20px; | |||||
| // box-shadow: 0 0 2px #ccc; /* 水平偏移 垂直偏移 模糊半径 阴影大小 颜色 */ | |||||
| background-color: #ffffff; | |||||
| } | |||||
| </style> |
| <a-list item-layout="horizontal" :data-source="articleList"> | <a-list item-layout="horizontal" :data-source="articleList"> | ||||
| <template #renderItem="{ item }"> | <template #renderItem="{ item }"> | ||||
| <a-list-item @click="toDetail(item)"> | <a-list-item @click="toDetail(item)"> | ||||
| <a-list-item-meta> | |||||
| <template #title> | |||||
| {{ item.title }} | |||||
| </template> | |||||
| <a-list-item-meta :title="item.title" :description="'发布时间:'+item.created_at"> | |||||
| </a-list-item-meta> | </a-list-item-meta> | ||||
| </a-list-item> | </a-list-item> | ||||
| </template> | </template> | ||||
| </a-list> | </a-list> | ||||
| <a-pagination v-model:current="current" :total="500" style="text-align: center;" /> | |||||
| <a-flex align="center" justify="center"> | |||||
| <a-pagination hideOnSinglePage v-model:current="current" | |||||
| :total="total" @change="pageChange" /> | |||||
| </a-flex> | |||||
| </template> | </template> | ||||
| </template> | </template> | ||||
| let articleList = ref<object[]>([]) | let articleList = ref<object[]>([]) | ||||
| let detail = ref<Object>(null) | let detail = ref<Object>(null) | ||||
| let key = ref<Number>(3) | let key = ref<Number>(3) | ||||
| let current = ref<Number>(1) | |||||
| let total = ref<Number>(0) | |||||
| const pageChange = (page) => { | |||||
| current.value = page | |||||
| getArticleList(key.value) | |||||
| } | |||||
| const getArticleList = (val) => { | const getArticleList = (val) => { | ||||
| GetArticleList({section_id: val}).then(res => { | |||||
| articleList.value = res.data.articles | |||||
| GetArticleList({section_id: val, page: current.value}).then(res => { | |||||
| articleList.value = res.data.articles; | |||||
| total.value = res.data.total; | |||||
| }) | }) | ||||
| } | } | ||||
| <a-space direction="vertical" :size="20"> | <a-space direction="vertical" :size="20"> | ||||
| <a-flex justify="space-between" style="width: 100%;"> | <a-flex justify="space-between" style="width: 100%;"> | ||||
| <div style="font-size: 18px; font-weight: 600;width: 70%;">{{item.name}}</div> | <div style="font-size: 18px; font-weight: 600;width: 70%;">{{item.name}}</div> | ||||
| <div>{{item.pay_range_text}}</div> | |||||
| <div style="color: #4FBE70;">{{item.pay_range_text}}</div> | |||||
| </a-flex> | </a-flex> | ||||
| <a-flex style="width: 100%;"> | <a-flex style="width: 100%;"> | ||||
| <a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag> | <a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag> | ||||
| </a-flex> | </a-flex> | ||||
| <a-flex justify="flex-end"> | <a-flex justify="flex-end"> | ||||
| <a-space> | <a-space> | ||||
| <a-button type="primary" ghost size="small" @click="toDetail(item.id)">查看详情</a-button> | |||||
| <a-button type="primary" size="small" @click="toDetail(item.id)">查看详情</a-button> | |||||
| </a-space> | </a-space> | ||||
| </a-flex> | </a-flex> | ||||
| </a-space> | </a-space> |
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-row :gutter="[10,20]" type="flex"> | <a-row :gutter="[10,20]" type="flex"> | ||||
| <a-col> | <a-col> | ||||
| <div style="font-size: 18px; font-weight: 600;">{{detail.base.name}}</div> | |||||
| <div style="font-size: 20px; font-weight: 600;">{{detail.base.name}}</div> | |||||
| </a-col> | </a-col> | ||||
| <a-col> | <a-col> | ||||
| <div style="font-size: 18px;">{{detail.base.pay_range_text}}</div> | |||||
| <div style="font-size: 16px;color: #4FBE70;">{{detail.base.pay_range_text}}</div> | |||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </a-col> | </a-col> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="10"> | |||||
| <div style="height: 100%;display: flex;align-items: center;justify-content: flex-end;"> | |||||
| <a-button> | |||||
| <StarOutlined /> | |||||
| 收藏 | |||||
| </a-button> | |||||
| <a-button> | |||||
| 投简历 | |||||
| </a-button> | |||||
| </div> | |||||
| <a-col span="10" v-if="role != 'company'"> | |||||
| <a-flex justify="flex-end"> | |||||
| <a-sapce v-if="token"> | |||||
| <a-button v-if="detail.favorited == 0" detail.favorited @click="confirmCollect(detail.id)"> | |||||
| <StarOutlined /> | |||||
| 收藏 | |||||
| </a-button> | |||||
| <a-button v-if="detail.favorited != 0" type="primary" @click="cancelCollect(detail.id)"> | |||||
| <StarOutlined /> | |||||
| 取消收藏 | |||||
| </a-button> | |||||
| <a-button @click="applyJob(detail.id)"> | |||||
| 投简历 | |||||
| </a-button> | |||||
| </a-sapce> | |||||
| <a-space v-else> | |||||
| <a-button type="primary" @click="toLogin"> | |||||
| 立即登录 | |||||
| </a-button> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| <div style="margin-top: 30px;" v-if="detail"> | |||||
| <div style="margin-top: 30px;" v-if="detail"> | |||||
| <a-descriptions :column="2" title="职位描述"> | <a-descriptions :column="2" title="职位描述"> | ||||
| <a-descriptions-item label="职位性质">{{detail.company.nature_text}}</a-descriptions-item> | <a-descriptions-item label="职位性质">{{detail.company.nature_text}}</a-descriptions-item> | ||||
| <a-descriptions-item label="招聘人数">{{detail.base.invite_count}}人</a-descriptions-item> | <a-descriptions-item label="招聘人数">{{detail.base.invite_count}}人</a-descriptions-item> | ||||
| <a-descriptions-item label="节假日">{{detail.base.holidays_text}}</a-descriptions-item> | <a-descriptions-item label="节假日">{{detail.base.holidays_text}}</a-descriptions-item> | ||||
| <a-descriptions-item label="有效期">{{detail.base.disabled_date}}</a-descriptions-item> | <a-descriptions-item label="有效期">{{detail.base.disabled_date}}</a-descriptions-item> | ||||
| <a-descriptions-item label="有效期至">{{detail.base.name}}</a-descriptions-item> | |||||
| <a-descriptions-item label="有效期至"></a-descriptions-item> | |||||
| <a-descriptions-item label="联系人">{{detail.contact.contact}}</a-descriptions-item> | <a-descriptions-item label="联系人">{{detail.contact.contact}}</a-descriptions-item> | ||||
| <a-descriptions-item | <a-descriptions-item | ||||
| label="职业类别">{{detail.base.types ? detail.base.types[0].name : '未知'}}</a-descriptions-item> | label="职业类别">{{detail.base.types ? detail.base.types[0].name : '未知'}}</a-descriptions-item> | ||||
| 查看 | 查看 | ||||
| </a-button></a-descriptions-item> | </a-button></a-descriptions-item> | ||||
| <a-descriptions-item></a-descriptions-item> | <a-descriptions-item></a-descriptions-item> | ||||
| <a-descriptions-item label="职业描述"> | |||||
| <div v-html="detail.base.describe_text"></div></a-descriptions-item> | |||||
| <a-descriptions-item label="职业描述"> | |||||
| <div v-html="detail.base.describe_text"></div> | |||||
| </a-descriptions-item> | |||||
| </a-descriptions> | </a-descriptions> | ||||
| </div> | </div> | ||||
| <div style="margin-top: 30px;" > | |||||
| <a-descriptions :column="1" title="地图"> | |||||
| <a-descriptions-item :span="24"> | |||||
| <div ref="mapContainer" class="map-container"></div> | |||||
| </a-descriptions-item> | |||||
| </a-descriptions> | |||||
| </div> | |||||
| <a-login></a-login> | |||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, computed, onMounted, defineProps, watch } from 'vue'; | |||||
| import { GetJobDetail } from '@/apis/models'; | |||||
| import { ref, computed, onMounted, defineProps, watch ,createVNode} from 'vue'; | |||||
| import { GetJobDetail,PostJobseekAddfavorite, PostJobseekDelfavorite, PostJobseekAddapplication } from '@/apis/models'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal, showOtherModal1 } = useCommon(); | |||||
| let props = defineProps(['id']); | let props = defineProps(['id']); | ||||
| let job_id = ref<Number>(0) | let job_id = ref<Number>(0) | ||||
| let detail = ref<Object>(null) | let detail = ref<Object>(null) | ||||
| let token = ref(sessionStorage.getItem('token') ? sessionStorage.getItem('token') : '') | |||||
| let role = ref(sessionStorage.getItem('role') ? sessionStorage.getItem('role') : '') | |||||
| const mapContainer = ref(null); | |||||
| const getDetail = () => { | const getDetail = () => { | ||||
| GetJobDetail({ id: job_id.value }).then(res => { | GetJobDetail({ id: job_id.value }).then(res => { | ||||
| detail.value = res.data; | detail.value = res.data; | ||||
| detail.value.latitude = 39.984104 | |||||
| detail.value.longitude = 116.307503 | |||||
| if (mapContainer.value) { | |||||
| initMap() | |||||
| } else { | |||||
| console.error('地图容器元素未找到'); | |||||
| } | |||||
| }) | }) | ||||
| } | } | ||||
| const initMap = () => { | |||||
| var center = new TMap.LatLng(39.984104, 116.307503);//设置中心点坐标 | |||||
| //初始化地图 | |||||
| var map = new TMap.Map(mapContainer.value, { | |||||
| center: center | |||||
| }); | |||||
| //创建并初始化MultiMarker | |||||
| var markerLayer = new TMap.MultiMarker({ | |||||
| map: map, //指定地图容器 | |||||
| //样式定义 | |||||
| styles: { | |||||
| //创建一个styleId为"myStyle"的样式(styles的子属性名即为styleId) | |||||
| "myStyle": new TMap.MarkerStyle({ | |||||
| "width": 25, // 点标记样式宽度(像素) | |||||
| "height": 35, // 点标记样式高度(像素) | |||||
| "src": '../img/marker.png', //图片路径 | |||||
| //焦点在图片中的像素位置,一般大头针类似形式的图片以针尖位置做为焦点,圆形点以圆心位置为焦点 | |||||
| "anchor": { x: 16, y: 32 } | |||||
| }) | |||||
| }, | |||||
| //点标记数据数组 longitude | |||||
| geometries: [{ | |||||
| "id": "1", //点标记唯一标识,后续如果有删除、修改位置等操作,都需要此id | |||||
| "styleId": 'myStyle', //指定样式id | |||||
| "position": new TMap.LatLng(detail.value.latitude, detail.value.longitude), //点标记坐标位置 | |||||
| "properties": {//自定义属性 | |||||
| "title": "marker1" | |||||
| } | |||||
| } | |||||
| ] | |||||
| }); | |||||
| } | |||||
| const toLogin = () => { | |||||
| showOtherModal1() | |||||
| } | |||||
| const confirmCollect = (job_id : Number) => { | |||||
| Modal.confirm({ | |||||
| title: `是否要收藏该职位`, | |||||
| centered: true, | |||||
| icon: createVNode(ExclamationCircleOutlined), | |||||
| onOk() { | |||||
| PostJobseekAddfavorite({job_id: job_id }).then(res => { | |||||
| successToast('已收藏') | |||||
| getDetail(); | |||||
| }) | |||||
| }, | |||||
| onCancel() { | |||||
| }, | |||||
| }); | |||||
| } | |||||
| const cancelCollect = (job_id : Number) => { | |||||
| Modal.confirm({ | |||||
| title: `是否要取消收藏该职位`, | |||||
| centered: true, | |||||
| icon: createVNode(ExclamationCircleOutlined), | |||||
| onOk() { | |||||
| PostJobseekDelfavorite({job_id: job_id }).then(res => { | |||||
| successToast('已取消收藏') | |||||
| getDetail(); | |||||
| }) | |||||
| }, | |||||
| onCancel() { | |||||
| }, | |||||
| }); | |||||
| } | |||||
| const applyJob = (job_id : Number) => { | |||||
| Modal.confirm({ | |||||
| title: `是否要投递该职位`, | |||||
| centered: true, | |||||
| icon: createVNode(ExclamationCircleOutlined), | |||||
| onOk() { | |||||
| PostJobseekAddapplication({job_id: job_id }).then(res => { | |||||
| successToast('已投递') | |||||
| getDetail(); | |||||
| }) | |||||
| }, | |||||
| onCancel() { | |||||
| }, | |||||
| }); | |||||
| } | |||||
| watch(() => props.id, (newVal) => { | watch(() => props.id, (newVal) => { | ||||
| job_id.value = newVal | job_id.value = newVal | ||||
| if (job_id.value) { | if (job_id.value) { | ||||
| mapContainer.value = null | |||||
| getDetail() | getDetail() | ||||
| } | } | ||||
| }, { immediate: true }) | }, { immediate: true }) | ||||
| :deep(.ant-btn) { | :deep(.ant-btn) { | ||||
| border-radius: 0 !important; | border-radius: 0 !important; | ||||
| } | } | ||||
| .map-container { | |||||
| width: 100%; | |||||
| height: 400px; | |||||
| } | |||||
| </style> | </style> |
| <template> | <template> | ||||
| <a-flex justify="center"> | |||||
| <a-space :size="50"> | |||||
| <div style="font-size: 36px;">精选职位</div> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| <a-tabs v-model:activeKey="activeKey" @change="activeKeyChange"> | |||||
| <a-tab-pane :key="1" tab="最新招聘"> | |||||
| <job-list :list="jobList"></job-list> | |||||
| </a-tab-pane> | |||||
| <a-tab-pane :key="2" tab="急招职位" force-render> <job-list :list="jobList"></job-list></a-tab-pane> | |||||
| <a-tab-pane :key="3" tab="高薪职位"> <job-list :list="jobList"></job-list></a-tab-pane> | |||||
| <a-tab-pane :key="4" tab="校园招聘"> <job-list :list="jobList"></job-list></a-tab-pane> | |||||
| </a-tabs> | |||||
| <a-typography style="margin-top: 36px;"> | |||||
| <a-flex justify="center"> | |||||
| <a-space :size="50"> | |||||
| <a-typography-title>精选职位</a-typography-title> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <a-tabs v-model:activeKey="activeKey" @change="activeKeyChange" type="card"> | |||||
| <a-tab-pane :key="1" tab="最新招聘"> | |||||
| <job-list :list="jobList"></job-list> | |||||
| </a-tab-pane> | |||||
| <a-tab-pane :key="2" tab="急招职位" force-render> <job-list :list="jobList"></job-list></a-tab-pane> | |||||
| <a-tab-pane :key="3" tab="高薪职位"> <job-list :list="jobList"></job-list></a-tab-pane> | |||||
| <a-tab-pane :key="4" tab="校园招聘"> <job-list :list="jobList"></job-list></a-tab-pane> | |||||
| </a-tabs> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| </script> | </script> | ||||
| <style lang="less" scoped> | <style lang="less" scoped> | ||||
| .job-box { | |||||
| display: flex; | |||||
| flex-direction: column; | |||||
| justify-content: space-around; | |||||
| // align-items: center; | |||||
| width: 100%; | |||||
| .job-title { | |||||
| padding: 20px; | |||||
| background-color: #ffffff; | |||||
| .aaaa { | |||||
| display: flex; | |||||
| justify-content: space-between; | |||||
| } | |||||
| } | |||||
| .job-company { | |||||
| padding: 20px; | |||||
| background-color: #cccccc; | |||||
| .aaaa { | |||||
| display: flex; | |||||
| justify-content: space-between; | |||||
| } | |||||
| } | |||||
| } | |||||
| .mt10 { | |||||
| margin-bottom: 10px; | |||||
| } | |||||
| </style> | </style> |
| <template> | <template> | ||||
| <a-row :gutter="[10,10]"> | <a-row :gutter="[10,10]"> | ||||
| <a-col span="8" v-for="(item, index) in jobList"> | <a-col span="8" v-for="(item, index) in jobList"> | ||||
| <a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;"> | |||||
| <a-space direction="vertical" :size="20"> | |||||
| <a-flex justify="space-between" style="width: 100%;"> | |||||
| <div style="font-size: 18px; font-weight: 600;">{{item.name}}</div> | |||||
| <div>{{item.pay_range_text}}</div> | |||||
| </a-flex> | |||||
| <a-flex style="width: 100%;"> | |||||
| <a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.certification_text ? item.certification_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.school_degree_text ? item.school_degree_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.profelevel_text ? item.profelevel_text : '不限'}}</a-tag> | |||||
| </a-flex> | |||||
| </a-space> | |||||
| <a-divider /> | |||||
| <a-space direction="vertical"> | |||||
| <a-flex justify="space-between" style="width: 100%;"> | |||||
| <div>{{item.full_name}}</div> | |||||
| <a-button type="primary" ghost size="small" | |||||
| @click="toDetail(item.id, item.company_id)">查看详情</a-button> | |||||
| </a-flex> | |||||
| <a-flex style="width: 100%;"> | |||||
| {{item.locations ? item.locations[0].name : '未知地址'}} | |||||
| </a-flex> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| <a-card hoverable style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;"> | |||||
| <a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;"> | |||||
| <a-space direction="vertical" :size="20"> | |||||
| <a-flex justify="space-between" style="width: 100%;"> | |||||
| <div style="font-size: 18px; font-weight: 600;">{{item.name}}</div> | |||||
| <div style="color: #4FBE70;font-size: 18px;">{{item.pay_range_text}}</div> | |||||
| </a-flex> | |||||
| <a-flex style="width: 100%;"> | |||||
| <a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.certification_text ? item.certification_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.school_degree_text ? item.school_degree_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.profelevel_text ? item.profelevel_text : '不限'}}</a-tag> | |||||
| </a-flex> | |||||
| </a-space> | |||||
| <a-divider /> | |||||
| <a-space direction="vertical"> | |||||
| <a-flex justify="space-between" style="width: 100%;"> | |||||
| <div>{{item.full_name}}</div> | |||||
| <a-button type="primary" size="small" | |||||
| @click="toDetail(item.id, item.company_id)">查看详情</a-button> | |||||
| </a-flex> | |||||
| <a-flex style="width: 100%;color: #BEBEBE;"> | |||||
| {{item.locations ? item.locations[0].name : '未知地址'}} | |||||
| </a-flex> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| </a-card> | |||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| <a-flex justify="center"> | |||||
| <a-space :size="50"> | |||||
| <div style="font-size: 36px;">更多职位</div> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| <style lang="less" scoped> | <style lang="less" scoped> | ||||
| .job-box { | |||||
| display: flex; | |||||
| flex-direction: column; | |||||
| justify-content: space-around; | |||||
| // align-items: center; | |||||
| width: 100%; | |||||
| .job-title { | |||||
| padding: 20px; | |||||
| background-color: #ffffff; | |||||
| .aaaa { | |||||
| display: flex; | |||||
| justify-content: space-between; | |||||
| } | |||||
| } | |||||
| .job-company { | |||||
| padding: 20px; | |||||
| background-color: #cccccc; | |||||
| .aaaa { | |||||
| display: flex; | |||||
| justify-content: space-between; | |||||
| } | |||||
| } | |||||
| :deep(.ant-card) { | |||||
| padding: 0 !important; | |||||
| } | } | ||||
| .mt10 { | |||||
| margin-bottom: 10px; | |||||
| :deep(.ant-card-body) { | |||||
| padding: 0 !important; | |||||
| } | } | ||||
| </style> | </style> |
| <!-- slice(0,6), 6,14 --> | <!-- slice(0,6), 6,14 --> | ||||
| <template> | <template> | ||||
| <div style="display: flex;align-items: center;justify-content: center;padding: 30px;font-size: 36px;">热门企业</div> | |||||
| <div class="mt10"> | |||||
| <a-row :gutter="[10,10]"> | |||||
| <a-col span="18"> | |||||
| <a-row :gutter="[10,10]"> | |||||
| <a-col span="8" v-for="(item, index) in data1"> | |||||
| <a-typography style="margin-top: 36px;"> | |||||
| <a-flex justify="center"> | |||||
| <a-space :size="50"> | |||||
| <a-typography-title>热门企业</a-typography-title> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <a-row :gutter="[10,10]"> | |||||
| <a-col span="18"> | |||||
| <a-row :gutter="[10,10]"> | |||||
| <a-col span="8" v-for="(item, index) in data1"> | |||||
| <a-card hoverable style="width: 100%;height: 222px;" @click="toCompanyDetail(item.id)"> | |||||
| <template #cover> | |||||
| <div style="width: 100%;padding-top: 20px;"> | |||||
| <a-flex justify="center" align="center"> | |||||
| <image-container | |||||
| :imgObj="{src: 'https://admin1.jcjob.cn/img/' + item.image_url, width: adposition.width+'px',height: adposition.height+'px', mode: ''}"></image-container> | |||||
| </a-flex> | |||||
| </div> | |||||
| </template> | |||||
| <a-space direction="vertical" align="center" :size="2" style="width: 100%;"> | |||||
| <div style="font-size: 16px;font-weight: bold;text-align: center;height: 48px;"> | |||||
| {{item.company_name ? item.company_name : '企业'}} | |||||
| </div> | |||||
| <div>{{item.company_nature}} <span v-if="item.company_scale">·</span> {{item.company_scale}} | |||||
| </div> | |||||
| </a-space> | |||||
| </a-card> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-col> | |||||
| <a-col span="6"> | |||||
| <a-row :gutter="[10,10]"> | |||||
| <a-col span="24"> | |||||
| <a-card style="width: 100%;height: 454px;overflow: auto; background-color: #fff;border-radius: 8px;"> | |||||
| <template #title> | |||||
| <div class="text-decoration"> | |||||
| <h4 class="text-content">热门资讯</h4> | |||||
| </div> | |||||
| </template> | |||||
| <a-space direction="vertical" style="cursor: pointer;" :size="20"> | |||||
| <template v-for="(item,index) in articleList"> | |||||
| <a-flex v-if="index + 1 == 1" align="center"> | |||||
| <a-space> | |||||
| <a-avatar :size="26" style="background-color: #ff1a1a"> | |||||
| <a-flex justify="center" align="center"> | |||||
| <span style="font-size: 14px;font-weight: bold;">{{index + 1}}</span> | |||||
| </a-flex> | |||||
| </a-avatar> | |||||
| <div style="font-size: 16px;">{{ item.title }}</div> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| <a-flex v-if="index + 1 == 2" align="center" style="width: 100%;"> | |||||
| <a-space> | |||||
| <a-avatar :size="26" style="background-color: #ff4d4d"> | |||||
| <a-flex justify="center" align="center"> | |||||
| <span style="font-size: 14px;font-weight: bold;">{{index + 1}}</span> | |||||
| </a-flex> | |||||
| </a-avatar> | |||||
| <div style="font-size: 16px;">{{ item.title }}</div> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| <a-flex v-if="index + 1 == 3" align="center" style="width: 100%;"> | |||||
| <a-space> | |||||
| <a-avatar :size="26" style="background-color: #ff6b6b"> | |||||
| <a-flex justify="center" align="center"> | |||||
| <span style="font-size: 14px;font-weight: bold;">{{index + 1}}</span> | |||||
| </a-flex> | |||||
| </a-avatar> | |||||
| <div style="font-size: 16px;">{{ item.title }}</div> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| <a-flex v-if="index + 1 >= 4" align="center" style="width: 100%;"> | |||||
| <a-space> | |||||
| <a-avatar :size="26"> | |||||
| <a-flex justify="center" align="center"> | |||||
| <span style="font-size: 14px;font-weight: bold;">{{index + 1}}</span> | |||||
| </a-flex> | |||||
| </a-avatar> | |||||
| <div style="font-size: 16px;">{{ item.title }}</div> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| </template> | |||||
| </a-space> | |||||
| </a-card> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-col> | |||||
| </a-row> | |||||
| <template v-if="showData"> | |||||
| <a-row :gutter="[10,10]" style="margin-top: 10px;"> | |||||
| <a-col span="6" v-for="(item, index) in data2"> | |||||
| <a-card hoverable style="width: 100%;height: 222px;" @click="toCompanyDetail(item.id)"> | <a-card hoverable style="width: 100%;height: 222px;" @click="toCompanyDetail(item.id)"> | ||||
| <template #cover> | <template #cover> | ||||
| <div style="width: 100%;padding-top: 20px;"> | <div style="width: 100%;padding-top: 20px;"> | ||||
| <a-flex justify="center" align="center"> | <a-flex justify="center" align="center"> | ||||
| <image-container | <image-container | ||||
| :imgObj="{src: 'https://admin1.jcjob.cn/img/' + item.image_url, width: adposition.width+'px',height: adposition.height+'px', mode: ''}"></image-container> | |||||
| :imgObj="{src: imageprefix + item.image_url, width: adposition.width+'px',height: adposition.height+'px',mode: 'fill'}"></image-container> | |||||
| </a-flex> | </a-flex> | ||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| <div style="font-size: 16px;font-weight: bold;text-align: center;height: 48px;"> | <div style="font-size: 16px;font-weight: bold;text-align: center;height: 48px;"> | ||||
| {{item.company_name ? item.company_name : '企业'}} | {{item.company_name ? item.company_name : '企业'}} | ||||
| </div> | </div> | ||||
| <div>{{item.company_nature}} · {{item.company_scale}} | |||||
| <div>{{item.company_nature}} <span v-if="item.company_scale">·</span> {{item.company_scale}} | |||||
| </div> | </div> | ||||
| </a-space> | </a-space> | ||||
| </a-card> | </a-card> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </a-col> | |||||
| <a-col span="6"> | |||||
| <a-row> | |||||
| <a-col span="24"> | |||||
| <a-card title="热门资讯" style="width: 100%;height: 454px;"> | |||||
| <a-list size="small" :data-source="articleList"> | |||||
| <template #renderItem="{ item, index }"> | |||||
| <a-list-item> | |||||
| <a-list-item-meta> | |||||
| <template #title> | |||||
| <a-avatar v-if="index + 1 == 1" :size="26" style="background-color: #ff1a1a"> | |||||
| <span style="font-size: 14px;">{{index + 1}}</span> | |||||
| </a-avatar> | |||||
| <a-avatar v-if="index + 1 == 2" :size="26" style="background-color: #ff4d4d"> | |||||
| <span style="font-size: 14px;">{{index + 1}}</span> | |||||
| </a-avatar> | |||||
| <a-avatar v-if="index + 1 == 3" :size="26" style="background-color: #ff6b6b"> | |||||
| <span style="font-size: 14px;">{{index + 1}}</span> | |||||
| </a-avatar> | |||||
| <a-avatar v-if="index + 1 >= 4" :size="26"> | |||||
| <span style="font-size: 14px;">{{index + 1}}</span> | |||||
| </a-avatar> | |||||
| {{ item.title }} | |||||
| </template> | |||||
| <template #avatar> | |||||
| </template> | |||||
| </a-list-item-meta> | |||||
| </a-list-item> | |||||
| </template> | |||||
| </a-list> | |||||
| </a-card> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </div> | |||||
| <template v-if="showData"> | |||||
| <a-row :gutter="[10,10]"> | |||||
| <a-col span="6" v-for="(item, index) in data2"> | |||||
| <a-card hoverable style="width: 100%;height: 222px;" @click="toCompanyDetail(item.id)"> | |||||
| <template #cover> | |||||
| <div style="width: 100%;padding-top: 20px;"> | |||||
| <a-flex justify="center" align="center"> | |||||
| <image-container | |||||
| :imgObj="{src: 'https://admin1.jcjob.cn/img/' + item.image_url, width: adposition.width+'px',height: adposition.height+'px',mode: 'fill'}"></image-container> | |||||
| </a-flex> | |||||
| </div> | |||||
| </template> | |||||
| <a-space direction="vertical" align="center" :size="2" style="width: 100%;"> | |||||
| <div style="font-size: 16px;font-weight: bold;text-align: center;height: 48px;"> | |||||
| {{item.company_name ? item.company_name : '企业'}} | |||||
| </div> | |||||
| <div>{{item.company_nature}} · {{item.company_scale}} | |||||
| </div> | |||||
| </a-space> | |||||
| </a-card> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </template> | |||||
| </template> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, computed, onMounted } from 'vue'; | import { ref, computed, onMounted } from 'vue'; | ||||
| import { GetAdvertscheduleList, GetArticleList } from '@/apis/models'; | import { GetAdvertscheduleList, GetArticleList } from '@/apis/models'; | ||||
| import { router } from '@/router'; | import { router } from '@/router'; | ||||
| import { useCommon } from '@/hooks/useCommon'; | |||||
| let { imageprefix } = useCommon(); | |||||
| let data1 = ref([]) | let data1 = ref([]) | ||||
| let data2 = ref([]) | let data2 = ref([]) | ||||
| let adposition = ref(null) | let adposition = ref(null) | ||||
| </script> | </script> | ||||
| <style lang="less" scoped> | <style lang="less" scoped> | ||||
| .compamy-box { | |||||
| display: flex; | |||||
| flex-direction: column; | |||||
| justify-content: space-around; | |||||
| align-items: center; | |||||
| width: 100%; | |||||
| padding: 10px; | |||||
| background-color: #ffffff; | |||||
| .compamy-img {} | |||||
| .compamy-title {} | |||||
| .compamy-nature {} | |||||
| .text-decoration { | |||||
| position: relative; | |||||
| display: inline-block; | |||||
| overflow: visible; | |||||
| } | |||||
| .text-decoration::before { | |||||
| content: ''; | |||||
| width: 6px; | |||||
| height: 22px; | |||||
| background-color: #4FBE70; | |||||
| transform: rotate(10deg); | |||||
| position: absolute; | |||||
| top: 4px | |||||
| } | } | ||||
| .mt10 { | |||||
| margin-bottom: 10px; | |||||
| .text-content { | |||||
| position: relative; | |||||
| margin-left: 20px; | |||||
| } | } | ||||
| </style> | </style> |
| <template> | <template> | ||||
| <!-- <div style="display: flex;align-items: center;justify-content: center;padding: 30px;font-size: 36px;">精选职位</div> --> | <!-- <div style="display: flex;align-items: center;justify-content: center;padding: 30px;font-size: 36px;">精选职位</div> --> | ||||
| <a-tabs v-model:activeKey="activeKey" @change="activeKeyChange"> | |||||
| <a-tabs v-model:activeKey="activeKey" @change="activeKeyChange" type="card"> | |||||
| <a-tab-pane :key="1" tab="企业推荐"> | <a-tab-pane :key="1" tab="企业推荐"> | ||||
| <div class="company-box"> | <div class="company-box"> | ||||
| <a-row :gutter="[10,10]"> | <a-row :gutter="[10,10]"> | ||||
| <a-col v-for="(item, index) in companyList"> | <a-col v-for="(item, index) in companyList"> | ||||
| <a-button type="link" @click="toCompanyDetail(item.id)"> {{item.full_name}}</a-button> | |||||
| <div style="color: #4FBE70" @click="toCompanyDetail(item.id)"> {{item.full_name}}</div> | |||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </div> | </div> | ||||
| <div class="company-box"> | <div class="company-box"> | ||||
| <a-row :gutter="[10,10]"> | <a-row :gutter="[10,10]"> | ||||
| <a-col v-for="(item, index) in companyList"> | <a-col v-for="(item, index) in companyList"> | ||||
| <a-button type="link" @click="toCompanyDetail(item.id)"> {{item.full_name}}</a-button> | |||||
| <div style="color: #4FBE70" @click="toCompanyDetail(item.id)"> {{item.full_name}}</div> | |||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </div> | </div> |
| <template> | <template> | ||||
| <job-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></job-search> | |||||
| <template v-if="!jobList || jobList.length == 0"> | |||||
| <a-empty style="height: 100vh;"> | |||||
| <template #description> | |||||
| 无职位信息 | |||||
| </template> | |||||
| </a-empty> | |||||
| <job-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search" | |||||
| :mode="mode"></job-search> | |||||
| <template v-if="mode == 1"> | |||||
| <template v-if="!jobList || jobList.length == 0"> | |||||
| <a-empty style="height: 100vh;"> | |||||
| <template #description> | |||||
| 无职位信息 | |||||
| </template> | |||||
| </a-empty> | |||||
| </template> | |||||
| <template v-else> | |||||
| <a-row :gutter="[10,20]" > | |||||
| <a-col span="8" v-for="(item, index) in jobList"> | |||||
| <a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;border-radius: 8px;"> | |||||
| <a-space direction="vertical" :size="10"> | |||||
| <a-flex justify="space-between" style="width: 100%;"> | |||||
| <div style="font-size: 18px; font-weight: 600;">{{item.name}}</div> | |||||
| <div style="color: #4FBE70;">{{item.pay_range_text}}</div> | |||||
| </a-flex> | |||||
| <a-flex style="width: 100%;"> | |||||
| <a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.certification_text ? item.certification_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.school_degree_text ? item.school_degree_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.profelevel_text ? item.profelevel_text : '不限'}}</a-tag> | |||||
| </a-flex> | |||||
| </a-space> | |||||
| <a-divider /> | |||||
| <a-space direction="vertical"> | |||||
| <a-flex justify="space-between" style="width: 100%;"> | |||||
| <div>{{item.full_name}}</div> | |||||
| <a-button type="primary" size="small" | |||||
| @click="toDetail(item.id, item.company_id)">查看详情</a-button> | |||||
| </a-flex> | |||||
| <a-flex style="width: 100%;color: #bebebe;"> | |||||
| {{item.locations ? item.locations[0].name : '未知地址'}} | |||||
| </a-flex> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-flex justify="center"> | |||||
| <a-space> | |||||
| <a-pagination hideOnSinglePage :total="commomParams.page.total" @change="getPage" /> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </template> | |||||
| </template> | </template> | ||||
| <template v-else> | |||||
| <a-row :gutter="[10,20]"> | |||||
| <a-col span="8" v-for="(item, index) in jobList"> | |||||
| <a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;"> | |||||
| <a-space direction="vertical" :size="10"> | |||||
| <a-flex justify="space-between" style="width: 100%;"> | |||||
| <div style="font-size: 18px; font-weight: 600;">{{item.name}}</div> | |||||
| <div>{{item.pay_range_text}}</div> | |||||
| </a-flex> | |||||
| <a-flex style="width: 100%;"> | |||||
| <a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.certification_text ? item.certification_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.school_degree_text ? item.school_degree_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.profelevel_text ? item.profelevel_text : '不限'}}</a-tag> | |||||
| </a-flex> | |||||
| </a-space> | |||||
| <a-divider /> | |||||
| <a-space direction="vertical"> | |||||
| <a-flex justify="space-between" style="width: 100%;"> | |||||
| <div>{{item.full_name}}</div> | |||||
| <a-button type="primary" ghost size="small" @click="toDetail(item.id, item.company_id)">查看详情</a-button> | |||||
| </a-flex> | |||||
| <a-flex style="width: 100%;"> | |||||
| {{item.locations ? item.locations[0].name : '未知地址'}} | |||||
| </a-flex> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| </a-col> | |||||
| <a-col span="24" > | |||||
| <a-flex justify="center"> | |||||
| <a-space> | |||||
| <a-pagination hideOnSinglePage :total="commomParams.page.total" @change="getPage" /> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| </a-col> | |||||
| </a-row> | |||||
| <template v-if="mode == 2"> | |||||
| <template v-if="!companyList || companyList.length == 0"> | |||||
| <a-empty style="height: 100vh;"> | |||||
| <template #description> | |||||
| 无职位信息 | |||||
| </template> | |||||
| </a-empty> | |||||
| </template> | |||||
| <template v-else> | |||||
| <a-row :gutter="[10,10]"> | |||||
| <a-col span="8" v-for="(item, index) in companyList" > | |||||
| <a-card hoverable style="width: 100%;" @click="toCompanyDetail(item.id)"> | |||||
| <template #title> | |||||
| <div style="margin: 16px 0;"> | |||||
| <a-space> | |||||
| <image-container | |||||
| :imgObj="{src: '/images/onlylogo.jpg',width: '48px',height:'48px'}"></image-container> | |||||
| <span style="font-size: 16px;"> | |||||
| {{item.full_name ? item.full_name : '企业'}} | |||||
| </span> | |||||
| </a-space> | |||||
| </div> | |||||
| </template> | |||||
| <template #extra> | |||||
| {{item.scale_text}} | |||||
| </template> | |||||
| <a-space direction="vertical" :size="2" style="width: 100%;"> | |||||
| <div>企业性质:{{item.nature_text}}</div> | |||||
| <div>招聘类型:{{item.industry_text}} {{item.industry2_text}}</div> | |||||
| </a-space> | |||||
| </a-card> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-flex justify="center"> | |||||
| <a-space> | |||||
| <a-pagination hideOnSinglePage :total="commomParams.page.total" @change="getPage" /> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </template> | |||||
| </template> | </template> | ||||
| <!-- 企业显示 --> | <!-- 企业显示 --> | ||||
| <!-- <a-tabs v-model:activeKey="activeKey"> | <!-- <a-tabs v-model:activeKey="activeKey"> | ||||
| <a-tab-pane key="1" tab="推荐人才"> | <a-tab-pane key="1" tab="推荐人才"> | ||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, computed, onMounted ,defineEmits} from 'vue'; | |||||
| import { ref, computed, onMounted, defineEmits } from 'vue'; | |||||
| import JobSearch from '@/components/job/search/index.vue' | import JobSearch from '@/components/job/search/index.vue' | ||||
| import JobCard from '@/components/job/card/index.vue' | import JobCard from '@/components/job/card/index.vue' | ||||
| import JobTalents from '@/components/job/talents/index.vue' | import JobTalents from '@/components/job/talents/index.vue' | ||||
| import { PostJobSearch, GetCompanyDepartmentList, PostCompanyDepartmentDel, PostCompanyDepartmentEdit } from '@/apis/models'; | |||||
| import { PostJobSearch, GetCompanyDepartmentList, PostCompanyDepartmentDel, PostCompanyDepartmentEdit, PosCompanySearch } from '@/apis/models'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | import { useCommon } from '@/hooks/useCommon'; | ||||
| let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | ||||
| const emit = defineEmits(); | const emit = defineEmits(); | ||||
| let loading = ref<Boolean>(true); | let loading = ref<Boolean>(true); | ||||
| let jobList = ref([]); | let jobList = ref([]); | ||||
| let companyList = ref([]); | |||||
| let total = ref<Number>(0) | let total = ref<Number>(0) | ||||
| let mode = ref<Number>(1) | |||||
| const searchData = (data : object) => { | const searchData = (data : object) => { | ||||
| commomParams.value.search = data | |||||
| commomParams.value.search = data.search | |||||
| mode.value = data.mode; | |||||
| jobList.value = [] | |||||
| companyList.value = [] | |||||
| getData(); | getData(); | ||||
| } | } | ||||
| const clearData = (data : object) => { | const clearData = (data : object) => { | ||||
| if (data) { | if (data) { | ||||
| commomParams.value.search = data | |||||
| commomParams.value.search = data.search | |||||
| mode.value = data.mode; | |||||
| jobList.value = [] | |||||
| companyList.value = [] | |||||
| } else { | } else { | ||||
| commomParams.value.search = { | commomParams.value.search = { | ||||
| page: 1, | page: 1, | ||||
| } | } | ||||
| getData(); | getData(); | ||||
| } | } | ||||
| const getPage = (page, pageSize) => { | const getPage = (page, pageSize) => { | ||||
| commomParams.value.search.page = page; | commomParams.value.search.page = page; | ||||
| commomParams.value.search.pagesize = pageSize; | commomParams.value.search.pagesize = pageSize; | ||||
| const getData = async () => { | const getData = async () => { | ||||
| try { | try { | ||||
| loading.value = true; | loading.value = true; | ||||
| let res = await PostJobSearch(commomParams.value.search); | |||||
| loading.value = false; | |||||
| jobList.value = res.data.jobs; | |||||
| commomParams.value.page = { | |||||
| current: commomParams.value.search.page, | |||||
| pageSize: commomParams.value.search.pagesize, | |||||
| total: res.data.total, | |||||
| pageSizeOptions: ['10', '20', '30', '40'], | |||||
| hideOnSinglePage: false, | |||||
| showSizeChanger: true | |||||
| }; | |||||
| if (mode.value == 1) { | |||||
| let res = await PostJobSearch(commomParams.value.search); | |||||
| loading.value = false; | |||||
| jobList.value = res.data.jobs; | |||||
| commomParams.value.page = { | |||||
| current: commomParams.value.search.page, | |||||
| pageSize: commomParams.value.search.pagesize, | |||||
| total: res.data.total, | |||||
| pageSizeOptions: ['10', '20', '30', '40'], | |||||
| hideOnSinglePage: false, | |||||
| showSizeChanger: true | |||||
| }; | |||||
| } else { | |||||
| let res = await PosCompanySearch(commomParams.value.search); | |||||
| loading.value = false; | |||||
| companyList.value = res.data.list; | |||||
| commomParams.value.page = { | |||||
| current: commomParams.value.search.page, | |||||
| pageSize: commomParams.value.search.pagesize, | |||||
| total: res.data.total, | |||||
| pageSizeOptions: ['10', '20', '30', '40'], | |||||
| hideOnSinglePage: false, | |||||
| showSizeChanger: true | |||||
| }; | |||||
| } | |||||
| } catch { | } catch { | ||||
| loading.value = false; | loading.value = false; | ||||
| } | } | ||||
| } | } | ||||
| const toDetail = (job_id : Number, company_id : Number) => { | const toDetail = (job_id : Number, company_id : Number) => { | ||||
| sessionStorage.setItem('job_id', job_id) | sessionStorage.setItem('job_id', job_id) | ||||
| sessionStorage.setItem('tab_key', 2) | sessionStorage.setItem('tab_key', 2) | ||||
| sessionStorage.setItem('mode', 'detail') | sessionStorage.setItem('mode', 'detail') | ||||
| emit('detail') | emit('detail') | ||||
| } | } | ||||
| onMounted(() => { | onMounted(() => { | ||||
| getData(); | getData(); | ||||
| }) | }) |
| <template v-else> | <template v-else> | ||||
| <a-list item-layout="horizontal" :data-source="recruitmentList" style="cursor: pointer;"> | <a-list item-layout="horizontal" :data-source="recruitmentList" style="cursor: pointer;"> | ||||
| <template #renderItem="{ item }"> | <template #renderItem="{ item }"> | ||||
| <a-list-item @click="toDetail(item)"> | |||||
| <a-list-item-meta> | |||||
| <template #title> | |||||
| {{ item.title }} | |||||
| </template> | |||||
| <a-list-item @click="toDetail(item)" > | |||||
| <a-list-item-meta :title="item.title" :description="'发布时间:'+item.created_at"> | |||||
| </a-list-item-meta> | </a-list-item-meta> | ||||
| </a-list-item> | </a-list-item> | ||||
| </template> | </template> | ||||
| </a-list> | </a-list> | ||||
| <a-pagination v-model:current="current" :total="500" style="text-align: center;" /> | |||||
| <a-flex align="center" justify="center"> | |||||
| <a-pagination hideOnSinglePage v-model:current="current" | |||||
| :total="total" @change="pageChange" /> | |||||
| </a-flex> | |||||
| </template> | </template> | ||||
| </template> | </template> | ||||
| import { ArrowLeftOutlined } from '@ant-design/icons-vue'; | import { ArrowLeftOutlined } from '@ant-design/icons-vue'; | ||||
| let recruitmentList = ref<object[]>([]) | let recruitmentList = ref<object[]>([]) | ||||
| let detail = ref<Object>(null) | let detail = ref<Object>(null) | ||||
| let current = ref<Number>(1) | |||||
| let total = ref<Number>(0) | |||||
| const pageChange = (page) => { | |||||
| current.value = page | |||||
| getRecruitmentList() | |||||
| } | |||||
| const getRecruitmentList = (page) => { | |||||
| PostRecruitmentList({page: current.value}).then(res => { | |||||
| recruitmentList.value = res.data.recruitments; | |||||
| total.value = res.data.total; | |||||
| }) | |||||
| } | |||||
| onMounted(() => { | onMounted(() => { | ||||
| PostRecruitmentList().then(res => { | |||||
| recruitmentList.value = res.data.recruitments | |||||
| }) | |||||
| getRecruitmentList() | |||||
| }) | }) | ||||
| const toDetail = (data) => { | const toDetail = (data) => { |
| <template> | |||||
| <a-typography style="padding: 20px;"> | |||||
| <a-typography-title :level="3">联系方式</a-typography-title> | |||||
| <a-typography-paragraph style="padding: 20px;"> | |||||
| <a-space direction="vertical" :size="50" style="width: 100%;"> | |||||
| <a-typography-paragraph> | |||||
| <h4>菊城人才市场总部:</h4> | |||||
| <a-row> | |||||
| <a-col> | |||||
| <h4>电话:</h4> | |||||
| </a-col> | |||||
| <a-col> | |||||
| <h4>22236225 麦小姐、郭小姐</h4> | |||||
| <h4>22236858 刘小姐、关小姐</h4> | |||||
| <h4>22236226 何小姐、李生</h4> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-typography-paragraph> | |||||
| <a-typography-paragraph> | |||||
| <a-row> | |||||
| <a-col> | |||||
| <h4>网址:</h4> | |||||
| </a-col> | |||||
| <a-col> | |||||
| <h4><a href="http://www.jcjob.cn">http://www.jcjob.cn</a></h4> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-typography-paragraph> | |||||
| <a-typography-paragraph> | |||||
| <a-row> | |||||
| <a-col> | |||||
| <h4>邮箱:</h4> | |||||
| </a-col> | |||||
| <a-col> | |||||
| <h4>zsjcjob@163.com</h4> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-typography-paragraph> | |||||
| <a-typography-paragraph> | |||||
| <a-row> | |||||
| <a-col> | |||||
| <h4>传真:</h4> | |||||
| </a-col> | |||||
| <a-col> | |||||
| <h4>22236922、22236026 </h4> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-typography-paragraph> | |||||
| <a-typography-paragraph> | |||||
| <a-row> | |||||
| <a-col> | |||||
| <h4>新浪微博:</h4> | |||||
| </a-col> | |||||
| <a-col> | |||||
| <h4>中山市菊城人才市场 </h4> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-typography-paragraph> | |||||
| <a-typography-paragraph> | |||||
| <a-row> | |||||
| <a-col> | |||||
| <h4>业务咨询QQ:</h4> | |||||
| </a-col> | |||||
| <a-col> | |||||
| <h4>981560602 </h4> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-typography-paragraph> | |||||
| </a-space> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </template> | |||||
| <script setup lang="ts"> | |||||
| import { ref, computed, onMounted } from 'vue'; | |||||
| </script> | |||||
| <style> | |||||
| </style> |
| <template> | |||||
| <a-typography style="padding: 20px;"> | |||||
| <a-typography-title :level="3">绿色通道</a-typography-title> | |||||
| <a-typography-paragraph style="padding: 20px;"> | |||||
| <a-space direction="vertical" :size="50" style="width: 100%;"> | |||||
| <h4>凡在菊城人才市场举办招聘会 所有求职者免费入场</h4> | |||||
| <h4>凡大型人才招聘会适用(凭个人求职简历免费入场)</h4> | |||||
| </a-space> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </template> | |||||
| <script setup lang="ts"> | |||||
| </script> | |||||
| <style> | |||||
| </style> |
| <template> | <template> | ||||
| <a-timeline> | |||||
| <a-timeline-item>求职者领取求职登记表</a-timeline-item> | |||||
| <a-timeline-item>写求职登记表(填表区设在一楼和三楼)</a-timeline-item> | |||||
| <a-timeline-item>留一份求职登记表或个人简历给人才市场</a-timeline-item> | |||||
| <a-timeline-item> | |||||
| 免费参加现场招聘会 | |||||
| </a-timeline-item> | |||||
| <a-timeline-item> | |||||
| 会后继续免费在菊城人才市场发布求职信息和免费推荐就业 | |||||
| </a-timeline-item> | |||||
| </a-timeline> | |||||
| <a-typography> | |||||
| <a-typography-title :level="3">★乘车指引</a-typography-title> | |||||
| <a-typography-paragraph> | |||||
| 沙口总部:在小榄乘坐501、502、505路公交车(原榄运1、2、5),在江滨公园站下车即到(即菊城人才市场门口)。 | |||||
| </a-typography-paragraph> | |||||
| <a-typography-title :level="3">★菊城人才市场沙口总部地图</a-typography-title> | |||||
| <a-typography-paragraph> | |||||
| <a-typography style="padding: 20px;"> | |||||
| <a-typography-title :level="3">求职者参会指南</a-typography-title> | |||||
| <a-typography-paragraph style="padding: 20px;"> | |||||
| <a-space direction="vertical" :size="50" style="width: 100%;"> | |||||
| <a-timeline> | |||||
| <a-timeline-item> | |||||
| <h4>求职者领取求职登记表</h4> | |||||
| </a-timeline-item> | |||||
| <a-timeline-item> | |||||
| <h4>写求职登记表(填表区设在一楼和三楼)</h4> | |||||
| </a-timeline-item> | |||||
| <a-timeline-item> | |||||
| <h4>留一份求职登记表或个人简历给人才市场</h4> | |||||
| </a-timeline-item> | |||||
| <a-timeline-item> | |||||
| <h4>免费参加现场招聘会</h4> | |||||
| </a-timeline-item> | |||||
| <a-timeline-item> | |||||
| <h4>会后继续免费在菊城人才市场发布求职信息和免费推荐就业</h4> | |||||
| </a-timeline-item> | |||||
| </a-timeline> | |||||
| <a-typography-title :level="3">★乘车指引</a-typography-title> | |||||
| <a-typography-paragraph> | |||||
| <h4>沙口总部:在小榄乘坐501、502、505路公交车(原榄运1、2、5),在江滨公园站下车即到(即菊城人才市场门口)。</h4> | |||||
| </a-typography-paragraph> | |||||
| <a-typography-title :level="3">★菊城人才市场沙口总部地图</a-typography-title> | |||||
| <a-typography-paragraph> | |||||
| <image-container | |||||
| :imgObj="{src: '/images/map.jpg',width: '70%',height:'100%'}"></image-container> | |||||
| </a-typography-paragraph> | |||||
| </a-space> | |||||
| </a-typography-paragraph> | </a-typography-paragraph> | ||||
| </a-typography> | </a-typography> | ||||
| </template> | </template> |
| <template> | |||||
| <a-typography style="padding: 20px;"> | |||||
| <a-typography-title :level="3">乘车路线</a-typography-title> | |||||
| <a-typography-paragraph style="padding: 20px;"> | |||||
| <a-space direction="vertical" :size="50" style="width: 100%;"> | |||||
| <a-typography-title :level="3">★菊城人才市场沙口总部</a-typography-title> | |||||
| <a-typography-paragraph> | |||||
| <h4>乘小榄501、502、505(原榄运1号、2号、5号)路公交车在江滨公园站下车即到。</h4> | |||||
| </a-typography-paragraph> | |||||
| <a-typography-title :level="3">★小榄体育馆</a-typography-title> | |||||
| <a-typography-paragraph> | |||||
| <h4>(1)在小榄乘坐503、506、518(原榄运3路、15路、18路、21路)路公交车在体育馆下车即到。</h4> | |||||
| <h4>(2)在小榄乘坐503、505、506、508、509、521(原榄运3、5、6、8、9、21)路到小榄大信(大润发站)下车,往新华中路(顺昌广场)方向直走150米左右即到</h4> | |||||
| </a-typography-paragraph> | |||||
| </a-space> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </template> | |||||
| <script setup lang="ts"> | |||||
| import { ref, computed, onMounted } from 'vue'; | |||||
| </script> | |||||
| <style> | |||||
| </style> |
| <template> | <template> | ||||
| <a-timeline mode="alternate"> | |||||
| <a-timeline-item>电话预定展位</a-timeline-item> | |||||
| <a-timeline-item>传真(电邮)招聘资料</a-timeline-item> | |||||
| <a-timeline-item>资料及展位号确认</a-timeline-item> | |||||
| <a-timeline-item> | |||||
| 参会交费进场招聘 | |||||
| </a-timeline-item> | |||||
| </a-timeline> | |||||
| <a-typography style="padding: 20px;"> | |||||
| <a-typography-title :level="3">企业参会方式</a-typography-title> | |||||
| <a-typography-paragraph> | |||||
| <a-space direction="vertical" :size="50" style="width: 100%;"> | |||||
| <a-timeline mode="alternate"> | |||||
| <a-timeline-item><h4>第一步,电话预定展位</h4></a-timeline-item> | |||||
| <a-timeline-item><h4>第二步,传真(电邮)招聘资料</h4></a-timeline-item> | |||||
| <a-timeline-item><h4>第三步,资料及展位号确认</h4></a-timeline-item> | |||||
| <a-timeline-item> | |||||
| <h4>第四步,参会交费进场招聘</h4> | |||||
| </a-timeline-item> | |||||
| </a-timeline> | |||||
| </a-space> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> |
| <template> | <template> | ||||
| <a-row :gutter="[10,16]" type="flex" justify="center" style="margin-bottom: 30px;"> | <a-row :gutter="[10,16]" type="flex" justify="center" style="margin-bottom: 30px;"> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <a-input v-model:value="commomParams.search.keyword" placeholder="请输入要搜索的职位" size="large"> | |||||
| <a-input v-model:value="commomParams.search.keyword" :placeholder="'请输入要搜索的'+searchType" size="large"> | |||||
| <template #addonBefore> | <template #addonBefore> | ||||
| <a-select v-model:value="ddd" style="width: 90px"> | |||||
| <a-select-option value="Http://">职位</a-select-option> | |||||
| <a-select-option value="Https://">企业</a-select-option> | |||||
| <a-select v-model:value="searchType" style="width: 90px;" @change="searchTypeChange"> | |||||
| <a-select-option value="职位">职位</a-select-option> | |||||
| <a-select-option value="企业">企业</a-select-option> | |||||
| </a-select> | </a-select> | ||||
| </template> | </template> | ||||
| <template #addonAfter> | <template #addonAfter> | ||||
| <div style="width: 100%;height: 100%; padding: 0 20px;color: #fff;"> | |||||
| <div @click="getData" style="width: 100%;height: 100%; padding: 0 20px;color: #fff;cursor: pointer;"> | |||||
| 搜索 | 搜索 | ||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <div style="width: 100%; background-color: #fff;padding: 16px;border-radius: 10px;"> | <div style="width: 100%; background-color: #fff;padding: 16px;border-radius: 10px;"> | ||||
| <a-form> | |||||
| <a-form-item label="工作地区"> | |||||
| <template v-for="(item,index) in xiaolanList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" @change="cityChange(index,item)"> <span | |||||
| v-if="item.name == '小榄镇'" style="font-weight: bold;">{{item.name}}</span> | |||||
| <span v-else>{{item.name}}</span></a-checkable-tag> | |||||
| </template> | |||||
| <div> | |||||
| <template v-for="(item,index) in zhongshanList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" @change="cityChange(index,item)"> | |||||
| <span v-if="item.name == '中山市'" style="font-weight: bold;">{{item.name}}</span> | |||||
| <span v-else>{{item.name}}</span> | |||||
| </a-checkable-tag> | |||||
| <template v-if="searchType == '职位'"> | |||||
| <a-form> | |||||
| <a-form-item label="工作地区"> | |||||
| <template v-for="(item,index) in xiaolanList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" @change="cityChange(index,item)"> <span | |||||
| v-if="item.name == '小榄镇'" style="font-weight: bold;">{{item.name}}</span> | |||||
| <span v-else>{{item.name}}</span></a-checkable-tag> | |||||
| </template> | </template> | ||||
| </div> | |||||
| </a-form-item> | |||||
| <a-form-item label="职位性质"> | |||||
| <template v-for="(item,index) in jobNatureList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" | |||||
| @change="handleChange(item)">{{item.name}}</a-checkable-tag> | |||||
| </template> | |||||
| </a-form-item> | |||||
| <a-form-item label="薪酬范围"> | |||||
| <template v-for="(item,index) in payList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" | |||||
| @change="payChange(item)">{{item.name}}</a-checkable-tag> | |||||
| </template> | |||||
| </a-form-item> | |||||
| <a-form-item label="学历要求"> | |||||
| <template v-for="(item,index) in educationList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" | |||||
| @change="educationChange(item)">{{item.name}}</a-checkable-tag> | |||||
| <div> | |||||
| <template v-for="(item,index) in zhongshanList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" @change="cityChange(index,item)"> | |||||
| <span v-if="item.name == '中山市'" style="font-weight: bold;">{{item.name}}</span> | |||||
| <span v-else>{{item.name}}</span> | |||||
| </a-checkable-tag> | |||||
| </template> | |||||
| </div> | |||||
| </a-form-item> | |||||
| <a-form-item label="职位性质"> | |||||
| <template v-for="(item,index) in jobNatureList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" | |||||
| @change="handleChange(item)">{{item.name}}</a-checkable-tag> | |||||
| </template> | |||||
| </a-form-item> | |||||
| <a-form-item label="薪酬范围"> | |||||
| <template v-for="(item,index) in payList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" | |||||
| @change="payChange(item)">{{item.name}}</a-checkable-tag> | |||||
| </template> | |||||
| </a-form-item> | |||||
| <a-form-item label="学历要求"> | |||||
| <template v-for="(item,index) in educationList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" | |||||
| @change="educationChange(item)">{{item.name}}</a-checkable-tag> | |||||
| </template> | |||||
| </a-form-item> | |||||
| <template v-if="isExpand"> | |||||
| <a-form-item label="公司规模"> | |||||
| <template v-for="(item,index) in guimoList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" | |||||
| @change="guimoChange(item)">{{item.name}}</a-checkable-tag> | |||||
| </template> | |||||
| </a-form-item> | |||||
| <a-form-item label="公司性质"> | |||||
| <template v-for="(item,index) in natureList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" | |||||
| @change="natureChange(item)">{{item.name}}</a-checkable-tag> | |||||
| </template> | |||||
| </a-form-item> | |||||
| <a-form-item label="更新时间"> | |||||
| <template v-for="(item,index) in updateList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" | |||||
| @change="updateChange(item)">{{item.name}}</a-checkable-tag> | |||||
| </template> | |||||
| </a-form-item> | |||||
| <a-form-item label="急招职位"> | |||||
| <a-radio-group v-model:value="commomParams.search.urgent" button-style="solid" | |||||
| size="small" @change="urgentChange"> | |||||
| <a-radio-button :value="1">是</a-radio-button> | |||||
| <a-radio-button :value="2">否</a-radio-button> | |||||
| </a-radio-group> | |||||
| </a-form-item> | |||||
| </template> | </template> | ||||
| </a-form-item> | |||||
| <template v-if="isExpand"> | |||||
| <a-divider> | |||||
| <a-button size="small" type="primary" @click="clickMore"> | |||||
| <template v-if="isExpand"> | |||||
| 关闭更多筛选 | |||||
| <UpOutlined /> | |||||
| </template> | |||||
| <template v-else> | |||||
| 更多筛选条件 | |||||
| <DownOutlined /> | |||||
| </template> | |||||
| </a-button> | |||||
| </a-divider> | |||||
| <a-form-item label="重置搜索条件"> | |||||
| <a-button size="small" type="primary" @click="clearSearch">重置</a-button> | |||||
| </a-form-item> | |||||
| </a-form> | |||||
| </template> | |||||
| <template v-if="searchType == '企业'"> | |||||
| <a-form> | |||||
| <a-form-item label="公司规模"> | <a-form-item label="公司规模"> | ||||
| <template v-for="(item,index) in guimoList"> | <template v-for="(item,index) in guimoList"> | ||||
| <a-checkable-tag v-model:checked="item.checked" | <a-checkable-tag v-model:checked="item.checked" | ||||
| @change="guimoChange(item)">{{item.name}}</a-checkable-tag> | |||||
| @change="qiyeGuimoChange(item)">{{item.name}}</a-checkable-tag> | |||||
| </template> | </template> | ||||
| </a-form-item> | </a-form-item> | ||||
| <a-form-item label="公司性质"> | <a-form-item label="公司性质"> | ||||
| <template v-for="(item,index) in natureList"> | <template v-for="(item,index) in natureList"> | ||||
| <a-checkable-tag v-model:checked="item.checked" | <a-checkable-tag v-model:checked="item.checked" | ||||
| @change="natureChange(item)">{{item.name}}</a-checkable-tag> | |||||
| @change="qiyeNatureChange(item)">{{item.name}}</a-checkable-tag> | |||||
| </template> | </template> | ||||
| </a-form-item> | </a-form-item> | ||||
| <a-form-item label="更新时间"> | |||||
| <template v-for="(item,index) in updateList"> | |||||
| <a-checkable-tag v-model:checked="item.checked" | |||||
| @change="updateChange(item)">{{item.name}}</a-checkable-tag> | |||||
| </template> | |||||
| <a-form-item label="知名企业"> | |||||
| <a-radio-group v-model:value="commomParams.search.famous" button-style="solid" size="small" | |||||
| @change="famousChange"> | |||||
| <a-radio-button :value="1">是</a-radio-button> | |||||
| <a-radio-button :value="2">否</a-radio-button> | |||||
| </a-radio-group> | |||||
| </a-form-item> | </a-form-item> | ||||
| <a-form-item label="急招职位"> | |||||
| <a-radio-group v-model:value="commomParams.search.urgent" button-style="solid" size="small" | |||||
| @change="urgentChange"> | |||||
| <a-form-item label="见习基地"> | |||||
| <a-radio-group v-model:value="commomParams.search.probation" button-style="solid" size="small" | |||||
| @change="probationChange"> | |||||
| <a-radio-button :value="1">是</a-radio-button> | <a-radio-button :value="1">是</a-radio-button> | ||||
| <a-radio-button :value="2">否</a-radio-button> | <a-radio-button :value="2">否</a-radio-button> | ||||
| </a-radio-group> | </a-radio-group> | ||||
| </a-form-item> | </a-form-item> | ||||
| </template> | |||||
| <a-form-item label="重置搜索条件"> | |||||
| <a-button size="small" type="primary" @click="clearSearch">重置</a-button> | |||||
| </a-form-item> | |||||
| </a-form> | |||||
| </template> | |||||
| <a-divider> | |||||
| <a-button size="small" type="primary" ghost @click="clickMore"> | |||||
| <template v-if="isExpand"> | |||||
| 关闭更多筛选 | |||||
| <UpOutlined /> | |||||
| </template> | |||||
| <template v-else> | |||||
| 更多筛选条件 | |||||
| <DownOutlined /> | |||||
| </template> | |||||
| </a-button> | |||||
| </a-divider> | |||||
| <a-form-item label="重置搜索条件"> | |||||
| <a-button size="small" type="primary" ghost @click="clearSearch">重置</a-button> | |||||
| </a-form-item> | |||||
| </a-form> | |||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| import { DownOutlined, UpOutlined } from '@ant-design/icons-vue'; | import { DownOutlined, UpOutlined } from '@ant-design/icons-vue'; | ||||
| import { useCommon } from '@/hooks/useCommon'; | import { useCommon } from '@/hooks/useCommon'; | ||||
| let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | ||||
| let props = defineProps(['search_params']); | |||||
| let props = defineProps(['mode']); | |||||
| const emit = defineEmits(); | const emit = defineEmits(); | ||||
| let isExpand = ref<Boolean>(false) | let isExpand = ref<Boolean>(false) | ||||
| let searchType = ref<String>('职位') | |||||
| const searchTypeChange = (val) => { | |||||
| if (val == '企业') { | |||||
| interface listQiyeType { | |||||
| probation ?: Number, | |||||
| famous ?: Number, | |||||
| nature ?: Number, | |||||
| scale ?: Number | |||||
| } | |||||
| commomParams.value.search = commomParams.value.search as listQiyeType; | |||||
| commomParams.value.search.pagesize = 12; | |||||
| commomParams.value.search.probation = 0; | |||||
| commomParams.value.search.famous = 0; | |||||
| commomParams.value.search.campus = 0; | |||||
| emit('searchData', {search: commomParams.value.search,mode: 2}) | |||||
| } else { | |||||
| interface listType { | |||||
| fulltime ?: Number, | |||||
| parttime ?: Number, | |||||
| casual ?: Number, | |||||
| practical ?: Number, | |||||
| campus ?: Number, | |||||
| city ?: Number, | |||||
| district ?: Number, | |||||
| street ?: Number, | |||||
| pay_range ?: Number, | |||||
| school_degree_rq ?: Number, | |||||
| scale ?: Number, | |||||
| character_flag ?: Number, | |||||
| update_time_range ?: Number, | |||||
| urgent ?: Number, | |||||
| } | |||||
| commomParams.value.search = commomParams.value.search as listType; | |||||
| commomParams.value.search.pagesize = 12; | |||||
| commomParams.value.search.fulltime = 1; | |||||
| commomParams.value.search.parttime = 2; | |||||
| commomParams.value.search.casual = 2; | |||||
| commomParams.value.search.practical = 2; | |||||
| commomParams.value.search.campus = 2; | |||||
| commomParams.value.search.city = 0; | |||||
| commomParams.value.search.district = 0; | |||||
| commomParams.value.search.street = 0; | |||||
| commomParams.value.search.pay_range = 0; | |||||
| commomParams.value.search.school_degree_rq = 0; | |||||
| commomParams.value.search.scale = 0; | |||||
| commomParams.value.search.character_flag = 0; | |||||
| commomParams.value.search.update_time_range = 0; | |||||
| commomParams.value.search.urgent = 0; | |||||
| emit('searchData', {search: commomParams.value.search,mode: 1}) | |||||
| } | |||||
| } | |||||
| interface listType { | |||||
| fulltime ?: Number, | |||||
| parttime ?: Number, | |||||
| casual ?: Number, | |||||
| practical ?: Number, | |||||
| campus ?: Number, | |||||
| city ?: Number, | |||||
| district ?: Number, | |||||
| street ?: Number, | |||||
| pay_range ?: Number, | |||||
| school_degree_rq ?: Number, | |||||
| scale ?: Number, | |||||
| character_flag ?: Number, | |||||
| update_time_range ?: Number, | |||||
| urgent ?: Number, | |||||
| } | |||||
| commomParams.value.search = commomParams.value.search as listType; | |||||
| commomParams.value.search.pagesize = 12; | |||||
| commomParams.value.search.fulltime = 1; | |||||
| commomParams.value.search.parttime = 2; | |||||
| commomParams.value.search.casual = 2; | |||||
| commomParams.value.search.practical = 2; | |||||
| commomParams.value.search.campus = 2; | |||||
| commomParams.value.search.city = 0; | |||||
| commomParams.value.search.district = 0; | |||||
| commomParams.value.search.street = 0; | |||||
| commomParams.value.search.pay_range = 0; | |||||
| commomParams.value.search.school_degree_rq = 0; | |||||
| commomParams.value.search.scale = 0; | |||||
| commomParams.value.search.character_flag = 0; | |||||
| commomParams.value.search.update_time_range = 0; | |||||
| commomParams.value.search.urgent = 0; | |||||
| watch(() => props.search_params, (newVal) => { | |||||
| emit('searchData', commomParams.value.search) | |||||
| watch(() => props.mode, (newVal) => { | |||||
| emit('searchData', {search: commomParams.value.search,mode: newVal}) | |||||
| }, { | }, { | ||||
| immediate: true | immediate: true | ||||
| }) | }) | ||||
| const getData = () => { | const getData = () => { | ||||
| emit('searchData', commomParams.value.search) | |||||
| if (searchType.value == '企业') { | |||||
| emit('searchData', {search: commomParams.value.search,mode: 2}) | |||||
| } else { | |||||
| emit('searchData', {search: commomParams.value.search,mode: 1}) | |||||
| } | |||||
| } | } | ||||
| // 清空搜索 | // 清空搜索 | ||||
| sortby: 'asc', | sortby: 'asc', | ||||
| keyword: '' | keyword: '' | ||||
| } | } | ||||
| commomParams.value.search.district = 100004; | |||||
| xiaolanList.value.forEach((item, index) => { | |||||
| item.checked = index === 1 ? true : false; | |||||
| }); | |||||
| zhongshanList.value.forEach((item, index) => { | |||||
| item.checked = false; | |||||
| }); | |||||
| jobNatureList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| if (searchType.value == '企业') { | |||||
| guimoList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| natureList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| emit('clearData', {search: commomParams.value.search,mode: 2}) | |||||
| } else { | |||||
| commomParams.value.search.district = 100004; | |||||
| xiaolanList.value.forEach((item, index) => { | |||||
| item.checked = index === 1 ? true : false; | |||||
| }); | |||||
| zhongshanList.value.forEach((item, index) => { | |||||
| item.checked = false; | |||||
| }); | |||||
| jobNatureList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| payList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| educationList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| guimoList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| natureList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| updateList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| emit('clearData', {search: commomParams.value.search,mode: 1}) | |||||
| } | |||||
| payList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| educationList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| guimoList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| natureList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| updateList.value.forEach((item, index) => { | |||||
| item.checked = index === 0 ? true : false; | |||||
| }); | |||||
| emit('clearData', commomParams.value.search) | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| emit('searchData', commomParams.value.search) | |||||
| emit('searchData', {search: commomParams.value.search,mode: 1}) | |||||
| console.log(commomParams.value.search); | console.log(commomParams.value.search); | ||||
| } | } | ||||
| commomParams.value.search[key] = 2; | commomParams.value.search[key] = 2; | ||||
| } | } | ||||
| } | } | ||||
| emit('searchData', commomParams.value.search) | |||||
| emit('searchData', {search: commomParams.value.search,mode: 1}) | |||||
| } | } | ||||
| // 薪酬范围 | // 薪酬范围 | ||||
| i.checked = i.id === item.id; | i.checked = i.id === item.id; | ||||
| }); | }); | ||||
| commomParams.value.search.pay_range = item.id; | commomParams.value.search.pay_range = item.id; | ||||
| emit('searchData', commomParams.value.search) | |||||
| emit('searchData', {search: commomParams.value.search,mode: 1}) | |||||
| } | } | ||||
| // 学历要求 | // 学历要求 | ||||
| i.checked = i.id === item.id; | i.checked = i.id === item.id; | ||||
| }); | }); | ||||
| commomParams.value.search.school_degree_rq = item.id; | commomParams.value.search.school_degree_rq = item.id; | ||||
| emit('searchData', commomParams.value.search) | |||||
| emit('searchData', {search: commomParams.value.search,mode: 1}) | |||||
| } | } | ||||
| const clickMore = () => { | const clickMore = () => { | ||||
| guimoList.value = res.data.dicts | guimoList.value = res.data.dicts | ||||
| }) | }) | ||||
| } | } | ||||
| const guimoChange = (item) => { | const guimoChange = (item) => { | ||||
| guimoList.value.forEach((i) => { | guimoList.value.forEach((i) => { | ||||
| i.checked = i.id === item.id; | i.checked = i.id === item.id; | ||||
| }); | }); | ||||
| commomParams.value.search.scale = item.id; | commomParams.value.search.scale = item.id; | ||||
| emit('searchData', commomParams.value.search) | |||||
| emit('searchData', {search: commomParams.value.search,mode: 1}) | |||||
| } | |||||
| const qiyeGuimoChange = (item) => { | |||||
| guimoList.value.forEach((i) => { | |||||
| i.checked = i.id === item.id; | |||||
| }); | |||||
| commomParams.value.search.scale = item.id; | |||||
| emit('searchData', {search: commomParams.value.search,mode: 2}) | |||||
| } | } | ||||
| // 企业性质 | // 企业性质 | ||||
| let natureList = ref<Object[]>([]); | let natureList = ref<Object[]>([]); | ||||
| }) | }) | ||||
| } | } | ||||
| const natureChange = (item) => { | |||||
| const qiyeNatureChange = (item) => { | |||||
| natureList.value.forEach((i) => { | natureList.value.forEach((i) => { | ||||
| i.checked = i.id === item.id; | i.checked = i.id === item.id; | ||||
| }); | }); | ||||
| commomParams.value.search.character_flag = item.id; | |||||
| emit('searchData', commomParams.value.search) | |||||
| commomParams.value.search.nature = item.id; | |||||
| emit('searchData', {search: commomParams.value.search,mode: 2}) | |||||
| } | } | ||||
| // 更新时间 | // 更新时间 | ||||
| i.checked = i.id === item.id; | i.checked = i.id === item.id; | ||||
| }); | }); | ||||
| commomParams.value.search.update_time_range = item.id; | commomParams.value.search.update_time_range = item.id; | ||||
| emit('searchData', commomParams.value.search) | |||||
| emit('searchData', {search: commomParams.value.search,mode: 1}) | |||||
| } | } | ||||
| const urgentChange = (item) => { | |||||
| emit('searchData', commomParams.value.search) | |||||
| const probationChange = (item) => { | |||||
| emit('searchData', {search: commomParams.value.search,mode: 2}) | |||||
| } | |||||
| const famousChange = (item) => { | |||||
| emit('searchData', {search: commomParams.value.search,mode: 2}) | |||||
| } | } | ||||
| /deep/ .ant-form-item { | /deep/ .ant-form-item { | ||||
| margin-bottom: 0; | margin-bottom: 0; | ||||
| } | } | ||||
| /deep/ .ant-tag-checkable-checked { | /deep/ .ant-tag-checkable-checked { | ||||
| background-color: #4FBE70; | background-color: #4FBE70; | ||||
| } | } | ||||
| /deep/ .ant-input-group-addon { | /deep/ .ant-input-group-addon { | ||||
| background-color: #4FBE70; | background-color: #4FBE70; | ||||
| } | } | ||||
| :deep(.ant-select-selection-item) { | |||||
| color: #ffffff !important; | |||||
| } | |||||
| </style> | </style> |
| </template> | </template> | ||||
| <template v-else> | <template v-else> | ||||
| <a-row :gutter="[10,20]"> | <a-row :gutter="[10,20]"> | ||||
| <a-col span="12" v-for="(item, index) in jobList"> | |||||
| <a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;"> | |||||
| <a-card :title="item.job_name"> | |||||
| <template #extra> | |||||
| <div>企业查看状态:{{item.status_text}}</div> | |||||
| </template> | |||||
| <div>投递时间:{{item.created_at}}</div> | |||||
| <div>企业名称:{{item.company_name}}</div> | |||||
| </a-card> | |||||
| </a-flex> | |||||
| <a-col span="8" v-for="(item, index) in jobList"> | |||||
| <a-card hoverable :title="item.job_name"> | |||||
| <template #extra> | |||||
| <div>企业查看状态:{{item.status_text}}</div> | |||||
| </template> | |||||
| <div>投递时间:{{item.created_at}}</div> | |||||
| <div>企业名称:{{item.company_name}}</div> | |||||
| </a-card> | |||||
| </a-col> | </a-col> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-flex justify="center"> | <a-flex justify="center"> | ||||
| // emit('detail') | // emit('detail') | ||||
| // } | // } | ||||
| onMounted(() => { | onMounted(() => { | ||||
| getData(); | getData(); | ||||
| }) | }) |
| <template #extra> | <template #extra> | ||||
| <a-button @click="cancelCollect(item.id,item.job_id)">取消收藏</a-button> | <a-button @click="cancelCollect(item.id,item.job_id)">取消收藏</a-button> | ||||
| </template> | </template> | ||||
| <div>企业名称:{{item.company_name}}</div> | |||||
| <div>收藏时间:{{item.created_at}}</div> | |||||
| <a-popover trigger="click" placement="rightTop"> | |||||
| <template #content> | |||||
| <job-detail v-if="detail_record" :detail_record="detail_record"></job-detail> | |||||
| </template> | |||||
| <a-button @click="detail(item.job_id)">详情</a-button> | |||||
| </a-popover> | |||||
| <a-row> | |||||
| <a-col span="20"> | |||||
| <div>企业名称:{{item.company_name}}</div> | |||||
| <div>收藏时间:{{item.created_at}}</div> | |||||
| </a-col> | |||||
| <a-col span="4"> | |||||
| <a-popover trigger="click" placement="rightTop"> | |||||
| <template #content> | |||||
| <job-detail v-if="detail_record" :detail_record="detail_record"></job-detail> | |||||
| </template> | |||||
| <a-button @click="detail(item.job_id)">详情</a-button> | |||||
| </a-popover> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-card> | </a-card> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| }, | }, | ||||
| }); | }); | ||||
| } | } | ||||
| let detail_record = ref<Object>(null) | let detail_record = ref<Object>(null) | ||||
| const detail = (record) => { | const detail = (record) => { | ||||
| detail_record.value = record; | detail_record.value = record; |
| </template> | </template> | ||||
| <template v-else> | <template v-else> | ||||
| <a-row :gutter="[10,20]"> | <a-row :gutter="[10,20]"> | ||||
| <a-col span="12" v-for="(item, index) in jobList"> | |||||
| <a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;"> | |||||
| <a-card :title="item.job_name" @click="detail(item.job_id)"> | |||||
| <template #extra> | |||||
| <a-space> | |||||
| <a-button @click="rejectInterview(item.id)">拒绝面试</a-button> | |||||
| <a-button @click="receiveInterview(item.id)" class="main-color">接受面试</a-button> | |||||
| </a-space> | |||||
| </template> | |||||
| <div>面试时间:{{item.invite_date}}</div> | |||||
| <div>面试结果:{{item.employ_status_txt}}</div> | |||||
| <div>面试企业:{{item.company_name}}</div> | |||||
| <a-popover trigger="click" placement="rightTop"> | |||||
| <template #content> | |||||
| <job-detail v-if="detail_record" :detail_record="detail_record"></job-detail> | |||||
| </template> | |||||
| <a-button @click="detail(item.job_id)">详情</a-button> | |||||
| </a-popover> | |||||
| </a-card> | |||||
| </a-flex> | |||||
| <a-col span="8" v-for="(item, index) in jobList"> | |||||
| <a-card hoverable :title="item.job_name" @click="detail(item.job_id)"> | |||||
| <template #extra> | |||||
| <a-space> | |||||
| <a-button @click="rejectInterview(item.id)">拒绝面试</a-button> | |||||
| <a-button @click="receiveInterview(item.id)" type="primary">接受面试</a-button> | |||||
| </a-space> | |||||
| </template> | |||||
| <a-row> | |||||
| <a-col span="20"> | |||||
| <div>面试时间:{{item.invite_date_txt}}</div> | |||||
| <div>面试结果:{{item.employ_status_txt}}</div> | |||||
| <div>面试企业:{{item.company_name}}</div> | |||||
| </a-col> | |||||
| <a-col span="4"> | |||||
| <a-popover trigger="click" placement="rightTop"> | |||||
| <template #content> | |||||
| <job-detail v-if="detail_record" :detail_record="detail_record"></job-detail> | |||||
| </template> | |||||
| <a-button @click="detail(item.job_id)" type="primary">详情</a-button> | |||||
| </a-popover> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-card> | |||||
| </a-col> | </a-col> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-flex justify="center"> | <a-flex justify="center"> |
| </template> | </template> | ||||
| <template v-else> | <template v-else> | ||||
| <a-row :gutter="[10,20]"> | <a-row :gutter="[10,20]"> | ||||
| <a-col span="12" v-for="(item, index) in jobList"> | |||||
| <a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;"> | |||||
| <a-card :title="item.job_name"> | |||||
| <template #extra> | |||||
| <a-space> | |||||
| <a-button @click="rejectInterview(item.id)">拒绝面试</a-button> | |||||
| <a-button @click="receiveInterview(item.id)" class="main-color">接受面试</a-button> | |||||
| </a-space> | |||||
| </template> | |||||
| <div>面试时间:{{item.invite_date}}</div> | |||||
| <div>面试结果:{{item.employ_status_txt}}</div> | |||||
| <div>面试企业:{{item.company_name}}</div> | |||||
| </a-card> | |||||
| </a-flex> | |||||
| <a-col span="8" v-for="(item, index) in jobList"> | |||||
| <a-card :title="item.company_name" @click="toDetail(item.company_id)"> | |||||
| <template #extra> | |||||
| <a-space> | |||||
| <div>{{item.read_time_txt}}</div> | |||||
| </a-space> | |||||
| </template> | |||||
| </a-card> | |||||
| </a-col> | </a-col> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-flex justify="center"> | <a-flex justify="center"> | ||||
| import { ref, computed, onMounted, defineEmits, createVNode } from 'vue'; | import { ref, computed, onMounted, defineEmits, createVNode } from 'vue'; | ||||
| import { GetViewHistoryList } from '@/apis/models'; | import { GetViewHistoryList } from '@/apis/models'; | ||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | import { warnToast, successToast } from '@/utils/toastHelper'; | ||||
| import { router } from '@/router'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | import { useCommon } from '@/hooks/useCommon'; | ||||
| let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | ||||
| const emit = defineEmits(); | const emit = defineEmits(); | ||||
| } | } | ||||
| } | } | ||||
| // const toDetail = (job_id : Number, company_id : Number) => { | |||||
| // sessionStorage.setItem('job_id', job_id) | |||||
| // sessionStorage.setItem('tab_key', 2) | |||||
| // sessionStorage.setItem('pubilc_id', company_id) | |||||
| // sessionStorage.setItem('mode', 'detail') | |||||
| // emit('detail') | |||||
| // } | |||||
| const toDetail = (company_id : Number) => { | |||||
| sessionStorage.setItem('tab_key', 1) | |||||
| sessionStorage.setItem('pubilc_id', company_id) | |||||
| sessionStorage.setItem('mode', 'detail') | |||||
| store.commit('getPageType', { | |||||
| pageType: '' | |||||
| }) | |||||
| store.commit('setShowLoginBox', { | |||||
| showLoginBox: false | |||||
| }) | |||||
| sessionStorage.setItem('pageType', '') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push({ | |||||
| path: '/personal' | |||||
| }) | |||||
| } | |||||
| onMounted(() => { | onMounted(() => { | ||||
| getData(); | getData(); | ||||
| }) | }) |
| <template> | <template> | ||||
| <div style="width: 100%;"> | <div style="width: 100%;"> | ||||
| <template v-if="state"> | <template v-if="state"> | ||||
| <a-form :model="createForm" layout="vertical"> | |||||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="简历是否可见" name="hide_resume"> | <a-form-item label="简历是否可见" name="hide_resume"> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="身高(厘米cm)"> | <a-form-item label="身高(厘米cm)"> | ||||
| <a-input-number :min="0" type="number" v-model:value="createForm.height" placeholder="请输入身高" | <a-input-number :min="0" type="number" v-model:value="createForm.height" placeholder="请输入身高" | ||||
| style="width: 100%;" /> | |||||
| style="width: 100%;" size="large" /> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="体重(千克kg)"> | <a-form-item label="体重(千克kg)"> | ||||
| <a-input-number :min="0" type="number" v-model:value="createForm.weight" placeholder="请输入体重" | <a-input-number :min="0" type="number" v-model:value="createForm.weight" placeholder="请输入体重" | ||||
| style="width: 100%;" /> | |||||
| style="width: 100%;" size="large" /> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-flex justify="flex-end"> | <a-flex justify="flex-end"> | ||||
| <a-space> | <a-space> | ||||
| <a-button @click="resetForm" size="large">取消</a-button> | |||||
| <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | ||||
| </a-space> | </a-space> | ||||
| </a-flex> | </a-flex> | ||||
| <a-row :gutter="[20,20]"> | <a-row :gutter="[20,20]"> | ||||
| <a-col span="10"> | <a-col span="10"> | ||||
| <a-row> | <a-row> | ||||
| <a-col span="24"> | |||||
| 姓 名:{{detail.name}} | |||||
| </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.name}} | |||||
| </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-row> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="8"> | <a-col span="8"> | ||||
| <a-row> | <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-row> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="6"> | <a-col span="6"> | ||||
| <image-container | <image-container | ||||
| :imgObj="{src: 'https://rcsc-test.jcjob.cn/img'+detail.photo ,width: '200px',height:'280px'}"></image-container> | |||||
| :imgObj="{src: 'https://rcsc-test.jcjob.cn/img'+detail.photo ,width: '150px',height:'210px'}"></image-container> | |||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </template> | </template> | ||||
| } | } | ||||
| const sumbitForm = () => { | const sumbitForm = () => { | ||||
| if(createForm.value.id) { | |||||
| if (createForm.value.id) { | |||||
| PostJobapplicantUpdate(createForm.value).then(res => { | PostJobapplicantUpdate(createForm.value).then(res => { | ||||
| successToast('保存成功'); | successToast('保存成功'); | ||||
| getBasic(); | getBasic(); |
| <template> | <template> | ||||
| <div> | <div> | ||||
| <template v-if="state"> | <template v-if="state"> | ||||
| <a-form :model="createForm" layout="vertical"> | |||||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="8"> | <a-col span="8"> | ||||
| <a-form-item label="固话" name="landline"> | <a-form-item label="固话" name="landline"> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-flex justify="flex-end"> | <a-flex justify="flex-end"> | ||||
| <a-space> | <a-space> | ||||
| <a-button @click="resetForm" size="large">取消</a-button> | |||||
| <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | ||||
| </a-space> | </a-space> | ||||
| </a-flex> | </a-flex> | ||||
| <a-row :gutter="[20,20]"> | <a-row :gutter="[20,20]"> | ||||
| <a-col span="10"> | <a-col span="10"> | ||||
| <a-row> | <a-row> | ||||
| <a-col span="24"> | |||||
| 固 话:{{detail.mobile}} | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| 手机号码:{{detail.mobile}} | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| Q Q:{{detail.qq}} | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| 个人网站:{{detail.personal_website}} | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| 通信地址:{{detail.mailing_address}} | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| 邮 编:{{detail.qq}} | |||||
| </a-col> | |||||
| <a-space direction="vertical"> | |||||
| <a-col span="24"> | |||||
| 固 话:{{detail.mobile}} | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| 手机号码:{{detail.mobile}} | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| Q Q:{{detail.qq}} | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| 个人网站:{{detail.personal_website}} | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| 通信地址:{{detail.mailing_address}} | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| 邮 编:{{detail.postal_code}} | |||||
| </a-col> | |||||
| </a-space> | |||||
| </a-row> | </a-row> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> |
| <template> | <template> | ||||
| <template v-if="state"> | <template v-if="state"> | ||||
| <a-form :model="createForm" layout="vertical"> | |||||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="证书名称" name="name"> | <a-form-item label="证书名称" name="name"> | ||||
| </template> | </template> | ||||
| <p>证书描述: {{item.description}}</p> | <p>证书描述: {{item.description}}</p> | ||||
| <image-container | <image-container | ||||
| :imgObj="{src: item.certificate_photo ,width: '240px',height:'180px'}"></image-container> | |||||
| :imgObj="{src: item.certificate_photo ,width: '150px',height:'210px'}"></image-container> | |||||
| </a-card> | </a-card> | ||||
| </a-skeleton> | </a-skeleton> | ||||
| </a-list-item> | </a-list-item> | ||||
| </script> | </script> | ||||
| <style> | |||||
| <style scoped> | |||||
| :deep(.ant-list-item:last-child) { | |||||
| border-block-end: none !important; | |||||
| } | |||||
| </style> | </style> |
| <template> | <template> | ||||
| <a-modal v-model:visible="openOtherModel_1" title="预览简历" ok-text="提交" cancel-text="取消" @ok="sumbitForm" | <a-modal v-model:visible="openOtherModel_1" title="预览简历" ok-text="提交" cancel-text="取消" @ok="sumbitForm" | ||||
| @cancel="cancelModal" width="60%"> | |||||
| @cancel="cancelModal" width="60%" :footer="null"> | |||||
| <a-spin :spinning="spinning"> | <a-spin :spinning="spinning"> | ||||
| <a-typography> | <a-typography> | ||||
| <a-typography-title :level="4">基本资料</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-typography-paragraph> | ||||
| <a-row :gutter="[20,20]"> | <a-row :gutter="[20,20]"> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-row :gutter="[20,20]"> | <a-row :gutter="[20,20]"> | ||||
| <a-col span="10"> | <a-col span="10"> | ||||
| <a-row> | <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-row> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="8"> | <a-col span="8"> | ||||
| <a-row> | <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-row> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="6"> | <a-col span="6"> | ||||
| <image-container | <image-container | ||||
| :imgObj="{src: detail.photo? 'https://admin1.jcjob.cn/img/' + detail.photo : '', width: '200px',height: '280px',mode: 'fill'}"></image-container> | |||||
| :imgObj="{src: 'https://rcsc-test.jcjob.cn/img'+detail.photo ,width: '150px',height:'210px'}"></image-container> | |||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </a-typography-paragraph> | </a-typography-paragraph> | ||||
| <a-typography-title :level="4">个人简介</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-typography-paragraph> | ||||
| <div v-html="detail.description"></div> | |||||
| <div v-html="detail.introduction"></div> | |||||
| </a-typography-paragraph> | </a-typography-paragraph> | ||||
| <a-typography-title :level="4">求职期望</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-typography-paragraph> | ||||
| <a-row> | <a-row> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-row> | <a-row> | ||||
| <a-col span="8" v-if="detail.desire_areas"> | <a-col span="8" v-if="detail.desire_areas"> | ||||
| <a-row> | <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-row> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="8" v-if="detail.desire_positions"> | <a-col span="8" v-if="detail.desire_positions"> | ||||
| <a-row> | <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-row> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="8" v-if="detail.desire_industrys"> | <a-col span="8" v-if="detail.desire_industrys"> | ||||
| <a-row> | <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-row> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </a-row> | </a-row> | ||||
| </a-typography-paragraph> | </a-typography-paragraph> | ||||
| </a-typography> | </a-typography> | ||||
| <a-typography-title :level="4">专业技能掌握能力</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-typography-paragraph> | ||||
| <a-row> | <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-row> | ||||
| </a-typography-paragraph> | </a-typography-paragraph> | ||||
| <a-typography-title :level="4">工作经历</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-typography-paragraph> | ||||
| <template v-for="(item,index) in detail.experiences"> | <template v-for="(item,index) in detail.experiences"> | ||||
| <a-card :title="item.company_name" style="margin-bottom: 10px;"> | <a-card :title="item.company_name" style="margin-bottom: 10px;"> | ||||
| </a-card> | </a-card> | ||||
| </template> | </template> | ||||
| </a-typography-paragraph> | </a-typography-paragraph> | ||||
| <a-typography-title :level="4">教育/培训经历</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-typography-paragraph> | ||||
| <template v-for="(item,index) in detail.trainings"> | <template v-for="(item,index) in detail.trainings"> | ||||
| <a-card :title="item.school_or_institution" style="margin-bottom: 10px;"> | <a-card :title="item.school_or_institution" style="margin-bottom: 10px;"> | ||||
| openOtherModel_1 = computed(() => { | openOtherModel_1 = computed(() => { | ||||
| return store.state.openOtherModel_1; | return store.state.openOtherModel_1; | ||||
| }) | }) | ||||
| watch(() => [props.detail_record], (newVal) => { | watch(() => [props.detail_record], (newVal) => { | ||||
| if (newVal[0]) { | if (newVal[0]) { | ||||
| padding: 6px; | padding: 6px; | ||||
| // padding-top: 6px; | // padding-top: 6px; | ||||
| } | } | ||||
| .text-decoration { | |||||
| position: relative; | |||||
| display: inline-block; | |||||
| overflow: visible; | |||||
| } | |||||
| .text-decoration::before { | |||||
| content: ''; | |||||
| width: 6px; | |||||
| height: 22px; | |||||
| background-color: #4FBE70; | |||||
| position: absolute; | |||||
| top: 4px | |||||
| } | |||||
| .text-content { | |||||
| position: relative; | |||||
| margin-left: 20px; | |||||
| } | |||||
| </style> | </style> |
| <template> | <template> | ||||
| <template v-if="state"> | <template v-if="state"> | ||||
| <a-form :model="createForm" layout="vertical"> | |||||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="工作时间"> | <a-form-item label="工作时间"> | ||||
| <a-card :title="item.company_name" style="width: 100%"> | <a-card :title="item.company_name" style="width: 100%"> | ||||
| <template #extra> | <template #extra> | ||||
| <a-space> | <a-space> | ||||
| <a-button @click="toEdit(item)" size="small"> | |||||
| <a-button @click="toEdit(item)" type="primary" size="small"> | |||||
| 编辑 | 编辑 | ||||
| </a-button> | </a-button> | ||||
| <a-popconfirm title="是否删除该经历" @confirm="del(item.id)"> | <a-popconfirm title="是否删除该经历" @confirm="del(item.id)"> | ||||
| </script> | </script> | ||||
| <style> | |||||
| <style scoped> | |||||
| :deep(.ant-list-item:last-child) { | |||||
| border-block-end: none !important; | |||||
| } | |||||
| </style> | </style> |
| } | } | ||||
| export let dataPositionForm = { | export let dataPositionForm = { | ||||
| industry: 0, | |||||
| level1: 0, | |||||
| level2: 0, | |||||
| } | } | ||||
| export let dataBasicForm = { | export let dataBasicForm = { | ||||
| } | } | ||||
| export let otherDataForm = { | export let otherDataForm = { | ||||
| area: [], | |||||
| position: [] | |||||
| } | } | ||||
| export const reset = () => { | export const reset = () => { | ||||
| level4: 0, | level4: 0, | ||||
| } | } | ||||
| dataPositionForm = { | dataPositionForm = { | ||||
| industry: 0, | |||||
| level1: 0, | |||||
| level2: 0, | |||||
| } | } | ||||
| dataBasicForm = { | dataBasicForm = { | ||||
| job_type: 0, | job_type: 0, | ||||
| holiday_rest: 0, | holiday_rest: 0, | ||||
| } | } | ||||
| otherDataForm = { | otherDataForm = { | ||||
| area: [], | |||||
| position: [] | |||||
| } | } | ||||
| return { dataAreaForm, dataPositionForm, dataBasicForm,otherDataForm } | |||||
| return { dataAreaForm, dataPositionForm, dataBasicForm, otherDataForm } | |||||
| } | } |
| type JobseekerIntentionPositionFormType = { | type JobseekerIntentionPositionFormType = { | ||||
| id ?: Number, | id ?: Number, | ||||
| industry?: Number, | |||||
| level1 ?: Number, | |||||
| level2 ?: Number, | |||||
| } | } | ||||
| type JobseekerIntentionBasicFormType = { | type JobseekerIntentionBasicFormType = { | ||||
| } | } | ||||
| type OtherFormType = { | type OtherFormType = { | ||||
| photo_img ?: String, | |||||
| area ?: Number[], | |||||
| position?: Number[], | |||||
| } | } | ||||
| } | } |
| <template> | <template> | ||||
| <div> | <div> | ||||
| <template v-if="!state"> | |||||
| <a-form layout="vertical"> | |||||
| <a-tabs v-model:activeKey="activeKey" style="width: 100%"> | |||||
| <a-tab-pane key="1" tab="意向地区"> | |||||
| <template v-if="state"> | |||||
| <a-form layout="vertical" class="resume-form"> | |||||
| <a-tabs v-model:activeKey="activeKey" style="width: 100%" type="card"> | |||||
| <a-tab-pane :key="1" tab="意向地区"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-form-item label="意向地区"> | <a-form-item label="意向地区"> | ||||
| <a-jilian :dict="2009" @saveCascader="areaSave" placeholder="请选择意向地区" | <a-jilian :dict="2009" @saveCascader="areaSave" placeholder="请选择意向地区" | ||||
| :cascader_content="aa"></a-jilian> | |||||
| :cascader_content="addOtherForm.area"></a-jilian> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-flex justify="flex-end"> | <a-flex justify="flex-end"> | ||||
| <a-space> | <a-space> | ||||
| <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | |||||
| <a-button @click="resetForm('area')" size="large">取消</a-button> | |||||
| <a-button type="primary" @click="sumbitAreaForm" size="large">保存</a-button> | |||||
| </a-space> | </a-space> | ||||
| </a-flex> | </a-flex> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </a-tab-pane> | </a-tab-pane> | ||||
| <a-tab-pane key="2" tab="意向职位" force-render> | |||||
| <a-tab-pane :key="2" tab="意向职位" force-render> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-form-item label="意向职位"> | <a-form-item label="意向职位"> | ||||
| <a-jilian :dict="2004" @saveCascader="positionSave" placeholder="请选择意向职位" | <a-jilian :dict="2004" @saveCascader="positionSave" placeholder="请选择意向职位" | ||||
| :cascader_content="aa"></a-jilian> | |||||
| :cascader_content="addOtherForm.position"></a-jilian> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-flex justify="flex-end"> | <a-flex justify="flex-end"> | ||||
| <a-space> | <a-space> | ||||
| <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | |||||
| <a-button @click="resetForm('position')" size="large">取消</a-button> | |||||
| <a-button type="primary" @click="sumbitPositionForm" size="large">保存</a-button> | |||||
| </a-space> | </a-space> | ||||
| </a-flex> | </a-flex> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </a-tab-pane> | </a-tab-pane> | ||||
| <a-tab-pane key="3" tab="其他意向"> | |||||
| <a-tab-pane :key="3" tab="其他意向"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="12"> | |||||
| <a-form-item label="其他职位" name="other_positions"> | |||||
| <a-input v-model:value="basicForm.other_positions" placeholder="请输入其他职位" | |||||
| size="large" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="求职类型"> | <a-form-item label="求职类型"> | ||||
| <a-xuanze :dict="2019" placeholder="请选择求职类型" @saveSelect="saveJobType" | <a-xuanze :dict="2019" placeholder="请选择求职类型" @saveSelect="saveJobType" | ||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item required label="工作经验" name="work_experience"> | |||||
| <a-xuanze :dict="2019" placeholder="请选择求工作经验" @saveSelect="saveJobType" | |||||
| <a-form-item label="工作经验" name="work_experience"> | |||||
| <a-xuanze :dict="2021" placeholder="请选择求工作经验" @saveSelect="saveWorkExperience" | |||||
| :select_content="basicForm.work_experience"></a-xuanze> | :select_content="basicForm.work_experience"></a-xuanze> | ||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | |||||
| <a-form-item required label="其他职位" name="other_positions"> | |||||
| <a-input v-model:value="basicForm.other_positions" placeholder="请输入其他职位" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="月薪要求范围"> | <a-form-item label="月薪要求范围"> | ||||
| <a-xuanze :dict="2005" placeholder="请选择月薪要求范围" @saveSelect="saveSalaryRange" | <a-xuanze :dict="2005" placeholder="请选择月薪要求范围" @saveSelect="saveSalaryRange" | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="可到职日期"> | <a-form-item label="可到职日期"> | ||||
| <a-xuanze :dict="2013" placeholder="请选择可到职日期" @saveSelect="saveAvailableDate" | <a-xuanze :dict="2013" placeholder="请选择可到职日期" @saveSelect="saveAvailableDate" | ||||
| :select_content="basicForm.basicForm"></a-xuanze> | |||||
| :select_content="basicForm.available_date"></a-xuanze> | |||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-flex justify="flex-end"> | <a-flex justify="flex-end"> | ||||
| <a-space> | <a-space> | ||||
| <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | |||||
| <a-button @click="resetForm('basic')" size="large">取消</a-button> | |||||
| <a-button type="primary" @click="sumbitBasicForm" size="large">保存</a-button> | |||||
| </a-space> | </a-space> | ||||
| </a-flex> | </a-flex> | ||||
| </a-col> | </a-col> | ||||
| </a-form> | </a-form> | ||||
| </template> | </template> | ||||
| <template v-else> | <template v-else> | ||||
| <a-row :gutter="[20,20]"> | |||||
| <a-col span="10"> | |||||
| <a-row> | |||||
| <a-col span="24"> | |||||
| 姓 名:{{detail.name}} | |||||
| </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-row> | |||||
| </a-col> | |||||
| <a-col span="10"> | |||||
| <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-row> | |||||
| </a-col> | |||||
| <a-col span="4"> | |||||
| <a-image :src="'https://rcsc-test.jcjob.cn/img'+detail.photo" /> | |||||
| </a-col> | |||||
| </a-row> | |||||
| <a-typography> | |||||
| <a-typography-title :level="5"> | |||||
| 意向职位 | |||||
| </a-typography-title> | |||||
| </a-typography> | |||||
| <a-typography-paragraph> | |||||
| <a-space direction="vertical"> | |||||
| <template v-for="(item,index) in positionList"> | |||||
| <div> | |||||
| {{item.level1_txt}}/{{item.level2_txt}} | |||||
| <a-divider type="vertical" /> | |||||
| <a-button size="small" type="text" @click="toPositionEdit(item)"> | |||||
| <EditOutlined /> | |||||
| </a-button> | |||||
| <a-divider type="vertical" /> | |||||
| <a-popconfirm title="是否删除该意向职位" @confirm="delPosition(item.id)"> | |||||
| <a-button size="small" type="text" > | |||||
| <DeleteOutlined /> | |||||
| </a-button> | |||||
| </a-popconfirm> | |||||
| </div> | |||||
| </template> | |||||
| </a-space> | |||||
| </a-typography-paragraph> | |||||
| <a-typography> | |||||
| <a-typography-title :level="5"> | |||||
| 意向地区 | |||||
| </a-typography-title> | |||||
| </a-typography> | |||||
| <a-typography-paragraph> | |||||
| <a-space direction="vertical"> | |||||
| <template v-for="(item,index) in areaList"> | |||||
| <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}} | |||||
| <a-divider type="vertical" /> | |||||
| <a-button size="small" type="text" @click="toEdit(item)"> | |||||
| <EditOutlined /> | |||||
| </a-button> | |||||
| <a-divider type="vertical" /> | |||||
| <a-popconfirm title="是否删除该意向地区" @confirm="delArea(item.id)"> | |||||
| <a-button size="small" type="text" > | |||||
| <DeleteOutlined /> | |||||
| </a-button> | |||||
| </a-popconfirm> | |||||
| </div> | |||||
| </template> | |||||
| </a-space> | |||||
| </a-typography-paragraph> | |||||
| <template v-if="basic"> | |||||
| <a-typography> | |||||
| <a-typography-title :level="5"> | |||||
| 其他意向 | |||||
| </a-typography-title> | |||||
| </a-typography> | |||||
| <a-typography-paragraph> | |||||
| <div>{{basic.job_type_txt}}职位</div> | |||||
| <div> | |||||
| {{basic.talent_type_txt}} | |||||
| <a-divider type="vertical" /> | |||||
| {{basic.holiday_rest_txt}} | |||||
| <a-divider type="vertical" /> | |||||
| {{basic.salary_range_txt}} | |||||
| <a-divider type="vertical" /> | |||||
| <a-button size="small" type="text" @click="toBasicEdit"> | |||||
| <EditOutlined /> | |||||
| </a-button> | |||||
| <a-divider type="vertical" /> | |||||
| <a-popconfirm title="是否删除其他意向" @confirm="delBasic(basic.id)"> | |||||
| <a-button size="small" type="text" > | |||||
| <DeleteOutlined /> | |||||
| </a-button> | |||||
| </a-popconfirm> | |||||
| </div> | |||||
| </a-typography-paragraph> | |||||
| </template> | |||||
| </template> | </template> | ||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue'; | import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue'; | ||||
| import { PostJobapplicantAdd, PostJobapplicantUpdate, GetJobapplicantDetail } from '@/apis/models'; | |||||
| import { PostJobapplicantAdddesirearea, PostJobapplicantDeldesirearea, PostJobapplicantUpdatedesirearea, PostJobapplicantListdesirearea, PostJobapplicantDesireareadetail, PostJobapplicantAdddesireindustry, PostJobapplicantDeldesireindustry, PostJobapplicantUpdatedesireindustry, PostJobapplicantListdesireindustry, PostJobapplicantDesireindustrydetail, PostJobapplicantAdddesirebase, PostJobapplicantDeldesirebase, PostJobapplicantUpdatedesirebase, PostJobapplicantDesirebasedetail } from '@/apis/models'; | |||||
| import { intersectionAlike } from '@/utils/dataHelper'; | import { intersectionAlike } from '@/utils/dataHelper'; | ||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | import { warnToast, successToast } from '@/utils/toastHelper'; | ||||
| import { dataAreaForm, dataPositionForm, dataBasicForm, otherDataForm, reset } from '@/components/jobseeker/resume/intention/data.ts'; | import { dataAreaForm, dataPositionForm, dataBasicForm, otherDataForm, reset } from '@/components/jobseeker/resume/intention/data.ts'; | ||||
| import { EditOutlined, FileSearchOutlined, RedoOutlined, DeleteOutlined } from '@ant-design/icons-vue'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | import { useCommon } from '@/hooks/useCommon'; | ||||
| let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||||
| let { store, dayjs,commomParams, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||||
| const dayjsRef = ref(dayjs); | const dayjsRef = ref(dayjs); | ||||
| let props = defineProps(['form_state']); | let props = defineProps(['form_state']); | ||||
| const emit = defineEmits(); | const emit = defineEmits(); | ||||
| let state = ref<Boolean>(false) | let state = ref<Boolean>(false) | ||||
| let detail = ref({}) | |||||
| 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 areaForm = ref<JobseekerIntentionType.JobseekerIntentionAreaFormType>(dataAreaForm) | ||||
| let positionForm = ref<JobseekerIntentionType.JobseekerIntentionPositionFormType>(dataPositionForm) | let positionForm = ref<JobseekerIntentionType.JobseekerIntentionPositionFormType>(dataPositionForm) | ||||
| let basicForm = ref<JobseekerIntentionType.JobseekerIntentionBasicFormType>(dataBasicForm) | let basicForm = ref<JobseekerIntentionType.JobseekerIntentionBasicFormType>(dataBasicForm) | ||||
| onMounted(() => { | onMounted(() => { | ||||
| getBasic() | getBasic() | ||||
| getPosition() | |||||
| getArea() | |||||
| }) | }) | ||||
| const getBasic = () => { | const getBasic = () => { | ||||
| GetJobapplicantDetail().then(res => { | |||||
| detail.value = res.data; | |||||
| createForm.value = intersectionAlike(createForm.value, res.data) | |||||
| createForm.value.id = res.data.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 | |||||
| } | |||||
| PostJobapplicantDesirebasedetail().then(res => { | |||||
| basic.value = res.data | |||||
| basicForm.value = intersectionAlike(basicForm.value, res.data) | |||||
| basicForm.value.id = res.data.id; | |||||
| }) | |||||
| } | |||||
| const getArea = () => { | |||||
| PostJobapplicantListdesirearea().then(res => { | |||||
| areaList.value = res.data.jobapplicantareas | |||||
| areaForm.value = intersectionAlike(areaForm.value, res.data) | |||||
| }) | |||||
| } | |||||
| const getPosition = () => { | |||||
| PostJobapplicantListdesireindustry().then(res => { | |||||
| positionList.value = res.data.jobapplicantpositions | |||||
| positionForm.value = intersectionAlike(positionForm.value, res.data) | |||||
| }) | }) | ||||
| } | } | ||||
| // 意向地区 | // 意向地区 | ||||
| const areaSave = (data) => { | const areaSave = (data) => { | ||||
| for (let i = 0; i < 4; i++) { | 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('保存成功'); | |||||
| getArea(); | |||||
| resetForm('area') | |||||
| }).catch(err => { | |||||
| }) | |||||
| } else { | |||||
| PostJobapplicantAdddesirearea(areaForm.value).then(res => { | |||||
| successToast('保存成功'); | |||||
| getArea(); | |||||
| activeKey.value = 2 | |||||
| resetForm('area') | |||||
| }).catch(err => { | |||||
| }) | |||||
| } | } | ||||
| } | } | ||||
| const toEdit = (item : Object) => { | |||||
| areaForm.value.id = item.id; | |||||
| getDetail(areaForm.value.id) | |||||
| emit("editEdit") | |||||
| } | |||||
| // 详情 | |||||
| const getDetail = (val) => { | |||||
| PostJobapplicantDesireareadetail({id: val}).then(res => { | |||||
| areaForm.value = intersectionAlike(areaForm.value, res.data) | |||||
| areaForm.value.id = res.data.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 positionSave = (data) => { | 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('保存成功'); | |||||
| getPosition(); | |||||
| resetForm('position') | |||||
| }).catch(err => { | |||||
| }) | |||||
| } else { | |||||
| PostJobapplicantAdddesireindustry(positionForm.value).then(res => { | |||||
| successToast('保存成功'); | |||||
| getPosition(); | |||||
| activeKey.value = 3 | |||||
| resetForm('position') | |||||
| }).catch(err => { | |||||
| }) | |||||
| } | |||||
| } | |||||
| const toPositionEdit = (item : Object) => { | |||||
| positionForm.value.id = item.id; | |||||
| getPositionDetail(positionForm.value.id) | |||||
| activeKey.value = 2 | |||||
| emit("editEdit") | |||||
| } | |||||
| // 详情 | |||||
| const getPositionDetail = (val) => { | |||||
| PostJobapplicantDesireindustrydetail({id: val}).then(res => { | |||||
| positionForm.value = intersectionAlike(positionForm.value, res.data) | |||||
| positionForm.value.id = res.data.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('删除成功'); | |||||
| areaList.value = []; | |||||
| getPosition(); | |||||
| }) | |||||
| } | |||||
| // 求职类型 | // 求职类型 | ||||
| const saveJobType = (data) => { | const saveJobType = (data) => { | ||||
| createForm.value.job_type = data.val; | |||||
| basicForm.value.job_type = data.val.key; | |||||
| } | } | ||||
| // 人才类型 | // 人才类型 | ||||
| const saveTalentType = (data) => { | 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) => { | const saveSalaryRange = (data) => { | ||||
| createForm.value.base.salary_range = data.val; | |||||
| basicForm.value.salary_range = data.val.key; | |||||
| } | } | ||||
| // 可到职日期 | // 可到职日期 | ||||
| const saveAvailableDate = (data) => { | const saveAvailableDate = (data) => { | ||||
| createForm.value.base.available_date = data.val; | |||||
| basicForm.value.available_date = data.val.key; | |||||
| } | } | ||||
| // 职称要求 | // 职称要求 | ||||
| const saveTitleRequirement = (data) => { | const saveTitleRequirement = (data) => { | ||||
| createForm.value.base.title_requirement = data.val; | |||||
| basicForm.value.title_requirement = data.val.key; | |||||
| } | } | ||||
| // 技能认证 | // 技能认证 | ||||
| const saveSkillCertification = (data) => { | const saveSkillCertification = (data) => { | ||||
| createForm.value.base.skill_certification = data.val; | |||||
| basicForm.value.skill_certification = data.val.key; | |||||
| } | } | ||||
| // 食宿要求 | // 食宿要求 | ||||
| const saveAccommodationRequirement = (data) => { | const saveAccommodationRequirement = (data) => { | ||||
| createForm.value.base.accommodation_requirement = data.val; | |||||
| basicForm.value.accommodation_requirement = data.val.key; | |||||
| } | } | ||||
| // 节假日休息情况 | // 节假日休息情况 | ||||
| const saveHolidayRest = (data) => { | const saveHolidayRest = (data) => { | ||||
| createForm.value.base.holiday_rest = data.val; | |||||
| basicForm.value.holiday_rest = data.val.key; | |||||
| } | } | ||||
| const sumbitForm = () => { | |||||
| if (createForm.value.id) { | |||||
| PostJobapplicantUpdate(createForm.value).then(res => { | |||||
| const sumbitBasicForm = () => { | |||||
| if (basicForm.value.id) { | |||||
| PostJobapplicantUpdatedesirebase(basicForm.value).then(res => { | |||||
| successToast('保存成功'); | successToast('保存成功'); | ||||
| getBasic(); | getBasic(); | ||||
| resetForm() | |||||
| resetForm('basic') | |||||
| }).catch(err => { | }).catch(err => { | ||||
| }) | }) | ||||
| } else { | } else { | ||||
| PostJobapplicantAdd(createForm.value).then(res => { | |||||
| PostJobapplicantAdddesirebase(basicForm.value).then(res => { | |||||
| successToast('保存成功'); | successToast('保存成功'); | ||||
| getBasic(); | getBasic(); | ||||
| resetForm() | |||||
| resetForm('basic') | |||||
| }).catch(err => { | }).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 = () => { | |||||
| createForm.value = reset().dataForm as JobseekerBasicType.JobseekerBasicFormType; | |||||
| addOtherForm.value = reset().otherDataForm as JobseekerBasicType.OtherFormType; | |||||
| const resetForm = (val) => { | |||||
| if (val == 'area') { | |||||
| areaForm = reset().dataForm as JobseekerIntentionType.JobseekerIntentionAreaFormType; | |||||
| } | |||||
| if (val == 'position') { | |||||
| positionForm = reset().dataForm as JobseekerIntentionType.JobseekerIntentionPositionFormType; | |||||
| } | |||||
| if (val == 'basic') { | |||||
| basicForm = reset().dataForm as JobseekerIntentionType.JobseekerIntentionBasicFormType; | |||||
| } | |||||
| addOtherForm = reset().dataForm as JobseekerIntentionType.OtherFormType; | |||||
| state.value = false; | state.value = false; | ||||
| emit("quitEdit") | emit("quitEdit") | ||||
| } | } |
| <template> | <template> | ||||
| <div> | <div> | ||||
| <template v-if="state"> | <template v-if="state"> | ||||
| <a-form :model="createForm" layout="vertical"> | |||||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-form-item label="个人简介" name="description"> | <a-form-item label="个人简介" name="description"> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-flex justify="flex-end"> | <a-flex justify="flex-end"> | ||||
| <a-space> | <a-space> | ||||
| <a-button @click="resetForm" size="large">取消</a-button> | |||||
| <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | ||||
| </a-space> | </a-space> | ||||
| </a-flex> | </a-flex> |
| <template> | <template> | ||||
| <div> | <div> | ||||
| <template v-if="state"> | <template v-if="state"> | ||||
| <a-form :model="createForm" layout="vertical"> | |||||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="英语" name="english"> | <a-form-item label="英语" name="english"> | ||||
| <a-row :gutter="[20,20]"> | <a-row :gutter="[20,20]"> | ||||
| <a-col span="10"> | <a-col span="10"> | ||||
| <a-row> | <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-row> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> |
| <template> | <template> | ||||
| <template v-if="state"> | <template v-if="state"> | ||||
| <a-form :model="createForm" layout="vertical"> | |||||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||||
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="12"> | <a-col span="12"> | ||||
| <a-form-item label="培训/教育时间"> | <a-form-item label="培训/教育时间"> | ||||
| <a-card :title="item.school_or_institution" style="width: 100%"> | <a-card :title="item.school_or_institution" style="width: 100%"> | ||||
| <template #extra> | <template #extra> | ||||
| <a-space> | <a-space> | ||||
| <a-button @click="toEdit(item)" size="small"> | |||||
| <a-button @click="toEdit(item)" type="primary" size="small"> | |||||
| 编辑 | 编辑 | ||||
| </a-button> | </a-button> | ||||
| <a-popconfirm title="是否删除该经历" @confirm="del(item.id)"> | <a-popconfirm title="是否删除该经历" @confirm="del(item.id)"> | ||||
| </script> | </script> | ||||
| <style> | |||||
| <style scoped> | |||||
| :deep(.ant-list-item:last-child) { | |||||
| border-block-end: none !important; | |||||
| } | |||||
| </style> | </style> |
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| <a-row style="margin-top: 30px;"> | |||||
| <a-row style="margin-top: 30px; color: #fff;"> | |||||
| <a-col sapn="24"> | <a-col sapn="24"> | ||||
| <a-typography-paragraph style="font-size: 12px; text-align: left;" | |||||
| <a-typography-paragraph style="font-size: 12px; text-align: left;color: #fff;" | |||||
| content="中山求职 招聘 到菊城人才网 本网站实名:中山市菊城人才网" /> | content="中山求职 招聘 到菊城人才网 本网站实名:中山市菊城人才网" /> | ||||
| <a-typography-paragraph style="font-size: 12px; text-align: left;" | |||||
| <a-typography-paragraph style="font-size: 12px; text-align: left;color: #fff;" | |||||
| content="邮编:zsjcjob@163.com 传真号码:0760-22236922 0760-22236026" /> | content="邮编:zsjcjob@163.com 传真号码:0760-22236922 0760-22236026" /> | ||||
| <a-typography-paragraph style="font-size: 12px; text-align: left;" | |||||
| <a-typography-paragraph style="font-size: 12px; text-align: left;color: #fff;" | |||||
| content="Copyright@2002-2024 菊城人才网 All Right Reserved 粤ICP备05092134号" /> | content="Copyright@2002-2024 菊城人才网 All Right Reserved 粤ICP备05092134号" /> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| <div>0760-22236225、22236226</div> | <div>0760-22236225、22236226</div> | ||||
| </div> | </div> | ||||
| <div style="display: flex;flex-direction: column;align-items: center;"> | <div style="display: flex;flex-direction: column;align-items: center;"> | ||||
| <a-image :width="100" | |||||
| src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png" /> | |||||
| <image-container | |||||
| :imgObj="{src: '/images/gongzhonghao.png',width: '100px',height:'100px'}"></image-container> | |||||
| <div>官方公众号</div> | <div>官方公众号</div> | ||||
| </div> | </div> | ||||
| </div> | </div> |
| <a-menu-item key="1"> | <a-menu-item key="1"> | ||||
| <a-space :size="80"> | <a-space :size="80"> | ||||
| <div>发布中</div> | <div>发布中</div> | ||||
| <div></div> | |||||
| <div>{{companyJobListLength}}</div> | |||||
| </a-space> | </a-space> | ||||
| </a-menu-item> | </a-menu-item> | ||||
| <a-menu-item key="2"> | <a-menu-item key="2"> | ||||
| <a-space :size="80"> | <a-space :size="80"> | ||||
| <div>未查看</div> | <div>未查看</div> | ||||
| <div>1000分</div> | |||||
| <div>{{companyResumeListLength}}</div> | |||||
| </a-space> | </a-space> | ||||
| </a-menu-item> | </a-menu-item> | ||||
| <a-menu-item key="3" v-if="pageType != 'company'"> | |||||
| <a-menu-item key="3"> | |||||
| <a-space :size="80"> | <a-space :size="80"> | ||||
| <div>管理中心</div> | <div>管理中心</div> | ||||
| </a-space> | </a-space> | ||||
| </a-menu> | </a-menu> | ||||
| </template> | </template> | ||||
| <a-space :size="10"> | <a-space :size="10"> | ||||
| <div style="color: aliceblue;">admin</div> | |||||
| <div style="color: aliceblue;">招聘者</div> | |||||
| <a-avatar style="color: #f56a00; background-color: #fde3cf">U</a-avatar> | <a-avatar style="color: #f56a00; background-color: #fde3cf">U</a-avatar> | ||||
| </a-space> | </a-space> | ||||
| </a-dropdown> | </a-dropdown> | ||||
| </a-menu> | </a-menu> | ||||
| </template> | </template> | ||||
| <a-space :size="10"> | <a-space :size="10"> | ||||
| <div style="color: aliceblue;">admin</div> | |||||
| <div style="color: aliceblue;">求职者</div> | |||||
| <a-avatar style="color: #f56a00; background-color: #fde3cf">U</a-avatar> | <a-avatar style="color: #f56a00; background-color: #fde3cf">U</a-avatar> | ||||
| </a-space> | </a-space> | ||||
| </a-dropdown> | </a-dropdown> | ||||
| <script lang="ts" setup> | <script lang="ts" setup> | ||||
| import { ref, onMounted, computed, defineProps, defineEmits } from 'vue'; | import { ref, onMounted, computed, defineProps, defineEmits } from 'vue'; | ||||
| import ATopMenu from '@/components/layout/menu/aMenu.vue'; | import ATopMenu from '@/components/layout/menu/aMenu.vue'; | ||||
| import { PostCustomerVerify, GetPersonInterviewList } from '@/apis/models'; | |||||
| import { PostCustomerVerify, GetPersonInterviewList, GetCompanyResumeList, PostCompanyJobList } from '@/apis/models'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | import { warnToast, successToast } from '@/utils/toastHelper'; | ||||
| import { store } from '@/store/index'; | import { store } from '@/store/index'; | ||||
| import { router } from '@/router/index'; | import { router } from '@/router/index'; | ||||
| import { useMenu } from '@/hooks/useMenu'; | |||||
| let { onMenu, routerCur, routerArrayCur, routerArrayParentChildCur } = useMenu(); | |||||
| const emit = defineEmits(); | const emit = defineEmits(); | ||||
| // 成为招聘者 | // 成为招聘者 | ||||
| } | } | ||||
| const quit = () => { | const quit = () => { | ||||
| store.commit('setShowLoginBox', { | |||||
| showLoginBox: true | |||||
| }) | |||||
| sessionStorage.clear() | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/job/home') | |||||
| if(routerCur() == '/job/home') { | |||||
| sessionStorage.clear() | |||||
| location.reload() | |||||
| } else { | |||||
| store.commit('getPageType', { | |||||
| pageType: '' | |||||
| }) | |||||
| store.commit('setShowLoginBox', { | |||||
| showLoginBox: false | |||||
| }) | |||||
| sessionStorage.clear() | |||||
| sessionStorage.setItem('pageType', '') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/job/home') | |||||
| } | |||||
| } | } | ||||
| const returnHome = () => { | const returnHome = () => { | ||||
| } | } | ||||
| const handleMenuClick = (val) => { | const handleMenuClick = (val) => { | ||||
| if (val.key == 1) { | |||||
| if(routerCur() != '/manage/invite') { | |||||
| store.commit('getPageType', { | |||||
| pageType: 'company' | |||||
| }) | |||||
| sessionStorage.setItem('pageType', 'company') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/manage/invite') | |||||
| } | |||||
| } | |||||
| if (val.key == 2) { | |||||
| if(routerCur() != '/manage/resume') { | |||||
| store.commit('getPageType', { | |||||
| pageType: 'company' | |||||
| }) | |||||
| sessionStorage.setItem('pageType', 'company') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/manage/resume') | |||||
| } | |||||
| } | |||||
| if (val.key == 3) { | if (val.key == 3) { | ||||
| store.commit('getPageType', { | |||||
| pageType: 'company' | |||||
| }) | |||||
| sessionStorage.setItem('pageType', 'company') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/manage/home') | |||||
| if(routerCur() != '/manage/home') { | |||||
| store.commit('getPageType', { | |||||
| pageType: 'company' | |||||
| }) | |||||
| sessionStorage.setItem('pageType', 'company') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/manage/home') | |||||
| } | |||||
| } | } | ||||
| if (val.key == 6) { | |||||
| store.commit('getPageType', { | |||||
| pageType: 'company' | |||||
| }) | |||||
| sessionStorage.setItem('pageType', 'company') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/manage/home') | |||||
| if (val.key == 4) { | |||||
| if(routerCur() != '/manage/invite') { | |||||
| store.commit('getPageType', { | |||||
| pageType: 'company' | |||||
| }) | |||||
| sessionStorage.setItem('pageType', 'company') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/manage/invite') | |||||
| } | |||||
| } | |||||
| if (val.key == 5) { | |||||
| if(routerCur() != '/manage/resume') { | |||||
| store.commit('getPageType', { | |||||
| pageType: 'company' | |||||
| }) | |||||
| sessionStorage.setItem('pageType', 'company') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/manage/resume') | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| const personalMenuClick = (val) => { | const personalMenuClick = (val) => { | ||||
| router.push('/jobseeker/home') | router.push('/jobseeker/home') | ||||
| } | } | ||||
| if (val.key == 4) { | if (val.key == 4) { | ||||
| store.commit('getPageType', { | |||||
| pageType: 'personal' | |||||
| }) | |||||
| sessionStorage.setItem('pageType', 'personal') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/jobseeker/resume') | |||||
| if(routerCur() == '/jobseeker/resume') { | |||||
| location.reload() | |||||
| } else { | |||||
| store.commit('getPageType', { | |||||
| pageType: 'personal' | |||||
| }) | |||||
| sessionStorage.setItem('pageType', 'personal') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/jobseeker/resume') | |||||
| } | |||||
| } | } | ||||
| if (val.key == 5) { | if (val.key == 5) { | ||||
| store.commit('getPageType', { | store.commit('getPageType', { | ||||
| } | } | ||||
| if (val.key == 7) { | if (val.key == 7) { | ||||
| store.commit('getPageType', { | |||||
| pageType: 'personal' | |||||
| }) | |||||
| sessionStorage.setItem('pageType', 'personal') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/jobseeker/home') | |||||
| // store.commit('getPageType', { | |||||
| // pageType: 'personal' | |||||
| // }) | |||||
| // sessionStorage.setItem('pageType', 'personal') | |||||
| // store.commit('permissions/SET_PERMISSION', null) | |||||
| // store.commit('permissions/SET_MENU', []) | |||||
| // router.push('/jobseeker/home') | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| let interviewListLength = ref<Number>(0) | let interviewListLength = ref<Number>(0) | ||||
| let companyResumeListLength = ref<Number>(0) | |||||
| let companyJobListLength = ref<Number>(0) | |||||
| onMounted(() => { | onMounted(() => { | ||||
| if(sessionStorage.getItem('pageType') == 'personal' && sessionStorage.getItem('role') == 'personal') { | if(sessionStorage.getItem('pageType') == 'personal' && sessionStorage.getItem('role') == 'personal') { | ||||
| GetPersonInterviewList({ status: 0 }).then(res => { | GetPersonInterviewList({ status: 0 }).then(res => { | ||||
| interviewListLength.value = res.data.list.length | |||||
| interviewListLength.value = res.data.total | |||||
| }) | |||||
| } | |||||
| if(sessionStorage.getItem('pageType') == 'company' && sessionStorage.getItem('role') == 'company') { | |||||
| GetCompanyResumeList().then(res => { | |||||
| companyResumeListLength.value = res.data.total | |||||
| }) | |||||
| PostCompanyJobList().then(res => { | |||||
| companyJobListLength.value = res.data.total | |||||
| }) | }) | ||||
| } | } | ||||
| }) | }) | ||||
| </script> | </script> | ||||
| // z-index: 99; | // z-index: 99; | ||||
| // padding: 30px; | // padding: 30px; | ||||
| width: 100%; | width: 100%; | ||||
| background-color: #cccccc !important; | |||||
| background-color: #0A130D !important; | |||||
| color: #fff !important; | color: #fff !important; | ||||
| } | } | ||||
| </style> | </style> |
| <template> | <template> | ||||
| <a-menu mode="horizontal" v-model:openKeys="openSubMenu" @openChange="onOpenChange" | <a-menu mode="horizontal" v-model:openKeys="openSubMenu" @openChange="onOpenChange" | ||||
| v-model:selectedKeys="selectedMenu" style="background: #0A130D; height: '90vh';color: #fff;"> | |||||
| v-model:selectedKeys="selectedMenu" style="background: #0A130D; height: '90vh';color: #ffffff;"> | |||||
| <template v-for="(item,index) in menuList"> | <template v-for="(item,index) in menuList"> | ||||
| <template v-if="!item.children"> | <template v-if="!item.children"> | ||||
| <a-menu-item :key="item.path" @click="onMenu(item.path)"> | <a-menu-item :key="item.path" @click="onMenu(item.path)"> | ||||
| /* 修改菜单的背景颜色 */ | /* 修改菜单的背景颜色 */ | ||||
| } | } | ||||
| .ant-menu .ant-sub-menu { | |||||
| /* .ant-menu .ant-sub-menu { | |||||
| color: #000000; | color: #000000; | ||||
| } */ | |||||
| :deep(.ant-menu-submenu-title::after) { | |||||
| color: #4FBE70 !important; | |||||
| } | |||||
| :deep(.ant-menu-submenu-selected >.ant-menu-submenu-title) { | |||||
| color: #4FBE70 !important; | |||||
| } | |||||
| :deep(.ant-menu-submenu-active) { | |||||
| color: #4FBE70 !important; | |||||
| } | } | ||||
| :deep(.ant-menu-submenu-title) { | |||||
| :deep(.ant-menu-menu-active) { | |||||
| color: #4FBE70 !important; | color: #4FBE70 !important; | ||||
| } | } | ||||
| color: #4FBE70 !important; | color: #4FBE70 !important; | ||||
| } | } | ||||
| :deep(.ant-menu-item-selected) { | |||||
| color: #4FBE70 !important; | |||||
| } | |||||
| /* | |||||
| :deep(.ant-menu-item-active::after) { | |||||
| color: #ffffff !important; | |||||
| border-bottom-color: #4FBE70 !important; | |||||
| } | |||||
| .ant-menu-item-selected .ant-menu-item-title { | |||||
| color: #4FBE70 !important; | |||||
| } */ | |||||
| </style> | </style> |
| <a-row :gutter="20"> | <a-row :gutter="20"> | ||||
| <a-col span="6"> | <a-col span="6"> | ||||
| <a-form-item> | <a-form-item> | ||||
| <a-input-search v-model:value="commomParams.search.keyword" placeholder="请输入账号名" enter-button="搜索" | |||||
| <a-input-search v-model:value="commomParams.search.keyword" placeholder="请输入验证码" enter-button="搜索" | |||||
| @search="getData" /> | @search="getData" /> | ||||
| </a-form-item> | </a-form-item> | ||||
| </a-col> | </a-col> |
| }; | }; | ||||
| // 照片前缀 | // 照片前缀 | ||||
| const imageprefix : string = 'https://rcsc-test.jcjob.cn/img/' | |||||
| const imageprefix : string = 'https://admin1.jcjob.cn/img/' | |||||
| import AJilian from '@/components/form/jilian.vue'; | import AJilian from '@/components/form/jilian.vue'; | ||||
| import AShujilian from '@/components/form/shujilian.vue'; | import AShujilian from '@/components/form/shujilian.vue'; | ||||
| import AXuanze from '@/components/form/xuanze.vue'; | import AXuanze from '@/components/form/xuanze.vue'; | ||||
| import ALogin from '@/components/form/login.vue'; | |||||
| import ImageContainer from '@/components/common/image-container.vue'; | import ImageContainer from '@/components/common/image-container.vue'; | ||||
| import EditButton from '@/components/common/edit-button.vue'; | import EditButton from '@/components/common/edit-button.vue'; | ||||
| import { routesModuleList } from '@/router/dynamic'; | import { routesModuleList } from '@/router/dynamic'; | ||||
| app.component('a-jilian', AJilian); | app.component('a-jilian', AJilian); | ||||
| app.component('a-shujilian', AShujilian); | app.component('a-shujilian', AShujilian); | ||||
| app.component('a-xuanze', AXuanze); | app.component('a-xuanze', AXuanze); | ||||
| app.component('a-login', ALogin); | |||||
| app.component('QuillEditor', QuillEditor) | app.component('QuillEditor', QuillEditor) | ||||
| app.component('image-container', ImageContainer) | app.component('image-container', ImageContainer) | ||||
| app.component('edit-button', EditButton) | app.component('edit-button', EditButton) |
| }; | }; | ||||
| // 消息中心 | // 消息中心 | ||||
| const ManageMessageRoute : AppRouteRecordRaw = { | |||||
| path: '/manageMessage', | |||||
| name: 'message', | |||||
| component: routerList.ManageMessage, | |||||
| meta: { | |||||
| title: '消息中心', | |||||
| icon: HomeOutlined | |||||
| }, | |||||
| }; | |||||
| // const ManageMessageRoute : AppRouteRecordRaw = { | |||||
| // path: '/manageMessage', | |||||
| // name: 'message', | |||||
| // component: routerList.ManageMessage, | |||||
| // meta: { | |||||
| // title: '消息中心', | |||||
| // icon: HomeOutlined | |||||
| // }, | |||||
| // }; | |||||
| // 用户管理 | // 用户管理 | ||||
| const ManageUserRoute : AppRouteRecordRaw = { | const ManageUserRoute : AppRouteRecordRaw = { | ||||
| ManageResumeRoute, | ManageResumeRoute, | ||||
| ManageSearchRoute, | ManageSearchRoute, | ||||
| ManageMeetRoute, | ManageMeetRoute, | ||||
| ManageMessageRoute, | |||||
| // ManageMessageRoute, | |||||
| ManageUserRoute | ManageUserRoute | ||||
| ]; | ]; |
| const { routerDynamic, routerAdd, routerInit } = useAsRouter(); | const { routerDynamic, routerAdd, routerInit } = useAsRouter(); | ||||
| const NotFound = { | |||||
| path: '/:pathMatch(.*)*', | |||||
| name: 'NotFound', | |||||
| component: () => import('@/views/404.vue'), | |||||
| meta: { | |||||
| title: '系统找不到页面', | |||||
| } | |||||
| } | |||||
| export interface PermissionState { | export interface PermissionState { | ||||
| menuList : string[]; | menuList : string[]; | ||||
| permissionList : string[] | null; | permissionList : string[] | null; | ||||
| async FETCH_PERMISSION({ | async FETCH_PERMISSION({ | ||||
| commit,rootState | commit,rootState | ||||
| }) { | }) { | ||||
| try { | |||||
| try { | |||||
| // let res = await LOGIN.permissions(); | // let res = await LOGIN.permissions(); | ||||
| // let arr = res.data.data; | // let arr = res.data.data; | ||||
| console.log(rootState) | console.log(rootState) | ||||
| LayoutRoute.children = routesManageModuleList; | LayoutRoute.children = routesManageModuleList; | ||||
| commit('SET_MENU', LayoutRoute.children); | commit('SET_MENU', LayoutRoute.children); | ||||
| routerAdd(LayoutRoute); | routerAdd(LayoutRoute); | ||||
| routerAdd(NotFound); | |||||
| let initialRoutes = routerInit(); | let initialRoutes = routerInit(); | ||||
| commit('SET_PERMISSION', [...initialRoutes]); | commit('SET_PERMISSION', [...initialRoutes]); | ||||
| } else if(rootState.token && rootState.role === 'personal' && rootState.pageType == 'personal'){ | } else if(rootState.token && rootState.role === 'personal' && rootState.pageType == 'personal'){ | ||||
| LayoutRoute.children = routesJobseekerModuleList; | LayoutRoute.children = routesJobseekerModuleList; | ||||
| commit('SET_MENU', LayoutRoute.children); | commit('SET_MENU', LayoutRoute.children); | ||||
| routerAdd(LayoutRoute); | routerAdd(LayoutRoute); | ||||
| routerAdd(NotFound); | |||||
| let initialRoutes = routerInit(); | let initialRoutes = routerInit(); | ||||
| commit('SET_PERMISSION', [...initialRoutes]); | commit('SET_PERMISSION', [...initialRoutes]); | ||||
| } else { | } else { | ||||
| LayoutRoute.children = routesModuleList; | LayoutRoute.children = routesModuleList; | ||||
| commit('SET_MENU', LayoutRoute.children); | commit('SET_MENU', LayoutRoute.children); | ||||
| routerAdd(LayoutRoute); | routerAdd(LayoutRoute); | ||||
| routerAdd(NotFound); | |||||
| let initialRoutes = routerInit(); | let initialRoutes = routerInit(); | ||||
| commit('SET_PERMISSION', [...initialRoutes]); | commit('SET_PERMISSION', [...initialRoutes]); | ||||
| } | } |
| .main-color { | .main-color { | ||||
| color: #4FBE70; | color: #4FBE70; | ||||
| } | |||||
| .fs-white { | |||||
| color: #ffffff !important; | |||||
| } | |||||
| .ant-tabs-tab-btn { | |||||
| color: #4FBE70 !important; | |||||
| } | |||||
| .ant-btn-primary { | |||||
| background-color: #4FBE70 !important; | |||||
| box-shadow: 0 2px 0 rgba(79, 190, 112, 0.1)important; | |||||
| } | |||||
| .ant-menu-submenu-selected::after { | |||||
| border-bottom-color: #4FBE70 !important; | |||||
| } | |||||
| .ant-menu-item-selected::after { | |||||
| color: #4FBE70 !important; | |||||
| } | |||||
| .ant-pagination-item-active { | |||||
| border-color: #4FBE70 !important; | |||||
| } | |||||
| .ant-pagination-item-active a { | |||||
| color: #4FBE70 !important; | |||||
| } | |||||
| .ant-switch-checked { | |||||
| background: #4FBE70 !important; | |||||
| } | |||||
| .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) { | |||||
| background: #4FBE70 !important; | |||||
| border-color: #4FBE70 !important; | |||||
| } | |||||
| .ant-radio-button-wrapper:hover { | |||||
| color: #4FBE70 !important; | |||||
| } | |||||
| .resume-form { | |||||
| background-color: #f8f8f8; | |||||
| padding: 16px; | |||||
| border-radius: 8px; | |||||
| } | } |
| <template> | |||||
| <div class="nopage"> | |||||
| <span style="color: #0074D9;">4</span> | |||||
| <span style="color: #67C23A;">0</span> | |||||
| <span style="color: #0074D9;">4</span> | |||||
| <div> | |||||
| <!-- <p>Page Not Found</p> --> | |||||
| <p>你页面走丢了~</p> | |||||
| <p> | |||||
| <router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link> | |||||
| </p> | |||||
| </div> | |||||
| </div> | |||||
| </template> | |||||
| <script> | |||||
| </script> | |||||
| <style scoped > | |||||
| .nopage { | |||||
| margin-top: 5vw; | |||||
| text-align: center; | |||||
| } | |||||
| .nopage span { | |||||
| font-size: 10vw; | |||||
| } | |||||
| .nopage p { | |||||
| margin: 1vw; | |||||
| font-size: 2.5vw; | |||||
| } | |||||
| </style> |
| <template> | <template> | ||||
| <a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist."> | <a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist."> | ||||
| <template #extra> | <template #extra> | ||||
| <a-button type="primary">Back Home</a-button> | |||||
| <router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link> | |||||
| </template> | </template> | ||||
| </a-result> | </a-result> | ||||
| </template> | </template> |
| <template> | <template> | ||||
| <a-row> | |||||
| <a-row :gutter="20"> | |||||
| <a-col span="4"> | <a-col span="4"> | ||||
| <common-left-sider :menu_list="menu_list" :selected_key="selectedKeys" | <common-left-sider :menu_list="menu_list" :selected_key="selectedKeys" | ||||
| @changeKey="changeKey"></common-left-sider> | @changeKey="changeKey"></common-left-sider> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="16"> | |||||
| <div style="width: 100%;background-color: #fff;height: calc(100vh - 100px);padding: 10px;"> | |||||
| <a-col span="20"> | |||||
| <div style="width: 100%;background-color: #fff;height: calc(100vh - 100px);padding: 10px;border-radius: 8px;"> | |||||
| <download v-if="curKey" :key_id="curKey"></download> | <download v-if="curKey" :key_id="curKey"></download> | ||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="4"> | |||||
| <!-- <a-col span="4"> | |||||
| <a-list size="small" bordered :data-source="data" style="height: 294px"> | <a-list size="small" bordered :data-source="data" style="height: 294px"> | ||||
| <template #renderItem="{ item }"> | <template #renderItem="{ item }"> | ||||
| <a-list-item>{{ item }}</a-list-item> | <a-list-item>{{ item }}</a-list-item> | ||||
| <div>Header</div> | <div>Header</div> | ||||
| </template> | </template> | ||||
| </a-list> | </a-list> | ||||
| </a-col> | |||||
| </a-col> --> | |||||
| </a-row> | </a-row> | ||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> |
| <template> | <template> | ||||
| <a-row> | |||||
| <a-row :gutter="20"> | |||||
| <a-col span="4"> | <a-col span="4"> | ||||
| <common-left-sider :menu_list="menu_list" :selected_key="selectedKeys" | <common-left-sider :menu_list="menu_list" :selected_key="selectedKeys" | ||||
| @changeKey="changeKey"></common-left-sider> | @changeKey="changeKey"></common-left-sider> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="16"> | |||||
| <div style="width: 100%;background-color: #fff;height: calc(100vh - 100px);padding: 10px;"> | |||||
| <a-col span="20"> | |||||
| <div style="width: 100%;background-color: #fff;height: calc(100vh - 100px); overflow: auto; padding: 10px;border-radius: 8px;cursor: pointer;"> | |||||
| <website-notice v-if="curKey" :key_id="curKey"></website-notice> | <website-notice v-if="curKey" :key_id="curKey"></website-notice> | ||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="4"> | |||||
| <a-list size="small" bordered :data-source="data" style="height: 294px"> | |||||
| <!-- <a-col span="4"> | |||||
| <a-list size="small" bordered :data-source="data" style="height: 294px; cursor: pointer;"> | |||||
| <template #renderItem="{ item }"> | <template #renderItem="{ item }"> | ||||
| <a-list-item>{{ item }}</a-list-item> | <a-list-item>{{ item }}</a-list-item> | ||||
| </template> | </template> | ||||
| <div>Header</div> | <div>Header</div> | ||||
| </template> | </template> | ||||
| </a-list> | </a-list> | ||||
| </a-col> | |||||
| </a-col> --> | |||||
| </a-row> | </a-row> | ||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> |
| <a-list-item> | <a-list-item> | ||||
| <a-list-item-meta> | <a-list-item-meta> | ||||
| <template #title> | <template #title> | ||||
| <div style="font-size: 18px; font-family: bold;"></div> | |||||
| {{companyDetail.full_name}} | |||||
| <div style="font-size: 24px; font-family: bold;">{{companyDetail.full_name}}</div> | |||||
| </template> | </template> | ||||
| <template #description> | <template #description> | ||||
| <div> | <div> | ||||
| </a-list-item> | </a-list-item> | ||||
| </a-list> | </a-list> | ||||
| <a-tabs v-model:activeKey="activeKey"> | |||||
| <a-tabs v-model:activeKey="activeKey" type="card"> | |||||
| <a-tab-pane :key="1" tab="企业信息"> | <a-tab-pane :key="1" tab="企业信息"> | ||||
| <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;"> | |||||
| <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;border-radius: 8px;"> | |||||
| <a-descriptions title="公司介绍" layout="vertical"> | <a-descriptions title="公司介绍" layout="vertical"> | ||||
| <a-descriptions-item> | <a-descriptions-item> | ||||
| <div v-html="companyDetail.introduction"></div> | <div v-html="companyDetail.introduction"></div> | ||||
| v-if="companyDetail.situation">{{companyDetail.situation.establishment_date }}</a-descriptions-item> | v-if="companyDetail.situation">{{companyDetail.situation.establishment_date }}</a-descriptions-item> | ||||
| </a-descriptions> | </a-descriptions> | ||||
| </div> | </div> | ||||
| <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;"> | |||||
| <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;border-radius: 8px;"> | |||||
| <a-descriptions :column="7" title="联系方式" layout="vertical"> | <a-descriptions :column="7" title="联系方式" layout="vertical"> | ||||
| <a-descriptions-item label="联系地址" | <a-descriptions-item label="联系地址" | ||||
| span="2">{{companyDetail.detail_address}}</a-descriptions-item> | span="2">{{companyDetail.detail_address}}</a-descriptions-item> | ||||
| <a-descriptions-item label="传真">{{companyDetail.fax}}</a-descriptions-item> | <a-descriptions-item label="传真">{{companyDetail.fax}}</a-descriptions-item> | ||||
| </a-descriptions> | </a-descriptions> | ||||
| </div> | </div> | ||||
| <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;"> | |||||
| <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;border-radius: 8px;"> | |||||
| <a-descriptions :column="7" title="企业相册" layout="vertical"> | <a-descriptions :column="7" title="企业相册" layout="vertical"> | ||||
| <a-descriptions-item label="联系地址" | |||||
| span="2">{{companyDetail.detail_address}}</a-descriptions-item> | |||||
| <a-descriptions-item label="联系人">{{companyDetail.contact}}</a-descriptions-item> | |||||
| <a-descriptions-item label="联系手机">{{companyDetail.mobile}}</a-descriptions-item> | |||||
| <a-descriptions-item label="联系电话">{{companyDetail.phone}}</a-descriptions-item> | |||||
| <a-descriptions-item label="Email">{{companyDetail.email}}</a-descriptions-item> | |||||
| <a-descriptions-item label="传真">{{companyDetail.fax}}</a-descriptions-item> | |||||
| <a-descriptions-item><image-container | |||||
| :imgObj="{src: imageprefix + companyDetail.photo,width: '153px',height:'50px'}"></image-container></a-descriptions-item> | |||||
| </a-descriptions> | </a-descriptions> | ||||
| </div> | </div> | ||||
| <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;"> | |||||
| <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;border-radius: 8px;"> | |||||
| <a-descriptions :column="1" title="地图位置" layout="vertical"> | <a-descriptions :column="1" title="地图位置" layout="vertical"> | ||||
| <a-descriptions-item span="1"> | |||||
| <div v-if="companyDetail.latitude && companyDetail.longitude" style="width: 100%;"> | |||||
| <v-map :lat="companyDetail.latitude" :lng="companyDetail.longitude"></v-map> | |||||
| </div> | |||||
| <a-descriptions-item span="24"> | |||||
| <div ref="mapContainer" class="map-container"></div> | |||||
| </a-descriptions-item> | </a-descriptions-item> | ||||
| </a-descriptions> | </a-descriptions> | ||||
| </div> | </div> | ||||
| </a-tab-pane> | </a-tab-pane> | ||||
| <a-tab-pane :key="2" tab="招聘职位" force-render> | <a-tab-pane :key="2" tab="招聘职位" force-render> | ||||
| <template v-if="!jobList || jobList.length == 0"> | <template v-if="!jobList || jobList.length == 0"> | ||||
| <template v-else> | <template v-else> | ||||
| <a-row :gutter="10"> | <a-row :gutter="10"> | ||||
| <a-col span="6"> | <a-col span="6"> | ||||
| <div style="height: calc(100vh - 100px); overflow: auto;background-color: #ffffff;"> | |||||
| <a-card hoverable style="width: 100%"> | |||||
| <div style="height: calc(100vh - 100px); overflow: auto;background-color: #ffffff;padding-bottom: 20px; border-radius: 8px;"> | |||||
| <job-card :list="jobList" @detail="toDetail"></job-card> | |||||
| <a-flex justify="center"> | |||||
| <a-space> | |||||
| <a-pagination simple v-model:current="current" | |||||
| :total="total" @change="pageChange" /> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| <!-- <a-card hoverable :bordered="false" style="width: 100%"> | |||||
| <template #cover> | <template #cover> | ||||
| <job-card :list="jobList" @detail="toDetail"></job-card> | <job-card :list="jobList" @detail="toDetail"></job-card> | ||||
| </template> | </template> | ||||
| <template #actions> | <template #actions> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-pagination simple hideOnSinglePage v-model:current="current" | |||||
| :total="total" @change="pageChange" /> | |||||
| </a-col> | </a-col> | ||||
| </template> | </template> | ||||
| </a-card> | |||||
| </a-card> --> | |||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <div v-if="job_id" style="height: calc(100vh - 100px); overflow: auto;padding: 20px;background-color: #ffffff;"> | |||||
| <div v-if="job_id" | |||||
| style="height: calc(100vh - 100px); overflow: auto;padding: 20px;background-color: #ffffff;border-radius: 8px;"> | |||||
| <job-detail :id="job_id"></job-detail> | <job-detail :id="job_id"></job-detail> | ||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| import { PostCompanyInfo, GetJobCompanyjobs } from '@/apis/models'; | import { PostCompanyInfo, GetJobCompanyjobs } from '@/apis/models'; | ||||
| import { ArrowLeftOutlined } from '@ant-design/icons-vue'; | import { ArrowLeftOutlined } from '@ant-design/icons-vue'; | ||||
| import { router } from '@/router'; | import { router } from '@/router'; | ||||
| import { useCommon } from '@/hooks/useCommon'; | |||||
| let { imageprefix } = useCommon(); | |||||
| let activeKey = ref<Number>(sessionStorage.getItem('tab_key') ? Number(sessionStorage.getItem('tab_key')) : 1) | let activeKey = ref<Number>(sessionStorage.getItem('tab_key') ? Number(sessionStorage.getItem('tab_key')) : 1) | ||||
| let companyDetail = ref<object>({}) | let companyDetail = ref<object>({}) | ||||
| let jobList = ref<object[]>([]) | let jobList = ref<object[]>([]) | ||||
| let total = ref<Number>(0) | let total = ref<Number>(0) | ||||
| let job_id = ref<Number>(0) | let job_id = ref<Number>(0) | ||||
| let mode = ref<String>(sessionStorage.getItem('mode')) | let mode = ref<String>(sessionStorage.getItem('mode')) | ||||
| const mapContainer = ref(null); | |||||
| const toDetail = (data) => { | const toDetail = (data) => { | ||||
| job_id.value = data.id; | job_id.value = data.id; | ||||
| } | } | ||||
| const pageChange = (page) => { | |||||
| current.value = page | |||||
| getJobCompanyjobs(page) | |||||
| } | |||||
| const getJobCompanyjobs = (page) => { | const getJobCompanyjobs = (page) => { | ||||
| GetJobCompanyjobs({ company_id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id'), page: current.value, pagesize: 3 }).then(res => { | |||||
| GetJobCompanyjobs({ company_id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id'), page: page, pagesize: 3 }).then(res => { | |||||
| total.value = res.data.total; | total.value = res.data.total; | ||||
| if (res.data.jobs.length > 3) { | if (res.data.jobs.length > 3) { | ||||
| jobList.value = res.data.jobs.slice(0, 3) | jobList.value = res.data.jobs.slice(0, 3) | ||||
| }) | }) | ||||
| } | } | ||||
| const pageChange = (page) => { | |||||
| current.value = page | |||||
| getJobCompanyjobs() | |||||
| } | |||||
| const back = (page) => { | const back = (page) => { | ||||
| sessionStorage.removeItem('pubilc_id') | sessionStorage.removeItem('pubilc_id') | ||||
| PostCompanyInfo({ id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id') }).then(res => { | PostCompanyInfo({ id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id') }).then(res => { | ||||
| companyDetail.value = res.data | companyDetail.value = res.data | ||||
| }) | }) | ||||
| getJobCompanyjobs() | |||||
| getJobCompanyjobs(current.value) | |||||
| } | } | ||||
| } | } | ||||
| const initMap = () => { | |||||
| var center = new TMap.LatLng(39.984104, 116.307503);//设置中心点坐标 | |||||
| //初始化地图 | |||||
| var map = new TMap.Map(mapContainer.value, { | |||||
| center: center | |||||
| }); | |||||
| //创建并初始化MultiMarker | |||||
| var markerLayer = new TMap.MultiMarker({ | |||||
| map: map, //指定地图容器 | |||||
| //样式定义 | |||||
| styles: { | |||||
| //创建一个styleId为"myStyle"的样式(styles的子属性名即为styleId) | |||||
| "myStyle": new TMap.MarkerStyle({ | |||||
| "width": 25, // 点标记样式宽度(像素) | |||||
| "height": 35, // 点标记样式高度(像素) | |||||
| "src": '../img/marker.png', //图片路径 | |||||
| //焦点在图片中的像素位置,一般大头针类似形式的图片以针尖位置做为焦点,圆形点以圆心位置为焦点 | |||||
| "anchor": { x: 16, y: 32 } | |||||
| }) | |||||
| }, | |||||
| //点标记数据数组 longitude | |||||
| geometries: [{ | |||||
| "id": "1", //点标记唯一标识,后续如果有删除、修改位置等操作,都需要此id | |||||
| "styleId": 'myStyle', //指定样式id | |||||
| "position": new TMap.LatLng(companyDetail.value.latitude, companyDetail.value.longitude), //点标记坐标位置 | |||||
| "properties": {//自定义属性 | |||||
| "title": "marker1" | |||||
| } | |||||
| } | |||||
| ] | |||||
| }); | |||||
| } | |||||
| pubilc_id.value = sessionStorage.getItem('pubilc_id') ? Number(sessionStorage.getItem('pubilc_id')) : pubilc_id.value; | pubilc_id.value = sessionStorage.getItem('pubilc_id') ? Number(sessionStorage.getItem('pubilc_id')) : pubilc_id.value; | ||||
| if (sessionStorage.getItem('pubilc_id') != 0 || sessionStorage.getItem('id') != 0) { | if (sessionStorage.getItem('pubilc_id') != 0 || sessionStorage.getItem('id') != 0) { | ||||
| PostCompanyInfo({ id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id') }).then(res => { | PostCompanyInfo({ id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id') }).then(res => { | ||||
| companyDetail.value = res.data | |||||
| companyDetail.value = res.data; | |||||
| companyDetail.value.latitude = 39.984104 | |||||
| companyDetail.value.longitude = 116.307503 | |||||
| if (mapContainer.value) { | |||||
| initMap() | |||||
| } else { | |||||
| console.error('地图容器元素未找到'); | |||||
| } | |||||
| }) | }) | ||||
| getJobCompanyjobs() | |||||
| getJobCompanyjobs(current.value) | |||||
| } | } | ||||
| } | } | ||||
| }) | }) | ||||
| :deep(.ant-list-item) { | :deep(.ant-list-item) { | ||||
| padding: 0 !important; | padding: 0 !important; | ||||
| } | } | ||||
| .map-container { | |||||
| width: 100%; | |||||
| height: 400px; | |||||
| } | |||||
| </style> | </style> |
| <div class="content-padding-inline" style="margin: 30px 0;"> | <div class="content-padding-inline" style="margin: 30px 0;"> | ||||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | <a-row :gutter="[10,10]" type="flex" justify="center"> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <a-row> | |||||
| <a-row :gutter="20"> | |||||
| <a-col span="4"> | <a-col span="4"> | ||||
| <a-anchor :get-container="getContainer" :target-offset="50" :items="menu_list" | <a-anchor :get-container="getContainer" :target-offset="50" :items="menu_list" | ||||
| @click="anchorClick"></a-anchor> | @click="anchorClick"></a-anchor> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="20"> | <a-col span="20"> | ||||
| <div style="width: 100%;background-color: #fff;padding: 10px;"> | |||||
| <div style="width: 100%;background-color: #fff;padding: 0 20px;border-radius: 8px;"> | |||||
| <div ref="abc" class="abc" style="height: calc(100vh - 100px);overflow: auto;"> | <div ref="abc" class="abc" style="height: calc(100vh - 100px);overflow: auto;"> | ||||
| <a-space direction="vertical" justify="space-between" :size="36"> | |||||
| <a-space direction="vertical" justify="space-between" :size="36" | |||||
| style="width: 100% !important;"> | |||||
| <div id="basic"> | <div id="basic"> | ||||
| <a-card title="基本资料"> | |||||
| <template #extra> | |||||
| <a-button | |||||
| @click="edit('basic')">{{editObj.basic ? '正在编辑': '编辑'}}</a-button> | |||||
| </template> | |||||
| <company-basic :form_state="editObj.basic" | |||||
| @quitEdit="quitEdit"></company-basic> | |||||
| </a-card> | |||||
| <a-typography style="margin-top: 20px;"> | |||||
| <a-flex align="center" justify="space-between"> | |||||
| <a-typography-title :level="4"> | |||||
| <div class="text-decoration"> | |||||
| <div class="text-content">基本资料</div> | |||||
| </div> | |||||
| </a-typography-title> | |||||
| <FormOutlined @click="edit('basic')" v-if="editObj.basic" | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| <PlusCircleOutlined @click="edit('basic')" v-else | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <company-basic :form_state="editObj.basic" | |||||
| @quitEdit="quitEdit"></company-basic> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </div> | </div> | ||||
| <div id="department"> | <div id="department"> | ||||
| <a-card title="企业部门"> | |||||
| <template #extra> | |||||
| <a-button | |||||
| @click="edit('department')">{{editObj.department ? '正在编辑': '添加'}}</a-button> | |||||
| </template> | |||||
| <company-department :form_state="editObj.department" | |||||
| @quitEdit="quitEdit" @editEdit="edit('department')"></company-department> | |||||
| </a-card> | |||||
| <a-typography style="margin-top: 20px;"> | |||||
| <a-flex align="center" justify="space-between"> | |||||
| <a-typography-title :level="4"> | |||||
| <div class="text-decoration"> | |||||
| <div class="text-content">企业部门</div> | |||||
| </div> | |||||
| </a-typography-title> | |||||
| <FormOutlined @click="edit('department')" v-if="editObj.department" | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| <PlusCircleOutlined @click="edit('department')" v-else | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <company-department :form_state="editObj.department" | |||||
| @quitEdit="quitEdit" | |||||
| @editEdit="edit('department')"></company-department> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </div> | </div> | ||||
| <div id="licence"> | <div id="licence"> | ||||
| <a-card title="营业执照"> | |||||
| <template #extra> | |||||
| <a-button | |||||
| @click="edit('licence')">{{editObj.licence ? '正在编辑': '编辑'}}</a-button> | |||||
| </template> | |||||
| <company-licence :form_state="editObj.licence" | |||||
| @quitEdit="quitEdit"></company-licence> | |||||
| </a-card> | |||||
| <a-typography style="margin-top: 20px;"> | |||||
| <a-flex align="center" justify="space-between"> | |||||
| <a-typography-title :level="4"> | |||||
| <div class="text-decoration"> | |||||
| <div class="text-content">营业执照</div> | |||||
| </div> | |||||
| </a-typography-title> | |||||
| <FormOutlined @click="edit('licence')" v-if="editObj.licence" | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| <PlusCircleOutlined @click="edit('licence')" v-else | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <company-licence :form_state="editObj.licence" | |||||
| @quitEdit="quitEdit"></company-licence> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </div> | </div> | ||||
| <div id="image"> | <div id="image"> | ||||
| <a-card title="企业相册"> | |||||
| <template #extra> | |||||
| <a-button | |||||
| @click="edit('image')">{{editObj.image ? '正在编辑': '编辑'}}</a-button> | |||||
| </template> | |||||
| <company-image :form_state="editObj.image" | |||||
| @quitEdit="quitEdit"></company-image> | |||||
| </a-card> | |||||
| <a-typography style="margin-top: 20px;"> | |||||
| <a-flex align="center" justify="space-between"> | |||||
| <a-typography-title :level="4"> | |||||
| <div class="text-decoration"> | |||||
| <div class="text-content">企业相册</div> | |||||
| </div> | |||||
| </a-typography-title> | |||||
| <FormOutlined @click="edit('image')" v-if="editObj.image" | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| <PlusCircleOutlined @click="edit('image')" v-else | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <company-image :form_state="editObj.image" | |||||
| @quitEdit="quitEdit"></company-image> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </div> | </div> | ||||
| </a-space> | </a-space> | ||||
| </div> | </div> | ||||
| import CompanyDepartment from '@/components/company/information/department/index.vue' | import CompanyDepartment from '@/components/company/information/department/index.vue' | ||||
| import CompanyLicence from '@/components/company/information/licence/index.vue' | import CompanyLicence from '@/components/company/information/licence/index.vue' | ||||
| import CompanyImage from '@/components/company/information/image/index.vue' | import CompanyImage from '@/components/company/information/image/index.vue' | ||||
| import { FormOutlined, PlusCircleOutlined } from '@ant-design/icons-vue'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | import { useCommon } from '@/hooks/useCommon'; | ||||
| let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | ||||
| let menu_list = ref([ | let menu_list = ref([ | ||||
| } | } | ||||
| </script> | </script> | ||||
| <style> | |||||
| </style> | |||||
| <style scoped> | |||||
| :deep(.ant-anchor) { | |||||
| background-color: #ffffff !important; | |||||
| border-radius: 8px !important; | |||||
| padding-inline-start: 2px; | |||||
| } | |||||
| :deep(.ant-anchor::before) { | |||||
| border-inline-start: 0 !important; | |||||
| } | |||||
| :deep(.ant-anchor-ink) { | |||||
| background-color: #ffffff !important; | |||||
| } | |||||
| :deep(.ant-anchor-link) { | |||||
| padding: 10px !important; | |||||
| } | |||||
| :deep(.ant-anchor-link-title-active) { | |||||
| font-weight: bold !important; | |||||
| color: #4FBE70 !important; | |||||
| } | |||||
| .text-decoration { | |||||
| position: relative; | |||||
| display: inline-block; | |||||
| overflow: visible; | |||||
| } | |||||
| .text-decoration::before { | |||||
| content: ''; | |||||
| width: 6px; | |||||
| height: 22px; | |||||
| background-color: #4FBE70; | |||||
| position: absolute; | |||||
| top: 4px | |||||
| } | |||||
| .text-content { | |||||
| position: relative; | |||||
| margin-left: 20px; | |||||
| } | |||||
| </style> |
| <a-list> | <a-list> | ||||
| <a-list-item> | <a-list-item> | ||||
| <template #actions> | <template #actions> | ||||
| <a-button> | |||||
| <StarOutlined /> | |||||
| 收藏 | |||||
| <a-button @click="putInTatent(item.customer_id)"> | |||||
| 放入人才库 | |||||
| </a-button> | </a-button> | ||||
| <a-button> | |||||
| <a-button @click="interview(item)" > | |||||
| 邀请面试 | 邀请面试 | ||||
| </a-button> | </a-button> | ||||
| </template> | </template> | ||||
| <a-list-item-meta> | <a-list-item-meta> | ||||
| <template #title> | <template #title> | ||||
| {{item.seekername}} | |||||
| <a-button type="link" @click="detail(item)">{{item.seekername}}</a-button> | |||||
| </template> | </template> | ||||
| <template #description> | <template #description> | ||||
| <div> | <div> | ||||
| <template #avatar> | <template #avatar> | ||||
| <image-container | <image-container | ||||
| :imgObj="{src: '/images/onlylogo.jpg',width: '48px',height:'48px'}"></image-container> | :imgObj="{src: '/images/onlylogo.jpg',width: '48px',height:'48px'}"></image-container> | ||||
| </template> | </template> | ||||
| </a-list-item-meta> | </a-list-item-meta> | ||||
| </a-list-item> | </a-list-item> | ||||
| </a-list> | </a-list> | ||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="24"> | |||||
| <a-col span="24" v-if="jobList.length > 0"> | |||||
| <a-flex justify="center"> | <a-flex justify="center"> | ||||
| <a-button size="large" class="main-color" @click="more">查看更多</a-button> | |||||
| <a-button size="large" class="main-color" @click="more">查看更多</a-button> | |||||
| </a-flex> | </a-flex> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </div> | </div> | ||||
| <a-modal v-model:open="openInterview" centered title="面试邀请" @ok="interviewOk"> | |||||
| <a-space direction="vertical" style="width: 100%;"> | |||||
| <a-select v-model:value="position_name" @change="positionChange" | |||||
| placeholder="请进行搜索选择职位" show-search :filter-option="false" label-in-value | |||||
| @search="positionSearch" size="large" style="width: 100%;"> | |||||
| <a-select-option v-for="item in position_list" :key="item.id" :value="item.id" | |||||
| :label="item.name" label-in-value>{{item.name}}</a-select-option> | |||||
| </a-select> | |||||
| <a-date-picker v-model:value="time" @Change="timeChange" show-time style="width: 100%;" placeholder="请选择面试日期" | |||||
| size="large" :disabled-date="disabledDate" /> | |||||
| </a-space> | |||||
| </a-modal> | |||||
| <resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail> | |||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, computed, onMounted } from 'vue'; | |||||
| import { ref, onMounted, computed, defineEmits, createVNode } from 'vue'; | |||||
| import JobTalents from '@/components/job/talents/index.vue' | import JobTalents from '@/components/job/talents/index.vue' | ||||
| import { PostCompanyProfile, GetCompanyRecommentResume } from '@/apis/models'; | |||||
| import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue' | |||||
| import { PostCompanyProfile, GetCompanyRecommentResume, PostCompanyTalentPoolAdd, PostCompanyResumeInterviewAdd ,PostCompanyJobList} from '@/apis/models'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | |||||
| let { commomParams, ExclamationCircleOutlined, Modal, dayjs, disabledDate, showOtherModal1 } = useCommon(); | |||||
| const dayjsRef = ref(dayjs); | |||||
| let jobList = ref<Object[]>([]) | let jobList = ref<Object[]>([]) | ||||
| let basic = ref<Object>({}) | let basic = ref<Object>({}) | ||||
| let page = ref<Number>(1) | let page = ref<Number>(1) | ||||
| const onLoadMore = () => { | const onLoadMore = () => { | ||||
| page.value = page.value + 1; | page.value = page.value + 1; | ||||
| getData(); | getData(); | ||||
| } | } | ||||
| const getData = () => { | const getData = () => { | ||||
| GetCompanyRecommentResume({page: page.value, pagesize: 10}).then(res => { | |||||
| jobList.value = res.data.list ? jobList.value.concat(res.data.list) : jobList.value.concat([]) | |||||
| GetCompanyRecommentResume({ page: page.value, pagesize: 10 }).then(res => { | |||||
| jobList.value = res.data.list ? jobList.value.concat(res.data.list) : jobList.value.concat([]) | |||||
| }) | }) | ||||
| } | } | ||||
| // 邀请面试 | |||||
| let openInterview = ref<Boolean>(false); | |||||
| let form = { | |||||
| job_id: '', | |||||
| customer_id: '', | |||||
| interview_date_time: '' | |||||
| } | |||||
| const interview = (record : Object) => { | |||||
| positionSearch('') | |||||
| console.log(record) | |||||
| openInterview.value = true | |||||
| form.job_id = ''; | |||||
| form.customer_id = record.customer_id; | |||||
| form.interview_date_time = '' | |||||
| time.value = ''; | |||||
| position_name.value = null; | |||||
| } | |||||
| // 选择职位 | |||||
| let position_list = ref<Object[]>([]) | |||||
| let position_name = ref<String>(null) | |||||
| const positionSearch = (val) => { | |||||
| PostCompanyJobList({ keyword: val }).then(res => { | |||||
| position_list.value = res.data.list; | |||||
| }) | |||||
| } | |||||
| const positionChange = (val : Object) => { | |||||
| debugger | |||||
| position_name.value = val.option.label; | |||||
| form.job_id = Number(val.key); | |||||
| } | |||||
| let time = ref<String>(''); | |||||
| const timeChange = (val) => { | |||||
| form.interview_date_time = dayjsRef.value(val).format('YYYY-MM-DD HH:mm:ss'); | |||||
| } | |||||
| const interviewOk = () => { | |||||
| console.log(form) | |||||
| if (!form.interview_date_time) { | |||||
| warnToast('请选择面试时间') | |||||
| return; | |||||
| } else { | |||||
| PostCompanyResumeInterviewAdd(form).then(res => { | |||||
| successToast('已发送邀请') | |||||
| openInterview.value = false | |||||
| getData(); | |||||
| }) | |||||
| } | |||||
| } | |||||
| let detail_record = ref<Object>(null) | |||||
| const detail = (record) => { | |||||
| detail_record.value = record; | |||||
| showOtherModal1() | |||||
| } | |||||
| // 放入人才库 | |||||
| const putInTatent = (id) => { | |||||
| Modal.confirm({ | |||||
| title: `是否要放入人才库`, | |||||
| centered: true, | |||||
| icon: createVNode(ExclamationCircleOutlined), | |||||
| onOk() { | |||||
| PostCompanyTalentPoolAdd({ customer_id: id }).then(res => { | |||||
| successToast('已放入人才库') | |||||
| getData(); | |||||
| }) | |||||
| }, | |||||
| onCancel() { | |||||
| }, | |||||
| }); | |||||
| } | |||||
| onMounted(() => { | onMounted(() => { | ||||
| PostCompanyProfile().then(res => { | PostCompanyProfile().then(res => { | ||||
| basic.value = res.data | basic.value = res.data | ||||
| }) | }) | ||||
| getData(); | getData(); | ||||
| }) | }) | ||||
| </script> | </script> | ||||
| <div class="content-padding-inline" style="margin: 30px 0;"> | <div class="content-padding-inline" style="margin: 30px 0;"> | ||||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | <a-row :gutter="[10,10]" type="flex" justify="center"> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <a-row> | |||||
| <a-row :gutter="20"> | |||||
| <a-col span="4"> | <a-col span="4"> | ||||
| <common-left-sider :menu_list="menu_list" :selected_key="selectedKeys" | <common-left-sider :menu_list="menu_list" :selected_key="selectedKeys" | ||||
| @changeKey="changeKey"></common-left-sider> | @changeKey="changeKey"></common-left-sider> |
| <div class="content-padding-inline" style="margin: 30px 0;"> | <div class="content-padding-inline" style="margin: 30px 0;"> | ||||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | <a-row :gutter="[10,10]" type="flex" justify="center"> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <a-row> | |||||
| <a-row :gutter="20"> | |||||
| <a-col span="4"> | <a-col span="4"> | ||||
| <common-left-sider :menu_list="menu_list" :selected_key="[1]" | <common-left-sider :menu_list="menu_list" :selected_key="[1]" | ||||
| @changeKey="changeKey"></common-left-sider> | @changeKey="changeKey"></common-left-sider> |
| <div class="content-padding-inline" style="margin:30px 0;"> | <div class="content-padding-inline" style="margin:30px 0;"> | ||||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | <a-row :gutter="[10,10]" type="flex" justify="center"> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <a-row> | |||||
| <a-row :gutter="20"> | |||||
| <a-col span="4"> | <a-col span="4"> | ||||
| <common-left-sider :menu_list="menu_list" :selected_key="[1]" | <common-left-sider :menu_list="menu_list" :selected_key="[1]" | ||||
| @changeKey="changeKey"></common-left-sider> | @changeKey="changeKey"></common-left-sider> |
| <div class="content-padding-inline" style="margin: 30px 0;"> | <div class="content-padding-inline" style="margin: 30px 0;"> | ||||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | <a-row :gutter="[10,10]" type="flex" justify="center"> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <a-row> | |||||
| <a-row :gutter="20"> | |||||
| <a-col span="4"> | <a-col span="4"> | ||||
| <common-left-sider :menu_list="menu_list" :selected_key="[2]" | |||||
| <common-left-sider :menu_list="menu_list" :selected_key="selectedKey" | |||||
| @changeKey="changeKey"></common-left-sider> | @changeKey="changeKey"></common-left-sider> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="20"> | <a-col span="20"> | ||||
| <resume-result v-if="activeKey == 1" :search="searchParams"></resume-result> | <resume-result v-if="activeKey == 1" :search="searchParams"></resume-result> | ||||
| </a-tab-pane> | </a-tab-pane> | ||||
| <a-tab-pane :key="2" tab="最新简历" force-render> | <a-tab-pane :key="2" tab="最新简历" force-render> | ||||
| <resume-result :search="searchParams"></resume-result> | |||||
| <resume-result v-if="activeKey == 2" :search="searchParams"></resume-result> | |||||
| </a-tab-pane> | </a-tab-pane> | ||||
| <a-tab-pane :key="3" tab="应届毕业生"> | |||||
| <!-- <a-tab-pane :key="3" tab="应届毕业生"> | |||||
| <resume-result v-if="activeKey == 3" :search="searchParams"></resume-result> | <resume-result v-if="activeKey == 3" :search="searchParams"></resume-result> | ||||
| </a-tab-pane> | |||||
| </a-tab-pane> --> | |||||
| </a-tabs> | </a-tabs> | ||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| let curKey = ref<Number>(2) | let curKey = ref<Number>(2) | ||||
| let activeKey = ref<Number>(1); | let activeKey = ref<Number>(1); | ||||
| let searchParams = ref<any>(null) | let searchParams = ref<any>(null) | ||||
| let selectedKey = ref<Number[]>([2]); | |||||
| const changeKey = (data) => { | const changeKey = (data) => { | ||||
| curKey.value = data.key; | curKey.value = data.key; | ||||
| } | } | ||||
| const searchData = (data) => { | const searchData = (data) => { | ||||
| selectedKey.value = [2] | |||||
| curKey.value = 2; | |||||
| searchParams.value = data; | searchParams.value = data; | ||||
| if(activeKey.value == 2) { | if(activeKey.value == 2) { | ||||
| searchParams.value.sortby = 'desc' | searchParams.value.sortby = 'desc' | ||||
| } | } | ||||
| curKey.value = 2 | |||||
| } | } | ||||
| </script> | </script> | ||||
| <template> | <template> | ||||
| <a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist."> | |||||
| <template #extra> | |||||
| <router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link> | |||||
| </template> | |||||
| </a-result> | |||||
| </template> | </template> | ||||
| <script> | <script> |
| <template> | <template> | ||||
| <a-row> | |||||
| <a-row :gutter="20"> | |||||
| <a-col span="4"> | <a-col span="4"> | ||||
| <common-left-sider :menu_list="menu_list" :selected_key="[1]" | <common-left-sider :menu_list="menu_list" :selected_key="[1]" | ||||
| @changeKey="changeKey"></common-left-sider> | @changeKey="changeKey"></common-left-sider> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="16"> | |||||
| <div style="width: 100%;background-color: #fff;height: calc(100vh - 100px);padding: 10px;"> | |||||
| <a-col span="20"> | |||||
| <div style="width: 100%;background-color: #fff;height: calc(100vh - 100px);overflow: auto; padding: 10px;border-radius: 8px;"> | |||||
| <meet-booking v-if="curKey == 1"></meet-booking> | <meet-booking v-if="curKey == 1"></meet-booking> | ||||
| <meet-method v-if="curKey == 2"></meet-method> | <meet-method v-if="curKey == 2"></meet-method> | ||||
| <meet-guide v-if="curKey == 3"></meet-guide> | <meet-guide v-if="curKey == 3"></meet-guide> | ||||
| <meet-line v-if="curKey == 4"></meet-line> | |||||
| <meet-green v-if="curKey == 5"></meet-green> | |||||
| <meet-contact v-if="curKey == 6"></meet-contact> | |||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="4"> | |||||
| <!-- <a-col span="4"> | |||||
| <a-list size="small" bordered :data-source="data" style="height: 294px"> | <a-list size="small" bordered :data-source="data" style="height: 294px"> | ||||
| <template #renderItem="{ item }"> | <template #renderItem="{ item }"> | ||||
| <a-list-item>{{ item }}</a-list-item> | <a-list-item>{{ item }}</a-list-item> | ||||
| <div>Header</div> | <div>Header</div> | ||||
| </template> | </template> | ||||
| </a-list> | </a-list> | ||||
| </a-col> | |||||
| </a-col> --> | |||||
| </a-row> | </a-row> | ||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import MeetBooking from '@/components/job/meet/booking/index.vue' | import MeetBooking from '@/components/job/meet/booking/index.vue' | ||||
| import MeetMethod from '@/components/job/meet/method/index.vue' | import MeetMethod from '@/components/job/meet/method/index.vue' | ||||
| import MeetGuide from '@/components/job/meet/guide/index.vue' | import MeetGuide from '@/components/job/meet/guide/index.vue' | ||||
| import MeetLine from '@/components/job/meet/line/index.vue' | |||||
| import MeetGreen from '@/components/job/meet/green/index.vue' | |||||
| import MeetContact from '@/components/job/meet/contact/index.vue' | |||||
| let companyList = ref<object[]>([{}, {}, {}, {}, {}, {}]) | let companyList = ref<object[]>([{}, {}, {}, {}, {}, {}]) | ||||
| let menu_list = ref([{ title: '招聘会预定', key: 1 },{ title: '企业参会方式', key: 2},{ title: '求职者参会指南', key: 3},{ title: '乘车路线', key: 4},{ title: '绿色通道', key: 5},{ title: '联系方式', key: 6}]) | let menu_list = ref([{ title: '招聘会预定', key: 1 },{ title: '企业参会方式', key: 2},{ title: '求职者参会指南', key: 3},{ title: '乘车路线', key: 4},{ title: '绿色通道', key: 5},{ title: '联系方式', key: 6}]) | ||||
| let curKey = ref<Number>(1) | let curKey = ref<Number>(1) |
| <div class="content-padding-inline" style="margin: 30px 0;"> | <div class="content-padding-inline" style="margin: 30px 0;"> | ||||
| <a-row :gutter="[20,20]" type="flex" justify="center"> | <a-row :gutter="[20,20]" type="flex" justify="center"> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <div style="width: 100%; background-color: #fff;"> | |||||
| <div style="width: 100%; background-color: #fff;border-radius: 8px;"> | |||||
| <a-list item-layout="vertical"> | <a-list item-layout="vertical"> | ||||
| <a-list-item> | <a-list-item> | ||||
| <a-list-item-meta> | <a-list-item-meta> | ||||
| </a-button> | </a-button> | ||||
| </template> | </template> | ||||
| <template #description> | <template #description> | ||||
| 会员编号:{{basic.id}} | |||||
| <div> | |||||
| 会员编号:{{basic.id}} | |||||
| </div> | |||||
| <div> | |||||
| 关注公众号:{{basic.id}} | |||||
| </div> | |||||
| </template> | </template> | ||||
| <template #avatar> | <template #avatar> | ||||
| <a-avatar :src="'https://rcsc-test.jcjob.cn/img'+basic.photo" :size="96" /> | <a-avatar :src="'https://rcsc-test.jcjob.cn/img'+basic.photo" :size="96" /> | ||||
| <a-descriptions :column="3"> | <a-descriptions :column="3"> | ||||
| <a-descriptions-item | <a-descriptions-item | ||||
| label="登录账号">{{basic.mobile ? basic.mobile : '未知'}}</a-descriptions-item> | label="登录账号">{{basic.mobile ? basic.mobile : '未知'}}</a-descriptions-item> | ||||
| <a-descriptions-item><a-button type="link" class="main-color"> | |||||
| <a-descriptions-item><a-button @click="detail(basic)" type="link" class="main-color"> | |||||
| <FileSearchOutlined style="color: #4FBE70" />预览简历 | <FileSearchOutlined style="color: #4FBE70" />预览简历 | ||||
| </a-button></a-descriptions-item> | </a-button></a-descriptions-item> | ||||
| <a-descriptions-item label="简历是否可见"> | <a-descriptions-item label="简历是否可见"> | ||||
| <a-switch></a-switch> | |||||
| <a-switch @change="changeResumeState" v-model:checked="createForm.hide_resume" :checkedValue="1" :unCheckedValue="2" checked-children="开" un-checked-children="关"></a-switch> | |||||
| </a-descriptions-item> | </a-descriptions-item> | ||||
| <a-descriptions-item label="QQ"> | <a-descriptions-item label="QQ"> | ||||
| {{basic.qq ? basic.qq : '未填写'}} | {{basic.qq ? basic.qq : '未填写'}} | ||||
| </a-button> | </a-button> | ||||
| </a-descriptions-item> | </a-descriptions-item> | ||||
| <a-descriptions-item label="简历是否在家政可见"> | <a-descriptions-item label="简历是否在家政可见"> | ||||
| <a-switch></a-switch> | |||||
| <a-switch @change="changeResumeState" v-model:checked="createForm.house_keeping_status" :checkedValue="1" :unCheckedValue="2" checked-children="开" un-checked-children="关"></a-switch> | |||||
| </a-descriptions-item> | </a-descriptions-item> | ||||
| <a-descriptions-item label="电子邮箱"> | <a-descriptions-item label="电子邮箱"> | ||||
| {{basic.email ? basic.email : '未填写'}} | {{basic.email ? basic.email : '未填写'}} | ||||
| {{seeLength}}次 | {{seeLength}}次 | ||||
| </a-descriptions-item> | </a-descriptions-item> | ||||
| <a-descriptions-item label="是否接收面试邀请通知"> | <a-descriptions-item label="是否接收面试邀请通知"> | ||||
| <a-switch></a-switch> | |||||
| <a-switch @change="changeResumeState" v-model:checked="createForm.remind_interview" :checkedValue="1" :unCheckedValue="2" checked-children="开" un-checked-children="关"></a-switch> | |||||
| </a-descriptions-item> | </a-descriptions-item> | ||||
| </a-descriptions> | </a-descriptions> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <a-tabs v-model:activeKey="activeKey" @change="activeKeyChange"> | |||||
| <a-tabs v-model:activeKey="activeKey" @change="activeKeyChange" type="card"> | |||||
| <a-tab-pane :key="1" tab="面试记录"> | <a-tab-pane :key="1" tab="面试记录"> | ||||
| <invite-interview v-if="activeKey == 1"></invite-interview> | <invite-interview v-if="activeKey == 1"></invite-interview> | ||||
| </a-tab-pane> | </a-tab-pane> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </div> | </div> | ||||
| <resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail> | |||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import InviteApply from '@/components/jobseeker/invite/apply/index.vue' | import InviteApply from '@/components/jobseeker/invite/apply/index.vue' | ||||
| import InviteSeeme from '@/components/jobseeker/invite/seeme/index.vue' | import InviteSeeme from '@/components/jobseeker/invite/seeme/index.vue' | ||||
| import InviteCollect from '@/components/jobseeker/invite/collect/index.vue' | import InviteCollect from '@/components/jobseeker/invite/collect/index.vue' | ||||
| import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue' | |||||
| import { GetJobseekerDetail, GetCompanyRecommentResume, GetViewHistoryList, GetPersonInterviewList, PostJobapplicantUpdate } from '@/apis/models'; | import { GetJobseekerDetail, GetCompanyRecommentResume, GetViewHistoryList, GetPersonInterviewList, PostJobapplicantUpdate } from '@/apis/models'; | ||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | import { warnToast, successToast } from '@/utils/toastHelper'; | ||||
| import { EditOutlined, FileSearchOutlined, RedoOutlined } from '@ant-design/icons-vue'; | import { EditOutlined, FileSearchOutlined, RedoOutlined } from '@ant-design/icons-vue'; | ||||
| import { useCommon } from '@/hooks/useCommon'; | import { useCommon } from '@/hooks/useCommon'; | ||||
| let { commomParams, ExclamationCircleOutlined, Modal, onMenu } = useCommon(); | |||||
| let { commomParams, ExclamationCircleOutlined, Modal, onMenu,showOtherModal1 } = useCommon(); | |||||
| let jobList = ref<Object[]>([]) | let jobList = ref<Object[]>([]) | ||||
| let basic = ref<Object>({}) | let basic = ref<Object>({}) | ||||
| let seeLength = ref<Number>(0) | let seeLength = ref<Number>(0) | ||||
| let refreshing = ref<Boolean>(false) | let refreshing = ref<Boolean>(false) | ||||
| let createForm = ref<Object>({ | let createForm = ref<Object>({ | ||||
| hide_resume: 0, | |||||
| house_keeping_status: 0, | |||||
| hide_resume: 1, | |||||
| house_keeping_status: 2, | |||||
| remind_interview: 2 | remind_interview: 2 | ||||
| }) | }) | ||||
| refreshing.value = false | refreshing.value = false | ||||
| } | } | ||||
| onMounted(() => { | |||||
| GetJobseekerDetail({ customer_id: sessionStorage.getItem('id') }).then(res => { | |||||
| basic.value = res.data | |||||
| }) | |||||
| GetViewHistoryList().then(res => { | |||||
| seeLength.value = res.data.viewhistorys ? res.data.viewhistorys.length : 0 | |||||
| }) | |||||
| GetPersonInterviewList({ status: 0 }).then(res => { | |||||
| if (res.data.list.length > 0) { | |||||
| const changeResumeState = (val) => { | |||||
| createForm.value.id = basic.value.id, | |||||
| PostJobapplicantUpdate(createForm.value) | |||||
| } | |||||
| let detail_record = ref<Object>(null) | |||||
| const detail = (record) => { | |||||
| detail_record.value = record; | |||||
| showOtherModal1() | |||||
| } | |||||
| onMounted(async () => { | |||||
| let res = await GetJobseekerDetail({ customer_id: sessionStorage.getItem('id') }) | |||||
| basic.value = res.data; | |||||
| createForm.value.hide_resume = res.data.hide_resume; | |||||
| createForm.value.house_keeping_status = res.data.house_keeping_status; | |||||
| createForm.value.remind_interview = res.data.remind_interview; | |||||
| if(createForm.value.remind_interview == 1) { | |||||
| let res1 =await GetPersonInterviewList({ status: 0 }) | |||||
| if (res1.data.list.length > 0) { | |||||
| Modal.confirm({ | Modal.confirm({ | ||||
| title: `您有${res.data.list.length}条待查看面试邀请`, | |||||
| title: `您有${res1.data.list.length}条待查看面试邀请`, | |||||
| centered: true, | centered: true, | ||||
| icon: createVNode(ExclamationCircleOutlined), | icon: createVNode(ExclamationCircleOutlined), | ||||
| okText: '前往查看', | okText: '前往查看', | ||||
| cancelText: '关闭', | cancelText: '关闭', | ||||
| onOk() { | onOk() { | ||||
| }, | }, | ||||
| onCancel() { | onCancel() { | ||||
| }, | }, | ||||
| }); | }); | ||||
| } | } | ||||
| }) | |||||
| } | |||||
| let res2 = GetViewHistoryList() | |||||
| seeLength.value = res2.data.viewhistorys ? res2.data.viewhistorys.length : 0 | |||||
| }) | }) | ||||
| </script> | </script> | ||||
| <template> | <template> | ||||
| <div class="content-padding-inline" style="margin: 30px 0;"> | |||||
| <a-row :gutter="[20,20]" type="flex" justify="center"> | |||||
| <a-col span="18"> | |||||
| <a-row :gutter="[10,20]"> | |||||
| <a-col span="8" v-for="(item, index) in jobList"> | |||||
| <a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;"> | |||||
| <a-space direction="vertical" :size="10"> | |||||
| <a-flex justify="space-between" style="width: 100%;"> | |||||
| <div style="font-size: 18px; font-weight: 600;">{{item.name}}</div> | |||||
| <div style="font-size: 18px;color: #4FBE70;">{{item.pay_range_text}}</div> | |||||
| </a-flex> | |||||
| <a-flex style="width: 100%;"> | |||||
| <a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.certification_text ? item.certification_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.school_degree_text ? item.school_degree_text : '不限'}}</a-tag> | |||||
| <a-tag>{{item.profelevel_text ? item.profelevel_text : '不限'}}</a-tag> | |||||
| </a-flex> | |||||
| </a-space> | |||||
| <a-divider /> | |||||
| <a-space direction="vertical"> | |||||
| <a-flex justify="space-between" style="width: 100%;"> | |||||
| <div>{{item.full_name}}</div> | |||||
| <a-button type="primary" size="small" | |||||
| @click="toDetail(item.id, item.company_id)">查看详情</a-button> | |||||
| </a-flex> | |||||
| <a-flex style="width: 100%;color: #bebebe;"> | |||||
| {{item.locations ? item.locations[0].name : '未知地址'}} | |||||
| </a-flex> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-flex justify="center"> | |||||
| <a-space> | |||||
| <a-pagination hideOnSinglePage :total="commomParams.page.total" @change="getPage" /> | |||||
| </a-space> | |||||
| </a-flex> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </div> | |||||
| <!-- 企业显示 --> | |||||
| <!-- <a-tabs v-model:activeKey="activeKey"> | |||||
| <a-tab-pane key="1" tab="推荐人才"> | |||||
| <a-row :gutter="[10,10]"> | |||||
| <a-col span="12" v-for="(item, index) in companyList"> | |||||
| <job-talents></job-talents> | |||||
| </a-col> | |||||
| </a-row> | |||||
| <div style="display: flex;align-items: center;justify-content: center;padding: 30px;font-size: 24px;">查看更多 | |||||
| </div> | |||||
| <a-row :gutter="[10,10]"> | |||||
| <a-col span="24" v-for="(item, index) in companyList"> | |||||
| <job-talents></job-talents> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-pagination v-model:current="current" :total="500" style="text-align: center;" /> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-tab-pane> | |||||
| <a-tab-pane key="2" tab="最新简历" force-render>Content of Tab Pane 2</a-tab-pane> | |||||
| <a-tab-pane key="3" tab="应届毕业生">Content of Tab Pane 3</a-tab-pane> | |||||
| </a-tabs> --> | |||||
| </template> | </template> | ||||
| <script> | |||||
| <script setup lang="ts"> | |||||
| import { ref, computed, onMounted, defineEmits } from 'vue'; | |||||
| import { GetJobseekerReommendJob } from '@/apis/models'; | |||||
| import { router } from '@/router'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | |||||
| let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||||
| const emit = defineEmits(); | |||||
| let loading = ref<Boolean>(true); | |||||
| let jobList = ref([]); | |||||
| let total = ref<Number>(0) | |||||
| const getPage = (page, pageSize) => { | |||||
| commomParams.value.search.page = page; | |||||
| commomParams.value.search.pagesize = pageSize; | |||||
| getData(); | |||||
| } | |||||
| const getData = async () => { | |||||
| try { | |||||
| loading.value = true; | |||||
| let res = await GetJobseekerReommendJob(commomParams.value.search); | |||||
| loading.value = false; | |||||
| jobList.value = res.data.jobs; | |||||
| commomParams.value.page = { | |||||
| current: commomParams.value.search.page, | |||||
| pageSize: commomParams.value.search.pagesize, | |||||
| total: res.data.total, | |||||
| pageSizeOptions: ['10', '20', '30', '40'], | |||||
| hideOnSinglePage: false, | |||||
| showSizeChanger: true | |||||
| }; | |||||
| } catch { | |||||
| loading.value = false; | |||||
| } | |||||
| } | |||||
| const toDetail = (job_id : Number, company_id : Number) => { | |||||
| sessionStorage.setItem('job_id', job_id) | |||||
| sessionStorage.setItem('tab_key', 2) | |||||
| sessionStorage.setItem('pubilc_id', company_id) | |||||
| sessionStorage.setItem('mode', 'detail') | |||||
| store.commit('getPageType', { | |||||
| pageType: '' | |||||
| }) | |||||
| store.commit('setShowLoginBox', { | |||||
| showLoginBox: false | |||||
| }) | |||||
| sessionStorage.setItem('pageType', '') | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push({ | |||||
| path: '/personal' | |||||
| }) | |||||
| } | |||||
| onMounted(() => { | |||||
| getData(); | |||||
| }) | |||||
| </script> | </script> | ||||
| <style> | |||||
| <style lang="less" scoped> | |||||
| .job-box { | |||||
| display: flex; | |||||
| flex-direction: column; | |||||
| justify-content: space-around; | |||||
| // align-items: center; | |||||
| width: 100%; | |||||
| .job-title { | |||||
| padding: 20px; | |||||
| background-color: #ffffff; | |||||
| .aaaa { | |||||
| display: flex; | |||||
| justify-content: space-between; | |||||
| } | |||||
| } | |||||
| .job-company { | |||||
| padding: 20px; | |||||
| background-color: #cccccc; | |||||
| .aaaa { | |||||
| display: flex; | |||||
| justify-content: space-between; | |||||
| } | |||||
| } | |||||
| } | |||||
| .mt10 { | |||||
| margin-bottom: 10px; | |||||
| } | |||||
| </style> | </style> |
| <div class="content-padding-inline" style="margin: 30px 0;"> | <div class="content-padding-inline" style="margin: 30px 0;"> | ||||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | <a-row :gutter="[10,10]" type="flex" justify="center"> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <a-row> | |||||
| <a-row :gutter="20"> | |||||
| <a-col span="4"> | <a-col span="4"> | ||||
| <a-anchor :get-container="getContainer" :target-offset="50" :items="menu_list" | <a-anchor :get-container="getContainer" :target-offset="50" :items="menu_list" | ||||
| @click="anchorClick"></a-anchor> | @click="anchorClick"></a-anchor> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="20"> | <a-col span="20"> | ||||
| <div style="width: 100%;background-color: #fff;padding: 10px;"> | |||||
| <div style="width: 100%;background-color: #fff;padding: 0 20px;border-radius: 8px;"> | |||||
| <div ref="abc" class="abc" style="height: calc(100vh - 100px);overflow: auto;"> | <div ref="abc" class="abc" style="height: calc(100vh - 100px);overflow: auto;"> | ||||
| <a-space direction="vertical" justify="space-between" :size="36" style="width: 100% !important;"> | |||||
| <a-space direction="vertical" justify="space-between" :size="36" | |||||
| style="width: 100% !important;"> | |||||
| <div id="basic"> | <div id="basic"> | ||||
| <a-card title="基本资料"> | |||||
| <template #extra> | |||||
| <a-button | |||||
| @click="edit('basic')">{{editObj.basic ? '正在编辑': '编辑'}}</a-button> | |||||
| </template> | |||||
| <resume-basic :form_state="editObj.basic" | |||||
| @quitEdit="quitEdit"></resume-basic> | |||||
| </a-card> | |||||
| <a-typography style="margin-top: 20px;"> | |||||
| <a-flex align="center"> | |||||
| <a-typography-title :level="4"> | |||||
| <div class="text-decoration"> | |||||
| <div class="text-content">基本资料</div> | |||||
| </div> | |||||
| </a-typography-title> | |||||
| <div @click="edit('basic')" style="padding: 0 20px;cursor: pointer;"> | |||||
| <FormOutlined style="color: #4FBE70;font-size: 24px;" /> | |||||
| <span v-if="editObj.basic" style="color: #bebebe;">正在编辑</span> | |||||
| <span v-else style="color: #bebebe;">编辑</span> | |||||
| </div> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <resume-basic :form_state="editObj.basic" | |||||
| @quitEdit="quitEdit"></resume-basic> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </div> | </div> | ||||
| <div id="contact"> | <div id="contact"> | ||||
| <a-card title="联系信息"> | |||||
| <template #extra> | |||||
| <a-button | |||||
| @click="edit('contact')">{{editObj.contact ? '正在编辑': '编辑'}}</a-button> | |||||
| </template> | |||||
| <resume-contact :form_state="editObj.contact" | |||||
| @quitEdit="quitEdit"></resume-contact> | |||||
| </a-card> | |||||
| <a-typography style="margin-top: 20px;"> | |||||
| <a-flex align="center" justify="space-between"> | |||||
| <a-typography-title :level="4"> | |||||
| <div class="text-decoration"> | |||||
| <div class="text-content">联系信息</div> | |||||
| </div></a-typography-title> | |||||
| <FormOutlined @click="edit('contact')" v-if="editObj.contact" | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| <PlusCircleOutlined @click="edit('contact')" v-else | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <resume-contact :form_state="editObj.contact" | |||||
| @quitEdit="quitEdit"></resume-contact> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </div> | </div> | ||||
| <div id="introduction"> | <div id="introduction"> | ||||
| <a-card title="个人简介"> | |||||
| <template #extra> | |||||
| <a-button | |||||
| @click="edit('introduction')">{{editObj.introduction ? '正在编辑': '编辑'}}</a-button> | |||||
| </template> | |||||
| <resume-introduction :form_state="editObj.introduction" | |||||
| @quitEdit="quitEdit"></resume-introduction> | |||||
| </a-card> | |||||
| <a-typography style="margin-top: 20px;"> | |||||
| <a-flex align="center" justify="space-between"> | |||||
| <a-typography-title :level="4"> | |||||
| <div class="text-decoration"> | |||||
| <div class="text-content">个人简介</div> | |||||
| </div></a-typography-title> | |||||
| <FormOutlined @click="edit('introduction')" v-if="editObj.introduction" | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| <PlusCircleOutlined @click="edit('introduction')" v-else | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <resume-introduction :form_state="editObj.introduction" | |||||
| @quitEdit="quitEdit"></resume-introduction> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </div> | </div> | ||||
| <div id="skill"> | <div id="skill"> | ||||
| <a-card title="专业技能掌握程度"> | |||||
| <template #extra> | |||||
| <a-button | |||||
| @click="edit('skill')">{{editObj.skill ? '正在编辑': '编辑'}}</a-button> | |||||
| </template> | |||||
| <resume-skill :form_state="editObj.skill" | |||||
| @quitEdit="quitEdit"></resume-skill> | |||||
| </a-card> | |||||
| <a-typography style="margin-top: 20px;"> | |||||
| <a-flex align="center" justify="space-between"> | |||||
| <a-typography-title :level="4"> | |||||
| <div class="text-decoration"> | |||||
| <div class="text-content">专业技能掌握程度</div> | |||||
| </div></a-typography-title> | |||||
| <FormOutlined @click="edit('skill')" v-if="editObj.skill" | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| <PlusCircleOutlined @click="edit('skill')" v-else | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <resume-skill :form_state="editObj.skill" | |||||
| @quitEdit="quitEdit"></resume-skill> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </div> | </div> | ||||
| <div id="train"> | <div id="train"> | ||||
| <a-card title="培训经历"> | |||||
| <template #extra> | |||||
| <a-button | |||||
| @click="edit('train')">{{editObj.train ? '正在编辑': '添加'}}</a-button> | |||||
| </template> | |||||
| <resume-train :form_state="editObj.train" @quitEdit="quitEdit" | |||||
| @editEdit="edit('train')"></resume-train> | |||||
| </a-card> | |||||
| <a-typography style="margin-top: 20px;"> | |||||
| <a-flex align="center" justify="space-between"> | |||||
| <a-typography-title :level="4"> | |||||
| <div class="text-decoration"> | |||||
| <div class="text-content">培训经历</div> | |||||
| </div></a-typography-title> | |||||
| <FormOutlined @click="edit('train')" v-if="editObj.train" | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| <PlusCircleOutlined @click="edit('train')" v-else | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <resume-train :form_state="editObj.train" @quitEdit="quitEdit" | |||||
| @editEdit="edit('train')"></resume-train> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </div> | </div> | ||||
| <div id="intention"> | <div id="intention"> | ||||
| <a-card title="求职意向"> | |||||
| <template #extra> | |||||
| <a-button | |||||
| @click="edit('intention')">{{editObj.intention ? '正在编辑': '编辑'}}</a-button> | |||||
| </template> | |||||
| <resume-intention :form_state="editObj.intention" @quitEdit="quitEdit" | |||||
| @editEdit="edit('intention')"></resume-intention> | |||||
| </a-card> | |||||
| <a-typography style="margin-top: 20px;"> | |||||
| <a-flex align="center" justify="space-between"> | |||||
| <a-typography-title :level="4"> | |||||
| <div class="text-decoration"> | |||||
| <div class="text-content">求职意向</div> | |||||
| </div></a-typography-title> | |||||
| <FormOutlined @click="edit('intention')" v-if="editObj.intention" | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| <PlusCircleOutlined @click="edit('intention')" v-else | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <resume-intention :form_state="editObj.intention" @quitEdit="quitEdit" | |||||
| @editEdit="edit('intention')"></resume-intention> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </div> | </div> | ||||
| <div id="experience"> | <div id="experience"> | ||||
| <a-card title="工作经历"> | |||||
| <template #extra> | |||||
| <a-button | |||||
| @click="edit('experience')">{{editObj.experience ? '正在编辑': '添加'}}</a-button> | |||||
| </template> | |||||
| <resume-experience :form_state="editObj.experience" @quitEdit="quitEdit" | |||||
| @editEdit="edit('experience')"></resume-experience> | |||||
| </a-card> | |||||
| <a-typography style="margin-top: 20px;"> | |||||
| <a-flex align="center" justify="space-between"> | |||||
| <a-typography-title :level="4"> | |||||
| <div class="text-decoration"> | |||||
| <div class="text-content">工作经历</div> | |||||
| </div></a-typography-title> | |||||
| <FormOutlined @click="edit('experience')" v-if="editObj.experience" | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| <PlusCircleOutlined @click="edit('experience')" v-else | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <resume-experience :form_state="editObj.experience" @quitEdit="quitEdit" | |||||
| @editEdit="edit('experience')"></resume-experience> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </div> | </div> | ||||
| <div id="credential"> | <div id="credential"> | ||||
| <a-card title="证书"> | |||||
| <template #extra> | |||||
| <a-button | |||||
| @click="edit('credential')">{{editObj.credential ? '正在编辑': '添加'}}</a-button> | |||||
| </template> | |||||
| <resume-credential :form_state="editObj.credential" @quitEdit="quitEdit" | |||||
| @editEdit="edit('credential')"></resume-credential> | |||||
| </a-card> | |||||
| <a-typography style="margin-top: 20px;"> | |||||
| <a-flex align="center" justify="space-between"> | |||||
| <a-typography-title :level="4"> | |||||
| <div class="text-decoration"> | |||||
| <div class="text-content">证书</div> | |||||
| </div></a-typography-title> | |||||
| <FormOutlined @click="edit('credential')" v-if="editObj.credential" | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| <PlusCircleOutlined @click="edit('credential')" v-else | |||||
| style="color: #4FBE70;font-size: 24px;" /> | |||||
| </a-flex> | |||||
| <a-typography-paragraph> | |||||
| <resume-credential :form_state="editObj.credential" @quitEdit="quitEdit" | |||||
| @editEdit="edit('credential')"></resume-credential> | |||||
| </a-typography-paragraph> | |||||
| </a-typography> | |||||
| </div> | </div> | ||||
| </a-space> | </a-space> | ||||
| import ResumeIntroduction from '@/components/jobSeeker/resume/introduction/introduction.vue'; | import ResumeIntroduction from '@/components/jobSeeker/resume/introduction/introduction.vue'; | ||||
| import ResumeSkill from '@/components/jobSeeker/resume/skill/skill.vue'; | import ResumeSkill from '@/components/jobSeeker/resume/skill/skill.vue'; | ||||
| import ResumeTrain from '@/components/jobSeeker/resume/train/train.vue'; | import ResumeTrain from '@/components/jobSeeker/resume/train/train.vue'; | ||||
| import { FormOutlined, PlusCircleOutlined } from '@ant-design/icons-vue'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | import { useCommon } from '@/hooks/useCommon'; | ||||
| let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | ||||
| let menu_list = ref([ | let menu_list = ref([ | ||||
| } | } | ||||
| </script> | </script> | ||||
| <style> | |||||
| <style scoped> | |||||
| :deep(.ant-anchor) { | |||||
| background-color: #ffffff !important; | |||||
| border-radius: 8px !important; | |||||
| padding-inline-start: 2px; | |||||
| } | |||||
| :deep(.ant-anchor::before) { | |||||
| border-inline-start: 0 !important; | |||||
| } | |||||
| :deep(.ant-anchor-ink) { | |||||
| background-color: #ffffff !important; | |||||
| } | |||||
| :deep(.ant-anchor-link) { | |||||
| padding: 10px !important; | |||||
| } | |||||
| :deep(.ant-anchor-link-title-active) { | |||||
| font-weight: bold !important; | |||||
| color: #4FBE70 !important; | |||||
| } | |||||
| .text-decoration { | |||||
| position: relative; | |||||
| display: inline-block; | |||||
| overflow: visible; | |||||
| } | |||||
| .text-decoration::before { | |||||
| content: ''; | |||||
| width: 6px; | |||||
| height: 22px; | |||||
| background-color: #4FBE70; | |||||
| position: absolute; | |||||
| top: 4px | |||||
| } | |||||
| .text-content { | |||||
| position: relative; | |||||
| margin-left: 20px; | |||||
| } | |||||
| </style> | </style> |
| <template> | <template> | ||||
| <a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist."> | |||||
| <template #extra> | |||||
| <router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link> | |||||
| </template> | |||||
| </a-result> | |||||
| </template> | </template> | ||||
| <script> | <script> |
| }) | }) | ||||
| </script> | </script> | ||||
| <style lang="less"> | |||||
| <style lang="less" scoped> | |||||
| @import 'login.less'; | @import 'login.less'; | ||||
| </style> | </style> |
| <div class="content-padding-inline" style="margin-top: 30px;"> | <div class="content-padding-inline" style="margin-top: 30px;"> | ||||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | <a-row :gutter="[10,10]" type="flex" justify="center"> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <a-row> | |||||
| <a-row :gutter="20"> | |||||
| <a-col span="4"> | <a-col span="4"> | ||||
| <common-left-sider :menu_list="menu_list" :selected_key="[1]" | <common-left-sider :menu_list="menu_list" :selected_key="[1]" | ||||
| @changeKey="changeKey"></common-left-sider> | @changeKey="changeKey"></common-left-sider> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="20"> | <a-col span="20"> | ||||
| <div style="width: 100%;background-color: #fff;padding: 10px;"> | |||||
| <div style="width: 100%;background-color: #fff;height: calc(100vh - 100px); overflow: auto; padding: 10px;border-radius: 8px;"> | |||||
| <message-list v-if="curKey == 1"></message-list> | <message-list v-if="curKey == 1"></message-list> | ||||
| <message-feedback v-if="curKey == 2"></message-feedback> | <message-feedback v-if="curKey == 2"></message-feedback> | ||||
| </div> | </div> |
| <div class="content-padding-inline" style="margin-top: 30px;"> | <div class="content-padding-inline" style="margin-top: 30px;"> | ||||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | <a-row :gutter="[10,10]" type="flex" justify="center"> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <a-row> | |||||
| <a-row :gutter="20"> | |||||
| <a-col span="4"> | <a-col span="4"> | ||||
| <common-left-sider :menu_list="menu_list" :selected_key="[1]" | <common-left-sider :menu_list="menu_list" :selected_key="[1]" | ||||
| @changeKey="changeKey"></common-left-sider> | @changeKey="changeKey"></common-left-sider> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="20"> | <a-col span="20"> | ||||
| <div style="width: 100%;background-color: #fff;height: calc(100vh - 100px); overflow: auto; padding: 10px;"> | |||||
| <div style="width: 100%;background-color: #fff;height: calc(100vh - 100px); overflow: auto; padding: 10px;border-radius: 8px;"> | |||||
| <user-expense v-if="curKey == 1"></user-expense> | <user-expense v-if="curKey == 1"></user-expense> | ||||
| <user-password v-if="curKey == 2"></user-password> | <user-password v-if="curKey == 2"></user-password> | ||||
| <user-email v-if="curKey == 3"></user-email> | <user-email v-if="curKey == 3"></user-email> |
| <template> | <template> | ||||
| dd | |||||
| <a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist."> | |||||
| <template #extra> | |||||
| <router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link> | |||||
| </template> | |||||
| </a-result> | |||||
| </template> | </template> | ||||
| <script> | <script> | ||||
| </script> | </script> | ||||
| <style> | <style> | ||||
| </style> | |||||
| </style> |
| <template> | <template> | ||||
| <a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist."> | |||||
| <template #extra> | |||||
| <router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link> | |||||
| </template> | |||||
| </a-result> | |||||
| </template> | </template> | ||||
| <script> | <script> |
| <template> | <template> | ||||
| <a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist."> | <a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist."> | ||||
| <template #extra> | <template #extra> | ||||
| <a-button type="primary">Back Home</a-button> | |||||
| <router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link> | |||||
| </template> | </template> | ||||
| </a-result> | </a-result> | ||||
| </template> | </template> |
| <template> | <template> | ||||
| <a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist."> | |||||
| <template #extra> | |||||
| <router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link> | |||||
| </template> | |||||
| </a-result> | |||||
| </template> | </template> | ||||
| <script> | <script> |