# SDK 调用示例 本目录包含完整的 SDK 调用示例,展示了两种不同的集成方式。 ## 📁 文件说明 ### 完整 Demo(推荐) - `demo-module.html` - **ES Module 方式完整示例**(推荐) - `demo-global.html` - **全局脚本方式完整示例** - `app-global.js` - 全局脚本方式的业务逻辑文件 ### 简单示例 - `example-module.html` - ES Module 方式简单示例 - `example-global.html` - 全局脚本方式简单示例 ## 🎯 核心设计理念 ### 业务逻辑与 SDK 解耦 根目录的 `index.js` 是一个**通用的业务逻辑层**,通过 `initApp(kernel)` 接收外部传入的 kernel 实例,实现了: ✅ **SDK 调用方式无关** - 同一套业务逻辑,适配两种 SDK 引入方式 ✅ **代码复用** - 避免重复编写业务逻辑 ✅ **易于维护** - 业务逻辑集中管理,修改一处即可 **架构图:** ``` ┌─────────────────────────────────────────┐ │ 应用层 (HTML) │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ ES Module │ │ 全局脚本 │ │ │ │ 方式引入 │ │ 方式引入 │ │ │ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────────────────────────┐ │ │ │ 通用业务逻辑 (index.js) │ │ │ │ - initApp(kernel) │ │ │ │ - init() │ │ │ │ - getAutoLoadModelList() │ │ │ │ - getHotspot() │ │ │ │ - getProductConfig() │ │ │ └──────────────┬──────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────┐ │ │ │ SDK Kernel │ │ │ │ (从外部注入) │ │ │ └─────────────────────────────────┘ │ └─────────────────────────────────────────┘ ``` --- ## 🚀 快速开始 ### 方式 1: ES Module(推荐) **文件:** `demo-module.html` ```html ``` **特点:** - ✅ 现代化模块化开发 - ✅ 直接引用根目录的 `index.js` - ✅ 支持 async/await - ✅ 更好的 IDE 智能提示 --- ### 方式 2: 全局脚本 **文件:** `demo-global.html` + `app-global.js` ```html ``` **特点:** - ✅ 兼容所有浏览器 - ✅ 无需构建工具 - ✅ 使用 `app-global.js`(根目录 `index.js` 的全局脚本版本) - ⚠️ 需要维护两份业务逻辑文件 --- ## 📖 业务逻辑 API ### 初始化 ```javascript // 注入 kernel 实例(必须首先调用) initApp(kernel) // 初始化 SDK 配置 await init(customConfig?) // 加载模型列表 await getAutoLoadModelList() ``` ### 产品配置 ```javascript // 获取产品配置并应用 await getProductConfig(sku) // 获取放置区域 await getPlacementZone(sku) ``` ### 热点管理 ```javascript // 加载并渲染热点 await getHotspot() ``` ### 事件处理 ```javascript // 执行放置区域事件 await getEvent(dropzone_data, sku) // 执行产品切换事件 await executeEvent2(result) ``` --- ## 🎨 完整 Demo 功能 两个完整 demo(`demo-module.html` 和 `demo-global.html`)都包含: ### UI 功能 - ✅ 3D 模型渲染画布 - ✅ 配置面板(产品选择、热点控制) - ✅ 加载进度显示 - ✅ 点击信息提示 ### 交互功能 - ✅ 产品切换 - ✅ 热点加载 - ✅ 模型点击事件 - ✅ 热点点击事件 ### 事件监听 ```javascript // 加载进度 kernel.on('model:load:progress', (data) => { console.log('进度:', data.progress); }); // 加载完成 kernel.on('model:loaded', (data) => { console.log('模型列表:', data.models); }); // 模型点击 kernel.on('model:click', (data) => { console.log('点击:', data.meshName); }); // 热点点击 kernel.on('hotspot:click', (event) => { console.log('热点:', event.name); }); ``` --- ## 🔧 本地运行 ### ES Module 方式 ```bash # 需要本地服务器(ES Module 不支持 file:// 协议) cd examples npx serve . # 访问 http://localhost:3000/demo-module.html ``` ### 全局脚本方式 ```bash # 可以直接双击打开 # 或使用本地服务器 cd examples npx serve . # 访问 http://localhost:3000/demo-global.html ``` --- ## 📦 集成到项目 ### Vue 3 项目 ```vue ``` ### React 项目 ```jsx import { useEffect, useRef } from 'react'; function ModelViewer() { const canvasRef = useRef(null); useEffect(() => { (async () => { // 动态导入 SDK const { kernel } = await import('https://sdk.zguiy.com/zt/assets/index.js'); const { initApp, init, getAutoLoadModelList } = await import('./app-logic.js'); // 注入 kernel initApp(kernel); // 初始化 await init({ container: canvasRef.current }); await getAutoLoadModelList(); })(); }, []); return ; } ``` ### 原生 HTML ```html 3D 模型展示 ``` --- ## 🔄 业务逻辑文件说明 ### 根目录 `index.js` (ES Module 版本) - 使用 ES6+ 语法 - 支持 `import/export` - 适用于现代构建工具 - **推荐用于新项目** ### `app-global.js` (全局脚本版本) - 使用 ES5 语法 - 通过 IIFE 包装 - 暴露到 `window.AppLogic` - 适用于传统 HTML 页面 **两个文件功能完全相同,只是语法不同。** --- ## ❓ 常见问题 ### Q: 为什么需要两个业务逻辑文件? **A:** 因为 ES Module 和全局脚本的语法不兼容: - ES Module 使用 `import/export`,不能在全局脚本中使用 - 全局脚本需要通过 `window` 对象暴露 API 如果你的项目只使用一种方式,只需要维护对应的文件即可。 ### Q: 如何选择使用哪种方式? **A:** - **现代项目 + 构建工具** → 使用 ES Module (`demo-module.html`) - **传统 HTML + 无构建工具** → 使用全局脚本 (`demo-global.html`) - **需要兼容旧浏览器** → 使用全局脚本 ### Q: 可以只维护一份业务逻辑吗? **A:** 可以!有两种方案: 1. **只用 ES Module**:使用构建工具(如 Vite)将 ES Module 转换为全局脚本 2. **只用全局脚本**:所有项目都使用 `app-global.js` ### Q: `initApp(kernel)` 必须调用吗? **A:** 是的!这是核心设计: ```javascript // ❌ 错误 - 直接调用会报错 await init(); // Error: 请先调用 initApp(kernel) // ✅ 正确 - 先注入 kernel initApp(kernel); await init(); ``` --- ## 📚 相关资源 - SDK 文档: https://sdk.zguiy.com/docs - 后端 API: https://ztserver.zguiy.com - GitHub: [项目地址] --- ## 📄 许可证 MIT License