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,96 @@
.interview-questions-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;
}
.interview-questions-modal-title {
width: 100%;
height: 30px;
line-height: 30px;
text-align: left;
color: #1d2129;
font-size: 20px;
font-weight: 600;
}
.interview-questions-modal-subtitle {
width: 100%;
height: 22px;
line-height: 22px;
text-align: left;
color: #4e5969;
font-size: 14px;
font-weight: 400;
}
.interview-questions-modal-list {
width: 100%;
max-height: 600px;
overflow-y: auto;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
margin-top: 20px;
.interview-questions-modal-item {
width: 100%;
margin-bottom: 20px;
border-radius: 8px;
box-sizing: border-box;
padding: 16px;
background-color: #fff;
.interview-questions-modal-question {
text-align: left;
position: relative;
font-size: 16px;
font-weight: 600;
color: #1d2129;
box-sizing: border-box;
padding-left: 25px;
::before {
content: "";
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 20px;
height: 20px;
background-image: url("@/assets/images/ResumeInterviewPage/question_icon.png");
background-size: 100% 100%;
}
}
.interview-questions-modal-answer {
font-size: 16px;
color: #1d2129;
font-weight: 400;
text-align: left;
margin-top: 10px;
> span {
font-weight: 600;
}
}
}
}
}

View File

@@ -0,0 +1,108 @@
import { useState } from "react";
import Modal from "@/components/Modal";
import "./index.css";
export default ({ visible, onClose, data }) => {
const handleCloseModal = () => {
onClose();
};
return (
<Modal visible={visible} onClose={handleCloseModal}>
<div className="interview-questions-modal">
<i className="close-icon" onClick={handleCloseModal} />
<p className="interview-questions-modal-title">PLC岗位群面试题</p>
<p className="interview-questions-modal-subtitle">
在1V1定制求职策略阶段企业HR会为您讲解面试题
</p>
<ul className="interview-questions-modal-list">
<li className="interview-questions-modal-item">
<p className="interview-questions-modal-question">
<span>问题1:</span>xxxxxxxxxxxxxxxxxx
</p>
<p className="interview-questions-modal-answer">
<span>解答</span>
负责室内平面设计项目的创意和实施2.
与团队合作确保设计质量和项目进度 3.
持续关注设计趋势提升设计技能 1. 具备出色的沟通能力和团队协作精神
2. 能够高效完成任务对工作细节有高度关注 3.
具有不断学习和适应新挑战的能力 加分项有以下行业经验建筑设计
</p>
</li>
<li className="interview-questions-modal-item">
<p className="interview-questions-modal-question">
<span>问题1:</span>xxxxxxxxxxxxxxxxxx
</p>
<p className="interview-questions-modal-answer">
<span>解答</span>
负责室内平面设计项目的创意和实施2.
与团队合作确保设计质量和项目进度 3.
持续关注设计趋势提升设计技能 1. 具备出色的沟通能力和团队协作精神
2. 能够高效完成任务对工作细节有高度关注 3.
具有不断学习和适应新挑战的能力 加分项有以下行业经验建筑设计
负责室内平面设计项目的创意和实施2.
与团队合作确保设计质量和项目进度 3.
持续关注设计趋势提升设计技能 1. 具备出色的沟通能力和团队协作精神
2. 能够高效完成任务对工作细节有高度关注 3.
具有不断学习和适应新挑战的能力 加分项有以下行业经验建筑设计
</p>
</li>
<li className="interview-questions-modal-item">
<p className="interview-questions-modal-question">
<span>问题1:</span>xxxxxxxxxxxxxxxxxx
</p>
<p className="interview-questions-modal-answer">
<span>解答</span>
负责室内平面设计项目的创意和实施2.
与团队合作确保设计质量和项目进度 3.
持续关注设计趋势提升设计技能 1. 具备出色的沟通能力和团队协作精神
2. 能够高效完成任务对工作细节有高度关注 3.
具有不断学习和适应新挑战的能力 加分项有以下行业经验建筑设计
负责室内平面设计项目的创意和实施2.
与团队合作确保设计质量和项目进度 3.
持续关注设计趋势提升设计技能 1. 具备出色的沟通能力和团队协作精神
2. 能够高效完成任务对工作细节有高度关注 3.
具有不断学习和适应新挑战的能力 加分项有以下行业经验建筑设计
</p>
</li>
<li className="interview-questions-modal-item">
<p className="interview-questions-modal-question">
<span>问题1:</span>xxxxxxxxxxxxxxxxxx
</p>
<p className="interview-questions-modal-answer">
<span>解答</span>
负责室内平面设计项目的创意和实施2.
与团队合作确保设计质量和项目进度 3.
持续关注设计趋势提升设计技能 1. 具备出色的沟通能力和团队协作精神
2. 能够高效完成任务对工作细节有高度关注 3.
具有不断学习和适应新挑战的能力 加分项有以下行业经验建筑设计
负责室内平面设计项目的创意和实施2.
与团队合作确保设计质量和项目进度 3.
持续关注设计趋势提升设计技能 1. 具备出色的沟通能力和团队协作精神
2. 能够高效完成任务对工作细节有高度关注 3.
具有不断学习和适应新挑战的能力 加分项有以下行业经验建筑设计
</p>
</li>
<li className="interview-questions-modal-item">
<p className="interview-questions-modal-question">
<span>问题1:</span>xxxxxxxxxxxxxxxxxx
</p>
<p className="interview-questions-modal-answer">
<span>解答</span>
负责室内平面设计项目的创意和实施2.
与团队合作确保设计质量和项目进度 3.
持续关注设计趋势提升设计技能 1. 具备出色的沟通能力和团队协作精神
2. 能够高效完成任务对工作细节有高度关注 3.
具有不断学习和适应新挑战的能力 加分项有以下行业经验建筑设计
负责室内平面设计项目的创意和实施2.
与团队合作确保设计质量和项目进度 3.
持续关注设计趋势提升设计技能 1. 具备出色的沟通能力和团队协作精神
2. 能够高效完成任务对工作细节有高度关注 3.
具有不断学习和适应新挑战的能力 加分项有以下行业经验建筑设计
</p>
</li>
</ul>
</div>
</Modal>
);
};

