This commit is contained in:
2025-08-15 16:16:41 +08:00
commit 182abccc60
171 changed files with 26833 additions and 0 deletions

View File

@@ -0,0 +1,228 @@
.job-info-modal-content {
max-height: 648px;
width: 844px;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
background-color: #f2f3f5;
border-radius: 8px;
box-sizing: border-box;
overflow: auto;
padding: 20px;
.job-info-modal-search {
width: 319px;
height: 36px;
border: 1px solid #2c7aff;
span {
background-color: #fff;
}
input {
background-color: #fff;
}
}
.job-info-modal-user-resumes-list {
width: 100%;
margin-top: 16px;
display: grid;
grid-template-columns: repeat(2, 1fr); /* 每行两列 */
gap: 20px; /* 网格间距 */
justify-items: start; /* 项目左对齐 */
overflow-y: auto;
.list-item {
width: 390px;
height: 100px;
background-color: #fff;
border-radius: 8px;
position: relative;
box-sizing: border-box;
padding: 16px 12px;
display: flex;
justify-content: space-between;
align-items: center;
.list-item-info {
height: 68px;
width: 300px;
display: flex;
justify-content: flex-start;
align-items: center;
.file-icon {
width: 68px;
height: 68px;
}
.file-info {
width: 220px;
height: 68px;
> p {
text-align: left;
}
.file-info-targetPosition {
width: 100%;
height: 28px;
color: #09090b;
line-height: 28px;
font-size: 18px;
font-weight: 600;
}
.file-info-skills {
margin-top: 5px;
width: 100%;
height: 21px;
color: #788089;
line-height: 21px;
font-size: 15px;
font-weight: 400;
overflow: hidden; /* 超出隐藏 */
white-space: nowrap; /* 禁止换行 */
text-overflow: ellipsis; /* 文本溢出显示省略号 */
}
}
}
.info-btn {
width: 64px;
height: 28px;
line-height: 28px;
text-align: center;
border-radius: 2px;
border: 1px solid #2c7aff;
color: #2c7aff;
font-size: 12px;
cursor: pointer;
}
}
}
.job-info-modal-content-position-info {
width: 100%;
height: 30px;
display: flex;
align-items: center;
justify-content: flex-start;
position: relative;
.job-info-modal-content-position-info-position {
font-size: 20px;
font-weight: 600;
line-height: 30px;
color: #1d2129;
margin-right: 10px;
}
.job-info-modal-content-position-info-num {
font-size: 14px;
font-weight: 400;
line-height: 22px;
color: #ff7d00;
}
.job-info-modal-content-position-info-salary {
font-size: 16px;
font-weight: 600;
line-height: 24px;
color: #ff7d00;
position: absolute;
right: 0;
}
}
.job-info-modal-info-tags {
width: 100%;
display: flex;
justify-content: flex-start;
align-items: center;
flex-wrap: wrap;
margin-top: 10px;
.job-info-modal-info-tag {
background-color: #e5e6eb;
box-sizing: border-box;
margin-bottom: 5px;
padding: 1px 8px;
color: #1d2129;
font-size: 12px;
font-weight: 600;
border-radius: 2px;
margin-right: 10px;
}
}
.job-info-modal-content-position-info-description,
.job-info-modal-content-position-info-requirements,
.job-info-modal-content-position-info-companyInfo {
width: 100%;
box-sizing: border-box;
padding: 16px;
border-radius: 8px;
background-color: #fff;
margin: 10px 0;
> p {
width: 100%;
text-align: left;
}
.description-title,
.requirements-title,
.companyInfo-title {
font-size: 20px;
font-weight: 600;
line-height: 30px;
color: #000;
margin-bottom: 10px;
}
.description-content,
.companyInfo-content {
font-size: 16px;
font-weight: 400;
line-height: 24px;
color: #4e5969;
}
.requirements-content {
width: 100%;
.requirements-item {
text-align: left;
font-size: 16px;
font-weight: 400;
line-height: 24px;
color: #4e5969;
}
}
}
.job-info-modal-btn {
width: 120px;
height: 36px;
line-height: 36px;
color: #fff;
background-color: #2c7aff;
display: flex;
justify-content: center;
align-items: center;
border-radius: 2px;
cursor: pointer;
> i {
width: 12px;
height: 12px;
margin-right: 5px;
background-image: url("@/assets/images/CompanyJobsPage/btn_icon_2.png");
background-size: 100% 100%;
}
> span {
font-size: 12px;
font-weight: 600;
color: #fff;
}
}
}

