|
|
@@ -1,31 +1,57 @@
|
|
|
#!/bin/bash
|
|
|
# 一键打包分发:只打代码与运行所需文件,本机密钥与数据(config.json / session.json /
|
|
|
-# manual-shops.json / data/ 等)绝不进包 —— 对方启动后会自动生成他们本机的配置。
|
|
|
+# manual-shops.json / ops-export.json / data/ / workspace/)默认不进包 —— 对方启动后
|
|
|
+# 会自动生成他们本机的配置和空数据库。
|
|
|
+#
|
|
|
+# 用法:
|
|
|
+# ./打包分发.command 仅代码(推荐)
|
|
|
+# ./打包分发.command --with-data 额外带上当前 data/ops.db(演示数据,注意脱敏)
|
|
|
cd "$(dirname "$0")" || exit 1
|
|
|
|
|
|
NAME="智慧运营中台-分发包"
|
|
|
-OUT="../$NAME"
|
|
|
-ZIP="../$NAME.zip"
|
|
|
+OUT="dist/$NAME"
|
|
|
+ZIP="dist/$NAME.zip"
|
|
|
+WITH_DATA=0
|
|
|
+[ "$1" = "--with-data" ] && WITH_DATA=1
|
|
|
|
|
|
-rm -rf "$OUT" "$ZIP"
|
|
|
-mkdir -p "$OUT"
|
|
|
+rm -rf "$OUT" "$ZIP" || exit 1
|
|
|
+mkdir -p "$OUT" "dist" || exit 1
|
|
|
|
|
|
-# 白名单文件(代码 / 模板 / 启动脚本 / 文档)
|
|
|
-for f in server.js napos-service.js reports-store.js reports-mcp.js nl-query.js report-html.js imageMeta.js \
|
|
|
- package.json package-lock.json config.example.json README.md \
|
|
|
- 启动.command 启动.sh 启动.bat; do
|
|
|
+# 根目录代码:用通配更稳,新增模块不会漏
|
|
|
+for f in *.js; do
|
|
|
+ case "$f" in
|
|
|
+ config.js|session.js) continue ;;
|
|
|
+ esac
|
|
|
[ -f "$f" ] && cp "$f" "$OUT/"
|
|
|
done
|
|
|
|
|
|
-# 目录(前端 / 取数引擎 / 依赖)
|
|
|
+# 配置文件与启动脚本
|
|
|
+for f in package.json package-lock.json config.example.json README.md \
|
|
|
+ 启动.command 启动.sh 启动.bat 打包分发.command 打包分发.bat; do
|
|
|
+ [ -f "$f" ] && cp "$f" "$OUT/"
|
|
|
+done
|
|
|
+
|
|
|
+# 目录(前端 / 服务端 / 脚本 / 依赖)
|
|
|
for d in public server scripts napos node_modules; do
|
|
|
[ -d "$d" ] && cp -R "$d" "$OUT/"
|
|
|
done
|
|
|
|
|
|
+# 兜底:任何本机敏感文件都不进包
|
|
|
+rm -f "$OUT/config.json" "$OUT/session.json" "$OUT/manual-shops.json" "$OUT/ops-export.json"
|
|
|
+rm -rf "$OUT/data" "$OUT/workspace"
|
|
|
find "$OUT" -name ".DS_Store" -delete 2>/dev/null
|
|
|
|
|
|
+if [ "$WITH_DATA" = "1" ] && [ -f data/ops.db ]; then
|
|
|
+ mkdir -p "$OUT/data"
|
|
|
+ # checkpoint 后再复制,保证 ops.db 自包含
|
|
|
+ node -e "const {DatabaseSync}=require('node:sqlite');const db=new DatabaseSync('data/ops.db');db.exec('PRAGMA wal_checkpoint(TRUNCATE)');db.close();" 2>/dev/null || true
|
|
|
+ cp data/ops.db "$OUT/data/ops.db"
|
|
|
+ echo "已包含演示数据库:data/ops.db(请确认数据可外发)"
|
|
|
+fi
|
|
|
+
|
|
|
(
|
|
|
- cd .. || exit 1
|
|
|
+ cd dist || exit 1
|
|
|
+ rm -f "$NAME.zip"
|
|
|
zip -qr "$NAME.zip" "$NAME"
|
|
|
)
|
|
|
|
|
|
@@ -34,10 +60,18 @@ if [ ! -f "$ZIP" ]; then
|
|
|
fi
|
|
|
rm -rf "$OUT"
|
|
|
|
|
|
-echo "已生成分发包: $ZIP"
|
|
|
-echo "包内不含 config.json / session.json / manual-shops.json / data/"
|
|
|
-echo "(API Key、Cookie、报表数据只留在你本机)"
|
|
|
-echo "对方解压后双击 启动.command(macOS)或 启动.bat(Windows)即可,"
|
|
|
-echo "首次启动会自动生成他们本机的配置,并在「系统设置」里填自己的 API Key。"
|
|
|
-echo "若对方电脑装过旧版:把包解压覆盖到原目录即可(不要先删旧目录),"
|
|
|
-echo "其历史 config.json / session.json 会被新版直接读取,API Key 与 Cookie 无需重填。"
|
|
|
+SIZE=$(du -sh "$ZIP" | cut -f1)
|
|
|
+echo ""
|
|
|
+echo "已生成分发包: $ZIP($SIZE)"
|
|
|
+if [ "$WITH_DATA" = "1" ]; then
|
|
|
+ echo "包含:代码 + node_modules + 演示数据库"
|
|
|
+else
|
|
|
+ echo "包含:代码 + node_modules(不含 config.json / data / workspace)"
|
|
|
+fi
|
|
|
+echo ""
|
|
|
+echo "对方解压后:"
|
|
|
+echo " 1) 双击 启动.command(macOS)或 启动.bat(Windows)"
|
|
|
+echo " 2) 首次启动自动生成 config.json 与空数据库"
|
|
|
+echo " 3) 在「系统设置」里填自己的 API Key"
|
|
|
+echo ""
|
|
|
+echo "要求 Node.js >= 22.13(内置 SQLite 驱动);装过旧版可直接覆盖解压。"
|