View File

@@ -0,0 +1,239 @@
.resume-interview-page {
width: 100%;
height: 100%;
box-sizing: border-box;
position: relative;
.resume-interview-navigation {
width: 100%;
height: 56px;
background-color: #ffffff;
display: flex;
justify-content: flex-start;
align-items: center;
overflow-x: auto;
box-sizing: border-box;
padding: 0 20px;
.active {
color: #2c7aff !important;
background-color: #f2f3f5;
}
.resume-interview-navigation-item {
margin-right: 20px;
width: 101px;
height: 32px;
line-height: 32px;
box-sizing: border-box;
border-radius: 100px;
padding: 5 16px;
font-size: 14px;
color: #4e5969;
font-weight: 600;
text-align: center;
}
}
.resume-interview-content-wrapper {
width: 100%;
box-sizing: border-box;
padding: 20px;
overflow-y: auto;
.resume-interview-content-item-wrapper:nth-child(2n) {
background-image: url("@/assets/images/ResumeInterviewPage/bg_2.png") !important;
&::after {
background-image: url("@/assets/images/ResumeInterviewPage/icon_2.png") !important;
}
.job-item {
> span {
border: 1px solid #8d4eda !important;
background-color: #f5e8ff !important;
color: #8d4eda !important;
}
}
.resumes-list {
background-image: linear-gradient(
180deg,
#dcdffb 0%,
#dcdffb4d 30%
) !important;
}
}
.resume-interview-content-item-wrapper {
width: 1120px;
height: 326px;
box-sizing: border-box;
background-color: #ffffff;
border-radius: 8px;
border: 2px solid #fff;
padding: 16px;
background-image: url("@/assets/images/ResumeInterviewPage/bg_1.png");
background-size: 100% 100%;
position: relative;
margin-bottom: 20px;
&::after {
content: "";
position: absolute;
top: 0;
right: 0;
width: 132px;
height: 132px;
background-image: url("@/assets/images/ResumeInterviewPage/icon_1.png");
background-size: 100% 100%;
}
.item-title {
font-size: 24px;
color: #000000;
font-weight: 600;
width: 100%;
height: 36px;
line-height: 36px;
}
.item-subtitle {
font-size: 14px;
height: 22px;
line-height: 22px;
font-weight: 400;
color: #86909c;
margin-bottom: 10px;
}
.item-content-wrapper {
width: 100%;
height: 212px;
display: flex;
justify-content: space-between;
align-items: center;
.jobs-list {
width: 664px;
height: 100%;
overflow-y: auto;
border-radius: 8px;
background-color: #fff;
box-sizing: border-box;
padding: 20px 15px;
display: flex;
justify-content: flex-start;
align-items: flex-start;
flex-wrap: wrap;
.job-item:nth-child(2n) {
margin-right: 0;
}
.job-item-change {
&::after {
content: "";
position: absolute;
top: -18px;
right: -12px;
width: 62px;
height: 66px;
background-image: url("@/assets/images/ResumeInterviewPage/change_icon.png");
background-size: 100% 100%;
}
}
.job-item {
width: 311px;
height: 80px;
box-sizing: border-box;
padding: 16px;
border-radius: 8px;
background-color: #f7f8fa;
margin-bottom: 5px;
border: 1px solid #e5e8ed;
margin-right: 10px;
margin-bottom: 20px;
display: flex;
justify-content: flex-start;
align-items: flex-start;
flex-direction: column;
position: relative;
> span {
box-sizing: border-box;
font-size: 12px;
font-weight: 600;
padding: 0 4px;
margin-bottom: 5px;
color: #3491fa;
background-color: #e8f7ff;
border: 1px solid #3491fa;
}
.job-name {
position: relative;
width: 100%;
> p {
width: 239px;
height: 24px;
line-height: 24px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #1d2129;
font-size: 16px;
font-weight: 600;
}
> span {
position: absolute;
top: 0;
right: 0;
font-size: 12px;
font-weight: 400;
color: #2c7aff;
cursor: pointer;
}
}
}
}
.resumes-list {
position: relative;
z-index: 1;
width: 408px;
height: 100%;
overflow-y: auto;
border-radius: 8px;
background-color: #fff;
box-sizing: border-box;
padding: 15px;
border: 1px solid #ffffff;
opacity: 0.91;
background-image: linear-gradient(180deg, #d2e5fc 0%, #d2e5fc80 50%);
display: flex;
justify-content: flex-start;
align-items: flex-start;
flex-direction: column;
.resume-item {
cursor: pointer;
width: 100%;
height: 48px;
border-radius: 8px;
background-color: #fff;
margin-bottom: 20px;
> p {
text-align: center;
line-height: 48px;
color: #1d2129;
font-size: 16px;
font-weight: 400;
}
}
}
}
}
}
}

View File

@@ -0,0 +1,113 @@
import { useRef, useState, useEffect } from "react";
import InterviewQuestionsModal from "./components/InterviewQuestionsModal";
import { mockData } from "@/data/mockData";
import "./index.css";
const { resumeInterview } = mockData;
const ResumeInterviewPage = () => {
const [activeIndustry, setActiveIndustry] = useState("frontend");
const [resumeModalVisible, setResumeModalVisible] = useState(false);
const [modalData, setModalData] = useState(undefined);
const sectionsRef = useRef({});
// 导航到指定行业段落
const handleNavClick = (industryId) => {
setActiveIndustry(industryId);
sectionsRef.current[industryId]?.scrollIntoView({
behavior: "smooth",
block: "start",
});
};
// 钩子题目点击处理
const handleHookQuestionClick = (item) => {
setModalData(item);
setResumeModalVisible(true);
};
const handleCloseModal = () => {
setResumeModalVisible(false);
setModalData(undefined);
};
// 监听滚动位置更新导航状态
useEffect(() => {
const handleScroll = () => {
const scrollPosition = window.scrollY + 200;
resumeInterview.industries.forEach((industry) => {
const section = sectionsRef.current[industry.id];
if (section) {
const sectionTop = section.offsetTop;
const sectionBottom = sectionTop + section.offsetHeight;
if (scrollPosition >= sectionTop && scrollPosition < sectionBottom) {
setActiveIndustry(industry.id);
}
}
});
};
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, [resumeInterview.industries]);
return (
<div className="resume-interview-page">
<ul className="resume-interview-navigation">
{resumeInterview.industries.map((industry) => (
<li
key={industry.id}
className={`resume-interview-navigation-item ${
activeIndustry === industry.id ? "active" : ""
}`}
onClick={() => handleNavClick(industry.id)}
>
{industry.name}
</li>
))}
</ul>
<ul className="resume-interview-content-wrapper">
{resumeInterview?.industries?.map((item) => (
<li
className="resume-interview-content-item-wrapper"
key={item.id}
ref={(el) => (sectionsRef.current[item.id] = el)}
>
<p className="item-title">{item.name}</p>
<p className="item-subtitle">简历与面试题</p>
<div className="item-content-wrapper">
<ul className="jobs-list">
{item.positions.map((i) => (
<li className="job-item job-item-change" key={i.id}>
<span>{i.level}</span>
<div className="job-name">
<p>{i.name}</p>
<span>详情 &gt;</span>
</div>
</li>
))}
</ul>
<ul className="resumes-list">
<li
className="resume-item"
onClick={() => handleHookQuestionClick(item)}
>
<p>面试题1122345</p>
</li>
</ul>
</div>
</li>
))}
</ul>
<InterviewQuestionsModal
visible={resumeModalVisible}
onClose={handleCloseModal}
/>
</div>
);
};
export default ResumeInterviewPage;