恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

AI智能体+MCP:让Itasca离散元水力压裂模拟实现自动化

  • 首页
  • 资讯中心
  • /
  • AI智能体+MCP:让Itasca离散元水力压裂模拟实现自动化

相关资讯

VS Code Markdown 写作指南:从实时预览到导出的一站式高效工作流 2026/9/2 3:27:16
航天科普平台架构设计:多媒体内容引擎与工程化实践 2026/9/2 3:27:16
DebuffFilter全面优化:低开销过滤与敌人技能详细说明配置指南 2026/9/2 3:27:16

最新资讯

职场报告写作指南:从执行摘要到数据呈现,让informe真正为决策服务
gcc_rpm.tar.gz离线安装与GCC升级切换实战指南
PLSQL Developer 6.0.0.840汉化版使用指南:安装配置与调试实战
Trae CN深度体验:AI IDE如何理解项目代码并提升开发效率
CoPaw源码安装与配置实战:从环境准备到踩坑全记录
cronolog日志切割实战:从编译安装到Apache/Nginx接入

今日推荐

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案
用Python搭建搞笑语音助手:从语音识别到语音合成全教程
ROS2阿克曼底盘仿真:从运动学原理到Nav2导航集成实践

本周热门

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析
数字电路时序基石:深入理解建立时间与保持时间
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

AI智能体+MCP:让Itasca离散元水力压裂模拟实现自动化

