@@ -1,14 +1,14 @@ | |||
<!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> |
@@ -10,15 +10,16 @@ export const PostCompanyRegister = postModel(url.CompanyRegister); | |||
export const GetCaptcha = getModel(url.Captcha); | |||
export const PostSmsSend = postModel(url.SmsSend); | |||
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 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); // 推荐简历 | |||
@@ -124,7 +125,7 @@ export const GetRecruitmentbookDetail = getModel(url.RecruitmentbookDetail); // | |||
// 列表 | |||
export const PostJobseekerList = postModel(url.JobseekerList); | |||
export const GetJobseekerDetail = getModel(url.JobseekerDetail); | |||
export const GetViewhistoryList = getModel(url.ViewhistoryList); | |||
export const PostPersonInterviewViewStatus = postModel(url.PersonInterviewViewStatus); | |||
export const GetPersonInterviewList = getModel(url.PersonInterviewList); |
@@ -8,6 +8,8 @@ declare namespace urlType { | |||
Captcha : String, | |||
SmsSend : String, | |||
JobseekerSmsLogin : String, | |||
CustomerVerify : String, | |||
JobseekerEditPwd : String, | |||
// 招聘会 | |||
RecruitmentBookcompany : String, | |||
@@ -102,15 +104,13 @@ declare namespace urlType { | |||
RecruitmentbookList : String, | |||
RecruitmentbookDetail : String, | |||
CompanyProbationList: String, | |||
// 知名/推荐企业 | |||
CompanyFamousList: String, | |||
// 简历 | |||
// 列表 | |||
'JobseekerList' : String, // 查看 | |||
'JobseekerDetail' : String, // 详情 | |||
ViewhistoryList: String, // 详情 | |||
ViewHistoryList: String, // 详情 | |||
PersonInterviewList: String, // 面试邀请记录 | |||
PersonInterviewViewStatus: String, // 是否参加面试 | |||
PersonInterviewDel: String, // 删除面试邀请 |
@@ -11,6 +11,9 @@ export const url : urlType.url = { | |||
Captcha: common + '/captcha', // 获取验证码 | |||
SmsSend: common + '/sms/send', // 短信验证码 | |||
JobseekerSmsLogin: web + '/jobseeker/smslogin', // 个人登录 | |||
CustomerVerify: web + '/customer/verify', // 转换为HR | |||
JobseekerEditPwd: web + '/jobseek/edit_pwd', // 修改密码 | |||
// 招聘会 | |||
@@ -104,10 +107,7 @@ export const url : urlType.url = { | |||
RecruitmentbookList: web + '/recruitmentbook/list', // 列表 | |||
RecruitmentbookDetail: web + '/recruitmentbook/detail', // 详情 | |||
// 见习基地 | |||
CompanyProbationList: web + '/company/probation_list', // 列表 | |||
// 知名/推荐企业 | |||
CompanyFamousList: web + '/company/famous_list', // 详情 | |||
// 反馈 | |||
FeedbackAdd: common + '/feedback/add', // 添加 | |||
@@ -119,7 +119,7 @@ export const url : urlType.url = { | |||
// 简历 | |||
JobseekerList: web + '/jobseeker/list', // 获取简历完整资料列表 | |||
JobseekerDetail: web + '/jobseeker/detail', // 获取简历完整资料 | |||
ViewhistoryList: web + '/viewhistory/list', // 简历被查看次数 | |||
ViewHistoryList: web + '/viewhistory/list', // 简历被查看次数 | |||
PersonInterviewList: web + '/person/interview_list', // 面试邀请记录 | |||
PersonInterviewViewStatus: web + '/person/interview_view_status', // 是否参加面试 | |||
PersonInterviewDel: web + '/person/interview_del', // 删除面试邀请 |
@@ -15,7 +15,7 @@ | |||
</a-page-header> | |||
</template> | |||
<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 }"> | |||
<a-list-item @click="toDetail(item)"> | |||
<a-list-item-meta> |
@@ -0,0 +1,142 @@ | |||
<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> |
@@ -0,0 +1,8 @@ | |||
<template> | |||
</template> | |||
<script> | |||
</script> | |||
<style> | |||
</style> |
@@ -0,0 +1,177 @@ | |||
<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> |
@@ -0,0 +1,142 @@ | |||
<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> |
@@ -3,8 +3,7 @@ | |||
<a-col span="18"> | |||
<a-row> | |||
<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 span="16" style="color: aliceblue;"> | |||
<a-top-menu></a-top-menu> | |||
@@ -91,12 +90,12 @@ | |||
</a-menu-item> | |||
<a-menu-item key="6"> | |||
<a-space :size="80"> | |||
<div>修改密码</div> | |||
<div>成为招聘者</div> | |||
</a-space> | |||
</a-menu-item> | |||
<a-menu-item key="7"> | |||
<a-space :size="80"> | |||
<div @click="quit">安全退出</div> | |||
<div @click="quit">安全退出</div> | |||
</a-space> | |||
</a-menu-item> | |||
</a-menu> | |||
@@ -108,41 +107,52 @@ | |||
</a-dropdown> | |||
</template> | |||
</template> | |||
<template v-else > | |||
<div @click="toLogin" style="cursor: pointer;"> | |||
登录/注册 | |||
</div> | |||
<template v-else> | |||
<div @click="toLogin" style="cursor: pointer;"> | |||
登录/注册 | |||
</div> | |||
</template> | |||
</div> | |||
</a-col> | |||
</a-row> | |||
</a-col> | |||
</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> | |||
<script lang="ts" setup> | |||
import { ref, onMounted, computed, defineProps, defineEmits } from '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 { router } from '@/router/index'; | |||
const emit = defineEmits(); | |||
// 成为招聘者 | |||
let openHr = ref<Boolean>(false); | |||
let form = ref({ | |||
code: '' | |||
}) | |||
const token = computed(() => { | |||
return store.state.token | |||
}) | |||
const role = computed(() => { | |||
return store.state.role | |||
}) | |||
const pageType = computed(() => { | |||
return store.state.pageType | |||
}) | |||
const toLogin = () => { | |||
router.push('/login') | |||
} | |||
const quit = () => { | |||
store.commit('setShowLoginBox', { | |||
showLoginBox: true | |||
@@ -152,7 +162,7 @@ | |||
store.commit('permissions/SET_MENU', []) | |||
router.push('/job/home') | |||
} | |||
const returnHome = () => { | |||
store.commit('getPageType', { | |||
pageType: '' | |||
@@ -165,9 +175,9 @@ | |||
store.commit('permissions/SET_MENU', []) | |||
router.push('/job/home') | |||
} | |||
const handleMenuClick = (val) => { | |||
if(val.key == 3) { | |||
if (val.key == 3) { | |||
store.commit('getPageType', { | |||
pageType: 'company' | |||
}) | |||
@@ -176,7 +186,7 @@ | |||
store.commit('permissions/SET_MENU', []) | |||
router.push('/manage/home') | |||
} | |||
if(val.key == 6) { | |||
if (val.key == 6) { | |||
store.commit('getPageType', { | |||
pageType: 'company' | |||
}) | |||
@@ -187,7 +197,7 @@ | |||
} | |||
} | |||
const personalMenuClick = (val) => { | |||
if(val.key == 3) { | |||
if (val.key == 3) { | |||
store.commit('getPageType', { | |||
pageType: 'personal' | |||
}) | |||
@@ -196,7 +206,7 @@ | |||
store.commit('permissions/SET_MENU', []) | |||
router.push('/jobseeker/home') | |||
} | |||
if(val.key == 4) { | |||
if (val.key == 4) { | |||
store.commit('getPageType', { | |||
pageType: 'personal' | |||
}) | |||
@@ -205,7 +215,7 @@ | |||
store.commit('permissions/SET_MENU', []) | |||
router.push('/jobseeker/resume') | |||
} | |||
if(val.key == 5) { | |||
if (val.key == 5) { | |||
store.commit('getPageType', { | |||
pageType: '' | |||
}) | |||
@@ -217,8 +227,13 @@ | |||
store.commit('permissions/SET_MENU', []) | |||
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', { | |||
pageType: 'personal' | |||
}) | |||
@@ -228,8 +243,24 @@ | |||
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> | |||
<style lang="less" scoped> | |||
@@ -249,10 +280,9 @@ | |||
justify-content: flex-end; | |||
color: #fff; | |||
} | |||
:deep(.ant-btn) { | |||
margin-right: 20px !important; | |||
} | |||
</style> |
@@ -37,6 +37,8 @@ const JobseekerResumeRoute : AppRouteRecordRaw = { | |||
}, | |||
}; | |||
// 职位搜索 | |||
const JobseekerSearchRoute : AppRouteRecordRaw = { | |||
path: '/jobseeker/search', | |||
@@ -48,6 +50,16 @@ const JobseekerSearchRoute : AppRouteRecordRaw = { | |||
}, | |||
}; | |||
const JobseekerPasswordRoute : AppRouteRecordRaw = { | |||
path: '/jobseeker/password', | |||
name: 'JobseekerPassword', | |||
component: routerList.JobseekerPassword, | |||
meta: { | |||
title: '修改密码', | |||
icon: HomeOutlined | |||
}, | |||
}; | |||
@@ -57,5 +69,6 @@ export const routesJobseekerModuleList : AppRouteModule[] = [ | |||
JobseekerHomeRoute, | |||
JobseekerRecommendRoute, | |||
JobseekerResumeRoute, | |||
JobseekerSearchRoute | |||
JobseekerSearchRoute, | |||
JobseekerPasswordRoute | |||
]; |
@@ -33,6 +33,7 @@ import JobseekerHome from '@/views/jobseeker/home/index.vue'; | |||
import JobseekerRecommend from '@/views/jobseeker/recommend/index.vue'; | |||
import JobseekerResume from '@/views/jobseeker/resume/index.vue'; | |||
import JobseekerSearch from '@/views/jobseeker/search/index.vue'; | |||
import JobseekerPassword from '@/views/jobseeker/password/index.vue'; | |||
export const routerList = { | |||
Home, | |||
@@ -64,5 +65,6 @@ export const routerList = { | |||
JobseekerHome, | |||
JobseekerRecommend, | |||
JobseekerResume, | |||
JobseekerSearch | |||
JobseekerSearch, | |||
JobseekerPassword | |||
} |
@@ -2,7 +2,9 @@ | |||
<div v-if="mode== 'detail'"> | |||
<a-page-header> | |||
<template #title> | |||
<a-button @click="back" type="link"><ArrowLeftOutlined />前往更多求职</a-button> | |||
<a-button @click="back" type="link"> | |||
<ArrowLeftOutlined />前往更多求职 | |||
</a-button> | |||
</template> | |||
<a-list item-layout="vertical"> | |||
<a-list-item> | |||
@@ -52,6 +54,27 @@ | |||
<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="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 :key="2" tab="招聘职位" force-render> | |||
<template v-if="!jobList || jobList.length == 0"> | |||
@@ -64,20 +87,22 @@ | |||
<template v-else> | |||
<a-row :gutter="10"> | |||
<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 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> | |||
</div> | |||
</a-col> | |||
@@ -88,7 +113,7 @@ | |||
</a-page-header> | |||
</div> | |||
<div v-else> | |||
<job-list @detail="showDetail"></job-list> | |||
<job-list @detail="showDetail"></job-list> | |||
<job-internship @detail="showDetail"></job-internship> | |||
<!-- <job-detail></job-detail> --> | |||
</div> | |||
@@ -100,6 +125,7 @@ | |||
import JobCard from '@/components/job/card/index.vue' | |||
import JobList from '@/components/job/list/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 { ArrowLeftOutlined } from '@ant-design/icons-vue'; | |||
import { router } from '@/router'; | |||
@@ -132,7 +158,7 @@ | |||
current.value = page | |||
getJobCompanyjobs() | |||
} | |||
const back = (page) => { | |||
sessionStorage.removeItem('pubilc_id') | |||
sessionStorage.removeItem('mode') | |||
@@ -140,7 +166,7 @@ | |||
sessionStorage.removeItem('job_id') | |||
mode.value = sessionStorage.getItem('mode') | |||
} | |||
const showDetail = (page) => { | |||
mode.value = sessionStorage.getItem('mode') | |||
activeKey.value = sessionStorage.getItem('tab_key') ? Number(sessionStorage.getItem('tab_key')) : 1 | |||
@@ -148,13 +174,13 @@ | |||
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) { | |||
PostCompanyInfo({ id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id') }).then(res => { | |||
companyDetail.value = res.data | |||
}) | |||
companyDetail.value = res.data | |||
}) | |||
getJobCompanyjobs() | |||
} | |||
} | |||
onMounted(() => { | |||
if (mode.value == 'detail') { | |||
@@ -162,8 +188,8 @@ | |||
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) { | |||
PostCompanyInfo({ id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id') }).then(res => { | |||
companyDetail.value = res.data | |||
}) | |||
companyDetail.value = res.data | |||
}) | |||
getJobCompanyjobs() | |||
} | |||
} | |||
@@ -173,7 +199,7 @@ | |||
sessionStorage.removeItem('pubilc_id') | |||
sessionStorage.removeItem('mode') | |||
sessionStorage.removeItem('tab_key') | |||
sessionStorage.removeItem('job_id') | |||
sessionStorage.removeItem('job_id') | |||
}) | |||
</script> | |||
@@ -8,7 +8,9 @@ | |||
<a-list-item-meta> | |||
<template #title> | |||
{{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 #description> | |||
会员编号:{{basic.id}} | |||
@@ -18,16 +20,35 @@ | |||
</template> | |||
</a-list-item-meta> | |||
<div style="margin-left: 108px;"> | |||
<a-descriptions :column="2"> | |||
<a-descriptions :column="3"> | |||
<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> | |||
</div> | |||
</a-list-item> | |||
@@ -35,59 +56,20 @@ | |||
</div> | |||
</a-col> | |||
<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-row> | |||
</div> | |||
@@ -96,25 +78,33 @@ | |||
<script setup lang="ts"> | |||
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'; | |||
let { commomParams, ExclamationCircleOutlined, Modal } = useCommon(); | |||
let { commomParams, ExclamationCircleOutlined, Modal, onMenu } = useCommon(); | |||
let jobList = ref<object[]>([]) | |||
let basic = ref<Object>({}) | |||
let seeLength = ref<Number>(0) | |||
const toResume = () => { | |||
debugger | |||
onMenu('/jobseeker/resume') | |||
} | |||
onMounted(() => { | |||
GetJobseekerDetail({ customer_id: sessionStorage.getItem('id') }).then(res => { | |||
basic.value = res.data | |||
}) | |||
GetViewhistoryList().then(res => { | |||
GetViewHistoryList().then(res => { | |||
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({ | |||
title: `您有${res.data.list.length}条待查看面试邀请`, | |||
centered: true, | |||
@@ -122,10 +112,10 @@ | |||
okText: '前往查看', | |||
cancelText: '关闭', | |||
onOk() { | |||
}, | |||
onCancel() { | |||
}, | |||
}); | |||
} |
@@ -0,0 +1,157 @@ | |||
<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> |
@@ -150,7 +150,7 @@ | |||
let { store, ExclamationCircleOutlined, Modal } = useCommon(); | |||
let currentModule = ref<String>('login') // 当前模块 login 登录 resiter 注册 | |||
let loginSegmentedValue = ref<String>('我要求职') // 个人或者企业 // 我要求职 个人求职 我要招聘 企业 | |||
let loginMethod = ref<String>('password') // 登录方式 // password 密码登录 message 短信登录 | |||
let loginMethod = ref<String>('message') // 登录方式 // password 密码登录 message 短信登录 | |||
let registerSegmentedValue = ref<String>('求职者注册') // 注册方式 | |||
let createForm = ref<LoginType.LoginFormType>(dataForm) | |||
let smsLoginForm = ref<LoginType.SmsLoginFormType>(smsLoginDataForm) |