View File

@@ -0,0 +1,141 @@
import { useState } from "react";
import { Input } from "@arco-design/web-react";
import Modal from "@/components/Modal";
import { mockData } from "@/data/mockData";
import FILEICON from "@/assets/images/CompanyJobsPage/file_icon.png";
import "./index.css";
const InputSearch = Input.Search;
const { userResumes } = mockData;
export default ({ visible, onClose, data }) => {
const [resumeModalShow, setResumeModalShow] = useState(false);
const handleCloseModal = () => {
setResumeModalShow(false);
onClose();
};
// 点击立即投递
const handleClickDeliverBtn = () => {
console.log(data);
setResumeModalShow(true);
};
const onSearch = (value) => {
console.log(value);
};
// 选择简历投递
const userResumesClick = (item) => {
console.log(item);
};
// 点击简历详情
const userResumesBtnClick = (e, item) => {
e.stopPropagation();
console.log(item);
};
return (
<Modal visible={visible} onClose={handleCloseModal}>
<div className="job-info-modal-content">
{resumeModalShow ? (
<>
<InputSearch
className="job-info-modal-search"
onSearch={onSearch}
searchButton
placeholder="搜索简历"
/>
<ul className="job-info-modal-user-resumes-list">
{userResumes.map((item) => (
<li
key={item.id}
className="list-item"
onClick={() => userResumesClick(item)}
>
<div className="list-item-info">
<img src={FILEICON} className="file-icon" />
<div className="file-info">
<p className="file-info-targetPosition">
{item.targetPosition}
</p>
{item?.skills?.length > 0 && (
<p className="file-info-skills">
{item?.skills?.join("/")}
</p>
)}
</div>
</div>
<div
className="info-btn"
onClick={(e) => userResumesBtnClick(e, item)}
>
简历详情
</div>
</li>
))}
</ul>
</>
) : (
<>
<div className="job-info-modal-content-position-info">
<span className="job-info-modal-content-position-info-position">
{data?.position}
</span>
<span className="job-info-modal-content-position-info-num">
该岗位仅剩9人
</span>
<span className="job-info-modal-content-position-info-salary">
{data?.salary}
</span>
</div>
{data?.tags?.length > 0 && (
<ul className="job-info-modal-info-tags">
{data?.tags?.map((tag, index) => (
<li key={index} className="job-info-modal-info-tag">
{tag}
</li>
))}
</ul>
)}
{data?.details?.description && (
<div className="job-info-modal-content-position-info-description">
<p className="description-title">岗位描述</p>
<p className="description-content">
{data?.details?.description}
</p>
</div>
)}
{data?.details?.requirements?.length > 0 && (
<div className="job-info-modal-content-position-info-requirements">
<p className="requirements-title">岗位要求</p>
<ul className="requirements-content">
{data?.details?.requirements?.map((item, index) => (
<li key={index} className="requirements-item">
{index + 1}.{item}
</li>
))}
</ul>
</div>
)}
{data?.details?.companyInfo && (
<div className="job-info-modal-content-position-info-companyInfo">
<p className="companyInfo-title">公司介绍</p>
<p className="companyInfo-content">
{data?.details?.companyInfo}
</p>
</div>
)}
<div className="job-info-modal-btn" onClick={handleClickDeliverBtn}>
<i />
<span>立即投递</span>
</div>
</>
)}
</div>
</Modal>
);
};

