Skip to content

Commit 1331209

Browse files
authored
Merge pull request #8 from OldCoderIsMe/v0.1.4
V0.1.4 Solar System 手势渲染 + 客户端摄像头权限修复
2 parents 04e3969 + 9db75a0 commit 1331209

16 files changed

Lines changed: 968 additions & 110 deletions

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
| 📱 **二维码生成器** | 文本/URL 转二维码,可配置尺寸(200-500px),支持下载二维码图片 |
6262
| 🔄 **文本差异对比** | 按行/按字符对比,高亮显示新增/删除/未改变的内容,显示统计信息 |
6363
| 📅 **年度倒计时** | 年度进度可视化,显示当前年份进度百分比、剩余天数,支持点阵进度展示(仅 macOS 桌面应用) |
64+
| 🪐 **Solar System** | 摄像头手部关键点追踪,手势控制视角并实时渲染太阳系背景(Web/Electron 可用;浏览器需 HTTPS 或 localhost 才能访问摄像头) |
6465

6566
## 技术栈
6667

@@ -142,9 +143,19 @@ devtools-extension/
142143
1. **隐私安全**:所有计算都在本地浏览器中完成,不会上传任何数据到服务器
143144
2. **数据存储**:扩展使用 Chrome Storage API,数据仅存储在本地
144145
3. **权限说明**:扩展只需要 `storage` 权限,用于本地数据存储
146+
4. **摄像头说明(Solar System)**
147+
- **浏览器**:仅在 **HTTPS****localhost** 环境可调用摄像头(浏览器安全策略)
148+
- **macOS 客户端**:首次使用可能触发系统摄像头权限弹窗,请在系统设置中允许
145149

146150
## 版本历史
147151

152+
### v0.1.4
153+
154+
- ✨ 新增 **Solar System**:MediaPipe 手部关键点追踪 + Three.js 太阳系实时渲染(Web/Electron)
155+
- 🔒 Electron 客户端增加 `media` 权限显式处理(摄像头调用更可控)
156+
- 🛠️ 修复类型检查并补齐依赖:`three` / `@mediapipe/tasks-vision` / `@types/three`
157+
- 📦 mac 打包脚本优化:按架构(x64/arm64)构建并禁用自动发布
158+
148159
### v0.1.2 - 客户端快捷指令版本 🚀
149160

150161
#### ✨ 新增功能

