diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 9bcf314..b65fd48 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -2,33 +2,52 @@ name: Deploy to GitHub Pages
on:
push:
- branches: [ main ]
- pull_request:
- branches: [ main ]
+ branches: [rewrite]
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: pages
+ cancel-in-progress: true
jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: npm
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Build
+ run: npm run build
+
+ - name: Setup Pages
+ uses: actions/configure-pages@v5
+
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: dist
+
deploy:
+ needs: build
runs-on: ubuntu-latest
-
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
steps:
- - uses: actions/checkout@v3
-
- - name: Setup Node.js
- uses: actions/setup-node@v3
- with:
- node-version: '18'
- cache: 'npm'
-
- - name: Install dependencies
- run: npm install
-
- - name: Build
- run: npm run build
-
- - name: Deploy to GitHub Pages
- uses: peaceiris/actions-gh-pages@v3
- if: github.ref == 'refs/heads/main'
- with:
- github_token: ${{ secrets.GITHUB_TOKEN }}
- publish_dir: ./
- publish_branch: gh-pages
\ No newline at end of file
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.gitignore b/.gitignore
index c29ef04..a547bf3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,77 +1,24 @@
-# Dependencies
-node_modules/
+# Logs
+logs
+*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
-
-# Runtime data
-pids
-*.pid
-*.seed
-*.pid.lock
-
-# Coverage directory used by tools like istanbul
-coverage/
-
-# Dependency directories
-jspm_packages/
-
-# Optional npm cache directory
-.npm
-
-# Optional REPL history
-.node_repl_history
-
-# Output of 'npm pack'
-*.tgz
-
-# Yarn Integrity file
-.yarn-integrity
-
-# dotenv environment variables file
-.env
-
-# IDE
-.vscode/
-.idea/
-*.swp
-*.swo
-*~
-
-# OS
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
.DS_Store
-.DS_Store?
-._*
-.Spotlight-V100
-.Trashes
-ehthumbs.db
-Thumbs.db
-
-# Logs
-logs
-*.log
-
-# Python
-__pycache__/
-*.py[cod]
-*$py.class
-*.so
-.Python
-env/
-venv/
-ENV/
-env.bak/
-venv.bak/
-
-# Temporary files
-*.tmp
-*.temp
-
-# Build files
-dist/
-build/
-
-# GitHub Pages
-_site/
-.jekyll-cache/
-.jekyll-metadata
\ No newline at end of file
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..2991919
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,8 @@
+{
+ "semi": false,
+ "singleQuote": true,
+ "tabWidth": 2,
+ "trailingComma": "es5",
+ "printWidth": 100,
+ "endOfLine": "lf"
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..a7cea0b
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["Vue.volar"]
+}
diff --git a/README.md b/README.md
index f619832..a00900a 100644
--- a/README.md
+++ b/README.md
@@ -1,234 +1,236 @@
-# 🎯 MomentWebStitcher - 网页版朋友圈长图拼接工具
+# MomentWebStitcher
-一个专为朋友圈设计的智能长图拼接工具,支持将多张图片垂直拼接成适合社交媒体分享的长图,完全基于Web技术实现,可直接在浏览器中使用。
+网页版朋友圈长图拼接工具:把多张照片按分组垂直拼接成适合社交分享的长图。项目为纯前端实现,图片读取、排序、拼接和压缩全部在浏览器本地完成,**图片数据不会上传服务器**;拼接在 Web Worker 后台线程执行,不阻塞界面。
-## 🌟 功能亮点
+[](LICENSE)
+[](https://vitejs.dev/)
+[](https://www.typescriptlang.org/)
+[](https://vitest.dev/)
+[](https://piggywu981.github.io/MomentWebStitcher/)
-🎯 **智能分组**:根据图片数量自动设置合理的每组上限
-📱 **触屏优化**:专为手机和平板优化的触摸操作体验
-🎨 **可视化操作**:直观的拖拽式图形界面
-⚡ **浏览器处理**:无需服务器,完全在浏览器端处理
-🔧 **灵活配置**:可自定义每组图片数量
-📁 **拖拽支持**:支持文件和文件夹拖拽
-📊 **实时预览**:处理进度实时显示
-🧹 **一键清理**:内置清理功能
-⏰ **时间排序**:按拍摄时间自动排序(早到晚)
-📱 **移动适配**:响应式设计,完美支持手机和平板
-🤏 **触摸手势**:长按拖拽、触觉反馈、防误触设计
+**在线使用:**
+**旧版入口:**
-## 🚀 快速开始
+> 本项目为 **rewrite(重写版)**:基于 Vite + TypeScript 的模块化实现。若需纯静态版,可使用上方旧版入口(见「新旧版本」章节)。
+
+## 功能特性
+
+- **批量上传:** 支持点击选择或拖拽添加多张图片,单张不超过 50 MB、单次最多 200 张。
+- **自动分组:** 自定义每组图片数量,一键生成多个分组;默认值为 9 张。
+- **时间排序:** 优先按修改时间排序(图片 `src` 为本地 Data URL,可在上传流程中扩展 EXIF 读取)。
+- **拖拽整理:** 图片可以在图片池和分组之间移动,也可以在组内拖拽调整顺序。
+- **Web Worker 后台拼接:** 使用 `OffscreenCanvas` + `ImageBitmap` 在后台线程完成缩放与垂直拼接,界面不卡顿,并支持进度反馈。
+- **撤销 / 重做:** 基于命令模式(Command Pattern)管理完整操作历史,支持 50 步。
+- **本地持久化:** 图片数据存入 **IndexedDB**,界面状态以轻量元数据存入 **localStorage**,刷新页面不丢失。
+- **结果预览:** 拼接完成后在「拼接结果」区预览每个分组的合成图,支持单条下载与一键下载全部。
+- **暗色 / 亮色主题:** 响应式设计,跟随系统或手动切换。
+- **移动端适配:** 支持手机和平板的触屏拖拽。
+- **快捷键支持:** 常用操作均有键盘快捷键。
+- **版本切换:** 内置新版 / 旧版切换入口。
+
+## 快速开始
### 在线使用
-暂不支持,等我找到免费域名再说¯\_(ツ)_/¯
-### 本地部署
-1. 克隆仓库
+打开 ,无需安装即可使用。
+
+### 本地运行
+
```bash
git clone https://github.com/Piggywu981/MomentWebStitcher.git
cd MomentWebStitcher
-```
-2. 本地运行
-```bash
-# 方法1: 使用Python
-python -m http.server 8000
+# 安装依赖
+npm install
-# 方法2: 使用Node.js
-npm install -g http-server
-http-server .
+# 启动开发服务器(默认 http://localhost:5173)
+npm run dev
-# 方法3: 直接双击index.html(部分浏览器可能需要)
+# 构建生产版本(输出到 dist/)
+npm run build
```
-3. 打开浏览器访问 http://localhost:8000
-
-## 📋 使用教程
-
-### 1. 上传图片
-- **拖拽上传**:将图片文件拖拽到上传区域
-- **点击上传**:点击上传区域选择图片文件
-- **批量上传**:支持一次选择多张图片
-
-### 2. 分组设置
-- **自动分组**:设置每组图片数量后点击"自动分组"
-- **手动调整**:拖拽图片在分组间自由移动
-- **分组管理**:每个分组可单独清空
-
-### 3. 触屏操作指南(手机/平板专用)
-
-#### 📱 基本手势
-- **长按拖拽**:长按图片约400ms开始拖拽
-- **移动放置**:拖拽到目标分组后松开手指
-- **返回图片池**:拖拽到左侧图片池区域
-- **删除图片**:点击图片上的"×"按钮
-
-#### 🤏 操作技巧
-- **触觉反馈**:支持震动的设备会有操作反馈
-- **防误触**:轻微移动不会触发拖拽,需要明显移动
-- **扩大点击区**:删除按钮周围有额外10px的点击缓冲区域
-
-#### 📱 移动优化特性
-- **响应式布局**:自动适配手机屏幕
-- **大触摸目标**:所有按钮和交互区域针对触摸优化
-- **流畅动画**:拖拽时有平滑的视觉反馈
-
-### 4. 参数配置
-- **输出质量**:调整输出图片质量(70-100%)
-- **分组大小**:自定义每组图片数量
-
-### 5. 开始处理
-- 点击"开始拼图"按钮
-- 实时查看处理进度
-- 完成后自动下载拼接后的图片
-
-## 🎨 界面功能详解
-
-### 主界面布局
-
-#### 左侧区域 - 图片管理
-- **上传区域**:支持拖拽和点击上传
-- **分组控制**:设置每组图片数量和自动分组
-- **分组显示**:可视化查看和管理所有分组
-- **图片池**:待分配的图片集合
-
-#### 右侧区域 - 处理和预览
-- **预览窗口**:查看拼接效果
-- **输出设置**:调整输出质量
-- **处理控制**:开始/停止处理
-- **进度显示**:实时处理进度
-
-### 特色功能
-
-#### 🎯 智能分组算法
-- 根据图片总数自动计算合理分组
-- 支持手动调整分组内容
-- 实时统计每组图片数量
-
-#### 🎨 拖拽操作
-- 支持图片在分组间自由拖拽
-- 支持从图片池拖拽到分组
-- 支持清空分组后图片回到图片池
-- **组内排序**:支持在分组内拖拽调整图片顺序
-
-#### 📱 触屏优化功能
-- **长按拖拽**:400ms长按开始拖拽,防止误触
-- **触觉反馈**:支持设备震动反馈(拖拽开始、放置成功、删除确认)
-- **触摸目标**:所有按钮和交互区域增大50%以上
-- **手势支持**:完美适配手机和平板触摸操作
-- **响应式布局**:自动适配不同屏幕尺寸
-- **防误触**:移动阈值保护,轻微移动不会误触发
-
-#### 📊 实时反馈
-- 图片数量实时统计
-- 处理进度百分比显示
-- 详细的操作状态提示
-- 触摸操作视觉反馈(阴影、动画、颜色变化)
-
-## 🛠️ 技术规格
-
-### 浏览器兼容性
-- **Chrome**: 90+
-- **Firefox**: 88+
-- **Safari**: 14+
-- **Edge**: 90+
-
-### 支持的图片格式
-- **JPEG/JPG**: 最常用的照片格式
-- **PNG**: 支持透明背景
-- **WebP**: Google现代格式
-- **BMP**: Windows位图
-- **TIFF**: 高质量图像
-
-### 技术架构
-- **前端**: HTML5 + CSS3 + JavaScript (ES6+)
-- **图片处理**: Canvas API
-- **拖拽**: 原生Drag & Drop API + Touch Events API
-- **触屏优化**: 触觉反馈API (Vibration API) + 触摸手势识别
-- **响应式设计**: CSS Grid + Flexbox + 媒体查询
-- **部署**: GitHub Pages
-
-## 🔧 高级功能
-
-### 自定义配置
-在 `script.js` 中可调整以下参数:
-```javascript
-const CONFIG = {
- DEFAULT_GROUP_SIZE: 9, // 默认每组图片数
- MAX_FILE_SIZE: 10 * 1024 * 1024, // 最大文件大小 (10MB)
- OUTPUT_QUALITY: 95, // 默认输出质量
- SUPPORTED_FORMATS: ['image/jpeg', 'image/png', 'image/webp', 'image/bmp', 'image/tiff']
-};
-```
+> 本项目是构建型工程,需要 **Node.js 18+** 环境(与旧版纯静态站不同)。
-### 批量处理
-- 支持一次处理多张图片
-- 自动按设置的分组大小进行分组
-- 每组图片单独生成一个文件
+## 使用流程
-## 📁 项目结构
+### 1. 上传照片
-```
+将照片拖入上传区域,或点击选择图片文件批量添加。支持 JPG / PNG / WebP / BMP 等格式。
+
+### 2. 分组整理
+
+在「分组管理」中设置每组数量并点击「自动分组」,或手动「新建分组」。随后可以:
+
+- 将图片从图片池拖拽到指定分组;
+- 在分组之间移动图片;
+- 在同一分组内拖拽调整顺序;
+- 点分组「清空」释放该组图片、「删除」移除分组。
+
+### 3. 设置输出参数
+
+在右侧「输出设置」中调整输出质量(70%~100%,默认 95%)与输出格式(JPEG / PNG / WebP)。
+
+### 4. 开始拼接
+
+点击「开始拼接」,应用会逐组处理可拼接的分组并显示进度;拼接在 Web Worker 后台执行。
+
+### 5. 预览与下载
+
+处理完成后,结果会在左侧「拼接结果」区生成卡片预览(含分组名与输出尺寸)。可点击单个「下载」,或「下载全部」一次保存。
+
+## 快捷键
+
+| 快捷键 | 功能 |
+| --- | --- |
+| Ctrl / Cmd + O | 添加图片 |
+| Ctrl / Cmd + Enter | 开始拼接 |
+| Ctrl / Cmd + Z | 撤销 |
+| Ctrl / Cmd + Y 或 Ctrl / Cmd + Shift + Z | 重做 |
+| Ctrl + Shift + C | 清空所有 |
+
+## 输出规则
+
+- **拼接方向:** 当前版本仅支持垂直拼接。
+- **质量范围:** 输出质量 70%~100%,默认 95%。
+- **输出宽度:** 取分组内所有图片的最小原图宽度。
+- **输出格式:** JPEG / PNG / WebP,默认为 JPEG。
+- **分组限制:** 每个包含至少 2 张图片的分组生成一个文件;仅 1 张图片的分组会被跳过并提示。
+- **文件名:** `分组名_时间戳.格式`,避免同名覆盖。
+
+## 支持格式与兼容性
+
+### 图片格式
+
+常见的 JPEG / JPG、PNG、WebP、BMP、TIFF 等图片通常可以直接处理,实际支持范围取决于浏览器解码能力。浏览器无法解码的格式(例如部分 iPhone 的 HEIC 原图)会被跳过并提示,建议先转换为 JPG 或 PNG。
+
+### 浏览器
+
+需支持 `OffscreenCanvas` 与 `createImageBitmap`,建议:
+
+- Chrome 90+
+- Firefox 100+
+- Safari 16.4+
+- Edge 90+
+
+## 技术实现
+
+- **构建工具:** Vite 6(`worker.format: 'es'`,`base: './'`)。
+- **语言:** TypeScript(严格模式)。
+- **样式:** Tailwind CSS + CSS 自定义属性(暗色 / 亮色主题)。
+- **测试:** Vitest(jsdom 环境)。
+- **代码规范:** ESLint + Prettier。
+- **UI 层:** 原生 DOM 工厂函数 + 事件总线(不依赖 Vue / React 等框架)。
+- **状态层:** `AppState` 单例 + 命令模式(撤销 / 重做)。
+- **拼接层:** Web Worker 内使用 `OffscreenCanvas` + `ImageBitmap`。
+- **存储层:** 图片二进制存 IndexedDB,界面状态(分组、图片元数据、设置)存 localStorage。
+- **部署:** GitHub Actions 自动发布 GitHub Pages,`base: './'` 兼容子路径,`public/legacy` 一并发布旧版。
+
+## 项目结构
+
+```text
MomentWebStitcher/
-├── index.html # 🎨 主页面
-├── style.css # 🎨 样式文件
-├── script.js # ⚙️ 核心JavaScript
-├── package.json # 📦 项目配置
-├── README.md # 📖 说明文档
-└── .github/
- └── workflows/
- └── deploy.yml # 🚀 GitHub Actions部署配置
+├── index.html # 入口 HTML
+├── vite.config.ts # Vite 配置(base:'./'、worker es、@ 别名)
+├── vitest.config.ts # Vitest 配置
+├── tailwind.config.js # Tailwind 配置
+├── tsconfig.json # TypeScript 配置
+├── src/
+│ ├── main.ts # 应用入口与布局装配
+│ ├── core/
+│ │ ├── state.ts # AppState 单例(状态 + 命令分发 + 自动保存)
+│ │ ├── commands.ts # 命令模式(撤销 / 重做,含 IndexedDB 副作用)
+│ │ ├── storage.ts # IndexedDB 图片存储 + localStorage 状态
+│ │ ├── worker.ts # Web Worker 管理
+│ │ └── events.ts # 事件总线与事件常量
+│ ├── components/
+│ │ ├── upload/ # 上传区域
+│ │ ├── image-pool/ # 图片池
+│ │ ├── group-manager/ # 分组管理
+│ │ ├── results/ # 拼接结果预览
+│ │ ├── settings/ # 设置面板
+│ │ └── common/ # 按钮 / Toast / Modal / 进度条
+│ ├── workers/
+│ │ └── imageProcessor.ts # 图片拼接 Worker(OffscreenCanvas)
+│ ├── utils/ # 工具函数与常量
+│ ├── styles/ # 变量与动画样式
+│ └── types/ # TypeScript 类型
+├── public/
+│ ├── vite.svg
+│ └── legacy/ # 旧版静态站(含切换入口,随构建发布)
+├── tests/
+│ └── unit/ # 单元测试(helpers / state / persistence)
+├── .github/workflows/deploy.yml # GitHub Pages 部署工作流
+└── package.json
```
-## 🚀 部署指南
+## 开发与测试
+
+```bash
+# 安装依赖
+npm install
+
+# 开发
+npm run dev
+
+# 类型检查 + 构建
+npm run build
+
+# 单元测试(Vitest)
+npm run test
+
+# 代码检查(ESLint)
+npm run lint
+```
+
+测试覆盖工具函数、状态管理(命令 / 撤销 / 重做 / 自动分组)以及持久化往返(IndexedDB + localStorage)。
+
+## 部署
+
+推送到 `rewrite` 分支后,GitHub Actions 会根据 `.github/workflows/deploy.yml` 构建并发布到 GitHub Pages:
+
+- 步骤:checkout → setup Node 20 → `npm ci` → `npm run build` → configure-pages → upload artifact(`dist`)→ deploy-pages。
+- 首次启用需在仓库 **Settings → Pages → Source** 选择 **GitHub Actions**。
+
+部署完成后:新版位于根目录,旧版位于 `legacy/`。
+
+## 新旧版本
+
+- **新版(本分支,rewrite):** Vite + TypeScript 模块化实现,带 Web Worker、持久化、撤销重做、结果预览与批量下载。
+- **旧版(main 分支):** 纯静态单文件实现(`index.html` + `style.css` + `script.js`),无构建步骤、直接部署。
-### 部署到GitHub Pages
-1. Fork 本仓库
-2. 进入仓库 Settings → Pages
-3. 选择 Source 为 "Deploy from a branch"
-4. 选择 Branch 为 "main" 和 "/ (root)"
-5. 等待部署完成
+新版页头提供「旧版」入口(跳转 `./legacy/index.html`),旧版页头提供「返回新版」入口(跳转 `../index.html`),可随时在两个版本间切换。旧版源码随构建发布到 `dist/legacy/`,因此只需一个 Pages 地址即可同时访问两版。
-### 自定义域名
-在仓库设置中添加自定义域名,或修改 `CNAME` 文件。
+## 常见问题
-## ❓ 常见问题解答
+### 图片会上传到服务器吗?
-### 🔧 技术问题
+不会。图片读取、排序、拼接和压缩都在当前浏览器页面中完成,图片数据仅存储在本地 IndexedDB,不会上传。
-**Q: 为什么图片处理很慢?**
-A: 图片处理在浏览器端进行,大文件处理可能需要时间。建议:
-- 减少单次处理的图片数量
-- 使用较小的图片文件
-- 关闭其他占用资源的标签页
+### 刷新页面会丢失工作吗?
-**Q: 支持哪些浏览器?**
-A: 支持所有现代浏览器(Chrome 90+, Firefox 88+, Safari 14+, Edge 90+)
+不会。图片存于 IndexedDB,分组与设置以轻量元数据存于 localStorage,自动防抖保存。清空操作同样会同步清除本地存储。
-**Q: 有文件大小限制吗?**
-A: 浏览器通常限制单个文件大小为100MB,但建议单张图片不超过10MB以获得最佳体验
+### 有文件大小 / 数量限制吗?
-**Q: 如何处理大量图片?**
-A: 建议分批处理,每次处理不超过50张图片
+单张图片上限 50 MB,单次最多 200 张;受浏览器内存与 `OffscreenCanvas` 面积限制,处理超大数量原图时建议分批。
-### 🎨 使用问题
+### 为什么需要 Node.js?
-**Q: 如何调整图片顺序?**
-A: 在分组内可以拖拽调整顺序,或清空后重新分组
+本分支为构建型工程(Vite + TypeScript),需要 `npm install` 与 `npm run build`;若希望免构建,请切换到旧版入口。
-**Q: 输出图片质量如何设置?**
-A: 使用右侧的质量滑块调整(70-100%)
+### 和旧版有什么区别?
-**Q: 可以横向拼接吗?**
-A: 当前版本仅支持垂直拼接,横向拼接功能将在后续版本添加
+旧版是免构建的纯静态站;重写版引入了 Web Worker 后台拼接、IndexedDB 持久化、撤销 / 重做、结果预览与批量下载,并以 TypeScript 模块化分层,便于长期维护。
-## 📄 许可证
+## 贡献
-本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情
+欢迎通过 [GitHub Issues](https://github.com/Piggywu981/MomentWebStitcher/issues) 提交问题或建议,也欢迎提交 Pull Request。
-## 🤝 贡献
+## 许可证
-欢迎提交 Issue 和 Pull Request!
+本项目采用 [MIT License](LICENSE)。
-## 📞 联系
+---
-如有问题或建议,请通过 [GitHub Issues](https://github.com/Piggywu981/MomentWebStitcher/issues) 联系我们。
+Made with ❤️ by [Piggywu981](https://github.com/Piggywu981)
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000..1995b75
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,25 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import tseslint from 'typescript-eslint'
+import prettier from 'eslint-config-prettier'
+import prettierPlugin from 'eslint-plugin-prettier'
+
+export default tseslint.config(
+ { ignores: ['dist', 'node_modules'] },
+ {
+ extends: [js.configs.recommended, ...tseslint.configs.recommended, prettier],
+ files: ['**/*.{ts,tsx}'],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ },
+ plugins: {
+ prettier: prettierPlugin,
+ },
+ rules: {
+ 'prettier/prettier': 'error',
+ '@typescript-eslint/no-explicit-any': 'warn',
+ '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
+ },
+ }
+)
diff --git a/index.html b/index.html
index 5fcfe1b..935c656 100644
--- a/index.html
+++ b/index.html
@@ -1,75 +1,15 @@
-
-
-
+
+
+
+
+
+
MomentStitcher - 朋友圈长图拼接工具
-
-
-
-
-
-
-
- 🎯 MomentStitcher
- 专为朋友圈设计的智能长图拼接工具
-
-
-
-
-
-
-
-
📁
-
拖拽图片到此处或点击选择
-
-
-
-
-
-
-
分组设置
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
输出设置
-
-
-
- 95%
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+