From 5cba47193273b4d0791738bee23eb02309c4b9fa Mon Sep 17 00:00:00 2001 From: Ethanfly Date: Thu, 5 Feb 2026 18:07:52 +0800 Subject: [PATCH] Enhance site navigation by adding JSON Viewer links across all relevant HTML files; update meta tags in index.html for improved SEO and product visibility. Refactor font link formatting for better readability. --- README-jsonview.md | 251 ++++++++++++++++++++++++++++++++ docs-jsonview/Untitled | 1 + docs-jsonview/view.png | Bin 0 -> 39060 bytes easyshell.html | 33 +++-- easysql.html | 26 ++-- index.html | 89 +++++++++++- jsonview.html | 321 +++++++++++++++++++++++++++++++++++++++++ jsonview_icon.svg | 21 +++ phper.html | 47 ++++-- 9 files changed, 747 insertions(+), 42 deletions(-) create mode 100644 README-jsonview.md create mode 100644 docs-jsonview/Untitled create mode 100644 docs-jsonview/view.png create mode 100644 jsonview.html create mode 100644 jsonview_icon.svg diff --git a/README-jsonview.md b/README-jsonview.md new file mode 100644 index 0000000..40f58ec --- /dev/null +++ b/README-jsonview.md @@ -0,0 +1,251 @@ +# JSON Viewer 桌面版 JSON 阅读器(Tauri + Vue 3 + TypeScript) + +一个跨平台桌面端 JSON 阅读 / 编辑工具,基于 **Tauri 2 + Vue 3 + TypeScript** 实现,专注于「**一眼看懂 JSON 结构,快速定位并编辑需要的字段**」。 + +### 界面预览 + +![JSON Viewer 界面预览](docs-jsonview/view.png) + +- 左侧:树形结构视图,按对象 / 数组分层展示,并显示子节点数量 +- 中间:原始文本视图,支持格式化 / 压缩、缩进风格切换(2 空格 / 4 空格 / Tab) +- 右侧:节点详情区(选中树节点后展示更多信息) +- 顶部工具栏:保存、格式化、压缩、缩进、主题切换、搜索(支持 Ctrl+F) +- 底部状态栏:当前文件状态(未打开 / 已修改)与 JSON 是否有效 + +### 主要特性 + +- 加载本地 JSON 文件(文件对话框 / 拖拽到窗口 / 右键“打开方式”) +- 树形结构查看 JSON,支持折叠/展开、子项计数提示,自动滚动到当前选中节点 +- JSON 格式化 / 压缩,一键切换缩进风格(2 空格 / 4 空格 / Tab),并记住用户偏好 +- 节点值编辑(字符串、数字、布尔、null),实时校验并给出报错位置 +- 原始 JSON 文本同步编辑与实时校验(错误行列直接高亮) +- 关键字搜索(键名/值),支持大小写敏感、上一条 / 下一条结果导航 +- 支持保存 / 另存为 JSON 文件,避免破坏原始数据 + +### 快速上手(作为使用者) + +1. 启动应用后,点击窗口左上方的 **“打开”** 按钮,或直接将 `.json` 文件拖拽进窗口 +2. 在左侧树中展开需要关注的节点,或按 `Ctrl+F` 搜索键名 / 值快速定位 +3. 双击节点值即可就地编辑;右侧原始文本和底部状态栏会实时反馈 JSON 是否有效 +4. 编辑完成后,点击工具栏的 **“保存”** 或 **“另存为”** 持久化到本地文件 + +--- + +## 环境要求 + +- Node.js ≥ 18 +- Rust 工具链(stable,支持 Tauri 2) +- 平台支持: + - Windows 10 及以上 + - macOS 10.15 及以上 + - 主流 Linux(如 Ubuntu、Fedora) + +> 如首次使用 Tauri,可参考官方文档安装系统依赖(如 Windows 上的 MSVC、WebView2 等)。 + +--- + +## 安装依赖 + +在项目根目录(`E:\Workspace\jsonview` 或你的克隆目录)执行: + +```bash +npm install +``` + +这会安装前端依赖(Vue / Vite / Pinia / Tauri CLI 等)。 + +--- + +## 开发模式运行(本地调试) + +开发模式会同时启动: + +- Vite 前端开发服务器(热更新) +- Tauri 桌面应用(加载 Vite 开发页面) + +在项目根目录执行: + +```bash +npm run tauri:dev +``` + +运行成功后会自动弹出桌面应用窗口,你可以: + +- 点击顶部工具栏的 **“打开”** 选择本地 `.json` 文件 +- 或直接将 `.json` 文件从资源管理器 / Finder 中拖拽到窗口中 + +> **重要**:必须用 `npm run tauri:dev` 或打包后的 exe 运行,**不要**用 `npm run dev`(仅 Web 预览,无“打开方式”、拖放、快捷键等桌面功能)。工具栏右侧 **“诊断”** 按钮可查看启动参数,用于排查“打开方式”是否传入路径。 + +### 开发时常用操作 + +- 修改 `src/` 下的前端代码会自动热更新(Tauri 窗口会自动刷新内容) +- 修改 `src-tauri/` 下的 Rust 代码后,Tauri 会重新编译并重启应用 + +--- + +## 打包构建(生成安装包 / 可执行文件) + +项目已经在 `src-tauri/tauri.conf.json` 中配置了应用名称、窗口大小和打包目标。 + +### 1. 仅构建前端(生成静态资源) + +如果你只想构建 Web 端静态资源(调试用),可以执行: + +```bash +npm run build:web +``` + +这会在 `dist/` 目录下生成前端打包产物。 + +### 2. 构建桌面应用安装包(推荐) + +标准的 Tauri 打包流程为: + +```bash +npm run build +``` + +该命令会执行: + +1. `vite build`:构建前端,输出到 `dist/` +2. `tauri build`:使用 `dist/` 中的前端资源,打包为桌面应用 + +打包完成后,生成的可执行文件 / 安装包会出现在: + +- **Windows**:`src-tauri/target/release/jsonview.exe`(可直接运行),以及 **NSIS 安装包** `src-tauri/target/release/bundle/nsis/JSON Viewer_0.1.0_x64-setup.exe` +- macOS:`src-tauri/target/release/bundle/dmg/` 或 `.app` +- Linux:`src-tauri/target/release/bundle/deb/`、`AppImage` 等 + +> **Windows 安装包说明**:构建时会先运行 `scripts/ensure-nsis-windows.ps1`,在 `src-tauri/target/.tauri/` 下预下载 NSIS 工具(含重试与较长超时),避免 Tauri 内置下载超时。安装包会生成在 `bundle/nsis/` 目录下。 + +> 如果你只想单独运行 Tauri 构建(已经手动执行过 `vite build`),也可以: +> +> ```bash +> npm run tauri:build +> ``` + +--- + +## 功能一览与使用说明 + +- **打开 JSON 文件** + - 点击工具栏“打开”按钮,选择 `.json` 文件 + - 或将 `.json` 文件拖拽到窗口,即可自动加载 +- **树形浏览与折叠** + - 左侧树视图展示 JSON 对象/数组结构 + - 点击 `+/-` 折叠/展开节点,折叠时会显示子节点数量 `(X 项)` +- **编辑节点值** + - 对字符串/数字/布尔/null 节点:双击值进入编辑模式 + - 输入合法 JSON 片段(如 `"hello"`、`123`、`true`、`null`),回车或失焦保存 + - 非法输入会提示错误并回退 +- **原始文本编辑与验证** + - 右侧“原始文本视图”可以直接编辑完整 JSON 文本 + - 实时使用 JSON 解析校验,错误信息会显示在编辑器头部与状态栏 +- **缩进设置** + - 工具栏提供:`2 空格 / 4 空格 / Tab` + - 切换后会即时重新格式化当前 JSON 显示 + - 用户选择会保存在本地,下一次启动沿用 +- **搜索与导航** + - 工具栏右侧输入搜索词并回车,可在键名和字符串值中匹配 + - “上一条 / 下一条”在所有匹配项之间循环跳转 + - 每次跳转会自动展开相关节点并滚动到可视区域 + +--- + +## 目录结构(简要) + +```text +jsonview/ + package.json # 项目配置与脚本 + tsconfig.json # TypeScript 配置 + vite.config.ts # Vite 配置 + index.html # 前端入口 HTML + + src/ + main.ts # Vue 入口 + App.vue # 页面布局与 Tauri 拖拽处理 + styles.css # 全局样式 + + types/json.ts # JsonValue / JsonNode 等类型定义 + services/ + jsonParser.ts # JSON 解析与验证、树构建 + formatter.ts # 缩进与格式化 + searchService.ts # 搜索逻辑 + fileService.ts # 调用 Tauri 命令操作文件 + store/ + useJsonStore.ts # Pinia Store:文件状态、缩进、验证、搜索等 + components/ + Toolbar.vue + SearchPanel.vue + JsonTreeView.vue + JsonNode.vue + JsonEditorPanel.vue + StatusBar.vue + + src-tauri/ + Cargo.toml # Rust / Tauri 依赖配置 + build.rs # Tauri 构建脚本 + tauri.conf.json # Tauri 应用配置(窗口、打包等) + src/ + main.rs # Tauri 入口,open/save JSON 命令实现 +``` + +--- + +## 创建 GitHub 仓库并启用自动构建 + +### 1. 初始化 Git(若尚未初始化) + +```bash +git init +git add . +git commit -m "Initial commit" +``` + +### 2. 用 GitHub CLI 创建仓库并推送(推荐) + +1. 安装 [GitHub CLI](https://cli.github.com/) 并登录:`gh auth login` +2. 在项目根目录执行(仓库会创建在当前登录的 GitHub 账号下): + +```powershell +# Windows PowerShell(公开仓库,仓库名 jsonview) +.\scripts\create-github-repo.ps1 -RepoName jsonview -IsPrivate $false + +# 或私有仓库 +.\scripts\create-github-repo.ps1 -RepoName jsonview -IsPrivate $true +``` + +Linux/macOS 可用: + +```bash +chmod +x scripts/create-github-repo.sh +./scripts/create-github-repo.sh jsonview # 公开 +./scripts/create-github-repo.sh jsonview private # 私有 +``` + +若不用脚本,可手动执行: + +```bash +gh repo create jsonview --public --source . --remote origin --push --description "JSON Viewer - 跨平台 JSON 桌面阅读/编辑工具 (Tauri + Vue 3)" +``` + +### 3. 启用自动构建(GitHub Actions) + +- 仓库已包含 `.github/workflows/build.yml`,会在以下情况自动构建并生成 **Draft Release**: + - 推送到 `main` 或 `release` 分支 + - 或在 Actions 页手动触发(workflow_dispatch) +- 构建产物:Windows (x64)、macOS (Intel + Apple Silicon)、Linux (x64) 的安装包/可执行文件,会上传到该次运行的 Release 草稿中。 +- 若提示权限不足:在仓库 **Settings → Actions → General** 中,将 **Workflow permissions** 设为 **Read and write permissions**。 + +### 4. 发布版本 + +- 每次自动构建会创建带版本号的 Tag(如 `v0.1.0`)和 Draft Release。 +- 在 **Releases** 页打开对应草稿,检查附件后点击 **Publish release** 即可对外发布。 + +--- + +## 开发建议 + +- 如果你要扩展功能(如:添加/删除节点、虚拟滚动、大文件优化等),推荐从 `src/store/useJsonStore.ts` 和 `src/components/JsonNode.vue` 入手。 +- 如要调整 UI 风格,可以在 `styles.css` 中统一修改样式,或引入你熟悉的 Vue UI 组件库(如 Naive UI、Element Plus 等)。 + diff --git a/docs-jsonview/Untitled b/docs-jsonview/Untitled new file mode 100644 index 0000000..2d45393 --- /dev/null +++ b/docs-jsonview/Untitled @@ -0,0 +1 @@ +docs-jsonview \ No newline at end of file diff --git a/docs-jsonview/view.png b/docs-jsonview/view.png new file mode 100644 index 0000000000000000000000000000000000000000..1c40b555e7a824e16f77695a1ec3a59be8576d31 GIT binary patch literal 39060 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 literal 0 HcmV?d00001 diff --git a/easyshell.html b/easyshell.html index de6639d..5ba917b 100644 --- a/easyshell.html +++ b/easyshell.html @@ -10,7 +10,9 @@ - + @@ -37,9 +39,11 @@ PHPer EasyShell EasySQL + JSON Viewer - + GitHub @@ -66,13 +70,14 @@

