| @@ -0,0 +1 @@ | |||
| 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}; | |||
| @@ -0,0 +1 @@ | |||
| .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} | |||
| @@ -4,9 +4,10 @@ | |||
| <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-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> | |||
| <body> | |||
| <div id="app"></div> | |||
| @@ -4,7 +4,8 @@ | |||
| <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 src="https://map.qq.com/api/gljs?v=1.exp&key=MPBBZ-HUICZ-EGRXB-7AHZI-R4GQZ-QWBSO"></script> | |||
| <title>菊城人才网</title> | |||
| </head> | |||
| <body> | |||
| <div id="app"></div> | |||
| @@ -58,8 +58,10 @@ instance.interceptors.response.use(function (response) { | |||
| case 403: | |||
| msgModel(response.data.msg) | |||
| break; | |||
| case 404: | |||
| break; | |||
| 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) | |||
| } else { | |||
| msgModel(response.data.msg) | |||
| @@ -124,7 +124,7 @@ export const PostRecruitmentbookUpdate = postModel(url.RecruitmentbookUpdate); / | |||
| export const GetRecruitmentbookList = getModel(url.RecruitmentbookList); // 列表 | |||
| export const GetRecruitmentbookDetail = getModel(url.RecruitmentbookDetail); // 详情 | |||
| // 收藏 | |||
| // 收藏 | |||
| export const PostJobseekAddfavorite = postModel(url.JobseekAddfavorite); | |||
| export const PostJobseekDelfavorite = postModel(url.JobseekDelfavorite); | |||
| export const PostJobseekUpdatefavorite = postModel(url.JobseekUpdatefavorite); | |||
| @@ -136,6 +136,9 @@ export const PostJobseekDelapplication = postModel(url.JobseekDelapplication); | |||
| export const PostJobseekUpdateapplication = postModel(url.JobseekUpdateapplication); | |||
| export const GetJobseekListapplication = getModel(url.JobseekListapplication); | |||
| export const GetJobseekApplicationdetail = getModel(url.JobseekApplicationdetail); | |||
| export const GetJobseekerReommendJob = getModel(url.JobseekerReommendJob); | |||
| export const PosCompanySearch = postModel(url.CompanySearch); | |||
| // 简历 | |||
| // 列表 | |||
| @@ -172,19 +175,19 @@ export const PostJobapplicantDeltraining = postModel(url.JobapplicantDeltraining | |||
| export const PostJobapplicantUpdatetraining = postModel(url.JobapplicantUpdatetraining); | |||
| export const PostJobapplicantListtraining = getModel(url.JobapplicantListtraining); | |||
| export const PostJobapplicantTrainingdetail = getModel(url.JobapplicantTrainingdetail); | |||
| // 求职意向-基本 | |||
| // 求职意向-基本 | |||
| export const PostJobapplicantAdddesirebase = postModel(url.JobapplicantAdddesirebase); | |||
| export const PostJobapplicantDeldesirebase = postModel(url.JobapplicantDeldesirebase); | |||
| export const PostJobapplicantUpdatedesirebase = postModel(url.JobapplicantUpdatedesirebase); | |||
| export const PostJobapplicantListdesirebase = getModel(url.JobapplicantListdesirebase); | |||
| // export const PostJobapplicantListdesirebase = getModel(url.JobapplicantListdesirebase); | |||
| export const PostJobapplicantDesirebasedetail = getModel(url.JobapplicantDesirebasedetail); | |||
| // 求职意向-地区 | |||
| // 求职意向-地区 | |||
| export const PostJobapplicantAdddesirearea = postModel(url.JobapplicantAdddesirearea); | |||
| export const PostJobapplicantDeldesirearea = postModel(url.JobapplicantDeldesirearea); | |||
| export const PostJobapplicantUpdatedesirearea = postModel(url.JobapplicantUpdatedesirearea); | |||
| export const PostJobapplicantListdesirearea = getModel(url.JobapplicantListdesirearea); | |||
| export const PostJobapplicantDesireareadetail = getModel(url.JobapplicantDesireareadetail); | |||
| // 求职意向-职位 | |||
| // 求职意向-职位 | |||
| export const PostJobapplicantAdddesireindustry = postModel(url.JobapplicantAdddesireindustry); | |||
| export const PostJobapplicantDeldesireindustry = postModel(url.JobapplicantDeldesireindustry); | |||
| export const PostJobapplicantUpdatedesireindustry = postModel(url.JobapplicantUpdatedesireindustry); | |||
| @@ -119,6 +119,9 @@ declare namespace urlType { | |||
| 'JobseekListapplication': String, | |||
| 'JobseekApplicationdetail':String, | |||
| JobseekerReommendJob: String, | |||
| CompanySearch: String, | |||
| // 简历 | |||
| // 列表 | |||
| @@ -128,6 +128,10 @@ export const url : urlType.url = { | |||
| PersonInterviewList: web + '/person/interview_list', // 面试邀请记录 | |||
| PersonInterviewViewStatus: web + '/person/interview_view_status', // 是否参加面试 | |||
| PersonInterviewDel: web + '/person/interview_del', // 删除面试邀请 | |||
| JobseekerReommendJob: web + '/jobseeker/recommendjob', | |||
| CompanySearch: web + '/company/search', | |||
| // 收藏 | |||
| 'JobseekAddfavorite': web + '/jobseek/addfavorite', // 添加 | |||
| @@ -185,11 +189,11 @@ export const url : urlType.url = { | |||
| 'JobapplicantListdesirearea': web + '/jobapplicant/listdesirearea', // 查看 | |||
| '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', // 添加 | |||
| 'JobapplicantDelcertificate': web + '/jobapplicant/delcertificate', // 删除 | |||
| @@ -1,6 +1,6 @@ | |||
| <template> | |||
| <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> | |||
| </a-affix> | |||
| @@ -25,5 +25,8 @@ | |||
| } | |||
| </script> | |||
| <style> | |||
| <style scoped> | |||
| :deep(.ant-menu-item-selected) { | |||
| color: #4FBE70 !important; | |||
| } | |||
| </style> | |||
| @@ -1,7 +1,7 @@ | |||
| <template> | |||
| <div> | |||
| <template v-if="state"> | |||
| <a-form :model="createForm" layout="vertical"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="12"> | |||
| <a-form-item label="企业名称" name="full_name"> | |||
| @@ -1,6 +1,6 @@ | |||
| <template> | |||
| <template v-if="state"> | |||
| <a-form :model="createForm" layout="vertical"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="12"> | |||
| <a-form-item label="部门名称" name="name"> | |||
| @@ -39,7 +39,7 @@ | |||
| </a-form> | |||
| </template> | |||
| <template v-else> | |||
| <a-search @searchData="searchData"></a-search> | |||
| <!-- <a-search @searchData="searchData"></a-search> --> | |||
| <a-list :data-source="departmengList"> | |||
| <template #loadMore> | |||
| <div v-if="!loading" | |||
| @@ -204,5 +204,8 @@ | |||
| </script> | |||
| <style> | |||
| <style scoped> | |||
| :deep(.ant-list-item:last-child) { | |||
| border-block-end: none !important; | |||
| } | |||
| </style> | |||
| @@ -1,7 +1,7 @@ | |||
| <template> | |||
| <div> | |||
| <template v-if="state"> | |||
| <a-form :model="createForm" layout="vertical"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-form-item label="上传企业图片" name="photo"> | |||
| <upload upload_txt="上传企业图片" @uploadSuccess="uploadPhotoSuccess" | |||
| @@ -1,7 +1,7 @@ | |||
| <template> | |||
| <div> | |||
| <template v-if="state"> | |||
| <a-form :model="createForm" layout="vertical"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-form-item label="上传营业执照" name="photo"> | |||
| <upload upload_txt="上传营业执照" @uploadSuccess="uploadPhotoSuccess" | |||
| @@ -5,11 +5,11 @@ | |||
| <div class="steps-content"> | |||
| <div v-show="current == 0"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="24"> | |||
| <a-col span="12"> | |||
| <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-form-item> | |||
| </a-col> | |||
| @@ -17,7 +17,7 @@ | |||
| <a-form-item label="选择部门" name="department_id"> | |||
| <a-select v-model:value="addOtherForm.department_name" @change="departmentChange" | |||
| 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" | |||
| :label="item.name" label-in-value>{{item.name}}</a-select-option> | |||
| </a-select> | |||
| @@ -25,12 +25,12 @@ | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <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-col> | |||
| <a-col span="12"> | |||
| <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-col> | |||
| <a-col span="12"> | |||
| @@ -63,18 +63,18 @@ | |||
| <a-col span="12"> | |||
| <a-form-item required label="有效天数" name="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-col> | |||
| <a-col span="12"> | |||
| <a-form-item required label="到期日期"> | |||
| <a-date-picker v-model:value="addOtherForm.daoqi_date" @Change="disabledDateChange" | |||
| style="width: 100%;" /> | |||
| style="width: 100%;" size="large"/> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <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-col> | |||
| <a-col span="12"> | |||
| @@ -162,14 +162,14 @@ | |||
| <a-col span="12"> | |||
| <a-form-item label="最小年龄" name="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-col> | |||
| <a-col span="12"> | |||
| <a-form-item label="最大年龄" name="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-col> | |||
| <a-col span="12"> | |||
| @@ -183,7 +183,7 @@ | |||
| </a-col> | |||
| <a-col span="12"> | |||
| <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-col> | |||
| <a-col span="12"> | |||
| @@ -564,4 +564,9 @@ | |||
| .steps-action { | |||
| margin-top: 12px; | |||
| } | |||
| :deep(.ant-steps-item-icon) { | |||
| background-color: #4FBE70 !important; | |||
| border-color: #4FBE70 !important; | |||
| } | |||
| </style> | |||
| @@ -1,5 +1,5 @@ | |||
| <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" | |||
| @page="getPage" :loading="loading"> | |||
| <template #default="{ record }"> | |||
| @@ -7,17 +7,19 @@ | |||
| <a-popconfirm title="是否要申请参加该招聘会?" @confirm="applyFor(record.id)"> | |||
| <a-col><a-button type="primary" size="small">申请</a-button></a-col> | |||
| </a-popconfirm> | |||
| <a-popconfirm placement="topLeft" ok-text="关闭" @confirm="confirm"> | |||
| <a-popconfirm placement="left" ok-text="关闭" @confirm="confirm"> | |||
| <template #icon></template> | |||
| <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> | |||
| </a-typography-text> | |||
| </a-typography> | |||
| </div> | |||
| </a-card> | |||
| </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-row> | |||
| </template> | |||
| @@ -86,17 +88,15 @@ | |||
| // 申请 | |||
| const applyFor = (val) => { | |||
| PostRecruitmentbookAdd({ recruitment_id: val, company_id: 0}).then(res => { | |||
| PostRecruitmentbookAdd({ recruitment_id: val, company_id: 0 }).then(res => { | |||
| successToast('预定成功') | |||
| }) | |||
| } | |||
| // 详情 | |||
| let detailData = ref<object>({}) | |||
| const toDetail = (val) => { | |||
| PostRecruitmentbookAdd({ id: val}).then(res => { | |||
| detailData.value = res.data | |||
| }) | |||
| const toDetail = (data) => { | |||
| detailData.value = data | |||
| } | |||
| </script> | |||
| @@ -18,11 +18,10 @@ | |||
| <StarOutlined /> | |||
| 预览 | |||
| </a-button> | |||
| <a-button> | |||
| <StarOutlined /> | |||
| 收藏 | |||
| <a-button @click="putInTatent(item.customer_id)"> | |||
| 放入人才库 | |||
| </a-button> | |||
| <a-button> | |||
| <a-button @click="interview(item)"> | |||
| 邀请面试 | |||
| </a-button> | |||
| </template> | |||
| @@ -66,16 +65,30 @@ | |||
| </a-flex> | |||
| </a-col> | |||
| </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> | |||
| </template> | |||
| </template> | |||
| <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 { PostJobseekerList } from '@/apis/models'; | |||
| import { PostJobseekerList, PostCompanyTalentPoolAdd, PostCompanyResumeInterviewAdd, PostCompanyJobList } from '@/apis/models'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| 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 seekerList = ref<object[]>([]) | |||
| let loading = ref<Boolean>(true); | |||
| @@ -116,13 +129,84 @@ | |||
| detail_record.value = record; | |||
| 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) => { | |||
| if (newVal[0] ) { | |||
| if (newVal[0]) { | |||
| commomParams.value.search = newVal[0]; | |||
| getData(); | |||
| } | |||
| @@ -9,7 +9,7 @@ | |||
| <template #overlay> | |||
| <a-menu> | |||
| <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 key="2"> | |||
| <a-button @click="edit(record)" block>查看联系方式</a-button> | |||
| @@ -25,18 +25,20 @@ | |||
| </a-row> | |||
| </template> | |||
| </a-biaoge> | |||
| <resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail> | |||
| </template> | |||
| <script setup lang="ts"> | |||
| import { ref, onMounted, computed, defineEmits, createVNode } from 'vue'; | |||
| import { GetCompanyResumeViewedContactList } from '@/apis/models'; | |||
| import ASearch from '@/components/company/resume/read/search.vue'; | |||
| import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue' | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| import { cols } from '@/components/company/resume/read/columns'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| import { DownOutlined } from '@ant-design/icons-vue'; | |||
| const emit = defineEmits(); | |||
| let { commomParams, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| let { commomParams, ExclamationCircleOutlined, Modal, showOtherModal1 } = useCommon(); | |||
| let loading = ref<Boolean>(true); | |||
| onMounted(() => { | |||
| @@ -110,6 +112,11 @@ | |||
| }); | |||
| } | |||
| let detail_record = ref<Object>(null) | |||
| const detail = (record) => { | |||
| detail_record.value = record; | |||
| showOtherModal1() | |||
| } | |||
| // const del = (id : number) => { | |||
| // commomParams.value.delParam = { id: id }; | |||
| @@ -12,7 +12,7 @@ | |||
| <a-button @click="contact(record)" block>查看联系方式</a-button> | |||
| </a-menu-item> | |||
| <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 key="2"> | |||
| <a-button @click="interview(record)" block>邀请面试</a-button> | |||
| @@ -35,21 +35,23 @@ | |||
| </template> | |||
| </a-biaoge> | |||
| <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> | |||
| <resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail> | |||
| </template> | |||
| <script setup lang="ts"> | |||
| import { ref, onMounted, computed, defineEmits, createVNode } from 'vue'; | |||
| import { GetCompanyResumeList, PostCompanyResumeInterviewAdd, PostCompanyTalentPoolAdd, PostCompanyResumeRecycle, GetJobapplicantContactdetail } from '@/apis/models'; | |||
| import ASearch from '@/components/company/resume/interview/search.vue'; | |||
| import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue' | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| import { cols } from '@/components/company/resume/interview/columns'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| import { DownOutlined } from '@ant-design/icons-vue'; | |||
| const emit = defineEmits(); | |||
| let { commomParams, ExclamationCircleOutlined, Modal, dayjs, disabledDate } = useCommon(); | |||
| let { commomParams, ExclamationCircleOutlined, Modal, dayjs, disabledDate, showOtherModal1 } = useCommon(); | |||
| const dayjsRef = ref(dayjs); | |||
| let loading = ref<Boolean>(true); | |||
| @@ -102,8 +104,7 @@ | |||
| loading.value = false; | |||
| } | |||
| } | |||
| const contact = () => { | |||
| Modal.confirm({ | |||
| title: `是否要放入人才库`, | |||
| @@ -116,11 +117,11 @@ | |||
| }) | |||
| }, | |||
| onCancel() { | |||
| }, | |||
| }); | |||
| } | |||
| // 邀请面试 | |||
| let openInterview = ref<Boolean>(false); | |||
| @@ -150,13 +151,18 @@ | |||
| } else { | |||
| PostCompanyResumeInterviewAdd(form).then(res => { | |||
| successToast('已发送邀请') | |||
| openInterview.value = false | |||
| getData(); | |||
| }) | |||
| } | |||
| } | |||
| let detail_record = ref<Object>(null) | |||
| const detail = (record) => { | |||
| detail_record.value = record; | |||
| showOtherModal1() | |||
| } | |||
| @@ -18,19 +18,19 @@ | |||
| <template v-else> | |||
| <a-list item-layout="horizontal" :data-source="articleList"> | |||
| <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> | |||
| <template #extra> | |||
| <!-- <template #extra> | |||
| <a-button @click="download(item.cover_img)">下载</a-button> | |||
| </template> | |||
| </template> --> | |||
| </a-list-item> | |||
| </template> | |||
| </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> | |||
| </div> | |||
| </template> | |||
| @@ -43,13 +43,23 @@ | |||
| let articleList = ref<object[]>([]) | |||
| let detail = ref<Object>(null) | |||
| 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) => { | |||
| 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) => { | |||
| detail.value = data | |||
| } | |||
| @@ -58,10 +68,10 @@ | |||
| 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) => { | |||
| @@ -0,0 +1,398 @@ | |||
| <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> | |||
| @@ -18,15 +18,15 @@ | |||
| <a-list item-layout="horizontal" :data-source="articleList"> | |||
| <template #renderItem="{ 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> | |||
| </template> | |||
| </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> | |||
| @@ -38,10 +38,18 @@ | |||
| let articleList = ref<object[]>([]) | |||
| let detail = ref<Object>(null) | |||
| 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) => { | |||
| 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; | |||
| }) | |||
| } | |||
| @@ -5,7 +5,7 @@ | |||
| <a-space direction="vertical" :size="20"> | |||
| <a-flex justify="space-between" style="width: 100%;"> | |||
| <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 style="width: 100%;"> | |||
| <a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag> | |||
| @@ -15,7 +15,7 @@ | |||
| </a-flex> | |||
| <a-flex justify="flex-end"> | |||
| <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-flex> | |||
| </a-space> | |||
| @@ -5,10 +5,10 @@ | |||
| <a-col span="24"> | |||
| <a-row :gutter="[10,20]" type="flex"> | |||
| <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> | |||
| <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-row> | |||
| </a-col> | |||
| @@ -22,19 +22,30 @@ | |||
| </a-col> | |||
| </a-row> | |||
| </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-row> | |||
| <div style="margin-top: 30px;" v-if="detail"> | |||
| <div style="margin-top: 30px;" v-if="detail"> | |||
| <a-descriptions :column="2" title="职位描述"> | |||
| <a-descriptions-item label="职位性质">{{detail.company.nature_text}}</a-descriptions-item> | |||
| <a-descriptions-item label="招聘人数">{{detail.base.invite_count}}人</a-descriptions-item> | |||
| @@ -45,7 +56,7 @@ | |||
| <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.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.base.types ? detail.base.types[0].name : '未知'}}</a-descriptions-item> | |||
| @@ -53,26 +64,143 @@ | |||
| 查看 | |||
| </a-button></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> | |||
| </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> | |||
| <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 job_id = ref<Number>(0) | |||
| 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 = () => { | |||
| GetJobDetail({ id: job_id.value }).then(res => { | |||
| 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) => { | |||
| job_id.value = newVal | |||
| if (job_id.value) { | |||
| mapContainer.value = null | |||
| getDetail() | |||
| } | |||
| }, { immediate: true }) | |||
| @@ -82,4 +210,9 @@ | |||
| :deep(.ant-btn) { | |||
| border-radius: 0 !important; | |||
| } | |||
| .map-container { | |||
| width: 100%; | |||
| height: 400px; | |||
| } | |||
| </style> | |||
| @@ -1,17 +1,22 @@ | |||
| <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> | |||
| <script setup lang="ts"> | |||
| @@ -78,36 +83,5 @@ | |||
| </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> | |||
| @@ -1,38 +1,35 @@ | |||
| <template> | |||
| <a-row :gutter="[10,10]"> | |||
| <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-row> | |||
| <a-flex justify="center"> | |||
| <a-space :size="50"> | |||
| <div style="font-size: 36px;">更多职位</div> | |||
| </a-space> | |||
| </a-flex> | |||
| </template> | |||
| <script setup lang="ts"> | |||
| @@ -57,36 +54,11 @@ | |||
| <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> | |||
| @@ -1,17 +1,105 @@ | |||
| <!-- slice(0,6), 6,14 --> | |||
| <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)"> | |||
| <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> | |||
| :imgObj="{src: imageprefix + item.image_url, width: adposition.width+'px',height: adposition.height+'px',mode: 'fill'}"></image-container> | |||
| </a-flex> | |||
| </div> | |||
| </template> | |||
| @@ -19,78 +107,23 @@ | |||
| <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>{{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> | |||
| <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> | |||
| <script setup lang="ts"> | |||
| import { ref, computed, onMounted } from 'vue'; | |||
| import { GetAdvertscheduleList, GetArticleList } from '@/apis/models'; | |||
| import { router } from '@/router'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { imageprefix } = useCommon(); | |||
| let data1 = ref([]) | |||
| let data2 = ref([]) | |||
| let adposition = ref(null) | |||
| @@ -138,25 +171,24 @@ | |||
| </script> | |||
| <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> | |||
| @@ -1,11 +1,11 @@ | |||
| <template> | |||
| <!-- <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="企业推荐"> | |||
| <div class="company-box"> | |||
| <a-row :gutter="[10,10]"> | |||
| <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-row> | |||
| </div> | |||
| @@ -14,7 +14,7 @@ | |||
| <div class="company-box"> | |||
| <a-row :gutter="[10,10]"> | |||
| <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-row> | |||
| </div> | |||
| @@ -1,51 +1,98 @@ | |||
| <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 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> | |||
| <!-- 企业显示 --> | |||
| <!-- <a-tabs v-model:activeKey="activeKey"> | |||
| <a-tab-pane key="1" tab="推荐人才"> | |||
| @@ -71,27 +118,35 @@ | |||
| </template> | |||
| <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 JobCard from '@/components/job/card/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'; | |||
| let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| const emit = defineEmits(); | |||
| let loading = ref<Boolean>(true); | |||
| let jobList = ref([]); | |||
| let companyList = ref([]); | |||
| let total = ref<Number>(0) | |||
| let mode = ref<Number>(1) | |||
| const searchData = (data : object) => { | |||
| commomParams.value.search = data | |||
| commomParams.value.search = data.search | |||
| mode.value = data.mode; | |||
| jobList.value = [] | |||
| companyList.value = [] | |||
| getData(); | |||
| } | |||
| const clearData = (data : object) => { | |||
| if (data) { | |||
| commomParams.value.search = data | |||
| commomParams.value.search = data.search | |||
| mode.value = data.mode; | |||
| jobList.value = [] | |||
| companyList.value = [] | |||
| } else { | |||
| commomParams.value.search = { | |||
| page: 1, | |||
| @@ -103,8 +158,8 @@ | |||
| } | |||
| getData(); | |||
| } | |||
| const getPage = (page, pageSize) => { | |||
| commomParams.value.search.page = page; | |||
| commomParams.value.search.pagesize = pageSize; | |||
| @@ -113,22 +168,36 @@ | |||
| const getData = async () => { | |||
| try { | |||
| 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 { | |||
| loading.value = false; | |||
| } | |||
| } | |||
| const toDetail = (job_id : Number, company_id : Number) => { | |||
| sessionStorage.setItem('job_id', job_id) | |||
| sessionStorage.setItem('tab_key', 2) | |||
| @@ -136,7 +205,7 @@ | |||
| sessionStorage.setItem('mode', 'detail') | |||
| emit('detail') | |||
| } | |||
| onMounted(() => { | |||
| getData(); | |||
| }) | |||
| @@ -17,16 +17,16 @@ | |||
| <template v-else> | |||
| <a-list item-layout="horizontal" :data-source="recruitmentList" style="cursor: pointer;"> | |||
| <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> | |||
| </template> | |||
| </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> | |||
| @@ -36,11 +36,23 @@ | |||
| import { ArrowLeftOutlined } from '@ant-design/icons-vue'; | |||
| let recruitmentList = ref<object[]>([]) | |||
| 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(() => { | |||
| PostRecruitmentList().then(res => { | |||
| recruitmentList.value = res.data.recruitments | |||
| }) | |||
| getRecruitmentList() | |||
| }) | |||
| const toDetail = (data) => { | |||
| @@ -0,0 +1,79 @@ | |||
| <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> | |||
| @@ -0,0 +1,17 @@ | |||
| <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> | |||
| @@ -1,22 +1,35 @@ | |||
| <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> | |||
| </template> | |||
| @@ -0,0 +1,25 @@ | |||
| <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> | |||
| @@ -1,12 +1,20 @@ | |||
| <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> | |||
| <script setup lang="ts"> | |||
| @@ -1,15 +1,15 @@ | |||
| <template> | |||
| <a-row :gutter="[10,16]" type="flex" justify="center" style="margin-bottom: 30px;"> | |||
| <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> | |||
| <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> | |||
| </template> | |||
| <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> | |||
| </template> | |||
| @@ -17,84 +17,120 @@ | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <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> | |||
| </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> | |||
| </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="公司规模"> | |||
| <template v-for="(item,index) in guimoList"> | |||
| <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> | |||
| </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> | |||
| @change="qiyeNatureChange(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 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 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="2">否</a-radio-button> | |||
| </a-radio-group> | |||
| </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> | |||
| </a-col> | |||
| </a-row> | |||
| @@ -107,53 +143,76 @@ | |||
| import { DownOutlined, UpOutlined } from '@ant-design/icons-vue'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| let props = defineProps(['search_params']); | |||
| let props = defineProps(['mode']); | |||
| const emit = defineEmits(); | |||
| 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 | |||
| }) | |||
| 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}) | |||
| } | |||
| } | |||
| // 清空搜索 | |||
| @@ -165,33 +224,44 @@ | |||
| sortby: 'asc', | |||
| 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) | |||
| } | |||
| @@ -294,7 +364,7 @@ | |||
| } | |||
| } | |||
| emit('searchData', commomParams.value.search) | |||
| emit('searchData', {search: commomParams.value.search,mode: 1}) | |||
| console.log(commomParams.value.search); | |||
| } | |||
| @@ -333,7 +403,7 @@ | |||
| commomParams.value.search[key] = 2; | |||
| } | |||
| } | |||
| emit('searchData', commomParams.value.search) | |||
| emit('searchData', {search: commomParams.value.search,mode: 1}) | |||
| } | |||
| // 薪酬范围 | |||
| @@ -354,7 +424,7 @@ | |||
| i.checked = i.id === item.id; | |||
| }); | |||
| commomParams.value.search.pay_range = item.id; | |||
| emit('searchData', commomParams.value.search) | |||
| emit('searchData', {search: commomParams.value.search,mode: 1}) | |||
| } | |||
| // 学历要求 | |||
| @@ -375,7 +445,7 @@ | |||
| i.checked = i.id === 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 = () => { | |||
| @@ -394,13 +464,22 @@ | |||
| guimoList.value = res.data.dicts | |||
| }) | |||
| } | |||
| const guimoChange = (item) => { | |||
| guimoList.value.forEach((i) => { | |||
| i.checked = i.id === 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[]>([]); | |||
| @@ -415,12 +494,12 @@ | |||
| }) | |||
| } | |||
| const natureChange = (item) => { | |||
| const qiyeNatureChange = (item) => { | |||
| natureList.value.forEach((i) => { | |||
| 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}) | |||
| } | |||
| // 更新时间 | |||
| @@ -440,11 +519,15 @@ | |||
| i.checked = i.id === 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}) | |||
| } | |||
| @@ -462,13 +545,16 @@ | |||
| /deep/ .ant-form-item { | |||
| margin-bottom: 0; | |||
| } | |||
| /deep/ .ant-tag-checkable-checked { | |||
| background-color: #4FBE70; | |||
| } | |||
| /deep/ .ant-input-group-addon { | |||
| background-color: #4FBE70; | |||
| } | |||
| :deep(.ant-select-selection-item) { | |||
| color: #ffffff !important; | |||
| } | |||
| </style> | |||
| @@ -9,16 +9,14 @@ | |||
| </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> | |||
| <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 span="24"> | |||
| <a-flex justify="center"> | |||
| @@ -96,7 +94,7 @@ | |||
| // emit('detail') | |||
| // } | |||
| onMounted(() => { | |||
| getData(); | |||
| }) | |||
| @@ -13,14 +13,22 @@ | |||
| <template #extra> | |||
| <a-button @click="cancelCollect(item.id,item.job_id)">取消收藏</a-button> | |||
| </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-col> | |||
| </a-row> | |||
| @@ -100,7 +108,7 @@ | |||
| }, | |||
| }); | |||
| } | |||
| let detail_record = ref<Object>(null) | |||
| const detail = (record) => { | |||
| detail_record.value = record; | |||
| @@ -9,26 +9,30 @@ | |||
| </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" @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 span="24"> | |||
| <a-flex justify="center"> | |||
| @@ -9,20 +9,14 @@ | |||
| </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 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 span="24"> | |||
| <a-flex justify="center"> | |||
| @@ -39,6 +33,7 @@ | |||
| import { ref, computed, onMounted, defineEmits, createVNode } from 'vue'; | |||
| import { GetViewHistoryList } from '@/apis/models'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| import { router } from '@/router'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| const emit = defineEmits(); | |||
| @@ -92,15 +87,25 @@ | |||
| } | |||
| } | |||
| // 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(() => { | |||
| getData(); | |||
| }) | |||
| @@ -1,7 +1,8 @@ | |||
| <template> | |||
| <div style="width: 100%;"> | |||
| <template v-if="state"> | |||
| <a-form :model="createForm" layout="vertical"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="12"> | |||
| <a-form-item label="简历是否可见" name="hide_resume"> | |||
| @@ -104,18 +105,19 @@ | |||
| <a-col span="12"> | |||
| <a-form-item label="身高(厘米cm)"> | |||
| <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-col> | |||
| <a-col span="12"> | |||
| <a-form-item label="体重(千克kg)"> | |||
| <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-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm" size="large">取消</a-button> | |||
| <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| @@ -128,60 +130,65 @@ | |||
| <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-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-col> | |||
| <a-col span="8"> | |||
| <a-row> | |||
| <a-col span="24"> | |||
| 出生日期:{{detail.dob}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 婚姻状况:{{detail.marital_status_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 学 历:{{detail.education_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 体 重:{{detail.weight}}kg | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 现居地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 籍 贯:{{detail.native_place_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 户口地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24"> | |||
| 出生日期:{{detail.dob}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 婚姻状况:{{detail.marital_status_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 学 历:{{detail.education_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 体 重:{{detail.weight}}kg | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 现居地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 籍 贯:{{detail.native_place_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 户口地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-col> | |||
| <a-col span="6"> | |||
| <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-row> | |||
| </template> | |||
| @@ -294,7 +301,7 @@ | |||
| } | |||
| const sumbitForm = () => { | |||
| if(createForm.value.id) { | |||
| if (createForm.value.id) { | |||
| PostJobapplicantUpdate(createForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| getBasic(); | |||
| @@ -1,7 +1,7 @@ | |||
| <template> | |||
| <div> | |||
| <template v-if="state"> | |||
| <a-form :model="createForm" layout="vertical"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="8"> | |||
| <a-form-item label="固话" name="landline"> | |||
| @@ -36,6 +36,7 @@ | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm" size="large">取消</a-button> | |||
| <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| @@ -48,24 +49,26 @@ | |||
| <a-row :gutter="[20,20]"> | |||
| <a-col span="10"> | |||
| <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-col> | |||
| </a-row> | |||
| @@ -1,6 +1,6 @@ | |||
| <template> | |||
| <template v-if="state"> | |||
| <a-form :model="createForm" layout="vertical"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="12"> | |||
| <a-form-item label="证书名称" name="name"> | |||
| @@ -60,7 +60,7 @@ | |||
| </template> | |||
| <p>证书描述: {{item.description}}</p> | |||
| <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-skeleton> | |||
| </a-list-item> | |||
| @@ -216,5 +216,9 @@ | |||
| </script> | |||
| <style> | |||
| <style scoped> | |||
| :deep(.ant-list-item:last-child) { | |||
| border-block-end: none !important; | |||
| } | |||
| </style> | |||
| @@ -1,79 +1,91 @@ | |||
| <template> | |||
| <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-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-row :gutter="[20,20]"> | |||
| <a-col span="24"> | |||
| <a-row :gutter="[20,20]"> | |||
| <a-col span="10"> | |||
| <a-row> | |||
| <a-col span="24"> | |||
| 姓 名:{{detail.seekername}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 性 别:{{detail.gender}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 身份证号:{{detail.id_number}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 民 族:{{detail.ethnicity_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 身 高:{{detail.height}}cm | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 政治面貌:{{detail.political_status_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 联系方式:{{detail.mobile}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 邮 箱:{{detail.email}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24"> | |||
| 姓 名:{{detail.seekername}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 性 别:{{detail.gender}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 身份证号:{{detail.id_number}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 民 族:{{detail.ethnicity_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 身 高:{{detail.height}}cm | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 政治面貌:{{detail.political_status_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 联系方式:{{detail.mobile}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 邮 箱:{{detail.email}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-col> | |||
| <a-col span="8"> | |||
| <a-row> | |||
| <a-col span="24"> | |||
| 出生日期:{{detail.dob}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 婚姻状况:{{detail.marital_status_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 学 历:{{detail.education_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 体 重:{{detail.weight}}kg | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 现居地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 籍 贯:{{detail.native_place_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 户口地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24"> | |||
| 出生日期:{{detail.dob}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 婚姻状况:{{detail.marital_status_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 学 历:{{detail.education_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 体 重:{{detail.weight}}kg | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 现居地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 籍 贯:{{detail.native_place_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 户口地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-col> | |||
| <a-col span="6"> | |||
| <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-row> | |||
| </a-col> | |||
| </a-row> | |||
| </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> | |||
| <div v-html="detail.description"></div> | |||
| <div v-html="detail.introduction"></div> | |||
| </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-row> | |||
| <a-col span="24"> | |||
| @@ -86,23 +98,29 @@ | |||
| <a-row> | |||
| <a-col span="8" v-if="detail.desire_areas"> | |||
| <a-row> | |||
| <a-col span="24" v-for="(item,index) in detail.desire_areas"> | |||
| 期望地址{{index + 1}}:{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}}{{item.level3_txt ? item.level3_txt : ''}}{{item.level4_txt ? item.level4_txt : ''}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24" v-for="(item,index) in detail.desire_areas"> | |||
| 期望地址{{index + 1}}:{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}}{{item.level3_txt ? item.level3_txt : ''}}{{item.level4_txt ? item.level4_txt : ''}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-col> | |||
| <a-col span="8" v-if="detail.desire_positions"> | |||
| <a-row> | |||
| <a-col span="24" v-for="(item,index) in detail.desire_positions"> | |||
| 期望职位{{index + 1}}:{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24" v-for="(item,index) in detail.desire_positions"> | |||
| 期望职位{{index + 1}}:{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-col> | |||
| <a-col span="8" v-if="detail.desire_industrys"> | |||
| <a-row> | |||
| <a-col span="24" v-for="(item,index) in detail.desire_industrys"> | |||
| 期望行业{{index + 1}}:{{item.industry_txt}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24" v-for="(item,index) in detail.desire_industrys"> | |||
| 期望行业{{index + 1}}:{{item.industry_txt}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-col> | |||
| </a-row> | |||
| @@ -110,27 +128,33 @@ | |||
| </a-row> | |||
| </a-typography-paragraph> | |||
| </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-row> | |||
| <a-col span="24"> | |||
| 英 语:{{detail.english_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 国 语:{{detail.mandarin_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 粤 语:{{detail.cantonese_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 第二外语:{{detail.salary_range_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 计算机能力:{{detail.computer_skills}} | |||
| </a-col> | |||
| <a-space direction="vertical"> | |||
| <a-col span="24"> | |||
| 英 语:{{detail.english_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 国 语:{{detail.mandarin_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 粤 语:{{detail.cantonese_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 第二外语:{{detail.salary_range_txt}} | |||
| </a-col> | |||
| <a-col span="24"> | |||
| 计算机能力:{{detail.computer_skills}} | |||
| </a-col> | |||
| </a-space> | |||
| </a-row> | |||
| </a-typography-paragraph> | |||
| <a-typography-title :level="4">工作经历</a-typography-title> | |||
| <a-typography-title :level="4"><div class="text-decoration"> | |||
| <div class="text-content">工作经历</div> | |||
| </div></a-typography-title> | |||
| <a-typography-paragraph> | |||
| <template v-for="(item,index) in detail.experiences"> | |||
| <a-card :title="item.company_name" style="margin-bottom: 10px;"> | |||
| @@ -140,7 +164,9 @@ | |||
| </a-card> | |||
| </template> | |||
| </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> | |||
| <template v-for="(item,index) in detail.trainings"> | |||
| <a-card :title="item.school_or_institution" style="margin-bottom: 10px;"> | |||
| @@ -174,7 +200,7 @@ | |||
| openOtherModel_1 = computed(() => { | |||
| return store.state.openOtherModel_1; | |||
| }) | |||
| watch(() => [props.detail_record], (newVal) => { | |||
| if (newVal[0]) { | |||
| @@ -212,4 +238,25 @@ | |||
| padding: 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> | |||
| @@ -1,6 +1,6 @@ | |||
| <template> | |||
| <template v-if="state"> | |||
| <a-form :model="createForm" layout="vertical"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="12"> | |||
| <a-form-item label="工作时间"> | |||
| @@ -60,7 +60,7 @@ | |||
| <a-card :title="item.company_name" style="width: 100%"> | |||
| <template #extra> | |||
| <a-space> | |||
| <a-button @click="toEdit(item)" size="small"> | |||
| <a-button @click="toEdit(item)" type="primary" size="small"> | |||
| 编辑 | |||
| </a-button> | |||
| <a-popconfirm title="是否删除该经历" @confirm="del(item.id)"> | |||
| @@ -221,5 +221,8 @@ | |||
| </script> | |||
| <style> | |||
| <style scoped> | |||
| :deep(.ant-list-item:last-child) { | |||
| border-block-end: none !important; | |||
| } | |||
| </style> | |||
| @@ -6,7 +6,8 @@ export let dataAreaForm = { | |||
| } | |||
| export let dataPositionForm = { | |||
| industry: 0, | |||
| level1: 0, | |||
| level2: 0, | |||
| } | |||
| export let dataBasicForm = { | |||
| @@ -23,7 +24,8 @@ export let dataBasicForm = { | |||
| } | |||
| export let otherDataForm = { | |||
| area: [], | |||
| position: [] | |||
| } | |||
| export const reset = () => { | |||
| @@ -34,7 +36,8 @@ export const reset = () => { | |||
| level4: 0, | |||
| } | |||
| dataPositionForm = { | |||
| industry: 0, | |||
| level1: 0, | |||
| level2: 0, | |||
| } | |||
| dataBasicForm = { | |||
| job_type: 0, | |||
| @@ -49,8 +52,9 @@ export const reset = () => { | |||
| holiday_rest: 0, | |||
| } | |||
| otherDataForm = { | |||
| area: [], | |||
| position: [] | |||
| } | |||
| return { dataAreaForm, dataPositionForm, dataBasicForm,otherDataForm } | |||
| return { dataAreaForm, dataPositionForm, dataBasicForm, otherDataForm } | |||
| } | |||
| @@ -9,7 +9,8 @@ declare namespace JobseekerIntentionType { | |||
| type JobseekerIntentionPositionFormType = { | |||
| id ?: Number, | |||
| industry?: Number, | |||
| level1 ?: Number, | |||
| level2 ?: Number, | |||
| } | |||
| type JobseekerIntentionBasicFormType = { | |||
| @@ -27,6 +28,7 @@ declare namespace JobseekerIntentionType { | |||
| } | |||
| type OtherFormType = { | |||
| photo_img ?: String, | |||
| area ?: Number[], | |||
| position?: Number[], | |||
| } | |||
| } | |||
| @@ -1,45 +1,52 @@ | |||
| <template> | |||
| <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-col span="24"> | |||
| <a-form-item label="意向地区"> | |||
| <a-jilian :dict="2009" @saveCascader="areaSave" placeholder="请选择意向地区" | |||
| :cascader_content="aa"></a-jilian> | |||
| :cascader_content="addOtherForm.area"></a-jilian> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <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-flex> | |||
| </a-col> | |||
| </a-row> | |||
| </a-tab-pane> | |||
| <a-tab-pane key="2" tab="意向职位" force-render> | |||
| <a-tab-pane :key="2" tab="意向职位" force-render> | |||
| <a-row :gutter="20"> | |||
| <a-col span="24"> | |||
| <a-form-item label="意向职位"> | |||
| <a-jilian :dict="2004" @saveCascader="positionSave" placeholder="请选择意向职位" | |||
| :cascader_content="aa"></a-jilian> | |||
| :cascader_content="addOtherForm.position"></a-jilian> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <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-flex> | |||
| </a-col> | |||
| </a-row> | |||
| </a-tab-pane> | |||
| <a-tab-pane key="3" tab="其他意向"> | |||
| <a-tab-pane :key="3" tab="其他意向"> | |||
| <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-form-item label="求职类型"> | |||
| <a-xuanze :dict="2019" placeholder="请选择求职类型" @saveSelect="saveJobType" | |||
| @@ -53,17 +60,12 @@ | |||
| </a-form-item> | |||
| </a-col> | |||
| <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> | |||
| </a-form-item> | |||
| </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-form-item label="月薪要求范围"> | |||
| <a-xuanze :dict="2005" placeholder="请选择月薪要求范围" @saveSelect="saveSalaryRange" | |||
| @@ -73,7 +75,7 @@ | |||
| <a-col span="12"> | |||
| <a-form-item label="可到职日期"> | |||
| <a-xuanze :dict="2013" placeholder="请选择可到职日期" @saveSelect="saveAvailableDate" | |||
| :select_content="basicForm.basicForm"></a-xuanze> | |||
| :select_content="basicForm.available_date"></a-xuanze> | |||
| </a-form-item> | |||
| </a-col> | |||
| <a-col span="12"> | |||
| @@ -104,7 +106,8 @@ | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <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-flex> | |||
| </a-col> | |||
| @@ -115,81 +118,109 @@ | |||
| </a-form> | |||
| </template> | |||
| <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> | |||
| </div> | |||
| </template> | |||
| <script setup lang="ts"> | |||
| 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 { warnToast, successToast } from '@/utils/toastHelper'; | |||
| 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'; | |||
| let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| let { store, dayjs,commomParams, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| const dayjsRef = ref(dayjs); | |||
| let props = defineProps(['form_state']); | |||
| const emit = defineEmits(); | |||
| 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 positionForm = ref<JobseekerIntentionType.JobseekerIntentionPositionFormType>(dataPositionForm) | |||
| let basicForm = ref<JobseekerIntentionType.JobseekerIntentionBasicFormType>(dataBasicForm) | |||
| @@ -197,92 +228,229 @@ | |||
| onMounted(() => { | |||
| getBasic() | |||
| getPosition() | |||
| getArea() | |||
| }) | |||
| 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) => { | |||
| 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) => { | |||
| 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) => { | |||
| createForm.value.job_type = data.val; | |||
| basicForm.value.job_type = data.val.key; | |||
| } | |||
| // 人才类型 | |||
| const saveTalentType = (data) => { | |||
| createForm.value.base.talent_type = data.val; | |||
| basicForm.value.talent_type = data.val.key; | |||
| } | |||
| // 工作经验 | |||
| const saveWorkExperience = (data) => { | |||
| basicForm.value.work_experience = data.val.key; | |||
| } | |||
| // 月薪要求范围 | |||
| const saveSalaryRange = (data) => { | |||
| createForm.value.base.salary_range = data.val; | |||
| basicForm.value.salary_range = data.val.key; | |||
| } | |||
| // 可到职日期 | |||
| const saveAvailableDate = (data) => { | |||
| createForm.value.base.available_date = data.val; | |||
| basicForm.value.available_date = data.val.key; | |||
| } | |||
| // 职称要求 | |||
| const saveTitleRequirement = (data) => { | |||
| createForm.value.base.title_requirement = data.val; | |||
| basicForm.value.title_requirement = data.val.key; | |||
| } | |||
| // 技能认证 | |||
| const saveSkillCertification = (data) => { | |||
| createForm.value.base.skill_certification = data.val; | |||
| basicForm.value.skill_certification = data.val.key; | |||
| } | |||
| // 食宿要求 | |||
| const saveAccommodationRequirement = (data) => { | |||
| createForm.value.base.accommodation_requirement = data.val; | |||
| basicForm.value.accommodation_requirement = data.val.key; | |||
| } | |||
| // 节假日休息情况 | |||
| const saveHolidayRest = (data) => { | |||
| createForm.value.base.holiday_rest = data.val; | |||
| basicForm.value.holiday_rest = data.val.key; | |||
| } | |||
| const sumbitForm = () => { | |||
| if (createForm.value.id) { | |||
| PostJobapplicantUpdate(createForm.value).then(res => { | |||
| const sumbitBasicForm = () => { | |||
| if (basicForm.value.id) { | |||
| PostJobapplicantUpdatedesirebase(basicForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| getBasic(); | |||
| resetForm() | |||
| resetForm('basic') | |||
| }).catch(err => { | |||
| }) | |||
| } else { | |||
| PostJobapplicantAdd(createForm.value).then(res => { | |||
| PostJobapplicantAdddesirebase(basicForm.value).then(res => { | |||
| successToast('保存成功'); | |||
| getBasic(); | |||
| resetForm() | |||
| resetForm('basic') | |||
| }).catch(err => { | |||
| }) | |||
| } | |||
| } | |||
| const toBasicEdit = (item : Object) => { | |||
| getBasic() | |||
| activeKey.value = 3 | |||
| emit("editEdit") | |||
| } | |||
| const delBasic = (id : number) => { | |||
| commomParams.value.delParam = { id: id }; | |||
| PostJobapplicantDeldesirebase(commomParams.value.delParam).then(res => { | |||
| successToast('删除成功'); | |||
| basic.value = null; | |||
| getBasic(); | |||
| }) | |||
| } | |||
| const resetForm = () => { | |||
| 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; | |||
| emit("quitEdit") | |||
| } | |||
| @@ -1,7 +1,7 @@ | |||
| <template> | |||
| <div> | |||
| <template v-if="state"> | |||
| <a-form :model="createForm" layout="vertical"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="24"> | |||
| <a-form-item label="个人简介" name="description"> | |||
| @@ -13,6 +13,7 @@ | |||
| <a-col span="24"> | |||
| <a-flex justify="flex-end"> | |||
| <a-space> | |||
| <a-button @click="resetForm" size="large">取消</a-button> | |||
| <a-button type="primary" @click="sumbitForm" size="large">保存</a-button> | |||
| </a-space> | |||
| </a-flex> | |||
| @@ -1,7 +1,7 @@ | |||
| <template> | |||
| <div> | |||
| <template v-if="state"> | |||
| <a-form :model="createForm" layout="vertical"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="12"> | |||
| <a-form-item label="英语" name="english"> | |||
| @@ -41,21 +41,24 @@ | |||
| <a-row :gutter="[20,20]"> | |||
| <a-col span="10"> | |||
| <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-col> | |||
| </a-row> | |||
| @@ -1,6 +1,6 @@ | |||
| <template> | |||
| <template v-if="state"> | |||
| <a-form :model="createForm" layout="vertical"> | |||
| <a-form :model="createForm" layout="vertical" class="resume-form"> | |||
| <a-row :gutter="20"> | |||
| <a-col span="12"> | |||
| <a-form-item label="培训/教育时间"> | |||
| @@ -71,7 +71,7 @@ | |||
| <a-card :title="item.school_or_institution" style="width: 100%"> | |||
| <template #extra> | |||
| <a-space> | |||
| <a-button @click="toEdit(item)" size="small"> | |||
| <a-button @click="toEdit(item)" type="primary" size="small"> | |||
| 编辑 | |||
| </a-button> | |||
| <a-popconfirm title="是否删除该经历" @confirm="del(item.id)"> | |||
| @@ -234,5 +234,8 @@ | |||
| </script> | |||
| <style> | |||
| <style scoped> | |||
| :deep(.ant-list-item:last-child) { | |||
| border-block-end: none !important; | |||
| } | |||
| </style> | |||
| @@ -28,13 +28,13 @@ | |||
| </div> | |||
| </a-col> | |||
| </a-row> | |||
| <a-row style="margin-top: 30px;"> | |||
| <a-row style="margin-top: 30px; color: #fff;"> | |||
| <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="中山求职 招聘 到菊城人才网 本网站实名:中山市菊城人才网" /> | |||
| <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" /> | |||
| <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号" /> | |||
| </a-col> | |||
| </a-row> | |||
| @@ -57,8 +57,8 @@ | |||
| <div>0760-22236225、22236226</div> | |||
| </div> | |||
| <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> | |||
| @@ -19,16 +19,16 @@ | |||
| <a-menu-item key="1"> | |||
| <a-space :size="80"> | |||
| <div>发布中</div> | |||
| <div></div> | |||
| <div>{{companyJobListLength}}</div> | |||
| </a-space> | |||
| </a-menu-item> | |||
| <a-menu-item key="2"> | |||
| <a-space :size="80"> | |||
| <div>未查看</div> | |||
| <div>1000分</div> | |||
| <div>{{companyResumeListLength}}</div> | |||
| </a-space> | |||
| </a-menu-item> | |||
| <a-menu-item key="3" v-if="pageType != 'company'"> | |||
| <a-menu-item key="3"> | |||
| <a-space :size="80"> | |||
| <div>管理中心</div> | |||
| </a-space> | |||
| @@ -51,7 +51,7 @@ | |||
| </a-menu> | |||
| </template> | |||
| <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-space> | |||
| </a-dropdown> | |||
| @@ -101,7 +101,7 @@ | |||
| </a-menu> | |||
| </template> | |||
| <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-space> | |||
| </a-dropdown> | |||
| @@ -124,10 +124,12 @@ | |||
| <script lang="ts" setup> | |||
| import { ref, onMounted, computed, defineProps, defineEmits } from '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 { store } from '@/store/index'; | |||
| import { router } from '@/router/index'; | |||
| import { useMenu } from '@/hooks/useMenu'; | |||
| let { onMenu, routerCur, routerArrayCur, routerArrayParentChildCur } = useMenu(); | |||
| const emit = defineEmits(); | |||
| // 成为招聘者 | |||
| @@ -154,13 +156,23 @@ | |||
| } | |||
| 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 = () => { | |||
| @@ -177,23 +189,60 @@ | |||
| } | |||
| 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) { | |||
| 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) => { | |||
| @@ -207,13 +256,18 @@ | |||
| router.push('/jobseeker/home') | |||
| } | |||
| 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) { | |||
| store.commit('getPageType', { | |||
| @@ -234,13 +288,13 @@ | |||
| } | |||
| 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') | |||
| } | |||
| } | |||
| @@ -263,12 +317,24 @@ | |||
| } | |||
| let interviewListLength = ref<Number>(0) | |||
| let companyResumeListLength = ref<Number>(0) | |||
| let companyJobListLength = ref<Number>(0) | |||
| onMounted(() => { | |||
| if(sessionStorage.getItem('pageType') == 'personal' && sessionStorage.getItem('role') == 'personal') { | |||
| 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> | |||
| @@ -55,7 +55,7 @@ | |||
| // z-index: 99; | |||
| // padding: 30px; | |||
| width: 100%; | |||
| background-color: #cccccc !important; | |||
| background-color: #0A130D !important; | |||
| color: #fff !important; | |||
| } | |||
| </style> | |||
| @@ -1,6 +1,6 @@ | |||
| <template> | |||
| <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-if="!item.children"> | |||
| <a-menu-item :key="item.path" @click="onMenu(item.path)"> | |||
| @@ -76,11 +76,23 @@ | |||
| /* 修改菜单的背景颜色 */ | |||
| } | |||
| .ant-menu .ant-sub-menu { | |||
| /* .ant-menu .ant-sub-menu { | |||
| 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; | |||
| } | |||
| @@ -95,5 +107,19 @@ | |||
| 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> | |||
| @@ -3,7 +3,7 @@ | |||
| <a-row :gutter="20"> | |||
| <a-col span="6"> | |||
| <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" /> | |||
| </a-form-item> | |||
| </a-col> | |||
| @@ -140,7 +140,7 @@ export const useCommon = () => { | |||
| }; | |||
| // 照片前缀 | |||
| const imageprefix : string = 'https://rcsc-test.jcjob.cn/img/' | |||
| const imageprefix : string = 'https://admin1.jcjob.cn/img/' | |||
| @@ -14,6 +14,7 @@ import ABiaoge from '@/components/biaoge/index.vue'; | |||
| import AJilian from '@/components/form/jilian.vue'; | |||
| import AShujilian from '@/components/form/shujilian.vue'; | |||
| import AXuanze from '@/components/form/xuanze.vue'; | |||
| import ALogin from '@/components/form/login.vue'; | |||
| import ImageContainer from '@/components/common/image-container.vue'; | |||
| import EditButton from '@/components/common/edit-button.vue'; | |||
| import { routesModuleList } from '@/router/dynamic'; | |||
| @@ -49,6 +50,7 @@ app.component('a-biaoge', ABiaoge); | |||
| app.component('a-jilian', AJilian); | |||
| app.component('a-shujilian', AShujilian); | |||
| app.component('a-xuanze', AXuanze); | |||
| app.component('a-login', ALogin); | |||
| app.component('QuillEditor', QuillEditor) | |||
| app.component('image-container', ImageContainer) | |||
| app.component('edit-button', EditButton) | |||
| @@ -73,15 +73,15 @@ const ManageMeetRoute : AppRouteRecordRaw = { | |||
| }; | |||
| // 消息中心 | |||
| 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 = { | |||
| @@ -104,6 +104,6 @@ export const routesManageModuleList : AppRouteModule[] = [ | |||
| ManageResumeRoute, | |||
| ManageSearchRoute, | |||
| ManageMeetRoute, | |||
| ManageMessageRoute, | |||
| // ManageMessageRoute, | |||
| ManageUserRoute | |||
| ]; | |||
| @@ -8,7 +8,14 @@ import { LayoutRoute } from '@/router/routes'; | |||
| const { routerDynamic, routerAdd, routerInit } = useAsRouter(); | |||
| const NotFound = { | |||
| path: '/:pathMatch(.*)*', | |||
| name: 'NotFound', | |||
| component: () => import('@/views/404.vue'), | |||
| meta: { | |||
| title: '系统找不到页面', | |||
| } | |||
| } | |||
| export interface PermissionState { | |||
| menuList : string[]; | |||
| permissionList : string[] | null; | |||
| @@ -34,7 +41,7 @@ const actions = { | |||
| async FETCH_PERMISSION({ | |||
| commit,rootState | |||
| }) { | |||
| try { | |||
| try { | |||
| // let res = await LOGIN.permissions(); | |||
| // let arr = res.data.data; | |||
| console.log(rootState) | |||
| @@ -45,6 +52,7 @@ const actions = { | |||
| LayoutRoute.children = routesManageModuleList; | |||
| commit('SET_MENU', LayoutRoute.children); | |||
| routerAdd(LayoutRoute); | |||
| routerAdd(NotFound); | |||
| let initialRoutes = routerInit(); | |||
| commit('SET_PERMISSION', [...initialRoutes]); | |||
| } else if(rootState.token && rootState.role === 'personal' && rootState.pageType == 'personal'){ | |||
| @@ -54,6 +62,7 @@ const actions = { | |||
| LayoutRoute.children = routesJobseekerModuleList; | |||
| commit('SET_MENU', LayoutRoute.children); | |||
| routerAdd(LayoutRoute); | |||
| routerAdd(NotFound); | |||
| let initialRoutes = routerInit(); | |||
| commit('SET_PERMISSION', [...initialRoutes]); | |||
| } else { | |||
| @@ -63,6 +72,7 @@ const actions = { | |||
| LayoutRoute.children = routesModuleList; | |||
| commit('SET_MENU', LayoutRoute.children); | |||
| routerAdd(LayoutRoute); | |||
| routerAdd(NotFound); | |||
| let initialRoutes = routerInit(); | |||
| commit('SET_PERMISSION', [...initialRoutes]); | |||
| } | |||
| @@ -102,4 +102,52 @@ button:focus-visible { | |||
| .main-color { | |||
| 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; | |||
| } | |||
| @@ -0,0 +1,33 @@ | |||
| <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> | |||
| @@ -1,7 +1,7 @@ | |||
| <template> | |||
| <a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist."> | |||
| <template #extra> | |||
| <a-button type="primary">Back Home</a-button> | |||
| <router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link> | |||
| </template> | |||
| </a-result> | |||
| </template> | |||
| @@ -1,15 +1,15 @@ | |||
| <template> | |||
| <a-row> | |||
| <a-row :gutter="20"> | |||
| <a-col span="4"> | |||
| <common-left-sider :menu_list="menu_list" :selected_key="selectedKeys" | |||
| @changeKey="changeKey"></common-left-sider> | |||
| </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> | |||
| </div> | |||
| </a-col> | |||
| <a-col span="4"> | |||
| <!-- <a-col span="4"> | |||
| <a-list size="small" bordered :data-source="data" style="height: 294px"> | |||
| <template #renderItem="{ item }"> | |||
| <a-list-item>{{ item }}</a-list-item> | |||
| @@ -18,7 +18,7 @@ | |||
| <div>Header</div> | |||
| </template> | |||
| </a-list> | |||
| </a-col> | |||
| </a-col> --> | |||
| </a-row> | |||
| </template> | |||
| <script setup lang="ts"> | |||
| @@ -1,16 +1,16 @@ | |||
| <template> | |||
| <a-row> | |||
| <a-row :gutter="20"> | |||
| <a-col span="4"> | |||
| <common-left-sider :menu_list="menu_list" :selected_key="selectedKeys" | |||
| @changeKey="changeKey"></common-left-sider> | |||
| </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> | |||
| </div> | |||
| </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 }"> | |||
| <a-list-item>{{ item }}</a-list-item> | |||
| </template> | |||
| @@ -18,7 +18,7 @@ | |||
| <div>Header</div> | |||
| </template> | |||
| </a-list> | |||
| </a-col> | |||
| </a-col> --> | |||
| </a-row> | |||
| </template> | |||
| <script setup lang="ts"> | |||
| @@ -10,8 +10,8 @@ | |||
| <a-list-item> | |||
| <a-list-item-meta> | |||
| <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 #description> | |||
| <div> | |||
| @@ -22,9 +22,9 @@ | |||
| </a-list-item> | |||
| </a-list> | |||
| <a-tabs v-model:activeKey="activeKey"> | |||
| <a-tabs v-model:activeKey="activeKey" type="card"> | |||
| <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-item> | |||
| <div v-html="companyDetail.introduction"></div> | |||
| @@ -43,7 +43,7 @@ | |||
| v-if="companyDetail.situation">{{companyDetail.situation.establishment_date }}</a-descriptions-item> | |||
| </a-descriptions> | |||
| </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-item label="联系地址" | |||
| span="2">{{companyDetail.detail_address}}</a-descriptions-item> | |||
| @@ -54,27 +54,19 @@ | |||
| <a-descriptions-item label="传真">{{companyDetail.fax}}</a-descriptions-item> | |||
| </a-descriptions> | |||
| </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-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> | |||
| </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-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> | |||
| </div> | |||
| </a-tab-pane> | |||
| <a-tab-pane :key="2" tab="招聘职位" force-render> | |||
| <template v-if="!jobList || jobList.length == 0"> | |||
| @@ -87,22 +79,30 @@ | |||
| <template v-else> | |||
| <a-row :gutter="10"> | |||
| <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> | |||
| <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> | |||
| </a-card> --> | |||
| </div> | |||
| </a-col> | |||
| <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> | |||
| </div> | |||
| </a-col> | |||
| @@ -129,6 +129,8 @@ | |||
| import { PostCompanyInfo, GetJobCompanyjobs } from '@/apis/models'; | |||
| import { ArrowLeftOutlined } from '@ant-design/icons-vue'; | |||
| 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 companyDetail = ref<object>({}) | |||
| let jobList = ref<object[]>([]) | |||
| @@ -137,14 +139,20 @@ | |||
| let total = ref<Number>(0) | |||
| let job_id = ref<Number>(0) | |||
| let mode = ref<String>(sessionStorage.getItem('mode')) | |||
| const mapContainer = ref(null); | |||
| const toDetail = (data) => { | |||
| job_id.value = data.id; | |||
| } | |||
| const pageChange = (page) => { | |||
| current.value = page | |||
| 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; | |||
| if (res.data.jobs.length > 3) { | |||
| jobList.value = res.data.jobs.slice(0, 3) | |||
| @@ -154,10 +162,7 @@ | |||
| }) | |||
| } | |||
| const pageChange = (page) => { | |||
| current.value = page | |||
| getJobCompanyjobs() | |||
| } | |||
| const back = (page) => { | |||
| sessionStorage.removeItem('pubilc_id') | |||
| @@ -176,9 +181,44 @@ | |||
| PostCompanyInfo({ id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id') }).then(res => { | |||
| 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" | |||
| } | |||
| } | |||
| ] | |||
| }); | |||
| } | |||
| @@ -188,9 +228,16 @@ | |||
| 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; | |||
| companyDetail.value.latitude = 39.984104 | |||
| companyDetail.value.longitude = 116.307503 | |||
| if (mapContainer.value) { | |||
| initMap() | |||
| } else { | |||
| console.error('地图容器元素未找到'); | |||
| } | |||
| }) | |||
| getJobCompanyjobs() | |||
| getJobCompanyjobs(current.value) | |||
| } | |||
| } | |||
| }) | |||
| @@ -207,4 +254,9 @@ | |||
| :deep(.ant-list-item) { | |||
| padding: 0 !important; | |||
| } | |||
| .map-container { | |||
| width: 100%; | |||
| height: 400px; | |||
| } | |||
| </style> | |||
| @@ -2,54 +2,94 @@ | |||
| <div class="content-padding-inline" style="margin: 30px 0;"> | |||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | |||
| <a-col span="18"> | |||
| <a-row> | |||
| <a-row :gutter="20"> | |||
| <a-col span="4"> | |||
| <a-anchor :get-container="getContainer" :target-offset="50" :items="menu_list" | |||
| @click="anchorClick"></a-anchor> | |||
| </a-col> | |||
| <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;"> | |||
| <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"> | |||
| <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 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 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 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> | |||
| </a-space> | |||
| </div> | |||
| @@ -67,6 +107,7 @@ | |||
| import CompanyDepartment from '@/components/company/information/department/index.vue' | |||
| import CompanyLicence from '@/components/company/information/licence/index.vue' | |||
| import CompanyImage from '@/components/company/information/image/index.vue' | |||
| import { FormOutlined, PlusCircleOutlined } from '@ant-design/icons-vue'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| let menu_list = ref([ | |||
| @@ -143,5 +184,47 @@ | |||
| } | |||
| </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> | |||
| @@ -53,17 +53,16 @@ | |||
| <a-list> | |||
| <a-list-item> | |||
| <template #actions> | |||
| <a-button> | |||
| <StarOutlined /> | |||
| 收藏 | |||
| <a-button @click="putInTatent(item.customer_id)"> | |||
| 放入人才库 | |||
| </a-button> | |||
| <a-button> | |||
| <a-button @click="interview(item)" > | |||
| 邀请面试 | |||
| </a-button> | |||
| </template> | |||
| <a-list-item-meta> | |||
| <template #title> | |||
| {{item.seekername}} | |||
| <a-button type="link" @click="detail(item)">{{item.seekername}}</a-button> | |||
| </template> | |||
| <template #description> | |||
| <div> | |||
| @@ -84,16 +83,16 @@ | |||
| <template #avatar> | |||
| <image-container | |||
| :imgObj="{src: '/images/onlylogo.jpg',width: '48px',height:'48px'}"></image-container> | |||
| </template> | |||
| </a-list-item-meta> | |||
| </a-list-item> | |||
| </a-list> | |||
| </div> | |||
| </a-col> | |||
| <a-col span="24"> | |||
| <a-col span="24" v-if="jobList.length > 0"> | |||
| <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-col> | |||
| </a-row> | |||
| @@ -101,34 +100,129 @@ | |||
| </a-col> | |||
| </a-row> | |||
| </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> | |||
| <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 { 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 basic = ref<Object>({}) | |||
| let page = ref<Number>(1) | |||
| const onLoadMore = () => { | |||
| page.value = page.value + 1; | |||
| 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(() => { | |||
| PostCompanyProfile().then(res => { | |||
| basic.value = res.data | |||
| }) | |||
| getData(); | |||
| }) | |||
| </script> | |||
| @@ -2,7 +2,7 @@ | |||
| <div class="content-padding-inline" style="margin: 30px 0;"> | |||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | |||
| <a-col span="18"> | |||
| <a-row> | |||
| <a-row :gutter="20"> | |||
| <a-col span="4"> | |||
| <common-left-sider :menu_list="menu_list" :selected_key="selectedKeys" | |||
| @changeKey="changeKey"></common-left-sider> | |||
| @@ -2,7 +2,7 @@ | |||
| <div class="content-padding-inline" style="margin: 30px 0;"> | |||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | |||
| <a-col span="18"> | |||
| <a-row> | |||
| <a-row :gutter="20"> | |||
| <a-col span="4"> | |||
| <common-left-sider :menu_list="menu_list" :selected_key="[1]" | |||
| @changeKey="changeKey"></common-left-sider> | |||
| @@ -2,7 +2,7 @@ | |||
| <div class="content-padding-inline" style="margin:30px 0;"> | |||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | |||
| <a-col span="18"> | |||
| <a-row> | |||
| <a-row :gutter="20"> | |||
| <a-col span="4"> | |||
| <common-left-sider :menu_list="menu_list" :selected_key="[1]" | |||
| @changeKey="changeKey"></common-left-sider> | |||
| @@ -2,9 +2,9 @@ | |||
| <div class="content-padding-inline" style="margin: 30px 0;"> | |||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | |||
| <a-col span="18"> | |||
| <a-row> | |||
| <a-row :gutter="20"> | |||
| <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> | |||
| </a-col> | |||
| <a-col span="20"> | |||
| @@ -16,11 +16,11 @@ | |||
| <resume-result v-if="activeKey == 1" :search="searchParams"></resume-result> | |||
| </a-tab-pane> | |||
| <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 :key="3" tab="应届毕业生"> | |||
| <!-- <a-tab-pane :key="3" tab="应届毕业生"> | |||
| <resume-result v-if="activeKey == 3" :search="searchParams"></resume-result> | |||
| </a-tab-pane> | |||
| </a-tab-pane> --> | |||
| </a-tabs> | |||
| </div> | |||
| </a-col> | |||
| @@ -38,17 +38,20 @@ | |||
| let curKey = ref<Number>(2) | |||
| let activeKey = ref<Number>(1); | |||
| let searchParams = ref<any>(null) | |||
| let selectedKey = ref<Number[]>([2]); | |||
| const changeKey = (data) => { | |||
| curKey.value = data.key; | |||
| } | |||
| const searchData = (data) => { | |||
| selectedKey.value = [2] | |||
| curKey.value = 2; | |||
| searchParams.value = data; | |||
| if(activeKey.value == 2) { | |||
| searchParams.value.sortby = 'desc' | |||
| } | |||
| curKey.value = 2 | |||
| } | |||
| </script> | |||
| @@ -1,4 +1,9 @@ | |||
| <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> | |||
| <script> | |||
| @@ -1,17 +1,20 @@ | |||
| <template> | |||
| <a-row> | |||
| <a-row :gutter="20"> | |||
| <a-col span="4"> | |||
| <common-left-sider :menu_list="menu_list" :selected_key="[1]" | |||
| @changeKey="changeKey"></common-left-sider> | |||
| </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-method v-if="curKey == 2"></meet-method> | |||
| <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> | |||
| </a-col> | |||
| <a-col span="4"> | |||
| <!-- <a-col span="4"> | |||
| <a-list size="small" bordered :data-source="data" style="height: 294px"> | |||
| <template #renderItem="{ item }"> | |||
| <a-list-item>{{ item }}</a-list-item> | |||
| @@ -20,7 +23,7 @@ | |||
| <div>Header</div> | |||
| </template> | |||
| </a-list> | |||
| </a-col> | |||
| </a-col> --> | |||
| </a-row> | |||
| </template> | |||
| <script setup lang="ts"> | |||
| @@ -28,6 +31,9 @@ | |||
| import MeetBooking from '@/components/job/meet/booking/index.vue' | |||
| import MeetMethod from '@/components/job/meet/method/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 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) | |||
| @@ -2,7 +2,7 @@ | |||
| <div class="content-padding-inline" style="margin: 30px 0;"> | |||
| <a-row :gutter="[20,20]" type="flex" justify="center"> | |||
| <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> | |||
| <a-list-item-meta> | |||
| @@ -13,7 +13,12 @@ | |||
| </a-button> | |||
| </template> | |||
| <template #description> | |||
| 会员编号:{{basic.id}} | |||
| <div> | |||
| 会员编号:{{basic.id}} | |||
| </div> | |||
| <div> | |||
| 关注公众号:{{basic.id}} | |||
| </div> | |||
| </template> | |||
| <template #avatar> | |||
| <a-avatar :src="'https://rcsc-test.jcjob.cn/img'+basic.photo" :size="96" /> | |||
| @@ -23,11 +28,11 @@ | |||
| <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"> | |||
| <a-descriptions-item><a-button @click="detail(basic)" type="link" class="main-color"> | |||
| <FileSearchOutlined style="color: #4FBE70" />预览简历 | |||
| </a-button></a-descriptions-item> | |||
| <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 label="QQ"> | |||
| {{basic.qq ? basic.qq : '未填写'}} | |||
| @@ -38,7 +43,7 @@ | |||
| </a-button> | |||
| </a-descriptions-item> | |||
| <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 label="电子邮箱"> | |||
| {{basic.email ? basic.email : '未填写'}} | |||
| @@ -47,7 +52,7 @@ | |||
| {{seeLength}}次 | |||
| </a-descriptions-item> | |||
| <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> | |||
| </div> | |||
| @@ -56,7 +61,7 @@ | |||
| </div> | |||
| </a-col> | |||
| <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="面试记录"> | |||
| <invite-interview v-if="activeKey == 1"></invite-interview> | |||
| </a-tab-pane> | |||
| @@ -73,7 +78,7 @@ | |||
| </a-col> | |||
| </a-row> | |||
| </div> | |||
| <resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail> | |||
| </template> | |||
| <script setup lang="ts"> | |||
| @@ -82,11 +87,12 @@ | |||
| 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 ResumeDetail from '@/components/jobseeker/resume/detail/index.vue' | |||
| import { GetJobseekerDetail, GetCompanyRecommentResume, GetViewHistoryList, GetPersonInterviewList, PostJobapplicantUpdate } from '@/apis/models'; | |||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||
| import { EditOutlined, FileSearchOutlined, RedoOutlined } from '@ant-design/icons-vue'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { commomParams, ExclamationCircleOutlined, Modal, onMenu } = useCommon(); | |||
| let { commomParams, ExclamationCircleOutlined, Modal, onMenu,showOtherModal1 } = useCommon(); | |||
| let jobList = ref<Object[]>([]) | |||
| let basic = ref<Object>({}) | |||
| let seeLength = ref<Number>(0) | |||
| @@ -94,8 +100,8 @@ | |||
| let refreshing = ref<Boolean>(false) | |||
| let createForm = ref<Object>({ | |||
| hide_resume: 0, | |||
| house_keeping_status: 0, | |||
| hide_resume: 1, | |||
| house_keeping_status: 2, | |||
| remind_interview: 2 | |||
| }) | |||
| @@ -110,33 +116,47 @@ | |||
| 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({ | |||
| title: `您有${res.data.list.length}条待查看面试邀请`, | |||
| title: `您有${res1.data.list.length}条待查看面试邀请`, | |||
| centered: true, | |||
| icon: createVNode(ExclamationCircleOutlined), | |||
| okText: '前往查看', | |||
| cancelText: '关闭', | |||
| onOk() { | |||
| }, | |||
| onCancel() { | |||
| }, | |||
| }); | |||
| } | |||
| }) | |||
| } | |||
| let res2 = GetViewHistoryList() | |||
| seeLength.value = res2.data.viewhistorys ? res2.data.viewhistorys.length : 0 | |||
| }) | |||
| </script> | |||
| @@ -1,8 +1,164 @@ | |||
| <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> | |||
| <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> | |||
| <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> | |||
| @@ -2,94 +2,161 @@ | |||
| <div class="content-padding-inline" style="margin: 30px 0;"> | |||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | |||
| <a-col span="18"> | |||
| <a-row> | |||
| <a-row :gutter="20"> | |||
| <a-col span="4"> | |||
| <a-anchor :get-container="getContainer" :target-offset="50" :items="menu_list" | |||
| @click="anchorClick"></a-anchor> | |||
| </a-col> | |||
| <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;"> | |||
| <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"> | |||
| <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 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 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 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 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 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 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 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> | |||
| </a-space> | |||
| @@ -112,6 +179,7 @@ | |||
| import ResumeIntroduction from '@/components/jobSeeker/resume/introduction/introduction.vue'; | |||
| import ResumeSkill from '@/components/jobSeeker/resume/skill/skill.vue'; | |||
| import ResumeTrain from '@/components/jobSeeker/resume/train/train.vue'; | |||
| import { FormOutlined, PlusCircleOutlined } from '@ant-design/icons-vue'; | |||
| import { useCommon } from '@/hooks/useCommon'; | |||
| let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon(); | |||
| let menu_list = ref([ | |||
| @@ -194,5 +262,47 @@ | |||
| } | |||
| </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> | |||
| @@ -1,4 +1,9 @@ | |||
| <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> | |||
| <script> | |||
| @@ -371,6 +371,6 @@ | |||
| }) | |||
| </script> | |||
| <style lang="less"> | |||
| <style lang="less" scoped> | |||
| @import 'login.less'; | |||
| </style> | |||
| @@ -2,13 +2,13 @@ | |||
| <div class="content-padding-inline" style="margin-top: 30px;"> | |||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | |||
| <a-col span="18"> | |||
| <a-row> | |||
| <a-row :gutter="20"> | |||
| <a-col span="4"> | |||
| <common-left-sider :menu_list="menu_list" :selected_key="[1]" | |||
| @changeKey="changeKey"></common-left-sider> | |||
| </a-col> | |||
| <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-feedback v-if="curKey == 2"></message-feedback> | |||
| </div> | |||
| @@ -2,13 +2,13 @@ | |||
| <div class="content-padding-inline" style="margin-top: 30px;"> | |||
| <a-row :gutter="[10,10]" type="flex" justify="center"> | |||
| <a-col span="18"> | |||
| <a-row> | |||
| <a-row :gutter="20"> | |||
| <a-col span="4"> | |||
| <common-left-sider :menu_list="menu_list" :selected_key="[1]" | |||
| @changeKey="changeKey"></common-left-sider> | |||
| </a-col> | |||
| <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-password v-if="curKey == 2"></user-password> | |||
| <user-email v-if="curKey == 3"></user-email> | |||
| @@ -1,9 +1,13 @@ | |||
| <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> | |||
| <script> | |||
| </script> | |||
| <style> | |||
| </style> | |||
| </style> | |||
| @@ -1,4 +1,9 @@ | |||
| <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> | |||
| <script> | |||
| @@ -1,7 +1,7 @@ | |||
| <template> | |||
| <a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist."> | |||
| <template #extra> | |||
| <a-button type="primary">Back Home</a-button> | |||
| <router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link> | |||
| </template> | |||
| </a-result> | |||
| </template> | |||
| @@ -1,4 +1,9 @@ | |||
| <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> | |||
| <script> | |||