背景

最近接手一个典型的 SpringBoot + Vue 的毕设级项目——应急物资管理系统,需要拆分为 4 人团队协作开发。项目技术栈为:

  • 后端:SpringBoot + MyBatis-Plus + MySQL
  • 前端:Vue 2.x + Element UI + Axios
  • 总代码量:约 380 个源文件(Java 103 + Vue/JS 180 + 静态资源 100+)

核心挑战是:如何把一个未拆分过的单体项目,合理分配给多人并行开发?

第一步:全量文件扫描与清单化

在拆分之前,必须先搞清楚"有什么"。按文件类型做了 7 维扫描:

维度 扫描路径 数量
Controller **/controller/*.java 11
Service 接口 **/service/*.java 11
Service 实现 **/service/impl/*.java 11
DAO/Mapper **/dao/*.java + **/mapper/*.xml 11 + 11
Entity/Domain **/entity/**/*.java 32
前端 Views **/views/**/*.vue 35
前端 API/Utils **/utils/*.js + **/router/*.js 18
SQL 脚本 *.sql 1

技巧:用 find 命令按文件后缀和路径模式批量扫描,输出为文本清单,方便后续核对。

第二步:业务归类——从文件名到模块映射

光有清单不够,还需要理解每类文件的业务归属。归类的三个依据:

  1. Controller 的 @RequestMapping 路径——最直接的业务标识
  2. Java 类的注释(如 /** 物资运输 */
  3. 前端路由的 name 字段(如 name: '物资运输'
  4. 数据库表的 COMMENT(如 COMMENT='物资运输'

最终归类为 4 个业务模块 + 1 组公共文件:

模块 业务范围 涉及数据库表
A — 用户与权限管理 管理员登录/注册、普通用户管理、Token 鉴权 users, yonghu, token
B — 物资与申请管理 物资 CRUD、物资申请/审核 wuzi, wuzishenqing
C — 物资运输管理 运输记录、状态流转 wuziyunshu
D — 健康打卡与基础数据 打卡、部门、字典、配置 daka, bumen, dictionary, config
公共 通用统计、文件上传、工具类、前端组件/路由

原则:找不到归属的文件放入"公共",不要强行归类。

第三步:人员分配

4 人团队的分工设计遵循两个原则:

  1. 公共文件由组长负责,放在项目初始化阶段完成,其他成员基于此开发
  2. 业务模块按粒度均衡分配,避免有人 20 个文件有人 80 个文件

最终分配:

角色 负责内容 文件量
组长 项目初始化 + 公共基础设施 + 最终整合 ~280
组员 A A 用户与权限管理 ~23
组员 B B 物资与申请管理 ~22
组员 C C 物资运输管理 ~11
组员 D D 健康打卡与基础数据 ~49

组员 C 文件较少但业务链路完整,适合搭配编写文档或测试。

第四步:物理拆分到独立文件夹

为每个角色创建独立的文件夹,用脚本将归属文件复制进去,保留原始目录结构

项目根目录/
├── 01_初始化/          ← 组长
├── 02_组员A_用户权限管理/
├── 03_组员B_物资申请管理/
├── 04_组员C_物资运输管理/
└── 05_组员D_基础数据/

核心脚本逻辑(macOS 兼容写法):

#!/bin/bash
# 复制文件并保留目录结构
copy_file() {
    local dest="$1"
    local src="$2"
    local dir=$(dirname "$src")
    mkdir -p "$dest/$dir"
    cp "$SRC/$src" "$dest/$dir/"
}

# 示例:将 WuziController 分配给组员B
copy_file "03_组员B_物资申请管理" "src/main/java/com/controller/WuziController.java"

踩坑:macOS 的 cp 没有 --parents 选项,需手动 mkdir -p + cp,或用 rsync -R

第五步:完整性校验——一个文件都不能少

拆分完成后,必须验证完整性。用 find + comm 做差异对比:

# 原始项目文件列表(去前缀)
find 原始项目/src -type f | sed 's|原始项目/||' | sort > /tmp/orig.txt

# 5 个文件夹文件列表(去各自前缀)
for d in 01_初始化 02_* 03_* 04_* 05_*; do
    find "$d" -type f | sed "s|^${d}/||"
done | sort -u > /tmp/copied.txt

# 找出原始项目有但拆分后缺失的
comm -23 /tmp/orig.txt /tmp/copied.txt

审计结果:

阶段 结果
代码文件 + 配置 ✅ 179/179 全部覆盖
静态资源补充前 ❌ 缺失 204 个(SVG/图片/CSS/upload 演示文件)
静态资源补充后 ✅ 383/383 全部覆盖,0 遗漏

第一次漏了静态资源是因为只关注了 .java.vue.js.xml 等代码文件,忽略了 assets/icons/upload/ 等资源目录。文件扫描要覆盖所有类型。

经验总结

  1. 先扫描,再分类,后拆分——顺序不能乱。不知道有什么之前,不要动手分。
  2. 归类要有明确依据——Controller 路径、路由 name、表注释,三者互相印证。
  3. 公共文件必须独立文件夹——不要让任何人"顺便负责"公共代码,必须显式声明。
  4. 保留原始目录结构——每个组员的文件夹内部结构要和原项目一致,方便最后整合回主分支。
  5. 用脚本操作,不要手动拖文件——380 个文件手动操作必然出错,写个 shell 脚本几分钟搞定。
  6. 一定要做完整性校验——find + comm 是最好的审计工具,不要让任何文件"消失"在拆分过程中。
  7. 每个组员的提交计划要提前设计——拿到文件只是第一步,还要按提交节奏(5~8 次 commit)设计好提交顺序。

附:用到的命令速查

# 按类型列出所有文件
find . -path "*/controller/*.java" | sort

# 统计文件数
find . -name "*.vue" | wc -l

# 复制并保留目录结构
mkdir -p "$dest/$(dirname $file)" && cp "$src/$file" "$dest/$file"

# 两个文件列表做差集(找出缺失文件)
comm -23 <(cat list1 | sort) <(cat list2 | sort)

# 批量复制指定目录的所有文件
cp "$src/assets/img/"*.png "$dest/assets/img/"

本文总结了一次完整的 SpringBoot + Vue 项目团队拆分实践,从文件扫描、业务归类、人力分配到物理拆分和完整性校验,形成了一套可复用的操作流程。适用于所有需要将单体项目拆分为多人协作的场景。