diff --git a/src/services/companyJobs.js b/src/services/companyJobs.js
index d4b308a..3ea965e 100644
--- a/src/services/companyJobs.js
+++ b/src/services/companyJobs.js
@@ -8,6 +8,15 @@ export async function getJobsList(params) {
params,
});
}
+
+// 获取企业内推岗位详情
+export async function getJobsDetail(id) {
+ return request({
+ url: `/api/jobs/${id}`,
+ method: "GET",
+ });
+}
+
// 获取企业内推岗位面试
export async function getInterviewsList(params) {
return request({
@@ -16,3 +25,19 @@ export async function getInterviewsList(params) {
params,
});
}
+
+// 获取简历列表
+export async function getResumesList(params) {
+ return request({
+ url: `/api/resumes`,
+ method: "GET",
+ params: params,
+ });
+}
+// 获取简历详情
+export async function getResumesDetail(id) {
+ return request({
+ url: `/api/resumes/${id}`,
+ method: "GET",
+ });
+}
diff --git a/src/services/dashboard.js b/src/services/dashboard.js
index 7eee5fa..dd24cf0 100644
--- a/src/services/dashboard.js
+++ b/src/services/dashboard.js
@@ -1,20 +1,20 @@
import request from "@/utils/request";
-// 获取当前学生的仪表板统计信息
-export async function getDashboardStatistics() {
+// 获取学生的整体学习进度
+export async function getStudyRecordsProgress() {
return request({
- url: `/api/dashboard/stats`,
+ url: `/api/study-records/progress`,
method: "GET",
namespace: "dashboardLoading",
});
}
-// 获取当前学生的学习进度汇总
-export async function getLearningProgressSummary(params = {}) {
+// 获取我的任务
+export async function getMyTasks(params = {}) {
return request({
- url: `/api/dashboard/learning-summary`,
+ url: `/api/tasks/my-tasks`,
method: "GET",
- params,
+ params: params,
namespace: "dashboardLoading",
});
}
@@ -24,7 +24,7 @@ export async function getClassRanking(params = { limit: 6 }) {
return request({
url: `/api/rankings/class`,
method: "GET",
- params,
+ params: params,
namespace: "dashboardLoading",
});
}
diff --git a/src/services/index.js b/src/services/index.js
index 15cac7e..77a7098 100644
--- a/src/services/index.js
+++ b/src/services/index.js
@@ -1,35 +1,48 @@
// 统一的API服务接口 - 基于当前认证用户
import {
- getDashboardStatistics,
- getLearningProgressSummary,
+ getStudyRecordsProgress,
+ getMyTasks,
getClassRanking,
} from "./dashboard";
import { getProjectsList } from "./projectLibrary";
-import { getJobsList, getInterviewsList } from "./companyJobs";
+import {
+ getJobsList,
+ getJobsDetail,
+ getInterviewsList,
+ getResumesList,
+ getResumesDetail,
+} from "./companyJobs";
import { getLoginStudentInfo } from "./global";
-import { getLoginStudentProgress, getClassRank, getMyRanking } from "./personalProfile";
-import { getResumesList, getResumesDetail } from "./resumeInterview";
+import {
+ getDashboardStatistics,
+ getLoginStudentProgress,
+ getClassRank,
+ getMyRanking,
+} from "./personalProfile";
+import {} from "./resumeInterview";
export {
// 仪表盘相关
- getDashboardStatistics, // 获取当前学生仪表盘统计
- getLearningProgressSummary, // 获取当前学生学习进度汇总
-
+ getMyTasks, // 获取我的任务
+ getDashboardStatistics, // 获取当前学生仪表盘统计
+ getStudyRecordsProgress, // 获取学生的整体学习进度
+
// 排名相关
- getClassRanking, // 获取当前学生班级排名
- getMyRanking, // 获取当前学生详细排名信息
-
+ getClassRanking, // 获取当前学生班级排名
+ getMyRanking, // 获取当前学生详细排名信息
+
// 学生信息相关
- getLoginStudentInfo, // 获取当前登录学生基本信息
- getLoginStudentProgress, // 获取当前学生学习进度
- getClassRank, // 获取班级排名(别名)
-
+ getLoginStudentInfo, // 获取当前登录学生基本信息
+ getLoginStudentProgress, // 获取当前学生学习进度
+ getClassRank, // 获取班级排名(别名)
+
// 项目和作品相关
- getProjectsList, // 获取项目列表
-
+ getProjectsList, // 获取项目列表
+
// 求职相关
- getJobsList, // 获取岗位列表
- getInterviewsList, // 获取面试列表
- getResumesList, // 获取简历列表
- getResumesDetail, // 获取简历详情
+ getJobsList, // 获取岗位列表
+ getJobsDetail, // 岗位详情
+ getInterviewsList, // 获取面试列表
+ getResumesList, // 获取简历列表
+ getResumesDetail, // 获取简历详情
};
diff --git a/src/services/personalProfile.js b/src/services/personalProfile.js
index fad8a0a..69f438b 100644
--- a/src/services/personalProfile.js
+++ b/src/services/personalProfile.js
@@ -9,12 +9,21 @@ export async function getLoginStudentProgress() {
});
}
+// 获取仪表板统计信息
+export async function getDashboardStatistics() {
+ return request({
+ url: `/api/dashboard/stats`,
+ method: "GET",
+ namespace: "dashboardLoading",
+ });
+}
+
// 获取当前学生班级排名
-export async function getClassRank(queryParams = {}) {
+export async function getClassRank(params = {}) {
return request({
url: `/api/rankings/class`,
method: "GET",
- params: queryParams,
+ params: params,
namespace: "profileLoading",
});
}
diff --git a/src/services/resumeInterview.js b/src/services/resumeInterview.js
index 9346fc7..075344e 100644
--- a/src/services/resumeInterview.js
+++ b/src/services/resumeInterview.js
@@ -1,17 +1 @@
import request from "@/utils/request";
-
-// 获取简历列表
-export async function getResumesList(params) {
- return request({
- url: `/api/resumes/`,
- method: "GET",
- params,
- });
-}
-// 获取简历详情
-export async function getResumesDetail(id) {
- return request({
- url: `/api/resumes/${id}`,
- method: "GET",
- });
-}
diff --git a/src/utils/dataMapper.js b/src/utils/dataMapper.js
index 96e182d..2d2881b 100644
--- a/src/utils/dataMapper.js
+++ b/src/utils/dataMapper.js
@@ -3,12 +3,12 @@
// Map student data from backend to frontend format
export const mapStudent = (backendData) => {
if (!backendData) return null;
-
+
return {
id: backendData.id,
- name: backendData.realName, // realName -> name
- studentId: backendData.studentNo, // studentNo -> studentId
- gender: backendData.gender === 'MALE' ? '男' : '女',
+ name: backendData.realName, // realName -> name
+ studentId: backendData.studentNo, // studentNo -> studentId
+ gender: backendData.gender === "MALE" ? "男" : "女",
school: backendData.school,
major: backendData.major,
enrollDate: backendData.enrollDate,
@@ -34,7 +34,7 @@ export const mapStudentList = (backendList) => {
// Map course data
export const mapCourse = (backendData) => {
if (!backendData) return null;
-
+
return {
id: backendData.id,
name: backendData.name,
@@ -45,12 +45,15 @@ export const mapCourse = (backendData) => {
credits: backendData.credits,
hours: backendData.hours,
isAiCourse: backendData.isAiCourse,
- teacher: backendData.teacher ? {
- id: backendData.teacher.id,
- name: backendData.teacher.realName,
- } : null,
+ teacher: backendData.teacher
+ ? {
+ id: backendData.teacher.id,
+ name: backendData.teacher.realName,
+ }
+ : null,
stage: backendData.stage,
- enrollmentCount: backendData.enrollmentCount || backendData._count?.enrollments || 0,
+ enrollmentCount:
+ backendData.enrollmentCount || backendData._count?.enrollments || 0,
};
};
@@ -63,25 +66,26 @@ export const mapCourseList = (backendList) => {
// Map job data
export const mapJob = (backendData) => {
if (!backendData) return null;
-
+
// Format salary range
- let salary = '面议';
+ let salary = "面议";
if (backendData.salaryMin && backendData.salaryMax) {
const min = Math.floor(backendData.salaryMin / 1000);
const max = Math.floor(backendData.salaryMax / 1000);
salary = `${min}K-${max}K`;
}
-
+
return {
id: backendData.id,
- position: backendData.title, // title -> position
+ company: backendData.company,
+ position: backendData.title, // title -> position
description: backendData.description,
requirements: backendData.requirements,
responsibilities: backendData.responsibilities,
- company: backendData.company?.name || '',
+ companyName: backendData.company?.name || "",
companyId: backendData.companyId,
type: mapJobType(backendData.type),
- jobType: backendData.type === 'INTERNSHIP' ? 'internship' : 'fulltime',
+ jobType: backendData.type === "INTERNSHIP" ? "internship" : "fulltime",
level: backendData.level,
location: backendData.location,
salary: salary,
@@ -90,9 +94,9 @@ export const mapJob = (backendData) => {
benefits: backendData.benefits || [],
skills: backendData.skills || [],
isActive: backendData.isActive,
- status: backendData.isActive ? 'available' : 'closed',
+ status: backendData.isActive ? "available" : "closed",
remainingPositions: backendData._count?.interviews || 5, // Mock remaining positions
- applicationStatus: 'not_applied', // Default status
+ applicationStatus: "not_applied", // Default status
tags: generateJobTags(backendData),
deadline: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), // 30 days from now
};
@@ -107,11 +111,11 @@ export const mapJobList = (backendList) => {
// Map job type
const mapJobType = (type) => {
const typeMap = {
- 'FULLTIME': '全职',
- 'PARTTIME': '兼职',
- 'INTERNSHIP': '实习',
- 'CONTRACT': '合同制',
- 'REMOTE': '远程',
+ FULLTIME: "全职",
+ PARTTIME: "兼职",
+ INTERNSHIP: "实习",
+ CONTRACT: "合同制",
+ REMOTE: "远程",
};
return typeMap[type] || type;
};
@@ -119,21 +123,21 @@ const mapJobType = (type) => {
// Generate job tags
const generateJobTags = (job) => {
const tags = [];
- if (job.location) tags.push(job.location.split('市')[0] + '市');
- if (job.type === 'FULLTIME') tags.push('五险一金');
- if (job.benefits?.includes('双休')) tags.push('双休');
- if (job.benefits?.includes('弹性工作')) tags.push('弹性工作');
+ if (job.location) tags.push(job.location.split("市")[0] + "市");
+ if (job.type === "FULLTIME") tags.push("五险一金");
+ if (job.benefits?.includes("双休")) tags.push("双休");
+ if (job.benefits?.includes("弹性工作")) tags.push("弹性工作");
return tags.slice(0, 4); // Max 4 tags
};
// Map company data
export const mapCompany = (backendData) => {
if (!backendData) return null;
-
+
return {
id: backendData.id,
name: backendData.name,
- companyName: backendData.name, // Alias for compatibility
+ companyName: backendData.name, // Alias for compatibility
description: backendData.description,
industry: backendData.industry,
scale: mapCompanyScale(backendData.scale),
@@ -155,10 +159,10 @@ export const mapCompanyList = (backendList) => {
// Map company scale
const mapCompanyScale = (scale) => {
const scaleMap = {
- 'SMALL': '50人以下',
- 'MEDIUM': '50-200人',
- 'LARGE': '200-1000人',
- 'ENTERPRISE': '1000人以上',
+ SMALL: "50人以下",
+ MEDIUM: "50-200人",
+ LARGE: "200-1000人",
+ ENTERPRISE: "1000人以上",
};
return scaleMap[scale] || scale;
};
@@ -166,7 +170,7 @@ const mapCompanyScale = (scale) => {
// Map resume data
export const mapResume = (backendData) => {
if (!backendData) return null;
-
+
return {
id: backendData.id,
title: backendData.title,
@@ -183,11 +187,11 @@ export const mapResume = (backendData) => {
// Map interview data
export const mapInterview = (backendData) => {
if (!backendData) return null;
-
+
return {
id: backendData.id,
scheduledAt: backendData.scheduledAt,
- interviewTime: new Date(backendData.scheduledAt).toLocaleString('zh-CN'),
+ interviewTime: new Date(backendData.scheduledAt).toLocaleString("zh-CN"),
type: backendData.type,
status: backendData.status,
location: backendData.location,
@@ -196,8 +200,8 @@ export const mapInterview = (backendData) => {
result: backendData.result,
student: backendData.student ? mapStudent(backendData.student) : null,
job: backendData.job ? mapJob(backendData.job) : null,
- company: backendData.job?.company?.name || '',
- position: backendData.job?.title || '',
+ company: backendData.job?.company?.name || "",
+ position: backendData.job?.title || "",
// Map status for frontend
statusText: mapInterviewStatus(backendData.status, backendData.result),
};
@@ -211,16 +215,16 @@ export const mapInterviewList = (backendList) => {
// Map interview status
const mapInterviewStatus = (status, result) => {
- if (status === 'COMPLETED') {
- if (result === 'PASS' || result === 'OFFER') return '面试成功';
- if (result === 'FAIL') return '面试失败';
- return '已完成';
+ if (status === "COMPLETED") {
+ if (result === "PASS" || result === "OFFER") return "面试成功";
+ if (result === "FAIL") return "面试失败";
+ return "已完成";
}
-
+
const statusMap = {
- 'SCHEDULED': '待面试',
- 'CANCELLED': '已取消',
- 'NO_SHOW': '未到场',
+ SCHEDULED: "待面试",
+ CANCELLED: "已取消",
+ NO_SHOW: "未到场",
};
return statusMap[status] || status;
};
@@ -228,7 +232,7 @@ const mapInterviewStatus = (status, result) => {
// Map enrollment data
export const mapEnrollment = (backendData) => {
if (!backendData) return null;
-
+
return {
id: backendData.id,
courseId: backendData.courseId,
@@ -248,9 +252,9 @@ export const mapEnrollment = (backendData) => {
// Map enrollment status
const mapEnrollmentStatus = (status) => {
const statusMap = {
- 'NOT_STARTED': '未开始',
- 'IN_PROGRESS': '学习中',
- 'COMPLETED': '已完成',
+ NOT_STARTED: "未开始",
+ IN_PROGRESS: "学习中",
+ COMPLETED: "已完成",
};
return statusMap[status] || status;
};
@@ -258,19 +262,21 @@ const mapEnrollmentStatus = (status) => {
// Map class data
export const mapClass = (backendData) => {
if (!backendData) return null;
-
+
return {
id: backendData.id,
name: backendData.name,
- className: backendData.name, // Alias for compatibility
+ className: backendData.name, // Alias for compatibility
description: backendData.description,
startDate: backendData.startDate,
endDate: backendData.endDate,
isActive: backendData.isActive,
- teacher: backendData.teacher ? {
- id: backendData.teacher.id,
- name: backendData.teacher.realName,
- } : null,
+ teacher: backendData.teacher
+ ? {
+ id: backendData.teacher.id,
+ name: backendData.teacher.realName,
+ }
+ : null,
studentCount: backendData._count?.students || 0,
students: backendData.students ? mapStudentList(backendData.students) : [],
};
@@ -279,7 +285,7 @@ export const mapClass = (backendData) => {
// Map stage data
export const mapStage = (backendData) => {
if (!backendData) return null;
-
+
return {
id: backendData.id,
name: backendData.name,
@@ -297,7 +303,7 @@ export const mapStage = (backendData) => {
// Map learning record
export const mapLearningRecord = (backendData) => {
if (!backendData) return null;
-
+
return {
id: backendData.id,
studentId: backendData.studentId,
@@ -312,33 +318,35 @@ export const mapLearningRecord = (backendData) => {
// Map profile data (for personal profile page)
export const mapProfile = (studentData) => {
if (!studentData) return null;
-
+
const mapped = mapStudent(studentData);
-
+
return {
...mapped,
- avatar: '/api/placeholder/80/80', // Default avatar
+ avatar: "/api/placeholder/80/80", // Default avatar
badges: {
credits: 84, // Mock data, should come from backend
classRank: 9, // Mock data, should come from backend
- mbti: studentData.mbtiType || 'ENTP',
+ mbti: studentData.mbtiType || "ENTP",
},
- courses: studentData.enrollments ?
- studentData.enrollments.map(e => e.course?.name).filter(Boolean) : [],
- mbtiReport: studentData.mbtiReport || generateMockMBTIReport(studentData.mbtiType),
+ courses: studentData.enrollments
+ ? studentData.enrollments.map((e) => e.course?.name).filter(Boolean)
+ : [],
+ mbtiReport:
+ studentData.mbtiReport || generateMockMBTIReport(studentData.mbtiType),
};
};
// Generate mock MBTI report (temporary until backend provides)
const generateMockMBTIReport = (type) => {
return {
- type: type || 'ENTP',
- title: 'Personality Type',
- description: 'Your personality type description',
- characteristics: ['Creative', 'Analytical', 'Strategic'],
- strengths: ['Problem-solving', 'Leadership', 'Innovation'],
- recommendations: ['Focus on execution', 'Develop patience', 'Listen more'],
- careerSuggestions: ['Product Manager', 'Consultant', 'Entrepreneur'],
+ type: type || "ENTP",
+ title: "Personality Type",
+ description: "Your personality type description",
+ characteristics: ["Creative", "Analytical", "Strategic"],
+ strengths: ["Problem-solving", "Leadership", "Innovation"],
+ recommendations: ["Focus on execution", "Develop patience", "Listen more"],
+ careerSuggestions: ["Product Manager", "Consultant", "Entrepreneur"],
};
};
@@ -360,4 +368,4 @@ export default {
mapStage,
mapLearningRecord,
mapProfile,
-};
\ No newline at end of file
+};
diff --git a/src/utils/request.js b/src/utils/request.js
index d4e2ca4..96f57c4 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -49,24 +49,6 @@ axiosInstance.interceptors.response.use(
(response) => {
// 处理响应数据
const res = response.data;
-
- // 后端统一返回格式 {success, data, message}
- if (res.success !== undefined) {
- if (res.success) {
- // 如果有分页信息,保留完整结构
- if (res.total !== undefined) {
- return res;
- }
- // 否则只返回data
- return res.data || res;
- } else {
- // 处理业务错误
- console.error("业务错误:", res.message);
- return Promise.reject(new Error(res.message || "请求失败"));
- }
- }
-
- // 兼容直接返回数据的情况
return res;
},
(error) => {
diff --git a/vite.config.js b/vite.config.js
index 3516d09..4d093b7 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -57,6 +57,7 @@ export default defineConfig({
resolve: {
alias: {
"@": "/src",
+ "@/services": "/src/services",
},
},
});