软工大作业中期总结:从需求到实现的跨越之路

软工大作业中期总结:从需求到实现的跨越之路

一、引言:项目背景与中期目标回顾

在软件工程课程体系中,大作业是检验学生综合能力的核心环节。本次大作业以“企业级任务管理系统”为课题,要求实现任务分配、进度跟踪、团队协作等功能,覆盖需求分析、系统设计、编码实现、测试部署全流程。中期目标聚焦于完成核心功能模块的开发与初步集成,形成可运行的原型系统。

项目启动初期,团队通过用户调研与竞品分析,明确了系统的核心需求:支持多角色权限管理、任务生命周期可视化、实时协作与通知机制。中期阶段,我们以“功能完整性”与“架构合理性”为双目标,推进开发工作。

二、需求分析:从模糊到精准的迭代过程

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. 1. 任务创建时支持选择部门;
  4. 2. 部门成员自动继承任务权限;
  5. 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层):

  1. @RestController
  2. @RequestMapping("/api/tasks")
  3. public class TaskController {
  4. @Autowired
  5. private TaskService taskService;
  6. @PostMapping("/assign")
  7. public ResponseEntity<Task> assignTask(
  8. @RequestBody TaskAssignmentRequest request,
  9. @AuthenticationPrincipal UserDetails userDetails) {
  10. // 权限校验:仅管理员可分配任务
  11. if (!userDetails.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) {
  12. throw new AccessDeniedException("无权限分配任务");
  13. }
  14. Task task = taskService.assignTask(
  15. request.getTaskId(),
  16. request.getDepartmentId(),
  17. request.getDeadline()
  18. );
  19. return ResponseEntity.ok(task);
  20. }
  21. }

2. 实时通知机制

实现方式:通过WebSocket实现任务状态变更的实时推送。
前端代码(Vue.js):

  1. // 连接WebSocket服务
  2. const socket = new WebSocket('ws://localhost:8080/notifications');
  3. socket.onmessage = (event) => {
  4. const notification = JSON.parse(event.data);
  5. this.$notify({
  6. title: '任务更新',
  7. message: `任务 ${notification.taskId} 状态变为 ${notification.status}`,
  8. type: 'success'
  9. });
  10. };

五、团队协作与问题解决

1. 协作模式

采用Git分支管理策略

  • 主分支(main):仅合并通过测试的代码;
  • 开发分支(develop):集成每日开发成果;
  • 特性分支(feature/*):每个功能点独立分支,开发完成后提交Merge Request。

2. 典型问题与解决方案

  • 问题1:前后端接口定义不一致导致集成失败。
    解决:引入Swagger生成API文档,开发前双方确认接口字段。
  • 问题2:MySQL并发写入导致数据冲突。
    解决:在事务中添加乐观锁(版本号控制),示例:
    1. UPDATE tasks
    2. SET status = 'COMPLETED', version = version + 1
    3. WHERE id = 123 AND version = 5;

六、中期成果与后续计划

1. 当前进展

  • 完成核心功能开发(任务分配、进度跟踪、通知机制);
  • 实现单元测试覆盖率80%(JUnit + Mockito);
  • 部署至测试环境,通过基础功能验收。

2. 下阶段目标

  • 优化性能:对高频查询接口(如任务列表)添加Redis缓存;
  • 增强安全性:集成JWT实现无状态认证;
  • 准备最终演示:录制操作视频,编写用户手册。

七、总结与启示

中期阶段的实践让我们深刻体会到:

  1. 需求管理是项目成功的基石,模糊的需求会导致开发返工;
  2. 架构设计需兼顾扩展性,例如预留插件化接口以便后续功能扩展;
  3. 自动化工具提升效率,如Jenkins实现代码自动构建与部署。

未来,我们将继续以“用户价值”为导向,在保证质量的前提下加速迭代,争取交付一个稳定、易用的任务管理系统。