赛博朋克风格的跨平台远程 Shell 管理终端

- 支持 Windows · - macOS · - Linux · + 支持 Windows · + macOS · + Linux · Android 多平台运行

- + @@ -82,7 +87,8 @@ - + 查看源码 @@ -286,7 +292,8 @@

准备好连接你的服务器了吗?

下载 EasyShell,开启赛博朋克式的远程管理体验

@@ -329,5 +339,4 @@ - - + \ No newline at end of file diff --git a/easysql.html b/easysql.html index 19e6629..ff6a1d2 100644 --- a/easysql.html +++ b/easysql.html @@ -10,7 +10,9 @@ - + @@ -36,9 +38,11 @@ PHPer EasyShell EasySQL + JSON Viewer - + GitHub @@ -65,10 +69,10 @@

简洁高效的数据库管理工具

- 支持 MySQL · - PostgreSQL · - SQLite · - MongoDB · + 支持 MySQL · + PostgreSQL · + SQLite · + MongoDB · Redis 等多种数据库

@@ -82,7 +86,8 @@ - + 查看源码 @@ -359,7 +364,8 @@ - + Star on GitHub @@ -381,6 +387,7 @@ 首页 PHPer EasyShell + JSON Viewer GitHub 反馈问题
@@ -392,5 +399,4 @@ - - + \ No newline at end of file diff --git a/index.html b/index.html index 4f84125..fa9d851 100644 --- a/index.html +++ b/index.html @@ -4,9 +4,10 @@ - Ethan的开发工具集 - PHPer & EasyShell - - + Ethan的开发工具集 - PHPer / EasyShell / EasySQL / JSON Viewer + + @@ -37,6 +38,7 @@ PHPer EasyShell EasySQL + JSON Viewer
-

