소스 검색

chore: 修复分发包脚本,补齐新增模块与运行环境检查

- 打包脚本改为复制根目录全部 *.js,避免漏掉 ops-store/ops-import/schools-store 导致启动报错
- 产物从「上级目录」改到项目内 dist/(沙箱/权限更稳),dist/ 已加入 .gitignore
- 敏感文件兜底排除:config.json / session.json / manual-shops.json / ops-export.json / data / workspace
- 支持 `--with-data` 可选携带演示数据库(默认不带)
- 启动脚本增加 Node.js >= 22.13 检查(node:sqlite 要求);package.json 增加 engines
- config.example.json 补齐 storage/rootDir/chatModel 等新配置项
- 实测:解压后首启自动生成 config.json 与空库,冒烟 114/114 通过
liangzhao 2 주 전
부모
커밋
b9f703bb03
9개의 변경된 파일과 136개의 추가작업 그리고 30개의 파일을 삭제
  1. 1 0
      .gitignore
  2. 5 1
      README.md
  3. 11 1
      config.example.json
  4. 3 0
      package.json
  5. 15 0
      启动.bat
  6. 10 2
      启动.command
  7. 9 2
      启动.sh
  8. 30 6
      打包分发.bat
  9. 52 18
      打包分发.command

+ 1 - 0
.gitignore

@@ -11,3 +11,4 @@ data/
 .video_agent/
 .zcode/
 ops-export.json
+dist/

+ 5 - 1
README.md

@@ -241,7 +241,11 @@ workspace/
 
 ### 发给别人部署(分发包)
 
-双击 **打包分发.command**(macOS/Linux)或 **打包分发.bat**(Windows),会在项目上级目录生成 `智慧运营中台-分发包.zip`。包内只含代码、依赖和配置模板,**不含**你的 `config.json` / `session.json` / `manual-shops.json` / `data/`(API Key、Cookie、报表数据只留在你本机)。
+双击 **打包分发.command**(macOS/Linux)或 **打包分发.bat**(Windows),会在项目内 `dist/` 生成 `智慧运营中台-分发包.zip`。包内只含代码、依赖和配置模板,**不含**你的 `config.json` / `session.json` / `manual-shops.json` / `data/` / `workspace/`(API Key、Cookie、报表数据只留在你本机)。
+
+需要让对方直接看到演示数据时,执行 `./打包分发.command --with-data`(会把 `data/ops.db` 一起打进去,**注意先确认数据可外发**)。
+
+> 运行要求 **Node.js >= 22.13**(内置 `node:sqlite`);启动脚本会先做版本检查。
 
 对方解压后双击 `启动.command`(macOS)或 `启动.bat`(Windows)即可:首次启动自动生成其本机 `config.json`,在「系统设置」中填写自己的 API Key;数据采集页按提示以调试端口启动并登录自己的商家客户端后同步取数。
 

+ 11 - 1
config.example.json

@@ -3,9 +3,19 @@
   "apiKey": "your-api-key-here",
   "apiBase": "https://api.lk888.ai",
   "model": "gpt-image-2",
+  "chatModel": "deepseek-v4.1-flash",
+  "chatApiBase": "",
+  "chatApiKey": "",
   "maxConcurrentJobs": 4,
   "pageSize": 50,
   "delayMs": 300,
   "crawlChannel": "auto",
-  "requestTimeoutMs": 20000
+  "requestTimeoutMs": 20000,
+  "rootDir": "workspace",
+  "storage": {
+    "driver": "sqlite",
+    "sqlite": {
+      "file": "data/ops.db"
+    }
+  }
 }

+ 3 - 0
package.json

@@ -15,5 +15,8 @@
   "dependencies": {
     "jpeg-js": "^0.4.4",
     "pngjs": "^7.0.0"
+  },
+  "engines": {
+    "node": ">=22.13.0"
   }
 }

+ 15 - 0
启动.bat

@@ -1,8 +1,23 @@
 @echo off
+chcp 65001 >nul
 cd /d "%~dp0"
+
+where node >nul 2>nul
+if errorlevel 1 (
+  echo 未检测到 Node.js。请先安装 Node.js 22.13 或更高版本:https://nodejs.org/
+  pause
+  exit /b 1
+)
+node -e "const [a,b]=process.versions.node.split('.').map(Number);if(a<22||(a===22&&b<13)){console.error('当前 Node.js '+process.version+' 过低,需要 22.13 及以上。');process.exit(1)}"
+if errorlevel 1 (
+  pause
+  exit /b 1
+)
+
 if not exist node_modules (
   echo 正在安装依赖...
   call npm install
 )
 echo 正在启动智慧运营中台...
 call npm start
+pause

+ 10 - 2
启动.command

@@ -1,8 +1,16 @@
 #!/bin/bash
