初始化12个产业教务系统项目

主要内容:
- 包含12个产业的完整教务系统前端代码
- 智能启动脚本 (start-industry.sh)
- 可视化产业导航页面 (index.html)
- 项目文档 (README.md)

优化内容:
- 删除所有node_modules和.yoyo文件夹,从7.5GB减少到2.7GB
- 添加.gitignore文件避免上传不必要的文件
- 自动依赖管理和智能启动系统

产业列表:
1. 文旅产业 (5150)
2. 智能制造 (5151)
3. 智能开发 (5152)
4. 财经商贸 (5153)
5. 视觉设计 (5154)
6. 交通物流 (5155)
7. 大健康 (5156)
8. 土木水利 (5157)
9. 食品产业 (5158)
10. 化工产业 (5159)
11. 能源产业 (5160)
12. 环保产业 (5161)

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
KQL
2025-09-24 14:14:14 +08:00
commit cd2e307402
8380 changed files with 6105118 additions and 0 deletions

View File

@@ -0,0 +1,158 @@
import request from "@/utils/request";
import { mockData } from "@/data/mockData";
// 获取企业内推岗位页面聚合数据
export async function getCompanyJobsPageData(params) {
// 使用mock数据
return Promise.resolve({
success: true,
data: {
jobs: {
list: mockData.companyJobs.companyPositions || [],
hasMore: false,
total: mockData.companyJobs.companyPositions?.length || 0
},
interviews: {
list: mockData.companyJobs.interviewStatus || [],
hasMore: false,
total: mockData.companyJobs.interviewStatus?.length || 0
}
}
});
}
// 获取企业内推岗位
export async function getJobsList(params) {
// 使用mock数据
const allJobs = mockData.companyJobs.companyPositions || [];
const page = params.page || 1;
const pageSize = params.pageSize || 10;
const startIndex = (page - 1) * pageSize;
const endIndex = startIndex + pageSize;
const pageJobs = allJobs.slice(startIndex, endIndex);
return Promise.resolve({
success: true,
data: pageJobs,
total: allJobs.length,
page: page,
pageSize: pageSize
});
}
// 获取企业内推岗位详情
export async function getJobsDetail(id) {
// 使用mock数据
const allJobs = mockData.companyJobs.companyPositions || [];
const job = allJobs.find(job => job.id === id);
if (job) {
return Promise.resolve({
success: true,
data: job
});
} else {
return Promise.resolve({
success: false,
message: "岗位不存在"
});
}
}
// 获取企业内推岗位面试
export async function getInterviewsList(params) {
// 使用mock数据
const allInterviews = mockData.companyJobs.interviewStatus || [];
const page = params.page || 1;
const pageSize = params.pageSize || 10;
const startIndex = (page - 1) * pageSize;
const endIndex = startIndex + pageSize;
const pageInterviews = allInterviews.slice(startIndex, endIndex);
return Promise.resolve({
success: true,
data: pageInterviews,
total: allInterviews.length,
page: page,
pageSize: pageSize
});
}
// 获取简历列表
export async function getResumesList(params) {
try {
// 获取岗位与面试题页面的数据
const { getMockPageData } = await import("@/mocks/resumeInterviewMock");
const pageData = getMockPageData();
// 收集所有行业的所有简历模板
const allResumeTemplates = [];
if (pageData.industries && pageData.resumeTemplates) {
pageData.industries.forEach(industry => {
const templates = pageData.resumeTemplates[industry.name] || [];
templates.forEach(template => {
allResumeTemplates.push({
id: `template_${industry.id}_${template.position}`,
title: `${template.position}简历`, // 使用岗位名称作为简历标题
position: template.position,
industry: industry.name,
level: template.level || "初级",
skills: template.studentInfo?.core_skills || [],
template: template
});
});
});
}
// 分页处理
const page = params.page || 1;
const pageSize = params.pageSize || 10;
const startIndex = (page - 1) * pageSize;
const endIndex = startIndex + pageSize;
const pageResumes = allResumeTemplates.slice(startIndex, endIndex);
return Promise.resolve({
success: true,
data: pageResumes,
total: allResumeTemplates.length,
page: page,
pageSize: pageSize
});
} catch (error) {
console.error('获取简历列表失败:', error);
// 如果获取失败,返回空列表
return Promise.resolve({
success: true,
data: [],
total: 0,
page: 1,
pageSize: 10
});
}
}
// 获取简历详情
export async function getResumesDetail(id) {
return request({
url: `/api/resumes/${id}`,
method: "GET",
});
}
// 投递简历
export async function submitResume(params) {
// 模拟投递请求
return new Promise((resolve) => {
setTimeout(() => {
resolve({
success: true,
message: "投递成功",
data: {
applicationId: Date.now(), // 模拟申请ID
submittedAt: new Date().toISOString(),
status: "submitted"
}
});
}, 800); // 模拟网络延迟
});
}

