From 2f276d1807d3d6ba7abcb314159f6917c185a630 Mon Sep 17 00:00:00 2001 From: Your Name <8589561@qq.com> Date: Tue, 8 Sep 2026 21:41:04 +0800 Subject: [PATCH] Add plugin test plugin 090802 v0.0.1 - first commit - update logo --- plugins/test-plugin-090802/.gitignore | 25 ++ plugins/test-plugin-090802/CHANGELOG.md | 5 + plugins/test-plugin-090802/README.md | 281 ++++++++++++++++++ plugins/test-plugin-090802/index.html | 11 + plugins/test-plugin-090802/package.json | 20 ++ .../test-plugin-090802/src-ztools/logo.png | Bin 0 -> 46612 bytes .../test-plugin-090802/src-ztools/plugin.json | 52 ++++ .../src-ztools/preload/package.json | 3 + .../src-ztools/preload/services.js | 27 ++ plugins/test-plugin-090802/src/App.vue | 25 ++ .../test-plugin-090802/src/Hello/index.vue | 25 ++ plugins/test-plugin-090802/src/Read/index.vue | 105 +++++++ .../test-plugin-090802/src/Write/index.vue | 40 +++ plugins/test-plugin-090802/src/env.d.ts | 23 ++ plugins/test-plugin-090802/src/main.css | 63 ++++ plugins/test-plugin-090802/src/main.ts | 5 + plugins/test-plugin-090802/tsconfig.json | 19 ++ plugins/test-plugin-090802/vite.config.js | 12 + 18 files changed, 741 insertions(+) create mode 100644 plugins/test-plugin-090802/.gitignore create mode 100644 plugins/test-plugin-090802/CHANGELOG.md create mode 100644 plugins/test-plugin-090802/README.md create mode 100644 plugins/test-plugin-090802/index.html create mode 100644 plugins/test-plugin-090802/package.json create mode 100644 plugins/test-plugin-090802/src-ztools/logo.png create mode 100644 plugins/test-plugin-090802/src-ztools/plugin.json create mode 100644 plugins/test-plugin-090802/src-ztools/preload/package.json create mode 100644 plugins/test-plugin-090802/src-ztools/preload/services.js create mode 100644 plugins/test-plugin-090802/src/App.vue create mode 100644 plugins/test-plugin-090802/src/Hello/index.vue create mode 100644 plugins/test-plugin-090802/src/Read/index.vue create mode 100644 plugins/test-plugin-090802/src/Write/index.vue create mode 100644 plugins/test-plugin-090802/src/env.d.ts create mode 100644 plugins/test-plugin-090802/src/main.css create mode 100644 plugins/test-plugin-090802/src/main.ts create mode 100644 plugins/test-plugin-090802/tsconfig.json create mode 100644 plugins/test-plugin-090802/vite.config.js diff --git a/plugins/test-plugin-090802/.gitignore b/plugins/test-plugin-090802/.gitignore new file mode 100644 index 000000000..cb45445de --- /dev/null +++ b/plugins/test-plugin-090802/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +src-ztools/dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/plugins/test-plugin-090802/CHANGELOG.md b/plugins/test-plugin-090802/CHANGELOG.md new file mode 100644 index 000000000..91d6f895b --- /dev/null +++ b/plugins/test-plugin-090802/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 0.0.1 - 2026-09-08 + +- 初次发布,将插件提交至 ZTools 插件仓库。 diff --git a/plugins/test-plugin-090802/README.md b/plugins/test-plugin-090802/README.md new file mode 100644 index 000000000..aa31efdac --- /dev/null +++ b/plugins/test-plugin-090802/README.md @@ -0,0 +1,281 @@ +# test-plugin-090802 + +> A ZTools plugin + +这是一个使用 **Vue 3 + Vite + TypeScript** 构建的 ZTools 插件。 + +## ✨ 功能特性 + +### 📌 已包含的示例功能 + +- **Hello** - 基础功能指令示例 + - 触发指令:`你好` / `hello` + - 展示简单的 Vue 组件界面 + +- **读文件** - 文件读取功能示例 + - 功能指令:`读文件` + - 匹配指令:支持拖拽文件触发 + - 演示如何使用 Node.js 能力读取文件内容 + +- **保存为文件** - 文件写入功能示例 + - 匹配指令:任意文本/图片 → `保存为文件` + - 演示如何将剪贴板内容保存为文件 + +## 📁 项目结构 + +``` +. +├── src-ztools/ +│ ├── logo.png # 插件图标 +│ ├── plugin.json # 插件配置文件 +│ └── preload/ # Preload 脚本目录 +│ ├── package.json # Preload 依赖配置 +│ └── services.js # Node.js 能力扩展 +├── src/ +│ ├── main.ts # 入口文件 +│ ├── main.css # 全局样式 +│ ├── App.vue # 根组件 +│ ├── env.d.ts # 类型声明 +│ ├── Hello/ # Hello 功能组件 +│ │ └── index.vue +│ ├── Read/ # 读文件功能组件 +│ │ └── index.vue +│ └── Write/ # 写文件功能组件 +│ └── index.vue +├── index.html # HTML 模板 +├── vite.config.js # Vite 配置 +├── tsconfig.json # TypeScript 配置 +├── package.json # 项目依赖 +└── README.md # 项目文档 +``` + +## 🚀 快速开始 + +### 安装依赖 + +```bash +npm install +``` + +### 开发模式 + +```bash +npm run dev +``` + +开发服务器将在 `http://localhost:5173` 启动。ZTools 会自动加载开发版本。 + +### 构建生产版本 + +```bash +npm run build +``` + +构建产物将输出到 `src-ztools/dist/` 目录,`src-ztools/` 是完整的 ZTools 插件目录。 + +## 📖 开发指南 + +### 1. 修改插件配置 + +编辑 `src-ztools/plugin.json` 文件: + +```json +{ + "name": "你的插件名称", + "description": "插件描述", + "author": "作者名称", + "version": "1.0.0", + "features": [ + // 添加你的功能配置 + ] +} +``` + +### 2. 创建新功能 + +#### 步骤 1: 创建 Vue 组件 + +在 `src/` 目录下创建新的功能组件: + +```vue + + + + + + +``` + +#### 步骤 2: 注册路由 + +在 `src/App.vue` 中添加路由: + +```vue + +``` + +#### 步骤 3: 配置功能 + +在 `plugin.json` 中添加功能配置: + +```json +{ + "code": "myfeature", + "explain": "我的新功能", + "icon": "logo.png", + "cmds": ["触发指令"] +} +``` + +### 3. 使用 Node.js 能力 + +#### 扩展 Preload 服务 + +编辑 `src-ztools/preload/services.js`: + +```javascript +const fs = require('fs') +const path = require('path') + +module.exports = { + // 示例:读取文件 + readFile: (filePath) => { + return fs.readFileSync(filePath, 'utf-8') + }, + + // 添加你的服务 + myService: (params) => { + // 实现你的逻辑 + return result + } +} +``` + +#### 在 Vue 组件中调用 + +```vue + +``` + +### 4. 使用 ZTools API + +```vue + +``` + +## 🎨 样式开发 + +### 使用 CSS 变量 + +ZTools 提供了一套 CSS 变量用于主题适配: + +```css +.my-component { + background: var(--bg-color); + color: var(--text-color); + border: 1px solid var(--border-color); +} +``` + +### 暗色模式支持 + +```css +@media (prefers-color-scheme: dark) { + .my-component { + /* 暗色模式样式 */ + } +} +``` + +## 📦 构建与发布 + +### 1. 构建插件 + +```bash +npm run build +``` + +### 2. 测试构建产物 + +将 `src-ztools/` 目录作为完整插件目录复制到 ZTools 插件目录进行测试。 + +### 3. 发布到插件市场 + +1. 确保 `plugin.json` 中的信息完整准确 +2. 准备好插件截图和详细说明 +3. 访问 ZTools 插件市场提交插件 + +## 📚 相关资源 + +- [ZTools 官方文档](https://github.com/ztool-center/ztools) +- [ZTools API 文档](https://github.com/ztool-center/ztools-api-types) +- [Vue 3 文档](https://vuejs.org/) +- [Vite 文档](https://vitejs.dev/) + +## ❓ 常见问题 + +### Q: 如何调试插件? + +A: 使用 `npm run dev` 启动开发服务器,在插件界面中点击插件头像图标,在弹出的菜单中选择"打开开发者工具"进行调试。 + +### Q: 如何访问 Node.js 能力? + +A: 通过 `src-ztools/preload/services.js` 文件扩展服务,然后在组件中使用 `window.services` 调用。 + +### Q: 插件图标不显示? + +A: 确保 `src-ztools/logo.png` 文件存在,且在 `plugin.json` 中正确配置了 `logo` 字段。 + +### Q: 如何处理大文件上传? + +A: 建议使用 Node.js 流式处理,在 preload 脚本中实现文件分块处理逻辑。 + +## 📄 开源协议 + +MIT License + +--- + +**祝你开发愉快!** 🎉 diff --git a/plugins/test-plugin-090802/index.html b/plugins/test-plugin-090802/index.html new file mode 100644 index 000000000..eaa17316c --- /dev/null +++ b/plugins/test-plugin-090802/index.html @@ -0,0 +1,11 @@ + + + + + + + +
+ + + diff --git a/plugins/test-plugin-090802/package.json b/plugins/test-plugin-090802/package.json new file mode 100644 index 000000000..8cfec29a5 --- /dev/null +++ b/plugins/test-plugin-090802/package.json @@ -0,0 +1,20 @@ +{ + "name": "test-plugin-090802", + "version": "1.0.0", + "description": "A ZTools plugin", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build" + }, + "dependencies": { + "vue": "^3.5.13" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.1", + "@ztools-center/ztools-api-types": "^1.0.1", + "typescript": "^5.3.0", + "vite": "^6.0.11", + "vue-tsc": "^2.0.0" + } +} diff --git a/plugins/test-plugin-090802/src-ztools/logo.png b/plugins/test-plugin-090802/src-ztools/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f17f4cecbb33b21688fe4fa07534f762e942f58d GIT binary patch literal 46612 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

