开发指南

创建日期:2024-11-30
更新日期:2024-12-01

环境搭建

安装Node开发环境

* 国外下载地址:https://nodejs.org/en/

* 国内下载地址:http://nodejs.cn/download/

建议下载安装14.x.x版本。

Windows打开cmd或Power Shell,输入node -v,输出版本号,证明安装成功。

PS C:\Windows\system32> node -v
v14.4.0
PS C:\Windows\system32>

安装Go语言开发环境

* 国外下载地址:https://golang.org/dl/

* 国内下载地址:https://studygolang.com/dl

建议下载1.14.x版本。

Windows打开cmd或Power Shell,输入go version,输出版本号,证明安装成功。

PS C:\Windows\system32> go version
go version go1.14.4 windows/amd64
PS C:\Windows\system32>

安装Mongo数据库

下载地址:https://www.mongodb.com/try/download/community

建议下载zip版。

MongoDB v4.x版本需要Visual C++ Redistributable for Visual Studio 2015。如果下面的命令报错,你可以从这安装:https://www.microsoft.com/en-us/download/details.aspx?id=48145

安装MongoDB服务

1、解压MongoDB.zip到一个文件夹中,例如:E:\MongoDB

2、创建db和logs文件夹,如下所示:

├── db
├── logs
├── bsondump.exe
├── libeay32.dll
├── mongo.exe
├── mongod.exe
├── mongodump.exe
├── mongoexport.exe
├── mongofiles.exe
├── mongoimport.exe
├── mongoperf.exe
├── mongos.exe
├── mongostat.exe
├── mongotop.exe
└── ssleay32.exe

3、以管理员方式打开cmd或Power Shell,输入cd E:\MongoDB跳转到该目录。执行:

.\mongod --dbpath=E:\MongoDB\db --logpath=E:\MongoDB\logs\mongoDB.log --install --serviceName MongoDB

打开Windows服务查看是否有名称为MongoDB的服务,如果有,就启动它。

如果没有MongoDB服务,则安装失败,可以打开日志文件E:\MongoDB\logs\mongoDB.log查看失败原因。

安装Visual Studio Code

下载地址:https://code.visualstudio.com/

推荐安装以下VSCode扩展,它们对开发很有用。

ESLint, Go, Shader languages support for VS Code, TOML Language Support.

npm脚本使用

npm install:            安装nodejs依赖。
npm run build:          构建服务端和web客户端。
npm run build-server:   只构建服务端。(用于开发)
npm run build-web:      只构建web客户端。(用于开发)
npm run build-desktop:  构建桌面版。
npm run dev:            文件改变后自动构建web客户端。(用于开发)
npm run start:          启动web服务端。
npm run set-proxy:      设置golang和nodejs代理。(仅在国内使用)
npm run unset-proxy:    取消设置golang和nodejs代理。
npm run install-dev:    安装golang开发工具。
npm run eslint:         检查js文件,自动修复错误。
npm run clean:          删除构建的web版和桌面版。
npm run clear:          删除没用的nodejs包。

项目结构

├── .github
│ └── FUNDING.yml      github Sponsor按钮设置
├── .vscode
│ └── launch.json      VSCode运行面板下拉菜单项配置
├── build              生成目录,执行`npm run build`自动生成
├── docs               文档目录
├── images             图片目录
├── node_modules       nodejs第三方库目录,执行`npm install`自动生成
├── scripts            编译和辅助脚本
├── server             ShadowEditor服务端
├── utils              一些工具
├── web                ShadowEditor前端
├── .gitattributes     git配置
├── .gitignore         git忽略文件
├── .travis.yml        travis-ci自动化测试
├── LICENSE            开源协议,本项目是MIT协议
├── package.json       npm包配置
├── package-lock.json  第三方npm包版本
├── README.md          英文版项目说明
└── README_zh.md       中文版项目说明

服务端结构

