feat: 🎸 安装了全局骨架屏

This commit is contained in:
2025-08-20 10:40:22 +08:00
parent 60771082ef
commit 14f722263b
3 changed files with 78 additions and 55 deletions

View File

@@ -4,6 +4,13 @@
min-height: 100vh; min-height: 100vh;
width: 100%; width: 100%;
background-color: #f2f3f5; background-color: #f2f3f5;
.app-layout-skeleton {
flex: 1;
box-sizing: border-box;
padding: 100px;
background-color: aqua;
}
} }
/* 主内容区域 */ /* 主内容区域 */
.main-content { .main-content {

View File

@@ -1,4 +1,5 @@
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import { Skeleton } from "@arco-design/web-react";
import Sidebar from "../Sidebar"; import Sidebar from "../Sidebar";
import "./index.css"; import "./index.css";
@@ -8,7 +9,9 @@ const Layout = ({ children }) => {
return ( return (
<div className="app-layout"> <div className="app-layout">
<Sidebar isCollapsed={isCollapsed} setIsCollapsed={setIsCollapsed} /> <Sidebar isCollapsed={isCollapsed} setIsCollapsed={setIsCollapsed} />
<main className="main-content">{children}</main> <Skeleton loading={false} animation className="app-layout-skeleton">
<main className="main-content">{children}</main>
</Skeleton>
</div> </div>
); );
}; };

View File

@@ -21,39 +21,41 @@ const CompanyJobsPage = () => {
const fetchData = async () => { const fetchData = async () => {
try { try {
setLoading(true); setLoading(true);
// Get current user's student ID from API // Get current user's student ID from API
let studentId = null; let studentId = null;
try { try {
const currentStudent = await studentAPI.getCurrentStudent(); const currentStudent = await studentAPI.getCurrentStudent();
studentId = currentStudent?.id; studentId = currentStudent?.id;
} catch (err) { } catch (err) {
console.log('Could not get current student:', err); console.log("Could not get current student:", err);
} }
// Fetch jobs (and interviews if we have a student ID) // Fetch jobs (and interviews if we have a student ID)
const jobsData = await jobAPI.getList({ const jobsData = await jobAPI.getList({
page: 1, page: 1,
pageSize: 10, pageSize: 10,
isActive: true isActive: true,
}); });
let interviewsData = { data: [] }; let interviewsData = { data: [] };
if (studentId) { if (studentId) {
try { try {
interviewsData = await interviewAPI.getList({ interviewsData = await interviewAPI.getList({
studentId: studentId, studentId: studentId,
status: 'SCHEDULED' status: "SCHEDULED",
}); });
} catch (err) { } catch (err) {
console.log('No interviews found or API error'); console.log("No interviews found or API error");
} }
} }
// Map data to frontend format // Map data to frontend format
const mappedJobs = mapJobList(jobsData.data || jobsData); const mappedJobs = mapJobList(jobsData.data || jobsData);
const mappedInterviews = mapInterviewList(interviewsData.data || interviewsData); const mappedInterviews = mapInterviewList(
interviewsData.data || interviewsData
);
setJobs(mappedJobs); setJobs(mappedJobs);
setInterviews(mappedInterviews); setInterviews(mappedInterviews);
} catch (error) { } catch (error) {
@@ -73,7 +75,10 @@ const CompanyJobsPage = () => {
if (loading) { if (loading) {
return ( return (
<div className="company-jobs-page-wrapper"> <div className="company-jobs-page-wrapper">
<div className="company-jobs-page" style={{ justifyContent: 'center', alignItems: 'center' }}> <div
className="company-jobs-page"
style={{ justifyContent: "center", alignItems: "center" }}
>
<p>加载中...</p> <p>加载中...</p>
</div> </div>
</div> </div>
@@ -86,10 +91,7 @@ const CompanyJobsPage = () => {
<div className="company-jobs-page-left" onClick={handleJobWrapperClick}> <div className="company-jobs-page-left" onClick={handleJobWrapperClick}>
<p className="company-jobs-page-title">企业内推岗位库</p> <p className="company-jobs-page-title">企业内推岗位库</p>
<div className="company-jobs-page-left-list-wrapper"> <div className="company-jobs-page-left-list-wrapper">
<JobList <JobList data={jobs} backgroundColor="#F7F8FA" />
data={jobs}
backgroundColor="#F7F8FA"
/>
</div> </div>
</div> </div>
<div className="company-jobs-page-interview-wrapper"> <div className="company-jobs-page-interview-wrapper">
@@ -102,43 +104,54 @@ const CompanyJobsPage = () => {
> >
<p className="company-jobs-page-title">内推岗位面试</p> <p className="company-jobs-page-title">内推岗位面试</p>
<ul className="company-jobs-page-interview-list"> <ul className="company-jobs-page-interview-list">
{interviews.length > 0 ? interviews.map((item) => ( {interviews.length > 0 ? (
<li className="company-jobs-page-interview-item" key={item.id}> interviews.map((item) => (
<div className="company-jobs-page-interview-item-info"> <li
<p className="company-jobs-page-interview-item-info-position"> className="company-jobs-page-interview-item"
{item.position} key={item.id}
</p> >
{item.job?.tags?.length > 0 ? ( <div className="company-jobs-page-interview-item-info">
<ul className="company-jobs-page-interview-item-info-tags"> <p className="company-jobs-page-interview-item-info-position">
{item.job.tags.map((tag) => ( {item.position}
<li </p>
className="company-jobs-page-interview-item-info-tag" {item.job?.tags?.length > 0 ? (
key={tag} <ul className="company-jobs-page-interview-item-info-tags">
> {item.job.tags.map((tag) => (
{tag} <li
</li> className="company-jobs-page-interview-item-info-tag"
))} key={tag}
</ul> >
) : null} {tag}
<span className="company-jobs-page-interview-item-info-salary"> </li>
{item.job?.salary || '面议'} ))}
</span> </ul>
</div> ) : null}
<div className="company-jobs-page-interview-item-btn-wrapper"> <span className="company-jobs-page-interview-item-info-salary">
<span>{item.interviewTime}</span> {item.job?.salary || "面议"}
<div </span>
className={`company-jobs-page-interview-item-btn ${
item.status !== "COMPLETED" &&
"company-jobs-page-interview-item-btn-active"
}`}
>
{item.statusText}
</div> </div>
</div> <div className="company-jobs-page-interview-item-btn-wrapper">
</li> <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>
))
) : (
<li className="company-jobs-page-interview-item"> <li className="company-jobs-page-interview-item">
<p style={{ color: '#999', textAlign: 'center', width: '100%' }}> <p
style={{
color: "#999",
textAlign: "center",
width: "100%",
}}
>
暂无面试安排 暂无面试安排
</p> </p>
</li> </li>