三款精心打造的开发者工具

+

多款精心打造的开发者工具

每一款都专注于解决特定的开发痛点

@@ -324,6 +326,75 @@
+ + + @@ -349,36 +420,45 @@ EasySQL EasySQL +
+ JSON Viewer + JSON Viewer +
主要用途
本地开发环境管理
远程服务器管理
数据库管理
+
JSON 文件阅读 / 编辑
支持平台
Windows
Win/Mac/Linux/Android
Win/Mac/Linux
+
Win/Mac/Linux
UI 风格
现代简约
赛博朋克
清新浅色
+
深色主题 + 三栏布局
技术栈
Vue + Electron
React + Electron/Capacitor
React + Electron
+
Tauri + Vue + TypeScript
适用场景
PHP/Web 开发者
运维/全栈开发者
DBA/后端开发者
+
接口调试 / 日志分析 / 配置排查
@@ -397,6 +477,7 @@ PHPer EasyShell EasySQL + JSON Viewer GitHub diff --git a/jsonview.html b/jsonview.html new file mode 100644 index 0000000..e3fa674 --- /dev/null +++ b/jsonview.html @@ -0,0 +1,321 @@ + + + + + + + JSON Viewer - 跨平台桌面版 JSON 阅读 / 编辑器 + + + + + + + + + + + +
+
+
+
+
+ + + + + +
+
+
+
+ + 跨平台 · Tauri 2 · 开源免费 +
+