│  config-dev.toml                点击VSCode运行面板启动按钮,服务端配置文件
│  config.toml                    npm start时,服务端配置文件
│  go.mod                         go语言模块配置
│  go.sum                         go语言第三方库版本
│  main.go                        服务端入口目录(main函数)
├─cmd
│  │  root.go                     命令行根命令,执行`./ShadowEditor`
│  │  serve.go                    命令行启动服务端命令,执行`./ShadowEditor serve`
│  │  version.go                  命令行输出版本号命令,执行`./ShadowEditor version`
│  └─win
│          debug.go               调试Windows服务
│          empty.go
│          install.go             安装Windows服务
│          remove.go              移除Windows服务
│          start.go               启动Windows服务
│          stop.go                停止Windows服务
│          win.go
├─helper
│  │  config.go                   toml配置文件读取
│  │  copy.go                     复制目录和文件
│  │  http.go                     GET和POST方法
│  │  json.go                     对象转json
│  │  md5.go                      md5加密
│  │  mongo.go                    mongo数据库
│  │  mysql.go                    mysql数据库,没用
│  │  pinyin.go                   汉字转拼音
│  │  postgresql.go               postgresql数据库,没用
│  │  redis.go                    redis数据库,没用
│  │  sqlite.go                   sqlite数据库,没用
│  │  time.go                     自定义时间转字符串
│  │  zip.go                      压缩解压
│  └─encoder
│          primitive_d_encoder.go            primitive.D转json编码器
│          primitive_objectid_encoder.go     primitive.ObjectID转json编码器
│          time_encoder.go                   time.Time转json编码器
├─remote
│      model.go                   没用
│
├─server
│  │  constant.go                            服务端数据集名称、权限名称常量
│  │  context.go                             上下文,提供mongo、路径映射和日志服务
│  │  middleware_crossorigin.go              跨域中间件
│  │  middleware_gzip.go                     gzip压缩中间件
│  │  middleware_validate_token.go           权限验证中间件
│  │  result.go                              执行结果
│  │  server.go                              服务端路由注册、启动
│  │  user.go                                获取当前用户
│  ├─assets
│  │  │  exports.go
│  │  ├─animation                            动画资源api
│  │  ├─audio                                音频资源api
│  │  ├─character                            角色资源api,没用
│  │  ├─material                             材质资源api
│  │  ├─mesh                                 模型资源api
│  │  ├─particle                             例子资源api,没用
│  │  ├─prefab                               预设体资源api
│  │  ├─scene                                场景资源api
│  │  ├─screenshot                           截图资源api
│  │  ├─summary                              资源汇总
│  │  ├─texture                              纹理资源api
│  │  └─video                                录制视频资源api
│  │
│  ├─category                                类别管理
│  ├─export
│  │  │  exports.go
│  │  ├─examples                             导出所有示例
│  │  └─scene                                导出场景
│  │          
│  ├─gis
│  │      handle_bing.go                     必应地图缓存
│  │      handle_elevation.go                Arcgis地形缓存
│  │      tile_system.go                     必应卫星图key生成
│  │      utils.go
│  │      
│  ├─system
│  │  │  config.go
│  │  │  department.go
│  │  │  exports.go
│  │  │  role.go                               角色模型
│  │  │  role_authority.go
│  │  │  user.go                               用户模型
│  │  │  
│  │  ├─authority                              权限管理
│  │  ├─config                                 项目配置
│  │  ├─department                             组织机构管理
│  │  ├─initialize
│  │  │      handle_initialize.go              项目初始化
│  │  │      handle_reset.go                   项目重置
│  │  │      
│  │  ├─login
│  │  │      handle_login.go                   登录
│  │  │      handle_logout.go                  注销
│  │  │      
│  │  ├─register                               注册
│  │  ├─role                                   角色管理
│  │  └─user                                   用户管理
│  ├─tools
│  │  │  exports.go
│  │  │  
│  │  ├─backup_database                        数据库备份
│  │  ├─clean_scenes                           场景清理
│  │  ├─plugin                                 插件管理
│  │  └─typeface                               字体管理
│  └─upload
│          handle_upload.go                    文件上传
├─test
│      README.md                               代码测试目录
│      
└─three                                        three.js数学模块翻译为go语言

前端结构

