Shadow Editor Pro 后端架构文档
本文档详细介绍了Shadow Editor Pro后端代码的目录结构与核心模块功能。项目基于NestJS 10框架,使用TypeScript 5开发,运行于Node.js环境,采用文件存储作为数据库,并集成Electron作为桌面框架。文档系统阐述了Electron主进程、预加载脚本、NestJS服务启动及配置等核心文件的作用。重点说明了业务数据模块(data/)和3D资源模块(three/)的详细架构,包括各自的控制器、实体与服务层,用于管理设备、测量、场景、模型等多种数据的CRUD操作。此外,文档还涵盖了异常过滤器、拦截器、管道、工具函数等辅助模块,并明确了统一的API接口规范、文件存储方案、日志系统及安全性设计,为开发者提供了清晰的后端开发与维护指南。
本文档详细说明 Shadow Editor Pro 后端代码的目录结构和各模块功能。
技术栈
- 框架: NestJS 10
- 语言: TypeScript 5
- 运行时: Node.js
- 数据库: 文件存储
- 日志: electron-log
- 桌面框架: Electron
目录结构概览
electron/
├── main.ts # Electron主进程
├── preload.ts # 预加载脚本
├── server.ts # NestJS服务启动
├── config.ts # 配置文件
├── common/ # 公共模块
│ ├── PageData.ts # 分页数据
│ └── Result.ts # 响应结果
├── data/ # 业务数据模块
│ ├── controller/ # 控制器
│ ├── entity/ # 实体
│ └── service/ # 服务
├── three/ # 3D资源模块
│ ├── controller/ # 控制器
│ ├── entity/ # 实体
│ └── service/ # 服务
├── filter/ # 异常过滤器
├── interceptor/ # 拦截器
├── pipe/ # 管道
├── utils/ # 工具函数
└── __tests__/ # 测试文件
1. Electron主进程 (main.ts)
功能: Electron应用的主进程,负责创建窗口和管理应用生命周期
主要功能:
- 创建和管理BrowserWindow窗口
- 启动NestJS后端服务
- 处理窗口控制(最大化、最小化、还原等)
- 处理IPC通信(进程间通信)
- 集成开发工具(DevTools)
IPC事件:
exit: 退出应用maximize: 最大化窗口minimize: 最小化窗口restore: 还原窗口大小openDevTools: 打开开发者工具openInBrowser: 在浏览器中打开URL
使用示例:
// 前端调用IPC
window.api.maximize()
window.api.exit()
2. 预加载脚本 (preload.ts)
功能: 连接主进程和渲染进程,暴露安全的API给前端
主要功能:
- 暴露IPC接口给渲染进程
- 提供类型安全的API
- 确保安全性(contextIsolation)
3. 服务启动 (server.ts)
功能: 启动和配置NestJS服务器
主要配置:
- 全局异常过滤器
- 日志拦截器
- 请求体解析(支持200MB)
- 静态文件服务
- CORS配置
模块导入:
DataModule: 业务数据模块ThreeModule: 3D资源模块ServeStaticModule: 静态文件服务
启动流程:
- 创建NestJS应用实例
- 配置全局拦截器和过滤器
- 配置请求体解析
- 监听指定端口
- 记录启动日志
4. 配置文件 (config.ts)
功能: 应用配置管理
配置项:
port: 服务器端口- 数据存储路径
- 日志配置
- 其他运行时配置
5. 公共模块 (common/)
功能: 提供公共类型和工具类
PageData.ts
分页数据类型定义
interface PageData<T> {
data: T[] // 数据列表
total: number // 总数
page: number // 当前页码
pageSize: number // 每页大小
}
Result.ts
统一响应结果类型
interface Result<T = any> {
success: boolean // 是否成功
data?: T // 响应数据
message?: string // 消息
code?: number // 错误代码
}
6. 业务数据模块 (data/)
功能: 管理业务数据(设备、测量、属性、字典等)
Controller层
控制器列表:
AttributeController: 属性管理DeviceController: 设备管理DeviceMeasureController: 设备测量关联DictionaryController: 字典管理MeasureController: 测量管理ModelAttributeController: 模型属性关联ModelDeviceController: 模型设备关联ModelMeasureController: 模型测量关联StationController: 站点管理
Entity层
实体列表:
Attribute: 属性实体Device: 设备实体DeviceMeasure: 设备测量关联实体Dictionary: 字典实体DictionaryItem: 字典项实体Measure: 测量实体ModelAttribute: 模型属性关联实体ModelDevice: 模型设备关联实体ModelMeasure: 模型测量关联实体Station: 站点实体
Service层
服务列表:
AttributeService: 属性服务DeviceService: 设备服务DeviceMeasureService: 设备测量关联服务DictionaryService: 字典服务DictionaryItemService: 字典项服务MeasureService: 测量服务ModelAttributeService: 模型属性关联服务ModelDeviceService: 模型设备关联服务ModelMeasureService: 模型测量关联服务StationService: 站点服务
主要功能:
- 业务数据的CRUD操作
- 数据关联管理
- 分页查询
- 条件筛选
- 数据验证
示例API:
POST /api/device/add # 添加设备
POST /api/device/update # 更新设备
POST /api/device/delete # 删除设备
POST /api/device/list # 设备列表
POST /api/device/detail # 设备详情
7. 3D资源模块 (three/)
功能: 管理3D资源(场景、模型、材质、动画等)
Controller层
控制器列表:
SceneController: 场景管理MeshController: 模型管理MaterialController: 材质管理AnimationController: 动画管理AudioController: 音频管理VideoController: 视频管理MapController: 贴图管理TypefaceController: 字体管理ScreenshotController: 截图管理ThumbnailController: 缩略图管理CategoryController: 分类管理FileController: 文件访问DownloadController: 文件下载SummaryController: 资源汇总
Entity层
实体列表:
Scene: 场景实体Mesh: 模型实体Material: 材质实体Animation: 动画实体Audio: 音频实体Video: 视频实体Map: 贴图实体Typeface: 字体实体Screenshot: 截图实体Thumbnail: 缩略图实体Category: 分类实体Summary: 汇总实体BaseEntity: 基础实体BaseFileEntity: 基础文件实体
基础实体:
interface BaseEntity {
id?: string // 实体ID
name?: string // 实体名称
categoryId?: string // 分类ID
createTime?: string // 创建时间
updateTime?: string // 更新时间
}
interface BaseFileEntity extends BaseEntity {
filename?: string // 文件名
size?: number // 文件大小
type?: string // 文件类型
url?: string // 下载地址
thumbnail?: string // 缩略图
}
Service层
服务列表:
SceneService: 场景服务MeshService: 模型服务MaterialService: 材质服务AnimationService: 动画服务AudioService: 音频服务VideoService: 视频服务MapService: 贴图服务TypefaceService: 字体服务ScreenshotService: 截图服务ThumbnailService: 缩略图服务CategoryService: 分类服务FileService: 文件服务DownloadService: 下载服务SummaryService: 汇总服务BaseEntityService: 基础实体服务BaseFileService: 基础文件服务
主要功能:
- 3D资源的CRUD操作
- 文件上传和下载
- 文件访问控制
- 缩略图生成
- 分类管理
- 资源汇总统计
示例API:
POST /api/scene/add # 添加场景
POST /api/scene/update # 更新场景
POST /api/scene/delete # 删除场景
POST /api/scene/list # 场景列表
POST /api/scene/detail # 场景详情
GET /api/file/scene/{id} # 访问场景文件
GET /api/download/scene/{id} # 下载场景文件
8. 异常过滤器 (filter/)
AllExceptionsFilter
功能: 全局异常处理,统一错误响应格式
主要功能:
- 捕获所有异常
- 统一错误响应格式
- 记录错误日志
- 友好的错误提示
错误响应格式:
{
"success": false,
"code": 500,
"message": "错误信息"
}
9. 拦截器 (interceptor/)
LoggingInterceptor
功能: 请求日志记录
主要功能:
- 记录所有HTTP请求
- 记录请求方法和URL
- 记录请求耗时
- 记录响应状态
10. 管道 (pipe/)
FileNameEncodePipe
功能: 文件名编码处理
主要功能:
- 处理文件名编码
- 防止文件名冲突
- 支持中文文件名
11. 工具函数 (utils/)
TimeUtils
功能: 时间处理工具
主要功能:
- 时间格式化
- 时间计算
- 时间戳转换
API接口规范
请求格式
所有API请求使用RESTful风格:
GET: 获取数据POST: 创建或更新数据DELETE: 删除数据
响应格式
所有API响应包含统一的Result结构:
{
"success": true,
"data": {},
"message": "操作成功",
"code": 0
}
分页请求
分页请求参数:
{
page: number // 页码,从0开始
pageSize: number // 每页大小
keyword?: string // 关键字搜索(可选)
categoryId?: string // 分类ID(可选)
}
分页响应
分页响应数据:
{
data: [], // 数据列表
total: 100, // 总数
page: 0, // 当前页码
pageSize: 20 // 每页大小
}
文件存储
存储结构
data/
├── scene/ # 场景文件
├── mesh/ # 模型文件
├── material/ # 材质文件
├── animation/ # 动画文件
├── audio/ # 音频文件
├── video/ # 视频文件
├── map/ # 贴图文件
├── typeface/ # 字体文件
├── screenshot/ # 截图文件
└── thumbnail/ # 缩略图文件
文件上传
支持单文件和批量上传:
// 单文件上传
POST /api/mesh/add
Content-Type: multipart/form-data
Body: file=...
// 批量上传(多个文件)
POST /api/mesh/add
Content-Type: multipart/form-data
Body: files=...
文件访问
文件访问接口:
GET /api/file/{type}/{filename}
示例:
GET /api/file/mesh/cube.gltf
GET /api/file/scene/scene001.json
GET /api/file/texture/brick.jpg
文件下载
文件下载接口:
GET /api/download/{type}/{id}
示例:
GET /api/download/mesh/1
GET /api/download/scene/5
NestJS模块架构
模块组织
AppModule (根模块)
├── DataModule (业务数据模块)
│ ├── AttributeController
│ ├── DeviceController
│ ├── MeasureController
│ └── ...
├── ThreeModule (3D资源模块)
│ ├── SceneController
│ ├── MeshController
│ ├── MaterialController
│ └── ...
└── ServeStaticModule (静态文件服务)
依赖注入
NestJS使用依赖注入(DI)来管理服务和控制器:
@Controller('scene')
export class SceneController {
constructor(private readonly sceneService: SceneService) {}
@Post('add')
add(@Body() data: SceneDto) {
return this.sceneService.add(data)
}
}
装饰器说明
常用装饰器
@Controller('path'): 定义控制器路由前缀@Get('path'): GET请求@Post('path'): POST请求@Delete('path'): DELETE请求@Body(): 获取请求体@Query(): 获取查询参数@Param('id'): 获取路径参数@UsePipes(): 使用管道@UseGuards(): 使用守卫@UseInterceptors(): 使用拦截器
示例:
@Controller('scene')
export class SceneController {
@Post('add')
add(@Body() body: any) {
// ...
}
@Get(':id')
detail(@Param('id') id: string) {
// ...
}
@Post('list')
list(@Body() body: { page: number; pageSize: number }) {
// ...
}
}
错误代码
| 代码 | 说明 |
|---|---|
| 0 | 成功 |
| 400 | 请求参数错误 |
| 401 | 未授权 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
日志系统
日志级别
fatal: 致命错误error: 错误warn: 警告log: 一般日志debug: 调试信息verbose: 详细信息
日志记录
import log from 'electron-log/main'
log.info('信息日志')
log.warn('警告日志')
log.error('错误日志')
开发和部署
开发环境
# 启动开发环境
npm run dev
# 启动后端
npm run dev:electron
生产环境
# 构建
npm run build
# 打包Electron应用
npm run build:electron
环境变量
NODE_ENV: 运行环境(development/production)- 端口配置在
config.ts中
安全性
CORS配置
已在NestJS中配置CORS,允许跨域访问。
文件安全
- 文件上传大小限制:200MB
- 支持的文件类型:在服务层验证
- 文件名编码:防止路径遍历攻击
IPC安全
- 启用contextIsolation
- 禁用nodeIntegration
- 预加载脚本暴露安全的API
性能优化
- 静态文件缓存: 使用NestJS静态文件服务,支持缓存
- 请求压缩: 配置body-parser压缩
- 日志异步: 使用异步日志记录
- 文件流传输: 大文件使用流式传输
测试
单元测试
测试文件位于__tests__/目录。
# 运行测试
npm test
测试覆盖
- Controller层测试
- Service层测试
- 工具函数测试
常见问题
Q: 如何添加新的API接口?
A: 在对应的Module中添加Controller和Service:
- 在
controller/目录创建Controller - 在
service/目录创建Service - 在Module中注册Controller
Q: 如何修改文件存储路径?
A: 修改config.ts中的配置,或修改Service中的路径处理。
Q: 如何添加新的资源类型?
A:
- 在
three/entity/创建实体 - 在
three/controller/创建控制器 - 在
three/service/创建服务 - 在ThreeModule中注册
Q: 如何添加全局中间件?
A: 在server.ts的bootstrap函数中使用:
app.use(middleware)
相关文档
更新日志
v0.0.1 (2024-10-19)
- 初始版本
- 完整的后端架构文档
- 所有模块说明
- API接口规范
本文由人工编写,AI优化,转载请注明原文地址: Shadow Editor Pro 后端架构文档
推荐阅读
评论 (0)
发表评论
昵称:加载中...
暂无评论,快来发表第一条评论吧!