View File

@@ -0,0 +1,128 @@
.company-jobs-page-left-list {
width: 100%;
height: 100%;
overflow-y: auto;
display: flex;
justify-content: flex-start;
align-items: center;
flex-wrap: wrap;
box-sizing: border-box;
padding: 5px 0;
.company-jobs-page-left-list-item {
width: 496px;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
padding: 20px;
border-radius: 8px;
cursor: pointer;
margin-bottom: 20px;
margin-right: 20px;
flex-shrink: 0;
position: relative;
border: 1px solid #e5e6eb;
.icon {
position: absolute;
left: 0;
top: -6px;
width: 54px;
height: 24px;
background-size: 100% 100%;
z-index: 1;
}
.icon-fulltime {
background-image: url("@/assets/images/CompanyJobsPage/fulltime_icon.png");
}
.icon-internship {
background-image: url("@/assets/images/CompanyJobsPage/internship_icon.png");
}
.company-jobs-info {
width: 300px;
height: 100%;
display: flex;
justify-content: flex-start;
align-items: center;
flex-direction: column;
.company-jobs-info-position {
width: 100%;
font-size: 16px;
font-weight: 600;
color: #1d2129;
text-align: left;
}
.company-jobs-info-tags {
width: 100%;
display: flex;
justify-content: flex-start;
align-items: center;
flex-wrap: wrap;
margin-top: 5px;
.company-jobs-info-tag {
background-color: #e5e6eb;
box-sizing: border-box;
margin-bottom: 5px;
padding: 1px 8px;
color: #1d2129;
font-size: 12px;
font-weight: 600;
border-radius: 2px;
margin-right: 10px;
}
}
.company-jobs-info-position-count {
width: 100%;
text-align: left;
color: #ff7d00;
margin-top: 5px;
font-size: 14px;
font-weight: 400;
}
}
.company-jobs-btn-wrapper {
width: 120px;
height: 60px;
display: flex;
justify-content: center;
align-items: center;
flex-wrap: wrap;
.company-jobs-info-position-salary {
width: 100%;
text-align: center;
color: #ff7d00;
font-size: 14px;
font-weight: 600;
}
.company-jobs-btn {
cursor: pointer;
width: 64px;
height: 28px;
border-radius: 2px;
text-align: center;
color: #2c7aff;
font-size: 12px;
font-weight: 600;
border: 1px solid #2c7aff;
display: flex;
justify-content: center;
align-items: center;
> i {
width: 12px;
height: 12px;
background-image: url("@/assets/images/CompanyJobsPage/btn_icon.png");
background-size: 100% 100%;
margin-right: 5px;
}
}
}
}
}

View File

@@ -0,0 +1,65 @@
import { useState } from "react";
import { useNavigate } from "react-router-dom";
import JobInfoModal from "../JobInfoModal";
import "./index.css";
export default ({ className = "", data = [], backgroundColor = "#FFFFFF" }) => {
const navigate = useNavigate();
const [jobInfoData, setJobInfoData] = useState(undefined);
const [jobInfoModalVisible, setJobInfoModalVisible] = useState(false);
const handleJobClick = (e, item) => {
e.stopPropagation();
setJobInfoModalVisible(true);
setJobInfoData(item);
};
const onClickJobInfoModalClose = () => {
setJobInfoData(undefined);
setJobInfoModalVisible(false);
};
return (
<>
<ul className={`company-jobs-page-left-list ${className}`}>
{data?.map((item) => (
<li
key={item.id}
className="company-jobs-page-left-list-item"
style={{ backgroundColor }}
onClick={(e) => handleJobClick(e, item)}
>
<i className={`icon icon-${item?.jobType}`}></i>
<div className="company-jobs-info">
<p className="company-jobs-info-position">{item?.position}</p>
<ul className="company-jobs-info-tags">
{item?.tags?.map((tag) => (
<li key={tag} className="company-jobs-info-tag">
{tag}
</li>
))}
</ul>
<p className="company-jobs-info-position-count">
岗位招聘数量仅剩9名
</p>
</div>
<div className="company-jobs-btn-wrapper">
<p className="company-jobs-info-position-salary">
{item?.salary}
</p>
<button className="company-jobs-btn">
<i />
<span>投递</span>
</button>
</div>
</li>
))}
</ul>
<JobInfoModal
data={jobInfoData}
visible={jobInfoModalVisible}
onClose={onClickJobInfoModalClose}
/>
</>
);
};

