团队冲刺记录
1、整个项目预期的任务量:10天
已花费:2天
完成的任务:我们组决定将自身开发将ai结合,但是考虑到现在ai并不能轻易的完成一个完整的项目,因此我们将使用ai提高我们组的开发效率,让ai大致设计了一个项目结构的相关内容进行参考‘
一、后端架构设计(Spring Boot)
-
项目结构
Java
src/main/java
├── com.emdrill
│ ├── config // 配置类
│ ├── controller // 控制层
│ │ ├── DrillPlanController.java
│ │ ├── DrillTaskController.java
│ │ └── ...
│ ├── service // 服务层
│ │ ├── impl
│ │ │ ├── DrillPlanServiceImpl.java
│ │ │ └── ...
│ ├── repository // 数据层
│ │ ├── DrillPlanRepository.java
│ │ └── ...
│ ├── entity // 实体类
│ │ ├── DrillPlan.java
│ │ └── ...
│ ├── dto // 数据传输对象
│ │ ├── request
│ │ │ ├── CreatePlanReq.java
│ │ │ └── ...
│ │ └── response
│ │ ├── PlanDetailRes.java
│ │ └── ...
│ └── Exception // 异常处理
│ └── GlobalExceptionHandler.java
二、前端架构设计(Vue3 + Element Plus) -
项目结构
Text
src/
├── api/ // 接口定义
│ └── drillApi.js
├── assets/ // 静态资源
├── components/ // 公共组件
├── router/ // 路由配置
├── store/ // Vuex状态管理
├── views/
│ ├── PlanManagement.vue // 计划管理
│ ├── TaskAssignment.vue // 任务派发
│ └── ...
通过ai大致给了我们一个开发的方向,但是ai给我们的生成的并不完整,我们组将在大概的内容架构基础上进行完善
前端后端初期进行了一个起步
DrillPlan.java(JPA实体映射)
@Entity
@Table(name = "drill_plan")
@DynamicUpdate
public class DrillPlan {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer planId;@Column(nullable = false, length = 100)
private String department;@Enumerated(EnumType.STRING)
@Column(nullable = false, length = 20)
private ProjectType projectType;@Column(columnDefinition = "JSON")
@Convert(converter = StringListConverter.class)
private Listparticipants; @Column(updatable = false)
private LocalDateTime createTime;// 枚举类型定义
public enum ProjectType {
TICKET_SYSTEM, SERVICE_SYSTEM, PLATFORM, POWER_SUPPLY
}// JSON转换器
@Converter
public static class StringListConverter implements AttributeConverter<List, String> {
// 实现JSON与List互转
}
} -
服务层示例
DrillPlanService.java
@Service
@RequiredArgsConstructor
public class DrillPlanService {
private final DrillPlanRepository planRepository;@Transactional
public DrillPlan createPlan(CreatePlanReq request) {
DrillPlan plan = new DrillPlan();
BeanUtils.copyProperties(request, plan);// 处理文件上传 if (!request.getPlanFile().isEmpty()) { String filePath = FileStorageUtil.save(request.getPlanFile()); plan.setPlanFile(filePath); } return planRepository.save(plan);
}
public Page
getPlans(PlanQuery query, Pageable pageable) {
return planRepository.findAll(
(root, query, cb) -> {
Listpredicates = new ArrayList<>();
if (query.getProjectType() != null) {
predicates.add(cb.equal(root.get("projectType"), query.getProjectType()));
}
return cb.and(predicates.toArray(new Predicate[0]));
},
pageable
).map(this::convertToBriefRes);
}
} -
控制层示例
DrillTaskController.java
@RestController
@RequestMapping("/api/tasks")
@RequiredArgsConstructor
public class DrillTaskController {
private final DrillTaskService taskService;@PostMapping("/assign")
public ResponseEntity<?> assignTask(@RequestBody AssignTaskReq req) {
TaskAssignmentResult res = taskService.assignTask(req);
return ResponseEntity.ok(res);
}@GetMapping("/{taskId}/progress")
public ResponseEntitygetTaskProgress(@PathVariable Integer taskId) {
return ResponseEntity.ok(taskService.getProgress(taskId));
}
} -
任务派发界面示例
Vue
<el-button type="primary" @click="submit">派发任务
-
文件上传处理
Java
@PostMapping("/upload-plan")
public ResponseEntityuploadPlan(
@RequestParam("file") MultipartFile file,
@RequestParam("planId") Integer planId) {String path = fileStorageService.store(file);
drillPlanService.updatePlanFile(planId, path);
return ResponseEntity.ok(new FileUploadRes(path));
} -
安全须知确认
JavaScript
// 前端倒计时组件
const showSafetyAlert = (duration = 60) => {
let remaining = duration
const timer = setInterval(() => {
remaining--
if (remaining <= 0) clearInterval(timer)
}, 1000)
ElMessageBox.alert('请仔细阅读安全须知...', {
confirmButtonText: '我已阅读',
callback: () => {
drillApi.confirmSafety(taskId)
}
})
}
遇见的问题:对于个别关键技术需要学习,学习与应用的结合有一点生疏带来的困难,需要做几个小实例进行熟练
演练计划管理模块今日即可完成
2、看板照片:
3、会议照片: