OneBot: Leantime 改造版源码(BOM/Univer 表格/AI 接管/品牌替换等)

This commit is contained in:
wangruiguo
2026-09-03 18:49:20 +08:00
commit d647428529
3501 changed files with 1988906 additions and 0 deletions

View File

@@ -0,0 +1,56 @@
#!/bin/bash
set -e
APP_DIR=/var/www/onebot
SRC_TAR=/home/rui/onebot-src.tar.gz
echo "=== 1. 解压源码 ==="
sudo rm -rf "$APP_DIR"
sudo mkdir -p "$APP_DIR"
sudo tar -xzf "$SRC_TAR" -C "$APP_DIR" --strip-components=1
sudo chown -R "$USER":www-data "$APP_DIR"
echo "解压完成,目录内容:"
ls "$APP_DIR" | head -20
echo "=== 2. 初始化 MySQL 数据库 ==="
DB_NAME=onebot
DB_USER=onebot
DB_PASS='OneBot_Db_7xKpQ9z'
sudo mysql <<SQL
CREATE DATABASE IF NOT EXISTS ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';
GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'localhost';
FLUSH PRIVILEGES;
SQL
echo "数据库 ${DB_NAME} 创建完成,验证连接:"
mysql -u"$DB_USER" -p"$DB_PASS" -e "SELECT VERSION();" "$DB_NAME" 2>/dev/null && echo "DB_CONNECT_OK"
echo "=== 3. 创建 .env ==="
cat > "$APP_DIR/.env" <<ENV
APP_ENV=production
APP_DEBUG=false
APP_URL=http://119.29.53.45:8081
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=${DB_NAME}
DB_USERNAME=${DB_USER}
DB_PASSWORD=${DB_PASS}
LEAN_DB_HOST=127.0.0.1
LEAN_DB_USER=${DB_USER}
LEAN_DB_PASSWORD=${DB_PASS}
LEAN_DB_DATABASE=${DB_NAME}
LEAN_APP_URL=http://119.29.53.45:8081
LEAN_SITENAME='OneBot'
LEAN_LANGUAGE='zh-CN'
LEAN_SESSION_PASSWORD='OneBot_Session_4tHwLq8z'
ENV
echo ".env 写入完成:"
cat "$APP_DIR/.env"
echo "=== 全部完成 ==="

View File

@@ -0,0 +1,18 @@
#!/bin/bash
set -e
echo "=== 检查 mysql-server 包是否可用 ==="
apt-cache policy mysql-server 2>&1 | head -5
echo "=== 安装 mysql-server ==="
export DEBIAN_FRONTEND=noninteractive
apt-get install -y mysql-server 2>&1 | tail -30
echo "=== 检查安装结果 ==="
which mysql mysqld 2>&1 || echo "MYSQL_NOT_FOUND"
dpkg -l 2>/dev/null | grep -E 'mysql-server|mysql-common' | head
echo "=== 启动 mysql ==="
systemctl start mysql 2>&1 || true
sleep 3
systemctl is-active mysql 2>&1

View File

@@ -0,0 +1,21 @@
#!/bin/bash
set -e
DB_NAME=onebot
DB_USER=onebot
DB_PASS='OneBot_Db_7xKpQ9z'
echo "=== 创建数据库与用户 ==="
sudo mysql <<SQL
CREATE DATABASE IF NOT EXISTS ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';
ALTER USER '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';
GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'localhost';
FLUSH PRIVILEGES;
SQL
echo "=== 验证连接 ==="
mysql -u"$DB_USER" -p"$DB_PASS" -h127.0.0.1 -e "SELECT VERSION();" "$DB_NAME" && echo "DB_CONNECT_OK"
echo "=== 确认 .env 存在 ==="
ls -la /var/www/onebot/.env

View File

@@ -0,0 +1,48 @@
#!/bin/bash
set -e
APP_DIR=/var/www/onebot
DB_NAME=onebot
DB_USER=onebot
DB_PASS='OneBot_Db_7xKpQ9z'
echo "=== 写入 .env ==="
cat > "$APP_DIR/.env" <<ENV
APP_ENV=production
APP_DEBUG=false
APP_URL=http://119.29.53.45:8081
LEAN_APP_URL=http://119.29.53.45:8081
LEAN_APP_DIR=
LEAN_DEBUG=0
LEAN_DB_HOST=127.0.0.1
LEAN_DB_PORT=3306
LEAN_DB_USER=${DB_USER}
LEAN_DB_PASSWORD=${DB_PASS}
LEAN_DB_DATABASE=${DB_NAME}
LEAN_SESSION_PASSWORD='OneBot_Session_4tHwLq8z'
LEAN_SESSION_EXPIRATION=480
LEAN_SITENAME='OneBot'
LEAN_LANGUAGE='zh-CN'
LEAN_DEFAULT_TIMEZONE='Asia/Shanghai'
LEAN_LOGO_PATH='/dist/images/logo.svg'
LEAN_PRINT_LOGO_URL='/dist/images/logo.png'
LEAN_EMAIL_RETURN=''
LEAN_USE_S3=false
LEAN_USER_FILE_PATH='userfiles/'
LEAN_DB_BACKUP_PATH='backupdb/'
LEAN_USE_REDIS=false
LEAN_NEWS_ENABLED=false
ENV
echo "=== .env 内容 ==="
cat "$APP_DIR/.env"
echo "=== 权限 ==="
sudo chown -R rui:www-data "$APP_DIR"
sudo chmod -R 775 "$APP_DIR/storage" "$APP_DIR/bootstrap/cache" 2>/dev/null || true
echo "DONE"

View File

@@ -0,0 +1,14 @@
#!/bin/bash
set -e
APP_DIR=/var/www/onebot
LOG=/tmp/composer_install.log
echo "=== composer install 开始 ==="
cd "$APP_DIR"
sudo -u rui composer install --no-dev --no-interaction --optimize-autoloader > "$LOG" 2>&1
echo "COMPOSER_EXIT=$?"
echo "=== 日志尾部 ==="
tail -20 "$LOG"
echo "=== vendor 目录大小 ==="
du -sh "$APP_DIR/vendor" 2>/dev/null

View File

@@ -0,0 +1,13 @@
#!/bin/bash
set -e
APP_DIR=/var/www/onebot
LOG=/tmp/npm_install.log
export PATH="/home/rui/.nvm/versions/node/v24.12.0/bin:$PATH"
cd "$APP_DIR"
echo "npm install 开始 $(date)" > "$LOG"
node -v >> "$LOG" 2>&1
npm -v >> "$LOG" 2>&1
npm install --no-audit --no-fund >> "$LOG" 2>&1
echo "NPM_EXIT=$?" >> "$LOG"
echo "完成 $(date)" >> "$LOG"

View File

@@ -0,0 +1,8 @@
#!/bin/bash
set -e
cp /home/rui/onebot-nginx.conf /etc/nginx/sites-available/onebot
ln -sf /etc/nginx/sites-available/onebot /etc/nginx/sites-enabled/onebot
nginx -t
systemctl reload nginx
echo "NGINX_OK"

View File

@@ -0,0 +1,19 @@
#!/bin/bash
set -e
APP_DIR=/var/www/onebot
LOG=/tmp/npm_build.log
export PATH="/home/rui/.nvm/versions/node/v24.12.0/bin:$PATH"
cd "$APP_DIR"
echo "=== 前端构建开始 $(date) ===" > "$LOG"
node -v >> "$LOG" 2>&1
# laravel-mix 生产构建
npx mix --production >> "$LOG" 2>&1
echo "BUILD_EXIT=$?" >> "$LOG"
echo "=== 构建完成 $(date) ===" >> "$LOG"
echo "=== dist 目录 ==="
ls -la "$APP_DIR/public/dist/" 2>/dev/null | head -20
echo "=== dist/images logo ==="
ls -la "$APP_DIR/public/dist/images/" 2>/dev/null | grep -i logo || echo "NO_LOGO_IN_DIST"

View File

@@ -0,0 +1,19 @@
#!/bin/bash
set -e
APP_DIR=/var/www/onebot
echo "=== 重建 storage 目录结构 ==="
mkdir -p "$APP_DIR/storage/app"
mkdir -p "$APP_DIR/storage/framework/cache"
mkdir -p "$APP_DIR/storage/framework/sessions"
mkdir -p "$APP_DIR/storage/framework/views"
mkdir -p "$APP_DIR/storage/logs"
mkdir -p "$APP_DIR/storage/backupdb"
mkdir -p "$APP_DIR/userfiles"
chown -R rui:www-data "$APP_DIR/storage" "$APP_DIR/userfiles"
chmod -R 775 "$APP_DIR/storage" "$APP_DIR/userfiles"
echo "=== storage 目录 ==="
ls -la "$APP_DIR/storage/"
echo "DONE"