View File

@@ -0,0 +1,47 @@
import companyJobsData from "@/mocks/companyJobsData.json";
// 将原始数据转换为前端格式
function transformJobData(rawJob, index) {
// 从招聘人数中提取数字
const recruitNumberMatch = rawJob["招聘人数"]?.match(/\d+/);
const remainingPositions = recruitNumberMatch ? recruitNumberMatch[0] : "若干";
return {
id: index + 1,
position: rawJob["内推岗位名称"],
salary: rawJob["薪资"],
location: rawJob["工作地点"],
education: rawJob["学历要求"],
recruitNumber: rawJob["招聘人数"],
remainingPositions: remainingPositions,
tags: rawJob["职位标签"] || [],
benefits: rawJob["福利标签"] || [],
deadline: rawJob["截止时间"],
jobCategory: rawJob["岗位相关标签"],
// details对象包含描述、要求和公司介绍
details: {
description: rawJob["职位描述"] || "",
requirementsText: rawJob["任职要求"] || "",
companyInfo: rawJob["公司介绍"] || ""
},
// 保留原始数据以备需要
_raw: rawJob
};
}
// 获取所有岗位数据
export function getAllCompanyJobs() {
return companyJobsData.map((job, index) => transformJobData(job, index));
}
// 根据岗位名称获取岗位详情
export function getJobByPosition(positionName) {
const allJobs = getAllCompanyJobs();
return allJobs.find(job => job.position === positionName);
}
// 根据ID获取岗位详情
export function getJobById(id) {
const allJobs = getAllCompanyJobs();
return allJobs.find(job => job.id === id);
}

View File

@@ -0,0 +1,57 @@
import { mockData } from "@/data/mockData";
// 获取公共课程直播列表
export async function getPublicCourseLiveList() {
// 模拟异步请求
return Promise.resolve({
success: true,
data: mockData.publicCourseLiveList || [],
});
}
// 获取课程直播列表(包含复合能力课和垂直能力课)
export async function getCourseLiveList() {
// 合并复合能力课和垂直能力课
const compoundCourses = mockData.courseLiveList || [];
const verticalCourses = mockData.verticalCourseLiveList || [];
// 返回包含两种课程类型的数据
return Promise.resolve({
success: true,
data: {
compound: compoundCourses,
vertical: verticalCourses,
// 为了兼容旧版本,保留原始格式
all: [...compoundCourses, ...verticalCourses]
}
});
}
// 获取课程详情
export async function getCourseDetail(courseId) {
// 模拟异步请求
const allCourses = [];
mockData.courseLiveList?.forEach(unit => {
allCourses.push(...unit.courses);
});
const course = allCourses.find(c => c.courseId === courseId);
return Promise.resolve({
success: true,
data: course || null,
});
}
// 更新课程进度
export async function updateCourseProgress(courseId, progress) {
// 模拟异步请求
return Promise.resolve({
success: true,
data: {
courseId,
progress,
message: "进度更新成功",
},
});
}

View File

