毕业设计实战:基于Spring Boot的工作流程管理系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!
谁懂啊!当初做工作流程管理系统毕设时,光用户表和项目表的关联就卡了3天——一开始没设外键,查某用户参与的项目时数据全乱套,导师看了直接让我“重画数据库E-R图”😫 后来踩遍无数坑才摸出一套高效落地流程,今天把需求分析、技术选型、功能实现到测试的细节全说透,宝子们不用再熬夜改代码,轻松搞定毕设!
一、先搞懂“工作流程管理系统要啥”!需求分析别瞎蒙
刚开始我跳过需求分析就写代码,花两周加了个“项目聊天功能”,结果导师一句“核心是项目管理与流程管控,不是社交互动”直接打回重改!后来才明白,需求分析得先抓准“谁用系统、要干啥”,这步做对,后面少走90%弯路。
1. 核心用户&功能拆解(踩坑后总结版)
工作流程管理系统就两类核心用户:管理员和普通用户(别加“超级管理员角色”!我当初加了后,权限逻辑混乱,普通用户连基础项目查询都卡壳,最后砍掉才顺畅):
- 管理员端(必做功能):
- 用户管理:查看用户列表、新增用户、重置密码、模糊查询(支持按姓名/手机号搜,我当初没加,查用户要翻几十页)
- 项目管理:审核项目信息、查看项目进度、作废违规项目(用不同颜色标“待审核/已通过/已拒绝”,直观清晰)
- 公告管理:发布公告、修改公告类型、删除过期公告(加“公告类型”字段,比如“系统通知/项目提醒”,方便筛选)
- 字典表管理:维护字段编码、更新字段名称(别让管理员手动输编码,用下拉框选,效率翻倍)
- 普通用户端(核心功能):
- 个人中心:修改个人信息(头像、联系方式)、查看参与项目(按“创建时间”排序,我当初没加,用户找旧项目要翻半天)
- 项目操作:申请加入项目、提交项目进度、查看项目审核结果(提交进度时需上传佐证材料,避免虚假填报)
- 公告查看:按类型筛选公告、查看公告详情(显示“公告时间”,方便用户追溯历史通知)
2. 需求分析避坑指南(血泪教训!)
- 别光靠“空想”!找2个同学模拟管理员和普通用户提意见:比如有同学说“想快速查项目审核结果”,我才加了“项目状态提醒”,比瞎加“项目聊天功能”实用多了
- 一定要画用例图!用DrawIO画简单版,标清“管理员-审核项目”“用户-申请加入项目”,跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听20分钟还没get到逻辑)
- 写“需求规格说明书”!不用复杂,把“功能描述、约束条件”写清楚(比如“项目名称不能重复”“用户身份证号需唯一”),编码时对着做,不会跑偏
3. 可行性分析别敷衍!3点写清楚就能过
导师超爱问“你这系统可行吗”,别只说“我觉得可行”,从3个角度写,显得专业:
- 技术可行性:Spring Boot、Vue、MySQL都是课堂学过的,图书馆有《Spring Boot实战》《Vue开发指南》,遇到问题能查资料(别选Vue3!我当初想试,环境配置卡了一周,换回Vue2才顺利)
- 经济可行性:所有工具全免费!Eclipse(社区版)、MySQL、Tomcat官网直接下,不用花钱买版权,答辩时说“开发成本为0”,导师会觉得你懂成本控制
- 操作可行性:界面用简洁布局,按钮位置参考同类管理系统,我找系里老师测试,3分钟就学会审核项目,导师直接认可
二、技术选型别跟风!这套组合稳到爆
刚开始我跟风用Spring Boot+Vue3+Redis,结果“项目进度缓存”卡了5天——Redis的key-value逻辑不熟,进度数据总加载失败😫 后来换成Spring Boot+Vue2+MySQL+Tomcat9,新手友好度拉满,调试效率翻两倍!
1. 技术栈详细对比(附避坑提醒)
宝子们别盲目选“最新技术”,稳定比炫酷重要!我整理了4个核心工具的选择理由和坑点,直接抄:
| 技术工具 | 为啥选它 | 避坑提醒!(重点!) |
|---|---|---|
| Spring Boot | 比SSM配置简单,自带依赖管理 | 别用3.x版本!2.7.x就行,3.x和Vue2兼容性差,会报“接口请求错误” |
| MySQL 8.0 | 占内存小,存用户、项目数据足够用 | 安装时设“utf8mb4”编码!我当初用默认编码,用户姓名含特殊符号乱码,查2小时才解决 |
| Tomcat 9.0 | 稳定!和Spring Boot、Vue适配最好 | 别用Tomcat 10!会出现“Servlet API包名变更”,答辩时崩了就完了 |
| Vue 2 | 文档丰富,新手易上手,组件生态成熟 | 别用Vue CLI 5!用4.x版本,5.x创建项目时依赖加载慢,还容易报错 |
2. 开发环境搭建(step by step 实操)
很多宝子卡在“环境配置”,跟着步骤来超简单,我当初一次成功:
- 装JDK 1.8:记路径(比如D:\Java\jdk1.8.0_301),配置“JAVA_HOME”别错,不然Eclipse认不到
- 装Eclipse(社区版):选“Eclipse IDE for Enterprise Java Developers”,自带Spring Boot插件
- 装MySQL 8.0:用Navicat管理(可视化工具超方便,新建表直接选字段类型,比命令行快10倍)
- 配Vue项目:用Vue CLI 4创建项目,选“Manually select features”,勾“Router”“Vuex”“CSS Pre-processors”,启动看到“Compiled successfully”就是成功
3. 架构图一定要画!答辩加分项
用DrawIO画三层架构图(像论文里的“系统架构图”),标清“表现层-业务层-数据访问层”:比如用户点“申请加入项目”→Vue页面传请求→Spring Boot Controller接请求→Service校验权限→Mapper存数据。去年答辩时,评委特意夸这图“逻辑清晰”,比光说“我用了Spring Boot”专业多了!
三、数据库设计:别让表关联坑了你
这部分是毕设的“核心骨架”,我当初没关联“项目表”和“用户表”,查“某用户参与的项目”要写3层嵌套SQL,调试到凌晨1点😫 后来按“实体-属性-关系”设计,终于理清了。
1. 核心实体&属性(附ER图绘制技巧)
先确定“实体”(用户、项目、公告),再想“属性”,别漏关键字段!我整理了必做的7张表,直接照着画ER图:
- 用户表(yonghu):id(主键)、yonghu_name(姓名)、yonghu_phone(手机号,唯一)、password(MD5加密!存明文会被导师说“不安全”)、yonghu_email(邮箱)
- 项目表(xiangmu):id(主键)、xiangmu_name(项目名称)、xiangmu_types(项目类型)、yonghu_id(关联项目负责人)、xiangmu_yesno_types(审核状态)
- 项目进度表(xiangmujindu):id(主键)、xiangmu_id(关联项目)、yonghu_id(关联用户)、xiangmujindu_text(进度详情)、insert_time(添加时间)
- 公告表(news):id(主键)、news_name(公告标题)、news_types(公告类型)、news_photo(公告图片路径)、insert_time(公告时间)
画ER图用Visio或亿图,记住3个规则:
- 矩形代表“实体”(比如“用户”“项目”)
- 椭圆代表“属性”(比如用户的“姓名”“手机号”)
- 菱形代表“关系”(比如“用户-参与-项目”是多对多,一个用户能参与多个项目,一个项目能有多个用户参与) 避坑提醒:别把“公告图片、项目封面”存数据库!我当初存二进制导致数据库崩溃,改成存“文件路径”(比如/static/photo/news1.jpg)才对。
2. 数据库物理设计(附建表SQL示例)
ER图画好后,转成实际表,字段类型和约束别瞎设!比如“项目进度详情”用VARCHAR(500),别用TEXT,不然查询速度慢;“用户手机号”设UNIQUE约束,避免重复。
给宝子们贴“项目表”的建表SQL,复制到Navicat就能用:
CREATE TABLE `xiangmu` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '项目ID',
`xiangmu_name` VARCHAR(200) NOT NULL COMMENT '项目名称',
`xiangmu_photo` VARCHAR(200) DEFAULT NULL COMMENT '项目封面路径',
`xiangmu_types` INT DEFAULT NULL COMMENT '项目类型',
`xiangmu_address` VARCHAR(200) DEFAULT NULL COMMENT '所属地点',
`yonghu_id` INT DEFAULT NULL COMMENT '关联项目负责人ID',
`xiangmu_content` VARCHAR(500) DEFAULT NULL COMMENT '项目简介',
`xiangmu_yesno_types` INT DEFAULT 0 COMMENT '审核状态:0待审核/1已通过/2已拒绝',
`xiangmu_yesno_text` VARCHAR(200) DEFAULT NULL COMMENT '审核结果',
`insert_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `fk_yonghu` (`yonghu_id`), -- 外键关联用户表
UNIQUE KEY `uk_xiangmu_name` (`xiangmu_name`) -- 项目名称唯一
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目表';
3. 表关联测试!别等编码才发现错
建完表一定要测关联!比如在“项目进度表”插数据(用户ID=1,项目ID=1),用JOIN查询:
SELECT y.yonghu_name, x.xiangmu_name, j.xiangmujindu_text, j.insert_time
FROM xiangmujindu j
JOIN yonghu y ON j.yonghu_id = y.id
JOIN xiangmu x ON j.xiangmu_id = x.id
WHERE j.id = 1;
如果能查出“用户名+项目名+进度详情+添加时间”,说明关联没问题;如果报错“Unknown column”,大概率是外键没设对,赶紧检查表结构。
四、功能实现:核心模块代码+页面设计
不用做所有功能!先搞定4个核心模块,答辩时足够出彩。每个模块我都附了代码片段和页面设计要点,宝子们直接套就行。
1. 管理员端:项目审核模块(必做!)
这是管理员的核心功能,实现“审核项目、填写审核结果”,重点说“审核状态校验”——别漏“已审核项目不能重复审核”,我当初就是这里踩了大坑!
(1)核心代码片段(Spring Boot)
Controller层(处理项目审核):
@RestController
@RequestMapping("/admin/xiangmu")
public class AdminXiangmuController {
@Autowired
private XiangmuService xiangmuService;
// 项目审核
@PostMapping("/audit")
public Result auditXiangmu(@RequestBody XiangmuAuditDTO auditDTO, HttpSession session) {
// 1. 获取当前登录管理员
Admin admin = (Admin) session.getAttribute("loginAdmin");
if (admin == null) {
return Result.error("未登录,请先登录!");
}
// 2. 校验项目是否存在
Xiangmu xiangmu = xiangmuService.getById(auditDTO.getProjectId());
if (xiangmu == null) {
return Result.error("项目不存在!");
}
// 3. 校验项目是否已审核
if (xiangmu.getXiangmu_yesno_types() != 0) {
return Result.error("该项目已审核,无需重复操作!");
}
// 4. 更新审核状态和结果
xiangmu.setXiangmu_yesno_types(auditDTO.getAuditStatus()); // 1通过/2拒绝
xiangmu.setXiangmu_yesno_text(auditDTO.getAuditResult());
xiangmuService.updateById(xiangmu);
// 5. 返回结果
return Result.success("审核成功!");
}
}
// 审核DTO
@Data
public class XiangmuAuditDTO {
private Integer projectId; // 项目ID
private Integer auditStatus; // 审核状态:1通过/2拒绝
private String auditResult; // 审核结果
}
(2)页面设计要点(Vue)
页面标题:管理员-项目审核页面
(插入图片位置:此处放“项目审核页面截图”,需包含以下元素)
- 筛选条件:项目状态下拉(待审核/已通过/已拒绝/全部)、项目名称模糊查
- 项目列表表格:列名“项目名称、负责人、所属地点、创建时间、审核状态、操作”,审核状态用颜色标(待审核黄/已通过绿/已拒绝红)
- 审核弹窗:点“审核”弹出,含项目简介、项目封面预览、审核状态单选(通过/拒绝)、审核结果输入框(必填,拒绝时需说明原因)
- 按钮:“查看详情”“审核”“作废项目”
(3)避坑提醒
- 记录审核日志!方便追溯(需新增审核日志表):
XiangmuAuditLog log = new XiangmuAuditLog(); log.setProjectId(auditDTO.getProjectId()); log.setAdminId(admin.getId()); log.setAuditStatus(auditDTO.getAuditStatus()); log.setAuditResult(auditDTO.getAuditResult()); log.setAuditTime(new Date()); auditLogService.save(log); - 作废项目需校验!已通过的项目不能直接作废:
if (xiangmu.getXiangmu_yesno_types() == 1) { return Result.error("已通过项目需先驳回,才能作废!"); }
2. 用户端:项目进度提交模块(核心需求!)
用户用系统的核心是“参与项目”,流程别复杂:选项目→填进度→传佐证材料→提交,我当初加“进度修改记录”,代码量翻倍,其实“基础提交+进度查看”更实用。
(1)核心代码片段(Vue+Spring Boot)
Vue页面(进度提交表单):
<template>
<div class="progress-form">
<el-form :model="progressForm" :rules="progressRules" ref="progressRef" label-width="120px">
<el-form-item label="项目名称" prop="projectId">
<el-select v-model="progressForm.projectId" placeholder="请选择项目">
<el-option
v-for="project in projectList"
:key="project.id"
:label="project.xiangmu_name"
:value="project.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="进度详情" prop="progressText">
<el-input
type="textarea"
v-model="progressForm.progressText"
placeholder="请描述项目进度"
rows="4"
></el-input>
</el-form-item>
<el-form-item label="佐证材料" prop="file">
<el-upload
action="/api/user/xiangmujindu/upload"
:file-list="fileList"
:on-success="handleFileSuccess"
accept=".jpg,.png,.pdf"
:limit="1"
>
<el-button type="primary">点击上传</el-button>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitProgress">提交进度</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
data() {
return {
progressForm: {
projectId: '',
progressText: '',
fileUrl: ''
},
progressRules: {
projectId: [{ required: true, message: '请选择项目', trigger: 'change' }],
progressText: [{ required: true, message: '请描述进度详情', trigger: 'blur' }],
file: [{ required: true, message: '请上传佐证材料', trigger: 'change' }]
},
projectList: [],
fileList: []
}
},
mounted() {
// 获取用户参与的项目
this.getProjectList();
},
methods: {
getProjectList() {
this.$axios.get('/api/user/xiangmu/list').then(res => {
if (res.data.success) {
this.projectList = res.data.data;
}
});
},
handleFileSuccess(res) {
this.progressForm.fileUrl = res.data.fileUrl; // 保存文件路径
},
submitProgress() {
this.$refs.progressRef.validate(valid => {
if (valid) {
this.$axios.post('/api/user/xiangmujindu/add', this.progressForm).then(res => {
if (res.data.success) {
this.$message.success('进度提交成功!');
this.resetForm();
} else {
this.$message.error(res.data.msg);
}
});
}
});
},
resetForm() {
this.$refs.progressRef.resetFields();
this.fileList = [];
this.progressForm.fileUrl = '';
}
}
}
</script>
(2)页面设计要点
页面标题:用户-项目进度提交页面
(插入图片位置:此处放“进度提交页面截图”,需包含以下元素)
- 表单元素:
- 项目名称(下拉框,仅显示用户参与的项目,必填)
- 进度详情(文本域,必填,提示“请描述当前进度,如:完成需求分析”)
- 佐证材料(上传框,支持JPG/PNG/PDF,必填,限制1个文件,最大5MB)
- 按钮:“提交进度”(蓝色el-button--primary)和“重置”(灰色el-button)
- 提示信息:红色显“校验失败”,绿色显“提交成功”
(3)避坑提醒
- 限制文件大小!在Spring Boot配置:
spring.servlet.multipart.max-file-size=5MB spring.servlet.multipart.max-request-size=10MB - 校验用户是否参与项目!避免提交非参与项目的进度:
List<Integer> projectIds = xiangmuUserService.getProjectIdsByUserId(userId); if (!projectIds.contains(progressForm.getProjectId())) { return Result.error("您未参与该项目,无法提交进度!"); }
3. 管理员端:公告管理模块(答辩亮点!)
这个功能最能体现“管理属性”,导师超爱问!核心是“发布公告、管理公告类型”,别漏“公告图片预览”,不然管理员没法确认公告展示效果。
页面设计要点
页面标题:管理员-公告管理页面
(插入图片位置:此处放“公告管理页面截图”,需包含以下元素)
- 筛选条件:公告类型下拉(系统通知/项目提醒/全部)、公告标题模糊查
- 公告列表表格:列名“公告标题、公告类型、公告时间、公告图片、操作”,公告类型用标签显(系统通知蓝/项目提醒绿)
- 操作按钮:“查看详情”“修改公告”“删除公告”
- 新增公告弹窗:含公告标题输入框、公告类型下拉、公告图片上传、公告详情富文本框(支持换行、加粗)
五、测试别敷衍!这3步让答辩不翻车
很多宝子觉得“功能能跑就行”,结果答辩时评委一测就出问题!我当初没测“重复提交项目进度”,导致用户能多次提交同一项目的相同进度,导师说“不符合流程管控逻辑”,当场扣分😫 测试一定要针对性做!
1. 功能测试(必测3个模块)
别全测!重点测“核心功能”,我整理了测试用例表,直接填结果:
(1)项目审核测试(表1:项目审核测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 审核已通过项目 | 选已通过的项目→点审核→选“通过”→提交 | 提示“该项目已审核,无需重复操作!” | ||
| 拒绝项目无理由 | 选待审核项目→点审核→选“拒绝”→结果空→提交 | 提示“请填写拒绝原因!” | ||
| 正常审核项目 | 选待审核项目→点审核→选“通过”→填“符合要求”→提交 | 提示“审核成功!”,项目状态变“已通过” |
(2)进度提交测试(表2:进度提交测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 未选项目提交 | 进度详情填“完成开发”→传文件→提交 | 提示“请选择项目!” | ||
| 传非支持格式文件 | 选项目→填进度→传TXT文件→提交 | 提示“仅支持JPG/PNG/PDF格式!” | ||
| 正常提交进度 | 选项目→填“完成测试”→传PNG截图→提交 | 提示“进度提交成功!”,列表显该进度 |
(3)管理员登录测试(表3:管理员登录测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 密码错误 | 账号:admin→密码:123456(正确123)→登录 | 提示“账号或密码不正确!” | ||
| 未填账号 | 账号:空→密码:123→登录 | 提示“请输入账号!” | ||
| 正常登录 | 账号:admin→密码:123→登录 | 登录成功,跳管理员首页 |
2. 兼容性测试(容易忽略的点)
别只在自己电脑测!答辩时评委可能用不同浏览器,我当初没测IE,结果公告列表错乱,赶紧改CSS才好:
- 浏览器测试:Chrome、Firefox、Edge、IE11(重点测IE,兼容性最差)
- 分辨率测试:1920×1080、1366×768(别让页面出现横向滚动条)
3. 测试报告要写好!答辩加分
把测试结果整理成“测试报告”,含“目的、范围、用例、结果、问题总结”,导师会觉得你“做事严谨”。比如:
- 问题总结:“IE浏览器下公告表格错乱,用table-layout:fixed解决;未登录能访问进度提交页,加拦截器控制”
- 测试结论:“核心功能(项目审核、进度提交、登录)均通过测试,无严重bug;兼容性问题已修复,系统可正常用”
六、答辩准备:3个加分小技巧
毕设不仅要做出来,还要说清楚!我当初准备了这3点,导师直接给“良好”:
- 演示流程要顺畅:提前录演示视频(怕系统崩),按“管理员审核项目→用户提交进度→管理员查看进度”的流程来,别跳步
- 重点讲“你解决了啥问题”:比如“一开始项目图片存数据库加载慢,改成存路径后,速度提升70%”,比光说“我用了Spring Boot”有亮点
- 准备常见问题:导师大概率问“为啥选MySQL不选Oracle”“用户变多怎么优化”,提前答:“MySQL轻量适合中小型管理系统;用户变多就加索引,优化查询速度”
最后:毕设通关的小私心
以上就是基于Spring Boot的工作流程管理系统从0到1的避坑干货!毕设没那么难,关键是找对方法,别瞎做复杂功能。
需要核心源码(带注释,直接能跑)、数据库脚本(含测试数据)、ER图模板的宝子,评论区扣“工作流程管理系统”,我私发你;卡在某个模块(比如项目审核、进度提交),也可以留言,我看到必回!
点赞收藏这篇,下次找流程不迷路~祝宝子们毕设顺利,轻松毕业!😘