+ JSON Viewer + JSON Viewer +

+

桌面版 JSON 阅读 / 编辑器

+

+ 基于 Tauri 2 + Vue 3 + + TypeScript 的轻量级 JSON 工具, + 专注于「一眼看懂 JSON 结构,快速定位并编辑需要的字段」。 +

+ +
+
+ 3 + 支持平台 +
+
+
+ { } + 结构化视图 +
+
+
+ Ctrl+F + 关键字搜索 +
+
+
+
+
+ + +
+
+
+ +

一眼看懂 JSON 结构的三栏布局

+

左侧树形结构,中间原始文本,右侧节点详情,状态栏实时显示 JSON 是否有效

+
+
+ +
+
+
+
+
+ +
+ JSON Viewer +
+
+ JSON Viewer 主界面 +
+
+
+
+
+ + +
+
+
+ +

为 JSON 而生的阅读 / 编辑体验

+

把 JSON 文件当成项目代码一样顺手地浏览、搜索与修改

+
+
+
+
🌲
+

树形结构视图

+

按对象 / 数组分层展示 JSON,支持折叠展开、子节点数量提示,并自动滚动到当前选中节点。

+
    +
  • 展开 / 折叠任意层级节点
  • +
  • 显示对象 / 数组的子项数量
  • +
  • 点击树节点自动同步到文本位置
  • +
  • 适配深色 / 浅色主题
  • +