@@ -0,0 +1,39 @@
import { mockData } from "@/data/mockData";
// 获取课程直播列表
export async function getCourseLiveList() {
// 模拟异步请求
return Promise.resolve({
success: true,
data: mockData.courseLiveList || [],
});
}
// 获取课程详情
export async function getCourseDetail(courseId) {
// 模拟异步请求
const allCourses = [];
mockData.courseLiveList?.forEach(unit => {
allCourses.push(...unit.courses);
});
const course = allCourses.find(c => c.courseId === courseId);
return Promise.resolve({
success: true,
data: course || null,
});
}
// 更新课程进度
export async function updateCourseProgress(courseId, progress) {
// 模拟异步请求
return Promise.resolve({
success: true,
data: {
courseId,
progress,
message: "进度更新成功",
},
});
}

View File

@@ -0,0 +1,27 @@
import request from "@/utils/request";
// 获取学生的整体学习进度
export async function getStudyRecordsProgress() {
return request({
url: `/api/study-records/progress`,
method: "GET",
});
}
// 获取我的任务
export async function getMyTasks(params = {}) {
return request({
url: `/api/tasks/my-tasks`,
method: "GET",
params: params,
});
}
// 获取当前学生班级排名
export async function getClassRanking(params = { limit: 6 }) {
return request({
url: `/api/rankings/class`,
method: "GET",
params: params,
});
}

View File

@@ -0,0 +1,38 @@
import request from "@/utils/request";
import { mockData } from "@/data/mockData";
// 获取当前登录学生信息
export async function getLoginStudentInfo() {
// 使用mock数据返回完整的学生信息
return Promise.resolve({
success: true,
data: mockData.profileOverview?.studentInfo || {
name: "万圆",
realName: "万圆",
studentId: "2426030612",
studentNo: "2426030612",
avatar: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.webp",
school: "苏州工艺美术职业技术学院",
major: "数字媒体艺术设计",
className: "文旅班",
grade: "2024级",
studyPhase: "复合能力培养",
mbti: "ENFJ",
mbtiType: "ENFJ",
credits: 99,
gpa: 4.8,
classRank: 1,
totalStudents: 45,
myRank: {
rank: 1,
score: 99,
}
}
});
// 原API请求代码暂时注释
// return request({
// url: `/api/students/me`,
// method: "GET",
// });
}

View File

@@ -0,0 +1,57 @@
// 统一的API服务接口 - 基于当前认证用户
import {
getStudyRecordsProgress,
getMyTasks,
getClassRanking,
} from "./dashboard";
import { getProjectsList, getProjectsdetail } from "./projectLibrary";
import {
getCompanyJobsPageData,
getJobsList,
getJobsDetail,
getInterviewsList,
getResumesList,
getResumesDetail,
submitResume,
} from "./companyJobs";
import { getLoginStudentInfo } from "./global";
import {
getDashboardStatistics,
getLoginStudentProgress,
getClassRank,
getMyRanking,
getProfileOverview,
} from "./personalProfile";
import { getPageData } from "./resumeInterview";
export {
// 仪表盘相关
getMyTasks, // 获取我的任务
getDashboardStatistics, // 获取当前学生仪表盘统计
getStudyRecordsProgress, // 获取学生的整体学习进度
// 排名相关
getClassRanking, // 获取当前学生班级排名
getMyRanking, // 获取当前学生详细排名信息
// 学生信息相关
getLoginStudentInfo, // 获取当前登录学生基本信息
getLoginStudentProgress, // 获取当前学生学习进度
getClassRank, // 获取班级排名(别名)
getProfileOverview, // 获取个人档案完整数据(新接口)
// 项目和作品相关
getProjectsList, // 获取项目列表
getProjectsdetail, // 获取项目详情
// 求职相关
getCompanyJobsPageData, // 获取企业内推岗位页面聚合数据
getJobsList, // 获取岗位列表
getJobsDetail, // 岗位详情
getInterviewsList, // 获取面试列表
getResumesList, // 获取简历列表
getResumesDetail, // 获取简历详情
submitResume, // 投递简历
// 简历面试相关
getPageData, // 获取岗位与面试题页面数据
};

View File

