feat: 18 引擎驱动全家桶 + 驱动管理/离线包 + 设置中心 + 工作台交互打磨
CI / Go server (push) Canceled after 0s
CI / Web + core packages (push) Canceled after 0s
CI / Desktop (Tauri) cargo check (push) Canceled after 0s

驱动接入(全部本机真实例验收):
- Elasticsearch 原生 SQL API、InfluxDB 原生 HTTP+Flux(官方 JDBC 付费许可,实测弃用)
- ZooKeeper/MongoDB JVM agent(连接时自动下载官方驱动 jar,sha256 钉版本到 ~/.opsxdb/drivers/)
- 达梦 JDBC agent 桥就绪(待厂商 jar+实例);TiDB 真实例验收
- 协议族代码审查放行 PolarDB/TDSQL/OceanBase/Kingbase/GaussDB/Oracle
- 驱动能力模型:按驱动开关对象树分组/右键菜单/行编辑,NoSQL 树拍平(对象直挂库节点)

驱动管理:
- 驱动管理弹框(状态/预装/离线包导入/JDK 检测)+ /api/drivers/* 三接口
- opsxdb-driver 驱动商店仓库(清单/fetch.sh/pack.sh 离线包/import.sh)
- 连接时懒加载:DMG 零 Java 产物,首连自动下载(实测 ZK 九件套 1.35s),离线包自动回退

UI/交互:
- 设置中心(⚙):常规/执行/结果/驱动/快捷键/关于,左导航+右面板(对标 opsxshell)
- 实例级展开箭头(行首 SVG chevron,替代字体回退失真的 Unicode 三角)
- 树内嵌套渲染修复:对象树挂在激活连接下;工具栏窄窗口不断行(按钮 nowrap+整颗换行)
- 侧栏连接行精简(图标+连接名)、SQLite SSH 守卫、Oracle 死参数清理

质量:
- Go 协议层/离线回退单测、E2E 门控测试(ES/ZK/Influx/Mongo/TiDB/JDBC 桥)
- 驱动注册表单一事实来源 connection-types.json,README/BACKLOG/AGENTS 同步
This commit is contained in:
logan committed 2026-09-22 01:07:46 +08:00
1 parent 26f459d1b8
commit a9510235bb
156 files changed
+17200 -2520

No files matched your search

+85 -34
View File
@@ -1,15 +1,16 @@
#!/usr/bin/env bash
# OpsxDB launcher — scene profiles, not random process soup
#
# ./run.sh # = web
# ./run.sh web # Gin 代理 + Vite(浏览器)
# ./run.sh gui # Vite + Tauri 桌面(Gin 可选;默认也拉起方便对照)
# ./run.sh all # Gin + Vite + Desktop
# ./run.sh server|web-only|desktop # 单组件
# ./run.sh # = web:仅 Gin 官网 + docs(:8788)
# ./run.sh web # 同上(浏览器不当客户端)
# ./run.sh gui # 桌面唯一操作入口:Vite(本机给 Tauri) + Tauri + 默认 Gin
# ./run.sh all # 同 gui(兼容旧命令;不再起「浏览器工作台产品」)
# ./run.sh server|desktop # 单组件
# ./run.sh package # Tauri 安装包 + sidecar
# ./run.sh stop|restart|status|help
#
# 设计:一份 Vite UI,Web/GUI 共用;Gin 对 Web 刚需,对 GUI 可选。
# 产品形态:浏览器 = 官网/docs;操作 = 桌面 Tauri。
# apps/web 的 Vite 仅作桌面打包/devUrl 源,不要用浏览器当工作台。
set -euo pipefail
@@ -39,7 +40,45 @@ SERVER_LOG="$LOG_DIR/server.log"
WEB_LOG="$LOG_DIR/web.log"
DESKTOP_LOG="$LOG_DIR/desktop.log"
export PATH="${HOME}/.nvm/versions/node/v24.19.0/bin:/opt/homebrew/bin:/usr/local/bin:${HOME}/.cargo/bin:$PATH"
# node/npm 不在此强制注入,由 detect_node 按需探测(start_web/start_desktop 前调用)。
export PATH="/opt/homebrew/bin:/usr/local/bin:${HOME}/.cargo/bin:$PATH"
# detect_node 探测 node/npm:PATH 已有直接用;否则依次探测
# $NVM_DIR/versions/node、~/.nvm/versions/node(取最高版本)、homebrew、/usr/local。
# 找不到给出清晰报错并退出。结果写入 NODE_BIN_DIR 供 launchctl/nohup 子 shell 使用。
NODE_BIN_DIR=""
detect_node() {
if command -v node >/dev/null 2>&1 && command -v npm >/dev/null 2>&1; then
NODE_BIN_DIR="$(cd "$(dirname "$(command -v node)")" && pwd)"
return 0
fi
local roots=() d v best=""
[ -n "${NVM_DIR:-}" ] && roots+=("$NVM_DIR/versions/node")
roots+=("${HOME}/.nvm/versions/node")
for d in "${roots[@]}"; do
[ -d "$d" ] || continue
v="$(ls -1 "$d" 2>/dev/null | sort -V | tail -n 1)"
if [ -n "$v" ] && [ -x "$d/$v/bin/node" ]; then
best="$d/$v/bin"
break
fi
done
if [ -z "$best" ]; then
for d in /opt/homebrew/bin /usr/local/bin; do
if [ -x "$d/node" ]; then
best="$d"
break
fi
done
fi
if [ -z "$best" ]; then
error "未找到 node/npm。请先安装 Node.js(https://nodejs.org)或 nvm,或设置 NVM_DIR 后重试。"
exit 1
fi
NODE_BIN_DIR="$best"
export PATH="$NODE_BIN_DIR:$PATH"
info "使用 Node.js: $NODE_BIN_DIR"
}
check_port() { lsof -ti:"$1" 2>/dev/null | head -1 || true; }
@@ -72,6 +111,7 @@ stop_detached() {
}
ensure_npm() {
detect_node
if [ ! -d "$SCRIPT_DIR/node_modules" ]; then
warning "缺少 node_modules,正在 npm install..."
npm install
@@ -84,7 +124,8 @@ ensure_npm() {
build_server() {
info "编译 Gin 服务..."
(cd "$SCRIPT_DIR/$SERVER_DIR" && go build -o "$SCRIPT_DIR/$SERVER_DIR/bin/$SERVER_BIN" ./cmd/opsxdb)
# -trimpath 去本地路径;-ldflags "-s -w" 去符号表/调试信息;CGO_ENABLED=0 静态化减体积
(cd "$SCRIPT_DIR/$SERVER_DIR" && CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o "$SCRIPT_DIR/$SERVER_DIR/bin/$SERVER_BIN" ./cmd/opsxdb)
}
wait_http() {
@@ -128,21 +169,25 @@ stop_server() {
success "后端已停止"
}
start_web() {
# 仅供桌面 Tauri devUrl / 打包源;不是浏览器产品入口
start_vite_for_desktop() {
if curl -fsS "http://127.0.0.1:$WEB_PORT/" >/dev/null 2>&1; then
success "Web 已在运行 :$WEB_PORT"
success "桌面 UI(Vite) 已在运行 :$WEB_PORT"
return 0
fi
info "启动 Web UI :$WEB_PORT ..."
info "启动桌面 UI 源 :$WEB_PORT(仅本机给 Tauri,勿当浏览器客户端)..."
: >"$WEB_LOG"
ensure_npm
kill_port "$WEB_PORT"
start_detached "$WEB_LABEL" "$WEB_LOG" \
"export PATH=\"/Users/logan/.nvm/versions/node/v24.19.0/bin:/opt/homebrew/bin:/usr/local/bin:\$PATH\"; cd \"$SCRIPT_DIR\" && exec npm run dev -w @opsxdb/web"
"export PATH=\"$NODE_BIN_DIR:/opt/homebrew/bin:/usr/local/bin:\$PATH\"; cd \"$SCRIPT_DIR\" && exec npm run dev -w @opsxdb/web"
wait_http "http://127.0.0.1:$WEB_PORT/" "Web UI" 80
success "Web UP http://127.0.0.1:$WEB_PORT"
success "桌面 UI(Vite) UP http://127.0.0.1:$WEB_PORT(请用 ./run.sh gui,勿当工作台)"
}
# 兼容旧名
start_web() { start_vite_for_desktop; }
stop_web() {
stop_detached "$WEB_LABEL"
kill_port "$WEB_PORT"
@@ -150,8 +195,8 @@ stop_web() {
}
start_desktop() {
# GUI 依赖同一份 Vite;先保证 5174
start_web
# GUI 依赖同一份 Vite 源;先保证 5174(仅本机)
start_vite_for_desktop
info "启动桌面 OpsxDB ..."
: >"$DESKTOP_LOG"
ensure_npm
@@ -160,7 +205,7 @@ start_desktop() {
pkill -f 'target/debug/opsxdb-desktop' 2>/dev/null || true
stop_detached "$DESKTOP_LABEL"
start_detached "$DESKTOP_LABEL" "$DESKTOP_LOG" \
"export PATH=\"/Users/logan/.nvm/versions/node/v24.19.0/bin:/opt/homebrew/bin:/usr/local/bin:\$HOME/.cargo/bin:\$PATH\"; cd \"$SCRIPT_DIR/apps/desktop\" && exec npm run tauri -- dev"
"export PATH=\"$NODE_BIN_DIR:/opt/homebrew/bin:/usr/local/bin:\$HOME/.cargo/bin:\$PATH\"; cd \"$SCRIPT_DIR/apps/desktop\" && exec npm run tauri -- dev"
local i=0
while true; do
@@ -200,9 +245,13 @@ status() {
warning "server :$SERVER_PORT DOWN"
fi
if curl -fsS "http://127.0.0.1:$WEB_PORT/" >/dev/null 2>&1; then
success "web :$WEB_PORT UP http://127.0.0.1:$WEB_PORT"
success "vite :$WEB_PORT UP(桌面源,非浏览器产品)"
else
warning "web :$WEB_PORT DOWN"
warning "vite :$WEB_PORT DOWN"
fi
if curl -fsS "http://127.0.0.1:$SERVER_PORT/home" >/dev/null 2>&1 \
|| curl -fsS "http://127.0.0.1:$SERVER_PORT/docs" >/dev/null 2>&1; then
success "site :$SERVER_PORT 官网/docs 可达"
fi
if pgrep -f 'target/debug/OpsxDB' >/dev/null 2>&1 \
|| pgrep -f 'target/debug/opsxdb-desktop' >/dev/null 2>&1; then
@@ -238,29 +287,31 @@ package_desktop() {
usage() {
cat <<USAGE
$PROJECT_NAME 启动脚本(场景 profile)
$PROJECT_NAME 启动脚本(产品形态:浏览器=官网/docs · 操作=桌面)
./run.sh # 同 web
./run.sh web # 浏览器:Gin + Vite
./run.sh gui # 桌面:Vite + Tauri(默认也起 Gin,OPSXDB_GUI_WITH_SERVER=0 可关)
./run.sh all # Gin + Vite + Desktop
./run.sh web # 仅 Gin:官网 + docs → http://127.0.0.1:$SERVER_PORT/
./run.sh gui # 桌面唯一操作入口(Vite 本机源 + Tauri;默认也起 Gin)
./run.sh all # 同 gui(兼容旧名)
./run.sh server # 只 Gin
./run.sh web-only # 只 Vite
./run.sh desktop # 只 Desktop(会确保 Vite)
./run.sh server # 只 Gin(官网/docs + API)
./run.sh desktop # 只 Desktop(会起本机 Vite 源)
./run.sh package # 打桌面安装包
./run.sh stop | restart | status | help
端口: server $SERVER_PORT / web $WEB_PORT
端口: Gin/官网 $SERVER_PORT · 桌面 Vite 源 $WEB_PORT(不对外当客户端)
日志: logs/{server,web,desktop}.log
USAGE
}
start_web_scene() {
# 产品:浏览器只开官网/docs,不起 Vite 工作台
start_server
start_web
stop_web || true
echo
success "Web 场景就绪 → http://127.0.0.1:$WEB_PORT"
success "官网/文档就绪 → http://127.0.0.1:$SERVER_PORT/ · docs → http://127.0.0.1:$SERVER_PORT/docs"
info "操作请用 ./run.sh gui(桌面)。:5174 不是产品入口。"
}
start_gui_scene() {
@@ -275,11 +326,8 @@ start_gui_scene() {
}
start_all_scene() {
start_server
start_web
start_desktop
echo
success "All 就绪:Web + Desktop + Gin"
# 与 gui 同:桌面操作 + Gin;不起「浏览器工作台产品」语义
start_gui_scene
}
stop_all() {
@@ -295,7 +343,10 @@ case "$cmd" in
all) start_all_scene ;;
server) start_server ;;
package|dist) package_desktop ;;
web-only) start_web ;;
web-only|vite)
warning "已弃用浏览器工作台。Vite 仅桌面源;请用: ./run.sh gui"
start_vite_for_desktop
;;
desktop|gui-only) start_desktop ;;
stop) stop_all ;;
restart)