+
+
+
📝
+

原始文本实时校验

+

中间区域提供原始 JSON 文本编辑器,输入时实时解析,高亮错误行列位置。

+
+
+
🔍
+

关键字搜索与导航

+

支持在键名和字符串值中搜索,配合 Ctrl+F、上一条 / 下一条按钮在所有匹配项之间跳转。

+
+
+
⚙️
+

格式化 / 压缩与缩进切换

+

一键在格式化 / 压缩之间切换,并支持 2 空格、4 空格、Tab 等多种缩进风格。

+
+
+
✏️
+

节点值就地编辑

+

在树视图中双击节点值即可编辑字符串、数字、布尔、null,输入非法 JSON 会提示错误并回退。

+
+
+
💾
+

打开 / 保存本地文件

+

支持通过文件对话框、拖拽到窗口、右键“打开方式”等方式打开本地 JSON,并保存 / 另存为。

+
+
+
+
+ + +
+
+
+ +

几步完成JSON 检查与修改

+
+
+
+ Ctrl + O + 打开本地 JSON 文件 +
+
+ 拖拽文件 + 直接将 .json 拖拽到窗口中加载 +
+
+ Ctrl + F + 在键名 / 字符串值中搜索关键字 +
+
+ 双击节点值 + 就地编辑当前节点的值并实时校验 +
+
+
+
+ + +
+
+
+ +

一次开发多端运行

+

基于 Tauri 构建,原生窗口 + 轻量体积,适合随手放在开发环境中

+
+
+
+
🪟
+

Windows

+

Windows 10 及以上,NSIS 安装包和独立 exe

+
+
+
🍎
+

macOS

+

支持 Intel / Apple Silicon,标准 dmg / app 包

+
+
+
🐧
+

Linux

+

提供 deb / AppImage 等常见发行版包

+
+
+
👨‍💻
+

开发者友好

+

Node.js ≥ 18 + Rust 工具链,clone 即可本地构建

+
+
+
+
+ + +
+
+
+

🛠️ 技术栈

+
+ Tauri 2 + Vue 3 + TypeScript 5 + Vite + Pinia + Rust +
+
+
+
+ + +
+
+
+

想要一个专注于 JSON 的小工具吗?

+

下载 JSON Viewer,把格式化、校验、搜索、编辑这些碎片操作收拢到一个干净的桌面应用里。

+ +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/jsonview_icon.svg b/jsonview_icon.svg new file mode 100644 index 0000000..8ef572a --- /dev/null +++ b/jsonview_icon.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + { } + + diff --git a/phper.html b/phper.html index 7b7c5bc..1bf8547 100644 --- a/phper.html +++ b/phper.html @@ -10,7 +10,9 @@ - + @@ -34,9 +36,11 @@ PHPer EasyShell EasySQL + JSON Viewer - + GitHub @@ -63,7 +67,7 @@

功能强大的 Windows PHP 开发环境管理器

- 告别繁琐的手动配置,轻松管理 + 告别繁琐的手动配置,轻松管理 PHPMySQLNginx、 @@ -72,7 +76,8 @@ Python 等服务

- 仪表盘 + 仪表盘 PHP管理 MySQL管理 Nginx管理 @@ -238,7 +245,8 @@
🐘 PHP - windows.php.net + windows.php.net 官方 Windows 版
@@ -248,12 +256,14 @@
🌐 Nginx - nginx.org + nginx.org 官方 Windows 版
🔴 Redis - GitHub + GitHub Windows 编译版
@@ -263,12 +273,14 @@
🐍 Python - python.org + python.org 嵌入式版本
🔧 Git - git-scm.com + git-scm.com 官方 Windows 版
@@ -294,7 +306,8 @@ @@ -374,7 +387,8 @@

准备好提升开发效率了吗?

立即下载 PHPer,开启高效的 PHP 开发之旅

@@ -417,5 +433,4 @@ - - + \ No newline at end of file