│  .eslintrc                        eslint配置
│  babel.config.js                  babel配置
│  favicon.ico                      项目图标
│  index.html                       首页
│  manifest.json
│  rollup.config.js                 rollup配置
│  sw.js
│  view.html                        场景新窗口打开
│  
├─assets
│  ├─Cesium                        cesiumjs库
│  ├─css                           项目css
│  ├─examples                      示例
│  ├─fonts                         字体
│  ├─image                         png图标
│  ├─images                        图片
│  ├─js                            第三方js库
│  ├─svg                           svg图标
│  └─textures                      贴图
│
├─locales
│      en-US.json                  英语语言包
│      fr-FR.json                  法语语言包
│      ja-JP.json                  日语语言包
│      ko-KR.json                  韩语语言包
│      ru-RU.json                  俄语语言包
│      zh-CN.json                  简体中文语言包
│      zh-TW.json                  繁体中文语言包
│      
├─src
│  │  Application.js               前端入口
│  │  global.js                    全局变量
│  │  index.js                     前端类导出
│  │  Options.js                   场景配置
│  │  polyfills.js
│  │  third_party.js               第三方模块
│  │  
│  ├─command                       命令和历史记录,支持重做、撤销
│  ├─controls                      场景查看控制器
│  ├─editor
│  │  │  Editor.jsx                编辑器页面
│  │  │  Loader.jsx                页面加载显示“请稍后...”
│  │  │  
│  │  ├─assets
│  │  │  │  AnimationPanel.jsx     动画面板
│  │  │  │  AssetsPanel.jsx
│  │  │  │  AudioPanel.jsx         音频面板
│  │  │  │  CharacterPanel.jsx     角色面板
│  │  │  │  LogPanel.jsx           日志面板
│  │  │  │  MapPanel.jsx           贴图面板
│  │  │  │  MaterialPanel.jsx      材质面板
│  │  │  │  ModelPanel.jsx         模型面板
│  │  │  │  ParticlePanel.jsx      粒子面板
│  │  │  │  PrefabPanel.jsx        预设体面板
│  │  │  │  ScenePanel.jsx         场景面板
│  │  │  │  ScreenshotPanel.jsx    截图面板
│  │  │  │  VideoPanel.jsx         录制视频面板
│  │  │  │
│  │  │  └─window
│  │  │      │  AddSkyBoxWindow.jsx
│  │  │      │  CategoryEditWindow.jsx        类别编辑窗口
│  │  │      │  CategoryWindow.jsx            类别列表窗口
│  │  │      │  EditMapWindow.jsx             材质编辑窗口
│  │  │      │  EditModelWindow.jsx           模型编辑窗口
│  │  │      │  EditSceneWindow.jsx           场景编辑窗口
│  │  │      └─ EditWindow.jsx                通用编辑窗口
│  │  ├─component
│  │  │  │  BasicComponent.jsx                基本信息组件
│  │  │  │  CameraComponent.jsx               相机组件
│  │  │  │  FireComponent.jsx
│  │  │  │  LightComponent.jsx                光源组件
│  │  │  │  LMeshComponent.jsx                lol模型设置
│  │  │  │  MaterialComponent.jsx             材质组件
│  │  │  │  MMDComponent.jsx                  mmd设置
│  │  │  │  MultiMaterialComponent.jsx        多材质组件
│  │  │  │  ParticleEmitterComponent.jsx      例子发射器组件
│  │  │  │  ReflectorComponent.jsx            反光组件
│  │  │  │  SceneComponent.jsx                场景组件
│  │  │  │  ScriptComponent.jsx               脚本组件
│  │  │  │  ShadowComponent.jsx               阴影组件
│  │  │  │  SmokeComponent.jsx                烟组件
│  │  │  │  TransformComponent.jsx            位移组件
│  │  │  │  
│  │  │  ├─animation                        动画相关组件 
│  │  │  ├─audio                            音频相关组件
│  │  │  ├─control                          视角控制器相关组件
│  │  │  ├─geometry                         几何体设置组件
│  │  │  ├─line                             各种线设置组件
│  │  │  ├─material                         材质设置组件,没用
│  │  │  ├─object
│  │  │  ├─physics                          物理设置组件
│  │  │  ├─postProcessing                   后期处理设置组件
│  │  │  └─window
│  │  │      └─  TextureSettingWindow.jsx   材质编辑窗口
│  │  ├─menu
│  │  │  │  AssetsMenu.jsx                  资源菜单
│  │  │  │  ComponentMenu.jsx               组件菜单
│  │  │  │  EditMenu.jsx                    编辑菜单
│  │  │  │  EditorMenuBar.jsx               菜单栏
│  │  │  │  EditorTabMenu.jsx
│  │  │  │  ExampleMenu.jsx                 示例菜单
│  │  │  │  HelpMenu.jsx                    帮助菜单
│  │  │  │  LightMenu.jsx                   光源菜单
│  │  │  │  LoginMenu.jsx                   登录菜单
│  │  │  │  ObjectMenu.jsx                  物体菜单
│  │  │  │  OptionsMenu.jsx                 选项菜单
│  │  │  │  PlayMenu.jsx                    播放菜单
│  │  │  │  SceneMenu.jsx                   场景菜单
│  │  │  │  SystemMenu.jsx                  系统菜单
│  │  │  │  ToolMenu.jsx                    工具菜单
│  │  │  │  TwoDMenu.jsx                    2D菜单,没用
│  │  │  │  ViewMenu.jsx                    视图菜单
│  │  │  │  VisualMenu.jsx                  可视化菜单,没用
│  │  │  │  
│  │  │  ├─scene                            场景模板
│  │  │  └─window
│  │  │      │  Add3DTextWindow.jsx            添加3D文字窗口
│  │  │      │  CleanUpScenesWindow.jsx        清理场景窗口
│  │  │      │  ExtensionWindow.jsx            扩展窗口
│  │  │      │  OptionsWindow.jsx              选项窗口
│  │  │      │  PluginsWindow.jsx              扩展窗口
│  │  │      │  RendererAttributesWindow.jsx   渲染器属性窗口
│  │  │      │  SaveSceneWindow.jsx            保存场景窗口
│  │  │      │  TextureGeneratorWindow.jsx     纹理窗口
│  │  │      │  ThreeJsInformationWindow.jsx   three.js信息窗口
│  │  │      │  TypefaceConverterWindow.jsx    字体转换窗口
│  │  │      └─ TypefaceManagementWindow.jsx   字体管理窗口
│  │  ├─script
│  │  │  └─  ScriptEditor.js                    脚本编辑器
│  │  │          
│  │  ├─sidebar
│  │  │  │  AnimationPropertyPanel.jsx        动画面板
│  │  │  │  EditorSideBar.jsx                 侧边栏
│  │  │  │  HierarchyPanel.jsx                场景树状图面板
│  │  │  │  HistoryPanel.jsx                  历史面板
│  │  │  │  PropertyPanel.jsx                 属性面板
│  │  │  │  ScriptPanel.jsx                   脚本面板
│  │  │  └─window
│  │  │     └─  ScriptWindow.jsx               脚本创建窗口
│  │  ├─status
│  │  │  └─ EditorStatusBar.jsx                状态栏
│  │  │          
│  │  ├─system
│  │  │  │  AuthorityManagementWindow.jsx      权限管理
│  │  │  │  ChangePasswordWindow.jsx           修改密码窗口
│  │  │  │  DepartmentManagementWindow.jsx     机构管理
│  │  │  │  LoginWindow.jsx                    登录窗口
│  │  │  │  RegisterWindow.jsx                 注册窗口
│  │  │  │  RoleManageWindow.jsx               角色管理窗口
│  │  │  │  SystemSettingWindow.jsx            系统设置窗口
│  │  │  │  UserManageWindow.jsx               用户管理窗口
│  │  │  │      
│  │  │  ├─dept                                机构管理
│  │  │  ├─role                                角色管理
│  │  │  └─user                                用户管理
│  │  │              
│  │  ├─timeline                               时间轴和补间动画面板
│  │  ├─toolbar
│  │  │  │  DrawTools.jsx                      绘制工具
│  │  │  │  EditorToolbar.jsx                  工具栏
│  │  │  │  EditTools.jsx                      编辑工具
│  │  │  │  GeneralTools.jsx                   通用工具
│  │  │  │  MarkTools.jsx                      标注工具
│  │  │  │  MeasureTools.jsx                   测量工具
│  │  │  └─  TerrainTools.jsx                  地形工具,没用
│  │  │          
│  │  ├─tools                                  各种自定义工具
│  │  │      
│  │  └─viewport
│  │      │  ScriptEditorPanel.jsx             脚本编辑窗口
│  │      └─  Viewport.jsx                     小场景、GIS场景、数据可视化工作区
│  │              
│  ├─event
│  │  │  AutoSaveEvent.js                      自动保存
│  │  │  BaseEvent.js                          事件基类
│  │  │  EventDispatcher.js                    事件分发器
│  │  │  EventList.js                          自定义事件列表
│  │  │  FilterEvent.js                        滤镜事件
│  │  │  GPUPickEvent.js                       GPU选取事件
│  │  │  LoadSceneEvent.js                     场景加载事件
│  │  │  ObjectEvent.js
│  │  │  PhysicsEvent.js
│  │  │  PickEvent.js                          选取事件
│  │  │  RaycastEvent.js                    
│  │  │  RenderEvent.js                        渲染事件
│  │  │  ResizeEvent.js
│  │  │  ScriptChangedEvent.js
│  │  │  TransformControlsEvent.js             物体平移、旋转、缩放
│  │  │  ViewEvent.js
│  │  │  WeatherEvent.js                       天气
│  │  └─ WebSocketEvent.js                     WebSocket数据传输
│  │          
│  ├─gis
│  │      GISApplication.js                    CesiumJS应用
│  ├─helper                                    各种帮助器
│  ├─loader                                    各种类型模型加载器       
│  ├─object                                    自定义物体
│  ├─package
│  │      PackageList.js                       第三方包列表
│  │      PackageManager.js                    第三方包动态加载器
│  │      
│  ├─player                                    播放器,用于预览场景
│  │              
│  ├─render                                    编辑器场景渲染
│  │ 
│  ├─serialization                             对象序列化和反序列化,用于场景保存读取
│  │ 
│  ├─ui                                        使用react.js封装的ui组件库
│  │ 
│  ├─utils
│  │      Ajax.js                              ajax工具类
│  │      CanvasUtils.js
│  │      Converter.js                         各种转换
│  │      CookieUtils.js                       cookie工具类
│  │      CoordinateUtils.js
│  │      CssLoader.js                         css动态加载
│  │      CssUtils.js
│  │      DownloadUtils.js
│  │      Earcut.js
│  │      Ease.js                              补间动画
│  │      GeometryUtils.js
│  │      ImageUtils.js                        图片工具类
│  │      JsLoader.js
│  │      LanguageLoader.js                    语言包加载器
│  │      MaterialUtils.js
│  │      MathUtils.js
│  │      MeshUtils.js
│  │      MIMETypeUtils.js
│  │      Server.js                            从服务端获取前端配置
│  │      Storage.js                           LocalStorage工具类
│  │      StringUtils.js
│  │      TimeUtils.js                         时间转字符串工具类
│  │      TypefaceUtils.js
│  │      UploadUtils.js
│  │      VideoRecorder.js                     录制视频工具类
│  │      
│  ├─visual                                    可视化组件库,用于数据可视化,目前没用
│  │   
│  └─worker                                    worker测试,没用
│          
└─test
        README.md                              前端测试

