diff --git a/.gitignore b/.gitignore index 687b526..2b552d5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # frontend-vue (Vue 3 + Vite) frontend-vue/node_modules/ +frontend-vue/node/ # frontend build output (auto-generated by Docker build) src/main/resources/static/v2/ diff --git a/AGENTS.md b/AGENTS.md index e03946c..13269fc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,7 +9,7 @@ - 核心目录: - `src/main/java/com/svnlog/` - `docs/` - - SVN 预设地址:通过仓库管理页维护,持久化至 `outputs/repository-configs.json` + - 仓库预设(SVN / Git):通过仓库管理页维护,持久化至 `outputs/repository-configs.json` ## 2. 常用命令(Build / Lint / Test / Run) 以下命令默认在仓库根目录执行。 @@ -32,7 +32,7 @@ - 运行单个测试方法(重点):`mvn -Dtest=ClassName#methodName test` - 单测方法示例:`mvn -Dtest=SVNLogFetcherTest#shouldFilterByUser test` - 调试失败测试(输出更完整):`mvn -Dtest=ClassName test -e` -- 说明:当前 `src/test/java` 为空;新增测试时采用 Surefire 默认约定。 +- 说明:测试采用 JUnit 5(Jupiter)+ Surefire 默认约定;现有测试含 `GitLogFetcherTest`(本地 git 仓库夹具,不依赖外网)等。 ### 2.4 Run - 运行 Web 工作台(Docker,推荐): @@ -45,13 +45,18 @@ ## 3. 代码结构与职责边界 - `SVNLogFetcher.java`:SVN 连接、版本区间处理、日志抓取、用户过滤。 -- `LogEntry.java`:日志数据模型(POJO)。 -- `web/controller/*`:REST API(SVN、AI、任务、文件、设置)。 -- `web/service/*`:异步任务与业务编排(SVN 抓取、AI 分析、输出目录管理)。 +- `core/git/GitLogFetcher.java`:Git(JGit)远程仓库 mirror 缓存、增量 fetch、按时间范围过滤、作者过滤、变更文件提取;支持 HTTPS Token 与 SSH 私钥认证。 +- `core/range/DateRangeResolver.java`:按月份/日期/周解析时间范围(SVN 与 Git 共用)。 +- `LogEntry.java`:日志数据模型(POJO;SVN 用 `revision`,Git 用 `commitHash`)。 +- `web/controller/*`:REST API(SVN、Git、AI、任务、文件、设置)。 +- `web/service/*`:异步任务与业务编排(SVN 抓取、Git 抓取、AI 分析、输出目录管理)。 + - `SvnPresetService` / `GitPresetService`:SVN / Git 仓库预设管理(共享 `RepositoryConfigService`,按 `type` 区分)。 + - `AiWorkflowService`:项目列表动态化(启用预设 = 项目,固定 3 个 SVN 项目顺序优先),支持 SVN + Git 报告合并整体 Excel。 - `src/main/resources/static/*`:Web 前端页面与交互脚本。 - 变更原则: - - 抓取逻辑改在 `SVNLogFetcher`。 + - 抓取逻辑改在 `SVNLogFetcher` / `GitLogFetcher`。 - AI/Excel 逻辑改在 `web/service/AiWorkflowService`。 + - 时间范围解析改在 `core/range/DateRangeResolver`。 - 不把多种职责混入同一方法。 ## 4. 代码风格规范(必读) diff --git a/Dockerfile b/Dockerfile index 7c2eb9d..7ab4241 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,8 +2,11 @@ # Docker 镜像仓库加速(默认使用 docker.1ms.run 国内代理) # 如需切换回 Docker Hub: # DOCKER_REGISTRY_MIRROR=docker.io/library make up +# npm 源加速(默认 npmmirror 国内镜像,可用 NPM_REGISTRY 覆盖): +# NPM_REGISTRY=https://registry.npmjs.org make up # ============================================================ ARG REGISTRY_MIRROR=docker.1ms.run/library +ARG NPM_REGISTRY=https://registry.npmmirror.com # 内部/开发用途,推荐通过 make fast-up 触发快速构建 ARG FAST_BUILD=false @@ -16,7 +19,9 @@ WORKDIR /frontend COPY frontend-vue/package.json frontend-vue/package-lock.json ./ -RUN --mount=type=cache,target=/root/.npm npm ci +RUN --mount=type=cache,target=/root/.npm \ + npm config set registry ${NPM_REGISTRY} && \ + npm ci COPY frontend-vue/ ./ diff --git a/docker-compose.yml b/docker-compose.yml index dfcb417..aeb24f4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,6 +7,7 @@ services: # Docker 镜像加速(使用 DOCKER_REGISTRY_MIRROR 传递,国内可选阿里云,例如 registry.cn-hangzhou.aliyuncs.com/library,不能带 https://) # 内部/开发用途,推荐通过 make fast-up 使用快速构建 REGISTRY_MIRROR: ${DOCKER_REGISTRY_MIRROR:-docker.1ms.run/library} + NPM_REGISTRY: ${NPM_REGISTRY:-https://registry.npmmirror.com} FAST_BUILD: ${FAST_BUILD:-false} container_name: svn-log-tool network_mode: host diff --git a/docs/README_Web.md b/docs/README_Web.md index daf03cd..11c5380 100644 --- a/docs/README_Web.md +++ b/docs/README_Web.md @@ -4,14 +4,14 @@ Web 工作台将现有 CLI 能力封装为可视化页面与 REST API,支持以下流程: -1. SVN 参数录入与连接测试 +1. 仓库参数录入与连接测试(SVN / Git 两种类型) 2. 异步抓取日志并导出 Markdown 3. 使用 DeepSeek 或 OpenAI 兼容接口分析 Markdown 并生成 Excel 4. 查看任务历史(状态、进度、错误、产物),支持筛选、分页与取消运行中任务 5. 下载输出文件、配置 API Key、SVN 账号与输出目录 6. 工作台展示系统健康状态(输出目录可写性、API Key 配置、任务统计) -批量抓取策略:多个项目按顺序执行(前一个项目完成后才开始下一个)。 +批量抓取策略:多个项目(SVN + Git 可混合)按顺序执行(前一个项目完成后才开始下一个),最终汇总为一份 Excel 整体报告。 ## 启动方式 @@ -51,11 +51,21 @@ http://localhost:18088 ## 页面说明 - 工作台:最近任务统计与最近产物 -- SVN 日志抓取:版本区间、过滤用户与连接测试;SVN 账号密码统一在系统设置中托管 -- AI 工作量分析:选择 Markdown 文件、工作周期、输出文件名 +- 日志抓取:选择 SVN / Git 仓库(可混合),选时间范围(月/周/日)、过滤用户与连接测试;SVN 自动填充版本号,Git 直接按时间范围抓取 +- AI 工作量分析:选择 Markdown 文件、工作周期、输出文件名;SVN 与 Git 报告可多选合并,按项目归类生成整体 Excel - 任务历史:异步任务状态与产物列表,支持筛选、分页、取消任务 +- 仓库管理:SVN / Git 预设 CRUD、连接测试;Git 预设支持分支(留空自动探测)、HTTPS Token 或 SSH 私钥认证 - 系统设置:AI 提供商、DeepSeek API Key、OpenAI 兼容 Base URL/API Key/阶段模型、SVN 用户名/密码、输出目录、默认 SVN 预置项目 +## Git 仓库支持说明 + +- 一个 Git 地址即一个项目(与 SVN 语义一致),在「仓库管理」新增仓库时选择类型 `Git`。 +- Git 抓取基于 JGit(纯 Java),HTTPS 使用「用户名 + Token」,SSH 使用预设中保存的私钥(加密存储)。 +- 首次抓取会 mirror 克隆到 `java.io.tmpdir/svnlog-git-cache//`(首次较慢),后续增量 fetch。 +- Git 报告显示提交短 hash(如 `4fed870`),AI 分析与 Excel 汇总逻辑与 SVN 一致,SVN + Git 报告可混合合并为整体工作量统计。 +- SSH 主机密钥默认严格校验(读取 `~/.ssh/known_hosts`);内网可显式开启信任任意主机: + - `SVN_LOG_TOOL_ACCEPT_ANY_SSH_HOST=true` 或 `-Dsvnlog.git.acceptAnySshHost=true` + ## 输出目录 - 默认输出目录:`outputs/` @@ -123,6 +133,10 @@ http://localhost:18088 - `POST /api/svn/fetch` - `POST /api/svn/version-range`:按 `rangeType=date|week|month` 查询版本范围;旧的 `year/month` 月份请求仍兼容 - `GET /api/svn/presets` +- `POST /api/git/test-connection` +- `POST /api/git/fetch`:按 `rangeType=date|week|month` + 时间参数直接抓取(Git 无版本号) +- `POST /api/git/version-range`:返回 `commitCount` 与首尾提交 hash +- `GET /api/git/presets` - `POST /api/ai/analyze` - `GET /api/tasks` - `GET /api/tasks/query?status=&type=&keyword=&page=1&size=10` diff --git a/frontend-vue/index.html b/frontend-vue/index.html index 45439fd..fcfb748 100644 --- a/frontend-vue/index.html +++ b/frontend-vue/index.html @@ -2,6 +2,7 @@ + diff --git a/frontend-vue/public/favicon.svg b/frontend-vue/public/favicon.svg new file mode 100644 index 0000000..0a999cd --- /dev/null +++ b/frontend-vue/public/favicon.svg @@ -0,0 +1,4 @@ + + + LOG + diff --git a/frontend-vue/src/components/AppSidebar.vue b/frontend-vue/src/components/AppSidebar.vue index c758707..8923059 100644 --- a/frontend-vue/src/components/AppSidebar.vue +++ b/frontend-vue/src/components/AppSidebar.vue @@ -3,8 +3,8 @@ - + diff --git a/frontend-vue/src/main.js b/frontend-vue/src/main.js index 93a878a..12a027c 100644 --- a/frontend-vue/src/main.js +++ b/frontend-vue/src/main.js @@ -6,14 +6,16 @@ import SvnFetchView from './views/SvnFetchView.vue' import HistoryView from './views/HistoryView.vue' import SettingsView from './views/SettingsView.vue' import SvnPresetsView from './views/SvnPresetsView.vue' +import ProjectManageView from './views/ProjectManageView.vue' import './styles/main.css' const routes = [ { path: '/', redirect: '/dashboard' }, { path: '/dashboard', name: 'dashboard', component: DashboardView, meta: { title: '工作台', desc: '查看系统状态与最近产物' } }, - { path: '/svn-fetch', name: 'svn-fetch', component: SvnFetchView, meta: { title: '日志抓取', desc: '一键抓取 SVN 日志并导出工作量 Excel' } }, + { path: '/svn-fetch', name: 'svn-fetch', component: SvnFetchView, meta: { title: '日志抓取', desc: '一键抓取 SVN/Git 日志并导出工作量 Excel' } }, { path: '/history', name: 'history', component: HistoryView, meta: { title: '任务历史', desc: '查看任务执行状态、日志与产物' } }, - { path: '/presets', name: 'presets', component: SvnPresetsView, meta: { title: '仓库管理', desc: '管理 SVN 仓库预设' } }, + { path: '/projects', name: 'projects', component: ProjectManageView, meta: { title: '项目管理', desc: '创建项目并将 SVN/Git 仓库拖拽分配到项目' } }, + { path: '/presets', name: 'presets', component: SvnPresetsView, meta: { title: '仓库管理', desc: '管理 SVN / Git 仓库预设' } }, { path: '/settings', name: 'settings', component: SettingsView, meta: { title: '系统设置', desc: '配置 API Key 与输出目录' } }, ] diff --git a/frontend-vue/src/styles/main.css b/frontend-vue/src/styles/main.css index c8b457b..b3a2a96 100644 --- a/frontend-vue/src/styles/main.css +++ b/frontend-vue/src/styles/main.css @@ -423,6 +423,7 @@ body { .tag-danger { background: var(--c-danger-bg); color: var(--c-danger); } .tag-muted { background: rgba(100, 116, 139, 0.15); color: var(--c-text-muted); } .tag-info { background: var(--c-info-bg); color: var(--c-info); } +.tag-default { background: var(--c-info-bg); color: var(--c-info); } /* ========== Tables ========== */ .table-wrap { diff --git a/frontend-vue/src/views/ProjectManageView.vue b/frontend-vue/src/views/ProjectManageView.vue new file mode 100644 index 0000000..3f9b0e1 --- /dev/null +++ b/frontend-vue/src/views/ProjectManageView.vue @@ -0,0 +1,341 @@ + + + + + diff --git a/frontend-vue/src/views/SvnFetchView.vue b/frontend-vue/src/views/SvnFetchView.vue index a5ece11..f15bdf5 100644 --- a/frontend-vue/src/views/SvnFetchView.vue +++ b/frontend-vue/src/views/SvnFetchView.vue @@ -1,9 +1,9 @@