From caf0d97903e068bb64daf4928432d3c29ea0efe2 Mon Sep 17 00:00:00 2001 From: liu <362165265@qq.com> Date: Tue, 3 Feb 2026 11:35:29 +0800 Subject: [PATCH] Refactor Docker setup and enhance file transfer progress handling. Updated Dockerfile for multi-stage builds, modified docker-compose.yml to include image and container name, and improved progress bar functionality in app.js for better user feedback during file transfers. --- .dockerignore | 1 - Dockerfile | 27 +++++++++++++++++++++------ docker-compose.yml | 6 ++++-- run.bat | 16 ++++++++++++++++ run.sh | 15 +++++++++++++++ src/main/resources/static/js/app.js | 22 +++++++++++++++------- 6 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 run.bat create mode 100644 run.sh diff --git a/.dockerignore b/.dockerignore index efae8ea..3134c97 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,3 @@ -# 构建前请先执行: mvn clean package .git .gitignore *.md diff --git a/Dockerfile b/Dockerfile index 2fd4a33..050564c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,27 @@ -# 构建阶段:先执行 mvn clean package 生成 target/sftp-manager-1.0.0.jar +# ========== 阶段一:Maven 构建 ========== +FROM eclipse-temurin:8-jdk-alpine AS builder + +WORKDIR /build + +# 先只复制 pom,利用 Docker 缓存依赖层 +COPY pom.xml . +RUN mvn dependency:go-offline -B -q + +# 复制源码并打包(跳过测试,加快构建) +COPY src ./src +RUN mvn clean package -DskipTests -B -q + +# ========== 阶段二:运行 ========== FROM eclipse-temurin:8-jre-alpine -VOLUME /tmp -ARG JAR_FILE=target/sftp-manager-1.0.0.jar +WORKDIR /app -COPY ${JAR_FILE} app.jar +# 从构建阶段复制 jar +COPY --from=builder /build/target/sftp-manager-1.0.0.jar app.jar -# 数据与日志目录 +# 数据与日志目录(挂载卷时会覆盖) RUN mkdir -p /app/data /app/logs -ENTRYPOINT ["java", "-jar", "/app.jar"] +EXPOSE 48081 + +ENTRYPOINT ["java", "-jar", "app.jar"] diff --git a/docker-compose.yml b/docker-compose.yml index 340a5ae..ee4ab10 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,9 @@ -version: '3' +# SFTP Manager - 拉代码后执行 run.sh / run.bat 即可运行 services: sftp-manager: build: . + image: sftp-manager:latest + container_name: sftp-manager ports: - "48081:48081" volumes: @@ -9,4 +11,4 @@ services: - ./logs:/app/logs environment: - SPRING_PROFILES_ACTIVE=prod - restart: always + restart: unless-stopped diff --git a/run.bat b/run.bat new file mode 100644 index 0000000..7b085fb --- /dev/null +++ b/run.bat @@ -0,0 +1,16 @@ +@echo off +chcp 65001 >nul +REM 一键运行:拉代码后执行 run.bat 即可 +REM 需要本机已安装 Docker 和 Docker Compose + +cd /d "%~dp0" + +echo ^>^>^> 构建并启动 SFTP Manager... +docker compose up -d --build + +echo. +echo ^>^>^> 启动完成。 +echo 访问地址: http://localhost:48081/sftp-manager +echo 停止服务: docker compose down +echo. +pause diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..3e97f6f --- /dev/null +++ b/run.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# 一键运行:拉代码后执行 ./run.sh 即可 +# 需要本机已安装 Docker 和 Docker Compose + +set -e +cd "$(dirname "$0")" + +echo ">>> 构建并启动 SFTP Manager..." +docker compose up -d --build + +echo "" +echo ">>> 启动完成。" +echo " 访问地址: http://localhost:48081/sftp-manager" +echo " 停止服务: docker compose down" +echo "" diff --git a/src/main/resources/static/js/app.js b/src/main/resources/static/js/app.js index cea754b..86ddd04 100644 --- a/src/main/resources/static/js/app.js +++ b/src/main/resources/static/js/app.js @@ -363,7 +363,7 @@ function handleFileDrop(data, targetPanelId) { const fileName = getFileNameFromPath(sourcePath); showTransferCountProgress(0, 1, fileName); - updateTransferProgress(0, '传输中 ' + fileName); + updateTransferProgress(0, '传输中 ' + fileName, true); // 拖拽跨面板传输,后端无流式进度 $.ajax({ url: API_BASE + 'api/files/transfer', @@ -975,10 +975,18 @@ function showTransferProgress(show, label) { } // 更新传输进度条与标签 -function updateTransferProgress(percent, label) { +// indeterminate: 当后端无流式进度时(如跨面板传输 API),设为 true 显示动画进度条 +function updateTransferProgress(percent, label, indeterminate) { const progressBar = $('#transfer-progress-bar'); - progressBar.css('width', percent + '%'); - progressBar.text(percent + '%'); + if (indeterminate) { + progressBar.css('width', '100%'); + progressBar.text(''); + progressBar.addClass('progress-bar-striped progress-bar-animated'); + } else { + progressBar.removeClass('progress-bar-striped progress-bar-animated'); + progressBar.css('width', percent + '%'); + progressBar.text(percent + '%'); + } if (label !== undefined) { $('#transfer-progress-label').text(label); } @@ -1083,7 +1091,7 @@ function doTransfer(sourcePanelId, targetPanelId) { const total = selectedFiles.length; showTransferCountProgress(0, total, ''); - updateTransferProgress(0, '传输中 (0/' + total + ')'); + updateTransferProgress(0, '传输中 (0/' + total + ')', true); // 后端无流式进度,使用动画条 selectedFiles.forEach(function(sourcePath) { $.ajax({ @@ -1105,7 +1113,7 @@ function doTransfer(sourcePanelId, targetPanelId) { } const done = completed + failed; showTransferCountProgress(done, total, getFileNameFromPath(sourcePath)); - updateTransferProgress(total > 0 ? Math.round((done / total) * 100) : 0, '传输中 (' + done + '/' + total + ')'); + updateTransferProgress(total > 0 ? Math.round((done / total) * 100) : 0, '传输中 (' + done + '/' + total + ')', false); if (done === total) { showTransferProgress(false); if (failed === 0) { @@ -1122,7 +1130,7 @@ function doTransfer(sourcePanelId, targetPanelId) { alert('传输失败: ' + errMsg); const done = completed + failed; showTransferCountProgress(done, total, getFileNameFromPath(sourcePath)); - updateTransferProgress(total > 0 ? Math.round((done / total) * 100) : 0, '传输中 (' + done + '/' + total + ')'); + updateTransferProgress(total > 0 ? Math.round((done / total) * 100) : 0, '传输中 (' + done + '/' + total + ')', false); if (done === total) { showTransferProgress(false); updateStatus('传输完成:成功 ' + completed + ',失败 ' + failed);