背景
最近接手一个典型的 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命令按文件后缀和路径模式批量扫描,输出为文本清单,方便后续核对。
第二步:业务归类——从文件名到模块映射
光有清单不够,还需要理解每类文件的业务归属。归类的三个依据:
- Controller 的
@RequestMapping路径——最直接的业务标识 - Java 类的注释(如
/** 物资运输 */) - 前端路由的
name字段(如name: '物资运输') - 数据库表的
COMMENT(如COMMENT='物资运输')
最终归类为 4 个业务模块 + 1 组公共文件:
| 模块 | 业务范围 | 涉及数据库表 |
|---|---|---|
| A — 用户与权限管理 | 管理员登录/注册、普通用户管理、Token 鉴权 | users, yonghu, token |
| B — 物资与申请管理 | 物资 CRUD、物资申请/审核 | wuzi, wuzishenqing |
| C — 物资运输管理 | 运输记录、状态流转 | wuziyunshu |
| D — 健康打卡与基础数据 | 打卡、部门、字典、配置 | daka, bumen, dictionary, config |
| 公共 | 通用统计、文件上传、工具类、前端组件/路由 | — |
原则:找不到归属的文件放入"公共",不要强行归类。
第三步:人员分配
4 人团队的分工设计遵循两个原则:
- 公共文件由组长负责,放在项目初始化阶段完成,其他成员基于此开发
- 业务模块按粒度均衡分配,避免有人 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/等资源目录。文件扫描要覆盖所有类型。
经验总结
- 先扫描,再分类,后拆分——顺序不能乱。不知道有什么之前,不要动手分。
- 归类要有明确依据——Controller 路径、路由 name、表注释,三者互相印证。
- 公共文件必须独立文件夹——不要让任何人"顺便负责"公共代码,必须显式声明。
- 保留原始目录结构——每个组员的文件夹内部结构要和原项目一致,方便最后整合回主分支。
- 用脚本操作,不要手动拖文件——380 个文件手动操作必然出错,写个 shell 脚本几分钟搞定。
- 一定要做完整性校验——
find+comm是最好的审计工具,不要让任何文件"消失"在拆分过程中。 - 每个组员的提交计划要提前设计——拿到文件只是第一步,还要按提交节奏(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 项目团队拆分实践,从文件扫描、业务归类、人力分配到物理拆分和完整性校验,形成了一套可复用的操作流程。适用于所有需要将单体项目拆分为多人协作的场景。