fix: harden file download flow

This commit is contained in:
liumangmang
2026-04-30 10:30:26 +08:00
parent 3555d19b26
commit aef59e354a
24 changed files with 2316 additions and 2443 deletions
+21 -4
View File
@@ -8,7 +8,7 @@ Web 工作台将现有 CLI 能力封装为可视化页面与 REST API,支持
2. 异步抓取日志并导出 Markdown
3. 使用 DeepSeek 或 OpenAI 兼容接口分析 Markdown 并生成 Excel
4. 查看任务历史(状态、进度、错误、产物),支持筛选、分页与取消运行中任务
5. 下载输出文件、配置 API Key 与输出目录
5. 下载输出文件、配置 API Key、SVN 账号与输出目录
6. 工作台展示系统健康状态(输出目录可写性、API Key 配置、任务统计)
批量抓取策略:多个项目按顺序执行(前一个项目完成后才开始下一个)。
@@ -18,7 +18,7 @@ Web 工作台将现有 CLI 能力封装为可视化页面与 REST API,支持
在仓库根目录执行:
```bash
# Docker 一键启动(推荐)
# Docker 一键启动(推荐;每次会重新构建镜像并打包最新代码
make up
```
@@ -34,13 +34,20 @@ mvn spring-boot:run -Dspring-boot.run.mainClass=com.svnlog.web.WebApplication
http://localhost:18088
```
## Docker 构建行为
- `make up` 保持“重新构建并启动”的语义,每次都会执行一次 Maven 打包,确保容器内是最新代码。
- Docker 构建使用 BuildKit 缓存 Maven 本地仓库;首次构建会下载依赖,后续在 `pom.xml` 未变更时会优先命中缓存,不会在每次构建时重复下载全部依赖。
- 如果修改了 `pom.xml`、执行了 `docker builder prune`、或切换到新的 Docker 环境,依赖缓存会失效并重新下载。
- 如果本机 Docker 未启用 BuildKit,可显式设置 `DOCKER_BUILDKIT=1``COMPOSE_DOCKER_CLI_BUILD=1` 后再执行 `make up`
## 页面说明
- 工作台:最近任务统计与最近产物
- SVN 日志抓取:SVN 地址、账号密码、版本区间、过滤用户(支持预置项目下拉与自定义地址)
- SVN 日志抓取:版本区间、过滤用户与连接测试;SVN 账号密码统一在系统设置中托管
- AI 工作量分析:选择 Markdown 文件、工作周期、输出文件名
- 任务历史:异步任务状态与产物列表,支持筛选、分页、取消任务
- 系统设置:AI 提供商、DeepSeek API Key、OpenAI 兼容 Base URL/API Key/阶段模型、输出目录、默认 SVN 预置项目
- 系统设置:AI 提供商、DeepSeek API Key、OpenAI 兼容 Base URL/API Key/阶段模型、SVN 用户名/密码、输出目录、默认 SVN 预置项目
## 输出目录
@@ -48,6 +55,8 @@ http://localhost:18088
- Markdown 输出:`outputs/md/*.md`
- Excel 输出:`outputs/excel/*.xlsx`
- 任务持久化:`outputs/task-history.json`(重启后可恢复历史)
- 设置页保存 `outputDir` 时会自动创建不存在的目录;如果目标路径已被普通文件占用,或当前运行用户对该目录无写权限,`PUT /api/settings` 会明确返回失败。
- 如果本机已有 `outputs/` 但属主或权限异常,可手动修复为当前用户可写后再保存设置,例如调整目录属主或写权限。
## AI 提供商设置
@@ -66,6 +75,14 @@ http://localhost:18088
建议在生产环境优先使用环境变量,避免敏感信息暴露。
## SVN 凭据读取优先级
1. 单次请求显式传入的 `username/password`(兼容旧接口)
2. 设置页保存的运行时 `svnUsername/svnPassword`
3. 环境变量 `SVN_USERNAME` / `SVN_PASSWORD`
`GET /api/settings` 不会回显 `openaiApiKey``svnPassword` 明文,前端通过 `openaiApiKeyConfigured``svnCredentialsConfigured` 展示配置状态。
## SVN 预设来源与调用方式
- SVN 地址统一维护在 `application.properties``svn.presets[*]` 中。