From f262820a76b386bf7a479d42bba35f9be084dbd5 Mon Sep 17 00:00:00 2001 From: Leo <98382335+gaoziman@users.noreply.github.com> Date: Mon, 22 Sep 2025 23:10:11 +0800 Subject: [PATCH] =?UTF-8?q?docs(script):=20=E6=96=B0=E5=A2=9E=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E8=84=9A=E6=9C=AC=E5=92=8C=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增script/README.md脚本使用说明文档 - 新增script/project-template-refactor.sh项目模板重构脚本 - 完善脚本工具集,提高开发效率 --- script/README.md | 242 ++++++++++++ script/project-template-refactor.sh | 567 ++++++++++++++++++++++++++++ 2 files changed, 809 insertions(+) create mode 100644 script/README.md create mode 100755 script/project-template-refactor.sh diff --git a/script/README.md b/script/README.md new file mode 100644 index 0000000..989512d --- /dev/null +++ b/script/README.md @@ -0,0 +1,242 @@ +# 项目模板重构脚本 + +这是一个用于将 `coder-common-thin-backend` 项目重构为新项目模板的自动化脚本。 + +## 功能特性 + +🚀 **全自动重构**:一键完成整个项目的重构过程 +📁 **目录重命名**:自动重命名所有模块目录和子模块目录 +📦 **Maven配置**:更新所有 pom.xml 文件中的 groupId、artifactId 和模块名 +☕ **Java包结构**:重构所有 Java 文件的包名和 import 语句 +⚙️ **配置文件**:更新所有配置文件中的包名引用 +🗄️ **数据库配置**:重命名 SQL 文件和更新数据库名引用 +🔄 **多层级支持**:支持插件模块等多层级子模块结构 + +## 使用方法 + +### 1. 进入脚本目录 +```bash +cd /Users/leocoder/leocoder/develop/frameworks/coder-common-thin/coder-common-thin-backend/script +``` + +### 2. 执行重构脚本 +```bash +./project-template-refactor.sh +``` + +### 3. 按提示输入新项目信息 +脚本会提示你输入以下信息: +- **新项目名称**:例如 `my-project-backend` +- **新的GroupId**:例如 `com.company.project` +- **新的包名**:例如 `com.company.project` +- **新的模块前缀**:例如 `my-project` +- **新的数据库名**:例如 `my_project_db` + +### 4. 确认配置并开始重构 +脚本会显示所有配置信息供你确认,输入 `y` 开始重构。 + +## 重构内容详解 + +### 📁 目录结构重构 +**原始结构:** +``` +/parent-directory/ +└── coder-common-thin-backend/ ← 项目根目录 + ├── coder-common-thin-web/ + ├── coder-common-thin-common/ + ├── coder-common-thin-model/ + ├── coder-common-thin-mybatisplus/ + ├── coder-common-thin-modules/ + ├── coder-common-thin-plugins/ + │ ├── coder-common-thin-easyexcel/ + │ ├── coder-common-thin-oss/ + │ ├── coder-common-thin-sa-token/ + │ └── ...其他插件模块 + └── sql/ + └── coder-common-thin.sql +``` + +**重构后结构(以 my-project-backend 为例):** +``` +/parent-directory/ +├── coder-common-thin-backend_backup_* ← 自动创建的备份 +└── my-project-backend/ ← 重命名后的项目根目录 + ├── my-project-web/ + ├── my-project-common/ + ├── my-project-model/ + ├── my-project-mybatisplus/ + ├── my-project-modules/ + ├── my-project-plugins/ + │ ├── my-project-easyexcel/ + │ ├── my-project-oss/ + │ ├── my-project-sa-token/ + │ └── ...其他插件模块 + └── sql/ + └── my_project_db.sql +``` + +⭐ **v1.2.0 新特性**:脚本现在会自动重命名项目根目录,无需手动操作! + +### 📦 Maven 配置重构 +- **groupId**:`org.leocoder.thin` → `com.company.project` +- **artifactId**:`coder-common-thin-*` → `my-project-*` +- **name**:相应模块名称更新 +- **依赖引用**:所有模块间依赖的 groupId 和 artifactId + +### ☕ Java 包结构重构 +- **包声明**:`package org.leocoder.thin.*` → `package com.company.project.*` +- **import语句**:`import org.leocoder.thin.*` → `import com.company.project.*` +- **目录结构**:`src/main/java/org/leocoder/thin/` → `src/main/java/com/company/project/` + +### ⚙️ 配置文件重构 +- **application.yml / application-dev.yml / application-local.yml**: + - `packages-to-scan: org.leocoder.thin` → `packages-to-scan: com.company.project` + - `projectName: CORDER-ADMIN-THIN` → `projectName: MY-PROJECT-ADMIN` + - `pool-name: CORDER-HIKARI-DEV` → `pool-name: MY-PROJECT-HIKARI-DEV` + - `name: coder-web` → `name: my-project-web` + - `jdbc:mysql://localhost:3306/coder-common-thin` → `jdbc:mysql://localhost:3306/new-db-name` + - `jdbc:mysql://localhost:3306/coder-common-thin-backup` → `jdbc:mysql://localhost:3306/new-db-name-backup` + - `filePath: /path/coder-common-thin-backend/` → `filePath: /path/new-project-backend/` +- **logback配置文件**(logback-spring*.xml): + - `coder-common-thin-logback` → `my-project-logback` + - `` → `` + - 所有日志路径引用:`${CORDER_ADMIN_LOGS}` → `${MY_PROJECT_ADMIN_LOGS}` +- **其他配置文件**:包名和项目相关引用更新 + +### 🗄️ SQL 文件重构 +- **文件重命名**:`coder-common-thin.sql` → `my_project_db.sql` +- **数据库名更新**:SQL文件中的数据库名引用更新 + +## 安全特性 + +### 🔒 自动备份 +脚本执行前会自动创建项目备份: +``` +coder-common-thin-backend_backup_20250922_143022/ +``` + +### ✅ 验证检查 +重构完成后自动验证是否还有旧的引用残留 + +### 🚫 错误处理 +遇到错误时立即停止执行,保护项目完整性 + +## 重构后操作 + +重构完成后请执行以下步骤: + +### 1. 验证编译 +```bash +mvn clean compile +``` + +### 2. 更新数据库配置 +手动检查并更新以下配置文件中的数据库连接信息: +- `*/src/main/resources/application-dev.yml` +- `*/src/main/resources/application-local.yml` + +### 3. 验证功能 +- 启动应用程序验证功能正常 +- 检查所有插件模块是否正常加载 + +### 4. IDE配置 +- 重新导入Maven项目 +- 检查项目结构和依赖 + +### 5. Git管理 +```bash +git add . +git commit -m "refactor: 重构项目为新模板" +``` + +## 注意事项 + +⚠️ **重要提醒:** +1. 重构前请确保代码已提交到Git仓库 +2. 脚本会自动创建备份,但建议额外手动备份重要数据 +3. 重构过程不可逆,请谨慎操作 +4. 重构后需要手动更新数据库连接配置 +5. 如果项目中有自定义的特殊配置,可能需要手动调整 + +## 故障排除 + +### 常见问题 +1. **权限错误**:确保脚本有可执行权限 `chmod +x project-template-refactor.sh` +2. **路径错误**:确保在正确的项目根目录下执行脚本 +3. **Maven错误**:重构后如果编译失败,检查依赖配置是否正确 +4. **包名冲突**:如果新包名已存在,选择不同的包名 +5. **Bash版本兼容性**:脚本已修复了bash版本兼容性问题 +6. **包名未正确替换**:使用修复脚本 `./fix-existing-project.sh` +7. **多余src目录**:使用修复脚本自动清理 + +### 项目修复工具 + +#### 1. 快速修复目录名反斜杠问题 +如果目录名中出现反斜杠(如 `leocoder\`): +```bash +./quick-fix-backslash.sh +``` + +#### 2. 修复遗漏的modules子模块 +如果modules目录下的子模块没有被重命名: +```bash +./fix-missing-modules.sh +``` + +#### 3. 修复已有问题的项目 +如果重构过程中出现包名未正确替换或目录结构问题: +```bash +./fix-existing-project.sh +``` + +#### 4. 检查项目状态 +检查项目重构后的整体状态: +```bash +./project-status-check.sh +``` + +#### 5. 演示logback配置处理 +查看logback配置处理效果: +```bash +./logback-demo.sh +``` + +#### 6. 测试反斜杠修复功能 +验证反斜杠问题修复效果: +```bash +./test-backslash-fix.sh +``` + +#### 7. 测试配置文件修复功能 +验证数据库连接字符串和文件路径配置修复效果: +```bash +./test-config-fix.sh +``` + +### 回滚操作 +如果重构出现问题,可以: +1. 删除重构后的项目目录 +2. 从备份目录恢复:`cp -r coder-common-thin-backend_backup_* coder-common-thin-backend` +3. 或使用修复脚本进行增量修复 + +### 脚本版本信息 +- **v1.0.0**:初始版本 +- **v1.1.0**:修复bash兼容性问题,改进Java包结构迁移逻辑,增加修复工具 +- **v1.1.1**:修复sed正则表达式导致的目录名反斜杠问题,增加快速修复工具 +- **v1.2.0**:**重大更新** - 完善反斜杠自动清理,增加项目根目录自动重命名功能 +- **v1.2.1**:**关键修复** - 彻底解决反斜杠问题,增强MyBatis XML处理,改进验证逻辑 +- **v1.2.2**:**模块修复** - 修复modules子模块重命名遗漏问题,支持多层级子模块处理 +- **v1.2.3**:**配置修复** - 修复数据库连接字符串和文件路径配置未更新问题 + +## 技术支持 + +如果在使用过程中遇到问题,请: +1. 检查脚本执行日志 +2. 查看备份目录是否完整 +3. 联系开发团队获取支持 + +--- + +**版本**:v1.2.3 +**作者**:Leocoder +**更新时间**:2025-09-22 \ No newline at end of file diff --git a/script/project-template-refactor.sh b/script/project-template-refactor.sh new file mode 100755 index 0000000..03a71e9 --- /dev/null +++ b/script/project-template-refactor.sh @@ -0,0 +1,567 @@ +#!/bin/bash + +#============================================================================= +# 项目模板重构脚本 +# 用于将coder-common-thin-backend项目重构为新的项目模板 +# +# 功能: +# 1. 重构项目名称和模块名 +# 2. 修改包名和groupId +# 3. 更新配置文件中的包名引用 +# 4. 重命名SQL文件和数据库名 +# 5. 处理多层级子模块结构 +# 6. 更新数据库连接字符串 +# 7. 更新文件路径配置 +# +# 作者: Leocoder +# 版本: 1.2.3 +#============================================================================= + +set -e # 遇到错误立即退出 + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 日志函数 +log_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +log_step() { + echo -e "${BLUE}[STEP]${NC} $1" +} + +# 当前项目信息 +CURRENT_PROJECT_NAME="coder-common-thin-backend" +CURRENT_GROUP_ID="org.leocoder.thin" +CURRENT_PACKAGE_NAME="org.leocoder.thin" +CURRENT_MODULE_PREFIX="coder-common-thin" +CURRENT_DB_NAME="coder-common-thin" + +# 脚本目录 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + +log_info "=== 项目模板重构脚本 v1.2.3 ===" +log_info "项目根目录: $PROJECT_ROOT" + +# 验证当前目录 +if [[ ! -f "$PROJECT_ROOT/pom.xml" ]]; then + log_error "当前目录不是有效的Maven项目根目录" + exit 1 +fi + +# 获取用户输入 +echo "" +log_step "请输入新项目的配置信息:" + +read -p "新项目名称 (例如: my-project-backend): " NEW_PROJECT_NAME +read -p "新的GroupId (例如: com.company.project): " NEW_GROUP_ID +read -p "新的包名 (例如: com.company.project): " NEW_PACKAGE_NAME +read -p "新的模块前缀 (例如: my-project): " NEW_MODULE_PREFIX +read -p "新的数据库名 (例如: my_project_db): " NEW_DB_NAME + +# 验证输入 +if [[ -z "$NEW_PROJECT_NAME" || -z "$NEW_GROUP_ID" || -z "$NEW_PACKAGE_NAME" || -z "$NEW_MODULE_PREFIX" || -z "$NEW_DB_NAME" ]]; then + log_error "所有参数都不能为空" + exit 1 +fi + +# 显示配置信息确认 +echo "" +log_info "=== 重构配置确认 ===" +echo "项目名称: $CURRENT_PROJECT_NAME -> $NEW_PROJECT_NAME" +echo "GroupId: $CURRENT_GROUP_ID -> $NEW_GROUP_ID" +echo "包名: $CURRENT_PACKAGE_NAME -> $NEW_PACKAGE_NAME" +echo "模块前缀: $CURRENT_MODULE_PREFIX -> $NEW_MODULE_PREFIX" +echo "数据库名: $CURRENT_DB_NAME -> $NEW_DB_NAME" +echo "" + +read -p "确认开始重构?[y/N]: " CONFIRM +if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then + log_info "重构已取消" + exit 0 +fi + +# 备份项目 +BACKUP_DIR="${PROJECT_ROOT}_backup_$(date +%Y%m%d_%H%M%S)" +log_step "创建项目备份: $BACKUP_DIR" +cp -r "$PROJECT_ROOT" "$BACKUP_DIR" +log_info "备份完成" + +# 重构函数 + +# 1. 重命名模块目录 +rename_module_directories() { + log_step "重命名模块目录..." + + cd "$PROJECT_ROOT" + + # 主模块重命名 + local modules=( + "$CURRENT_MODULE_PREFIX-web" + "$CURRENT_MODULE_PREFIX-common" + "$CURRENT_MODULE_PREFIX-model" + "$CURRENT_MODULE_PREFIX-mybatisplus" + "$CURRENT_MODULE_PREFIX-modules" + "$CURRENT_MODULE_PREFIX-plugins" + ) + + for module in "${modules[@]}"; do + if [[ -d "$module" ]]; then + new_module="${module/$CURRENT_MODULE_PREFIX/$NEW_MODULE_PREFIX}" + log_info "重命名: $module -> $new_module" + mv "$module" "$new_module" + fi + done + + # 递归重命名所有子模块(modules、plugins等) + local parent_modules=( + "$NEW_MODULE_PREFIX-modules" + "$NEW_MODULE_PREFIX-plugins" + ) + + for parent_module in "${parent_modules[@]}"; do + if [[ -d "$parent_module" ]]; then + log_info "处理子模块目录: $parent_module" + cd "$parent_module" + + # 重命名当前目录下的所有子模块 + for sub_dir in $CURRENT_MODULE_PREFIX-*; do + if [[ -d "$sub_dir" ]]; then + new_sub_dir="${sub_dir/$CURRENT_MODULE_PREFIX/$NEW_MODULE_PREFIX}" + log_info "重命名子模块: $sub_dir -> $new_sub_dir" + mv "$sub_dir" "$new_sub_dir" + + # 递归处理子模块中的子子模块(如果存在) + if [[ -d "$new_sub_dir" ]]; then + cd "$new_sub_dir" + for sub_sub_dir in $CURRENT_MODULE_PREFIX-*; do + if [[ -d "$sub_sub_dir" ]]; then + new_sub_sub_dir="${sub_sub_dir/$CURRENT_MODULE_PREFIX/$NEW_MODULE_PREFIX}" + log_info "重命名子子模块: $sub_sub_dir -> $new_sub_sub_dir" + mv "$sub_sub_dir" "$new_sub_sub_dir" + fi + done + cd ".." + fi + fi + done + cd "$PROJECT_ROOT" + fi + done + + log_info "模块目录重命名完成" +} + +# 2. 更新POM文件 +update_pom_files() { + log_step "更新POM文件..." + + # 查找所有pom.xml文件 + find "$PROJECT_ROOT" -name "pom.xml" -type f | while read pom_file; do + log_info "更新POM: $pom_file" + + # 使用sed进行替换 + sed -i.bak \ + -e "s|$CURRENT_GROUP_ID|$NEW_GROUP_ID|g" \ + -e "s|$CURRENT_PROJECT_NAME|$NEW_PROJECT_NAME|g" \ + -e "s|$CURRENT_PROJECT_NAME|$NEW_PROJECT_NAME|g" \ + -e "s|$CURRENT_MODULE_PREFIX-|$NEW_MODULE_PREFIX-|g" \ + "$pom_file" + + # 删除备份文件 + rm -f "${pom_file}.bak" + done + + log_info "POM文件更新完成" +} + +# 3. 更新Java包结构 +update_java_packages() { + log_step "更新Java包结构..." + + # 转换包名路径 + local current_package_path="${CURRENT_PACKAGE_NAME//./\/}" + local new_package_path="${NEW_PACKAGE_NAME//./\/}" + + log_info "包路径转换: $current_package_path -> $new_package_path" + + # 查找所有Java文件并更新包名和import语句 + find "$PROJECT_ROOT" -name "*.java" -type f | while read java_file; do + log_info "更新Java文件内容: $java_file" + + # 更新package声明和import语句,使用更精确的匹配(避免转义字符问题) + sed -i.bak \ + -e "s|^package ${CURRENT_PACKAGE_NAME};|package ${NEW_PACKAGE_NAME};|g" \ + -e "s|^package ${CURRENT_PACKAGE_NAME}[.]|package ${NEW_PACKAGE_NAME}.|g" \ + -e "s|^import ${CURRENT_PACKAGE_NAME};|import ${NEW_PACKAGE_NAME};|g" \ + -e "s|^import ${CURRENT_PACKAGE_NAME}[.]|import ${NEW_PACKAGE_NAME}.|g" \ + -e "s|${CURRENT_PACKAGE_NAME}[.]|${NEW_PACKAGE_NAME}.|g" \ + "$java_file" + + rm -f "${java_file}.bak" + done + + # 重构Java包目录结构 + log_info "开始重构Java包目录结构..." + + # 查找所有包含当前包路径的java源码目录 + find "$PROJECT_ROOT" -path "*/src/main/java/$current_package_path" -type d | while read old_package_dir; do + log_info "处理包目录: $old_package_dir" + + # 获取java源码根目录 + local java_root="${old_package_dir%/$current_package_path}" + local new_package_dir="$java_root/$new_package_path" + + log_info " 源目录: $old_package_dir" + log_info " 目标目录: $new_package_dir" + + # 创建新的包目录结构 + mkdir -p "$(dirname "$new_package_dir")" + + # 移动整个包目录到新位置 + if [[ -d "$old_package_dir" && "$old_package_dir" != "$new_package_dir" ]]; then + mv "$old_package_dir" "$new_package_dir" + log_info " 已移动包目录" + + # 清理空的父级目录 + local old_parent="$(dirname "$old_package_dir")" + while [[ "$old_parent" != "$java_root" && -d "$old_parent" ]]; do + if [[ -z "$(ls -A "$old_parent" 2>/dev/null)" ]]; then + rmdir "$old_parent" 2>/dev/null && log_info " 清理空目录: $old_parent" + old_parent="$(dirname "$old_parent")" + else + break + fi + done + fi + done + + log_info "Java包结构更新完成" +} + +# 4. 清理目录名中的反斜杠(独立函数) +cleanup_backslash_directories() { + log_step "清理目录名中的反斜杠..." + + local fixed_count=0 + local attempts=0 + + # 重复检查和修复,直到没有反斜杠目录或达到最大尝试次数 + while [[ $attempts -lt 5 ]]; do + local found_backslash=false + + # 查找包含反斜杠的目录 + for dir_path in $(find "$PROJECT_ROOT" -path "*/src/main/java/*" -type d 2>/dev/null); do + if [[ ! -d "$dir_path" ]]; then + continue + fi + + dir_name=$(basename "$dir_path") + + # 检查目录名是否包含反斜杠 + if [[ "$dir_name" == *"\\"* ]]; then + found_backslash=true + + # 清理反斜杠,获取正确的目录名 + clean_dir_name="${dir_name//\\/}" + parent_dir=$(dirname "$dir_path") + new_dir_path="$parent_dir/$clean_dir_name" + + log_info "修复目录名: '$dir_name' -> '$clean_dir_name'" + + # 重命名目录 + if [[ "$dir_path" != "$new_dir_path" && ! -e "$new_dir_path" ]]; then + if mv "$dir_path" "$new_dir_path" 2>/dev/null; then + log_info " ✓ 目录重命名成功: $(basename "$new_dir_path")" + ((fixed_count++)) + else + log_warn " ✗ 目录重命名失败: $dir_path" + fi + fi + fi + done + + # 如果没有找到反斜杠目录,退出循环 + if [[ "$found_backslash" == false ]]; then + break + fi + + ((attempts++)) + sleep 0.1 # 短暂等待,确保文件系统操作完成 + done + + if [[ $fixed_count -gt 0 ]]; then + log_info "总共修复了 $fixed_count 个包含反斜杠的目录(用了 $attempts 轮处理)" + else + log_info "未发现包含反斜杠的目录" + fi + + log_info "反斜杠清理完成" +} + +# 5. 更新配置文件 +update_config_files() { + log_step "更新配置文件..." + + # 更新application配置文件 + find "$PROJECT_ROOT" -name "application*.yml" -o -name "application*.yaml" -o -name "application*.properties" | while read config_file; do + log_info "更新配置文件: $config_file" + + # 计算新的配置名称(兼容各种bash版本) + local new_pool_name="$(echo "$NEW_MODULE_PREFIX" | tr '[:lower:]' '[:upper:]')-HIKARI-DEV" + local new_project_name="$(echo "$NEW_MODULE_PREFIX" | tr '[:lower:]' '[:upper:]')-ADMIN" + + sed -i.bak \ + -e "s|packages-to-scan: $CURRENT_PACKAGE_NAME|packages-to-scan: $NEW_PACKAGE_NAME|g" \ + -e "s|$CURRENT_PACKAGE_NAME|$NEW_PACKAGE_NAME|g" \ + -e "s|name: coder-web|name: ${NEW_MODULE_PREFIX}-web|g" \ + -e "s|projectName: CORDER-ADMIN-THIN|projectName: $new_project_name|g" \ + -e "s|pool-name: CORDER-HIKARI-DEV|pool-name: $new_pool_name|g" \ + -e "s|jdbc:mysql://localhost:3306/$CURRENT_DB_NAME|jdbc:mysql://localhost:3306/$NEW_DB_NAME|g" \ + -e "s|jdbc:mysql://localhost:3306/$CURRENT_DB_NAME-backup|jdbc:mysql://localhost:3306/$NEW_DB_NAME-backup|g" \ + -e "s|/$CURRENT_PROJECT_NAME/|/$NEW_PROJECT_NAME/|g" \ + -e "s|$CURRENT_MODULE_PREFIX|$NEW_MODULE_PREFIX|g" \ + "$config_file" + + rm -f "${config_file}.bak" + done + + # 更新logback配置文件(专门处理logback特有的配置) + find "$PROJECT_ROOT" -name "logback*.xml" | while read logback_file; do + log_info "更新Logback配置: $logback_file" + + # 计算新的日志配置名称(兼容各种bash版本) + local new_context_name="${NEW_MODULE_PREFIX}-logback" + local new_property_name="$(echo "$NEW_MODULE_PREFIX" | tr '[:lower:]' '[:upper:]')_ADMIN_LOGS" + + sed -i.bak \ + -e "s|$CURRENT_PACKAGE_NAME|$NEW_PACKAGE_NAME|g" \ + -e "s|$CURRENT_MODULE_PREFIX-logback|$new_context_name|g" \ + -e "s|CORDER_ADMIN_LOGS|$new_property_name|g" \ + -e "s|name=\"CORDER_ADMIN_LOGS\"|name=\"$new_property_name\"|g" \ + "$logback_file" + + rm -f "${logback_file}.bak" + done + + # 更新MyBatis XML文件(处理namespace和resultType) + find "$PROJECT_ROOT" -name "*.xml" -path "*/mapper/*" | while read mapper_file; do + log_info "更新MyBatis配置: $mapper_file" + + sed -i.bak \ + -e "s|namespace=\"$CURRENT_PACKAGE_NAME|namespace=\"$NEW_PACKAGE_NAME|g" \ + -e "s|resultType=\"$CURRENT_PACKAGE_NAME|resultType=\"$NEW_PACKAGE_NAME|g" \ + -e "s|parameterType=\"$CURRENT_PACKAGE_NAME|parameterType=\"$NEW_PACKAGE_NAME|g" \ + "$mapper_file" + + rm -f "${mapper_file}.bak" + done + + log_info "配置文件更新完成" +} + +# 6. 更新SQL文件 +update_sql_files() { + log_step "更新SQL文件..." + + local sql_dir="$PROJECT_ROOT/sql" + if [[ -d "$sql_dir" ]]; then + # 重命名SQL文件 + local current_sql_file="$sql_dir/$CURRENT_DB_NAME.sql" + local new_sql_file="$sql_dir/$NEW_DB_NAME.sql" + + if [[ -f "$current_sql_file" ]]; then + log_info "重命名SQL文件: $CURRENT_DB_NAME.sql -> $NEW_DB_NAME.sql" + mv "$current_sql_file" "$new_sql_file" + + # 更新SQL文件内容中的数据库名引用 + sed -i.bak \ + -e "s|Source Schema.*: $CURRENT_DB_NAME|Source Schema : $NEW_DB_NAME|g" \ + -e "s|$CURRENT_DB_NAME|$NEW_DB_NAME|g" \ + "$new_sql_file" + + rm -f "${new_sql_file}.bak" + fi + fi + + log_info "SQL文件更新完成" +} + +# 7. 更新其他文件 +update_other_files() { + log_step "更新其他相关文件..." + + # 更新README文件 + find "$PROJECT_ROOT" -name "README*" -type f | while read readme_file; do + log_info "更新README: $readme_file" + + sed -i.bak \ + -e "s|$CURRENT_PROJECT_NAME|$NEW_PROJECT_NAME|g" \ + -e "s|$CURRENT_MODULE_PREFIX|$NEW_MODULE_PREFIX|g" \ + -e "s|$CURRENT_PACKAGE_NAME|$NEW_PACKAGE_NAME|g" \ + "$readme_file" + + rm -f "${readme_file}.bak" + done + + # 更新CLAUDE.md文件 + if [[ -f "$PROJECT_ROOT/CLAUDE.md" ]]; then + log_info "更新CLAUDE.md" + + sed -i.bak \ + -e "s|$CURRENT_PROJECT_NAME|$NEW_PROJECT_NAME|g" \ + -e "s|$CURRENT_MODULE_PREFIX|$NEW_MODULE_PREFIX|g" \ + -e "s|$CURRENT_PACKAGE_NAME|$NEW_PACKAGE_NAME|g" \ + "$PROJECT_ROOT/CLAUDE.md" + + rm -f "$PROJECT_ROOT/CLAUDE.md.bak" + fi + + # 更新其他配置文件(如果存在) + find "$PROJECT_ROOT" -name "*.properties" -o -name "*.yml" -o -name "*.yaml" | while read prop_file; do + if [[ "$prop_file" != *"application"* ]]; then + log_info "更新属性文件: $prop_file" + + sed -i.bak \ + -e "s|$CURRENT_PACKAGE_NAME|$NEW_PACKAGE_NAME|g" \ + -e "s|$CURRENT_MODULE_PREFIX|$NEW_MODULE_PREFIX|g" \ + "$prop_file" + + rm -f "${prop_file}.bak" + fi + done + + log_info "其他文件更新完成" +} + +# 8. 清理和验证 +cleanup_and_verify() { + log_step "清理临时文件和验证..." + + # 清理备份文件 + find "$PROJECT_ROOT" -name "*.bak" -delete + + # 验证重构结果 + log_info "验证重构结果..." + + # 检查是否还有旧的引用(排除脚本文件、日志文件、备份等) + local old_refs=$(grep -r "$CURRENT_PACKAGE_NAME" "$PROJECT_ROOT" \ + --exclude-dir=".git" \ + --exclude-dir="target" \ + --exclude-dir=".idea" \ + --exclude-dir="script" \ + --exclude="*.log" \ + --exclude="spy.log" \ + --exclude="*.bak" \ + --exclude="*.sh" \ + 2>/dev/null | wc -l) + + if [[ $old_refs -gt 0 ]]; then + log_warn "发现 $old_refs 处旧包名引用,请手动检查" + grep -r "$CURRENT_PACKAGE_NAME" "$PROJECT_ROOT" \ + --exclude-dir=".git" \ + --exclude-dir="target" \ + --exclude-dir=".idea" \ + --exclude-dir="script" \ + --exclude="*.log" \ + --exclude="spy.log" \ + --exclude="*.bak" \ + --exclude="*.sh" \ + 2>/dev/null | head -10 + else + log_info "✓ 验证通过:未发现旧包名引用" + fi + + log_info "清理完成" +} + +# 9. 重命名项目根目录 +rename_project_directory() { + log_step "重命名项目根目录..." + + # 获取当前项目目录名 + local current_dir_name=$(basename "$PROJECT_ROOT") + local parent_dir=$(dirname "$PROJECT_ROOT") + local new_project_dir="$parent_dir/$NEW_PROJECT_NAME" + + log_info "项目目录重命名: $current_dir_name -> $NEW_PROJECT_NAME" + + # 检查目标目录是否已存在 + if [[ -d "$new_project_dir" && "$PROJECT_ROOT" != "$new_project_dir" ]]; then + log_warn "目标目录已存在: $new_project_dir" + log_warn "跳过项目目录重命名" + return + fi + + # 重命名项目目录 + if [[ "$PROJECT_ROOT" != "$new_project_dir" ]]; then + log_info "移动项目目录: $PROJECT_ROOT -> $new_project_dir" + + # 切换到父目录 + cd "$parent_dir" + + # 重命名目录 + if mv "$current_dir_name" "$NEW_PROJECT_NAME" 2>/dev/null; then + log_info "✓ 项目目录重命名成功" + log_info "新的项目路径: $new_project_dir" + + # 更新PROJECT_ROOT变量为新路径 + PROJECT_ROOT="$new_project_dir" + else + log_warn "✗ 项目目录重命名失败,请手动重命名" + fi + else + log_info "项目目录名已正确,无需重命名" + fi + + log_info "项目目录处理完成" +} + +# 执行重构 +echo "" +log_info "=== 开始执行重构 ===" + +rename_module_directories +update_pom_files +update_java_packages +cleanup_backslash_directories +update_config_files +update_sql_files +update_other_files +cleanup_and_verify +rename_project_directory + +echo "" +log_info "=== 重构完成 ===" +log_info "新项目名称: $NEW_PROJECT_NAME" +log_info "新的GroupId: $NEW_GROUP_ID" +log_info "新的包名: $NEW_PACKAGE_NAME" +log_info "新的模块前缀: $NEW_MODULE_PREFIX" +log_info "新的数据库名: $NEW_DB_NAME" +echo "" +log_info "项目备份位置: $BACKUP_DIR" +log_info "新项目位置: $PROJECT_ROOT" +echo "" +log_warn "重构完成后请执行以下操作:" +echo "1. 进入新项目目录: cd \"$PROJECT_ROOT\"" +echo "2. 验证项目能否正常编译: mvn clean compile" +echo "3. 更新数据库连接配置中的数据库名" +echo "4. 在IDE中重新导入项目,检查包结构" +echo "5. 提交代码到新的Git仓库" +echo "" + +log_info "感谢使用项目模板重构脚本!" \ No newline at end of file