docs/CHROME_EXTENSION_DEPLOY.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ npm run package
2727
这会自动:
2828
1. ✅ 构建项目(`npm run build`
2929
2. ✅ 生成图标(从 brand-icon.png 生成 16x16, 48x48, 128x128)
30-
3. ✅ 创建 ZIP 包(`devtools-suite-v0.1.0.zip`
30+
3. ✅ 创建 ZIP 包(例如:`devtools-suite-v0.1.4.zip`,以 `package.json` 的 version 为准
3131

3232
### 快速发布步骤
3333

@@ -89,7 +89,7 @@ npm run package
8989
这会自动完成:
9090
1. 构建项目
9191
2. 生成图标
92-
3. 创建 ZIP 包(`devtools-suite-v0.1.0.zip`
92+
3. 创建 ZIP 包(例如:`devtools-suite-v0.1.4.zip`,以 `package.json` 的 version 为准
9393

9494
### 方法二:手动打包
9595

@@ -101,7 +101,7 @@ npm run build
101101
cd dist
102102

103103
# 3. 创建 ZIP(Mac/Linux)
104-
zip -r ../devtools-suite-v0.1.0.zip . -x "*/README.md" -x "*/.gitkeep" -x "*/.DS_Store"
104+
zip -r ../devtools-suite-v0.1.4.zip . -x "*/README.md" -x "*/.gitkeep" -x "*/.DS_Store"
105105

106106
# Windows 用户可以使用图形界面压缩 dist 文件夹内的所有文件
107107
```
@@ -134,7 +134,7 @@ zip -r ../devtools-suite-v0.1.0.zip . -x "*/README.md" -x "*/.gitkeep" -x "*/.DS
134134
### 步骤 2:上传 ZIP 文件
135135

136136
1. 点击"**选择文件**"或拖拽文件
137-
2. 选择:`devtools-suite-v0.1.0.zip`
137+
2. 选择:`devtools-suite-v0.1.4.zip`(以实际打包生成的文件名为准)
138138
3. 等待上传完成(可能需要几分钟)
139139

140140
### 步骤 3:验证上传

docs/INSTALL.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
```bash
3636
# 对于 DMG 文件
37-
xattr -cr "/path/to/DevTools Suite-0.1.2.dmg"
37+
xattr -cr "/path/to/DevTools Suite-0.1.4.dmg"
3838

3939
# 对于已安装的应用
4040
xattr -cr "/Applications/DevTools Suite.app"
@@ -57,6 +57,7 @@ sudo spctl --master-enable
5757
1. 打开应用后,如果提示需要权限:
5858
- 点击"打开系统偏好设置"
5959
- 在"隐私与安全性"中授予相应权限
60+
- 如果使用 **Solar System**,请允许 **摄像头** 权限
6061

6162
2. 应用启动后,可以使用以下快捷键:
6263
- `Cmd+K``Cmd+Space` - 打开快速搜索

electron/README.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,14 @@ npm run electron:build:mac
3737
```
3838

3939
这将生成:
40-
- `release/DevTools Suite-0.1.0.dmg` - macOS 安装包
41-
- `release/DevTools Suite-0.1.0-mac.zip` - macOS 压缩包
40+
- `release/DevTools Suite-0.1.4.dmg` - macOS 安装包(x64)
41+
- `release/DevTools Suite-0.1.4-arm64.dmg` - macOS 安装包(arm64)
42+
- `release/DevTools Suite-0.1.4-mac.zip` - macOS 压缩包(x64)
43+
- `release/DevTools Suite-0.1.4-arm64-mac.zip` - macOS 压缩包(arm64)
44+
45+
说明:
46+
- 脚本会按架构顺序构建(避免 DMG 并发挂载冲突)
47+
- 默认禁用自动发布(`--publish never`
4248

4349
### 仅打包(不生成安装包)
4450

@@ -124,6 +130,7 @@ electron/
124130
- ✅ 窗口管理(最小化、最大化、关闭)
125131
- ✅ 安全隔离(contextIsolation)
126132
- ✅ 自动更新支持(可配置)
133+
- ✅ 摄像头交互(Solar System):在 Electron 客户端中可通过 `getUserMedia` 调用摄像头并进行手势交互(需要系统授权)
127134

128135
## 故障排除
129136

electron/main.js

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const { app, BrowserWindow, Menu, shell, screen, globalShortcut, ipcMain, Tray, nativeImage, dialog, crashReporter } = require('electron');
1+
const { app, BrowserWindow, Menu, shell, screen, globalShortcut, ipcMain, Tray, nativeImage, dialog, crashReporter, session, systemPreferences } = require('electron');
22
const path = require('path');
33
const settings = require('./settings');
44
const fileOperations = require('./fileOperations');
@@ -441,6 +441,29 @@ function registerIpcHandlers() {
441441
}
442442
});
443443

444+
// 摄像头权限(macOS)
445+
ipcMain.handle('media:getCameraStatus', () => {
446+
try {
447+
if (process.platform !== 'darwin') return 'not_supported';
448+
return systemPreferences.getMediaAccessStatus('camera');
449+
} catch (e) {
450+
return 'unknown';
451+
}
452+
});
453+
454+
ipcMain.handle('media:askForCameraAccess', async () => {
455+
try {
456+
if (process.platform !== 'darwin') return false;
457+
const status = systemPreferences.getMediaAccessStatus('camera');
458+
if (status === 'granted') return true;
459+
// 会触发系统弹窗(若已拒绝通常会直接返回 false)
460+
const ok = await systemPreferences.askForMediaAccess('camera');
461+
return !!ok;
462+
} catch (e) {
463+
return false;
464+
}
465+
});
466+
444467
// 获取窗口是否可见
445468
ipcMain.handle('quick-search:isVisible', () => {
446469
return quickSearchWindow && !quickSearchWindow.isDestroyed() && quickSearchWindow.isVisible();
@@ -890,6 +913,26 @@ app.whenReady().then(() => {
890913
app.setAsDefaultProtocolClient('devtools-suite');
891914
}
892915
}
916+
917+
// 摄像头/麦克风权限(用于 getUserMedia)
918+
// Electron 默认会自动放行权限请求,显式处理更可控
919+
try {
920+
session.defaultSession.setPermissionRequestHandler((webContents, permission, callback, details) => {
921+
if (permission !== 'media') return callback(false);
922+
923+
const requestingUrl = details?.requestingUrl || webContents.getURL() || '';
924+
const allow =
925+
requestingUrl.startsWith('file://') ||
926+
requestingUrl.startsWith('http://localhost:') ||
927+
requestingUrl.startsWith('http://127.0.0.1:') ||
928+
requestingUrl.startsWith('https://localhost:') ||
929+
requestingUrl.startsWith('https://127.0.0.1:');
930+
931+
callback(allow);
932+
});
933+
} catch (e) {
934+
console.warn('[Electron] 设置媒体权限处理失败:', e?.message || e);
935+
}
893936

894937
createWindow();
895938
createMenu();

electron/preload.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ contextBridge.exposeInMainWorld('electron', {
88
chrome: process.versions.chrome,
99
electron: process.versions.electron,
1010
},
11+
// 媒体权限(仅 Electron / macOS)
12+
media: {
13+
getCameraStatus: () => ipcRenderer.invoke('media:getCameraStatus'),
14+
askForCameraAccess: () => ipcRenderer.invoke('media:askForCameraAccess'),
15+
},
1116
// 快速搜索相关 IPC
1217
quickSearch: {
1318
close: () => ipcRenderer.invoke('quick-search:close'),

manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"manifest_version": 3,
33
"name": "DevTools Suite",
44
"description": "常用开发小工具集合:URL、MD5、时间戳等(本地计算,不上传数据)",
5-
"version": "0.1.1",
5+
"version": "0.1.4",
66
"homepage_url": "https://github.com/OldCoderIsMe/devtools-extension",
77
"action": {
88
"default_popup": "index.html",

package-lock.json

Lines changed: 82 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)