软工大作业中期总结:从需求到实现的跨越之路
一、引言:项目背景与中期目标回顾
在软件工程课程体系中,大作业是检验学生综合能力的核心环节。本次大作业以“企业级任务管理系统”为课题,要求实现任务分配、进度跟踪、团队协作等功能,覆盖需求分析、系统设计、编码实现、测试部署全流程。中期目标聚焦于完成核心功能模块的开发与初步集成,形成可运行的原型系统。
项目启动初期,团队通过用户调研与竞品分析,明确了系统的核心需求:支持多角色权限管理、任务生命周期可视化、实时协作与通知机制。中期阶段,我们以“功能完整性”与“架构合理性”为双目标,推进开发工作。
二、需求分析:从模糊到精准的迭代过程
1. 需求收集与优先级划分
初期通过访谈、问卷收集了20余条用户需求,但存在表述模糊、功能重叠的问题。例如,用户提出“需要任务提醒功能”,但未明确提醒方式(邮件/站内信)和触发条件(截止前24小时/任务状态变更时)。团队采用MoSCoW方法(Must-have, Should-have, Could-have, Won’t-have)对需求进行优先级排序:
- Must-have:任务创建与分配、进度更新、权限控制(管理员/普通用户)
- Should-have:任务依赖关系、文件附件支持
- Could-have:移动端适配、数据分析看板
- Won’t-have:AI任务推荐(中期暂不实现)
2. 需求文档的规范化
为避免开发过程中的理解偏差,团队制定了《需求规格说明书》,采用用户故事(User Story)格式描述功能点。例如:
**用户故事**:作为项目经理,我希望能够按部门分配任务,以便明确责任人。**验收标准**:1. 任务创建时支持选择部门;2. 部门成员自动继承任务权限;3. 分配结果通过邮件通知相关人员。
通过UML用例图(图1)和活动图(图2)进一步细化交互流程,确保需求可追溯、可验证。
三、系统设计:架构选择与模块划分
1. 技术栈选型
基于项目需求,团队选择以下技术栈:
- 后端:Spring Boot(Java) + MySQL(关系型数据库)
- 前端:Vue.js(渐进式框架) + Element UI(组件库)
- 部署:Docker容器化 + Jenkins持续集成
选型依据:
- Spring Boot:快速开发RESTful API,集成Spring Security实现权限控制;
- Vue.js:组件化开发提高前端复用性,响应式设计适配多终端;
- Docker:解决环境依赖问题,便于团队协同开发与部署。
2. 架构设计
采用分层架构(图3),划分为表现层、业务逻辑层、数据访问层:
- 表现层:处理用户请求,返回JSON数据;
- 业务逻辑层:实现任务分配、状态变更等核心逻辑;
- 数据访问层:封装JDBC操作,使用MyBatis实现ORM映射。
关键设计模式:
- 工厂模式:动态创建任务类型(普通任务/紧急任务);
- 观察者模式:实现任务状态变更时的通知机制。
四、开发实现:核心功能与代码示例
1. 任务分配模块
功能描述:支持管理员按部门分配任务,并设置截止时间。
代码示例(Spring Boot Controller层):
@RestController@RequestMapping("/api/tasks")public class TaskController {@Autowiredprivate TaskService taskService;@PostMapping("/assign")public ResponseEntity<Task> assignTask(@RequestBody TaskAssignmentRequest request,@AuthenticationPrincipal UserDetails userDetails) {// 权限校验:仅管理员可分配任务if (!userDetails.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) {throw new AccessDeniedException("无权限分配任务");}Task task = taskService.assignTask(request.getTaskId(),request.getDepartmentId(),request.getDeadline());return ResponseEntity.ok(task);}}
2. 实时通知机制
实现方式:通过WebSocket实现任务状态变更的实时推送。
前端代码(Vue.js):
// 连接WebSocket服务const socket = new WebSocket('ws://localhost:8080/notifications');socket.onmessage = (event) => {const notification = JSON.parse(event.data);this.$notify({title: '任务更新',message: `任务 ${notification.taskId} 状态变为 ${notification.status}`,type: 'success'});};
五、团队协作与问题解决
1. 协作模式
采用Git分支管理策略:
- 主分支(main):仅合并通过测试的代码;
- 开发分支(develop):集成每日开发成果;
- 特性分支(feature/*):每个功能点独立分支,开发完成后提交Merge Request。
2. 典型问题与解决方案
- 问题1:前后端接口定义不一致导致集成失败。
解决:引入Swagger生成API文档,开发前双方确认接口字段。 - 问题2:MySQL并发写入导致数据冲突。
解决:在事务中添加乐观锁(版本号控制),示例:UPDATE tasksSET status = 'COMPLETED', version = version + 1WHERE id = 123 AND version = 5;
六、中期成果与后续计划
1. 当前进展
- 完成核心功能开发(任务分配、进度跟踪、通知机制);
- 实现单元测试覆盖率80%(JUnit + Mockito);
- 部署至测试环境,通过基础功能验收。
2. 下阶段目标
- 优化性能:对高频查询接口(如任务列表)添加Redis缓存;
- 增强安全性:集成JWT实现无状态认证;
- 准备最终演示:录制操作视频,编写用户手册。
七、总结与启示
中期阶段的实践让我们深刻体会到:
- 需求管理是项目成功的基石,模糊的需求会导致开发返工;
- 架构设计需兼顾扩展性,例如预留插件化接口以便后续功能扩展;
- 自动化工具提升效率,如Jenkins实现代码自动构建与部署。
未来,我们将继续以“用户价值”为导向,在保证质量的前提下加速迭代,争取交付一个稳定、易用的任务管理系统。