| <!doctype html> | |||||
| <html lang="en"> | |||||
| <head> | |||||
| <meta charset="UTF-8" /> | |||||
| <link rel="icon" type="image/svg+xml" href="/vite.svg" /> | |||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||||
| <title>Vite + Vue + TS</title> | |||||
| <script type="module" crossorigin src="/assets/index-04ZkBbBm.js"></script> | |||||
| <link rel="stylesheet" crossorigin href="/assets/index-_REgwLfQ.css"> | |||||
| </head> | |||||
| <body> | |||||
| <div id="app"></div> | |||||
| </body> | |||||
| </html> | |||||
| <!doctype html> | |||||
| <html lang="en"> | |||||
| <head> | |||||
| <meta charset="UTF-8" /> | |||||
| <link rel="icon" type="image/svg+xml" href="/vite.svg" /> | |||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||||
| <title>Vite + Vue + TS</title> | |||||
| <script type="module" crossorigin src="/assets/index-nrYvv5ad.js"></script> | |||||
| <link rel="stylesheet" crossorigin href="/assets/index-tVJBwrDz.css"> | |||||
| </head> | |||||
| <body> | |||||
| <div id="app"></div> | |||||
| </body> | |||||
| </html> | 
| export const GetCaptcha = getModel(url.Captcha); | export const GetCaptcha = getModel(url.Captcha); | ||||
| export const PostSmsSend = postModel(url.SmsSend); | export const PostSmsSend = postModel(url.SmsSend); | ||||
| export const PostJobseekerSmsLogin = postModel(url.JobseekerSmsLogin); | export const PostJobseekerSmsLogin = postModel(url.JobseekerSmsLogin); | ||||
| export const PostCustomerVerify = postModel(url.CustomerVerify); | |||||
| export const PostJobseekerEditPwd = postModel(url.JobseekerEditPwd); | |||||
| // 招聘会 | // 招聘会 | ||||
| export const PostRecruitmentBookcompany = getModel(url.RecruitmentBookcompany);// 获取招聘会参与的企业 | export const PostRecruitmentBookcompany = getModel(url.RecruitmentBookcompany);// 获取招聘会参与的企业 | ||||
| export const PostRecruitmentList = getModel(url.RecruitmentList);// 招聘会列表 | export const PostRecruitmentList = getModel(url.RecruitmentList);// 招聘会列表 | ||||
| // 求职者管理中心 | // 求职者管理中心 | ||||
| export const PostViewhistoryList = getModel(url.ViewhistoryList);// 获取简历被查看记录 | |||||
| export const PostInterviewList = getModel(url.InterviewList); // 获取应聘记录列表 | |||||
| export const GetViewHistoryList = getModel(url.ViewHistoryList); | |||||
| export const GetInterviewList = getModel(url.InterviewList); // 获取应聘记录列表 | |||||
| // 企业管理中心 | // 企业管理中心 | ||||
| export const GetCompanyRecommentResume = getModel(url.CompanyRecommentResume); // 推荐简历 | export const GetCompanyRecommentResume = getModel(url.CompanyRecommentResume); // 推荐简历 | ||||
| // 列表 | // 列表 | ||||
| export const PostJobseekerList = postModel(url.JobseekerList); | export const PostJobseekerList = postModel(url.JobseekerList); | ||||
| export const GetJobseekerDetail = getModel(url.JobseekerDetail); | export const GetJobseekerDetail = getModel(url.JobseekerDetail); | ||||
| export const GetViewhistoryList = getModel(url.ViewhistoryList); | |||||
| export const PostPersonInterviewViewStatus = postModel(url.PersonInterviewViewStatus); | export const PostPersonInterviewViewStatus = postModel(url.PersonInterviewViewStatus); | ||||
| export const GetPersonInterviewList = getModel(url.PersonInterviewList); | export const GetPersonInterviewList = getModel(url.PersonInterviewList); | 
| Captcha : String, | Captcha : String, | ||||
| SmsSend : String, | SmsSend : String, | ||||
| JobseekerSmsLogin : String, | JobseekerSmsLogin : String, | ||||
| CustomerVerify : String, | |||||
| JobseekerEditPwd : String, | |||||
| // 招聘会 | // 招聘会 | ||||
| RecruitmentBookcompany : String, | RecruitmentBookcompany : String, | ||||
| RecruitmentbookList : String, | RecruitmentbookList : String, | ||||
| RecruitmentbookDetail : String, | RecruitmentbookDetail : String, | ||||
| CompanyProbationList: String, | |||||
| // 知名/推荐企业 | |||||
| CompanyFamousList: String, | |||||
| // 简历 | // 简历 | ||||
| // 列表 | // 列表 | ||||
| 'JobseekerList' : String, // 查看 | 'JobseekerList' : String, // 查看 | ||||
| 'JobseekerDetail' : String, // 详情 | 'JobseekerDetail' : String, // 详情 | ||||
| ViewhistoryList: String, // 详情 | |||||
| ViewHistoryList: String, // 详情 | |||||
| PersonInterviewList: String, // 面试邀请记录 | PersonInterviewList: String, // 面试邀请记录 | ||||
| PersonInterviewViewStatus: String, // 是否参加面试 | PersonInterviewViewStatus: String, // 是否参加面试 | ||||
| PersonInterviewDel: String, // 删除面试邀请 | PersonInterviewDel: String, // 删除面试邀请 | 
| Captcha: common + '/captcha', // 获取验证码 | Captcha: common + '/captcha', // 获取验证码 | ||||
| SmsSend: common + '/sms/send', // 短信验证码 | SmsSend: common + '/sms/send', // 短信验证码 | ||||
| JobseekerSmsLogin: web + '/jobseeker/smslogin', // 个人登录 | JobseekerSmsLogin: web + '/jobseeker/smslogin', // 个人登录 | ||||
| CustomerVerify: web + '/customer/verify', // 转换为HR | |||||
| JobseekerEditPwd: web + '/jobseek/edit_pwd', // 修改密码 | |||||
| // 招聘会 | // 招聘会 | ||||
| RecruitmentbookList: web + '/recruitmentbook/list', // 列表 | RecruitmentbookList: web + '/recruitmentbook/list', // 列表 | ||||
| RecruitmentbookDetail: web + '/recruitmentbook/detail', // 详情 | RecruitmentbookDetail: web + '/recruitmentbook/detail', // 详情 | ||||
| // 见习基地 | |||||
| CompanyProbationList: web + '/company/probation_list', // 列表 | |||||
| // 知名/推荐企业 | |||||
| CompanyFamousList: web + '/company/famous_list', // 详情 | |||||
| // 反馈 | // 反馈 | ||||
| FeedbackAdd: common + '/feedback/add', // 添加 | FeedbackAdd: common + '/feedback/add', // 添加 | ||||
| // 简历 | // 简历 | ||||
| JobseekerList: web + '/jobseeker/list', // 获取简历完整资料列表 | JobseekerList: web + '/jobseeker/list', // 获取简历完整资料列表 | ||||
| JobseekerDetail: web + '/jobseeker/detail', // 获取简历完整资料 | JobseekerDetail: web + '/jobseeker/detail', // 获取简历完整资料 | ||||
| ViewhistoryList: web + '/viewhistory/list', // 简历被查看次数 | |||||
| ViewHistoryList: web + '/viewhistory/list', // 简历被查看次数 | |||||
| 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', // 删除面试邀请 | 
| </a-page-header> | </a-page-header> | ||||
| </template> | </template> | ||||
| <template v-else> | <template v-else> | ||||
| <a-list item-layout="horizontal" :data-source="recruitmentList"> | |||||
| <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 @click="toDetail(item)"> | ||||
| <a-list-item-meta> | <a-list-item-meta> | 
| <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> | |||||
| </template> | |||||
| <template v-else> | |||||
| <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> | |||||
| <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> | |||||
| <script setup lang="ts"> | |||||
| import { ref, computed, onMounted, defineEmits, createVNode } from 'vue'; | |||||
| import { GetInterviewList } from '@/apis/models'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| 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 searchData = (data : object) => { | |||||
| commomParams.value.search = data | |||||
| getData(); | |||||
| } | |||||
| const clearData = (data : object) => { | |||||
| if (data) { | |||||
| commomParams.value.search = data | |||||
| } else { | |||||
| commomParams.value.search = { | |||||
| page: 1, | |||||
| pagesize: 12, | |||||
| sort: 'id', | |||||
| sortby: 'asc', | |||||
| keyword: '' | |||||
| } | |||||
| } | |||||
| getData(); | |||||
| } | |||||
| 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 GetInterviewList(commomParams.value.search); | |||||
| loading.value = false; | |||||
| jobList.value = res.data.interviews; | |||||
| 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') | |||||
| // emit('detail') | |||||
| // } | |||||
| onMounted(() => { | |||||
| getData(); | |||||
| }) | |||||
| </script> | |||||
| <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> | 
| <template> | |||||
| </template> | |||||
| <script> | |||||
| </script> | |||||
| <style> | |||||
| </style> | 
| <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> | |||||
| </template> | |||||
| <template v-else> | |||||
| <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> | |||||
| <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> | |||||
| <script setup lang="ts"> | |||||
| import { ref, computed, onMounted, defineEmits, createVNode } from 'vue'; | |||||
| import { GetPersonInterviewList, PostPersonInterviewViewStatus } from '@/apis/models'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| 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 searchData = (data : object) => { | |||||
| commomParams.value.search = data | |||||
| getData(); | |||||
| } | |||||
| const clearData = (data : object) => { | |||||
| if (data) { | |||||
| commomParams.value.search = data | |||||
| } else { | |||||
| commomParams.value.search = { | |||||
| page: 1, | |||||
| pagesize: 12, | |||||
| sort: 'id', | |||||
| sortby: 'asc', | |||||
| keyword: '' | |||||
| } | |||||
| } | |||||
| getData(); | |||||
| } | |||||
| 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 GetPersonInterviewList(commomParams.value.search); | |||||
| loading.value = false; | |||||
| jobList.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 { | |||||
| 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') | |||||
| // emit('detail') | |||||
| // } | |||||
| // 接受面试 | |||||
| const receiveInterview = (id) => { | |||||
| Modal.confirm({ | |||||
| title: `是否要接受面试`, | |||||
| centered: true, | |||||
| icon: createVNode(ExclamationCircleOutlined), | |||||
| onOk() { | |||||
| PostPersonInterviewViewStatus({ id: id, view_status: 2 }).then(res => { | |||||
| successToast('已接受,请按时参加面试') | |||||
| getData(); | |||||
| }) | |||||
| }, | |||||
| onCancel() { | |||||
| }, | |||||
| }); | |||||
| } | |||||
| // 拒绝面试 | |||||
| const rejectInterview = (id, num) => { | |||||
| Modal.confirm({ | |||||
| title: `是否要拒绝面试`, | |||||
| centered: true, | |||||
| icon: PostPersonInterviewViewStatus(ExclamationCircleOutlined), | |||||
| onOk() { | |||||
| PostPersonInterviewViewStatus({ id: id, view_status: 3 }).then(res => { | |||||
| successToast('已拒绝') | |||||
| getData(); | |||||
| }) | |||||
| }, | |||||
| onCancel() { | |||||
| }, | |||||
| }); | |||||
| } | |||||
| onMounted(() => { | |||||
| getData(); | |||||
| }) | |||||
| </script> | |||||
| <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> | 
| <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> | |||||
| </template> | |||||
| <template v-else> | |||||
| <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> | |||||
| <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> | |||||
| <script setup lang="ts"> | |||||
| import { ref, computed, onMounted, defineEmits, createVNode } from 'vue'; | |||||
| import { GetViewHistoryList } from '@/apis/models'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| 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 searchData = (data : object) => { | |||||
| commomParams.value.search = data | |||||
| getData(); | |||||
| } | |||||
| const clearData = (data : object) => { | |||||
| if (data) { | |||||
| commomParams.value.search = data | |||||
| } else { | |||||
| commomParams.value.search = { | |||||
| page: 1, | |||||
| pagesize: 12, | |||||
| sort: 'id', | |||||
| sortby: 'asc', | |||||
| keyword: '' | |||||
| } | |||||
| } | |||||
| getData(); | |||||
| } | |||||
| 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 GetViewHistoryList(commomParams.value.search); | |||||
| loading.value = false; | |||||
| jobList.value = res.data.viewhistorys; | |||||
| 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') | |||||
| // emit('detail') | |||||
| // } | |||||
| onMounted(() => { | |||||
| getData(); | |||||
| }) | |||||
| </script> | |||||
| <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> | 
| <a-col span="18"> | <a-col span="18"> | ||||
| <a-row> | <a-row> | ||||
| <a-col span="4"> | <a-col span="4"> | ||||
| <image-container | |||||
| :imgObj="{src: '/images/logo.png',width: '153px',height:'50px'}"></image-container> | |||||
| <image-container :imgObj="{src: '/images/logo.png',width: '153px',height:'50px'}"></image-container> | |||||
| </a-col> | </a-col> | ||||
| <a-col span="16" style="color: aliceblue;"> | <a-col span="16" style="color: aliceblue;"> | ||||
| <a-top-menu></a-top-menu> | <a-top-menu></a-top-menu> | ||||
| </a-menu-item> | </a-menu-item> | ||||
| <a-menu-item key="6"> | <a-menu-item key="6"> | ||||
| <a-space :size="80"> | <a-space :size="80"> | ||||
| <div>修改密码</div> | |||||
| <div>成为招聘者</div> | |||||
| </a-space> | </a-space> | ||||
| </a-menu-item> | </a-menu-item> | ||||
| <a-menu-item key="7"> | <a-menu-item key="7"> | ||||
| <a-space :size="80"> | <a-space :size="80"> | ||||
| <div @click="quit">安全退出</div> | |||||
| <div @click="quit">安全退出</div> | |||||
| </a-space> | </a-space> | ||||
| </a-menu-item> | </a-menu-item> | ||||
| </a-menu> | </a-menu> | ||||
| </a-dropdown> | </a-dropdown> | ||||
| </template> | </template> | ||||
| </template> | </template> | ||||
| <template v-else > | |||||
| <div @click="toLogin" style="cursor: pointer;"> | |||||
| 登录/注册 | |||||
| </div> | |||||
| <template v-else> | |||||
| <div @click="toLogin" style="cursor: pointer;"> | |||||
| 登录/注册 | |||||
| </div> | |||||
| </template> | </template> | ||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| <a-modal v-model:open="openHr" centered title="成为招聘者" @ok="hrOk"> | |||||
| <a-input v-model:value="form.code" placeholder="请输入验证码" size="large" /> | |||||
| </a-modal> | |||||
| </template> | </template> | ||||
| <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 } from '@/apis/models'; | |||||
| 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'; | ||||
| const emit = defineEmits(); | const emit = defineEmits(); | ||||
| // 成为招聘者 | |||||
| let openHr = ref<Boolean>(false); | |||||
| let form = ref({ | |||||
| code: '' | |||||
| }) | |||||
| const token = computed(() => { | const token = computed(() => { | ||||
| return store.state.token | return store.state.token | ||||
| }) | }) | ||||
| const role = computed(() => { | const role = computed(() => { | ||||
| return store.state.role | return store.state.role | ||||
| }) | }) | ||||
| const pageType = computed(() => { | const pageType = computed(() => { | ||||
| return store.state.pageType | return store.state.pageType | ||||
| }) | }) | ||||
| const toLogin = () => { | const toLogin = () => { | ||||
| router.push('/login') | router.push('/login') | ||||
| } | } | ||||
| const quit = () => { | const quit = () => { | ||||
| store.commit('setShowLoginBox', { | store.commit('setShowLoginBox', { | ||||
| showLoginBox: true | showLoginBox: true | ||||
| store.commit('permissions/SET_MENU', []) | store.commit('permissions/SET_MENU', []) | ||||
| router.push('/job/home') | router.push('/job/home') | ||||
| } | } | ||||
| const returnHome = () => { | const returnHome = () => { | ||||
| store.commit('getPageType', { | store.commit('getPageType', { | ||||
| pageType: '' | pageType: '' | ||||
| store.commit('permissions/SET_MENU', []) | store.commit('permissions/SET_MENU', []) | ||||
| router.push('/job/home') | router.push('/job/home') | ||||
| } | } | ||||
| const handleMenuClick = (val) => { | const handleMenuClick = (val) => { | ||||
| if(val.key == 3) { | |||||
| if (val.key == 3) { | |||||
| store.commit('getPageType', { | store.commit('getPageType', { | ||||
| pageType: 'company' | pageType: 'company' | ||||
| }) | }) | ||||
| store.commit('permissions/SET_MENU', []) | store.commit('permissions/SET_MENU', []) | ||||
| router.push('/manage/home') | router.push('/manage/home') | ||||
| } | } | ||||
| if(val.key == 6) { | |||||
| if (val.key == 6) { | |||||
| store.commit('getPageType', { | store.commit('getPageType', { | ||||
| pageType: 'company' | pageType: 'company' | ||||
| }) | }) | ||||
| } | } | ||||
| } | } | ||||
| const personalMenuClick = (val) => { | const personalMenuClick = (val) => { | ||||
| if(val.key == 3) { | |||||
| if (val.key == 3) { | |||||
| store.commit('getPageType', { | store.commit('getPageType', { | ||||
| pageType: 'personal' | pageType: 'personal' | ||||
| }) | }) | ||||
| store.commit('permissions/SET_MENU', []) | store.commit('permissions/SET_MENU', []) | ||||
| router.push('/jobseeker/home') | router.push('/jobseeker/home') | ||||
| } | } | ||||
| if(val.key == 4) { | |||||
| if (val.key == 4) { | |||||
| store.commit('getPageType', { | store.commit('getPageType', { | ||||
| pageType: 'personal' | pageType: 'personal' | ||||
| }) | }) | ||||
| store.commit('permissions/SET_MENU', []) | store.commit('permissions/SET_MENU', []) | ||||
| router.push('/jobseeker/resume') | router.push('/jobseeker/resume') | ||||
| } | } | ||||
| if(val.key == 5) { | |||||
| if (val.key == 5) { | |||||
| store.commit('getPageType', { | store.commit('getPageType', { | ||||
| pageType: '' | pageType: '' | ||||
| }) | }) | ||||
| store.commit('permissions/SET_MENU', []) | store.commit('permissions/SET_MENU', []) | ||||
| router.push('/personal') | router.push('/personal') | ||||
| } | } | ||||
| if(val.key == 6) { | |||||
| if (val.key == 6) { | |||||
| debugger | |||||
| openHr.value = true | |||||
| form.value.code = '' | |||||
| } | |||||
| if (val.key == 7) { | |||||
| store.commit('getPageType', { | store.commit('getPageType', { | ||||
| pageType: 'personal' | pageType: 'personal' | ||||
| }) | }) | ||||
| router.push('/jobseeker/home') | router.push('/jobseeker/home') | ||||
| } | } | ||||
| } | } | ||||
| const hrOk = () => { | |||||
| if (!form.value.code) { | |||||
| warnToast('请输入验证码') | |||||
| return; | |||||
| } else { | |||||
| successToast('已经成为招聘者,请重新登录') | |||||
| quit() | |||||
| router.push('/login') | |||||
| // PostCustomerVerify(form.value).then(res => { | |||||
| // successToast('已经成为招聘者,请重新登录') | |||||
| // quit() | |||||
| // }) | |||||
| } | |||||
| } | |||||
| </script> | </script> | ||||
| <style lang="less" scoped> | <style lang="less" scoped> | ||||
| justify-content: flex-end; | justify-content: flex-end; | ||||
| color: #fff; | color: #fff; | ||||
| } | } | ||||
| :deep(.ant-btn) { | :deep(.ant-btn) { | ||||
| margin-right: 20px !important; | margin-right: 20px !important; | ||||
| } | } | ||||
| </style> | </style> | 
| }, | }, | ||||
| }; | }; | ||||
| // 职位搜索 | // 职位搜索 | ||||
| const JobseekerSearchRoute : AppRouteRecordRaw = { | const JobseekerSearchRoute : AppRouteRecordRaw = { | ||||
| path: '/jobseeker/search', | path: '/jobseeker/search', | ||||
| }, | }, | ||||
| }; | }; | ||||
| const JobseekerPasswordRoute : AppRouteRecordRaw = { | |||||
| path: '/jobseeker/password', | |||||
| name: 'JobseekerPassword', | |||||
| component: routerList.JobseekerPassword, | |||||
| meta: { | |||||
| title: '修改密码', | |||||
| icon: HomeOutlined | |||||
| }, | |||||
| }; | |||||
| JobseekerHomeRoute, | JobseekerHomeRoute, | ||||
| JobseekerRecommendRoute, | JobseekerRecommendRoute, | ||||
| JobseekerResumeRoute, | JobseekerResumeRoute, | ||||
| JobseekerSearchRoute | |||||
| JobseekerSearchRoute, | |||||
| JobseekerPasswordRoute | |||||
| ]; | ]; | 
| import JobseekerRecommend from '@/views/jobseeker/recommend/index.vue'; | import JobseekerRecommend from '@/views/jobseeker/recommend/index.vue'; | ||||
| import JobseekerResume from '@/views/jobseeker/resume/index.vue'; | import JobseekerResume from '@/views/jobseeker/resume/index.vue'; | ||||
| import JobseekerSearch from '@/views/jobseeker/search/index.vue'; | import JobseekerSearch from '@/views/jobseeker/search/index.vue'; | ||||
| import JobseekerPassword from '@/views/jobseeker/password/index.vue'; | |||||
| export const routerList = { | export const routerList = { | ||||
| Home, | Home, | ||||
| JobseekerHome, | JobseekerHome, | ||||
| JobseekerRecommend, | JobseekerRecommend, | ||||
| JobseekerResume, | JobseekerResume, | ||||
| JobseekerSearch | |||||
| JobseekerSearch, | |||||
| JobseekerPassword | |||||
| } | } | 
| <div v-if="mode== 'detail'"> | <div v-if="mode== 'detail'"> | ||||
| <a-page-header> | <a-page-header> | ||||
| <template #title> | <template #title> | ||||
| <a-button @click="back" type="link"><ArrowLeftOutlined />前往更多求职</a-button> | |||||
| <a-button @click="back" type="link"> | |||||
| <ArrowLeftOutlined />前往更多求职 | |||||
| </a-button> | |||||
| </template> | </template> | ||||
| <a-list item-layout="vertical"> | <a-list item-layout="vertical"> | ||||
| <a-list-item> | <a-list-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;"> | |||||
| <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> | |||||
| </div> | |||||
| <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;"> | |||||
| <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> | |||||
| </a-descriptions> | |||||
| </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"> | ||||
| <a-card hoverable style="width: 100%"> | |||||
| <template #cover> | |||||
| <job-card :list="jobList" @detail="toDetail"></job-card> | |||||
| </template> | |||||
| <template #actions> | |||||
| <a-col span="24"> | |||||
| <a-pagination simple hideOnSinglePage v-model:current="current" | |||||
| :total="total" @change="pageChange" /> | |||||
| </a-col> | |||||
| </template> | |||||
| </a-card> | |||||
| <div style="height: calc(100vh - 100px); overflow: auto;background-color: #ffffff;"> | |||||
| <a-card hoverable style="width: 100%"> | |||||
| <template #cover> | |||||
| <job-card :list="jobList" @detail="toDetail"></job-card> | |||||
| </template> | |||||
| <template #actions> | |||||
| <a-col span="24"> | |||||
| <a-pagination simple hideOnSinglePage v-model:current="current" | |||||
| :total="total" @change="pageChange" /> | |||||
| </a-col> | |||||
| </template> | |||||
| </a-card> | |||||
| </div> | |||||
| </a-col> | </a-col> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <div v-if="job_id" style="padding: 20px;background-color: #ffffff;"> | |||||
| <div v-if="job_id" style="height: calc(100vh - 100px); overflow: auto;padding: 20px;background-color: #ffffff;"> | |||||
| <job-detail :id="job_id"></job-detail> | <job-detail :id="job_id"></job-detail> | ||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| </a-page-header> | </a-page-header> | ||||
| </div> | </div> | ||||
| <div v-else> | <div v-else> | ||||
| <job-list @detail="showDetail"></job-list> | |||||
| <job-list @detail="showDetail"></job-list> | |||||
| <job-internship @detail="showDetail"></job-internship> | <job-internship @detail="showDetail"></job-internship> | ||||
| <!-- <job-detail></job-detail> --> | <!-- <job-detail></job-detail> --> | ||||
| </div> | </div> | ||||
| import JobCard from '@/components/job/card/index.vue' | import JobCard from '@/components/job/card/index.vue' | ||||
| import JobList from '@/components/job/list/index.vue' | import JobList from '@/components/job/list/index.vue' | ||||
| import JobInternship from '@/components/job/internship/index.vue' | import JobInternship from '@/components/job/internship/index.vue' | ||||
| import vMap from '@/components/map/map-iframe.vue' | |||||
| 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'; | ||||
| current.value = page | current.value = page | ||||
| getJobCompanyjobs() | getJobCompanyjobs() | ||||
| } | } | ||||
| const back = (page) => { | const back = (page) => { | ||||
| sessionStorage.removeItem('pubilc_id') | sessionStorage.removeItem('pubilc_id') | ||||
| sessionStorage.removeItem('mode') | sessionStorage.removeItem('mode') | ||||
| sessionStorage.removeItem('job_id') | sessionStorage.removeItem('job_id') | ||||
| mode.value = sessionStorage.getItem('mode') | mode.value = sessionStorage.getItem('mode') | ||||
| } | } | ||||
| const showDetail = (page) => { | const showDetail = (page) => { | ||||
| mode.value = sessionStorage.getItem('mode') | mode.value = sessionStorage.getItem('mode') | ||||
| activeKey.value = sessionStorage.getItem('tab_key') ? Number(sessionStorage.getItem('tab_key')) : 1 | activeKey.value = sessionStorage.getItem('tab_key') ? Number(sessionStorage.getItem('tab_key')) : 1 | ||||
| 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 | |||||
| }) | |||||
| getJobCompanyjobs() | getJobCompanyjobs() | ||||
| } | } | ||||
| } | } | ||||
| onMounted(() => { | onMounted(() => { | ||||
| if (mode.value == 'detail') { | if (mode.value == 'detail') { | ||||
| 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 | |||||
| }) | |||||
| getJobCompanyjobs() | getJobCompanyjobs() | ||||
| } | } | ||||
| } | } | ||||
| sessionStorage.removeItem('pubilc_id') | sessionStorage.removeItem('pubilc_id') | ||||
| sessionStorage.removeItem('mode') | sessionStorage.removeItem('mode') | ||||
| sessionStorage.removeItem('tab_key') | sessionStorage.removeItem('tab_key') | ||||
| sessionStorage.removeItem('job_id') | |||||
| sessionStorage.removeItem('job_id') | |||||
| }) | }) | ||||
| </script> | </script> | ||||
| <a-list-item-meta> | <a-list-item-meta> | ||||
| <template #title> | <template #title> | ||||
| {{basic.seekername}} | {{basic.seekername}} | ||||
| <a-button type="link" class="main-color"><EditOutlined style="color: #4FBE70" />修改简历</a-button> | |||||
| <a-button type="link" @click="toResume" class="main-color"> | |||||
| <EditOutlined style="color: #4FBE70" />修改简历 | |||||
| </a-button> | |||||
| </template> | </template> | ||||
| <template #description> | <template #description> | ||||
| 会员编号:{{basic.id}} | 会员编号:{{basic.id}} | ||||
| </template> | </template> | ||||
| </a-list-item-meta> | </a-list-item-meta> | ||||
| <div style="margin-left: 108px;"> | <div style="margin-left: 108px;"> | ||||
| <a-descriptions :column="2"> | |||||
| <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"><FileSearchOutlined style="color: #4FBE70" />预览简历</a-button></a-descriptions-item> | |||||
| <a-descriptions-item | |||||
| label="QQ">{{basic.qq ? basic.qq : '未填写'}}</a-descriptions-item> | |||||
| <a-descriptions-item><a-button type="link" class="main-color"><RedoOutlined style="color: #4FBE70" />预览简历</a-button></a-descriptions-item> | |||||
| <a-descriptions-item | |||||
| label="电子邮箱">{{basic.email ? basic.email : '未填写'}}</a-descriptions-item> | |||||
| <a-descriptions-item label="简历被查看次数">{{seeLength}}次</a-descriptions-item> | |||||
| <a-descriptions-item><a-button type="link" class="main-color"> | |||||
| <FileSearchOutlined style="color: #4FBE70" />预览简历 | |||||
| </a-button></a-descriptions-item> | |||||
| <a-descriptions-item label="简历是否可见"> | |||||
| <a-switch></a-switch> | |||||
| </a-descriptions-item> | |||||
| <a-descriptions-item label="QQ"> | |||||
| {{basic.qq ? basic.qq : '未填写'}} | |||||
| </a-descriptions-item> | |||||
| <a-descriptions-item> | |||||
| <a-button type="link" class="main-color"> | |||||
| <RedoOutlined style="color: #4FBE70" />预览简历 | |||||
| </a-button> | |||||
| </a-descriptions-item> | |||||
| <a-descriptions-item label="简历是否在家政可见"> | |||||
| <a-switch></a-switch> | |||||
| </a-descriptions-item> | |||||
| <a-descriptions-item label="电子邮箱"> | |||||
| {{basic.email ? basic.email : '未填写'}} | |||||
| </a-descriptions-item> | |||||
| <a-descriptions-item label="简历被查看次数"> | |||||
| {{seeLength}}次 | |||||
| </a-descriptions-item> | |||||
| <a-descriptions-item label="是否接收面试邀请通知"> | |||||
| <a-switch></a-switch> | |||||
| </a-descriptions-item> | |||||
| </a-descriptions> | </a-descriptions> | ||||
| </div> | </div> | ||||
| </a-list-item> | </a-list-item> | ||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <a-space align="cneter" direction="vertical"> | |||||
| <div style="width: 100%;font-size: 24px;"> | |||||
| 推荐简历 | |||||
| </div> | |||||
| <a-row :gutter="[20,20]"> | |||||
| <a-col span="12" v-for="(item, index) in jobList"> | |||||
| <div class="talent-box"> | |||||
| <a-list> | |||||
| <a-list-item> | |||||
| <template #actions> | |||||
| <a-button> | |||||
| <StarOutlined /> | |||||
| 收藏 | |||||
| </a-button> | |||||
| <a-button> | |||||
| 邀请面试 | |||||
| </a-button> | |||||
| </template> | |||||
| <a-list-item-meta> | |||||
| <template #title> | |||||
| {{item.seekername}} | |||||
| </template> | |||||
| <template #description> | |||||
| <div> | |||||
| {{item.gender}} | |||||
| <a-divider type="vertical" /> | |||||
| {{item.education_text}} | |||||
| <a-divider type="vertical" /> | |||||
| {{item.now_level1_text}}{{item.now_level2_text}} | |||||
| </div> | |||||
| <div style="margin-top: 10px; overflow: hidden; | |||||
| display: -webkit-box; | |||||
| -webkit-line-clamp: 1; | |||||
| -webkit-box-orient: vertical; | |||||
| text-overflow: ellipsis;"> | |||||
| <div v-html="item.introduction"></div> | |||||
| </div> | |||||
| </template> | |||||
| <template #avatar> | |||||
| <a-avatar :src="item.photo" :size="48" /> | |||||
| </template> | |||||
| </a-list-item-meta> | |||||
| </a-list-item> | |||||
| </a-list> | |||||
| </div> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-flex justify="center"> | |||||
| <a-button size="large" type="primary">查看更多</a-button> | |||||
| </a-flex> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-space> | |||||
| <a-tabs v-model:activeKey="activeKey" @change="activeKeyChange"> | |||||
| <a-tab-pane :key="1" tab="面试记录"> | |||||
| <invite-interview></invite-interview> | |||||
| </a-tab-pane> | |||||
| <a-tab-pane :key="2" tab="投递记录" force-render> | |||||
| <invite-apply></invite-apply> | |||||
| </a-tab-pane> | |||||
| <a-tab-pane :key="3" tab="谁看过我"> | |||||
| <invite-seeme></invite-seeme> | |||||
| </a-tab-pane> | |||||
| <a-tab-pane :key="4" tab="收藏的职位"> | |||||
| <invite-collect></invite-collect> | |||||
| </a-tab-pane> | |||||
| </a-tabs> | |||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </div> | </div> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, computed, onMounted, createVNode } from 'vue'; | import { ref, computed, onMounted, createVNode } from 'vue'; | ||||
| import JobTalents from '@/components/job/talents/index.vue' | |||||
| import { GetJobseekerDetail, GetCompanyRecommentResume, GetViewhistoryList, GetPersonInterviewList } from '@/apis/models'; | |||||
| import { EditOutlined, FileSearchOutlined,RedoOutlined } from '@ant-design/icons-vue'; | |||||
| import InviteInterview from '@/components/jobseeker/invite/interview/index.vue' | |||||
| import InviteApply from '@/components/jobseeker/invite/apply/index.vue' | |||||
| import InviteSeeme from '@/components/jobseeker/invite/seeme/index.vue' | |||||
| import InviteCollect from '@/components/jobseeker/invite/collect/index.vue' | |||||
| import { GetJobseekerDetail, GetCompanyRecommentResume, GetViewHistoryList, GetPersonInterviewList } from '@/apis/models'; | |||||
| import { EditOutlined, FileSearchOutlined, RedoOutlined } from '@ant-design/icons-vue'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | import { useCommon } from '@/hooks/useCommon'; | ||||
| let { commomParams, ExclamationCircleOutlined, Modal } = useCommon(); | |||||
| let { commomParams, ExclamationCircleOutlined, Modal, onMenu } = 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) | ||||
| const toResume = () => { | |||||
| debugger | |||||
| onMenu('/jobseeker/resume') | |||||
| } | |||||
| onMounted(() => { | onMounted(() => { | ||||
| GetJobseekerDetail({ customer_id: sessionStorage.getItem('id') }).then(res => { | GetJobseekerDetail({ customer_id: sessionStorage.getItem('id') }).then(res => { | ||||
| basic.value = res.data | basic.value = res.data | ||||
| }) | }) | ||||
| GetViewhistoryList().then(res => { | |||||
| GetViewHistoryList().then(res => { | |||||
| seeLength.value = res.data.viewhistorys ? res.data.viewhistorys.length : 0 | seeLength.value = res.data.viewhistorys ? res.data.viewhistorys.length : 0 | ||||
| }) | }) | ||||
| GetPersonInterviewList({status: 0}).then(res => { | |||||
| if(res.data.list.length > 0) { | |||||
| GetPersonInterviewList({ status: 0 }).then(res => { | |||||
| if (res.data.list.length > 0) { | |||||
| Modal.confirm({ | Modal.confirm({ | ||||
| title: `您有${res.data.list.length}条待查看面试邀请`, | title: `您有${res.data.list.length}条待查看面试邀请`, | ||||
| centered: true, | centered: true, | ||||
| okText: '前往查看', | okText: '前往查看', | ||||
| cancelText: '关闭', | cancelText: '关闭', | ||||
| onOk() { | onOk() { | ||||
| }, | }, | ||||
| onCancel() { | onCancel() { | ||||
| }, | }, | ||||
| }); | }); | ||||
| } | } | 
| <template> | |||||
| <div class="content-padding-inline" style="margin: 30px 0;"> | |||||
| <a-row :gutter="[20,20]" type="flex" justify="center"> | |||||
| <a-col span="18"> | |||||
| <a-card title="修改密码"> | |||||
| <a-form :model="createForm" layout="vertical"> | |||||
| <a-row gutter="20"> | |||||
| <a-col span="12"> | |||||
| <a-row gutter="20"> | |||||
| <a-col span="24"> | |||||
| <a-form-item label="手机号"> | |||||
| <a-input v-model:value="smsForm.mobile" placeholder="手机号" size="large" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-form-item label="验证码"> | |||||
| <a-input v-model:value="smsForm.captcha" placeholder="验证码" size="large" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-form-item label="图形验证码"> | |||||
| <image-container :imgObj="{src: codeImage,width: '100%',height: '40px', mode: 'fill'}" | |||||
| @click="getCaptcha"></image-container> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="18"> | |||||
| <a-form-item label="短信验证码"> | |||||
| <a-input v-model:value="createForm.sms_code" placeholder="短信验证码" size="large" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="6"> | |||||
| <a-form-item label="验证码"> | |||||
| <a-button type="primary" block size="large" @click="sendCode" | |||||
| :disabled="state.disabled"> | |||||
| {{ state.codeTxt }}</a-button> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-form-item label="确认密码" name="comform_password"> | |||||
| <a-input v-model:value="createForm.new_password" placeholder="请输入确认密码" | |||||
| size="large" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-form-item label=""> | |||||
| <a-button type="primary" block @click="saveForm" size="large">保存</a-button> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-form> | |||||
| </a-card> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </div> | |||||
| </template> | |||||
| <script setup lang="ts"> | |||||
| import { ref, onMounted, computed, onBeforeUnmount } from 'vue'; | |||||
| import { PostJobseekerEditPwd, PostSmsSend, GetCaptcha } from '@/apis/models'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| let smsForm = ref<Object>({ | |||||
| mobile: "", | |||||
| captcha: "", | |||||
| capt_id: "" | |||||
| }) | |||||
| let createForm = ref({ | |||||
| sms_code: '', | |||||
| new_password: '', | |||||
| }) | |||||
| 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.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) | |||||
| }) | |||||
| }; | |||||
| const getCaptcha = () => { | |||||
| createForm.value.captcha = ''; | |||||
| GetCaptcha().then(res => { | |||||
| capt_id.value = res.data.capt_id; | |||||
| codeImage.value = res.data.img; | |||||
| }) | |||||
| } | |||||
| const saveForm = () => { | |||||
| PostJobseekerEditPwd(createForm.value).then(res => { | |||||
| successToast('修改成功') | |||||
| resetForm() | |||||
| }) | |||||
| } | |||||
| const resetForm = () => { | |||||
| createForm.value = { | |||||
| sms_code: '', | |||||
| new_password: '', | |||||
| } | |||||
| } | |||||
| onMounted(() => { | |||||
| getCaptcha() | |||||
| }) | |||||
| onBeforeUnmount(() => { | |||||
| clearInterval(timer.value); | |||||
| }) | |||||
| </script> | |||||
| <style scoped lang="less"> | |||||
| </style> | 
| let { store, ExclamationCircleOutlined, Modal } = useCommon(); | let { store, ExclamationCircleOutlined, Modal } = useCommon(); | ||||
| let currentModule = ref<String>('login') // 当前模块 login 登录 resiter 注册 | let currentModule = ref<String>('login') // 当前模块 login 登录 resiter 注册 | ||||
| let loginSegmentedValue = ref<String>('我要求职') // 个人或者企业 // 我要求职 个人求职 我要招聘 企业 | let loginSegmentedValue = ref<String>('我要求职') // 个人或者企业 // 我要求职 个人求职 我要招聘 企业 | ||||
| let loginMethod = ref<String>('password') // 登录方式 // password 密码登录 message 短信登录 | |||||
| let loginMethod = ref<String>('message') // 登录方式 // password 密码登录 message 短信登录 | |||||
| let registerSegmentedValue = ref<String>('求职者注册') // 注册方式 | let registerSegmentedValue = ref<String>('求职者注册') // 注册方式 | ||||
| let createForm = ref<LoginType.LoginFormType>(dataForm) | let createForm = ref<LoginType.LoginFormType>(dataForm) | ||||
| let smsLoginForm = ref<LoginType.SmsLoginFormType>(smsLoginDataForm) | let smsLoginForm = ref<LoginType.SmsLoginFormType>(smsLoginDataForm) |