团队冲刺记录

1、整个项目预期的任务量:10天
已花费:2天
完成的任务:我们组决定将自身开发将ai结合,但是考虑到现在ai并不能轻易的完成一个完整的项目,因此我们将使用ai提高我们组的开发效率,让ai大致设计了一个项目结构的相关内容进行参考‘
一、后端架构设计(Spring Boot)

  1. 项目结构
    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)

  2. 项目结构
    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 List participants;

    @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互转
    }
    }

  3. 服务层示例
    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) -> {
    List predicates = 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);
    }
    }

  4. 控制层示例
    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 ResponseEntity getTaskProgress(@PathVariable Integer taskId) {
    return ResponseEntity.ok(taskService.getProgress(taskId));
    }
    }

  5. 任务派发界面示例
    Vue

  1. 文件上传处理
    Java
    @PostMapping("/upload-plan")
    public ResponseEntity uploadPlan(
    @RequestParam("file") MultipartFile file,
    @RequestParam("planId") Integer planId) {

    String path = fileStorageService.store(file);
    drillPlanService.updatePlanFile(planId, path);
    return ResponseEntity.ok(new FileUploadRes(path));
    }

  2. 安全须知确认
    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、会议照片:

posted @ 2025-04-17 21:47  敢死队1111  阅读(6)  评论(0)    收藏  举报