View File

@@ -0,0 +1,269 @@
.resume-info-modal {
width: 758px;
height: 700px;
border-radius: 8px;
position: relative;
background-color: #f2f3f5;
overflow: hidden;
box-sizing: border-box;
padding: 20px;
background-image: url("@/assets/images/Common/modal_bg.png");
background-size: 100% 100%;
.close-icon {
position: absolute;
right: 20px;
top: 20px;
width: 16px;
height: 16px;
background-image: url("@/assets/images/Common/close.png");
background-size: 100% 100%;
z-index: 10;
cursor: pointer;
}
.resume-info-modal-radio-group {
height: 30px;
display: flex;
align-items: center;
justify-content: flex-start;
margin-bottom: 10px;
}
.resume-info-modal-title {
width: 100%;
height: 30px;
line-height: 30px;
text-align: left;
color: #1d2129;
font-size: 20px;
font-weight: 600;
}
.resume-info-moda-list {
width: 100%;
max-height: 600px;
overflow-y: auto;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
margin-top: 10px;
box-sizing: border-box;
.resume-info-moda-item {
width: 100%;
margin-bottom: 20px;
border-radius: 8px;
box-sizing: border-box;
padding: 16px;
background-color: #fff;
.resume-info-moda-item-title {
width: 100%;
text-align: left;
line-height: 30px;
width: 100%;
height: 30px;
color: #0275f2;
font-size: 20px;
font-weight: 600;
margin-bottom: 10px;
}
.educational-experience-list {
width: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
.educational-experience-list-item:last-child {
margin-bottom: 0;
}
.educational-experience-list-item {
width: 100%;
height: 24px;
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
> p {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.school-name {
width: 70%;
height: 100%;
line-height: 24px;
text-align: left;
color: #4e5969;
font-size: 16px;
font-weight: 600;
}
.study-time {
width: 30%;
height: 100%;
line-height: 24px;
text-align: right;
color: #86909c;
font-size: 14px;
font-weight: 400;
}
}
}
.project-experience-list {
width: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
.project-experience-list-item {
width: 100%;
flex-direction: column;
justify-content: flex-start;
align-items: center;
margin-bottom: 10px;
.project-info-wrapper {
width: 100%;
height: 46px;
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 10px;
.project-info {
width: 80%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
> p {
text-align: left;
}
.project-name {
height: 24px;
line-height: 24px;
font-size: 16px;
font-weight: 600;
color: #4e5969;
}
.project-company {
height: 22px;
line-height: 22px;
font-size: 14px;
font-weight: 400;
color: #86909c;
}
}
.project-time {
text-align: right;
width: 30%;
height: 22px;
line-height: 22px;
font-size: 14px;
font-weight: 400;
color: #86909c;
}
}
.project-desc {
color: #1d2129;
font-size: 14px;
font-weight: 400;
text-align: left;
margin-bottom: 10px;
}
.job-responsibilities-list {
width: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
> p {
width: 100%;
height: 24px;
line-height: 24px;
font-size: 16px;
font-weight: 600;
color: #4e5969;
text-align: left;
}
> li {
width: 100%;
height: 22px;
line-height: 22px;
font-size: 14px;
font-weight: 400;
color: #1d2129;
text-align: left;
}
}
}
}
.professional-skills-list {
width: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
.professional-skills-list-item:last-child {
margin-bottom: 0;
}
.professional-skills-list-item {
width: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
margin-bottom: 5px;
.skill-name {
width: 100%;
height: 24px;
line-height: 24px;
font-size: 16px;
font-weight: 600;
color: #4e5969;
text-align: left;
}
.core-capabilities-list {
width: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
margin-bottom: 10px;
.core-capabilities-list-item {
width: 100%;
height: 22px;
line-height: 22px;
font-size: 14px;
font-weight: 400;
color: #1d2129;
text-align: left;
}
}
}
}
}
}
}

View File

@@ -0,0 +1,115 @@
import { useState } from "react";
import { Radio } from "@arco-design/web-react";
import Modal from "@/components/Modal";
import "./index.css";
export default ({ visible, onClose, data }) => {
const [position, setPosition] = useState("1");
const onRadioChange = (value) => {
setPosition(value);
};
const handleCloseModal = () => {
onClose();
};
return (
<Modal visible={visible} onClose={handleCloseModal}>
<div className="resume-info-modal">
<i className="close-icon" onClick={handleCloseModal} />
<Radio.Group
type="button"
name="position"
className="resume-info-modal-radio-group"
value={position}
onChange={onRadioChange}
>
<Radio value="1">原始版</Radio>
<Radio value="2">个人修改版</Radio>
<Radio value="3">个人修改版</Radio>
</Radio.Group>
<p className="resume-info-modal-title">非标自动化工程师</p>
<ul className="resume-info-moda-list">
{/* 教育经历 */}
<li className="resume-info-moda-item">
<p className="resume-info-moda-item-title">教育经历</p>
<ul className="educational-experience-list">
<li className="educational-experience-list-item">
<p className="school-name">北京理工大学</p>
<p className="study-time">2018.09 - 2022.07</p>
</li>
<li className="educational-experience-list-item">
<p className="school-name">北京理工大学</p>
<p className="study-time">2018.09 - 2022.07</p>
</li>
</ul>
</li>
{/* 项目经历 */}
<li className="resume-info-moda-item">
<p className="resume-info-moda-item-title">项目经历</p>
<ul className="project-experience-list">
<li className="project-experience-list-item">
<div className="project-info-wrapper">
<div className="project-info">
<p className="project-name">项目名称</p>
<p className="project-company">单位xxxxxx</p>
</div>
<p className="project-time">2022.09 - 2023.07</p>
</div>
<p className="project-desc">
1. 负责室内平面设计项目的创意和实施2.
与团队合作确保设计质量和项目进度 3.
持续关注设计趋势提升设计技能 1.
具备出色的沟通能力和团队协作精神 2.
能够高效完成任务对工作细节有高度关注 3.
具有不断学习和适应新挑战的能力
加分项有以下行业经验建筑设计
</p>
<ul className="job-responsibilities-list">
<p>岗位职责</p>
<li>1.负责室内平面设计项目的创意和实施</li>
<li>2.与团队合作确保设计质量和项目进度</li>
<li>3.持续关注设计趋势提升设计技能</li>
</ul>
</li>
</ul>
</li>
{/* 专业技能 */}
<li className="resume-info-moda-item">
<p className="resume-info-moda-item-title">专业技能</p>
<ul className="professional-skills-list">
<li className="professional-skills-list-item">
<p className="skill-name">核心能力</p>
<div className="core-capabilities-list">
<p className="core-capabilities-list-item">
1. 负责室内平面设计项目的创意和实施
</p>
<p className="core-capabilities-list-item">
2. 与团队合作确保设计质量和项目进度
</p>
<p className="core-capabilities-list-item">
3. 持续关注设计趋势提升设计技能
</p>
</div>
</li>
<li className="professional-skills-list-item">
<p className="skill-name">复核能力</p>
<div className="core-capabilities-list">
<p className="core-capabilities-list-item">
1. 负责室内平面设计项目的创意和实施
</p>
<p className="core-capabilities-list-item">
2. 与团队合作确保设计质量和项目进度
</p>
<p className="core-capabilities-list-item">
3. 持续关注设计趋势提升设计技能
</p>
</div>
</li>
</ul>
</li>
</ul>
</div>
</Modal>
);
};

View File

@@ -0,0 +1,401 @@
.company-jobs-page-wrapper {
width: 100%;
height: 100%;
box-sizing: border-box;
padding: 20px;
position: relative;
background-color: #f5f5f5;
.company-jobs-page {
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
.company-jobs-page-title {
width: 100%;
height: 42px;
font-size: 20px;
font-weight: 600;
line-height: 30px;
margin-bottom: 20px;
color: #1d2129;
flex-shrink: 0;
position: relative;
border-bottom: 1px solid #e5e6eb;
&::after {
content: "";
position: absolute;
left: 20px;
bottom: 10px;
width: 32px;
height: 3px;
background-image: url("@/assets/images/CompanyJobsPage/company_jobs_page_icon.png");
background-size: 100% 100%;
}
}
.company-jobs-page-left {
width: 528px;
height: 860px;
border-radius: 8px;
background-color: #fff;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
box-sizing: border-box;
padding: 20px;
overflow: hidden;
.company-jobs-page-left-list-wrapper {
width: 496px;
height: 760px;
}
}
.company-jobs-page-interview-wrapper {
width: 572px;
height: 860px;
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
position: relative;
.company-jobs-page-interview-expand {
height: 100% !important;
margin: 0 !important;
}
.company-jobs-page-interview {
width: 100%;
height: 504px;
margin-bottom: 20px;
box-sizing: border-box;
padding: 20px;
background-color: #ffffff;
position: relative;
border-radius: 8px;
border-bottom: 1px solid #e5e6eb;
.company-jobs-page-interview-list {
width: 540px;
height: 90%;
overflow-y: auto;
display: flex;
justify-content: flex-start;
align-items: center;
flex-direction: column;
.company-jobs-page-interview-item {
flex-shrink: 0;
width: 100%;
border-radius: 8px;
background-color: #f7f8fa;
border: 1px solid #e5e6eb;
margin-bottom: 20px;
box-sizing: border-box;
padding: 20px;
.company-jobs-page-interview-item-info {
width: 100%;
position: relative;
.company-jobs-page-interview-item-info-position {
width: 100%;
height: 24px;
font-size: 16px;
font-weight: 600;
line-height: 24px;
margin-bottom: 5px;
color: #1d2129;
}
.company-jobs-page-interview-item-info-tags {
width: 100%;
display: flex;
justify-content: flex-start;
align-items: center;
flex-wrap: wrap;
margin-top: 5px;
margin-bottom: 5px;
.company-jobs-page-interview-item-info-tag {
background-color: #e5e6eb;
box-sizing: border-box;
margin-bottom: 5px;
padding: 1px 8px;
color: #1d2129;
font-size: 12px;
font-weight: 600;
border-radius: 2px;
margin-right: 10px;
}
}
.company-jobs-page-interview-item-info-salary {
position: absolute;
right: 0;
top: 0;
height: 22px;
font-size: 14px;
font-weight: 600;
line-height: 22px;
color: #ff7d00;
}
}
.company-jobs-page-interview-item-btn-wrapper {
width: 100%;
height: 36px;
position: relative;
border: 1px solid #94bfff;
border-radius: 4px;
background-color: #e8f3ff;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
padding: 0 20px;
> span {
font-size: 14px;
font-weight: 600;
line-height: 22px;
color: #4e5969;
}
.company-jobs-page-interview-item-btn {
font-size: 14px;
font-weight: 600;
line-height: 22px;
color: #4e5969;
}
.company-jobs-page-interview-item-btn-active {
color: #2c7aff;
cursor: pointer;
}
}
}
}
}
}
.company-jobs-page-process-wrapper-close {
position: absolute;
z-index: 10;
bottom: 20px;
right: 0;
width: 169px;
height: 68px;
background-color: #fff;
border: 1px solid #e5e6eb;
border-radius: 8px;
box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.25);
box-sizing: border-box;
padding: 10px;
.company-jobs-page-process-wrapper-title {
width: 100%;
height: 42px;
font-size: 20px;
font-weight: 600;
line-height: 30px;
margin-bottom: 20px;
color: #1d2129;
flex-shrink: 0;
position: relative;
border-bottom: 1px solid #e5e6eb;
&::before {
content: "";
position: absolute;
right: 0;
top: 4px;
width: 24px;
height: 24px;
background-image: url("@/assets/images/CompanyJobsPage/close_icon.png");
background-size: 100% 100%;
cursor: pointer;
}
&::after {
content: "";
position: absolute;
left: 20px;
bottom: 10px;
width: 32px;
height: 3px;
background-image: url("@/assets/images/CompanyJobsPage/company_jobs_page_icon.png");
background-size: 100% 100%;
}
}
.company-jobs-page-process-content {
display: none;
}
}
.company-jobs-page-process-wrapper-expand {
position: absolute;
z-index: 10;
bottom: 0;
right: 0;
width: 572px;
height: 340px;
background-color: #fff;
border: 1px solid #e5e6eb;
border-radius: 8px;
box-sizing: border-box;
padding: 10px;
.company-jobs-page-process-wrapper-title {
width: 100%;
padding-bottom: 40px;
font-size: 20px;
font-weight: 600;
line-height: 30px;
margin-bottom: 20px;
color: #1d2129;
flex-shrink: 0;
position: relative;
border-bottom: 1px solid #e5e6eb;
&::before {
content: "";
position: absolute;
right: 0;
top: 4px;
width: 24px;
height: 24px;
background-image: url("@/assets/images/CompanyJobsPage/close_icon.png");
background-size: 100% 100%;
cursor: pointer;
}
&::after {
content: "";
position: absolute;
left: 20px;
bottom: 40px;
width: 32px;
height: 3px;
background-image: url("@/assets/images/CompanyJobsPage/company_jobs_page_icon.png");
background-size: 100% 100%;
}
}
.company-jobs-page-process-content {
display: flex;
box-sizing: border-box;
padding: 80px 20px;
width: 100%;
height: 48px;
justify-content: space-between;
align-items: center;
.company-jobs-page-process-item-icon {
width: 48px;
height: 48px;
background-size: 100% 100%;
position: relative;
> p {
width: 84px;
position: absolute;
left: 50%;
bottom: -40px;
transform: translateX(-50%);
color: #4e5969;
font-size: 14px;
font-weight: 400;
text-align: center;
}
}
.company-jobs-page-process-item-round-dot {
width: 10px;
height: 10px;
background-image: url("@/assets/images/CompanyJobsPage/process_dot.png");
background-size: 100% 100%;
position: relative;
&::before {
content: "";
position: absolute;
left: 50%;
top: -40px;
transform: translateX(-50%);
width: 132px;
height: 25px;
background-size: 100% 100%;
}
&::after {
content: "";
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 68px;
height: 0px;
border: 1px dashed #c9cdd4;
}
}
.icon1 {
background-image: url("@/assets/images/CompanyJobsPage/process1.png");
}
.icon2 {
&::before {
background-image: url("@/assets/images/CompanyJobsPage/process2.png");
}
}
.icon3 {
background-image: url("@/assets/images/CompanyJobsPage/process3.png");
> p {
bottom: -20px;
}
}
.icon4 {
background-image: url("@/assets/images/CompanyJobsPage/process4.png");
margin: 0 48px;
&::after {
content: "";
position: absolute;
right: -68px;
top: 50%;
transform: translateY(-50%);
width: 68px;
height: 0px;
border: 1px dashed #c9cdd4;
}
&::before {
content: "";
position: absolute;
left: -68px;
top: 50%;
transform: translateY(-50%);
width: 68px;
height: 0px;
border: 1px dashed #c9cdd4;
}
}
.icon5 {
background-image: url("@/assets/images/CompanyJobsPage/process5.png");
> p {
bottom: -20px;
}
}
.icon6 {
&::before {
background-image: url("@/assets/images/CompanyJobsPage/process6.png");
}
}
.icon7 {
background-image: url("@/assets/images/CompanyJobsPage/process7.png");
}
}
}
}
}