@@ -0,0 +1,58 @@
import request from "@/utils/request";
import { mockData } from "@/data/mockData";
// 获取当前登录学生学习进度
export async function getLoginStudentProgress() {
return request({
url: `/api/students/me/progress`,
method: "GET",
});
}
// 获取仪表板统计信息
export async function getDashboardStatistics() {
// 直接返回mockData中的数据
return Promise.resolve({
success: true,
data: mockData.dashboardStatistics,
});
// 原API调用暂时注释
// return request({
// url: `/api/dashboard/stats`,
// method: "GET",
// namespace: "globalLoading",
// });
}
// 获取当前学生班级排名
export async function getClassRank(params = {}) {
return request({
url: `/api/rankings/class`,
method: "GET",
params: params,
});
}
// 获取当前学生排名详情
export async function getMyRanking() {
return request({
url: `/api/rankings/my-ranking`,
method: "GET",
});
}
// 获取个人档案完整数据 (新接口)
export async function getProfileOverview() {
// 直接返回mockData中的数据
return Promise.resolve({
success: true,
data: mockData.profileOverview,
});
// 原API调用暂时注释
// return request({
// url: `/api/profile/overview`,
// method: "GET",
// });
}

View File

@@ -0,0 +1,58 @@
import request from "@/utils/request";
import { mockData } from "@/data/mockData";
// 获取当前登录学生学习进度
export async function getLoginStudentProgress() {
return request({
url: `/api/students/me/progress`,
method: "GET",
});
}
// 获取仪表板统计信息
export async function getDashboardStatistics() {
// 直接返回mockData中的数据
return Promise.resolve({
success: true,
data: mockData.dashboardStatistics,
});
// 原API调用暂时注释
// return request({
// url: `/api/dashboard/stats`,
// method: "GET",
// namespace: "globalLoading",
// });
}
// 获取当前学生班级排名
export async function getClassRank(params = {}) {
return request({
url: `/api/rankings/class`,
method: "GET",
params: params,
});
}
// 获取当前学生排名详情
export async function getMyRanking() {
return request({
url: `/api/rankings/my-ranking`,
method: "GET",
});
}
// 获取个人档案完整数据 (新接口)
export async function getProfileOverview() {
// 直接返回mockData中的数据
return Promise.resolve({
success: true,
data: mockData.profileOverview,
});
// 原API调用暂时注释
// return request({
// url: `/api/profile/overview`,
// method: "GET",
// });
}

View File

@@ -0,0 +1,35 @@
import request from "@/utils/request";
import { getMockProjectsList, getMockProjectDetail } from "@/mocks/projectLibraryMock";
// 获取项目列表
export async function getProjectsList(params) {
const USE_MOCK = true;
if (USE_MOCK) {
return new Promise(resolve => {
setTimeout(() => {
resolve(getMockProjectsList(params));
}, 300);
});
}
return request({
url: `/api/projects`,
method: "GET",
params,
});
}
// 获取项目详情
export async function getProjectsdetail(id) {
const USE_MOCK = true;
if (USE_MOCK) {
return new Promise(resolve => {
setTimeout(() => {
resolve(getMockProjectDetail(id));
}, 200);
});
}
return request({
url: `/api/projects/${id}`,
method: "GET",
});
}

View File

@@ -0,0 +1,46 @@
import request from "@/utils/request";
import { getMockPageData } from "@/mocks/resumeInterviewMock";
// Get all page data for resume-interview page
export const getPageData = async () => {
// 使用mock数据
const USE_MOCK = true;
if (USE_MOCK) {
// 包装mock数据以匹配API返回格式
const mockData = getMockPageData();
return {
success: true,
data: mockData
};
}
return request({
url: "/api/resume-interview",
method: "GET"
});
};
// Export individual functions for future use if needed
export const getResumes = (params) => {
return request({
url: "/api/resumes",
method: "GET",
params
});
};
export const getInterviews = (params) => {
return request({
url: "/api/interviews",
method: "GET",
params
});
};
export const getMyInterviews = () => {
return request({
url: "/api/interviews/my-interviews",
method: "GET"
});
};

