chore: 恢复旧布局基线(迁移改动丢失后重建,apps/packages 布局暂存)
No files matched your search
@@ -4,11 +4,16 @@ version = "0.1.0"
|
|||||||
description = "OpsxDB Tauri desktop shell"
|
description = "OpsxDB Tauri desktop shell"
|
||||||
authors = ["OpsxDB"]
|
authors = ["OpsxDB"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
default-run = "OpsxDB"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "opsxdb_desktop_lib"
|
name = "opsxdb_desktop_lib"
|
||||||
crate-type = ["staticlib", "cdylib", "rlib"]
|
crate-type = ["staticlib", "cdylib", "rlib"]
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "OpsxDB"
|
||||||
|
path = "src/main.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
tauri-build = { version = "2", features = [] }
|
tauri-build = { version = "2", features = [] }
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,45 @@
|
|||||||
{
|
{
|
||||||
"name": "opsxdb",
|
"name": "opsxdb",
|
||||||
"private": true,
|
"private": true,
|
||||||
"workspaces": [
|
"version": "0.1.0",
|
||||||
"apps/web",
|
"type": "module",
|
||||||
"packages/*"
|
|
||||||
],
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev:web": "npm run dev -w @opsxdb/web",
|
"dev": "vite --host 127.0.0.1 --port 5174",
|
||||||
"build:web": "npm run build -w @opsxdb/web",
|
"build": "tsc -b && vite build",
|
||||||
"test:ui": "npm run test -w @opsxdb/ui",
|
"preview": "vite preview --host 127.0.0.1 --port 5174",
|
||||||
"dev:desktop": "npm --prefix apps/desktop run tauri -- dev",
|
"test": "vitest run",
|
||||||
"build:desktop": "npm --prefix apps/desktop run tauri -- build"
|
"test:watch": "vitest",
|
||||||
|
"tauri": "tauri"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=20"
|
"node": ">=20"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@codemirror/autocomplete": "^6.20.3",
|
||||||
|
"@codemirror/commands": "^6.11.1",
|
||||||
|
"@codemirror/lang-sql": "^6.10.0",
|
||||||
|
"@codemirror/language": "^6.12.4",
|
||||||
|
"@codemirror/search": "^6.7.2",
|
||||||
|
"@codemirror/state": "^6.7.5",
|
||||||
|
"@codemirror/theme-one-dark": "^6.1.3",
|
||||||
|
"@codemirror/view": "^6.43.12",
|
||||||
|
"@tauri-apps/api": "^2.5.0",
|
||||||
|
"react": "^19.0.0",
|
||||||
|
"react-dom": "^19.0.0",
|
||||||
|
"sql-formatter": "^15.8.2",
|
||||||
|
"zustand": "^5.0.3"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@tauri-apps/cli": "^2.4.0",
|
||||||
|
"@types/node": "^22.20.3",
|
||||||
|
"@types/react": "^19.0.10",
|
||||||
|
"@types/react-dom": "^19.0.4",
|
||||||
|
"@vitejs/plugin-react": "^4.4.1",
|
||||||
|
"autoprefixer": "^10.4.21",
|
||||||
|
"postcss": "^8.5.3",
|
||||||
|
"tailwindcss": "^3.4.17",
|
||||||
|
"typescript": "^5.8.2",
|
||||||
|
"vite": "^6.2.2",
|
||||||
|
"vitest": "^3.0.9"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# ./run.sh # = web:仅 Gin 官网 + docs(:8788)
|
# ./run.sh # = web:仅 Gin 官网 + docs(:8788)
|
||||||
# ./run.sh web # 同上(浏览器不当客户端)
|
# ./run.sh web # 同上(浏览器不当客户端)
|
||||||
# ./run.sh gui # 桌面唯一操作入口:Vite(本机给 Tauri) + Tauri + 默认 Gin
|
# ./run.sh gui # 桌面唯一操作入口:临时 .app(Dock 名 OpsxDB)+ 默认 Gin
|
||||||
# ./run.sh all # 同 gui(兼容旧命令;不再起「浏览器工作台产品」)
|
# ./run.sh all # 同 gui(兼容旧命令;不再起「浏览器工作台产品」)
|
||||||
# ./run.sh server|desktop # 单组件
|
# ./run.sh server|desktop # 单组件
|
||||||
# ./run.sh package # Tauri 安装包 + sidecar
|
# ./run.sh package # Tauri 安装包 + sidecar
|
||||||
@@ -40,6 +40,9 @@ SERVER_LOG="$LOG_DIR/server.log"
|
|||||||
WEB_LOG="$LOG_DIR/web.log"
|
WEB_LOG="$LOG_DIR/web.log"
|
||||||
DESKTOP_LOG="$LOG_DIR/desktop.log"
|
DESKTOP_LOG="$LOG_DIR/desktop.log"
|
||||||
|
|
||||||
|
# shellcheck source=scripts/gui-dev-app.sh
|
||||||
|
source "$SCRIPT_DIR/scripts/gui-dev-app.sh"
|
||||||
|
|
||||||
# node/npm 不在此强制注入,由 detect_node 按需探测(start_web/start_desktop 前调用)。
|
# node/npm 不在此强制注入,由 detect_node 按需探测(start_web/start_desktop 前调用)。
|
||||||
export PATH="/opt/homebrew/bin:/usr/local/bin:${HOME}/.cargo/bin:$PATH"
|
export PATH="/opt/homebrew/bin:/usr/local/bin:${HOME}/.cargo/bin:$PATH"
|
||||||
|
|
||||||
@@ -175,14 +178,14 @@ start_vite_for_desktop() {
|
|||||||
success "桌面 UI(Vite) 已在运行 :$WEB_PORT"
|
success "桌面 UI(Vite) 已在运行 :$WEB_PORT"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
info "启动桌面 UI 源 :$WEB_PORT(仅本机给 Tauri,勿当浏览器客户端)..."
|
info "启动桌面 UI 源 :${WEB_PORT}(仅本机给 Tauri,勿当浏览器客户端)..."
|
||||||
: >"$WEB_LOG"
|
: >"$WEB_LOG"
|
||||||
ensure_npm
|
ensure_npm
|
||||||
kill_port "$WEB_PORT"
|
kill_port "$WEB_PORT"
|
||||||
start_detached "$WEB_LABEL" "$WEB_LOG" \
|
# Vite 用 nohup:launchctl submit 在本机对 npm -w 经常交不出进程(web.log 空、40s 超时)
|
||||||
"export PATH=\"$NODE_BIN_DIR:/opt/homebrew/bin:/usr/local/bin:\$PATH\"; cd \"$SCRIPT_DIR\" && exec npm run dev -w @opsxdb/web"
|
nohup /bin/bash -lc "export PATH=\"$NODE_BIN_DIR:/opt/homebrew/bin:/usr/local/bin:\$PATH\"; cd \"$SCRIPT_DIR\" && exec npm run dev -w @opsxdb/web" >>"$WEB_LOG" 2>&1 </dev/null &
|
||||||
wait_http "http://127.0.0.1:$WEB_PORT/" "Web UI" 80
|
wait_http "http://127.0.0.1:$WEB_PORT/" "Web UI" 80
|
||||||
success "桌面 UI(Vite) UP http://127.0.0.1:$WEB_PORT(请用 ./run.sh gui,勿当工作台)"
|
success "桌面 UI(Vite) UP http://127.0.0.1:${WEB_PORT}(请用 ./run.sh gui,勿当工作台)"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 兼容旧名
|
# 兼容旧名
|
||||||
@@ -195,32 +198,25 @@ stop_web() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
start_desktop() {
|
start_desktop() {
|
||||||
# GUI 依赖同一份 Vite 源;先保证 5174(仅本机)
|
info "启动桌面 OpsxDB(临时 .app + 当前图标)..."
|
||||||
start_vite_for_desktop
|
|
||||||
info "启动桌面 OpsxDB ..."
|
|
||||||
: >"$DESKTOP_LOG"
|
: >"$DESKTOP_LOG"
|
||||||
ensure_npm
|
ensure_npm
|
||||||
# 清掉旧的 debug 进程(二进制名 OpsxDB)
|
kill_opsxdb_gui
|
||||||
pkill -f 'target/debug/OpsxDB' 2>/dev/null || true
|
ensure_gui_dev_app || return 1
|
||||||
pkill -f 'target/debug/opsxdb-desktop' 2>/dev/null || true
|
if [ "${GUI_DEV_NEEDS_VITE:-0}" = "1" ]; then
|
||||||
stop_detached "$DESKTOP_LABEL"
|
start_vite_for_desktop
|
||||||
start_detached "$DESKTOP_LABEL" "$DESKTOP_LOG" \
|
fi
|
||||||
"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"
|
open "$GUI_APP" 2>>"$DESKTOP_LOG" || { error "open 失败,见 $DESKTOP_LOG"; return 1; }
|
||||||
|
|
||||||
local i=0
|
local i=0
|
||||||
while true; do
|
while true; do
|
||||||
if pgrep -f 'target/debug/OpsxDB' >/dev/null 2>&1 \
|
if gui_is_running; then
|
||||||
|| pgrep -f 'target/debug/opsxdb-desktop' >/dev/null 2>&1; then
|
success "桌面 OpsxDB 已启动(临时 .app,Dock 用 icon.icns / 名称 OpsxDB)"
|
||||||
success "桌面 OpsxDB 已启动(Dock 名应为 OpsxDB)"
|
info "路径: $GUI_APP"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
if grep -Eiq 'error:|panicked|could not compile' "$DESKTOP_LOG" 2>/dev/null; then
|
|
||||||
error "桌面启动失败,见 $DESKTOP_LOG"
|
|
||||||
tail -n 40 "$DESKTOP_LOG" || true
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
i=$((i + 1))
|
i=$((i + 1))
|
||||||
if [ "$i" -ge 120 ]; then
|
if [ "$i" -ge 30 ]; then
|
||||||
error "桌面启动超时,见 $DESKTOP_LOG"
|
error "桌面启动超时,见 $DESKTOP_LOG"
|
||||||
tail -n 40 "$DESKTOP_LOG" || true
|
tail -n 40 "$DESKTOP_LOG" || true
|
||||||
return 1
|
return 1
|
||||||
@@ -230,10 +226,7 @@ start_desktop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stop_desktop() {
|
stop_desktop() {
|
||||||
stop_detached "$DESKTOP_LABEL"
|
kill_opsxdb_gui
|
||||||
pkill -f 'target/debug/OpsxDB' 2>/dev/null || true
|
|
||||||
pkill -f 'target/debug/opsxdb-desktop' 2>/dev/null || true
|
|
||||||
pkill -f 'apps/desktop/node_modules/.bin/tauri' 2>/dev/null || true
|
|
||||||
success "桌面已停止"
|
success "桌面已停止"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,7 +238,7 @@ status() {
|
|||||||
warning "server :$SERVER_PORT DOWN"
|
warning "server :$SERVER_PORT DOWN"
|
||||||
fi
|
fi
|
||||||
if curl -fsS "http://127.0.0.1:$WEB_PORT/" >/dev/null 2>&1; then
|
if curl -fsS "http://127.0.0.1:$WEB_PORT/" >/dev/null 2>&1; then
|
||||||
success "vite :$WEB_PORT UP(桌面源,非浏览器产品)"
|
success "vite :${WEB_PORT} UP(桌面源,非浏览器产品)"
|
||||||
else
|
else
|
||||||
warning "vite :$WEB_PORT DOWN"
|
warning "vite :$WEB_PORT DOWN"
|
||||||
fi
|
fi
|
||||||
@@ -253,8 +246,7 @@ status() {
|
|||||||
|| curl -fsS "http://127.0.0.1:$SERVER_PORT/docs" >/dev/null 2>&1; then
|
|| curl -fsS "http://127.0.0.1:$SERVER_PORT/docs" >/dev/null 2>&1; then
|
||||||
success "site :$SERVER_PORT 官网/docs 可达"
|
success "site :$SERVER_PORT 官网/docs 可达"
|
||||||
fi
|
fi
|
||||||
if pgrep -f 'target/debug/OpsxDB' >/dev/null 2>&1 \
|
if gui_is_running; then
|
||||||
|| pgrep -f 'target/debug/opsxdb-desktop' >/dev/null 2>&1; then
|
|
||||||
success "gui OpsxDB UP"
|
success "gui OpsxDB UP"
|
||||||
else
|
else
|
||||||
warning "gui OpsxDB DOWN"
|
warning "gui OpsxDB DOWN"
|
||||||
@@ -291,7 +283,7 @@ $PROJECT_NAME 启动脚本(产品形态:浏览器=官网/docs · 操作=桌
|
|||||||
|
|
||||||
./run.sh # 同 web
|
./run.sh # 同 web
|
||||||
./run.sh web # 仅 Gin:官网 + docs → http://127.0.0.1:$SERVER_PORT/
|
./run.sh web # 仅 Gin:官网 + docs → http://127.0.0.1:$SERVER_PORT/
|
||||||
./run.sh gui # 桌面唯一操作入口(Vite 本机源 + Tauri;默认也起 Gin)
|
./run.sh gui # 桌面:临时 .app(Dock=OpsxDB / icon.icns;默认也起 Gin)
|
||||||
./run.sh all # 同 gui(兼容旧名)
|
./run.sh all # 同 gui(兼容旧名)
|
||||||
|
|
||||||
./run.sh server # 只 Gin(官网/docs + API)
|
./run.sh server # 只 Gin(官网/docs + API)
|
||||||
@@ -300,7 +292,7 @@ $PROJECT_NAME 启动脚本(产品形态:浏览器=官网/docs · 操作=桌
|
|||||||
|
|
||||||
./run.sh stop | restart | status | help
|
./run.sh stop | restart | status | help
|
||||||
|
|
||||||
端口: Gin/官网 $SERVER_PORT · 桌面 Vite 源 $WEB_PORT(不对外当客户端)
|
端口: Gin/官网 $SERVER_PORT · 桌面 Vite 源 ${WEB_PORT}(不对外当客户端)
|
||||||
日志: logs/{server,web,desktop}.log
|
日志: logs/{server,web,desktop}.log
|
||||||
USAGE
|
USAGE
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,121 @@
|
|||||||
|
# sourced by run.sh — temp OpsxDB.app for Dock icon (icons/icon.icns)
|
||||||
|
# shellcheck shell=bash
|
||||||
|
|
||||||
|
# .noindex:避免 Spotlight 把临时 Dock 壳当成可打开的历史 App
|
||||||
|
TAURI_DIR="$SCRIPT_DIR/apps/desktop/src-tauri"
|
||||||
|
GUI_APP_DIR="$TAURI_DIR/target/gui-app.noindex"
|
||||||
|
GUI_APP="$GUI_APP_DIR/OpsxDB.app"
|
||||||
|
ICONS_DIR="$TAURI_DIR/icons"
|
||||||
|
REL_APP="$TAURI_DIR/target/release/bundle/macos/OpsxDB.app"
|
||||||
|
DBG_APP="$TAURI_DIR/target/debug/bundle/macos/OpsxDB.app"
|
||||||
|
REL_BIN="$TAURI_DIR/target/release/OpsxDB"
|
||||||
|
[ -x "$REL_BIN" ] || REL_BIN="$SCRIPT_DIR/src-tauri/target/release/OpsxDB"
|
||||||
|
DBG_BIN_A="$TAURI_DIR/target/debug/OpsxDB"
|
||||||
|
[ -x "$DBG_BIN_A" ] || DBG_BIN_A="$SCRIPT_DIR/src-tauri/target/debug/OpsxDB"
|
||||||
|
DBG_BIN_B="$TAURI_DIR/target/debug/opsxdb-desktop"
|
||||||
|
[ -x "$DBG_BIN_B" ] || DBG_BIN_B="$SCRIPT_DIR/src-tauri/target/debug/opsxdb-desktop"
|
||||||
|
GUI_DEV_NEEDS_VITE=0
|
||||||
|
|
||||||
|
_gui_write_plist() {
|
||||||
|
cat >"$GUI_APP/Contents/Info.plist" <<'PLIST'
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDisplayName</key><string>OpsxDB</string>
|
||||||
|
<key>CFBundleExecutable</key><string>OpsxDB</string>
|
||||||
|
<key>CFBundleIconFile</key><string>icon.icns</string>
|
||||||
|
<key>CFBundleIdentifier</key><string>com.opsx.db.dev</string>
|
||||||
|
<key>CFBundleName</key><string>OpsxDB</string>
|
||||||
|
<key>CFBundlePackageType</key><string>APPL</string>
|
||||||
|
<key>CFBundleShortVersionString</key><string>0.1.0-dev</string>
|
||||||
|
<key>CFBundleVersion</key><string>0</string>
|
||||||
|
<key>LSHighResolutionCapable</key><true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
|
PLIST
|
||||||
|
}
|
||||||
|
|
||||||
|
_gui_wrap_bin() {
|
||||||
|
local src="$1"
|
||||||
|
mkdir -p "$GUI_APP/Contents/MacOS" "$GUI_APP/Contents/Resources"
|
||||||
|
cp "$src" "$GUI_APP/Contents/MacOS/OpsxDB"
|
||||||
|
chmod +x "$GUI_APP/Contents/MacOS/OpsxDB"
|
||||||
|
local sidecar=""
|
||||||
|
for sidecar in \
|
||||||
|
"$(dirname "$src")/opsxdb-server" \
|
||||||
|
"$SCRIPT_DIR/apps/server/bin/opsxdb-server" \
|
||||||
|
"$SCRIPT_DIR/src-tauri/target/debug/opsxdb-server"
|
||||||
|
do
|
||||||
|
if [ -x "$sidecar" ]; then
|
||||||
|
cp "$sidecar" "$GUI_APP/Contents/MacOS/opsxdb-server"
|
||||||
|
chmod +x "$GUI_APP/Contents/MacOS/opsxdb-server"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
_gui_write_plist
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_gui_dev_app() {
|
||||||
|
local icon="$ICONS_DIR/icon.icns"
|
||||||
|
GUI_DEV_NEEDS_VITE=0
|
||||||
|
if [ ! -f "$icon" ]; then
|
||||||
|
error "缺少 ${icon}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
mkdir -p "$GUI_APP_DIR"
|
||||||
|
if [ -d "$DBG_APP" ]; then
|
||||||
|
rm -rf "$GUI_APP"
|
||||||
|
cp -R "$DBG_APP" "$GUI_APP"
|
||||||
|
GUI_DEV_NEEDS_VITE=1
|
||||||
|
elif [ -x "$DBG_BIN_A" ]; then
|
||||||
|
rm -rf "$GUI_APP"
|
||||||
|
_gui_wrap_bin "$DBG_BIN_A"
|
||||||
|
GUI_DEV_NEEDS_VITE=1
|
||||||
|
elif [ -x "$DBG_BIN_B" ]; then
|
||||||
|
rm -rf "$GUI_APP"
|
||||||
|
_gui_wrap_bin "$DBG_BIN_B"
|
||||||
|
GUI_DEV_NEEDS_VITE=1
|
||||||
|
elif [ -d "$REL_APP" ]; then
|
||||||
|
rm -rf "$GUI_APP"
|
||||||
|
cp -R "$REL_APP" "$GUI_APP"
|
||||||
|
elif [ -x "$REL_BIN" ]; then
|
||||||
|
rm -rf "$GUI_APP"
|
||||||
|
_gui_wrap_bin "$REL_BIN"
|
||||||
|
else
|
||||||
|
error "没有可包装的桌面二进制。请先 ./run.sh gui 走一次 tauri 编译,或 npm run tauri -- build --no-bundle。"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
mkdir -p "$GUI_APP/Contents/Resources"
|
||||||
|
cp "$icon" "$GUI_APP/Contents/Resources/icon.icns"
|
||||||
|
if [ -x "$GUI_APP/Contents/MacOS/opsxdb-desktop" ] && [ ! -x "$GUI_APP/Contents/MacOS/OpsxDB" ]; then
|
||||||
|
mv "$GUI_APP/Contents/MacOS/opsxdb-desktop" "$GUI_APP/Contents/MacOS/OpsxDB"
|
||||||
|
fi
|
||||||
|
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName OpsxDB" "$GUI_APP/Contents/Info.plist" 2>/dev/null || true
|
||||||
|
/usr/libexec/PlistBuddy -c "Set :CFBundleName OpsxDB" "$GUI_APP/Contents/Info.plist" 2>/dev/null || true
|
||||||
|
/usr/libexec/PlistBuddy -c "Set :CFBundleExecutable OpsxDB" "$GUI_APP/Contents/Info.plist" 2>/dev/null || true
|
||||||
|
/usr/libexec/PlistBuddy -c "Set :CFBundleIconFile icon.icns" "$GUI_APP/Contents/Info.plist" 2>/dev/null || true
|
||||||
|
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.opsx.db.dev" "$GUI_APP/Contents/Info.plist" 2>/dev/null || true
|
||||||
|
local stamp
|
||||||
|
stamp="$(date +%Y%m%d%H%M%S)"
|
||||||
|
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${stamp}" "$GUI_APP/Contents/Info.plist" 2>/dev/null || true
|
||||||
|
touch "$GUI_APP"
|
||||||
|
success "临时 .app 已刷 icons/icon.icns → ${GUI_APP}"
|
||||||
|
}
|
||||||
|
|
||||||
|
kill_opsxdb_gui() {
|
||||||
|
stop_detached "$DESKTOP_LABEL"
|
||||||
|
pkill -f "$SCRIPT_DIR/apps/desktop/src-tauri/target/debug/OpsxDB" 2>/dev/null || true
|
||||||
|
pkill -f "$SCRIPT_DIR/apps/desktop/src-tauri/target/debug/opsxdb-desktop" 2>/dev/null || true
|
||||||
|
pkill -f "$SCRIPT_DIR/src-tauri/target/debug/opsxdb-desktop" 2>/dev/null || true
|
||||||
|
pkill -f "$SCRIPT_DIR/src-tauri/target/debug/OpsxDB" 2>/dev/null || true
|
||||||
|
pkill -f "$SCRIPT_DIR/apps/desktop/node_modules/.bin/tauri" 2>/dev/null || true
|
||||||
|
pkill -f "$GUI_APP" 2>/dev/null || true
|
||||||
|
pkill -f "$SCRIPT_DIR/src-tauri/target/gui-app.noindex/OpsxDB.app" 2>/dev/null || true
|
||||||
|
pkill -x OpsxDB 2>/dev/null || true
|
||||||
|
}
|
||||||
|
|
||||||
|
gui_is_running() {
|
||||||
|
pgrep -f "$GUI_APP/Contents/MacOS/" >/dev/null 2>&1 \
|
||||||
|
|| pgrep -x OpsxDB >/dev/null 2>&1
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
[package]
|
||||||
|
name = "opsxdb-desktop"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "OpsxDB Tauri desktop shell"
|
||||||
|
authors = ["OpsxDB"]
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "opsxdb_desktop_lib"
|
||||||
|
crate-type = ["staticlib", "cdylib", "rlib"]
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
tauri-build = { version = "2", features = [] }
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
tauri = { version = "2", features = [] } # path via Manager
|
||||||
|
tauri-plugin-opener = "2"
|
||||||
|
tauri-plugin-single-instance = "2" # 二次启动聚焦已有窗口
|
||||||
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
serde_json = "1"
|
||||||
|
reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "json", "blocking"] }
|
||||||
|
tokio = { version = "1", features = ["time"] }
|
||||||
|
url = "2"
|
||||||
|
rand = "0.8"
|
||||||
|
tauri-plugin-window-state = "2"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() {
|
||||||
|
tauri_build::build()
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../gen/schemas/desktop-schema.json",
|
||||||
|
"identifier": "default",
|
||||||
|
"description": "Default capabilities for the OpsxDB main window",
|
||||||
|
"windows": [
|
||||||
|
"main"
|
||||||
|
],
|
||||||
|
"permissions": [
|
||||||
|
"core:default",
|
||||||
|
"window-state:default",
|
||||||
|
"opener:default"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier","allow-bundle-type","allow-register-listener","allow-remove-listener","allow-supports-multiple-windows"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-bundle-type":{"identifier":"allow-bundle-type","description":"Enables the bundle_type command without any pre-configured scope.","commands":{"allow":["bundle_type"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-remove-listener":{"identifier":"allow-remove-listener","description":"Enables the remove_listener command without any pre-configured scope.","commands":{"allow":["remove_listener"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-set-dock-visibility":{"identifier":"allow-set-dock-visibility","description":"Enables the set_dock_visibility command without any pre-configured scope.","commands":{"allow":["set_dock_visibility"],"deny":[]}},"allow-supports-multiple-windows":{"identifier":"allow-supports-multiple-windows","description":"Enables the supports_multiple_windows command without any pre-configured scope.","commands":{"allow":["supports_multiple_windows"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-bundle-type":{"identifier":"deny-bundle-type","description":"Denies the bundle_type command without any pre-configured scope.","commands":{"allow":[],"deny":["bundle_type"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"DenLine truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"default":{"identifier":"default","description":"Default capabilities for the OpsxDB main window","local":true,"windows":["main"],"permissions":["core:default","window-state:default","opener:default"]}}
|
||||||
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
|
</adaptive-icon>
|
||||||