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