UI开发

本项目使用react.js开发。

事件驱动

本项目使用d3-dispatch框架进行事件驱动。下面以添加一个自定义事件的例子,来介绍如何使用事件驱动。

这个例子很简单:监听物体选中objectSelected事件,触发我们自定义事件customEvent;监听customEvent事件,在控制台打印选中的物体。

1、打开web\src\event\EventList.js,添加一个自定义事件customEvent。

var EventList = [
    'customEvent'
];

2、创建文件web\src\event\CustomEvent.js,在这个文件里,我们可以触发和监听EventList里面的自定义事件。

import BaseEvent from './BaseEvent';
import global from '../global';

/**
 * 自定义事件
 */
class CustomEvent extends BaseEvent {
    constructor() {
        super();

        // 绑定this后,函数中的this表示这个类的实例。
        this.handleSelect = this.handleSelect.bind(this);
        this.handleCustomEvent = this.handleCustomEvent.bind(this);
    }

    /**
     * 客户端启动后,会自动调用所有注册事件的start方法。
     */
    start() {
        // 监听物体选中事件
        // 注意加上“.自定义id”,否则会覆盖其他监听这个事件的函数。
        global.app.on(`objectSelected.${this.id}`, this.handleSelect);
        // 监听自定义事件
        global.app.on(`customEvent.${this.id}`, this.handleCustomEvent);
    }

    /**
     * 客户端结束运行前,会自动调用所有注册事件的stop方法。
     */
    stop() {
        // 取消监听物体选中事件
        global.app.on(`objectSelected.${this.id}`, null);
        // 取消监听自定义事件
        global.app.on(`customEvent.${this.id}`, null);
    }

    handleSelect(obj) {
        // 调用自定义事件
        // 参数:事件名称,this指针,要传递的参数
        // 要传递的参数有多个,可以依次向后写。
        global.app.call(`customEvent`, this, obj);
    }

    handleCustomEvent(obj) {
        // 在控制台输出当前选中物体
        console.log(obj);
    }
}

export default CustomEvent;

3、打开事件分发器web\src\event\EventDispatcher.js,注册我们的自定义事件类。

import CustomEvent from './CustomEvent';

function EventDispatcher() {
    this.events = [
        new CustomEvent(),
    ];
}

4、输入npm run build-web重新生成前端,在浏览器中访问。添加一个正方体,选中正方体,控制台会打印出这个物体。

210555_db47ba68_956419.webp