View File

@@ -0,0 +1,165 @@
/**
* 简历管理服务
* 处理个人修改版简历的CRUD操作
*/
const STORAGE_KEY = 'resume_custom_versions';
// 获取所有个人修改版
export const getCustomVersions = () => {
try {
const saved = localStorage.getItem(STORAGE_KEY);
return saved ? JSON.parse(saved) : [];
} catch (error) {
console.error('获取个人修改版失败:', error);
return [];
}
};
// 保存个人修改版列表
export const saveCustomVersions = (versions) => {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify(versions));
return { success: true };
} catch (error) {
console.error('保存个人修改版失败:', error);
return { success: false, error: error.message };
}
};
// 创建新的个人修改版
export const createCustomVersion = (data) => {
try {
const versions = getCustomVersions();
const newVersion = {
id: Date.now().toString(),
name: data.name,
content: data.content,
positionTitle: data.positionTitle,
originalVersion: data.originalVersion || 'default',
tags: data.tags || [],
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString()
};
const updatedVersions = [...versions, newVersion];
const result = saveCustomVersions(updatedVersions);
if (result.success) {
return { success: true, data: newVersion };
} else {
return result;
}
} catch (error) {
console.error('创建个人修改版失败:', error);
return { success: false, error: error.message };
}
};
// 更新个人修改版
export const updateCustomVersion = (id, data) => {
try {
const versions = getCustomVersions();
const index = versions.findIndex(v => v.id === id);
if (index === -1) {
return { success: false, error: '版本不存在' };
}
versions[index] = {
...versions[index],
...data,
updatedAt: new Date().toISOString()
};
const result = saveCustomVersions(versions);
if (result.success) {
return { success: true, data: versions[index] };
} else {
return result;
}
} catch (error) {
console.error('更新个人修改版失败:', error);
return { success: false, error: error.message };
}
};
// 删除个人修改版
export const deleteCustomVersion = (id) => {
try {
const versions = getCustomVersions();
const updatedVersions = versions.filter(v => v.id !== id);
const result = saveCustomVersions(updatedVersions);
return result;
} catch (error) {
console.error('删除个人修改版失败:', error);
return { success: false, error: error.message };
}
};
// 根据岗位获取版本
export const getVersionsByPosition = (positionTitle) => {
const versions = getCustomVersions();
return versions.filter(v => v.positionTitle === positionTitle);
};
// 根据ID获取单个版本
export const getVersionById = (id) => {
const versions = getCustomVersions();
return versions.find(v => v.id === id);
};
// 检查版本名称是否重复
export const isVersionNameExists = (name, positionTitle) => {
const versions = getCustomVersions();
return versions.some(v => v.name === name && v.positionTitle === positionTitle);
};
// 导出版本为JSON
export const exportVersion = (id) => {
const version = getVersionById(id);
if (!version) {
return { success: false, error: '版本不存在' };
}
try {
const dataStr = JSON.stringify(version, null, 2);
const dataUri = 'data:application/json;charset=utf-8,'+ encodeURIComponent(dataStr);
const exportFileDefaultName = `resume_${version.positionTitle}_${version.name}.json`;
const linkElement = document.createElement('a');
linkElement.setAttribute('href', dataUri);
linkElement.setAttribute('download', exportFileDefaultName);
linkElement.click();
return { success: true };
} catch (error) {
console.error('导出版本失败:', error);
return { success: false, error: error.message };
}
};
// 导入版本
export const importVersion = (jsonData) => {
try {
const version = JSON.parse(jsonData);
version.id = Date.now().toString(); // 生成新ID
version.importedAt = new Date().toISOString();
const versions = getCustomVersions();
const updatedVersions = [...versions, version];
const result = saveCustomVersions(updatedVersions);
if (result.success) {
return { success: true, data: version };
} else {
return result;
}
} catch (error) {
console.error('导入版本失败:', error);
return { success: false, error: '无效的JSON格式' };
}
};