-cd "$(dirname "$0")"
+cd "$(dirname "$0")" || exit 1
+
+# Node.js >= 22.13(内置 SQLite 驱动 node:sqlite 不再需要 flag)
+if ! command -v node >/dev/null 2>&1; then
+  echo "未检测到 Node.js。请先安装 Node.js 22.13 或更高版本:https://nodejs.org/"
+  exit 1
+fi
+node -e "const [a,b]=process.versions.node.split('.').map(Number);if(a<22||(a===22&&b<13)){console.error('当前 Node.js '+process.version+' 过低,需要 22.13 及以上。');process.exit(1)}" || exit 1
+
 if [ ! -d node_modules ]; then
   echo "正在安装依赖..."
-  npm install
+  npm install || exit 1
 fi
 echo "正在启动智慧运营中台..."
 npm start

+ 9 - 2
启动.sh

@@ -1,8 +1,15 @@
 #!/bin/bash
-cd "$(dirname "$0")"
+cd "$(dirname "$0")" || exit 1
+
+if ! command -v node >/dev/null 2>&1; then
+  echo "未检测到 Node.js。请先安装 Node.js 22.13 或更高版本:https://nodejs.org/"
+  exit 1
+fi
+node -e "const [a,b]=process.versions.node.split('.').map(Number);if(a<22||(a===22&&b<13)){console.error('当前 Node.js '+process.version+' 过低,需要 22.13 及以上。');process.exit(1)}" || exit 1
+
 if [ ! -d node_modules ]; then
   echo "正在安装依赖..."
-  npm install
+  npm install || exit 1
 fi
 echo "正在启动智慧运营中台..."
 npm start

+ 30 - 6
打包分发.bat

@@ -2,27 +2,51 @@
 chcp 65001 >nul
 cd /d "%~dp0"
 set NAME=智慧运营中台-分发包
-set OUT=..\%NAME%
-set ZIP=..\%NAME%.zip
+set OUT=%CD%\dist\%NAME%
+set ZIP=%CD%\dist\%NAME%.zip
 
 if exist "%OUT%" rmdir /s /q "%OUT%"
 if exist "%ZIP%" del /q "%ZIP%"
+if not exist "dist" mkdir "dist"
 mkdir "%OUT%"
 
-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 启动.bat) do (
+rem 根目录代码:复制全部 *.js,新增模块不会漏
+for %%f in (*.js) do (
+  copy /y "%%f" "%OUT%\" >nul
+)
+
+for %%f in (package.json package-lock.json config.example.json README.md 启动.bat 启动.command 启动.sh 打包分发.bat 打包分发.command) do (
   if exist "%%f" copy /y "%%f" "%OUT%\" >nul
 )
+
 robocopy public "%OUT%\public" /E /NFL /NDL /NJH /NJS >nul
 robocopy napos "%OUT%\napos" /E /NFL /NDL /NJH /NJS >nul
 robocopy server "%OUT%\server" /E /NFL /NDL /NJH /NJS >nul
 robocopy scripts "%OUT%\scripts" /E /NFL /NDL /NJH /NJS >nul
 robocopy node_modules "%OUT%\node_modules" /E /NFL /NDL /NJH /NJS >nul
 
+rem 敏感文件与数据默认不进包
+if exist "%OUT%\config.json" del /q "%OUT%\config.json"
+if exist "%OUT%\session.json" del /q "%OUT%\session.json"
+if exist "%OUT%\manual-shops.json" del /q "%OUT%\manual-shops.json"
+if exist "%OUT%\ops-export.json" del /q "%OUT%\ops-export.json"
+if exist "%OUT%\data" rmdir /s /q "%OUT%\data"
+if exist "%OUT%\workspace" rmdir /s /q "%OUT%\workspace"
+
+rem 可选:带上演示数据库(双击运行时默认不带;需要时在命令行执行 打包分发.bat --with-data)
+if /i "%~1"=="--with-data" (
+  if exist "data\ops.db" (
+    mkdir "%OUT%\data"
+    copy /y "data\ops.db" "%OUT%\data\ops.db" >nul
+    echo 已包含演示数据库 data\ops.db
+  )
+)
+
 powershell -NoProfile -Command "Compress-Archive -LiteralPath '%OUT%' -DestinationPath '%ZIP%' -Force"
 if exist "%ZIP%" rmdir /s /q "%OUT%"
 
 echo 已生成分发包: %ZIP%
-echo 包内不含 config.json / session.json / manual-shops.json / data/
-echo (API Key、Cookie、报表数据只留在你本机)
-echo 对方解压后双击 启动.bat 即可,首次启动自动生成其本机配置。
+echo 默认不含 config.json / data / workspace(密钥与数据只留在本机)。
+echo 对方解压后双击 启动.bat;首次启动自动生成配置与空数据库。
+echo 要求 Node.js 22.13 及以上。
 pause

+ 52 - 18
打包分发.command

@@ -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 驱动);装过旧版可直接覆盖解压。"