#!/usr/bin/env python3 import json import re # 读取源数据 with open('网页未导入数据/交通物流产业/交通物流项目案例.json', 'r', encoding='utf-8') as f: source_data = json.load(f) # 读取现有的mock文件来获取项目列表部分 with open('src/mocks/projectLibraryMock.js', 'r', encoding='utf-8') as f: content = f.read() # 提取getMockProjectsList函数 projects_list_match = re.search(r'(export const getMockProjectsList.*?)export const getMockProjectDetail', content, re.DOTALL) if not projects_list_match: print("无法找到getMockProjectsList函数") exit(1) projects_list_func = projects_list_match.group(1).rstrip() # 定义岗位等级映射 position_levels = { 'WMS软件销售': '普通岗', '物流协调员': '普通岗', '仓储业务开发专员': '技术骨干岗', 'AGV运维专员': '技术骨干岗', 'AGV运维工程师': '高级管理岗', '物流审核员': '普通岗', '云物流调度负责人助理': '高级管理岗', '物流运营总监助理': '高级管理岗', '生产计划岗储备干部': '技术骨干岗', '国际物流储备经理': '高级管理岗', '供应链总监助理': '高级管理岗', 'TMS销售专员': '普通岗', '海外运输经理助理': '高级管理岗', '海外物流协调员': '技术骨干岗', '海外仓设备运维工程师': '技术骨干岗', '售后支持专员': '普通岗', '采购专员': '普通岗', '港口安全员': '技术骨干岗' } def remove_title_from_content(content_text, title_to_remove): """去掉内容开头的标题行""" lines = content_text.split('\n') filtered_lines = [] for line in lines: # 跳过标题行 if line.strip() == title_to_remove: continue # 如果不是空行或者已经开始有内容了,就保留 if line.strip() or filtered_lines: filtered_lines.append(line) return '\n'.join(filtered_lines).strip() # 构建新的getMockProjectDetail函数 detail_func_parts = ['export const getMockProjectDetail = (id) => {'] detail_func_parts.append(' const projects = [') for idx, project in enumerate(source_data, 1): name = project['案例名称'] content_text = project['项目案例内容'] print(f"处理项目{idx}: {name}") # 找到各个标题的位置 overview_start = content_text.find('# 一、项目概述') process_start = content_text.find('# 二、项目整体流程介绍') keypoints_start = content_text.find('# 三、项目案例关键技术点') # 提取概述部分(去掉标题) if overview_start != -1 and process_start != -1: overview_raw = content_text[overview_start:process_start].strip() overview = remove_title_from_content(overview_raw, '# 一、项目概述') elif overview_start != -1: overview_raw = content_text[overview_start:overview_start+1000].strip() overview = remove_title_from_content(overview_raw, '# 一、项目概述') else: overview = content_text[:1000].strip() # 提取流程部分(去掉标题) if process_start != -1 and keypoints_start != -1: process_raw = content_text[process_start:keypoints_start].strip() process = remove_title_from_content(process_raw, '# 二、项目整体流程介绍') elif process_start != -1: remaining = content_text[process_start:] mid_point = len(remaining) // 2 process_raw = remaining[:mid_point].strip() process = remove_title_from_content(process_raw, '# 二、项目整体流程介绍') else: process = "项目流程介绍待补充" # 提取技术点部分(去掉标题) if keypoints_start != -1: keypoints_raw = content_text[keypoints_start:].strip() keypoints = remove_title_from_content(keypoints_raw, '# 三、项目案例关键技术点') elif process_start != -1: remaining = content_text[process_start:] mid_point = len(remaining) // 2 keypoints_raw = remaining[mid_point:].strip() keypoints = remove_title_from_content(keypoints_raw, '# 三、项目案例关键技术点') else: keypoints = "技术要点待补充" print(f" 概述长度: {len(overview)}") print(f" 流程长度: {len(process)}") print(f" 技术点长度: {len(keypoints)}") # 重要:对模板字符串内容进行转义 overview = overview.replace('\\', '\\\\').replace('`', '\\`').replace('${', '\\${') process = process.replace('\\', '\\\\').replace('`', '\\`').replace('${', '\\${') keypoints = keypoints.replace('\\', '\\\\').replace('`', '\\`').replace('${', '\\${') # 获取岗位列表并转换为对象数组 positions_list = [ 'WMS软件销售', '物流协调员', '仓储业务开发专员', 'AGV运维专员', 'AGV运维工程师', '物流审核员', '云物流调度负责人助理', '物流运营总监助理', '生产计划岗储备干部', '国际物流储备经理' ] # 转换为对象数组格式 applicable_positions = [] for pos in positions_list[:5]: # 每个项目取5个岗位 applicable_positions.append({ 'position': pos, 'level': position_levels.get(pos, '普通岗') }) attachments = [ {'name': f'{name}_项目方案.pdf', 'type': 'pdf'}, {'name': f'{name}_技术文档.docx', 'type': 'docx'} ] detail_func_parts.append(f''' {{ id: {idx}, name: "{name}", title: "{name}", overview: `{overview}`, description: `{overview}`, process: `{process}`, keyPoints: `{keypoints}`, applicablePositions: {json.dumps(applicable_positions, ensure_ascii=False)}, attachments: {json.dumps(attachments, ensure_ascii=False)} }}{',' if idx < len(source_data) else ''}''') detail_func_parts.append(' ];') detail_func_parts.append('') detail_func_parts.append(' const project = projects.find(p => p.id === parseInt(id));') detail_func_parts.append(' if (!project) {') detail_func_parts.append(' return {') detail_func_parts.append(' id: parseInt(id),') detail_func_parts.append(" name: '项目未找到',") detail_func_parts.append(" title: '项目未找到',") detail_func_parts.append(" overview: '项目详情未找到',") detail_func_parts.append(" description: '项目详情未找到',") detail_func_parts.append(" process: '项目流程未找到',") detail_func_parts.append(" keyPoints: '项目关键技术点未找到',") detail_func_parts.append(' applicablePositions: [],') detail_func_parts.append(' attachments: []') detail_func_parts.append(' };') detail_func_parts.append(' }') detail_func_parts.append('') detail_func_parts.append(' return project;') detail_func_parts.append('};') # 组合完整文件内容 new_content = projects_list_func + '\n\n' + '\n'.join(detail_func_parts) # 写入文件 with open('src/mocks/projectLibraryMock.js', 'w', encoding='utf-8') as f: f.write(new_content) print("\n✅ 成功去除所有内容标题,只保留正文内容")