From cdcf2ea15fc9586e89f1ce882cb941ce1c17deaa Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Mon, 18 Nov 2024 18:09:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=BA=94=E7=94=A8=20PageSpy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Meng Sen --- .github/README.md | 1 + README.md | 1 + apps/page-spy-web/1.9.6/data.yml | 16 +++++++++++ apps/page-spy-web/1.9.6/docker-compose.yml | 21 +++++++++++++++ apps/page-spy-web/1.9.6/scripts/init.sh | 15 +++++++++++ apps/page-spy-web/1.9.6/scripts/uninstall.sh | 10 +++++++ apps/page-spy-web/1.9.6/scripts/upgrade.sh | 15 +++++++++++ apps/page-spy-web/README.md | 27 +++++++++++++++++++ apps/page-spy-web/data.yml | 15 +++++++++++ apps/page-spy-web/logo.png | Bin 0 -> 11255 bytes 10 files changed, 121 insertions(+) create mode 100644 apps/page-spy-web/1.9.6/data.yml create mode 100644 apps/page-spy-web/1.9.6/docker-compose.yml create mode 100644 apps/page-spy-web/1.9.6/scripts/init.sh create mode 100644 apps/page-spy-web/1.9.6/scripts/uninstall.sh create mode 100644 apps/page-spy-web/1.9.6/scripts/upgrade.sh create mode 100644 apps/page-spy-web/README.md create mode 100644 apps/page-spy-web/data.yml create mode 100644 apps/page-spy-web/logo.png diff --git a/.github/README.md b/.github/README.md index becc83b3..01691ae1 100644 --- a/.github/README.md +++ b/.github/README.md @@ -134,6 +134,7 @@ | 🟢 | | NocoDB | https://nocodb.com/ | 无代码数据库平台 | | | 🟢 | | OneDev | https://onedev.io/ | DevOps 平台、带有 CI/CD、看板和软件包的 Git 服务器 | | | 🟢 | | OutLine | https://www.getoutline.com/ | 快速、协作的团队知识库 | | +| 🟢 | | PageSpy | https://www.pagespy.org/ | 开源调试平台 | | | 🟢 | | PhotoPrism | https://www.photoprism.app/ | 面向去中心化网络的人工智能照片应用程序 | | | 🟢 | | Pixman | https://pixman.io/ | IPTV、M3U8 流媒体代理方案 | | | 🟢 | | Pingvin Share | https://github.com/stonith404/pingvin-share/ | 一个集轻盈与美观于一体的自托管文件共享平台 | | diff --git a/README.md b/README.md index 1619f630..132c6597 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,7 @@ | 🟢 | | NocoDB | https://nocodb.com/ | 无代码数据库平台 | | | 🟢 | | OneDev | https://onedev.io/ | DevOps 平台、带有 CI/CD、看板和软件包的 Git 服务器 | | | 🟢 | | OutLine | https://www.getoutline.com/ | 快速、协作的团队知识库 | | +| 🟢 | | PageSpy | https://www.pagespy.org/ | 开源调试平台 | | | 🟢 | | PhotoPrism | https://www.photoprism.app/ | 面向去中心化网络的人工智能照片应用程序 | | | 🟢 | | Pixman | https://pixman.io/ | IPTV、M3U8 流媒体代理方案 | | | 🟢 | | Pingvin Share | https://github.com/stonith404/pingvin-share/ | 一个集轻盈与美观于一体的自托管文件共享平台 | | diff --git a/apps/page-spy-web/1.9.6/data.yml b/apps/page-spy-web/1.9.6/data.yml new file mode 100644 index 00000000..9ebbec5e --- /dev/null +++ b/apps/page-spy-web/1.9.6/data.yml @@ -0,0 +1,16 @@ +additionalProperties: + - default: "/home/PageSpy" + edit: true + envKey: KIMAI2_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 6752 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: 访问端口 + labelEn: Port + required: true + rule: paramPort + type: number diff --git a/apps/page-spy-web/1.9.6/docker-compose.yml b/apps/page-spy-web/1.9.6/docker-compose.yml new file mode 100644 index 00000000..b7e11c35 --- /dev/null +++ b/apps/page-spy-web/1.9.6/docker-compose.yml @@ -0,0 +1,21 @@ +networks: + 1panel-network: + external: true + +services: + page-spy-web: + image: huolalatech/page-spy-web:v1.9.6 + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:6752 + env_file: + - /etc/1panel/envs/global.env + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${PAGE_SPY_WEB_ROOT_PATH}/log:/app/log + - ${PAGE_SPY_WEB_ROOT_PATH}/data:/app/data diff --git a/apps/page-spy-web/1.9.6/scripts/init.sh b/apps/page-spy-web/1.9.6/scripts/init.sh new file mode 100644 index 00000000..77b84912 --- /dev/null +++ b/apps/page-spy-web/1.9.6/scripts/init.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/page-spy-web/1.9.6/scripts/uninstall.sh b/apps/page-spy-web/1.9.6/scripts/uninstall.sh new file mode 100644 index 00000000..c86c4fbc --- /dev/null +++ b/apps/page-spy-web/1.9.6/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/page-spy-web/1.9.6/scripts/upgrade.sh b/apps/page-spy-web/1.9.6/scripts/upgrade.sh new file mode 100644 index 00000000..77b84912 --- /dev/null +++ b/apps/page-spy-web/1.9.6/scripts/upgrade.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/page-spy-web/README.md b/apps/page-spy-web/README.md new file mode 100644 index 00000000..e20df235 --- /dev/null +++ b/apps/page-spy-web/README.md @@ -0,0 +1,27 @@ +# PageSpy + +PageSpy 是一个用于在 Web、小程序和 HarmonyOS 应用等平台上调试项目的工具。 + +![PageSpy](https://file.lifebus.top/imgs/pagespy_cover.png) + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 简介 + +PageSpy 是一款兼容 Web / 小程序 / React Native / 鸿蒙 App 等平台项目的开源调试平台。基于对原生 API +的封装,它将调用原生方法时的参数进行过滤、转化,整理成一定格式的消息供调试端消费;调试端收到消息数据后,提供类似本地控制台的功能界面将数据呈现出来。 + +![PageSpy 流程图](https://file.lifebus.top/imgs/pagespy_process.png) + +## 何时使用 + +任何无法在本地使用控制台调试的场景,都是 PageSpy 可以大显身手的时候! 一起来看下面的几个场景案例: + +本地调试 H5、Webview 应用:以往有些产品提供了可以在 H5 上查看信息的面板,但移动端屏幕太小操作不便、显示不友好,以及信息被截断等问题; +远程办公、跨地区协同:传统沟通方式如邮件、电话、视频会议等,沟通效率不高、故障信息不全面,容易误解误判; +用户终端上出现白屏问题:传统定位问题的方式包括数据监控、日志分析等,这些方式依赖排障人员要理解业务需求场景、技术实现; +PageSpy 的目标,就是为包括以上场景的人员提供帮助。 + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/page-spy-web/data.yml b/apps/page-spy-web/data.yml new file mode 100644 index 00000000..651f4e10 --- /dev/null +++ b/apps/page-spy-web/data.yml @@ -0,0 +1,15 @@ +additionalProperties: + key: page-spy-web + name: PageSpy + tags: + - WebSite + - Middleware + - Local + shortDescZh: 开源调试平台 + shortDescEn: Open source debugging platform + type: website + crossVersionUpdate: true + limit: 0 + website: https://www.pagespy.org/ + github: https://github.com/HuolalaTech/page-spy-web/ + document: https://www.pagespy.org/ diff --git a/apps/page-spy-web/logo.png b/apps/page-spy-web/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..528a5d7e4ff372c7afcff46740f7a9645e3132b2 GIT binary patch literal 11255 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 literal 0 KcmV+b0RR6000031