shape

Dodam - 为在校生构建并运营社团申请与管理功能

概述

负责大邱软件 Meister 高中第 10 届新生的社团分配工作

技术栈

  • Java

    Java

  • Spring Boot

    Spring Boot

  • Spring JPA

    Spring JPA

  • MySQL

    MySQL

  • Redis

    Redis

  • Docker Compose

    Docker Compose

  • AWS

    AWS

  • GitHub Actions

    GitHub Actions

  • Git

    Git

团队

9 人(后端 2 人、Web 3 人、Android 2 人、iOS 2 人)

期间

2025.03

相关链接

后端源码网页服务

详细内容

  1. 社团创建功能实现
    • 输入社团名称、创建理由、初始成员和简介即可创建社团。
    • 社长可以向学生发送加入邀请。
    • 教师可以审核社团创建申请,并批准或拒绝创建。
    • 学生可以查看自己的创建申请状态。
    社团创建功能实现 1
  2. 社团加入申请逻辑实现
    • 实现了让用户按第一至第三志愿的顺序申请加入心仪社团的逻辑。
    • 由于社团分为官方(课程)社团和自主社团,因此还需要提供申请加入自主社团的功能。
    社团加入申请逻辑实现 1
  3. 加入申请的接受、待处理、拒绝功能实现
    • 社长在创建社团时可以选择社团成员。
    • 在学生本人接受之前,不能将该学生添加为社团成员。
    • 为此,将加入邀请请求划分为已接受、待处理、已拒绝三种状态,让社长能够清晰地了解哪些学生希望加入自己的社团。
    加入申请的接受、待处理、拒绝功能实现 1
    加入申请的接受、待处理、拒绝功能实现 2
  4. 已于 2025 年 3 月投入实际使用,供大邱软件 Meister 高中第 10 届新生及在校生进行社团申请。
      已于 2025 年 3 月投入实际使用,供大邱软件 Meister 高中第 10 届新生及在校生进行社团申请。 1
    • 问题排查
      • ☄️ 问题背景
      • 社团功能开发之初,方案计划为学生只申请一个自己心仪的官方社团。但由于客户(学校)提出了变更逻辑的需求,我不得不在短时间内构建一套逻辑:学生分别填报第一、第二、第三志愿后,再随机确定加入的成员。
      • 在重构过程中,我发现 ClubMemberRepository 中可能存在 JPA 的 N+1 问题。
      • ⭐️ 解决方法
      • 我采用了基于优先级的分配算法(Priority-based Allocation Algorithm)。借助该算法,能够按照学生的申请优先级,对有限的资源(社团名额)进行最优分配。
      • 通过 processAllPriorities 方法按优先级处理学生的申请,当某个社团达到名额上限时,可将排名靠后的申请者转移到其下一志愿的社团。
      • 利用 assignedStudents 集合从根本上杜绝了同一名学生被重复分配的情况:一旦完成分配便立即将该学生加入集合,以阻止重复分配。
      • 我通过 @EntityGraph(attributePaths = {"club"}) 使用 Fetch Join,借助 JOIN 查询一并加载社团实体。由此减少了不必要的额外查询,并提升了响应速度。