diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..be08c0e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,44 @@
+# === 构建产物 ===
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+/dist/
+
+# === 运行时数据文件 ===
+/data/
+/logs/
+/export/
+build.log
+
+# === 空模板目录保护 ===
+!/src/main/resources/config/
+
+# === IDE ===
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/build.log b/build.log
deleted file mode 100644
index 222ddd4..0000000
--- a/build.log
+++ /dev/null
@@ -1,69 +0,0 @@
-[INFO] Scanning for projects...
-[WARNING]
-[WARNING] Some problems were encountered while building the effective model for com.example:workutils:jar:0.0.1-SNAPSHOT
-[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: com.alibaba:fastjson:jar -> version 2.0.57 vs 1.2.83 @ line 146, column 21
-[WARNING]
-[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
-[WARNING]
-[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
-[WARNING]
-[INFO]
-[INFO] -----------------------< com.example:workutils >------------------------
-[INFO] Building workutils 0.0.1-SNAPSHOT
-[INFO] from pom.xml
-[INFO] --------------------------------[ jar ]---------------------------------
-[WARNING] The POM for com.oracle.javafx:jfxrt:jar:8.0 is missing, no dependency information available
-[INFO]
-[INFO] --- clean:3.2.0:clean (default-clean) @ workutils ---
-[INFO] Deleting D:\workspace\workutils\target
-[INFO]
-[INFO] --- resources:3.2.0:resources (default-resources) @ workutils ---
-[INFO] Using 'UTF-8' encoding to copy filtered resources.
-[INFO] Using 'UTF-8' encoding to copy filtered properties files.
-[INFO] Copying 1 resource
-[INFO] Copying 5 resources
-[INFO]
-[INFO] --- compiler:3.10.1:compile (default-compile) @ workutils ---
-[INFO] Changes detected - recompiling the module!
-[INFO] Compiling 36 source files to D:\workspace\workutils\target\classes
-[INFO]
-[INFO] --- resources:3.2.0:testResources (default-testResources) @ workutils ---
-[INFO] Using 'UTF-8' encoding to copy filtered resources.
-[INFO] Using 'UTF-8' encoding to copy filtered properties files.
-[INFO] skip non existing resourceDirectory D:\workspace\workutils\src\test\resources
-[INFO]
-[INFO] --- compiler:3.10.1:testCompile (default-testCompile) @ workutils ---
-[INFO] No sources to compile
-[INFO]
-[INFO] --- surefire:2.22.2:test (default-test) @ workutils ---
-[INFO] Tests are skipped.
-[INFO]
-[INFO] --- jar:3.2.2:jar (default-jar) @ workutils ---
-[INFO] Building jar: D:\workspace\workutils\target\workutils-0.0.1-SNAPSHOT.jar
-[INFO]
-[INFO] --- spring-boot:2.7.18:repackage (repackage) @ workutils ---
-[INFO] Replacing main artifact with repackaged archive
-[INFO]
-[INFO] --- launch4j:2.5.3:launch4j (l4j-exe) @ workutils ---
-[WARNING] jre.path not set, defaulting to "%JAVA_HOME%;%PATH%"
-[WARNING] Configuration param ${project.organization.name} is empty, so a dummy value "Default organization" might be used instead to fulfill some of VersionInfo params by defaults.
-[WARNING] Configuration param ${project.inceptionYear} is empty, so a dummy value "2020" might be used instead to fulfill some of VersionInfo params by defaults.
-[INFO] Found launch4j version 3.50
-[INFO] Platform-specific work directory already exists: C:\Users\73212\.m2\repository\net\sf\launch4j\launch4j\3.50\launch4j-3.50-workdir-win32
-[INFO] Using workdir C:\Users\73212\.m2\repository\net\sf\launch4j\launch4j\3.50\launch4j-3.50-workdir-win32
-[INFO] launch4j: Compiling resources
-[INFO] launch4j: Linking
-[INFO] launch4j: Wrapping
-WARNING: Sign the executable to minimize antivirus false positives or use launching instead of wrapping.
-[INFO] launch4j: Successfully created D:\workspace\workutils\target\workutils.exe
-[INFO]
-[INFO] --- resources:3.2.0:copy-resources (copy-start-bat) @ workutils ---
-[INFO] Using 'UTF-8' encoding to copy filtered resources.
-[INFO] Using 'UTF-8' encoding to copy filtered properties files.
-[INFO] Copying 1 resource
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time: 12.415 s
-[INFO] Finished at: 2026-06-11T17:28:56+08:00
-[INFO] ------------------------------------------------------------------------
diff --git a/项目目录结构说明.md b/docs/项目目录结构说明.md
similarity index 89%
rename from 项目目录结构说明.md
rename to docs/项目目录结构说明.md
index 1ab8032..dd7daab 100644
--- a/项目目录结构说明.md
+++ b/docs/项目目录结构说明.md
@@ -10,26 +10,45 @@
```
workutils/
-├── export/ # 导出文件目录(运行结果输出)
-├── logs/ # 日志文件目录
+├── docs/ # 项目文档
+│ ├── 项目说明.md
+│ └── 项目目录结构说明.md
+├── scripts/ # 构建/启动脚本
+│ ├── build_release.bat # 生产构建脚本
+│ ├── start.bat # 快速启动入口
+│ └── start-jar.bat # jar 启动脚本(UTF-8)
├── src/ # 源代码目录
-├── target/ # Maven 编译输出目录(67个.class文件)
-├── generator.rar # MyBatis Generator 压缩包
+├── lib/ # Maven 本地文件仓库(jfxrt.jar 等)
+├── target/ # Maven 编译输出
├── mvnw # Maven Wrapper(Unix/Mac)
├── mvnw.cmd # Maven Wrapper(Windows)
├── pom.xml # Maven 项目配置文件
-├── 项目说明.md # 项目概述文档
-└── 项目目录结构说明.md # 本文件
+├── .gitignore # Git 忽略规则
+│
+├── (运行时生成,已 gitignore)
+├── data/ # 运行时配置文件和数据
+│ ├── workutils.config # 外部配置
+│ ├── project_paths.txt # 项目路径数据
+│ └── damaged_repos.cache # 损坏仓库缓存
+├── logs/ # 运行时日志
+├── export/ # 运行时导出文件(按日期子目录)
+└── build.log # 构建日志
```
| 文件/目录 | 说明 |
|-----------|------|
+| `docs/` | 项目文档目录 |
+| `scripts/` | 构建/启动脚本目录,包含构建打包、启动入口等 |
+| `lib/` | Maven 本地文件仓库,存放 jfxrt.jar 等外部依赖 |
| `pom.xml` | Maven 项目配置,定义依赖(Spring Boot、MyBatis、EasyExcel、JGit、Dubbo、Redis Jedis、OpenCSV 等) |
| `mvnw` / `mvnw.cmd` | Maven Wrapper 脚本,无需本地安装 Maven 即可构建项目 |
-| `generator.rar` | MyBatis Generator 相关资源压缩包 |
+| `logs/` | 应用程序运行时日志输出目录 |
| `export/` | 运行工具后输出的结果文件目录,按日期分子目录(如 `20260608/`) |
-| `logs/` | 应用程序日志输出目录 |
| `target/` | Maven 编译产物,包含编译后的 `.class` 文件和资源文件副本 |
+| `data/` | 运行时配置文件和数据目录 |
+| `data/workutils.config` | 外部配置文件,首次运行时从 `application.yml` 自动生成 |
+| `data/project_paths.txt` | 项目路径配置,首次运行时从模板 `templates/project_paths.txt` 复制 |
+| `data/damaged_repos.cache` | 损坏仓库缓存,首次运行时从模板复制 |
---
@@ -208,8 +227,10 @@ src/main/resources/
├── logback.xml # 日志框架配置
├── mybatis-generator.xml # MyBatis Generator 配置文件
├── mybatis-generator.properties # MyBatis Generator 数据库连接配置
-└── config/
- └── 代码仓库项目路径.txt # 要扫描的代码仓库路径列表(含状态标记)
+├── config/ # 旧配置文件(已废弃,保留兼容)
+└── templates/ # 数据文件模板(首次运行时复制到 user.dir)
+ ├── project_paths.txt # 项目路径配置模板
+ └── damaged_repos.cache # 损坏仓库缓存模板
```
| 文件 | 说明 |
@@ -218,7 +239,7 @@ src/main/resources/
| `logback.xml` | Logback 日志配置,控制台输出格式为 `HH:mm:ss.SSS [线程] 级别 Logger - 消息` |
| `mybatis-generator.xml` | MyBatis Generator 配置,引用自定义插件(LombokPlugin、SelectiveOnlyPlugin、CustomCommentGenerator),配置模型/Mapper/XML 生成路径 |
| `mybatis-generator.properties` | 数据库连接信息(MySQL),JDBC URL/用户名/密码/驱动路径,以及生成的包路径 |
-| `代码仓库项目路径.txt` | 待扫描的代码仓库绝对路径列表,每行格式 `路径|状态`(NORMAL/CORRUPTED),共约72个项目 |
+| `templates/` | 数据文件模板目录,首次运行时自动复制到 `user.dir` 同级目录 |
---
diff --git a/项目说明.md b/docs/项目说明.md
similarity index 100%
rename from 项目说明.md
rename to docs/项目说明.md
diff --git a/generator.rar b/generator.rar
deleted file mode 100644
index 29a7f88..0000000
Binary files a/generator.rar and /dev/null differ
diff --git a/lib-repo/com/oracle/javafx/jfxrt/8.0/jfxrt-8.0.jar b/lib/com/oracle/javafx/jfxrt/8.0/jfxrt-8.0.jar
similarity index 100%
rename from lib-repo/com/oracle/javafx/jfxrt/8.0/jfxrt-8.0.jar
rename to lib/com/oracle/javafx/jfxrt/8.0/jfxrt-8.0.jar
diff --git a/lib/jfxrt.jar b/lib/jfxrt.jar
deleted file mode 100644
index 8b620f9..0000000
Binary files a/lib/jfxrt.jar and /dev/null differ
diff --git a/pom.xml b/pom.xml
index a28f926..1a04d70 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,7 @@
local-lib-repo
- file://${project.basedir}/lib-repo
+ file://${project.basedir}/lib
@@ -190,7 +190,7 @@
-
+
com.oracle.javafx
@@ -247,23 +247,24 @@
-
+
org.apache.maven.plugins
maven-resources-plugin
3.2.0
- copy-start-bat
+ copy-start-scripts
package
copy-resources
${project.build.directory}
- ${basedir}
+ ${basedir}/scripts
start.bat
+ start-jar.bat
diff --git a/build_release.bat b/scripts/build_release.bat
similarity index 95%
rename from build_release.bat
rename to scripts/build_release.bat
index 5355fb1..3e1a8a2 100644
--- a/build_release.bat
+++ b/scripts/build_release.bat
@@ -7,8 +7,10 @@ setlocal enabledelayedexpansion
:: 输出:target\dist\workutils-v{version}.zip(含 exe + jar + bat + config)
:: ============================================
-set PROJECT_DIR=%~dp0
-set TARGET=%PROJECT_DIR%target
+::: 切换到项目根目录
+cd /d "%~dp0.."
+set PROJECT_DIR=%CD%
+set TARGET=%PROJECT_DIR%\target
set DIST=%TARGET%\dist
set VERSION=
diff --git a/start-jar.bat b/scripts/start-jar.bat
similarity index 50%
rename from start-jar.bat
rename to scripts/start-jar.bat
index e596e86..c372576 100644
--- a/start-jar.bat
+++ b/scripts/start-jar.bat
@@ -2,6 +2,6 @@
chcp 65001 >nul
title WorkUtils
-java -Dfile.encoding=UTF-8 -jar "%~dp0target\workutils-0.0.1-SNAPSHOT.jar" %*
+java -Dfile.encoding=UTF-8 -jar "%~dp0target\workutils-0.0.2-SNAPSHOT.jar" %*
pause
diff --git a/start.bat b/scripts/start.bat
similarity index 82%
rename from start.bat
rename to scripts/start.bat
index 9c642fa..a2220da 100644
--- a/start.bat
+++ b/scripts/start.bat
@@ -7,4 +7,4 @@ echo 控制台编码: UTF-8 (65001)
echo ====================================
echo.
cd /d "%~dp0"
-java -jar workutils-0.0.1-SNAPSHOT.jar
+java -jar target\workutils-0.0.2-SNAPSHOT.jar
diff --git a/src/main/java/com/example/workutils/system/config/ExternalConfigManager.java b/src/main/java/com/example/workutils/system/config/ExternalConfigManager.java
index 966b91c..f198994 100644
--- a/src/main/java/com/example/workutils/system/config/ExternalConfigManager.java
+++ b/src/main/java/com/example/workutils/system/config/ExternalConfigManager.java
@@ -27,7 +27,7 @@ import java.util.Properties;
@Component
public class ExternalConfigManager {
- static final String CONFIG_FILE_NAME = "workutils.config";
+ static final String CONFIG_FILE_NAME = "data/workutils.config";
// ---- 系统路径 ----
public static final String KEY_BASE_DIR = "base-directory";
diff --git a/src/main/java/com/example/workutils/system/config/WorkUtilsProperties.java b/src/main/java/com/example/workutils/system/config/WorkUtilsProperties.java
index 01a546a..1551bcf 100644
--- a/src/main/java/com/example/workutils/system/config/WorkUtilsProperties.java
+++ b/src/main/java/com/example/workutils/system/config/WorkUtilsProperties.java
@@ -215,10 +215,12 @@ public class WorkUtilsProperties {
* 无法读取模板时则创建空文件。
*/
private void ensureDataFilesExist() {
- ensureDataFile(getProjectPathsFilePath(), "config/project_paths.txt", "项目路径文件");
- ensureDataFile(getDamagedReposFilePath(), "config/damaged_repos.cache", "损坏缓存文件");
+ ensureDataFile(getProjectPathsFilePath(), TEMPLATES_PATH + "project_paths.txt", "项目路径文件");
+ ensureDataFile(getDamagedReposFilePath(), TEMPLATES_PATH + "damaged_repos.cache", "损坏缓存文件");
}
+ private static final String TEMPLATES_PATH = "templates/";
+
private void ensureDataFile(Path target, String classpathResource, String label) {
try {
if (Files.exists(target)) return;
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 564e52f..0e85812 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -7,9 +7,9 @@ workutils:
base-directory: ""
# export dir, empty = defaults to {user.dir}/export (auto-created on startup)
export-directory: ""
- # data file paths (relative -> under user.dir, absolute -> as-is)
- project-paths-file: "project_paths.txt"
- damaged-repos-file: "damaged_repos.cache"
+ # data file paths (relative -> under user.dir/data/, absolute -> as-is)
+ project-paths-file: "data/project_paths.txt"
+ damaged-repos-file: "data/damaged_repos.cache"
logging:
charset:
diff --git a/src/main/resources/config/damaged_repos.cache b/src/main/resources/config/damaged_repos.cache
deleted file mode 100644
index ef0aaea..0000000
--- a/src/main/resources/config/damaged_repos.cache
+++ /dev/null
@@ -1 +0,0 @@
-branch:master
diff --git a/src/main/resources/config/代码仓库项目路径.txt b/src/main/resources/config/代码仓库项目路径.txt
deleted file mode 100644
index 66baacc..0000000
--- a/src/main/resources/config/代码仓库项目路径.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-D:/bestpay-srdcloud/ft-compensatory-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-creative-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-credit-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-customer-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-file-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-finflux-gw-adapter=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-lending-management-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-loancapital-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-loan-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-organmng-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-orgsupport-weixin=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-protocol-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-repay-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-risk-control-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-settlement-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-wechatstage-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-agent-admin=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-batch-creditpayment=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-batch-creditpayment-plus=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-blockchain-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-boss=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-clrstl-fee-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-clrstl-report-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-codeutils=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-collateral-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-commodity-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-commonservice=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-consumestage-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-consumestage-mall=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-credit-bizfront=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-credit-bizfront-plus=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-credit-front=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-credit-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-credit-prod-manage=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-creditstagescore=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-credituse-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-ctcorp-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-customer-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-file-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-govent-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-grant-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-info-collection=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-instalment-admin=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-instalment-batch=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-invoice-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-lending-management-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-loancapital-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-marketing-manage=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-marketing-manage-plus=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-onlinestage-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-organmng-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-precredit-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-productcfg-core-plus=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-protocol-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-risktool=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-scheduler=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-search=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-settlement-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-thirdpartybiz-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-trade-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-wechatstage-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-approval-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-asset-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-blockchain-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-collateral-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-commodity-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-commonservice=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
\ No newline at end of file
diff --git a/damaged_repos.cache b/src/main/resources/templates/damaged_repos.cache
similarity index 100%
rename from damaged_repos.cache
rename to src/main/resources/templates/damaged_repos.cache
diff --git a/src/main/resources/templates/project_paths.txt b/src/main/resources/templates/project_paths.txt
new file mode 100644
index 0000000..c073f66
--- /dev/null
+++ b/src/main/resources/templates/project_paths.txt
@@ -0,0 +1,3 @@
+# 项目路径配置文件
+# 格式: 本地路径=Git仓库URL(每行一个项目)
+# 示例: D:/workspace/my-project=https://user@code.example.com/org/repo.git
diff --git a/代码仓库项目路径.txt b/代码仓库项目路径.txt
deleted file mode 100644
index 66baacc..0000000
--- a/代码仓库项目路径.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-D:/bestpay-srdcloud/ft-compensatory-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-creative-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-credit-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-customer-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-file-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-finflux-gw-adapter=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-lending-management-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-loancapital-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-loan-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-organmng-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-orgsupport-weixin=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-protocol-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-repay-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-risk-control-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-settlement-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-wechatstage-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-agent-admin=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-batch-creditpayment=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-batch-creditpayment-plus=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-blockchain-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-boss=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-clrstl-fee-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-clrstl-report-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-codeutils=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-collateral-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-commodity-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-commonservice=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-consumestage-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-consumestage-mall=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-credit-bizfront=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-credit-bizfront-plus=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-credit-front=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-credit-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-credit-prod-manage=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-creditstagescore=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-credituse-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-ctcorp-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-customer-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-file-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-govent-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-grant-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-info-collection=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-instalment-admin=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-instalment-batch=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-invoice-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-lending-management-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-loancapital-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-marketing-manage=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-marketing-manage-plus=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-onlinestage-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-organmng-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-precredit-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-productcfg-core-plus=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-protocol-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-risktool=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-scheduler=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-search=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-settlement-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-thirdpartybiz-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-trade-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/cf-wechatstage-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-approval-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-asset-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-blockchain-prod=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-collateral-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-commodity-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
-D:/bestpay-srdcloud/ft-commonservice=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/
\ No newline at end of file