View File

@@ -0,0 +1,17 @@
#!/bin/bash
echo "=== HTTP 状态 ==="
curl -s -o /dev/null -w "HTTP=%{http_code}\n" http://127.0.0.1:8081/
echo "=== 页面标题 ==="
curl -s http://127.0.0.1:8081/ | grep -oE "<title>[^<]*</title>" | head -1
echo "=== 检查品牌关键词 ==="
BODY=$(curl -s http://127.0.0.1:8081/)
echo "$BODY" | grep -qi "onebot" && echo "含 OneBot" || echo "无 OneBot"
echo "$BODY" | grep -qi "leantime" && echo "含 Leantime" || echo "无 Leantime"
echo "=== 检查数据库表是否已建 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SHOW TABLES LIKE 'zp_bom%';" 2>/dev/null || echo "DB 查询失败"
echo "=== 检查 BOM 相关表 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SHOW TABLES;" 2>/dev/null | grep -iE "zp_bom|zp_" | head -30

View File

@@ -0,0 +1,12 @@
#!/bin/bash
echo "=== laravel.log 尾部 ==="
tail -50 /var/www/onebot/storage/logs/laravel.log 2>/dev/null || echo "无 laravel.log"
echo ""
echo "=== .env 是否有 APP_KEY ==="
grep -E "APP_KEY" /var/www/onebot/.env || echo "无 APP_KEY"
echo ""
echo "=== 用 artisan 直接看报错 ==="
cd /var/www/onebot
sudo -u www-data php artisan about 2>&1 | head -40

View File

@@ -0,0 +1,27 @@
#!/bin/bash
echo "=== /var/www/onebot 完整文件列表(根目录)==="
ls -la /var/www/onebot/
echo ""
echo "=== 是否有 artisan ==="
ls -la /var/www/onebot/artisan 2>&1
echo ""
echo "=== index.php 内容 ==="
cat /var/www/onebot/index.php
echo ""
echo "=== config 目录 ==="
ls -la /var/www/onebot/config/
echo ""
echo "=== config/app.php 里 APP_KEY 相关 ==="
grep -n "key\|APP_KEY\|cipher" /var/www/onebot/config/app.php 2>/dev/null | head -20 || echo "无 config/app.php"
echo ""
echo "=== .env 里是否有 APP_KEY ==="
grep -n "APP_KEY" /var/www/onebot/.env || echo "无 APP_KEY"
echo ""
echo "=== bin 目录 ==="
ls -la /var/www/onebot/bin/ 2>&1

View File

@@ -0,0 +1,22 @@
#!/bin/bash
set -e
APP_DIR=/var/www/onebot
# 打开 debug让 Laravel 直接渲染真实错误
sed -i 's/^APP_DEBUG=.*/APP_DEBUG=true/' "$APP_DIR/.env"
sed -i 's/^LEAN_DEBUG=.*/LEAN_DEBUG=1/' "$APP_DIR/.env"
grep -E "APP_DEBUG|LEAN_DEBUG" "$APP_DIR/.env"
# 清空旧日志,重新请求
rm -f "$APP_DIR/storage/logs/laravel.log"
echo "=== 直接 curl 看错误 ==="
curl -s http://127.0.0.1:8081/ | grep -oE "(Fatal error|Parse error|Exception|Error|message)[^<]*" | head -20
echo ""
echo "=== php-fpm 错误日志 ==="
tail -30 /var/log/php8.3-fpm.log 2>/dev/null || echo "无 php-fpm.log"
echo ""
echo "=== laravel.log ==="
tail -40 "$APP_DIR/storage/logs/laravel.log" 2>/dev/null || echo "仍无 laravel.log"

View File

@@ -0,0 +1,17 @@
#!/bin/bash
echo "=== nginx onebot.error.log ==="
tail -50 /var/log/nginx/onebot.error.log 2>/dev/null || echo "无 onebot.error.log"
echo ""
echo "=== nginx error.log (默认) ==="
tail -30 /var/log/nginx/error.log 2>/dev/null || echo "无默认 error.log"
echo ""
echo "=== 直接 CLI 方式执行 index.php 看真实错误 ==="
cd /var/www/onebot/public
sudo -u www-data php -d display_errors=1 -d error_reporting=E_ALL index.php 2>&1 | head -40
echo ""
echo "=== 用 php 直接 require 入口 ==="
cd /var/www/onebot
sudo -u www-data php -r '$_SERVER["REQUEST_URI"]="/"; $_SERVER["REQUEST_METHOD"]="GET"; $_SERVER["SCRIPT_NAME"]="/index.php"; $_SERVER["DOCUMENT_ROOT"]="/var/www/onebot/public"; require "/var/www/onebot/public/index.php";' 2>&1 | head -60

View File

@@ -0,0 +1,20 @@
#!/bin/bash
# 清空 Laravel 缓存,避免旧的语言缓存/配置缓存导致错误
cd /var/www/onebot
rm -rf storage/framework/cache/data/* 2>/dev/null
rm -rf storage/framework/views/* 2>/dev/null
rm -f bootstrap/cache/config.php bootstrap/cache/routes*.php 2>/dev/null
echo "=== HTTP 状态 ==="
curl -s -o /dev/null -w "HTTP=%{http_code}\n" http://127.0.0.1:8081/
echo "=== 页面标题 ==="
curl -s http://127.0.0.1:8081/ | grep -oE "<title>[^<]*</title>" | head -1
echo "=== 品牌关键词 ==="
BODY=$(curl -s http://127.0.0.1:8081/)
echo "$BODY" | grep -qi "onebot" && echo "含 OneBot" || echo "无 OneBot"
echo "$BODY" | grep -qi "leantime" && echo "含 Leantime" || echo "无 Leantime"
echo "=== 数据库表 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SHOW TABLES;" 2>/dev/null | grep -iE "zp_bom|zp_" | head -30

View File

@@ -0,0 +1,27 @@
#!/bin/bash
echo "=== 用 PHP 直接测试语言文件解析 ==="
for f in en-US zh-CN; do
echo "--- $f.ini ---"
sudo -u www-data php -r "
\$r = @parse_ini_file('/var/www/onebot/app/Language/$f.ini', false, INI_SCANNER_RAW);
if (\$r === false) {
echo \"PARSE_FAILED\n\";
} else {
echo \"PARSE_OK, keys=\".count(\$r).\"\n\";
}
" 2>&1
done
echo ""
echo "=== 完整错误(不抑制)==="
sudo -u www-data php -d display_errors=1 -d error_reporting=E_ALL -r "
parse_ini_file('/var/www/onebot/app/Language/en-US.ini', false, INI_SCANNER_RAW);
echo 'en-US OK\n';
parse_ini_file('/var/www/onebot/app/Language/zh-CN.ini', false, INI_SCANNER_RAW);
echo 'zh-CN OK\n';
" 2>&1
echo ""
echo "=== installation 缓存位置 ==="
ls -la /var/www/onebot/storage/framework/cache/ 2>/dev/null
find /var/www/onebot/storage/framework/cache -type f 2>/dev/null | head -20

View File

@@ -0,0 +1,24 @@
#!/bin/bash
cd /var/www/onebot
echo "=== 清空所有缓存 ==="
rm -rf storage/framework/cache/* 2>/dev/null
rm -rf storage/framework/views/* 2>/dev/null
rm -f bootstrap/cache/*.php 2>/dev/null
echo "缓存已清空"
echo ""
echo "=== 重新用 PHP 验证语言文件解析 ==="
sudo -u www-data php -r "
\$r = @parse_ini_file('/var/www/onebot/app/Language/en-US.ini', false, INI_SCANNER_RAW);
echo 'en-US: ' . (\$r === false ? 'FAIL' : 'OK('.count(\$r).')') . PHP_EOL;
\$r2 = @parse_ini_file('/var/www/onebot/app/Language/zh-CN.ini', false, INI_SCANNER_RAW);
echo 'zh-CN: ' . (\$r2 === false ? 'FAIL' : 'OK('.count(\$r2).')') . PHP_EOL;
" 2>&1
echo ""
echo "=== HTTP 状态 ==="
curl -s -o /dev/null -w "HTTP=%{http_code}\n" http://127.0.0.1:8081/
echo "=== 页面标题 ==="
curl -s http://127.0.0.1:8081/ | grep -oE "<title>[^<]*</title>" | head -1

View File

@@ -0,0 +1,9 @@
#!/bin/bash
cd /var/www/onebot
echo "=== 可用 CLI 命令 ==="
sudo -u www-data php /var/www/onebot/public/index.php list 2>&1 | head -50
echo ""
echo "=== /install 页面表单 ==="
curl -s http://127.0.0.1:8081/install 2>&1 | grep -oE "(name=\"[^\"]*\"|placeholder=\"[^\"]*\"|公司|Company|Email|First|Last|Password)" | head -40

View File

@@ -0,0 +1,9 @@
#!/bin/bash
cd /var/www/onebot
echo "=== 完整 CLI 命令列表 ==="
sudo -u www-data php /var/www/onebot/public/index.php list 2>&1 | grep -iE "install|db:|migrate|seed"
echo ""
echo "=== /install 表单完整字段(含 type=password==="
curl -s http://127.0.0.1:8081/install 2>&1 | grep -oE "<input[^>]*>" | grep -iE "password|name=" | head -40

View File

@@ -0,0 +1,16 @@
#!/bin/bash
cd /var/www/onebot
echo "=== 提交安装表单 ==="
RESP=$(curl -s -i -X POST http://127.0.0.1:8081/install \
-d "email=admin@onebot.local" \
-d "firstname=Admin" \
-d "lastname=OneBot" \
-d "company=OneBot" \
-d "install=Install")
echo "$RESP" | head -20
echo ""
echo "=== 检查数据库表是否已建 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SHOW TABLES;" 2>/dev/null | head -50

View File

@@ -0,0 +1,13 @@
#!/bin/bash
cd /var/www/onebot
echo "=== laravel.log 尾部 60 行 ==="
tail -60 storage/logs/laravel.log 2>/dev/null || echo "无 laravel.log"
echo ""
echo "=== 当前数据库表 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SHOW TABLES;" 2>/dev/null
echo ""
echo "=== 是否有 zp_user 表 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT COUNT(*) AS cnt FROM zp_user;" 2>/dev/null || echo "无 zp_user 表"

View File

@@ -0,0 +1,26 @@
#!/bin/bash
cd /var/www/onebot
echo "=== storage/logs 权限 ==="
ls -la storage/ storage/logs/ 2>&1
echo ""
echo "=== 检查日志配置 ==="
grep -rE "LOG_CHANNEL|LEAN_LOG|LOG_PATH" .env config/ app/Core/Configuration/ 2>/dev/null | head -20
echo ""
echo "=== 直接 CLI 调用 setupDB 捕获异常 ==="
sudo -u www-data php -d display_errors=1 -d error_reporting=E_ALL -r '
require "/var/www/onebot/vendor/autoload.php";
$app = require "/var/www/onebot/bootstrap/app.php";
\Leantime\Core\Bootloader::getInstance()->boot($app);
$repo = app()->make(\Leantime\Domain\Install\Repositories\Install::class);
try {
$result = $repo->setupDB(["email"=>"admin@onebot.local","firstname"=>"Admin","lastname"=>"OneBot","company"=>"OneBot"]);
echo "setupDB result: " . var_export($result, true) . PHP_EOL;
} catch (\Throwable $e) {
echo "EXCEPTION: " . $e->getMessage() . PHP_EOL;
echo "FILE: " . $e->getFile() . ":" . $e->getLine() . PHP_EOL;
echo $e->getTraceAsString() . PHP_EOL;
}
' 2>&1 | head -60

View File

@@ -0,0 +1,13 @@
#!/bin/bash
cd /var/www/onebot
echo "=== 日志文件列表 ==="
ls -la storage/logs/
echo ""
echo "=== leantime 日志尾部 80 行 ==="
tail -80 storage/logs/leantime-2026-08-31.log 2>/dev/null
echo ""
echo "=== 搜索 Error/Exception 关键词 ==="
grep -nE "Error|Exception|error|failed|SQLSTATE|Access denied" storage/logs/leantime-2026-08-31.log 2>/dev/null | tail -40

View File

@@ -0,0 +1,26 @@
#!/bin/bash
set -e
APP_DIR=/var/www/onebot
echo "=== 移动 .env 到 config/.env ==="
mv "$APP_DIR/.env" "$APP_DIR/config/.env" 2>/dev/null || cp "$APP_DIR/.env" "$APP_DIR/config/.env"
chown rui:www-data "$APP_DIR/config/.env"
chmod 664 "$APP_DIR/config/.env"
echo "=== 确认位置 ==="
ls -la "$APP_DIR/.env" 2>/dev/null && echo "根目录 .env 仍存在(需删除)" || echo "根目录 .env 已移除"
ls -la "$APP_DIR/config/.env" && echo "config/.env 已就位"
echo ""
echo "=== 清缓存 ==="
rm -rf "$APP_DIR/storage/framework/cache/"* 2>/dev/null
rm -f "$APP_DIR/bootstrap/cache/"*.php 2>/dev/null
echo "缓存已清"
echo ""
echo "=== 验证数据库连接配置 ==="
grep -E "LEAN_DB_|DB_" "$APP_DIR/config/.env"
echo ""
echo "=== HTTP 测试 ==="
curl -s -o /dev/null -w "HTTP=%{http_code}\n" http://127.0.0.1:8081/

View File

@@ -0,0 +1,12 @@
#!/bin/bash
echo "=== 总表数 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='onebot';" 2>/dev/null
echo "=== BOM 表 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SHOW TABLES LIKE 'zp_bom%';" 2>/dev/null
echo "=== zp_user ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT id, username, status, role FROM zp_user;" 2>/dev/null
echo "=== db-version ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT * FROM zp_settings WHERE \`key\`='db-version';" 2>/dev/null

View File

@@ -0,0 +1,11 @@
#!/bin/bash
cd /var/www/onebot
echo "=== 生成密码哈希并激活管理员 ==="
HASH=$(php -r "echo password_hash('OneBot@2026', PASSWORD_DEFAULT);")
echo "哈希: ${HASH:0:20}..."
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "UPDATE zp_user SET password='${HASH}', status='a', forcePwReset=0 WHERE id=1;" 2>/dev/null
echo "=== 验证用户状态 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT id, username, status, role FROM zp_user WHERE id=1;" 2>/dev/null

View File

@@ -0,0 +1,18 @@
#!/bin/bash
echo "=== 首页 HTTP 状态 ==="
curl -s -o /dev/null -w "HTTP=%{http_code}\n" http://127.0.0.1:8081/
echo "=== 首页标题与品牌 ==="
BODY=$(curl -s http://127.0.0.1:8081/)
echo "$BODY" | grep -oE "<title>[^<]*</title>" | head -1
echo "$BODY" | grep -qi "OneBot" && echo "✅ 含 OneBot 品牌" || echo "❌ 无 OneBot"
echo "$BODY" | grep -qi "leantime" && echo "⚠️ 仍含 leantime" || echo "✅ 无 leantime 残留"
echo "=== logo 文件可达 ==="
curl -s -o /dev/null -w "logo.svg HTTP=%{http_code} size=%{size_download}\n" http://127.0.0.1:8081/dist/images/logo.svg
echo "=== PDF 预览组件挂载 ==="
echo "$BODY" | grep -q "ob-pdf" && echo "✅ pdfPreview 组件已挂载" || echo "⚠️ 未在首页检测到 pdfPreview登录页可能不加载"
echo "=== 登录页面字段 ==="
echo "$BODY" | grep -oE "(name=\"(username|password|email)\")" | sort -u

View File

@@ -0,0 +1,33 @@
#!/bin/bash
cd /var/www/onebot
JAR=/tmp/onebot_cookies.txt
rm -f "$JAR"
echo "=== 登录页品牌 ==="
BODY=$(curl -s -c "$JAR" http://127.0.0.1:8081/auth/login)
echo "$BODY" | grep -oE "<title>[^<]*</title>" | head -1
echo "$BODY" | grep -qi "OneBot" && echo "✅ 登录页含 OneBot" || echo "⚠️ 登录页无 OneBot 文案(可能是标题/翻译)"
echo "$BODY" | grep -qi "leantime" && echo "⚠️ 登录页仍含 leantime" || echo "✅ 登录页无 leantime 残留"
echo ""
echo "=== 提取 CSRF token ==="
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
echo "CSRF: ${CSRF:0:20}..."
echo ""
echo "=== 尝试登录 ==="
LOGIN=$(curl -s -i -b "$JAR" -c "$JAR" -X POST http://127.0.0.1:8081/auth/login \
-d "username=admin@onebot.local" \
-d "password=OneBot@2026" \
-d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF" \
-H "X-Requested-With: XMLHttpRequest")
echo "$LOGIN" | head -10
echo ""
echo "=== 登录后访问首页 ==="
curl -s -b "$JAR" -o /dev/null -w "dashboard HTTP=%{http_code}\n" http://127.0.0.1:8081/dashboard/show
echo ""
echo "=== 访问 BOM 页面 ==="
curl -s -b "$JAR" -o /dev/null -w "bom/show HTTP=%{http_code}\n" http://127.0.0.1:8081/bom/show

View File

@@ -0,0 +1,34 @@
#!/bin/bash
cd /var/www/onebot
JAR=/tmp/onebot_cookies2.txt
rm -f "$JAR"
# 重新登录拿会话
BODY=$(curl -s -c "$JAR" http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b "$JAR" -c "$JAR" -X POST http://127.0.0.1:8081/auth/login \
-d "username=admin@onebot.local" -d "password=OneBot@2026" \
-d "_token=$CSRF" -H "X-CSRF-TOKEN: $CSRF" -o /dev/null
echo "=== BOM 页面内容检查 ==="
BOM=$(curl -s -b "$JAR" http://127.0.0.1:8081/bom/show)
echo "$BOM" | grep -oE "<title>[^<]*</title>" | head -1
echo "$BOM" | grep -qi "BOM" && echo "✅ 页面含 BOM 内容" || echo "❌ 无 BOM"
echo "$BOM" | grep -qi "新建 BOM" && echo "✅ 含新建 BOM 按钮" || echo "⚠️ 无新建 BOM语言可能是 en-US"
echo "$BOM" | grep -qi "New BOM" && echo "✅ 含 New BOM 按钮" || echo "⚠️ 无 New BOM"
echo ""
echo "=== 左侧菜单是否含 BOM 项 ==="
echo "$BOM" | grep -oE 'href="[^"]*bom[^"]*"' | head -5
echo "$BOM" | grep -qi "menu.bom\|BOM" && echo "✅ 菜单区含 BOM" || echo "⚠️ 菜单区未见 BOM 文案"
echo ""
echo "=== dashboard 品牌检查 ==="
DASH=$(curl -s -b "$JAR" http://127.0.0.1:8081/dashboard/show)
echo "$DASH" | grep -oE "<title>[^<]*</title>" | head -1
echo "$DASH" | grep -qi "OneBot" && echo "✅ dashboard 含 OneBot" || echo "⚠️ dashboard 无 OneBot 文案"
echo "$DASH" | grep -qi "leantime" && echo "⚠️ dashboard 仍含 leantime检查上下文" || echo "✅ dashboard 无 leantime"
echo ""
echo "=== 登录页 leantime 残留定位 ==="
curl -s http://127.0.0.1:8081/auth/login | grep -oiE ".{40}leantime.{40}" | head -5

View File

@@ -0,0 +1,17 @@
#!/bin/bash
cd /var/www/onebot
JAR=/tmp/onebot_cookies3.txt
rm -f "$JAR"
BODY=$(curl -s -c "$JAR" http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b "$JAR" -c "$JAR" -X POST http://127.0.0.1:8081/auth/login \
-d "username=admin@onebot.local" -d "password=OneBot@2026" \
-d "_token=$CSRF" -H "X-CSRF-TOKEN: $CSRF" -o /dev/null
echo "=== dashboard 页面 leantime 出现上下文 ==="
curl -s -b "$JAR" http://127.0.0.1:8081/dashboard/show | grep -oiE ".{30}leantime.{30}" | head -10
echo ""
echo "=== 可见文本(去标签)是否含 Leantime ==="
curl -s -b "$JAR" http://127.0.0.1:8081/dashboard/show | sed 's/<[^>]*>//g' | grep -i "leantime" | head -5 || echo "✅ 可见文本无 Leantime"

View File

@@ -0,0 +1,11 @@
#!/bin/bash
echo "=== 本机网卡 IP ==="
ip -4 addr show 2>/dev/null | grep -E "inet " | awk '{print $2, $NF}'
echo ""
echo "=== 192.168.1.44 是否可达(本机自测)==="
curl -s -o /dev/null -w "HTTP=%{http_code}\n" --connect-timeout 5 http://192.168.1.44:8081/ || echo "8081 从本机 192.168.1.44 访问失败"
echo ""
echo "=== nginx 监听 ==="
ss -tlnp 2>/dev/null | grep -E ":8081|:80"

View File

@@ -0,0 +1,17 @@
#!/bin/bash
set -e
APP_DIR=/var/www/onebot
echo "=== 修改站点 URL 为内网 IP ==="
sed -i 's|http://119.29.53.45:8081|http://192.168.1.44:8081|g' "$APP_DIR/config/.env"
grep -E "APP_URL|LEAN_APP_URL" "$APP_DIR/config/.env"
echo ""
echo "=== 清缓存 ==="
rm -rf "$APP_DIR/storage/framework/cache/"* 2>/dev/null
rm -f "$APP_DIR/bootstrap/cache/"*.php 2>/dev/null
echo "缓存已清"
echo ""
echo "=== 验证重定向地址 ==="
curl -s -i http://192.168.1.44:8081/ | grep -iE "^HTTP|^Location" | head -3

View File

@@ -0,0 +1,15 @@
#!/bin/bash
echo "=== ufw 状态 ==="
sudo ufw status 2>/dev/null || echo "ufw 未启用/未安装"
echo ""
echo "=== ufw 8081 放行 ==="
sudo ufw allow 8081/tcp 2>/dev/null && echo "已放行 8081" || true
echo ""
echo "=== 最终验证:内网 IP 访问 ==="
curl -s -o /dev/null -w "192.168.1.44:8081 HTTP=%{http_code}\n" --connect-timeout 5 http://192.168.1.44:8081/
echo ""
echo "=== 登录页品牌最终确认 ==="
curl -s http://192.168.1.44:8081/auth/login | grep -oE "<title>[^<]*</title>" | head -1

View File

@@ -0,0 +1,12 @@
#!/bin/bash
cd /var/www/onebot
echo "=== 生成新密码哈希 ==="
HASH=$(php -r "echo password_hash('wrg521113..', PASSWORD_DEFAULT);")
echo "哈希: ${HASH:0:20}..."
echo "=== 更新管理员账号 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "UPDATE zp_user SET username='ruiguo_wang@163.com', password='${HASH}', status='a', forcePwReset=0 WHERE id=1;" 2>/dev/null
echo "=== 验证 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT id, username, status, role FROM zp_user WHERE id=1;" 2>/dev/null

View File

@@ -0,0 +1,23 @@
#!/bin/bash
cd /var/www/onebot
JAR=/tmp/onebot_cookies_final.txt
rm -f "$JAR"
BODY=$(curl -s -c "$JAR" http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
echo "=== 用新账号登录 ==="
LOGIN=$(curl -s -i -b "$JAR" -c "$JAR" -X POST http://127.0.0.1:8081/auth/login \
-d "username=ruiguo_wang@163.com" \
-d "password=wrg521113.." \
-d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF")
echo "$LOGIN" | grep -iE "^HTTP|^Location" | head -3
echo ""
echo "=== 登录后 BOM 页面 ==="
curl -s -b "$JAR" -o /dev/null -w "bom/show HTTP=%{http_code}\n" http://127.0.0.1:8081/bom/show
echo ""
echo "=== dashboard 标题 ==="
curl -s -b "$JAR" http://127.0.0.1:8081/dashboard/show | grep -oE "<title>[^<]*</title>" | head -1

View File

@@ -0,0 +1,85 @@
#!/bin/bash
set -u
cd /var/www/onebot
echo "=== PHP 语法检查 ==="
for f in app/Domain/Bom/Services/Teable.php app/Domain/Bom/Services/Bom.php app/Domain/Bom/Controllers/Api.php app/Domain/Bom/routes.php; do
php -l "$f" 2>&1
done
echo ""
echo "=== 清缓存 + 重载 fpm ==="
rm -rf storage/framework/views/* storage/framework/cache/* bootstrap/cache/*.php 2>/dev/null
echo "wrg521113.." | sudo -S systemctl reload php8.3-fpm >/dev/null 2>&1
echo "done"
echo ""
echo "=== 登录 ==="
JAR=/tmp/onebot_paste_cookies.txt
rm -f "$JAR"
BODY=$(curl -s -c "$JAR" http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b "$JAR" -c "$JAR" -X POST http://127.0.0.1:8081/auth/login \
-d "username=ruiguo_wang@163.com" \
-d "password=wrg521113.." \
-d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF" -o /dev/null -w "login HTTP=%{http_code}\n"
echo ""
echo "=== 粘贴解析接口测试 ==="
cat > /tmp/paste_sample.txt <<'PASTEEOF'
# Table: UAGP350B
## API Operations
### 1. Read Records (GET)
curl -X GET "https://table.universal-onebot.com/api/table/tblGHwQc8eAGFZcZ71A/record?fieldKeyType=name" \
-H "Authorization: Bearer teable_accaWtlglDjnwkieJXE_KaafZue9411p5G+QmP0r4zRsC6GDpUTuRDVfh2f8eco="
PASTEEOF
php -r '$t=file_get_contents("/tmp/paste_sample.txt"); echo json_encode(["text"=>$t], JSON_UNESCAPED_SLASHES);' > /tmp/paste_payload.json
curl -s -b "$JAR" -X POST http://127.0.0.1:8081/bom/api/teable/parse \
-H "Content-Type: application/json" \
-H "X-CSRF-TOKEN: $CSRF" \
--data-binary @/tmp/paste_payload.json
echo ""
echo ""
echo "=== Teable API 连通性(远程拉 1 条记录) ==="
curl -s -m 20 "https://table.universal-onebot.com/api/table/tblGHwQc8eAGFZcZ71A/record?fieldKeyType=name&take=1" \
-H "Authorization: Bearer teable_accaWtlglDjnwkieJXE_KaafZue9411p5G+QmP0r4zRsC6GDpUTuRDVfh2f8eco=" | head -c 400
echo ""
echo ""
echo "=== 端到端:新建测试 BOM -> 粘贴导入 -> 验证 -> 删除 ==="
PROJECT_ID=$(mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -N -e "SELECT id FROM zp_projects LIMIT 1;" 2>/dev/null)
echo "projectId=$PROJECT_ID"
CREATE_RESP=$(curl -s -b "$JAR" -X POST http://127.0.0.1:8081/bom/api \
-H "Content-Type: application/json" \
-H "X-CSRF-TOKEN: $CSRF" \
-d "{\"bomNo\":\"TEST-PASTE-1\",\"productName\":\"UAGP350B paste test\",\"projectId\":$PROJECT_ID}")
echo "create: $CREATE_RESP"
BOM_ID=$(echo "$CREATE_RESP" | grep -oE '"id":[0-9]+' | head -1 | sed 's/"id"://')
echo "bomId=$BOM_ID"
if [ -n "$BOM_ID" ] && [ "$BOM_ID" -gt 0 ] 2>/dev/null; then
echo ""
echo "--- 粘贴导入(真实拉取 Teable 数据) ---"
curl -s -b "$JAR" -X POST "http://127.0.0.1:8081/bom/api/$BOM_ID/import/teable-paste" \
-H "Content-Type: application/json" \
-H "X-CSRF-TOKEN: $CSRF" \
--data-binary @/tmp/paste_payload.json
echo ""
echo "--- 验证行数 ---"
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -N -e "SELECT COUNT(*) FROM zp_bom_item WHERE bomId=$BOM_ID;" 2>/dev/null
echo "--- 清理测试 BOM ---"
curl -s -b "$JAR" -X DELETE "http://127.0.0.1:8081/bom/api/$BOM_ID" \
-H "X-CSRF-TOKEN: $CSRF" -w "delete HTTP=%{http_code}\n"
fi
echo ""
echo "=== 全部完成 ==="

View File

@@ -0,0 +1,33 @@
#!/bin/bash
set -u
cd /var/www/onebot
echo "=== 1. BOM 列表 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT id, bomNo, productName, projectId FROM zp_bom ORDER BY id DESC LIMIT 5;" 2>/dev/null
echo ""
echo "=== 2. 每个 BOM 的行数 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT bomId, COUNT(*) cnt FROM zp_bom_item GROUP BY bomId;" 2>/dev/null
echo ""
echo "=== 3. 动态列 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT id, bomId, colKey, label FROM zp_bom_column ORDER BY bomId, sortOrder LIMIT 40;" 2>/dev/null
echo ""
echo "=== 4. 最新 BOM 的一行明细extra 原始 JSON ==="
LATEST=$(mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -N -e "SELECT MAX(bomId) FROM zp_bom_item;" 2>/dev/null)
echo "latest bomId with items = $LATEST"
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT id, seq, partNo, partName, extra FROM zp_bom_item WHERE bomId=$LATEST LIMIT 2\G" 2>/dev/null | head -60
echo ""
echo "=== 5. Teable field 接口原始返回(前 3 个字段对象) ==="
curl -s -m 20 "https://table.universal-onebot.com/api/table/tblGHwQc8eAGFZcZ71A/field" \
-H "Authorization: Bearer teable_accaWtlglDjnwkieJXE_KaafZue9411p5G+QmP0r4zRsC6GDpUTuRDVfh2f8eco=" \
| php -r '$d=json_decode(stream_get_contents(STDIN),true); echo json_encode(array_slice($d,0,3), JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);'
echo ""
echo "=== 6. Teable 记录原始返回(第 1 条) ==="
curl -s -m 20 "https://table.universal-onebot.com/api/table/tblGHwQc8eAGFZcZ71A/record?fieldKeyType=name&take=1" \
-H "Authorization: Bearer teable_accaWtlglDjnwkieJXE_KaafZue9411p5G+QmP0r4zRsC6GDpUTuRDVfh2f8eco=" \
| head -c 1200
echo ""

View File

@@ -0,0 +1,39 @@
#!/bin/bash
set -u
cd /var/www/onebot
echo "=== 1. zp_bom_column 全部行(正确列名) ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT id, bomId, \`key\`, label, sortOrder FROM zp_bom_column ORDER BY bomId, sortOrder;" 2>&1 | grep -v "Warning"
echo ""
echo "=== 2. zp_bom_source 全部行 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT id, bomId, name, tableId FROM zp_bom_source;" 2>&1 | grep -v "Warning"
echo ""
echo "=== 3. 远程文件 md5 ==="
md5sum app/Domain/Bom/Services/Bom.php app/Domain/Bom/Services/Teable.php app/Domain/Bom/Templates/detail.blade.php
echo ""
echo "=== 4. 远程 Bom.php importSource 字段循环395-425 行) ==="
sed -n '395,425p' app/Domain/Bom/Services/Bom.php
echo ""
echo "=== 5. BOM 3 详情页渲染检查 ==="
JAR=/tmp/ob38.txt
rm -f $JAR
BODY=$(curl -s -c $JAR http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b $JAR -c $JAR -X POST http://127.0.0.1:8081/auth/login \
-d "username=ruiguo_wang@163.com" -d "password=wrg521113.." -d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF" -o /dev/null
curl -s -b $JAR "http://127.0.0.1:8081/bom/show/3" -o /tmp/ob38_detail.html -w "detail HTTP=%{http_code}\n"
echo "--- 页面 th 数量及 data-key ---"
grep -oE '<th data-key="[^"]*"' /tmp/ob38_detail.html | sed 's/<th data-key="//;s/"//' | tr '\n' ' '
echo ""
echo "--- 页面里的动态列标签th 里的中文) ---"
grep -oE '<th[^>]*>[^<]*' /tmp/ob38_detail.html | head -40
echo ""
echo "=== 6. BOM 3 明细接口 JSON 前 300 字符 ==="
curl -s -b $JAR "http://127.0.0.1:8081/bom/api/3" | head -c 300
echo ""

View File

@@ -0,0 +1,40 @@
#!/bin/bash
cd /var/www/onebot
echo "=== BOM1 前2行 extra ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT id, seq, partNo, LEFT(extra,200) e FROM zp_bom_item WHERE bomId=1 ORDER BY id LIMIT 2\G" 2>/dev/null
echo ""
echo "=== zp_bom_item 表结构 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SHOW CREATE TABLE zp_bom_item\G" 2>/dev/null | grep -E "CREATE|\`seq\`|\`partNo\`|\`extra\`"
echo ""
echo "=== 登录并拉取两个 BOM 的详情页 ==="
JAR=/tmp/ob38b.txt
rm -f $JAR
BODY=$(curl -s -c $JAR http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b $JAR -c $JAR -X POST http://127.0.0.1:8081/auth/login \
-d "username=ruiguo_wang@163.com" -d "password=wrg521113.." -d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF" -o /dev/null
curl -s -b $JAR http://127.0.0.1:8081/bom/show/1 -o /tmp/ob38b_1.html
curl -s -b $JAR http://127.0.0.1:8081/bom/show/3 -o /tmp/ob38b_3.html
cat > /tmp/check_row.php <<'PHPEOF'
<?php
foreach ([1, 3] as $bid) {
$h = file_get_contents("/tmp/ob38b_$bid.html");
echo "=== BOM $bid 页面渲染的第一行非空单元格 ===\n";
if (! preg_match('/<tbody>(.*?)<\/tbody>/s', $h, $m)) { echo "no tbody\n"; continue; }
if (! preg_match_all('/<tr data-item-id="(\d+)"(.*?)<\/tr>/s', $m[1], $rows)) { echo "no rows\n"; continue; }
$n = 0;
foreach ($rows[2] as $i => $body) {
preg_match_all('/data-key="([^"]*)"[^>]*value="([^"]*)"/', $body, $mm, PREG_SET_ORDER);
$filled = [];
foreach ($mm as $x) { if ($x[2] !== '') { $filled[] = $x[1].'='.mb_substr($x[2], 0, 24); } }
echo "row ".$rows[1][$i].": ".implode(' | ', $filled)."\n";
if (++$n >= 2) break;
}
}
PHPEOF
php /tmp/check_row.php

View File

@@ -0,0 +1,37 @@
#!/bin/bash
set -u
cd /var/www/onebot
echo "=== 1. PHP 语法检查 ==="
for f in \
app/Domain/Bom/Services/Teable.php \
app/Domain/Bom/Services/Bom.php \
app/Domain/Bom/Services/Excel.php \
app/Domain/Bom/Controllers/Api.php \
app/Domain/Bom/routes.php \
app/Domain/Bom/Repositories/Bom.php \
app/Domain/Install/Repositories/Install.php \
app/Domain/Install/Services/SchemaBuilder.php \
app/Core/Configuration/AppSettings.php ; do
php -l "$f" 2>&1 | grep -v "No syntax errors" || true
done
echo "语法检查完成"
echo ""
echo "=== 2. 清缓存 ==="
rm -rf storage/framework/views/* storage/framework/cache/* bootstrap/cache/*.php 2>/dev/null
echo "done"
echo ""
echo "=== 3. 执行数据库迁移updateDB ==="
php public/index.php db:update 2>&1 | tail -30 || echo "db:update 命令可能不存在,尝试其他方式"
echo ""
echo "=== 4. 检查 db-version 和 hiddenColumns 列 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT \`key\`,\`value\` FROM zp_settings WHERE \`key\`='db-version';" 2>/dev/null
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SHOW COLUMNS FROM zp_bom LIKE 'hiddenColumns';" 2>/dev/null
echo ""
echo "=== 5. 重载 fpm ==="
echo "wrg521113.." | sudo -S systemctl reload php8.3-fpm >/dev/null 2>&1
echo "done"

View File

@@ -0,0 +1,57 @@
#!/bin/bash
set -u
cd /var/www/onebot
JAR=/tmp/ob40.txt
rm -f $JAR
echo "=== 登录 ==="
BODY=$(curl -s -c $JAR http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b $JAR -c $JAR -X POST http://127.0.0.1:8081/auth/login \
-d "username=ruiguo_wang@163.com" -d "password=wrg521113.." -d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF" -o /dev/null -w "login HTTP=%{http_code}\n"
echo ""
echo "=== 详情页 HTTP 状态 ==="
curl -s -b $JAR -o /tmp/ob40_detail.html -w "bom/show/3 HTTP=%{http_code}\n" http://127.0.0.1:8081/bom/show/3
echo ""
echo "=== 页面关键元素检查 ==="
echo -n "横向滚动容器: "; grep -c 'overflow-x:auto' /tmp/ob40_detail.html
echo -n "列设置按钮: "; grep -c 'btnColumnSettings' /tmp/ob40_detail.html
echo -n "Teable下拉: "; grep -c 'btnTeablePaste' /tmp/ob40_detail.html
echo -n "Excel模板导出: "; grep -c 'btnExcelTemplate' /tmp/ob40_detail.html
echo -n "Excel导出xlsx: "; grep -c 'btnExcelExport' /tmp/ob40_detail.html
echo -n "粘贴手动补齐输入框(pasteBaseUrl): "; grep -c 'pasteBaseUrl' /tmp/ob40_detail.html
echo -n "缩略图列显示友好(非JSON, 看是否有image.png): "; grep -c 'image.png' /tmp/ob40_detail.html
echo ""
echo "=== 列显隐 API 测试(隐藏 seq + 项目) ==="
curl -s -b $JAR -X POST http://127.0.0.1:8081/bom/api/3/column-visibility \
-H "Content-Type: application/json" \
-H "X-CSRF-TOKEN: $CSRF" \
-d '{"keys":["seq","项目"]}' -w "\nvisibility HTTP=%{http_code}\n"
echo ""
echo "=== 验证隐藏列已持久化 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT hiddenColumns FROM zp_bom WHERE id=3;" 2>/dev/null
echo ""
echo "=== 导出 xlsx ==="
curl -s -b $JAR -o /tmp/ob40_export.xlsx -w "export xlsx HTTP=%{http_code} size=%{size_download}\n" "http://127.0.0.1:8081/bom/api/3/export?format=xlsx"
echo -n "xlsx 文件头(应为 PK): "; head -c 2 /tmp/ob40_export.xlsx; echo ""
echo ""
echo "=== 导出模板 ==="
curl -s -b $JAR -o /tmp/ob40_tpl.xlsx -w "export-template HTTP=%{http_code} size=%{size_download}\n" "http://127.0.0.1:8081/bom/api/3/export-template"
echo ""
echo "=== 恢复列显隐(清空) ==="
curl -s -b $JAR -X POST http://127.0.0.1:8081/bom/api/3/column-visibility \
-H "Content-Type: application/json" \
-H "X-CSRF-TOKEN: $CSRF" \
-d '{"keys":[]}' -w "reset HTTP=%{http_code}\n"
echo ""
echo "=== 全部完成 ==="

View File

@@ -0,0 +1,26 @@
#!/bin/bash
cd /var/www/onebot
echo "=== 1. 取一个附件字段原始值 ==="
curl -s -m 20 "https://table.universal-onebot.com/api/table/tblGHwQc8eAGFZcZ71A/record?fieldKeyType=name&take=1" \
-H "Authorization: Bearer teable_accaWtlglDjnwkieJXE_KaafZue9411p5G+QmP0r4zRsC6GDpUTuRDVfh2f8eco=" \
| php -r '$d=json_decode(stream_get_contents(STDIN),true); $f=$d["records"][0]["fields"]["缩略图"][0] ?? []; echo json_encode($f, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);'
echo ""
echo "=== 2. 提取 smThumbnailUrl 并测试直连(不带 Bearer ==="
URL=$(curl -s -m 20 "https://table.universal-onebot.com/api/table/tblGHwQc8eAGFZcZ71A/record?fieldKeyType=name&take=1" \
-H "Authorization: Bearer teable_accaWtlglDjnwkieJXE_KaafZue9411p5G+QmP0r4zRsC6GDpUTuRDVfh2f8eco=" \
| php -r '$d=json_decode(stream_get_contents(STDIN),true); $f=$d["records"][0]["fields"]["缩略图"][0] ?? []; echo $f["smThumbnailUrl"] ?? "";')
echo "smThumbnailUrl=$URL"
if [ -n "$URL" ]; then
FULL="https://table.universal-onebot.com$URL"
echo "--- 直连(无 Bearer---"
curl -s -m 15 -o /dev/null -w "HTTP=%{http_code} type=%{content_type} size=%{size_download}\n" "$FULL"
echo "--- 带 Bearer ---"
curl -s -m 15 -o /dev/null -w "HTTP=%{http_code} type=%{content_type} size=%{size_download}\n" -H "Authorization: Bearer teable_accaWtlglDjnwkieJXE_KaafZue9411p5G+QmP0r4zRsC6GDpUTuRDVfh2f8eco=" "$FULL"
fi
echo ""
echo "=== 3. CDN 可达性测试Handsontable ==="
curl -s -m 10 -o /dev/null -w "jsdelivr HTTP=%{http_code}\n" "https://cdn.jsdelivr.net/npm/handsontable/dist/handsontable.full.min.js" 2>&1 || echo "jsdelivr 不可达"
curl -s -m 10 -o /dev/null -w "unpkg HTTP=%{http_code}\n" "https://unpkg.com/handsontable/dist/handsontable.full.min.js" 2>&1 || echo "unpkg 不可达"

View File

@@ -0,0 +1,20 @@
#!/bin/bash
set -u
cd /var/www/onebot
DIR=public/dist/handsontable
mkdir -p "$DIR"
BASE="https://cdn.jsdelivr.net/npm/handsontable@14.6.2/dist"
echo "=== 下载 Handsontable 14.6.2 ==="
curl -s -m 60 -o "$DIR/handsontable.full.min.js" "$BASE/handsontable.full.min.js" && echo "js ok $(wc -c < "$DIR/handsontable.full.min.js") bytes"
curl -s -m 60 -o "$DIR/handsontable.full.min.css" "$BASE/handsontable.full.min.css" && echo "css ok $(wc -c < "$DIR/handsontable.full.min.css") bytes"
echo ""
echo "=== 校验js 应有 Handsontable 关键字css 应有 .handsontable ==="
head -c 60 "$DIR/handsontable.full.min.js"; echo ""
grep -c "handsontable" "$DIR/handsontable.full.min.css" 2>/dev/null || echo "css 校验失败"
echo ""
echo "=== 通过 web 验证可访问 ==="
curl -s -o /dev/null -w "js HTTP=%{http_code}\n" "http://127.0.0.1:8081/dist/handsontable/handsontable.full.min.js"
curl -s -o /dev/null -w "css HTTP=%{http_code}\n" "http://127.0.0.1:8081/dist/handsontable/handsontable.full.min.css"

View File

@@ -0,0 +1,49 @@
#!/bin/bash
set -u
cd /var/www/onebot
JAR=/tmp/ob43.txt
rm -f $JAR
echo "=== 登录 ==="
BODY=$(curl -s -c $JAR http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b $JAR -c $JAR -X POST http://127.0.0.1:8081/auth/login \
-d "username=ruiguo_wang@163.com" -d "password=wrg521113.." -d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF" -o /dev/null -w "login HTTP=%{http_code}\n"
echo ""
echo "=== 详情页渲染 ==="
curl -s -b $JAR -o /tmp/ob43.html -w "bom/show/3 HTTP=%{http_code}\n" http://127.0.0.1:8081/bom/show/3
echo ""
echo "=== 关键元素检查 ==="
echo -n "Handsontable js 引入: "; grep -c 'handsontable.full.min.js' /tmp/ob43.html
echo -n "Handsontable css 引入: "; grep -c 'handsontable.full.min.css' /tmp/ob43.html
echo -n "bomHot 容器: "; grep -c 'id="bomHot"' /tmp/ob43.html
echo -n "imageRenderer: "; grep -c 'imageRenderer' /tmp/ob43.html
echo -n "fileRenderer: "; grep -c 'fileRenderer' /tmp/ob43.html
echo -n "new Handsontable: "; grep -c 'new Handsontable' /tmp/ob43.html
echo -n "附件 URL (attachments/read): "; grep -c 'attachments/read' /tmp/ob43.html
echo -n "图片缩略图 img 标签: "; grep -c '<img' /tmp/ob43.html
echo ""
echo "=== 明细 API 返回的附件字段(应为 JSON 数组含 url ==="
curl -s -b $JAR "http://127.0.0.1:8081/bom/api/3" | php -r '
$d=json_decode(stream_get_contents(STDIN),true);
$cols=$d["data"]["columns"] ?? [];
$img=$d["data"]["imageColumns"] ?? [];
$file=$d["data"]["fileColumns"] ?? [];
echo "imageColumns: ".json_encode($img,JSON_UNESCAPED_UNICODE)."\n";
echo "fileColumns: ".json_encode($file,JSON_UNESCAPED_UNICODE)."\n";
$it=$d["data"]["items"][0] ?? [];
foreach($img as $k){ echo "首行 $k = ".substr((string)($it[$k]??""),0,120)."\n"; }
'
echo ""
echo "=== Handsontable 静态资源可访问 ==="
curl -s -o /dev/null -w "js HTTP=%{http_code}\n" http://127.0.0.1:8081/dist/handsontable/handsontable.full.min.js
curl -s -o /dev/null -w "css HTTP=%{http_code}\n" http://127.0.0.1:8081/dist/handsontable/handsontable.full.min.css
echo ""
echo "=== 完成 ==="

View File

@@ -0,0 +1,22 @@
#!/bin/bash
set -u
cd /var/www/onebot
JAR=/tmp/ob44.txt
rm -f $JAR
BODY=$(curl -s -c $JAR http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b $JAR -c $JAR -X POST http://127.0.0.1:8081/auth/login \
-d "username=ruiguo_wang@163.com" -d "password=wrg521113.." -d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF" -o /dev/null
curl -s -b $JAR -o /tmp/ob44.html -w "detail HTTP=%{http_code}\n" http://127.0.0.1:8081/bom/show/3
echo "=== 关键改动检查 ==="
echo -n "filters 筛选插件: "; grep -c 'filters: true' /tmp/ob44.html
echo -n "dropdownMenu 列头下拉: "; grep -c 'dropdownMenu: true' /tmp/ob44.html
echo -n "search 搜索插件: "; grep -c 'search: true' /tmp/ob44.html
echo -n "stretchH 铺满: "; grep -c "stretchH: 'all'" /tmp/ob44.html
echo -n "calcHeight 动态高度: "; grep -c 'function calcHeight' /tmp/ob44.html
echo -n "window resize 重算: "; grep -c "'resize'" /tmp/ob44.html
echo -n "数据源管理按钮: "; grep -c 'btnSourceManager' /tmp/ob44.html
echo -n "数据源管理弹窗: "; grep -c 'sourceManagerModal' /tmp/ob44.html
echo -n "顶部源配置面板已移除(应为0): "; grep -c 'Teable 数据源</div>' /tmp/ob44.html

View File

@@ -0,0 +1,59 @@
#!/bin/bash
set -u
cd /var/www/onebot
JAR=/tmp/ob45.txt
rm -f $JAR
BODY=$(curl -s -c $JAR http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b $JAR -c $JAR -X POST http://127.0.0.1:8081/auth/login \
-d "username=ruiguo_wang@163.com" -d "password=wrg521113.." -d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF" -o /dev/null -w "login HTTP=%{http_code}\n"
MASTER_ID=$(mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -N -e "SELECT id FROM zp_bom WHERE bomNo='1' ORDER BY id DESC LIMIT 1;" 2>/dev/null)
echo "masterId=$MASTER_ID"
echo ""
echo "=== 1. 项目关联主数据 ==="
LINK=$(curl -s -b $JAR -X POST http://127.0.0.1:8081/bom/api/ref/link \
-H "Content-Type: application/json" -H "X-CSRF-TOKEN: $CSRF" \
-d "{\"projectId\":1,\"masterId\":$MASTER_ID}")
echo "$LINK"
REF_ID=$(echo "$LINK" | grep -oE '"refId":[0-9]+' | head -1 | sed 's/"refId"://')
echo "refId=$REF_ID"
echo ""
echo "=== 2. 项目级追加列(采购数量) ==="
COL=$(curl -s -b $JAR -X POST "http://127.0.0.1:8081/bom/api/ref/$REF_ID/column" \
-H "Content-Type: application/json" -H "X-CSRF-TOKEN: $CSRF" \
-d '{"key":"采购数量","label":"采购数量"}')
echo "$COL"
COL_ID=$(echo "$COL" | grep -oE '"columnId":[0-9]+' | head -1 | sed 's/"columnId"://')
echo "columnId=$COL_ID"
echo ""
echo "=== 3. 项目级存值itemId 用第一条明细) ==="
ITEM_ID=$(mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -N -e "SELECT id FROM zp_bom_item WHERE bomId=$MASTER_ID ORDER BY id LIMIT 1;" 2>/dev/null)
echo "itemId=$ITEM_ID"
curl -s -b $JAR -X POST "http://127.0.0.1:8081/bom/api/ref/$REF_ID/value" \
-H "Content-Type: application/json" -H "X-CSRF-TOKEN: $CSRF" \
-d "{\"columnId\":$COL_ID,\"itemId\":$ITEM_ID,\"value\":\"999\"}" -w " save HTTP=%{http_code}\n"
echo ""
echo "=== 4. 验证:项目级值已写入引用层 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT * FROM zp_master_ref_value WHERE refId=$REF_ID;" 2>/dev/null
echo ""
echo "=== 5. 验证全局主数据行未被修改extra 不含采购数量) ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT id, extra LIKE '%采购数量%' AS has_col FROM zp_bom_item WHERE id=$ITEM_ID;" 2>/dev/null
echo ""
echo "=== 6. 引用详情接口 ==="
curl -s -b $JAR "http://127.0.0.1:8081/bom/api/ref/$REF_ID" | head -c 400
echo ""
echo ""
echo "=== 7. 清理测试数据 ==="
curl -s -b $JAR -X DELETE "http://127.0.0.1:8081/bom/api/ref/$REF_ID" \
-H "X-CSRF-TOKEN: $CSRF" -w "unlink HTTP=%{http_code}\n"
echo ""
echo "=== 完成 ==="

View File

@@ -0,0 +1,41 @@
#!/bin/bash
set -u
cd /var/www/onebot
JAR=/tmp/ob48.txt
rm -f $JAR
BODY=$(curl -s -c $JAR http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b $JAR -c $JAR -X POST http://127.0.0.1:8081/auth/login \
-d "username=ruiguo_wang@163.com" -d "password=wrg521113.." -d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF" -o /dev/null -w "login HTTP=%{http_code}\n"
echo ""
echo "=== 1. 引用列表页 /bom/refs ==="
curl -s -b $JAR -o /tmp/ob48_refs.html -w "refs HTTP=%{http_code}\n" http://127.0.0.1:8081/bom/refs
grep -oE "项目引用的主数据|尚未关联" /tmp/ob48_refs.html | head -1
echo ""
echo "=== 2. 先关联一个主数据 ==="
MASTER_ID=$(mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -N -e "SELECT id FROM zp_bom WHERE bomNo='1' ORDER BY id DESC LIMIT 1;" 2>/dev/null)
echo "masterId=$MASTER_ID"
LINK=$(curl -s -b $JAR -X POST http://127.0.0.1:8081/bom/api/ref/link \
-H "Content-Type: application/json" -H "X-CSRF-TOKEN: $CSRF" \
-d "{\"projectId\":1,\"masterId\":$MASTER_ID}")
echo "$LINK"
REF_ID=$(echo "$LINK" | grep -oE '"refId":[0-9]+' | head -1 | sed 's/"refId"://')
echo "refId=$REF_ID"
echo ""
echo "=== 3. 引用详情页 /bom/refs/$REF_ID ==="
curl -s -b $JAR -o /tmp/ob48_refdetail.html -w "refDetail HTTP=%{http_code}\n" "http://127.0.0.1:8081/bom/refs/$REF_ID"
echo -n "标题含'引用视图': "; grep -c "引用视图" /tmp/ob48_refdetail.html
echo -n "增加项目列按钮: "; grep -c "btnAddRefColumn" /tmp/ob48_refdetail.html
echo -n "refVal 输入框: "; grep -c "refVal" /tmp/ob48_refdetail.html
echo ""
echo "=== 4. 清理测试引用 ==="
curl -s -b $JAR -X DELETE "http://127.0.0.1:8081/bom/api/ref/$REF_ID" \
-H "X-CSRF-TOKEN: $CSRF" -w "unlink HTTP=%{http_code}\n"
echo ""
echo "=== 完成 ==="

View File

@@ -0,0 +1,32 @@
#!/bin/bash
set -u
cd /var/www/onebot
JAR=/tmp/ob51.txt
rm -f $JAR
BODY=$(curl -s -c $JAR http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b $JAR -c $JAR -X POST http://127.0.0.1:8081/auth/login \
-d "username=ruiguo_wang@163.com" -d "password=wrg521113.." -d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF" -o /dev/null -w "login HTTP=%{http_code}\n"
echo ""
echo "=== 1. 主数据列表(全局,与项目无关) ==="
curl -s -b $JAR "http://127.0.0.1:8081/bom/show?type=bom" -o /tmp/ob51_bom.html -w "bom list HTTP=%{http_code}\n"
echo -n "列表含 PRUAGP215: "; grep -c "PRUAGP215" /tmp/ob51_bom.html
echo -n "列表含 PR215: "; grep -c "PR215" /tmp/ob51_bom.html
echo ""
echo "=== 2. 主数据详情(全局 projectId=0鉴权用全局角色 ==="
curl -s -b $JAR "http://127.0.0.1:8081/bom/api/1" -o /tmp/ob51_detail.json -w "detail HTTP=%{http_code}\n"
echo -n "详情返回 projectId=0: "; grep -oE '"projectId":0' /tmp/ob51_detail.json | head -1
echo ""
echo "=== 3. 数据室菜单含主数据 + 图标 ==="
curl -s -b $JAR "http://127.0.0.1:8081/dashboard/show" -o /tmp/ob51_dash.html
echo -n "菜单含 BOM 图标 fa-list-check: "; grep -c "fa-list-check" /tmp/ob51_dash.html
echo -n "菜单含工艺文件: "; grep -c "工艺文件" /tmp/ob51_dash.html
echo -n "菜单含工具清单: "; grep -c "工具清单" /tmp/ob51_dash.html
echo -n "make分组不再含BOM(应为0): "; grep -c 'id="submenu-materialize"' /tmp/ob51_dash.html
echo ""
echo "=== 完成 ==="

View File

@@ -0,0 +1,33 @@
#!/bin/bash
cd /var/www/onebot
JAR=/tmp/ob64.txt
rm -f $JAR
BODY=$(curl -s -c $JAR http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b $JAR -c $JAR -X POST http://127.0.0.1:8081/auth/login \
-d "username=ruiguo_wang@163.com" -d "password=wrg521113.." -d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF" -o /dev/null
curl -s -b $JAR "http://127.0.0.1:8081/bom/show/1" -o /tmp/ob64.html
php -r '
$h = file_get_contents("/tmp/ob64.html");
if (preg_match("/var RAW_ITEMS = (\[.*?\]);/s", $h, $m)) {
$items = json_decode($m[1], true);
echo "RAW_ITEMS 元素数: " . (is_array($items) ? count($items) : "解析失败") . "\n";
if (is_array($items) && isset($items[0])) {
echo "第1行完整: " . json_encode($items[0], JSON_UNESCAPED_UNICODE) . "\n";
echo "第1行字段数: " . count($items[0]) . "\n";
}
} else {
echo "未匹配 RAW_ITEMS\n";
}
if (preg_match("/var COLUMNS = (\[.*?\]);/s", $h, $m)) {
$cols = json_decode($m[1], true);
echo "COLUMNS 数: " . (is_array($cols) ? count($cols) : "解析失败") . "\n";
if (is_array($cols)) echo "COLUMNS keys: " . implode(",", array_column($cols, "key")) . "\n";
}
if (preg_match("/var FIXED = (\[.*?\]);/s", $h, $m)) {
$fixed = json_decode($m[1], true);
echo "FIXED keys: " . implode(",", $fixed) . "\n";
}
'

View File

@@ -0,0 +1,8 @@
#!/bin/bash
cd /var/www/onebot
echo "=== BOM3 第一条缩略图完整值 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -N -e "SELECT extra FROM zp_bom_item WHERE bomId=3 ORDER BY id LIMIT 1;" 2>/dev/null > /tmp/extra3.txt
php -r '$d=json_decode(file_get_contents("/tmp/extra3.txt"),true); echo "缩略图原始值: ".$d["缩略图"]."\n\n"; $t=json_decode($d["缩略图"]??"[]",true); if(is_array($t)&&isset($t[0])){ echo "=== 第一项字段 ===\n"; foreach($t[0] as $k=>$v){ if(is_string($v)&&strlen($v)>80){ echo $k.": ".substr($v,0,80)."... (len ".strlen($v).")\n"; } else { echo $k.": ".var_export($v,true)."\n"; } } }'
echo ""
echo "=== BOM3 数据源 baseUrl ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT id, name, baseUrl, tableId FROM zp_bom_source WHERE bomId=3;" 2>/dev/null

View File

@@ -0,0 +1,21 @@
#!/bin/bash
cd /var/www/onebot
JAR=/tmp/ob80.txt
rm -f $JAR
BODY=$(curl -s -c $JAR http://127.0.0.1:8081/auth/login)
CSRF=$(echo "$BODY" | grep -oE 'name="csrf-token" content="[^"]*"' | sed 's/.*content="//;s/"//')
curl -s -b $JAR -c $JAR -X POST http://127.0.0.1:8081/auth/login \
-d "username=ruiguo_wang@163.com" -d "password=wrg521113.." -d "_token=$CSRF" \
-H "X-CSRF-TOKEN: $CSRF" -o /dev/null
echo "=== 测试保存 BOM1 第一条明细itemId=251改 partNo 为测试值) ==="
curl -s -b $JAR -X POST http://127.0.0.1:8081/bom/api/1/item \
-H "Content-Type: application/json" -H "X-CSRF-TOKEN: $CSRF" \
-d '{"itemId":251,"seq":0,"partNo":"TEST-SAVE-1","partName":"测试保存","material":"","spec":"","qtyPerUnit":"","unit":"","process":"","remark":"","项目":"1","零件代号":"PR4391-"}'
echo ""
echo "=== 验证数据库是否写入 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "SELECT id, partNo, partName FROM zp_bom_item WHERE id=251;" 2>/dev/null
echo "=== 恢复原值 ==="
mysql -uonebot -p'OneBot_Db_7xKpQ9z' -h127.0.0.1 onebot -e "UPDATE zp_bom_item SET partNo='', partName='' WHERE id=251;" 2>/dev/null

View File

@@ -0,0 +1,52 @@
server {
listen 8081;
listen [::]:8081;
server_name _;
set $base /var/www/onebot;
root $base/public;
access_log /var/log/nginx/onebot.access.log;
error_log /var/log/nginx/onebot.error.log warn;
index index.php;
client_max_body_size 64M;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_index index.php;
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
log_not_found off;
access_log off;
}
location ^~ /dist/ {
expires 7d;
access_log off;
}
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/javascript;
gzip_disable "MSIE [1-6]\.";
}