diff --git a/.gitignore b/.gitignore index f459736..328456a 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ build/ logs/ /logs/ spy.log + +### Upload Files ### +picture/ diff --git a/picture/pictures/bugs/2025/07/06/20250706224303-6c9668.jpg b/picture/pictures/bugs/2025/07/06/20250706224303-6c9668.jpg deleted file mode 100644 index 960914e..0000000 Binary files a/picture/pictures/bugs/2025/07/06/20250706224303-6c9668.jpg and /dev/null differ diff --git a/picture/pictures/yuadmin/2025/07/06/20250706211833-cd4530.jpg b/picture/pictures/yuadmin/2025/07/06/20250706211833-cd4530.jpg deleted file mode 100644 index 035e677..0000000 Binary files a/picture/pictures/yuadmin/2025/07/06/20250706211833-cd4530.jpg and /dev/null differ diff --git a/picture/pictures/yuadmin/2025/07/06/20250706211840-3766ed.jpg b/picture/pictures/yuadmin/2025/07/06/20250706211840-3766ed.jpg deleted file mode 100644 index 035e677..0000000 Binary files a/picture/pictures/yuadmin/2025/07/06/20250706211840-3766ed.jpg and /dev/null differ diff --git a/picture/pictures/yuadmin/2025/07/06/20250706212030-40ac11.jpg b/picture/pictures/yuadmin/2025/07/06/20250706212030-40ac11.jpg deleted file mode 100644 index 035e677..0000000 Binary files a/picture/pictures/yuadmin/2025/07/06/20250706212030-40ac11.jpg and /dev/null differ diff --git a/picture/pictures/yuadmin/2025/07/06/20250706212100-1a6776.jpg b/picture/pictures/yuadmin/2025/07/06/20250706212100-1a6776.jpg deleted file mode 100644 index 035e677..0000000 Binary files a/picture/pictures/yuadmin/2025/07/06/20250706212100-1a6776.jpg and /dev/null differ diff --git a/picture/pictures/yuadmin/2025/07/06/20250706213204-420924.png b/picture/pictures/yuadmin/2025/07/06/20250706213204-420924.png deleted file mode 100644 index 6b210bc..0000000 Binary files a/picture/pictures/yuadmin/2025/07/06/20250706213204-420924.png and /dev/null differ diff --git a/picture/pictures/yuadmin/2025/07/06/20250706213936-2ea1ff.jpg b/picture/pictures/yuadmin/2025/07/06/20250706213936-2ea1ff.jpg deleted file mode 100644 index 960914e..0000000 Binary files a/picture/pictures/yuadmin/2025/07/06/20250706213936-2ea1ff.jpg and /dev/null differ diff --git a/picture/pictures/yuadmin/2025/07/06/20250706214126-c32667.jpg b/picture/pictures/yuadmin/2025/07/06/20250706214126-c32667.jpg deleted file mode 100644 index 035e677..0000000 Binary files a/picture/pictures/yuadmin/2025/07/06/20250706214126-c32667.jpg and /dev/null differ diff --git a/picture/pictures/yuadmin/2025/07/06/20250706214853-29a2e0.jpg b/picture/pictures/yuadmin/2025/07/06/20250706214853-29a2e0.jpg deleted file mode 100644 index 227d1c5..0000000 Binary files a/picture/pictures/yuadmin/2025/07/06/20250706214853-29a2e0.jpg and /dev/null differ diff --git a/picture/pictures/yuadmin/2025/07/06/20250706215438-91fde9.jpg b/picture/pictures/yuadmin/2025/07/06/20250706215438-91fde9.jpg deleted file mode 100644 index 035e677..0000000 Binary files a/picture/pictures/yuadmin/2025/07/06/20250706215438-91fde9.jpg and /dev/null differ diff --git a/script/README.md b/script/README.md new file mode 100644 index 0000000..317384d --- /dev/null +++ b/script/README.md @@ -0,0 +1,221 @@ +# 项目重构自动化脚本 + +这是一套用于Maven项目重构的自动化脚本,可以批量修改项目的包名、groupId、artifactId、模块名称等,让你轻松地将一个项目模板改造为新的项目。 + +## 功能特性 + +🚀 **全自动重构**: 一键修改项目中的所有相关配置 +📦 **多文件支持**: 支持修改POM文件、Java源码、XML映射文件、配置文件 +🗂️ **目录重构**: 自动重命名Java包目录和模块目录 +🔧 **可视化界面**: 友好的命令行交互界面 +💾 **安全备份**: 可选的项目备份功能 +⚡ **批量处理**: 支持配置文件批量重构 + +## 文件说明 + +``` +script/ +├── project-refactor.sh # 主重构脚本(交互式) +├── batch-refactor.sh # 批量重构脚本(配置文件) +├── refactor-config.example # 配置文件模板 +└── README.md # 使用说明(本文件) +``` + +## 使用方法 + +### 方法一:交互式重构(推荐新手) + +```bash +# 进入脚本目录 +cd script + +# 运行交互式重构脚本 +./project-refactor.sh +``` + +脚本会引导你输入以下信息: +- 项目根目录路径 +- 旧的 GroupId(如:org.leocoder.thin) +- 旧的 ArtifactId(如:coder-common-thin-backend) +- 旧的模块前缀(如:coder-common-thin) +- 新的 GroupId(如:org.leocoder.course) +- 新的 ArtifactId(如:coder-course-backend) +- 新的模块前缀(如:coder-course) +- 数据库名称(可选) + +### 方法二:配置文件批量重构(推荐批量处理) + +```bash +# 1. 复制配置文件模板 +cp refactor-config.example my-project.conf + +# 2. 编辑配置文件 +vim my-project.conf + +# 3. 运行批量重构 +./batch-refactor.sh my-project.conf +``` + +#### 配置文件格式 + +```bash +# 项目基本信息 +PROJECT_DIR="/path/to/your/project" + +# 旧配置 +OLD_GROUP_ID="org.leocoder.thin" +OLD_ARTIFACT_ID="coder-common-thin-backend" +OLD_MODULE_PREFIX="coder-common-thin" +OLD_DATABASE_NAME="coder-common-thin" + +# 新配置 +NEW_GROUP_ID="org.leocoder.course" +NEW_ARTIFACT_ID="coder-course-backend" +NEW_MODULE_PREFIX="coder-course" +NEW_DATABASE_NAME="coder-course" + +# 其他选项 +CREATE_BACKUP="true" # 是否创建备份 +AUTO_CONFIRM="false" # 是否自动确认(跳过确认步骤) +``` + +## 重构内容 + +脚本会自动处理以下内容: + +### 1. POM文件修改 +- ✅ 修改根POM和所有子模块的 `` +- ✅ 修改根POM和所有子模块的 `` +- ✅ 修改 `` 标签 +- ✅ 修改 `` 引用 +- ✅ 修改依赖引用中的groupId和artifactId + +### 2. Java源码修改 +- ✅ 修改所有Java文件的 `package` 声明 +- ✅ 修改所有Java文件的 `import` 语句 +- ✅ 修改注解中的包名引用(如@SpringBootApplication的scanBasePackages) + +### 3. XML映射文件 +- ✅ 修改MyBatis Mapper文件的 `namespace` +- ✅ 修改 `resultType` 中的包名引用 + +### 4. 配置文件 +- ✅ 修改YAML/Properties文件中的包扫描配置 +- ✅ 修改数据库连接配置中的数据库名 +- ✅ 修改文件路径配置 + +### 5. 目录结构重构 +- ✅ 重命名Java包目录结构(src/main/java/com/old/package → src/main/java/com/new/package) +- ✅ 重命名模块目录(old-module-name → new-module-name) +- ✅ 重命名SQL文件 + +## 使用示例 + +### 示例1:从通用框架改造为选课系统 + +```bash +# 交互式输入 +./project-refactor.sh + +# 输入示例: +# 项目路径: /Users/leocoder/my-project +# 旧的 GroupId: org.leocoder.thin +# 旧的 ArtifactId: coder-common-thin-backend +# 旧的模块前缀: coder-common-thin +# 新的 GroupId: org.leocoder.course +# 新的 ArtifactId: coder-course-backend +# 新的模块前缀: coder-course +``` + +### 示例2:批量处理多个项目 + +```bash +# 为选课系统创建配置 +cat > course-system.conf << EOF +PROJECT_DIR="/Users/leocoder/course-project" +OLD_GROUP_ID="org.leocoder.thin" +OLD_ARTIFACT_ID="coder-common-thin-backend" +OLD_MODULE_PREFIX="coder-common-thin" +NEW_GROUP_ID="org.leocoder.course" +NEW_ARTIFACT_ID="coder-course-backend" +NEW_MODULE_PREFIX="coder-course" +CREATE_BACKUP="true" +AUTO_CONFIRM="false" +EOF + +# 为库存系统创建配置 +cat > inventory-system.conf << EOF +PROJECT_DIR="/Users/leocoder/inventory-project" +OLD_GROUP_ID="org.leocoder.thin" +OLD_ARTIFACT_ID="coder-common-thin-backend" +OLD_MODULE_PREFIX="coder-common-thin" +NEW_GROUP_ID="org.leocoder.inventory" +NEW_ARTIFACT_ID="coder-inventory-backend" +NEW_MODULE_PREFIX="coder-inventory" +CREATE_BACKUP="true" +AUTO_CONFIRM="false" +EOF + +# 执行批量重构 +./batch-refactor.sh course-system.conf +./batch-refactor.sh inventory-system.conf +``` + +## 注意事项 + +⚠️ **重要提醒**: +1. **备份项目**: 重构前强烈建议备份整个项目 +2. **关闭IDE**: 重构期间请关闭IDE,避免文件锁定 +3. **检查结果**: 重构完成后请检查项目能否正常编译运行 +4. **更新配置**: 检查IDE的运行配置是否需要更新 + +### 重构后需要手动检查的项目 +- [ ] IDE中的运行配置(主类路径) +- [ ] 数据库连接配置 +- [ ] 第三方服务配置 +- [ ] 测试用例 +- [ ] 文档更新 + +## 故障排除 + +### 常见问题 + +**Q: 脚本执行后项目无法启动?** +A: 检查IDE的运行配置,确保主类路径已更新为新的包名。 + +**Q: 某些文件没有被修改?** +A: 检查文件是否在target目录下,脚本会跳过编译输出目录。 + +**Q: 包名格式验证失败?** +A: 确保包名符合Java命名规范,只能包含字母、数字、下划线和点号。 + +**Q: 权限被拒绝?** +A: 确保脚本有执行权限:`chmod +x *.sh` + +### 调试技巧 + +1. **查看详细日志**: 脚本会显示处理的文件信息 +2. **检查备份**: 如果出现问题,可以从备份恢复 +3. **分步执行**: 可以注释掉脚本中的某些步骤来分步调试 + +## 扩展功能 + +你可以根据需要扩展脚本功能: + +1. **添加新的文件类型**: 在相应的函数中添加处理逻辑 +2. **自定义替换规则**: 修改sed命令的正则表达式 +3. **集成到CI/CD**: 将脚本集成到自动化流水线中 + +## 贡献 + +如果你发现bug或有改进建议,请提交issue或pull request。 + +## 许可证 + +MIT License + +--- + +**作者**: Leocoder +**版本**: 1.0 +**最后更新**: 2025-07-06 \ No newline at end of file diff --git a/script/batch-refactor.sh b/script/batch-refactor.sh new file mode 100755 index 0000000..7b61183 --- /dev/null +++ b/script/batch-refactor.sh @@ -0,0 +1,189 @@ +#!/bin/bash + +# 批量重构脚本 - 使用配置文件进行批量重构 +# Author: Leocoder +# Version: 1.0 + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +CYAN='\033[0;36m' +WHITE='\033[1;37m' +NC='\033[0m' # No Color + +print_success() { + echo -e "${GREEN}✓ $1${NC}" +} + +print_error() { + echo -e "${RED}✗ $1${NC}" +} + +print_info() { + echo -e "${PURPLE}ℹ $1${NC}" +} + +print_warning() { + echo -e "${YELLOW}⚠ $1${NC}" +} + +# 检查配置文件 +check_config_file() { + local config_file="$1" + + if [ ! -f "$config_file" ]; then + print_error "配置文件不存在: $config_file" + echo "" + echo "请先创建配置文件:" + echo "1. 复制 refactor-config.example 为 refactor-config.conf" + echo "2. 编辑 refactor-config.conf 设置正确的值" + echo "3. 运行: ./batch-refactor.sh refactor-config.conf" + exit 1 + fi +} + +# 加载配置文件 +load_config() { + local config_file="$1" + + print_info "加载配置文件: $config_file" + + # 读取配置文件 + source "$config_file" + + # 验证必需的配置项 + local required_vars=("PROJECT_DIR" "OLD_GROUP_ID" "NEW_GROUP_ID" "OLD_ARTIFACT_ID" "NEW_ARTIFACT_ID" "OLD_MODULE_PREFIX" "NEW_MODULE_PREFIX") + + for var in "${required_vars[@]}"; do + if [ -z "${!var}" ]; then + print_error "配置项 $var 未设置" + exit 1 + fi + done + + print_success "配置加载成功" +} + +# 显示配置信息 +show_config() { + echo "" + echo -e "${WHITE}批量重构配置:${NC}" + echo -e "${CYAN}项目目录:${NC} $PROJECT_DIR" + echo -e "${CYAN}旧 GroupId:${NC} $OLD_GROUP_ID" + echo -e "${CYAN}新 GroupId:${NC} $NEW_GROUP_ID" + echo -e "${CYAN}旧 ArtifactId:${NC} $OLD_ARTIFACT_ID" + echo -e "${CYAN}新 ArtifactId:${NC} $NEW_ARTIFACT_ID" + echo -e "${CYAN}旧模块前缀:${NC} $OLD_MODULE_PREFIX" + echo -e "${CYAN}新模块前缀:${NC} $NEW_MODULE_PREFIX" + + if [ -n "$OLD_DATABASE_NAME" ]; then + echo -e "${CYAN}旧数据库名:${NC} $OLD_DATABASE_NAME" + echo -e "${CYAN}新数据库名:${NC} $NEW_DATABASE_NAME" + fi + + echo "" +} + +# 执行重构 +execute_refactor() { + local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + local refactor_script="$script_dir/project-refactor.sh" + + if [ ! -f "$refactor_script" ]; then + print_error "重构脚本不存在: $refactor_script" + exit 1 + fi + + # 创建临时输入文件 + local temp_input=$(mktemp) + + # 生成自动化输入 + cat > "$temp_input" << EOF +$PROJECT_DIR +$OLD_GROUP_ID +$OLD_ARTIFACT_ID +$OLD_MODULE_PREFIX +$NEW_GROUP_ID +$NEW_ARTIFACT_ID +$NEW_MODULE_PREFIX +$OLD_DATABASE_NAME +$NEW_DATABASE_NAME +y +EOF + + if [ "$CREATE_BACKUP" = "true" ]; then + echo "y" >> "$temp_input" + else + echo "n" >> "$temp_input" + fi + + # 执行重构脚本 + print_info "开始执行重构..." + "$refactor_script" < "$temp_input" + + # 清理临时文件 + rm -f "$temp_input" + + if [ $? -eq 0 ]; then + print_success "批量重构完成!" + else + print_error "重构过程中出现错误" + exit 1 + fi +} + +# 主函数 +main() { + echo -e "${CYAN}" + echo "╔══════════════════════════════════════════════════════════════════════════════╗" + echo "║ 批量重构脚本 ║" + echo "║ Batch Refactoring Tool ║" + echo "╚══════════════════════════════════════════════════════════════════════════════╝" + echo -e "${NC}" + + local config_file="$1" + + if [ -z "$config_file" ]; then + config_file="refactor-config.conf" + print_info "使用默认配置文件: $config_file" + fi + + check_config_file "$config_file" + load_config "$config_file" + show_config + + if [ "$AUTO_CONFIRM" != "true" ]; then + echo -e "${YELLOW}警告: 此操作将修改项目中的所有相关文件!${NC}" + read -p "是否继续? (y/N): " confirm + if [[ ! "$confirm" =~ ^[Yy]$ ]]; then + print_info "操作已取消" + exit 0 + fi + fi + + execute_refactor +} + +# 使用说明 +usage() { + echo "使用方法:" + echo " $0 [配置文件]" + echo "" + echo "示例:" + echo " $0 # 使用默认配置文件 refactor-config.conf" + echo " $0 my-project-config.conf # 使用指定配置文件" + echo "" + echo "配置文件格式请参考 refactor-config.example" +} + +# 参数检查 +if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then + usage + exit 0 +fi + +# 执行主函数 +main "$@" \ No newline at end of file diff --git a/script/demo.sh b/script/demo.sh new file mode 100755 index 0000000..ddcfb18 --- /dev/null +++ b/script/demo.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +# 演示脚本 - 快速测试重构功能 +# Author: Leocoder + +# 颜色定义 +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +NC='\033[0m' + +echo -e "${BLUE}" +echo "╔══════════════════════════════════════════════════════════════════════════════╗" +echo "║ 项目重构脚本演示 ║" +echo "╚══════════════════════════════════════════════════════════════════════════════╝" +echo -e "${NC}" + +echo -e "${GREEN}🚀 项目重构自动化脚本已就绪!${NC}" +echo "" +echo "包含以下脚本文件:" +echo "├── project-refactor.sh (交互式重构脚本)" +echo "├── batch-refactor.sh (批量重构脚本)" +echo "├── refactor-config.example (配置文件模板)" +echo "├── README.md (详细使用说明)" +echo "└── demo.sh (演示脚本)" +echo "" + +echo -e "${YELLOW}快速使用方法:${NC}" +echo "" +echo "1️⃣ 交互式重构(推荐新手):" +echo " ./project-refactor.sh" +echo "" +echo "2️⃣ 批量重构(推荐批量处理):" +echo " cp refactor-config.example my-config.conf" +echo " vim my-config.conf # 编辑配置" +echo " ./batch-refactor.sh my-config.conf" +echo "" + +echo -e "${GREEN}✨ 脚本功能特性:${NC}" +echo "• 🔄 自动修改 Maven POM 文件" +echo "• 📦 批量更新 Java 包名和 import" +echo "• 🗂️ 重命名目录结构" +echo "• ⚙️ 更新配置文件" +echo "• 🗃️ 处理 MyBatis XML 映射" +echo "• 💾 可选项目备份" +echo "• 📊 详细的进度显示" +echo "" + +echo -e "${YELLOW}查看完整使用说明:${NC}" +echo "cat README.md" +echo "" + +echo -e "${GREEN}🎯 现在你可以轻松地将任何 Maven 项目重构为新项目!${NC}" \ No newline at end of file diff --git a/script/project-refactor.sh b/script/project-refactor.sh new file mode 100755 index 0000000..d787c73 --- /dev/null +++ b/script/project-refactor.sh @@ -0,0 +1,481 @@ +#!/bin/bash + +# 项目重构脚本 - 自动化修改包名、groupId、artifactId +# Author: Leocoder +# Version: 1.0 + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +CYAN='\033[0;36m' +WHITE='\033[1;37m' +NC='\033[0m' # No Color + +# 全局变量 +PROJECT_DIR="" +OLD_GROUP_ID="" +NEW_GROUP_ID="" +OLD_ARTIFACT_ID="" +NEW_ARTIFACT_ID="" +OLD_PACKAGE="" +NEW_PACKAGE="" +OLD_MODULE_PREFIX="" +NEW_MODULE_PREFIX="" +OLD_DATABASE_NAME="" +NEW_DATABASE_NAME="" + +# 打印banner +print_banner() { + echo -e "${CYAN}" + echo "╔══════════════════════════════════════════════════════════════════════════════╗" + echo "║ 项目重构自动化脚本 ║" + echo "║ Project Refactoring Tool ║" + echo "║ Version 1.0 ║" + echo "╚══════════════════════════════════════════════════════════════════════════════╝" + echo -e "${NC}" +} + +# 打印步骤标题 +print_step() { + echo -e "${BLUE}════════════════════════════════════════════════════════════════════════════════${NC}" + echo -e "${WHITE}$1${NC}" + echo -e "${BLUE}════════════════════════════════════════════════════════════════════════════════${NC}" +} + +# 打印成功信息 +print_success() { + echo -e "${GREEN}✓ $1${NC}" +} + +# 打印警告信息 +print_warning() { + echo -e "${YELLOW}⚠ $1${NC}" +} + +# 打印错误信息 +print_error() { + echo -e "${RED}✗ $1${NC}" +} + +# 打印信息 +print_info() { + echo -e "${PURPLE}ℹ $1${NC}" +} + +# 验证输入 +validate_input() { + local input="$1" + local pattern="$2" + local description="$3" + + if [[ ! "$input" =~ $pattern ]]; then + print_error "$description 格式不正确: $input" + return 1 + fi + return 0 +} + +# 获取用户输入 +get_user_input() { + print_step "步骤 1: 获取重构参数" + + # 获取项目根目录 + echo -e "${CYAN}请输入项目根目录路径 (默认: 当前目录):${NC}" + read -p "项目路径: " PROJECT_DIR + if [ -z "$PROJECT_DIR" ]; then + PROJECT_DIR="$(pwd)" + fi + + # 检查项目目录是否存在 + if [ ! -d "$PROJECT_DIR" ]; then + print_error "项目目录不存在: $PROJECT_DIR" + exit 1 + fi + + # 检查是否是Maven项目 + if [ ! -f "$PROJECT_DIR/pom.xml" ]; then + print_error "这不是一个Maven项目 (未找到pom.xml)" + exit 1 + fi + + print_success "项目目录: $PROJECT_DIR" + + echo "" + echo -e "${CYAN}请输入旧的配置信息:${NC}" + + # 获取旧的groupId + read -p "旧的 GroupId (例如: org.leocoder.thin): " OLD_GROUP_ID + validate_input "$OLD_GROUP_ID" "^[a-zA-Z][a-zA-Z0-9_]*(\.[a-zA-Z][a-zA-Z0-9_]*)*$" "GroupId" + if [ $? -ne 0 ]; then exit 1; fi + + # 获取旧的artifactId + read -p "旧的 ArtifactId (例如: coder-common-thin-backend): " OLD_ARTIFACT_ID + validate_input "$OLD_ARTIFACT_ID" "^[a-zA-Z][a-zA-Z0-9_-]*$" "ArtifactId" + if [ $? -ne 0 ]; then exit 1; fi + + # 获取旧的模块前缀 + read -p "旧的模块前缀 (例如: coder-common-thin): " OLD_MODULE_PREFIX + validate_input "$OLD_MODULE_PREFIX" "^[a-zA-Z][a-zA-Z0-9_-]*$" "模块前缀" + if [ $? -ne 0 ]; then exit 1; fi + + echo "" + echo -e "${CYAN}请输入新的配置信息:${NC}" + + # 获取新的groupId + read -p "新的 GroupId (例如: org.leocoder.course): " NEW_GROUP_ID + validate_input "$NEW_GROUP_ID" "^[a-zA-Z][a-zA-Z0-9_]*(\.[a-zA-Z][a-zA-Z0-9_]*)*$" "GroupId" + if [ $? -ne 0 ]; then exit 1; fi + + # 获取新的artifactId + read -p "新的 ArtifactId (例如: coder-course-backend): " NEW_ARTIFACT_ID + validate_input "$NEW_ARTIFACT_ID" "^[a-zA-Z][a-zA-Z0-9_-]*$" "ArtifactId" + if [ $? -ne 0 ]; then exit 1; fi + + # 获取新的模块前缀 + read -p "新的模块前缀 (例如: coder-course): " NEW_MODULE_PREFIX + validate_input "$NEW_MODULE_PREFIX" "^[a-zA-Z][a-zA-Z0-9_-]*$" "模块前缀" + if [ $? -ne 0 ]; then exit 1; fi + + # 获取数据库名称(可选) + echo "" + echo -e "${CYAN}数据库配置 (可选):${NC}" + read -p "旧的数据库名称 (留空跳过): " OLD_DATABASE_NAME + if [ -n "$OLD_DATABASE_NAME" ]; then + read -p "新的数据库名称: " NEW_DATABASE_NAME + if [ -z "$NEW_DATABASE_NAME" ]; then + print_warning "新数据库名称为空,将跳过数据库配置修改" + OLD_DATABASE_NAME="" + fi + fi + + # 设置包名 + OLD_PACKAGE="$OLD_GROUP_ID" + NEW_PACKAGE="$NEW_GROUP_ID" +} + +# 显示配置摘要 +show_summary() { + print_step "步骤 2: 配置摘要" + + echo -e "${WHITE}重构配置摘要:${NC}" + echo -e "${CYAN}项目目录:${NC} $PROJECT_DIR" + echo -e "${CYAN}旧 GroupId:${NC} $OLD_GROUP_ID" + echo -e "${CYAN}新 GroupId:${NC} $NEW_GROUP_ID" + echo -e "${CYAN}旧 ArtifactId:${NC} $OLD_ARTIFACT_ID" + echo -e "${CYAN}新 ArtifactId:${NC} $NEW_ARTIFACT_ID" + echo -e "${CYAN}旧模块前缀:${NC} $OLD_MODULE_PREFIX" + echo -e "${CYAN}新模块前缀:${NC} $NEW_MODULE_PREFIX" + echo -e "${CYAN}旧包名:${NC} $OLD_PACKAGE" + echo -e "${CYAN}新包名:${NC} $NEW_PACKAGE" + + if [ -n "$OLD_DATABASE_NAME" ]; then + echo -e "${CYAN}旧数据库名:${NC} $OLD_DATABASE_NAME" + echo -e "${CYAN}新数据库名:${NC} $NEW_DATABASE_NAME" + fi + + echo "" + echo -e "${YELLOW}警告: 此操作将修改项目中的所有相关文件,建议先备份项目!${NC}" + echo "" + read -p "是否继续? (y/N): " confirm + if [[ ! "$confirm" =~ ^[Yy]$ ]]; then + print_info "操作已取消" + exit 0 + fi +} + +# 备份项目 +backup_project() { + print_step "步骤 3: 备份项目" + + local backup_dir="${PROJECT_DIR}_backup_$(date +%Y%m%d_%H%M%S)" + + echo -e "${CYAN}是否创建项目备份?${NC}" + read -p "创建备份到 $backup_dir (Y/n): " create_backup + + if [[ "$create_backup" =~ ^[Nn]$ ]]; then + print_warning "跳过备份步骤" + return + fi + + print_info "正在创建备份..." + cp -r "$PROJECT_DIR" "$backup_dir" + + if [ $? -eq 0 ]; then + print_success "备份创建成功: $backup_dir" + else + print_error "备份创建失败" + exit 1 + fi +} + +# 修改POM文件 +update_pom_files() { + print_step "步骤 4: 修改 POM 文件" + + local pom_files=$(find "$PROJECT_DIR" -name "pom.xml" -type f) + local count=0 + + for pom_file in $pom_files; do + print_info "处理: $(basename $(dirname $pom_file))/pom.xml" + + # 创建临时文件 + local temp_file=$(mktemp) + + # 修改groupId和artifactId + sed "s|$OLD_GROUP_ID|$NEW_GROUP_ID|g" "$pom_file" | \ + sed "s|$OLD_ARTIFACT_ID|$NEW_ARTIFACT_ID|g" | \ + sed "s|$OLD_ARTIFACT_ID|$NEW_ARTIFACT_ID|g" | \ + sed "s|$OLD_MODULE_PREFIX-|$NEW_MODULE_PREFIX-|g" | \ + sed "s|$OLD_MODULE_PREFIX-|$NEW_MODULE_PREFIX-|g" | \ + sed "s|$OLD_MODULE_PREFIX-|$NEW_MODULE_PREFIX-|g" > "$temp_file" + + # 替换原文件 + mv "$temp_file" "$pom_file" + + ((count++)) + done + + print_success "已修改 $count 个 POM 文件" +} + +# 修改Java文件包名 +update_java_packages() { + print_step "步骤 5: 修改 Java 包名" + + local java_files=$(find "$PROJECT_DIR" -name "*.java" -type f) + local count=0 + + # 转换包名格式(用于文件内容替换) + local old_package_escaped=$(echo "$OLD_PACKAGE" | sed 's/\./\\./g') + local new_package_escaped="$NEW_PACKAGE" + + for java_file in $java_files; do + if grep -q "$OLD_PACKAGE" "$java_file"; then + print_info "处理: $(basename $java_file)" + + # 修改package声明和import语句 + sed -i.bak "s|$old_package_escaped|$new_package_escaped|g" "$java_file" + + # 删除备份文件 + rm -f "${java_file}.bak" + + ((count++)) + fi + done + + print_success "已修改 $count 个 Java 文件" +} + +# 修改XML映射文件 +update_xml_files() { + print_step "步骤 6: 修改 XML 映射文件" + + local xml_files=$(find "$PROJECT_DIR" -name "*.xml" -type f | grep -E "(mapper|mybatis)") + local count=0 + + if [ -z "$xml_files" ]; then + print_info "未找到需要修改的XML映射文件" + return + fi + + local old_package_escaped=$(echo "$OLD_PACKAGE" | sed 's/\./\\./g') + + for xml_file in $xml_files; do + if grep -q "$OLD_PACKAGE" "$xml_file"; then + print_info "处理: $(basename $xml_file)" + + # 修改namespace和resultType + sed -i.bak "s|$old_package_escaped|$NEW_PACKAGE|g" "$xml_file" + + # 删除备份文件 + rm -f "${xml_file}.bak" + + ((count++)) + fi + done + + print_success "已修改 $count 个 XML 文件" +} + +# 修改配置文件 +update_config_files() { + print_step "步骤 7: 修改配置文件" + + local config_files=$(find "$PROJECT_DIR" -name "*.yml" -o -name "*.yaml" -o -name "*.properties" | grep -v target) + local count=0 + + local old_package_escaped=$(echo "$OLD_PACKAGE" | sed 's/\./\\./g') + + for config_file in $config_files; do + local modified=false + + # 修改包扫描配置 + if grep -q "$OLD_PACKAGE" "$config_file"; then + sed -i.bak "s|$old_package_escaped|$NEW_PACKAGE|g" "$config_file" + modified=true + fi + + # 修改数据库配置 + if [ -n "$OLD_DATABASE_NAME" ] && grep -q "$OLD_DATABASE_NAME" "$config_file"; then + sed -i.bak "s|$OLD_DATABASE_NAME|$NEW_DATABASE_NAME|g" "$config_file" + modified=true + fi + + if [ "$modified" = true ]; then + print_info "处理: $(basename $config_file)" + rm -f "${config_file}.bak" + ((count++)) + fi + done + + print_success "已修改 $count 个配置文件" +} + +# 重命名目录结构 +rename_directories() { + print_step "步骤 8: 重命名目录结构" + + # 重命名Java包目录 + print_info "重命名Java包目录结构..." + + # 将点分隔的包名转换为路径 + local old_package_path=$(echo "$OLD_PACKAGE" | tr '.' '/') + local new_package_path=$(echo "$NEW_PACKAGE" | tr '.' '/') + + # 查找所有需要重命名的包目录 + local package_dirs=$(find "$PROJECT_DIR" -type d -path "*/java/$old_package_path" 2>/dev/null) + + for package_dir in $package_dirs; do + local parent_dir=$(dirname "$package_dir") + local new_package_dir="$parent_dir/$new_package_path" + + # 创建新的目录结构 + mkdir -p "$(dirname $new_package_dir)" + + # 移动内容 + if [ "$package_dir" != "$new_package_dir" ]; then + print_info "移动: $package_dir -> $new_package_dir" + mv "$package_dir" "$new_package_dir" 2>/dev/null || { + # 如果直接移动失败,尝试复制后删除 + cp -r "$package_dir" "$new_package_dir" + rm -rf "$package_dir" + } + fi + done + + # 重命名模块目录 + print_info "重命名模块目录..." + local module_dirs=$(find "$PROJECT_DIR" -maxdepth 2 -type d -name "$OLD_MODULE_PREFIX-*" 2>/dev/null) + + for module_dir in $module_dirs; do + local parent_dir=$(dirname "$module_dir") + local old_name=$(basename "$module_dir") + local new_name=$(echo "$old_name" | sed "s/^$OLD_MODULE_PREFIX-/$NEW_MODULE_PREFIX-/") + local new_module_dir="$parent_dir/$new_name" + + if [ "$module_dir" != "$new_module_dir" ]; then + print_info "重命名模块: $old_name -> $new_name" + mv "$module_dir" "$new_module_dir" + fi + done + + print_success "目录重命名完成" +} + +# 重命名SQL文件 +rename_sql_files() { + print_step "步骤 9: 重命名 SQL 文件" + + local sql_files=$(find "$PROJECT_DIR" -name "*.sql" -type f | grep -i "$OLD_MODULE_PREFIX") + local count=0 + + if [ -z "$sql_files" ]; then + print_info "未找到需要重命名的SQL文件" + return + fi + + for sql_file in $sql_files; do + local dir_name=$(dirname "$sql_file") + local old_name=$(basename "$sql_file") + local new_name=$(echo "$old_name" | sed "s/$OLD_MODULE_PREFIX/$NEW_MODULE_PREFIX/g") + local new_sql_file="$dir_name/$new_name" + + if [ "$sql_file" != "$new_sql_file" ]; then + print_info "重命名SQL文件: $old_name -> $new_name" + mv "$sql_file" "$new_sql_file" + ((count++)) + fi + done + + print_success "已重命名 $count 个 SQL 文件" +} + +# 清理临时文件 +cleanup() { + print_step "步骤 10: 清理和验证" + + # 清理可能遗留的备份文件 + find "$PROJECT_DIR" -name "*.bak" -type f -delete 2>/dev/null + + # 显示统计信息 + local java_files_count=$(find "$PROJECT_DIR" -name "*.java" -type f | wc -l) + local pom_files_count=$(find "$PROJECT_DIR" -name "pom.xml" -type f | wc -l) + local xml_files_count=$(find "$PROJECT_DIR" -name "*.xml" -type f | grep -E "(mapper|mybatis)" | wc -l) + + echo "" + echo -e "${WHITE}重构统计:${NC}" + echo -e "${CYAN}Java 文件:${NC} $java_files_count" + echo -e "${CYAN}POM 文件:${NC} $pom_files_count" + echo -e "${CYAN}XML 映射文件:${NC} $xml_files_count" + + print_success "清理完成" +} + +# 主函数 +main() { + # 检查依赖 + if ! command -v sed &> /dev/null; then + print_error "sed 命令未找到,请安装 sed" + exit 1 + fi + + print_banner + + get_user_input + show_summary + backup_project + + # 进入项目目录 + cd "$PROJECT_DIR" || exit 1 + + # 执行重构步骤 + update_pom_files + update_java_packages + update_xml_files + update_config_files + rename_directories + rename_sql_files + cleanup + + print_step "🎉 重构完成!" + + echo -e "${GREEN}" + echo "╔══════════════════════════════════════════════════════════════════════════════╗" + echo "║ 重构成功完成! ║" + echo "║ ║" + echo "║ 项目已成功从 $OLD_GROUP_ID 重构为 $NEW_GROUP_ID" + echo "║ ║" + echo "║ 下一步建议: ║" + echo "║ 1. 检查IDE中的运行配置 ║" + echo "║ 2. 更新数据库连接配置 ║" + echo "║ 3. 清理并重新编译项目 ║" + echo "║ 4. 测试项目是否正常运行 ║" + echo "╚══════════════════════════════════════════════════════════════════════════════╝" + echo -e "${NC}" +} + +# 脚本入口 +main "$@" \ No newline at end of file diff --git a/script/refactor-config.example b/script/refactor-config.example new file mode 100644 index 0000000..7857b77 --- /dev/null +++ b/script/refactor-config.example @@ -0,0 +1,21 @@ +# 项目重构配置文件示例 +# 复制此文件为 refactor-config.conf 并修改相应值 + +# 项目基本信息 +PROJECT_DIR="/path/to/your/project" + +# 旧配置 +OLD_GROUP_ID="org.leocoder.thin" +OLD_ARTIFACT_ID="coder-common-thin-backend" +OLD_MODULE_PREFIX="coder-common-thin" +OLD_DATABASE_NAME="coder-common-thin" + +# 新配置 +NEW_GROUP_ID="org.leocoder.course" +NEW_ARTIFACT_ID="coder-course-backend" +NEW_MODULE_PREFIX="coder-course" +NEW_DATABASE_NAME="coder-course" + +# 其他选项 +CREATE_BACKUP="true" +AUTO_CONFIRM="false" \ No newline at end of file