发布时间:2026/9/2 3:27:17
AI智能体+MCP:让Itasca离散元水力压裂模拟实现自动化 这次我们来看一个很特别的技术组合AI 智能体不再是只聊天、只写代码而是通过 MCP 协议直接驾驶 Itasca 公司的离散元软件去做水力压裂模拟。如果你接触过 3DEC、UDEC、PFC 这套工具应该知道这类离散元软件的上手成本有多高建模要写大量的 FISH 或 Python 脚本参数要调工况要一遍遍试。而 AI 智能体恰恰擅长做“按照需求生成代码、拆解任务、反复试错”这类事。问题在于大模型默认读不到你的仿真软件它不知道你有几个块体、节理参数是什么、结果文件在哪。MCPModel Context Protocol模型上下文协议就是来补这个缺口的它相当于给 AI 智能体装上一套“操作 Itasca 的外部工具接口”。把这个接口搭好之后你完全可以对着智能体说“把注入压力提高 10% 再跑一轮”然后让它自己去改脚本、提交计算、读回裂纹扩展结果。这篇文章会从一个通用的 itasca-mcp 集成思路出发带你完成环境准备、MCP Server 搭建、AI Agent 连接、水力压裂工况调用、批量任务编排和常见故障排查。后面所有代码都是教学级示范具体到你的 Itasca 版本和官方 API 命名需要按实际环境替换。如果你正在做岩体力学、油气压裂、地热开发、矿山安全这类方向又想让 AI 深度参与仿真流程这篇文章可以直接收藏。1. 核心能力速览先把这次要讨论的方案整体信息列出来方便你在往下读之前快速判断值不值得投入时间。能力项说明项目类型AI 智能体 MCP 工程仿真集成方案核心协议MCPModel Context Protocol目标软件Itasca 系列离散元软件如 3DEC、UDEC、PFC应用方向水力压裂模拟、节理岩体分析、离散元建模启动方式MCP Server 命令行启动再接入 AI 客户端主要功能参数化建模、脚本生成、批量工况模拟、结果提取是否支持 API支持通过 MCP 工具暴露给 Agent也可用脚本调用批量任务可设计多工况队列由 Agent 或外部脚本循环调度硬件门槛以 Itasca 求解器要求为准通常吃 CPU 和内存适合人群岩土/油气/地热方向的仿真工程师、AI 应用开发者这里要强调一句MCP 这一层并不替代 Itasca 的求解器也不替代你脑中必须掌握的力学模型知识。它解决的是“AI 智能体如何安全、可控地操作离散元软件”这条链路。2. itasca-mcp 是什么适用边界在哪里2.1 它解决的真正问题Itasca 的离散元软件3DEC、UDEC、PFC 等都有自己的脚本语言体系比如 FISH以及新版中逐步完善的 Python API。仿真工程师日常要做的事情本质上是反复执行一条链路建立几何模型包括岩块、节理、边界条件赋予材料参数、节理参数、本构模型设置水力压裂相关的注入点、压力曲线、流体属性求解并观察裂隙萌生、扩展、贯通过程提取数据输出应力、位移、裂隙体积、注入量等结果。这条链路里工作量最大的一部分是“参数调整后的重复运行”。传统做法是人工改脚本、提交计算、查看结果再回头改参数。而 AI 智能体天然适合做这种“规划—执行—观察—再规划”的循环。MCP 的出现让智能体能够通过一组定义良好的工具函数主动去执行模拟脚本、读取日志、查看输出文件并基于反馈修正下一步动作。2.2 它是怎么工作的一个最简单的 itasca-mcp 架构可以这样理解AI 智能体Claude、Codex 或自研 Agent作为大脑MCP Server 作为中间桥梁把 Itasca 的能力包装成一个个可调用工具Itasca 软件本身负责离散元求解求解结果以日志、图片、数据文件的形式反馈给智能体。整个过程中AI 不需要直接输入成段的 FISH 代码而是通过 MCP 工具例如调用run_frac_simulation来执行一次模拟通过get_last_result来读取结果摘要。工具内部怎么写可以由工程经验决定这样可以避免大模型自由发挥时编造不存在的 API。2.3 适用场景与使用边界先说适合什么参数敏感性分析让 Agent 批量修改注入压力、节理刚度、初始裂隙密度自动对比结果。脚本自动生成让 Agent 根据自然语言需求生成 PFC/3DEC 的初始化脚本再由工程师复核。结果初步整理模拟完成后Agent 解析日志生成裂隙扩展特征和压力曲线说明。教学辅助帮助新人理解不同节理参数对压裂效果的影响。再说不适合什么不要把 AI 生成的计算脚本不加复核直接用于工程决策不要指望 MCP 层能提高离散元本身的求解精度不要用这个方案绕过 Itasca 的授权机制或正版限制不要在没有专业地质/力学人员把关的前提下让 Agent 自动选择本构模型。另外需要特别提醒任何涉及实际工程项目、现场数据、甲方资料的内容都要在授权范围内使用仿真结果只能作为辅助参考最终工程方案必须由具备资质的人员复核。3. 环境准备与前置条件3.1 软件与依赖清单在没有具体开源仓库的前提下我按通用的 MCP Itasca 集成思路整理一份前置环境清单。具体版本号以你本机安装的 Itasca 软件和官方 API 文档为准。环境项建议操作系统Windows 10/11 或 Linux按 Itasca 软件支持选择Itasca 软件3DEC / UDEC / PFC 等确认版本自带 Python API 或 FISH 可调用Python3.10 或 3.11建议独立虚拟环境MCP SDKmcpPython 包或官方 TypeScript SDKAI 客户端Claude Desktop、Codex CLI、自定义 Agent 均可许可Itasca 授权的可执行计算许可磁盘至少预留 20GB 以上模拟结果文件通常很大3.2 需要提前确认的三个问题第一个问题你的 Itasca 软件能否通过命令行或 Python 脚本调用不同产品、不同版本提供的接口差别很大。有些版本提供了完整的 Python 模块可以导入后直接建模型有些版本只能靠执行 FISH 脚本文件。确认方式很简单读你安装目录下的apidoc或官方 Python 示例。第二个问题AI 客户端能否连接本地 MCP ServerClaude Desktop 需要在配置文件中注册 MCP ServerCodex CLI 通过配置文件同样支持。如果你用的是自研 Agent需要安装mcp客户端 SDK 自行连接。第三个问题你打算如何管理并发模拟如果一次只跑一个工况串行即可如果要批量跑几百个工况需要确认 Itasca 许可支持几个并行实例否则批量任务会排队或报错。3.3 建立项目目录建议把所有内容按固定目录存放避免 Agent 在批量任务中找不到文件。itasca-mcp-demo/ ├── mcp_server.py # MCP Server 主程序 ├── agent_utils.py # 调用 Itasca 的封装函数 ├── cases/ # 单个工况目录 │ └── case_001/ ├── scripts/ # 生成的 FISH / Python 脚本 ├── logs/ # 求解日志 ├── outputs/ # 计算结果 └── config.json # 默认参数这样做的意义是AI Agent 只需要记住“脚本放 scripts结果看 outputs”不需要猜测文件路径错误率会大幅下降。4. itasca-mcp 服务端搭建与启动4.1 MCP Server 的整体结构下面是一个基于 Python 的 MCP Server 骨架。它用mcp官方 Python SDK 创建两个工具run_frac_case执行一次水力压裂工况模拟get_case_result读取指定工况的结果摘要。import json import subprocess from pathlib import Path # mcp 官方 Python SDK 的 FastMCP 封装 from mcp.server.fastmcp import FastMCP mcp FastMCP(itasca-mcp) BASE_DIR Path(__file__).resolve().parent CASES_DIR BASE_DIR / cases SCRIPTS_DIR BASE_DIR / scripts OUTPUTS_DIR BASE_DIR / outputs # 这里放入调用 Itasca 求解器的命令模板 # 不同软件/版本的调用方式不同必须按官方文档替换 ITASCA_CMD [ itasca-console, # 示例命令不是通用命令 --run, # 示例参数 ] mcp.tool() def run_frac_case(case_name: str, params: dict) - str: 运行一个水力压裂离散元模拟工况。 Args: case_name: 工况名称例如 case_001。 params: 参数词典可包含注入压力、节理刚度、初始裂隙密度等。 case_dir CASES_DIR / case_name case_dir.mkdir(parentsTrue, exist_okTrue) # 把参数保存为配置文件 with open(case_dir / params.json, w, encodingutf-8) as f: json.dump(params, f, ensure_asciiFalse, indent2) # 生成一个模拟脚本实际内容需要结合 Itasca API script_path SCRIPTS_DIR / f{case_name}.dat script_content build_simulation_script(case_name, params) script_path.write_text(script_content, encodingutf-8) # 调用 Itasca 求解器 result subprocess.run( ITASCA_CMD [str(script_path)], capture_outputTrue, textTrue, timeout3600 ) log_path LOGS_DIR / f{case_name}.log log_path.write_text(result.stdout, encodingutf-8) return f模拟完成日志已写入 {log_path}注意build_simulation_script需要你根据 Itasca 的具体脚本语法来实现。下面是它的示意逻辑def build_simulation_script(case_name: str, params: dict) - str: 根据参数生成一个离散元模拟脚本。 这里只是模板必须替换为 Itasca 的 FISH / Python 语法。 injection_pressure params.get(injection_pressure, 10.0) joint_stiffness params.get(joint_stiffness, 1e9) steps params.get(steps, 5000) script f ; 这是一个示意脚本请根据 Itasca 官方语法替换 model new ; 创建块体、节理、边界条件... ; set inject pressure {injection_pressure} ; set joint stiffness {joint_stiffness} ; solve steps {steps} return script之所以强调“按官方语法替换”是因为不同离散元产品的脚本差异非常大。盲目复制网上的 FISH 代码大概率会直接报错。4.2 启动 MCP Server在项目目录下启动cd itasca-mcp-demo pip install mcp[cli] 2/dev/null || pip install mcp python mcp_server.py如果 SDK 支持mcp.run()你也可以在文件底部加上if __name__ __main__: mcp.run()启动后服务端会进入等待状态等待 AI 客户端通过标准输入输出或 HTTP 方式连接。4.3 配置 AI 客户端连接 MCP Server以 Claude Desktop 为例你需要在客户端配置文件中注册一个 MCP Server。配置文件的位置因客户端版本而异通常在用户配置目录下。{ mcpServers: { itasca-mcp: { command: python, args: [ C:/path/to/itasca-mcp-demo/mcp_server.py ], cwd: C:/path/to/itasca-mcp-demo } } }如果你是自研 Agent则用 Python 启动客户端import asyncio from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client async def main(): server_params StdioServerParameters( commandpython, args[mcp_server.py], cwdC:/path/to/itasca-mcp-demo ) async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() tools await session.list_tools() for tool in tools: print(发现工具:, tool.name, tool.description) asyncio.run(main())这一步能跑通说明“AI Agent - MCP Server - Itasca”的数据链路已经打通。5. 功能测试让 AI 智能体驾驶水力压裂模拟5.1 测试一能力探测先把智能体连上问一句最基础的问题你现在有哪些工具分别能做什么预期回答会列出run_frac_case和get_case_result并描述它们的参数。如果智能体说不知道有工具优先检查 MCP Server 是否成功注册、客户端的工具列表是否刷新。5.2 测试二参数化建模让智能体按你的要求生成一组模拟参数并提交帮我建立一个水力压裂工况 case_001 注入压力 12 MPa节理法向刚度 2 GPa初始裂隙密度 0.05计算步数 5000。这时 Agent 会调用run_frac_case传入对应的params字典。成功标准是scripts/case_001.dat文件已生成目录cases/case_001/params.json内容正确Itasca 日志出现在logs/case_001.log返回信息包含“模拟完成”。常见失败是脚本语法问题。遇到这类问题直接把错误日志贴给 Agent让它修改脚本生成逻辑。5.3 测试三结果读取为了让 Agent 能“看”结果我们需要写第二个 MCP 工具。mcp.tool() def get_case_result(case_name: str) - str: 读取一个模拟工况的结果摘要。 log_path LOGS_DIR / f{case_name}.log if not log_path.exists(): return 未找到日志文件请先运行模拟。 # 这里建议用正式的结果解析逻辑而不是直接取日志 # 例如读取输出文件中的裂隙体积、最大压力等 summary parse_result(log_path) return json.dumps(summary, ensure_asciiFalse, indent2)parse_result同样需要根据 Itasca 输出文件的格式来实现。简化版可以只读取日志最后几十行def parse_result(log_path): lines log_path.read_text(encodingutf-8, errorsignore).splitlines() tail lines[-30:] return {log_tail: tail}让 Agent 调用后如果它能准确说出“case_001 最后一步的应力/裂隙信息”这个测试就算通过。5.4 测试四多轮迭代这一轮是重点。让 Agent 完成一个闭环先跑 case_001然后读取结果。如果裂隙数量比上一组少就提高注入压力 10%再跑 case_002并对比两个工况的差异。如果链路通畅Agent 会自动执行“生成脚本 - 提交计算 - 读取日志 - 调整参数 - 再次提交”不需要你手动介入。这个测试最能体现 MCP 的价值。6. 接口 API 与批量任务设计6.1 MCP 工具本质上就是接口当你用自研 Agent 或写 Python 脚本调用 MCP Server 时MCP 工具就等价于一个本地 API。它的好处是参数有 schema 校验返回结果结构化。一个工具的输入定义大致如下{ name: run_frac_case, description: 运行水力压裂离散元模拟, inputSchema: { type: object, properties: { case_name: { type: string, description: 工况名称 }, params: { type: object, properties: { injection_pressure: { type: number, description: 注入压力单位 MPa }, joint_stiffness: { type: number, description: 节理法向刚度单位 Pa }, steps: { type: integer, description: 计算步数 } }, required: [injection_pressure, steps] } }, required: [case_name, params] } }在自研 Agent 中你可以通过 Python 调用工具效果等同于请求一个接口import asyncio from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client async def call_run_frac_case(session: ClientSession, case_name: str, params: dict): result await session.call_tool( run_frac_case, arguments{ case_name: case_name, params: params } ) return result async def main(): server_params StdioServerParameters( commandpython, args[mcp_server.py], ) async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() result await call_run_frac_case( session, case_001, {injection_pressure: 12.0, steps: 5000} ) print(result) asyncio.run(main())这里要提醒一点MCP 客户端调用是异步的如果你的工具函数内部是同步的subprocess.run注意在事件循环中会阻塞。建议用asyncio.to_thread包装耗时的模拟调用。6.2 批量任务队列的通用设计批量跑工况时最忌讳让几个模拟同时抢同一个工作目录。推荐一个简单的队列设计# 批量循环示例 for i in $(seq 1 10); do case_name$(printf case_%03d $i) python client_batch.py --case $case_name \ --pressure $(python -c print(10 $i * 0.5)) \ --steps 5000 sleep 2 done对应的client_batch.py伪代码如下import argparse import asyncio from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client async def run_one_case(case_name, pressure, steps): server_params StdioServerParameters( commandpython, args[mcp_server.py], ) async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() params { injection_pressure: pressure, joint_stiffness: 2e9, steps: steps, } result await session.call_tool( run_frac_case, arguments{case_name: case_name, params: params} ) print(case_name, result) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--case, requiredTrue) parser.add_argument(--pressure, typefloat, requiredTrue) parser.add_argument(--steps, typeint, default5000) args parser.parse_args() asyncio.run(run_one_case(args.case, args.pressure, args.steps))批量任务必须有日志和失败重试机制。建议每次提交前把工况参数写入独立目录失败后保留日志不要自动重试超过两次避免异常参数无限消耗计算资源。7. 资源占用与性能观察方法离散元模拟和图像生成类项目不一样资源瓶颈通常不在显存而在 CPU、内存和磁盘读写。如果你的 Itasca 版本支持 GPU 加速也需要单独确认具体设置。7.1 观察哪些指标观察项方法关注点CPU 占用Windows 任务管理器 / Linux top求解阶段是否跑满内存占用top或任务管理器大规模块体和节理网格会造成较高内存占用磁盘 IOiostat或资源监视器日志和结果文件写入频繁求解时长查看 Itasca 日志中的时间戳每个步数消耗时间是否稳定并发实例Itasca 日志或进程列表是否有重复进程抢占许可7.2 模拟参数对性能的影响计算步数steps是最直接的影响因素步数翻倍耗时通常近似翻倍。模型规模块体数量、节理单元数量影响内存模型越密内存增长越明显。输出频率如果设置过高会让大量时间消耗在文件写入上。批量任务如果并发太高会同时卡死或触发许可限制。7.3 如何降低资源占用先用小规模模型跑通流程再逐步加大。长时间批量任务建议错开运行时间避免许可冲突。减少中间步骤输出只在关键阶段保存快照。日志文件按工况分离定期清理历史结果。8. 常见问题与排查方法问题现象可能原因排查方式解决方案AI 客户端看不到任何 MCP 工具MCP Server 未注册或启动失败检查客户端日志手动运行启动命令重写启动命令确认 Python 环境一致调用run_frac_case超时模拟脚本卡死或步数过大查看 Itasca 日志最后输出减少步数加超时控制检查脚本循环Itasca 提示没有有效许可许可未配置或并发超标查看软件许可状态重新激活许可减少并发实例生成的模拟脚本语法报错AI 生成的代码不符合 FISH/Python 语法把错误日志贴给 Agent在提示词中明确脚本模板建立脚本校验函数批处理过程中某个工况失败参数越界或文件路径冲突查看该工况独立日志每个工况独立目录失败重试不超过两次Agent 读取不到结果结果文件路径不对打印工作目录和文件列表统一输出路径给工具增加list_outputs能力客户端调用接口返回乱码编码问题检查encoding参数统一用 UTF-8 读写文件控制台输出设置环境变量MCP 连接被占用端口或 stdio 冲突查看是否有残留进程杀掉残留进程重启客户端模拟结果不稳定参数不合理或收敛性差检查迭代曲线、能量平衡人工复核模型结合专业经验调整参数这张表是通用排查思路具体到你的 Itasca 版本时优先看官方日志给出的错误码和提示信息那通常是定位速度最快的入口。9. 最佳实践与合规使用建议9.1 工程化落地建议第一先跑通最小闭环。不要一上来就让 Agent 做复杂压裂方案。先让它建一个最简单的单裂隙模型确认 MCP 工具能正常工作再逐步增加参数维度。第二锁定依赖版本。AI 客户端、MCP SDK、Itasca 软件、Python 版本任何一个变化都可能导致接口不兼容。建议把环境写进requirements.txt并记录实测可用的 Itasca 版本。第三设计“工具白名单”。MCP Server 中只暴露必要的工具不要给 Agent 无限制的文件系统操作权限。建议工具粒度到“运行某个案例、读取某个结果、列出输出文件”而不是“执行任意命令行”。否则 Agent 一旦被诱导生成危险命令可能破坏本地文件。第四批量任务要保留审计痕迹。每个工况对应的params.json、生成脚本、日志、结果文件都按统一命名保存方便回溯。9.2 合规与安全边界这个方案里特别容易踩的坑是数据和授权问题使用 Itasca 软件必须遵守其授权协议不得共享或破解许可。工程数据、地质资料、客户信息要确认是否有权限输入到 AI 客户端。如果使用云端大模型要格外注意数据出境和企业保密要求。涉及真实压裂工程时AI 自动生成的参数、模型、结论不能直接作为工程交底材料必须由具备资质的人员复核。如果后续扩大到声音、图像、人脸相关内容仍需遵循同样逻辑未授权素材不使用生成内容不冒充专业意见。9.3 提供一套最小可运行配置建议把下面内容写入项目的README.md保证换一台电脑也能快速恢复环境# 1. 创建虚拟环境 python -m venv .venv source .venv/bin/activate # Windows 为 .venv\Scripts\activate # 2. 安装依赖 pip install mcp requests # 3. 启动服务 python mcp_server.py9.4 提示词设计技巧AI Agent 在调用 MCP 工具时容易出现“编参数”“漏参数”的问题。解决办法是在系统提示词中明确写清楚你是离散元水力压裂模拟助手。你需要通过 itasca-mcp 工具完成工况模拟。 规则 1. 调用 run_frac_case 前必须确认注入压力、节理刚度、计算步数三个参数齐全。 2. 调用 get_case_result 前必须确认对应工况已运行。 3. 如果日志报错把错误信息原样复制给用户不要替用户决定是否继续。 4. 模拟结果只做技术参考不提供工程决策结论。这样能明显减少 Agent“瞎跑”的概率。10. 总结与下一步itasca-mcp 这个方向最值得尝试的点是把 AI 智能体从“文本助手”变成“仿真任务执行器”。过去你需要自己写脚本、手动调参数、逐个查看结果现在可以让 Agent 通过 MCP 工具完成参数化建模、批量提交和结果读取把重复劳动压缩到几轮对话里。拿到这套方案后最先应该验证的是很小的一件事MCP Server 能否被 AI 客户端识别并且成功调用一次run_frac_case。不要追求第一次就跑大型模型先让最小的示例跑通再逐步增加水力压裂参数。最容易踩的坑有三个一是 Itasca 脚本语法与 MCP 工具封装不匹配二是客户端连接 MCP 时工作目录不对导致找不到文件三是并发模拟消耗掉全部许可导致后续任务全部排队。这三个坑在文章里都有对应排查思路。下一步可以扩展的方向很多。你可以在 MCP Server 里增加更多工具比如“批量生成压裂方案报告”“自动对比多工况曲线”“根据历史结果推荐下一组参数”。也可以把 Agent 接到企业知识库让它先检索项目规范再生成模拟方案形成一个更完整的智能体工作流。原理都一样先定义好工具再让 Agent 在受控边界内自主完成工作。建议先把这次的最小闭环跑起来后面每一步都能在这个基础上继续加。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号