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 查詢一併載入。藉此減少了不必要的額外查詢,並提升了回應速度。