feat: 优化岗位弹窗展示和添加投递权限限制

- 岗位描述和要求使用数字序号排序,左对齐展示
- 优化三个内容板块的间距和样式
- 添加岗位相关标签显示(专业相关/非专业相关/人才出海)
- 创建投递权限提示弹窗,非学员无法投递
- 更新岗位面试状态数据,修复重复的会展策划师记录
- 支持弹窗内容滚动,自适应高度

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
KQL
2025-09-08 06:13:48 +08:00
parent 12e3722c54
commit 7132a9f190
9 changed files with 951 additions and 95 deletions

View File

@@ -6,6 +6,7 @@ import InfiniteScroll from "@/components/InfiniteScroll";
import toast from "@/components/Toast";
import FILEICON from "@/assets/images/CompanyJobsPage/file_icon.png";
import ResumeInfoModal from "../ResumeInfoModal";
import PermissionModal from "../PermissionModal";
import { getResumesList, submitResume, getPageData } from "@/services";
import "./index.css";
@@ -20,6 +21,7 @@ export default ({ visible, onClose, data, directToResume = false }) => {
const [resumeList, setResumeList] = useState([]); // 简历列表
const [listPage, setListPage] = useState(1);
const [listHasMore, setListHasMore] = useState(true);
const [permissionModalVisible, setPermissionModalVisible] = useState(false);
// 处理directToResume参数变化
useEffect(() => {
@@ -67,6 +69,11 @@ export default ({ visible, onClose, data, directToResume = false }) => {
// 选择简历投递
const userResumesClick = async (item) => {
// 显示权限提示弹窗
setPermissionModalVisible(true);
// 原投递逻辑暂时注释,实际使用时可根据用户权限判断
/*
try {
// 调用投递服务
const result = await submitResume({
@@ -102,6 +109,7 @@ export default ({ visible, onClose, data, directToResume = false }) => {
toast.error('投递失败,请重试');
console.error('投递失败:', error);
}
*/
};
// 点击简历详情
@@ -205,6 +213,12 @@ export default ({ visible, onClose, data, directToResume = false }) => {
<span className="job-info-modal-content-position-info-position">
{data?.position}
</span>
{/* 岗位相关标签 */}
{(data?.jobCategoryTag || data?.jobCategory) && (
<span className="job-category-tag">
{data?.jobCategoryTag || data?.jobCategory}
</span>
)}
<span className="job-info-modal-content-position-info-num">
该岗位仅剩{data?.remainingPositions}
</span>
@@ -224,39 +238,47 @@ export default ({ visible, onClose, data, directToResume = false }) => {
{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 className="description-content">
{data?.details?.description.split(/\d+\.\s*/).filter(item => item.trim()).map((item, index) => (
<div key={index} className="description-item">
<span className="description-number">{index + 1}.</span>
<span className="description-text">{item.trim()}</span>
</div>
))}
</div>
</div>
)}
{data?.details?.requirements?.length > 0 && (
{(data?.details?.requirements?.length > 0 || data?.details?.requirementsText) && (
<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 className="requirements-content">
{data?.details?.requirements ? (
data?.details?.requirements?.map((item, index) => (
<div key={index} className="requirements-item">
<span className="requirement-number">{index + 1}.</span>
<span className="requirement-text">{item}</span>
</div>
))
) : (
data?.details?.requirementsText?.split('\n').map((line, index) => (
<p key={index} className="requirement-line">
{line}
</p>
))
)}
</div>
</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 className="companyInfo-content">
{data?.details?.companyInfo.split('\n').map((paragraph, index) => (
<p key={index} className="company-paragraph">
{paragraph}
</p>
))}
</div>
</div>
)}
<div
@@ -278,6 +300,10 @@ export default ({ visible, onClose, data, directToResume = false }) => {
setResumeInfoData(null);
}}
/>
<PermissionModal
visible={permissionModalVisible}
onClose={() => setPermissionModalVisible(false)}
/>
</>
);
};