?A%WRKUN0^S`E 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 H{oDTm=Kg`# literal 0 HcmV?d00001 diff --git a/plugins/test-plugin-090802/src-ztools/plugin.json b/plugins/test-plugin-090802/src-ztools/plugin.json new file mode 100644 index 000000000..ac50c05a8 --- /dev/null +++ b/plugins/test-plugin-090802/src-ztools/plugin.json @@ -0,0 +1,52 @@ +{ + "$schema": "node_modules/@ztools-center/ztools-api-types/resource/ztools.schema.json", + "name": "test-plugin-090802", + "title": "test plugin 090802", + "description": "A ZTools plugin", + "author": "Your Name", + "version": "0.0.1", + "main": "dist/index.html", + "preload": "preload/services.js", + "logo": "logo.png", + "development": { + "main": "http://localhost:5173" + }, + "features": [ + { + "code": "hello", + "explain": "这是插件应用的第一个功能", + "icon": "logo.png", + "cmds": ["你好", "hello"] + }, + { + "code": "read", + "explain": "功能指令+匹配指令示例,使用 node.js 能力读文件", + "icon": "logo.png", + "cmds": [ + "读文件", + { + "type": "files", + "fileType": "file", + "maxLength": 1, + "label": "读文件" + } + ] + }, + { + "code": "write", + "explain": "匹配指令示例,使用 node.js 能力写文件", + "icon": "logo.png", + "mainHide": true, + "cmds": [ + { + "type": "over", + "label": "保存为文件" + }, + { + "type": "img", + "label": "保存为文件" + } + ] + } + ] +} diff --git a/plugins/test-plugin-090802/src-ztools/preload/package.json b/plugins/test-plugin-090802/src-ztools/preload/package.json new file mode 100644 index 000000000..5bbefffba --- /dev/null +++ b/plugins/test-plugin-090802/src-ztools/preload/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/plugins/test-plugin-090802/src-ztools/preload/services.js b/plugins/test-plugin-090802/src-ztools/preload/services.js new file mode 100644 index 000000000..83c3ef1f5 --- /dev/null +++ b/plugins/test-plugin-090802/src-ztools/preload/services.js @@ -0,0 +1,27 @@ +const fs = require('node:fs') +const path = require('node:path') + +// 通过 window 对象向渲染进程注入 nodejs 能力 +window.services = { + // 读文件 + readFile(file) { + return fs.readFileSync(file, { encoding: 'utf-8' }) + }, + // 文本写入到下载目录 + writeTextFile(text) { + const filePath = path.join(window.ztools.getPath('downloads'), Date.now().toString() + '.txt') + fs.writeFileSync(filePath, text, { encoding: 'utf-8' }) + return filePath + }, + // 图片写入到下载目录 + writeImageFile(base64Url) { + const matchs = /^data:image\/([a-z]{1,20});base64,/i.exec(base64Url) + if (!matchs) return + const filePath = path.join( + window.ztools.getPath('downloads'), + Date.now().toString() + '.' + matchs[1] + ) + fs.writeFileSync(filePath, base64Url.substring(matchs[0].length), { encoding: 'base64' }) + return filePath + } +} diff --git a/plugins/test-plugin-090802/src/App.vue b/plugins/test-plugin-090802/src/App.vue new file mode 100644 index 000000000..d4fabacba --- /dev/null +++ b/plugins/test-plugin-090802/src/App.vue @@ -0,0 +1,25 @@ + + + diff --git a/plugins/test-plugin-090802/src/Hello/index.vue b/plugins/test-plugin-090802/src/Hello/index.vue new file mode 100644 index 000000000..8fc58146c --- /dev/null +++ b/plugins/test-plugin-090802/src/Hello/index.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/plugins/test-plugin-090802/src/Read/index.vue b/plugins/test-plugin-090802/src/Read/index.vue new file mode 100644 index 000000000..903fea36d --- /dev/null +++ b/plugins/test-plugin-090802/src/Read/index.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/plugins/test-plugin-090802/src/Write/index.vue b/plugins/test-plugin-090802/src/Write/index.vue new file mode 100644 index 000000000..f8021de04 --- /dev/null +++ b/plugins/test-plugin-090802/src/Write/index.vue @@ -0,0 +1,40 @@ + + + diff --git a/plugins/test-plugin-090802/src/env.d.ts b/plugins/test-plugin-090802/src/env.d.ts new file mode 100644 index 000000000..94ae981d0 --- /dev/null +++ b/plugins/test-plugin-090802/src/env.d.ts @@ -0,0 +1,23 @@ +/// +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent, Record, unknown> + export default component +} + +// Preload services 类型声明(对应 public/preload/services.js) +interface Services { + readFile: (file: string) => string + writeTextFile: (text: string) => string + writeImageFile: (base64Url: string) => string | undefined +} + +declare global { + interface Window { + services: Services + } +} + +export {} diff --git a/plugins/test-plugin-090802/src/main.css b/plugins/test-plugin-090802/src/main.css new file mode 100644 index 000000000..c372a2a3f --- /dev/null +++ b/plugins/test-plugin-090802/src/main.css @@ -0,0 +1,63 @@ +:root { + --blue: rgb(88, 164, 246); + --light: #fff; +} + +html, +body { + margin: 0; + padding: 0; +} + +button { + border: none; + background: none var(--blue); + color: var(--light); + line-height: 2.5; + cursor: pointer; + transition: opacity 0.2s; +} + +button:disabled { + filter: grayscale(1); + cursor: not-allowed; +} + +button:not(:disabled):active { + opacity: 0.6; +} + +textarea { + display: block; + margin: 0; +} + +@media (prefers-color-scheme: light) { + body { + background-color: #f4f4f4; + } + + ::-webkit-scrollbar-track-piece { + background-color: #f4f4f4; + } + + ::-webkit-scrollbar-thumb { + border-color: #f4f4f4; + } +} + +@media (prefers-color-scheme: dark) { + &::-webkit-scrollbar-track-piece { + background-color: #303133; + } + + &::-webkit-scrollbar-thumb { + background-color: #666; + border-color: #303133; + } + + body { + background-color: #303133; + color: #fff; + } +} diff --git a/plugins/test-plugin-090802/src/main.ts b/plugins/test-plugin-090802/src/main.ts new file mode 100644 index 000000000..8a3c77bc5 --- /dev/null +++ b/plugins/test-plugin-090802/src/main.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue' +import './main.css' +import App from './App.vue' + +createApp(App).mount('#app') diff --git a/plugins/test-plugin-090802/tsconfig.json b/plugins/test-plugin-090802/tsconfig.json new file mode 100644 index 000000000..39b73bc6f --- /dev/null +++ b/plugins/test-plugin-090802/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + "strict": false, + "noImplicitAny": false, + "types": ["@ztools-center/ztools-api-types"] + }, + "include": ["src"] +} diff --git a/plugins/test-plugin-090802/vite.config.js b/plugins/test-plugin-090802/vite.config.js new file mode 100644 index 000000000..ce331609e --- /dev/null +++ b/plugins/test-plugin-090802/vite.config.js @@ -0,0 +1,12 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue()], + base: './', + build: { + outDir: 'src-ztools/dist', + emptyOutDir: true + } +})