View File

@@ -0,0 +1,116 @@
import { useState } from "react";
import { useNavigate } from "react-router-dom";
import { mockData } from "@/data/mockData";
import JobList from "./components/JobList";
import "./index.css";
const CompanyJobsPage = () => {
const { companyJobs } = mockData;
const [isExpand, setIsExpand] = useState(false); // 是否展开
const navigate = useNavigate();
const handleJobWrapperClick = () => {
navigate("/company-jobs-list");
};
return (
<div className="company-jobs-page-wrapper">
<div className="company-jobs-page">
<div className="company-jobs-page-left" onClick={handleJobWrapperClick}>
<p className="company-jobs-page-title">企业内推岗位库</p>
<div className="company-jobs-page-left-list-wrapper">
<JobList
data={companyJobs?.companyPositions}
backgroundColor="#F7F8FA"
/>
</div>
</div>
<div className="company-jobs-page-interview-wrapper">
<div
className={`${
isExpand
? "company-jobs-page-interview"
: "company-jobs-page-interview company-jobs-page-interview-expand"
}`}
>
<p className="company-jobs-page-title">内推岗位面试</p>
<ul className="company-jobs-page-interview-list">
{companyJobs?.internalPositions?.map((item) => (
<li className="company-jobs-page-interview-item" key={item.id}>
<div className="company-jobs-page-interview-item-info">
<p className="company-jobs-page-interview-item-info-position">
{item.position}
</p>
{item?.tags?.length > 0 ? (
<ul className="company-jobs-page-interview-item-info-tags">
{item?.tags.map((tag) => (
<li
className="company-jobs-page-interview-item-info-tag"
key={tag}
>
{tag}
</li>
))}
</ul>
) : null}
<span className="company-jobs-page-interview-item-info-salary">
{item.salary}
</span>
</div>
<div className="company-jobs-page-interview-item-btn-wrapper">
<span>{item.interviewTime}</span>
<div
className={`company-jobs-page-interview-item-btn ${
item.status !== "completed" &&
"company-jobs-page-interview-item-btn-active"
}`}
>
{item.statusText}
</div>
</div>
</li>
))}
</ul>
</div>
</div>
<div
className={
isExpand
? "company-jobs-page-process-wrapper-expand"
: "company-jobs-page-process-wrapper-close"
}
>
<div
className="company-jobs-page-process-wrapper-title"
onClick={() => setIsExpand(!isExpand)}
>
岗位陪跑流程
</div>
<div className="company-jobs-page-process-content">
<div className="company-jobs-page-process-item-icon icon1">
<p>内推岗位简历投递</p>
</div>
<div className="company-jobs-page-process-item-round-dot icon2" />
<div className="company-jobs-page-process-item-icon icon3">
<p>岗位简历接收</p>
</div>
<div className="company-jobs-page-process-item-icon icon4">
<p>面试时间地点确定</p>
</div>
<div className="company-jobs-page-process-item-icon icon5">
<p>参与企业面试</p>
</div>
<div className="company-jobs-page-process-item-round-dot icon6" />
<div className="company-jobs-page-process-item-icon icon7">
<p>企业offer发送</p>
</div>
</div>
</div>
</div>
</div>
);
};
export default CompanyJobsPage;