初始化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:
@@ -0,0 +1,273 @@
|
||||
import { useState } from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import Modal from "@/components/Modal";
|
||||
import PDFICON from "@/assets/images/Common/pdf_icon.png";
|
||||
import FileIcon from "@/components/FileIcon";
|
||||
import ReactMarkdown from "react-markdown";
|
||||
import remarkGfm from "remark-gfm";
|
||||
import ImagePreviewModal from "../ImagePreviewModal";
|
||||
import { getCompoundUnits, getVerticalUnits } from "@/data/projectUnitsMapping";
|
||||
import "./index.css";
|
||||
|
||||
export default ({ visible, onClose, data }) => {
|
||||
const navigate = useNavigate();
|
||||
const [previewVisible, setPreviewVisible] = useState(false);
|
||||
const [previewIndex, setPreviewIndex] = useState(0);
|
||||
|
||||
const handleCloseModal = () => {
|
||||
onClose();
|
||||
};
|
||||
|
||||
// 处理岗位点击,跳转到简历与面试题页面
|
||||
const handlePositionClick = (positionName) => {
|
||||
// 关闭当前模态框
|
||||
onClose();
|
||||
// 跳转到简历与面试题页面,并传递岗位名称参数
|
||||
navigate('/resume-interview', { state: { selectedPosition: positionName } });
|
||||
};
|
||||
|
||||
// 处理图片点击预览
|
||||
const handleImageClick = (index) => {
|
||||
setPreviewIndex(index);
|
||||
setPreviewVisible(true);
|
||||
};
|
||||
|
||||
// 处理单元点击跳转到课程直播间
|
||||
const handleUnitClick = (unitName, isCompound) => {
|
||||
console.log('Unit clicked:', unitName, 'isCompound:', isCompound);
|
||||
|
||||
// 关闭当前模态框
|
||||
onClose();
|
||||
|
||||
// 构建URL参数
|
||||
const params = new URLSearchParams();
|
||||
params.append('courseTitle', unitName);
|
||||
|
||||
// 根据单元类型设置课程类型
|
||||
if (isCompound) {
|
||||
params.append('courseType', 'compound-skill');
|
||||
} else {
|
||||
params.append('courseType', 'vertical-skill');
|
||||
}
|
||||
|
||||
console.log('Navigate to live with params:', params.toString());
|
||||
|
||||
// 跳转到课程直播间
|
||||
navigate(`/live?${params.toString()}`);
|
||||
};
|
||||
|
||||
// 将换行符转换为Markdown格式
|
||||
const formatMarkdownContent = (content) => {
|
||||
if (!content) return "";
|
||||
// 将 \\n 替换为实际的换行符
|
||||
return content.replace(/\\n/g, '\n');
|
||||
};
|
||||
|
||||
|
||||
return (
|
||||
<Modal visible={visible} onClose={handleCloseModal}>
|
||||
<div className="project-cases-modal">
|
||||
<i className="close-icon" onClick={handleCloseModal} />
|
||||
{data?.category && (
|
||||
<span className="project-cases-modal-category-tag">{data.category}</span>
|
||||
)}
|
||||
<p className="project-cases-modal-title">{data?.name || data?.title}</p>
|
||||
<ul className="project-cases-modal-list">
|
||||
{/* 项目概述 */}
|
||||
<li className="project-cases-modal-item">
|
||||
<p className="project-cases-modal-item-title">项目概述</p>
|
||||
<p className="project-cases-modal-item-text">
|
||||
{data?.description || data?.overview || "暂无项目概述"}
|
||||
</p>
|
||||
</li>
|
||||
|
||||
{/* 如果有sections数据结构,优先使用sections */}
|
||||
{data?.sections ? (
|
||||
<>
|
||||
{data.sections.map((section, index) => (
|
||||
<li key={index} className="project-cases-modal-item">
|
||||
<p className="project-cases-modal-item-title">{section.title}</p>
|
||||
<div className="project-cases-modal-markdown-content">
|
||||
<ReactMarkdown remarkPlugins={[remarkGfm]}>{formatMarkdownContent(section.content)}</ReactMarkdown>
|
||||
</div>
|
||||
</li>
|
||||
))}
|
||||
|
||||
{/* 项目图片展示 */}
|
||||
<li className="project-cases-modal-item">
|
||||
<p className="project-cases-modal-item-title">项目效果图</p>
|
||||
{data?.images && data.images.length > 0 ? (
|
||||
<div className="project-cases-modal-images">
|
||||
{data.images.map((image, index) => {
|
||||
const imageUrl = typeof image === 'string' ? image : image.url;
|
||||
const imageTitle = typeof image === 'string' ? `图 ${index + 1}` : image.title;
|
||||
|
||||
return (
|
||||
<div key={index} className="project-cases-modal-image-wrapper">
|
||||
<img
|
||||
src={imageUrl}
|
||||
alt={imageTitle}
|
||||
className="project-cases-modal-image"
|
||||
onClick={() => handleImageClick(index)}
|
||||
onError={(e) => {
|
||||
e.target.style.display = 'none';
|
||||
e.target.nextSibling.style.display = 'none';
|
||||
if (e.target.parentElement) {
|
||||
const placeholder = document.createElement('div');
|
||||
placeholder.style.width = '100%';
|
||||
placeholder.style.height = '200px';
|
||||
placeholder.style.display = 'flex';
|
||||
placeholder.style.alignItems = 'center';
|
||||
placeholder.style.justifyContent = 'center';
|
||||
placeholder.style.backgroundColor = '#f5f5f5';
|
||||
placeholder.style.borderRadius = '8px';
|
||||
placeholder.style.color = '#999';
|
||||
placeholder.style.fontSize = '14px';
|
||||
placeholder.textContent = '暂无项目效果图';
|
||||
e.target.parentElement.appendChild(placeholder);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<span className="project-cases-modal-image-title">
|
||||
{imageTitle}
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
) : (
|
||||
<p className="project-cases-modal-item-text">暂无项目效果图</p>
|
||||
)}
|
||||
</li>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
{/* 原有的数据结构保持不变 */}
|
||||
{/* 适用岗位 */}
|
||||
<li className="project-cases-modal-item">
|
||||
<p className="project-cases-modal-item-title">适用岗位</p>
|
||||
<ul className="project-cases-modal-horizontal-list">
|
||||
{data?.applicablePositions?.map((pos, index) => (
|
||||
<li
|
||||
key={index}
|
||||
className="high-count-list-item"
|
||||
onClick={() => handlePositionClick(pos.position)}
|
||||
style={{ cursor: 'pointer' }}
|
||||
>
|
||||
<span className={pos.level === '普通岗' ? 'low' : pos.level === '技术骨干岗' ? 'medium' : 'high'}>
|
||||
{pos.level}
|
||||
</span>
|
||||
<p>{pos.position}</p>
|
||||
</li>
|
||||
)) || (
|
||||
<li className="high-count-list-item">
|
||||
<span className="medium">暂无</span>
|
||||
<p>适用岗位信息</p>
|
||||
</li>
|
||||
)}
|
||||
</ul>
|
||||
</li>
|
||||
{/* 对应单元 */}
|
||||
<li className="project-cases-modal-item">
|
||||
<p className="project-cases-modal-item-title">对应单元</p>
|
||||
|
||||
{/* 复合能力课 */}
|
||||
<div className="unit-category-section">
|
||||
<p className="unit-category-subtitle">复合能力课</p>
|
||||
<ul className="project-cases-modal-horizontal-list">
|
||||
{getCompoundUnits(data?.title).map((unit, index) => (
|
||||
<li
|
||||
key={`compound-${index}`}
|
||||
className="class-list-item clickable-unit"
|
||||
onClick={() => handleUnitClick(unit, true)}
|
||||
style={{ cursor: 'pointer' }}
|
||||
>
|
||||
<div className="class-list-item-title">
|
||||
<i />
|
||||
<span>{unit}</span>
|
||||
</div>
|
||||
</li>
|
||||
))}
|
||||
{getCompoundUnits(data?.title).length === 0 && (
|
||||
<li className="class-list-item">
|
||||
<div className="class-list-item-title">
|
||||
<i />
|
||||
<span>暂无复合能力课信息</span>
|
||||
</div>
|
||||
</li>
|
||||
)}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{/* 垂直能力课 */}
|
||||
<div className="unit-category-section">
|
||||
<p className="unit-category-subtitle">垂直能力课</p>
|
||||
<ul className="project-cases-modal-horizontal-list">
|
||||
{getVerticalUnits(data?.title).map((unit, index) => (
|
||||
<li
|
||||
key={`vertical-${index}`}
|
||||
className="class-list-item clickable-unit"
|
||||
onClick={() => handleUnitClick(unit, false)}
|
||||
style={{ cursor: 'pointer' }}
|
||||
>
|
||||
<div className="class-list-item-title">
|
||||
<i />
|
||||
<span>{unit}</span>
|
||||
</div>
|
||||
</li>
|
||||
))}
|
||||
{getVerticalUnits(data?.title).length === 0 && (
|
||||
<li className="class-list-item">
|
||||
<div className="class-list-item-title">
|
||||
<i />
|
||||
<span>暂无垂直能力课信息</span>
|
||||
</div>
|
||||
</li>
|
||||
)}
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
{/* 项目整体流程介绍 - Markdown格式 */}
|
||||
<li className="project-cases-modal-item">
|
||||
<p className="project-cases-modal-item-title">项目整体流程介绍</p>
|
||||
<div className="project-cases-modal-markdown-content">
|
||||
{data?.process ? (
|
||||
<ReactMarkdown remarkPlugins={[remarkGfm]}>{formatMarkdownContent(data.process)}</ReactMarkdown>
|
||||
) : (
|
||||
<p className="project-cases-modal-item-text">暂无项目流程介绍</p>
|
||||
)}
|
||||
</div>
|
||||
</li>
|
||||
{/* 项目案例关键技术点 - Markdown格式 */}
|
||||
<li className="project-cases-modal-item">
|
||||
<p className="project-cases-modal-item-title">项目案例关键技术点</p>
|
||||
<div className="project-cases-modal-markdown-content">
|
||||
{data?.keyPoints ? (
|
||||
<ReactMarkdown remarkPlugins={[remarkGfm]}>{formatMarkdownContent(data.keyPoints)}</ReactMarkdown>
|
||||
) : (
|
||||
<p className="project-cases-modal-item-text">暂无关键技术点</p>
|
||||
)}
|
||||
</div>
|
||||
</li>
|
||||
{/* 附件板块 */}
|
||||
<li className="project-cases-modal-item">
|
||||
<p className="project-cases-modal-item-title">附件</p>
|
||||
<p className="project-cases-modal-item-text">暂无附件</p>
|
||||
</li>
|
||||
</>
|
||||
)}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{/* 图片预览Modal */}
|
||||
{data?.images && (
|
||||
<ImagePreviewModal
|
||||
visible={previewVisible}
|
||||
onClose={() => setPreviewVisible(false)}
|
||||
images={data.images}
|
||||
initialIndex={previewIndex}
|
||||
/>
|
||||
)}
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,241 @@
|
||||
import json
|
||||
|
||||
# 读取大健康项目案例数据
|
||||
with open('网页未导入数据/大健康产业/大健康项目案例.json', 'r', encoding='utf-8') as f:
|
||||
health_data = json.load(f)
|
||||
|
||||
# 为getMockProjectsList创建项目列表数据 - 使用正确的字段名
|
||||
projects_list = []
|
||||
# 为getMockProjectDetail创建详情数据
|
||||
projects_detail = []
|
||||
# 为projectUnitsMapping创建单元映射
|
||||
units_mapping = {}
|
||||
|
||||
for idx, item in enumerate(health_data, 1):
|
||||
# 提取岗位列表(字符串数组)
|
||||
positions = []
|
||||
if item.get("适用岗位"):
|
||||
positions = [pos.strip() for pos in item["适用岗位"].split(",")]
|
||||
|
||||
# 获取方向(类别)
|
||||
direction = item.get("所属垂直方向", "健康管理")
|
||||
|
||||
# 获取单元(取第一个复合能力课或垂直能力课)
|
||||
unit = ""
|
||||
if item.get("对应单元名称(复合能力课)"):
|
||||
units = item["对应单元名称(复合能力课)"].split(",")
|
||||
if units:
|
||||
unit = units[0].strip()
|
||||
elif item.get("对应单元名称(垂直能力课)"):
|
||||
units = item["对应单元名称(垂直能力课)"].split(",")
|
||||
if units:
|
||||
unit = units[0].strip()
|
||||
|
||||
# 创建列表项 - 使用正确的字段名
|
||||
list_item = {
|
||||
"id": idx,
|
||||
"name": item["案例名称"], # 使用name而不是title
|
||||
"description": direction, # 简短描述用方向名
|
||||
"positions": positions, # 字符串数组,不是对象数组
|
||||
"unit": unit,
|
||||
"direction": direction,
|
||||
"category": direction # 使用方向作为分类
|
||||
}
|
||||
projects_list.append(list_item)
|
||||
|
||||
# 创建详情项 - 保持原有结构
|
||||
# 先加载岗位等级映射
|
||||
position_level_map = {}
|
||||
with open('网页未导入数据/大健康产业/大健康岗位简历.json', 'r', encoding='utf-8') as level_f:
|
||||
resume_data = json.load(level_f)
|
||||
for resume_item in resume_data:
|
||||
position_name = resume_item.get('岗位名称', '')
|
||||
level_label = resume_item.get('岗位等级标签', '')
|
||||
if position_name and level_label:
|
||||
position_level_map[position_name] = level_label
|
||||
|
||||
# 提取岗位详情(包含正确级别)
|
||||
positions_detail = []
|
||||
for pos in positions:
|
||||
# 从映射中获取正确的级别
|
||||
level = position_level_map.get(pos, "技术骨干岗") # 默认为技术骨干岗
|
||||
# 将"基础岗"映射为"普通岗"以保持原有样式
|
||||
if level == "基础岗":
|
||||
level = "普通岗"
|
||||
|
||||
positions_detail.append({
|
||||
"level": level,
|
||||
"position": pos
|
||||
})
|
||||
|
||||
# 从项目内容中提取各个部分
|
||||
content = item.get("项目案例内容", "")
|
||||
|
||||
# 提取项目概述
|
||||
overview = ""
|
||||
if "# 一、项目概述" in content:
|
||||
overview_start = content.index("# 一、项目概述") + len("# 一、项目概述")
|
||||
overview_end = content.find("# 二、", overview_start) if "# 二、" in content[overview_start:] else len(content)
|
||||
overview = content[overview_start:overview_end].strip()
|
||||
|
||||
# 提取项目流程
|
||||
process = ""
|
||||
if "# 二、项目整体流程介绍" in content:
|
||||
process_start = content.index("# 二、项目整体流程介绍") + len("# 二、项目整体流程介绍")
|
||||
process_end = content.find("# 三、", process_start) if "# 三、" in content[process_start:] else len(content)
|
||||
process = content[process_start:process_end].strip()
|
||||
|
||||
# 提取关键技术点
|
||||
keyPoints = ""
|
||||
if "# 三、项目" in content:
|
||||
tech_start = content.index("# 三、项目")
|
||||
keyPoints = content[tech_start:].strip()
|
||||
|
||||
detail_item = {
|
||||
"id": idx,
|
||||
"name": item["案例名称"],
|
||||
"positions": positions_detail,
|
||||
"unit": unit,
|
||||
"category": direction,
|
||||
"applicablePositions": positions_detail,
|
||||
"description": overview[:500] + "..." if len(overview) > 500 else overview,
|
||||
"process": process,
|
||||
"keyPoints": keyPoints,
|
||||
"images": []
|
||||
}
|
||||
projects_detail.append(detail_item)
|
||||
|
||||
# 创建单元映射
|
||||
compound_units = [u.strip() for u in item.get("对应单元名称(复合能力课)", "").split(",") if u.strip()]
|
||||
vertical_units = [u.strip() for u in item.get("对应单元名称(垂直能力课)", "").split(",") if u.strip()]
|
||||
|
||||
units_mapping[item["案例名称"]] = {
|
||||
"compoundUnits": compound_units,
|
||||
"verticalUnits": vertical_units
|
||||
}
|
||||
|
||||
# 生成projectLibraryMock.js - 保持原有结构
|
||||
mock_js_content = f"""// 项目列表Mock数据
|
||||
export const getMockProjectsList = (params = {{}}) => {{
|
||||
const {{ search = "", page = 1, pageSize = 10 }} = params;
|
||||
|
||||
// 完整项目列表数据 - 大健康产业
|
||||
const projects = {json.dumps(projects_list, ensure_ascii=False, indent=4)};
|
||||
|
||||
// 搜索过滤
|
||||
let filteredProjects = projects;
|
||||
if (search) {{
|
||||
filteredProjects = projects.filter(project =>
|
||||
project.name.includes(search) ||
|
||||
project.description.includes(search) ||
|
||||
project.positions.some(pos => pos.includes(search)) ||
|
||||
project.category.includes(search)
|
||||
);
|
||||
}}
|
||||
|
||||
// 分页
|
||||
const start = (page - 1) * pageSize;
|
||||
const end = start + pageSize;
|
||||
const paginatedProjects = filteredProjects.slice(start, end);
|
||||
|
||||
return {{
|
||||
success: true,
|
||||
data: paginatedProjects,
|
||||
total: filteredProjects.length,
|
||||
page,
|
||||
pageSize
|
||||
}};
|
||||
}};
|
||||
|
||||
// 项目详情Mock数据 - 大健康产业
|
||||
export const getMockProjectDetail = (id) => {{
|
||||
// 直接根据ID返回对应项目的详情
|
||||
const projects = {json.dumps(projects_detail, ensure_ascii=False, indent=4)};
|
||||
|
||||
const project = projects.find(p => p.id === parseInt(id));
|
||||
|
||||
if (project) {{
|
||||
return {{
|
||||
success: true,
|
||||
data: project
|
||||
}};
|
||||
}}
|
||||
|
||||
return {{
|
||||
success: false,
|
||||
message: '项目不存在'
|
||||
}};
|
||||
}};
|
||||
|
||||
export default {{
|
||||
getMockProjectsList,
|
||||
getMockProjectDetail
|
||||
}};
|
||||
"""
|
||||
|
||||
# 生成projectUnitsMapping.js
|
||||
mapping_js_content = f"""// 项目案例对应单元映射数据 - 大健康产业
|
||||
|
||||
export const projectUnitsMapping = {json.dumps(units_mapping, ensure_ascii=False, indent=2)};
|
||||
|
||||
// 获取项目的复合能力课程
|
||||
export const getCompoundUnits = (projectTitle) => {{
|
||||
if (!projectTitle) return [];
|
||||
|
||||
// 直接匹配
|
||||
if (projectUnitsMapping[projectTitle]) {{
|
||||
return projectUnitsMapping[projectTitle].compoundUnits || [];
|
||||
}}
|
||||
|
||||
// 尝试去除后缀后匹配(如"详情")
|
||||
const cleanTitle = projectTitle.replace(/详情$/, '');
|
||||
if (projectUnitsMapping[cleanTitle]) {{
|
||||
return projectUnitsMapping[cleanTitle].compoundUnits || [];
|
||||
}}
|
||||
|
||||
return [];
|
||||
}};
|
||||
|
||||
// 获取项目的垂直能力课程
|
||||
export const getVerticalUnits = (projectTitle) => {{
|
||||
if (!projectTitle) return [];
|
||||
|
||||
// 直接匹配
|
||||
if (projectUnitsMapping[projectTitle]) {{
|
||||
return projectUnitsMapping[projectTitle].verticalUnits || [];
|
||||
}}
|
||||
|
||||
// 尝试去除后缀后匹配(如"详情")
|
||||
const cleanTitle = projectTitle.replace(/详情$/, '');
|
||||
if (projectUnitsMapping[cleanTitle]) {{
|
||||
return projectUnitsMapping[cleanTitle].verticalUnits || [];
|
||||
}}
|
||||
|
||||
return [];
|
||||
}};
|
||||
|
||||
// 获取项目的所有对应单元
|
||||
export const getProjectUnits = (projectTitle) => {{
|
||||
const mapping = projectUnitsMapping[projectTitle];
|
||||
if (!mapping) return [];
|
||||
|
||||
return [...mapping.compoundUnits, ...mapping.verticalUnits];
|
||||
}};
|
||||
"""
|
||||
|
||||
# 写入文件
|
||||
with open('src/mocks/projectLibraryMock.js', 'w', encoding='utf-8') as f:
|
||||
f.write(mock_js_content)
|
||||
|
||||
with open('src/data/projectUnitsMapping.js', 'w', encoding='utf-8') as f:
|
||||
f.write(mapping_js_content)
|
||||
|
||||
print(f"成功转换 {len(health_data)} 个大健康项目案例")
|
||||
print("数据结构:")
|
||||
print(f"- id: 数字ID")
|
||||
print(f"- name: 项目名称")
|
||||
print(f"- description: 简短描述(方向)")
|
||||
print(f"- positions: 岗位字符串数组")
|
||||
print(f"- unit: 对应单元")
|
||||
print(f"- direction: 所属方向")
|
||||
print(f"- category: 分类")
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,282 @@
|
||||
// 项目案例对应单元映射数据 - 大健康产业
|
||||
|
||||
export const projectUnitsMapping = {
|
||||
"老年健康管理与营养照护综合服务优化项目": {
|
||||
"compoundUnits": [
|
||||
"健康管理基础",
|
||||
"常见护理实务"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"健康检查与智慧养老服务",
|
||||
"慢性病管理",
|
||||
"健康管理基础",
|
||||
"健康政策与法规解读"
|
||||
]
|
||||
},
|
||||
"东阿阿胶品牌运营与网络营销项目": {
|
||||
"compoundUnits": [
|
||||
"AI人工智能在大健康产业的应用"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"健康运动与社群运营",
|
||||
"新媒体运营基础"
|
||||
]
|
||||
},
|
||||
"采耳社群运营与品牌推广项目": {
|
||||
"compoundUnits": [
|
||||
"AI人工智能在大健康产业的应用"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"健康运动与社群运营",
|
||||
"新媒体运营基础"
|
||||
]
|
||||
},
|
||||
"药品供应链优化与精细化管理项目": {
|
||||
"compoundUnits": [
|
||||
"药品生产/经营的质量管理体系解读"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"GMP与药品生产规范"
|
||||
]
|
||||
},
|
||||
"阿司匹林片生产工艺优化与质量控制体系建设项目": {
|
||||
"compoundUnits": [
|
||||
"基础制药工艺",
|
||||
"药品生产/经营的质量管理体系解读"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"智能制药设备应用",
|
||||
"药品生产工艺设计",
|
||||
"药品生产工艺",
|
||||
"药品生产实战",
|
||||
"典型制药设备及智能化控制"
|
||||
]
|
||||
},
|
||||
"中年高管心血管风险健康咨询干预项目": {
|
||||
"compoundUnits": [
|
||||
"健康管理基础",
|
||||
"AI人工智能在大健康产业的应用"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"慢性病管理",
|
||||
"健康管理基础",
|
||||
"健康政策与法规解读",
|
||||
"健康数据分析基础"
|
||||
]
|
||||
},
|
||||
"学校健康体检服务质量管理与影像诊断优化项目": {
|
||||
"compoundUnits": [
|
||||
"健康管理基础",
|
||||
"常见护理实务",
|
||||
"医疗认知"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"慢性病管理",
|
||||
"健康管理基础",
|
||||
"健康政策与法规解读",
|
||||
"健康数据分析基础"
|
||||
]
|
||||
},
|
||||
"创新型残疾儿童功能恢复与康复服务项目": {
|
||||
"compoundUnits": [
|
||||
"健康管理基础",
|
||||
"常见护理实务"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"康复治疗",
|
||||
"健康咨询及客户转化",
|
||||
"健康管理基础"
|
||||
]
|
||||
},
|
||||
"某产妇产后康复全流程项目": {
|
||||
"compoundUnits": [
|
||||
"健康管理基础",
|
||||
"常见护理实务"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"康复治疗",
|
||||
"健康咨询及客户转化",
|
||||
"健康管理基础"
|
||||
]
|
||||
},
|
||||
"腓肠肌(小腿肚)Ⅱ级拉伤运动康复项目": {
|
||||
"compoundUnits": [
|
||||
"健康管理基础",
|
||||
"常见护理实务"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"康复治疗",
|
||||
"健康咨询及客户转化",
|
||||
"健康管理基础"
|
||||
]
|
||||
},
|
||||
"卒中后言语失用与非流利性失语康复治疗项目": {
|
||||
"compoundUnits": [
|
||||
"健康管理基础",
|
||||
"常见护理实务"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"康复治疗",
|
||||
"健康咨询及客户转化",
|
||||
"健康管理基础"
|
||||
]
|
||||
},
|
||||
"社区慢性病患者管理与健康促进项目": {
|
||||
"compoundUnits": [
|
||||
"健康管理基础",
|
||||
"常见护理实务"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"慢性病管理",
|
||||
"健康管理基础",
|
||||
"健康政策与法规解读"
|
||||
]
|
||||
},
|
||||
"定制化职场女性轻医美美肤方案": {
|
||||
"compoundUnits": [
|
||||
"健康管理基础",
|
||||
"AI人工智能在大健康产业的应用",
|
||||
"医疗认知"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"慢性病管理",
|
||||
"健康管理基础",
|
||||
"健康政策与法规解读"
|
||||
]
|
||||
},
|
||||
"轻医美面部年轻化与精致化调整项目": {
|
||||
"compoundUnits": [
|
||||
"健康管理基础",
|
||||
"AI人工智能在大健康产业的应用",
|
||||
"医疗认知"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"慢性病管理",
|
||||
"健康管理基础",
|
||||
"健康政策与法规解读"
|
||||
]
|
||||
},
|
||||
"初三学生中考前焦虑心理辅导项目": {
|
||||
"compoundUnits": [
|
||||
"健康管理基础",
|
||||
"AI人工智能在大健康产业的应用",
|
||||
"医疗认知"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"慢性病管理",
|
||||
"健康管理基础",
|
||||
"健康政策与法规解读"
|
||||
]
|
||||
},
|
||||
"阿莫西林胶囊制剂生产工艺优化项目": {
|
||||
"compoundUnits": [
|
||||
"基础制药工艺",
|
||||
"药品生产/经营的质量管理体系解读",
|
||||
"基础药品认知",
|
||||
"药品生产法规"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"药品生产工艺设计",
|
||||
"药品生产工艺"
|
||||
]
|
||||
},
|
||||
"维生素C原料药生产质量控制项目": {
|
||||
"compoundUnits": [
|
||||
"药品生产/经营的质量管理体系解读",
|
||||
"药品生产法规"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"药品质量管理体系",
|
||||
"药品质量管理",
|
||||
"GMP与药品生产规范"
|
||||
]
|
||||
},
|
||||
"甲硝唑质量检测项目": {
|
||||
"compoundUnits": [
|
||||
"药品生产/经营的质量管理体系解读",
|
||||
"检验检测原理与设备操作"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"药品质量管理体系",
|
||||
"药品质量管理",
|
||||
"GMP与药品生产规范"
|
||||
]
|
||||
},
|
||||
"某品牌5%葡萄糖注射液抽检工作方案": {
|
||||
"compoundUnits": [
|
||||
"药品生产/经营的质量管理体系解读",
|
||||
"检验检测原理与设备操作"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"药品质量管理体系",
|
||||
"药品质量管理",
|
||||
"GMP与药品生产规范"
|
||||
]
|
||||
},
|
||||
"新型抗肝癌药物药效验证项目": {
|
||||
"compoundUnits": [
|
||||
"药品生产/经营的质量管理体系解读",
|
||||
"检验检测原理与设备操作"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"药品质量管理体系",
|
||||
"药品质量管理",
|
||||
"GMP与药品生产规范"
|
||||
]
|
||||
},
|
||||
"老年人免疫力与心血管保健品临床试验项目": {
|
||||
"compoundUnits": [
|
||||
"药品生产/经营的质量管理体系解读",
|
||||
"检验检测原理与设备操作"
|
||||
],
|
||||
"verticalUnits": [
|
||||
"药物分析",
|
||||
"药品分析技术",
|
||||
"药品质量管理"
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
// 获取项目的复合能力课程
|
||||
export const getCompoundUnits = (projectTitle) => {
|
||||
if (!projectTitle) return [];
|
||||
|
||||
// 直接匹配
|
||||
if (projectUnitsMapping[projectTitle]) {
|
||||
return projectUnitsMapping[projectTitle].compoundUnits || [];
|
||||
}
|
||||
|
||||
// 尝试去除后缀后匹配(如"详情")
|
||||
const cleanTitle = projectTitle.replace(/详情$/, '');
|
||||
if (projectUnitsMapping[cleanTitle]) {
|
||||
return projectUnitsMapping[cleanTitle].compoundUnits || [];
|
||||
}
|
||||
|
||||
return [];
|
||||
};
|
||||
|
||||
// 获取项目的垂直能力课程
|
||||
export const getVerticalUnits = (projectTitle) => {
|
||||
if (!projectTitle) return [];
|
||||
|
||||
// 直接匹配
|
||||
if (projectUnitsMapping[projectTitle]) {
|
||||
return projectUnitsMapping[projectTitle].verticalUnits || [];
|
||||
}
|
||||
|
||||
// 尝试去除后缀后匹配(如"详情")
|
||||
const cleanTitle = projectTitle.replace(/详情$/, '');
|
||||
if (projectUnitsMapping[cleanTitle]) {
|
||||
return projectUnitsMapping[cleanTitle].verticalUnits || [];
|
||||
}
|
||||
|
||||
return [];
|
||||
};
|
||||
|
||||
// 获取项目的所有对应单元
|
||||
export const getProjectUnits = (projectTitle) => {
|
||||
const mapping = projectUnitsMapping[projectTitle];
|
||||
if (!mapping) return [];
|
||||
|
||||
return [...mapping.compoundUnits, ...mapping.verticalUnits];
|
||||
};
|
||||
Reference in New Issue
Block a user