diff --git a/.gitignore b/.gitignore
index 37bad9ff..98e0e0e8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -161,4 +161,148 @@ coverage/
*.crt
*.p12
*.keystore/xgxt/
-excel/
\ No newline at end of file
+excel/
+backend/script/sql/add-related-type-field.sql
+backend/script/sql/execute-fix-stgl-member.sql
+backend/script/sql/fix-stgl-activity-remark-field.sql
+backend/script/sql/fix-stgl-member-remark-field.sql
+backend/script/sql/stgl_dict_data.sql
+backend/script/sql/stgl_menu_init.sql
+backend/script/sql/stgl_volunteer_role_dict.sql
+backend/script/sql/xljk-dict-data.sql
+backend/sql/stgl_volunteer_team_menu.sql
+backend/sql/stgl_volunteer_team.sql
+backend/sql/volunteer_apply_permission.sql
+docs/sql/stgl_material_task_add_remark_field.sql
+docs/变更管理/材料收集管理模块开发完成-2025-01-03-lixuming.md
+docs/变更管理/材料收集任务查询SQL错误修复-2025-01-03-system.md
+docs/变更管理/材料提交记录SQL错误修复-2025-08-22-system.md
+docs/变更管理/活动报名成绩录入优化-2025-08-21-lixuming.md
+docs/变更管理/活动报名大厅团队报名优化-2025-01-03-lixuming.md
+docs/变更管理/活动报名管理审核功能优化-2025-01-15-lixuming.md
+docs/变更管理/活动报名状态动态计算优化-2025-01-21-system.md
+docs/变更管理/社团管理字段名称一致性检查报告.md
+docs/变更管理/code-adjust-record-2025-01-03-lixuming.md
+docs/变更管理/code-adjust-record-2025-01-03-system.md
+docs/变更管理/code-adjust-record-2025-01-05-system.md
+docs/变更管理/code-adjust-record-2025-01-07-cursor.md
+docs/变更管理/code-adjust-record-2025-01-07-lixuming.md
+docs/变更管理/code-adjust-record-2025-01-08-assistant.md
+docs/变更管理/code-adjust-record-2025-01-08-cursor.md
+docs/变更管理/code-adjust-record-2025-01-08-lixuming.md
+docs/变更管理/code-adjust-record-2025-01-10-CursorAI.md
+docs/变更管理/code-adjust-record-2025-01-14-cursor.md
+docs/变更管理/code-adjust-record-2025-01-15-compilation-fix.md
+docs/变更管理/code-adjust-record-2025-01-15-cursor.md
+docs/变更管理/code-adjust-record-2025-01-15-lixuming.md
+docs/变更管理/code-adjust-record-2025-01-15-volunteer-consistency-fix.md
+docs/变更管理/code-adjust-record-2025-01-15-volunteer-member-404-fix.md
+docs/变更管理/code-adjust-record-2025-01-15-volunteer-member-api-import-fix.md
+docs/变更管理/code-adjust-record-2025-01-15-volunteer-member-resetform-fix.md
+docs/变更管理/code-adjust-record-2025-01-15-volunteer-member-search-optimization.md
+docs/变更管理/code-adjust-record-2025-01-15-volunteer-member-ui-enhancement.md
+docs/变更管理/code-adjust-record-2025-01-15-volunteer-team-selector.md
+docs/变更管理/code-adjust-record-2025-01-16-lixuming.md
+docs/变更管理/code-adjust-record-2025-01-17-CursorAI.md
+docs/变更管理/code-adjust-record-2025-01-18-lixuming.md
+docs/变更管理/code-adjust-record-2025-01-19-cursor.md
+docs/变更管理/code-adjust-record-2025-01-20-lixuming.md
+docs/变更管理/code-adjust-record-2025-01-21-AI.md
+docs/变更管理/code-adjust-record-2025-01-21-cursor.md
+docs/变更管理/code-adjust-record-2025-01-21-lixuming-club-optimization.md
+docs/变更管理/code-adjust-record-2025-01-21-lixuming.md
+docs/变更管理/code-adjust-record-2025-01-22-cursor-fix-copy-activity.md
+docs/变更管理/code-adjust-record-2025-01-26-cursor.md
+docs/变更管理/code-adjust-record-2025-01-26-lixuming.md
+docs/变更管理/code-adjust-record-2025-01-27-lixuming.md
+docs/变更管理/code-adjust-record-2025-01-27-volunteer-permission-fix.md
+docs/变更管理/code-adjust-record-2025-01-28-lixuming.md
+docs/变更管理/code-adjust-record-2025-01-31-cursor.md
+docs/变更管理/code-adjust-record-2025-01-31-lixuming-stgl-activity-export.md
+docs/变更管理/code-adjust-record-2025-01-31-lixuming.md
+docs/变更管理/code-adjust-record-2025-07-01-assistant.md
+docs/变更管理/code-adjust-record-2025-07-01-lixuming.md
+docs/变更管理/code-adjust-record-2025-08-08-lixuming.md
+docs/变更管理/code-adjust-record-2025-08-12-cursor.md
+docs/变更管理/code-adjust-record-2025-08-13-cursor.md
+docs/变更管理/code-adjust-record-2025-08-13-lixuming.md
+docs/变更管理/code-adjust-record-2025-08-15-dict-loading-fix.md
+docs/变更管理/code-adjust-record-2025-08-18-lixuming.md
+docs/变更管理/code-adjust-record-2025-08-19-志愿者报名状态字段修复.md
+docs/变更管理/code-adjust-record-2025-08-19-lixuming.md
+docs/变更管理/code-adjust-record-2025-08-19-stgl-member-clubName-search-fix.md
+docs/变更管理/code-adjust-record-2025-08-20-lixuming.md
+docs/变更管理/code-adjust-record-2025-08-21-lixuming.md
+docs/变更管理/code-adjust-record-2025-08-22-lixuming.md
+docs/变更管理/database-alter-stgl-club-add-remark-2025-07-01.sql
+docs/变更管理/fix-stgl-member-remark-field-2025-01-07.sql
+docs/开发文档/权限分离方案实施说明.md
+docs/开发文档/社团管理表单验证修复说明.md
+docs/开发文档/学生数据加载性能优化说明.md
+docs/开发文档/学生选择弹窗关闭问题修复说明.md
+docs/开发文档/指导老师选择弹窗数据获取问题修复说明.md
+docs/开发文档/API权限字符-活动考勤签到管理.md
+docs/开发文档/stgl_backend_development_summary.md
+docs/开发文档/API/社团管理API.md
+docs/开发文档/API/志愿者报名管理API.md
+docs/变更管理/code-adjust-record-2025-01-08-cursor.md
+docs/变更管理/code-adjust-record-2025-01-14-cursor.md
+docs/变更管理/code-adjust-record-2025-01-15-cursor.md
+docs/变更管理/code-adjust-record-2025-01-21-cursor.md
+docs/开发文档/API/社团管理API.md
+我的报名模块开发方案.md
+docs/变更管理/code-adjust-record-2025-01-08-cursor.md
+docs/变更管理/code-adjust-record-2025-01-14-cursor.md
+docs/变更管理/code-adjust-record-2025-01-15-cursor.md
+docs/变更管理/code-adjust-record-2025-01-21-cursor.md
+docs/开发文档/API/社团管理API.md
+docs/设计文档/database/教师数据初始化脚本.sql
+docs/设计文档/database/社团管理/活动考勤签到管理-字段长度更新.sql
+docs/设计文档/database/社团管理/活动考勤签到管理数据库设计.sql
+docs/设计文档/database/社团管理/社团成员数量修复总结.md
+docs/设计文档/database/社团管理/社团管理菜单权限配置修正版.sql
+docs/设计文档/database/社团管理/社团管理菜单权限配置增量版.sql
+docs/设计文档/database/社团管理/社团管理菜单权限配置正确版.sql
+docs/设计文档/database/社团管理/社团管理菜单权限配置最终版.sql
+docs/设计文档/database/社团管理/社团管理建表脚本.sql
+docs/设计文档/database/社团管理/修复活动报名表字段.sql
+docs/设计文档/database/社团管理/学生社团管理菜单结构对比分析.md
+docs/设计文档/database/社团管理/学生社团管理菜单配置优化版.sql
+docs/需求文档/社团管理需求/社团管理系统需求说明.md
+script/fix-activity-display-fields.sql
+script/material_management_config.sql
+script/stgl-activity-register-menu.sql
+script/test-volunteer-member-permission.md
+docs/变更管理/code-adjust-record-2025-01-08-cursor.md
+docs/变更管理/code-adjust-record-2025-01-14-cursor.md
+docs/变更管理/code-adjust-record-2025-01-15-cursor.md
+docs/变更管理/code-adjust-record-2025-01-21-cursor.md
+docs/开发文档/API/社团管理API.md
+docs/设计文档/database/社团管理/社团管理建表脚本.sql
+docs/需求文档/社团管理需求/社团管理系统需求说明.md
+script/update-volunteer-role-dict.sql
+script/sql/add-activity-attachment-fields.sql
+script/sql/fix-activity-related-type.sql
+test/stgl_api_test.py
+test/stgl-api-test.js
+docs/变更管理/code-adjust-record-2025-01-08-cursor.md
+docs/变更管理/code-adjust-record-2025-01-14-cursor.md
+docs/变更管理/code-adjust-record-2025-01-15-cursor.md
+docs/变更管理/code-adjust-record-2025-01-21-cursor.md
+docs/开发文档/API/社团管理API.md
+docs/设计文档/database/社团管理/社团管理建表脚本.sql
+docs/需求文档/社团管理需求/社团管理系统需求说明.md
+docs/变更管理/code-adjust-record-2025-01-08-cursor.md
+docs/变更管理/code-adjust-record-2025-01-14-cursor.md
+docs/变更管理/code-adjust-record-2025-01-15-cursor.md
+docs/变更管理/code-adjust-record-2025-01-21-cursor.md
+docs/开发文档/API/社团管理API.md
+docs/设计文档/database/社团管理/社团管理建表脚本.sql
+docs/需求文档/社团管理需求/社团管理系统需求说明.md
+docs/变更管理/code-adjust-record-2025-01-08-cursor.md
+docs/变更管理/code-adjust-record-2025-01-08-cursor.md
+docs/变更管理/code-adjust-record-2025-01-08-cursor.md
+docs/变更管理/code-adjust-record-2025-01-08-cursor.md
+docs/变更管理/code-adjust-record-2025-01-08-cursor.md
+docs/变更管理/code-adjust-record-2025-01-14-cursor.md
+docs/设计文档/database/社团管理/社团管理建表脚本.sql
diff --git a/backend/ruoyi-admin/src/main/resources/add_batch_id.sql b/backend/ruoyi-admin/src/main/resources/add_batch_id.sql
deleted file mode 100644
index fab91af0..00000000
--- a/backend/ruoyi-admin/src/main/resources/add_batch_id.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- 添加批次ID字段
-ALTER TABLE xljk_consultation_schedule ADD COLUMN batch_id VARCHAR(50) DEFAULT NULL COMMENT '批次ID,用于标识同一批次创建的预约时段';
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/pom.xml b/backend/ruoyi-modules/ruoyi-stgl/pom.xml
index f7e28e60..7d6e9a37 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/pom.xml
+++ b/backend/ruoyi-modules/ruoyi-stgl/pom.xml
@@ -88,6 +88,12 @@
ruoyi-common-doc
+
+
+ org.dromara
+ ruoyi-xg
+
+
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityAttendanceController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityAttendanceController.java
new file mode 100644
index 00000000..8fa069e1
--- /dev/null
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityAttendanceController.java
@@ -0,0 +1,148 @@
+package org.dromara.stgl.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.stgl.domain.vo.StglActivityAttendanceVo;
+import org.dromara.stgl.domain.bo.StglActivityAttendanceBo;
+import org.dromara.stgl.service.IStglActivityAttendanceService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+
+/**
+ * 活动考勤签到
+ *
+ * @author ruoyi
+ * @date 2025-01-15
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/stgl/activityAttendance")
+public class StglActivityAttendanceController extends BaseController {
+
+ private final IStglActivityAttendanceService stglActivityAttendanceService;
+
+ /**
+ * 查询活动考勤签到列表
+ */
+ @SaCheckPermission("stgl:activityAttendance:list")
+ @GetMapping("/list")
+ public TableDataInfo list(StglActivityAttendanceBo bo, PageQuery pageQuery) {
+ return stglActivityAttendanceService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出活动考勤签到列表
+ */
+ @SaCheckPermission("stgl:activityAttendance:export")
+ @Log(title = "活动考勤签到", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(StglActivityAttendanceBo bo, HttpServletResponse response) {
+ List list = stglActivityAttendanceService.queryList(bo);
+ ExcelUtil.exportExcel(list, "活动考勤签到", StglActivityAttendanceVo.class, response);
+ }
+
+ /**
+ * 获取活动考勤签到详细信息
+ */
+ @SaCheckPermission("stgl:activityAttendance:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(stglActivityAttendanceService.queryById(id));
+ }
+
+ /**
+ * 新增活动考勤签到
+ */
+ @SaCheckPermission("stgl:activityAttendance:add")
+ @Log(title = "活动考勤签到", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody StglActivityAttendanceBo bo) {
+ return toAjax(stglActivityAttendanceService.insertByBo(bo));
+ }
+
+ /**
+ * 修改活动考勤签到
+ */
+ @SaCheckPermission("stgl:activityAttendance:edit")
+ @Log(title = "活动考勤签到", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody StglActivityAttendanceBo bo) {
+ return toAjax(stglActivityAttendanceService.updateByBo(bo));
+ }
+
+ /**
+ * 删除活动考勤签到
+ */
+ @SaCheckPermission("stgl:activityAttendance:remove")
+ @Log(title = "活动考勤签到", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(stglActivityAttendanceService.deleteWithValidByIds(List.of(ids), true));
+ }
+
+ /**
+ * 查询用户已报名成功且进行中的活动列表
+ */
+ @SaCheckPermission("stgl:activityAttendance:list")
+ @GetMapping("/userAvailableActivities")
+ public R> getUserAvailableActivities() {
+ Long userId = LoginHelper.getUserId();
+ return R.ok(stglActivityAttendanceService.queryUserAvailableActivities(userId));
+ }
+
+ /**
+ * 根据活动ID和用户ID查询签到记录
+ */
+ @SaCheckPermission("stgl:activityAttendance:query")
+ @GetMapping("/getByActivityAndUser")
+ public R getByActivityAndUser(@RequestParam Long activityId) {
+ Long userId = LoginHelper.getUserId();
+ return R.ok(stglActivityAttendanceService.queryByActivityAndUser(activityId, userId));
+ }
+
+ /**
+ * 用户签到
+ */
+ @SaCheckPermission("stgl:activityAttendance:signIn")
+ @Log(title = "活动签到", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PostMapping("/signIn")
+ public R signIn(@Validated @RequestBody StglActivityAttendanceBo bo) {
+ // 设置当前登录用户ID
+ bo.setUserId(LoginHelper.getUserId());
+ return toAjax(stglActivityAttendanceService.signIn(bo));
+ }
+
+ /**
+ * 用户签退
+ */
+ @SaCheckPermission("stgl:activityAttendance:signOut")
+ @Log(title = "活动签退", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PostMapping("/signOut")
+ public R signOut(@Validated @RequestBody StglActivityAttendanceBo bo) {
+ // 设置当前登录用户ID
+ bo.setUserId(LoginHelper.getUserId());
+ return toAjax(stglActivityAttendanceService.signOut(bo));
+ }
+}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityController.java
new file mode 100644
index 00000000..c76b7a79
--- /dev/null
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityController.java
@@ -0,0 +1,146 @@
+package org.dromara.stgl.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.dromara.stgl.domain.bo.StglActivityBo;
+import org.dromara.stgl.domain.vo.StglActivityVo;
+import org.dromara.stgl.service.IStglActivityService;
+
+import java.util.List;
+
+/**
+ * 活动信息
+ *
+ * @author ruoyi
+ * @date 2025-01-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/stgl/activity")
+public class StglActivityController extends BaseController {
+
+ private final IStglActivityService stglActivityService;
+
+ /**
+ * 查询活动信息列表
+ */
+ @SaCheckPermission("stgl:activity:list")
+ @GetMapping("/list")
+ public TableDataInfo list(StglActivityBo bo, PageQuery pageQuery) {
+ return stglActivityService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出活动信息列表
+ */
+ @SaCheckPermission("stgl:activity:export")
+ @Log(title = "活动信息", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(StglActivityBo bo, HttpServletResponse response) {
+ List list = stglActivityService.queryList(bo);
+ ExcelUtil.exportExcel(list, "活动信息", StglActivityVo.class, response);
+ }
+
+ /**
+ * 获取活动信息详细信息
+ */
+ @SaCheckPermission("stgl:activity:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+ return R.ok(stglActivityService.queryById(id));
+ }
+
+ /**
+ * 新增活动信息
+ */
+ @SaCheckPermission("stgl:activity:add")
+ @Log(title = "活动信息", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody StglActivityBo bo) {
+ return toAjax(stglActivityService.insertByBo(bo));
+ }
+
+ /**
+ * 修改活动信息
+ */
+ @SaCheckPermission("stgl:activity:edit")
+ @Log(title = "活动信息", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody StglActivityBo bo) {
+ return toAjax(stglActivityService.updateByBo(bo));
+ }
+
+ /**
+ * 删除活动信息
+ */
+ @SaCheckPermission("stgl:activity:remove")
+ @Log(title = "活动信息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+ return toAjax(stglActivityService.deleteWithValidByIds(List.of(ids), true));
+ }
+
+ /**
+ * 复制活动信息
+ */
+ @SaCheckPermission("stgl:activity:add")
+ @Log(title = "复制活动信息", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping("/copy")
+ public R copy(@RequestParam("sourceId") Long sourceId, @RequestParam("newActivityName") String newActivityName) {
+ return toAjax(stglActivityService.copyActivity(sourceId, newActivityName));
+ }
+
+ /**
+ * 活动总结
+ */
+ @SaCheckPermission("stgl:activity:edit")
+ @Log(title = "活动总结", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping("/summarize")
+ public R summarize(@RequestParam("id") Long id,
+ @RequestParam(value = "summary", required = false) String summary,
+ @RequestParam(value = "achievements", required = false) String achievements,
+ @RequestParam(value = "summaryAttachments", required = false) String summaryAttachments,
+ @RequestParam(value = "achievementsAttachments", required = false) String achievementsAttachments) {
+ return toAjax(stglActivityService.summarizeActivity(id, summary, achievements, summaryAttachments, achievementsAttachments));
+ }
+
+ /**
+ * 查询社团选择器选项
+ */
+ @SaCheckPermission("stgl:activity:query")
+ @GetMapping("/club/options")
+ public R> getClubOptions() {
+ return R.ok(stglActivityService.queryClubOptions());
+ }
+
+ /**
+ * 查询志愿者队伍选择器选项
+ */
+ @SaCheckPermission("stgl:activity:query")
+ @GetMapping("/volunteer/options")
+ public R> getVolunteerTeamOptions() {
+ return R.ok(stglActivityService.queryVolunteerTeamOptions());
+ }
+
+}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegisterController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegisterController.java
new file mode 100644
index 00000000..73380af9
--- /dev/null
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegisterController.java
@@ -0,0 +1,137 @@
+package org.dromara.stgl.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.stgl.domain.bo.BatchApprovalBo;
+import org.dromara.stgl.domain.bo.StglActivityRegistrationBo;
+import org.dromara.stgl.domain.vo.StglActivityRegistrationVo;
+import org.dromara.stgl.service.IStglActivityRegistrationService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 活动报名管理Controller
+ *
+ * @author ruoyi
+ * @date 2025-01-31
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/stgl/activity/register")
+public class StglActivityRegisterController extends BaseController {
+
+ private final IStglActivityRegistrationService stglActivityRegistrationService;
+
+ /**
+ * 查询活动报名管理列表
+ */
+ @SaCheckPermission("stgl:activityRegister:list")
+ @GetMapping("/list")
+ public TableDataInfo list(StglActivityRegistrationBo bo, PageQuery pageQuery) {
+ return stglActivityRegistrationService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出活动报名管理列表
+ */
+ @SaCheckPermission("stgl:activityRegister:export")
+ @Log(title = "活动报名管理", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(StglActivityRegistrationBo bo, HttpServletResponse response) {
+ List list = stglActivityRegistrationService.queryList(bo);
+ ExcelUtil.exportExcel(list, "活动报名管理", StglActivityRegistrationVo.class, response);
+ }
+
+ /**
+ * 获取活动报名管理详细信息
+ */
+ @SaCheckPermission("stgl:activityRegister:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+ return R.ok(stglActivityRegistrationService.queryById(id));
+ }
+
+ /**
+ * 新增活动报名管理
+ */
+ @SaCheckPermission("stgl:activityRegister:add")
+ @Log(title = "活动报名管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public R add(@Validated(AddGroup.class) @RequestBody StglActivityRegistrationBo bo) {
+ return toAjax(stglActivityRegistrationService.insertByBo(bo));
+ }
+
+ /**
+ * 修改活动报名管理
+ */
+ @SaCheckPermission("stgl:activityRegister:edit")
+ @Log(title = "活动报名管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public R edit(@Validated(EditGroup.class) @RequestBody StglActivityRegistrationBo bo) {
+ return toAjax(stglActivityRegistrationService.updateByBo(bo));
+ }
+
+ /**
+ * 删除活动报名管理
+ */
+ @SaCheckPermission("stgl:activityRegister:remove")
+ @Log(title = "活动报名管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+ return toAjax(stglActivityRegistrationService.deleteWithValidByIds(List.of(ids), true));
+ }
+
+ /**
+ * 审核活动报名
+ */
+ @SaCheckPermission("stgl:activityRegister:approve")
+ @Log(title = "活动报名审核", businessType = BusinessType.UPDATE)
+ @PostMapping("/approve/{id}")
+ public R approve(@NotNull(message = "主键不能为空") @PathVariable Long id,
+ @RequestParam Integer approvalStatus,
+ @RequestParam(required = false) String approvalRemark) {
+ StglActivityRegistrationBo bo = new StglActivityRegistrationBo();
+ bo.setId(id);
+ bo.setApprovalStatus(approvalStatus.toString());
+ bo.setApprovalRemark(approvalRemark);
+ bo.setApprovalBy(LoginHelper.getUserId());
+ return toAjax(stglActivityRegistrationService.updateByBo(bo));
+ }
+
+ /**
+ * 批量审核活动报名
+ */
+ @SaCheckPermission("stgl:activityRegister:approve")
+ @Log(title = "活动报名批量审核", businessType = BusinessType.UPDATE)
+ @PostMapping("/batchApprove")
+ public R batchApprove(@Validated @RequestBody BatchApprovalBo batchApprovalBo) {
+ return toAjax(stglActivityRegistrationService.batchApprove(batchApprovalBo.getIds(), batchApprovalBo.getApprovalStatus(), batchApprovalBo.getApprovalRemark(), LoginHelper.getUserId()));
+ }
+
+ /**
+ * 录入成绩
+ */
+ @SaCheckPermission("stgl:activityRegister:recordScore")
+ @Log(title = "录入成绩", businessType = BusinessType.UPDATE)
+ @PostMapping("/score/{id}")
+ public R recordScore(@NotNull(message = "主键不能为空") @PathVariable Long id,
+ @RequestParam String score) {
+ return toAjax(stglActivityRegistrationService.inputScore(id, score));
+ }
+}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegisterHallController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegisterHallController.java
new file mode 100644
index 00000000..4684121f
--- /dev/null
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegisterHallController.java
@@ -0,0 +1,83 @@
+package org.dromara.stgl.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.stgl.domain.bo.StglActivityBo;
+import org.dromara.stgl.domain.bo.StglActivityRegistrationBo;
+import org.dromara.stgl.domain.vo.StglActivityVo;
+import org.dromara.stgl.domain.vo.StglActivityRegistrationVo;
+import org.dromara.stgl.service.IStglActivityService;
+import org.dromara.stgl.service.IStglActivityRegistrationService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 活动报名大厅Controller
+ *
+ * @author ruoyi
+ * @date 2025-01-31
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/stgl/activity/registerhall")
+public class StglActivityRegisterHallController extends BaseController {
+
+ private final IStglActivityService stglActivityService;
+ private final IStglActivityRegistrationService stglActivityRegistrationService;
+
+ /**
+ * 查询可报名活动列表(仅显示报名状态为0和1的活动)
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(StglActivityBo bo, PageQuery pageQuery) {
+ // 设置查询条件:只查询报名状态为0(未开始)和1(报名中)的活动
+ return stglActivityService.queryRegistrableActivityList(bo, pageQuery);
+ }
+
+ /**
+ * 获取活动详细信息
+ */
+ @GetMapping("/{id}")
+ public R getInfo(@PathVariable Long id) {
+ return R.ok(stglActivityService.queryById(id));
+ }
+
+ /**
+ * 学生报名活动
+ */
+ @Log(title = "活动报名", businessType = BusinessType.INSERT)
+ @PostMapping("/register")
+ public R register(@Validated(AddGroup.class) @RequestBody StglActivityRegistrationBo bo) {
+ // 设置当前用户ID
+ bo.setUserId(LoginHelper.getUserId());
+ return toAjax(stglActivityRegistrationService.register(bo));
+ }
+
+ /**
+ * 检查用户是否已报名某活动
+ */
+ @GetMapping("/checkRegistration/{activityId}")
+ public R checkRegistration(@PathVariable Long activityId) {
+ Long userId = LoginHelper.getUserId();
+ boolean isRegistered = stglActivityRegistrationService.checkUserRegistration(activityId, userId);
+ return R.ok(isRegistered);
+ }
+
+ /**
+ * 获取用户的报名记录
+ */
+ @GetMapping("/myRegistrations")
+ public TableDataInfo getMyRegistrations(PageQuery pageQuery) {
+ Long userId = LoginHelper.getUserId();
+ return stglActivityRegistrationService.queryUserRegistrations(userId, pageQuery);
+ }
+}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegistrationController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegistrationController.java
new file mode 100644
index 00000000..016e5708
--- /dev/null
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegistrationController.java
@@ -0,0 +1,159 @@
+package org.dromara.stgl.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.stgl.domain.bo.StglActivityRegistrationBo;
+import org.dromara.stgl.domain.vo.StglActivityRegistrationVo;
+import org.dromara.stgl.service.IStglActivityRegistrationService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 活动报名管理
+ *
+ * @author ruoyi
+ * @date 2024-12-19
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/stgl/activityregistration")
+public class StglActivityRegistrationController extends BaseController {
+
+ private final IStglActivityRegistrationService stglActivityRegistrationService;
+
+ /**
+ * 查询活动报名列表
+ */
+ @SaCheckPermission("stgl:activityregistration:list")
+ @GetMapping("/list")
+ public TableDataInfo list(StglActivityRegistrationBo bo, PageQuery pageQuery) {
+ return stglActivityRegistrationService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出活动报名列表
+ */
+ @SaCheckPermission("stgl:activityregistration:export")
+ @Log(title = "活动报名", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(StglActivityRegistrationBo bo, HttpServletResponse response) {
+ List list = stglActivityRegistrationService.queryList(bo);
+ ExcelUtil.exportExcel(list, "活动报名", StglActivityRegistrationVo.class, response);
+ }
+
+ /**
+ * 获取活动报名详细信息
+ */
+ @SaCheckPermission("stgl:activityregistration:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+ return R.ok(stglActivityRegistrationService.queryById(id));
+ }
+
+ /**
+ * 新增活动报名
+ */
+ @SaCheckPermission("stgl:activityregistration:add")
+ @Log(title = "活动报名", businessType = BusinessType.INSERT)
+ @PostMapping
+ public R add(@Validated(AddGroup.class) @RequestBody StglActivityRegistrationBo bo) {
+ return toAjax(stglActivityRegistrationService.insertByBo(bo));
+ }
+
+ /**
+ * 修改活动报名
+ */
+ @SaCheckPermission("stgl:activityregistration:edit")
+ @Log(title = "活动报名", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public R edit(@Validated(EditGroup.class) @RequestBody StglActivityRegistrationBo bo) {
+ return toAjax(stglActivityRegistrationService.updateByBo(bo));
+ }
+
+ /**
+ * 删除活动报名
+ */
+ @SaCheckPermission("stgl:activityregistration:remove")
+ @Log(title = "活动报名", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+ return toAjax(stglActivityRegistrationService.deleteWithValidByIds(List.of(ids), true));
+ }
+
+ /**
+ * 审核活动报名
+ */
+ @SaCheckPermission("stgl:activityregistration:approval")
+ @Log(title = "活动报名审核", businessType = BusinessType.UPDATE)
+ @PostMapping("/approval")
+ public R approval(@RequestParam Long id,
+ @RequestParam String approvalStatus,
+ @RequestParam(required = false) String approvalRemark) {
+ return toAjax(stglActivityRegistrationService.approvalRegistration(id, approvalStatus, approvalRemark));
+ }
+
+ /**
+ * 录入成绩
+ */
+ @SaCheckPermission("stgl:activityregistration:score")
+ @Log(title = "录入成绩", businessType = BusinessType.UPDATE)
+ @PostMapping("/inputScore")
+ public R inputScore(@RequestParam Long id, @RequestParam String score) {
+ return toAjax(stglActivityRegistrationService.inputScore(id, score));
+ }
+
+ /**
+ * 检查用户是否已报名该活动
+ */
+ @GetMapping("/checkRegistered")
+ public R checkRegistered(@RequestParam Long activityId, @RequestParam(required = false) Long userId) {
+ Long currentUserId = userId != null ? userId : LoginHelper.getUserId();
+ return R.ok(stglActivityRegistrationService.checkUserRegistered(activityId, currentUserId));
+ }
+
+ /**
+ * 获取用户在指定活动的报名信息
+ */
+ @GetMapping("/getUserRegistration")
+ public R getUserRegistration(@RequestParam Long activityId, @RequestParam(required = false) Long userId) {
+ Long currentUserId = userId != null ? userId : LoginHelper.getUserId();
+ return R.ok(stglActivityRegistrationService.getUserRegistration(activityId, currentUserId));
+ }
+
+ /**
+ * 活动报名
+ */
+ @Log(title = "活动报名", businessType = BusinessType.INSERT)
+ @PostMapping("/register")
+ public R register(@Validated(AddGroup.class) @RequestBody StglActivityRegistrationBo bo) {
+ // 设置当前用户ID
+ bo.setUserId(LoginHelper.getUserId());
+ return toAjax(stglActivityRegistrationService.register(bo));
+ }
+
+ /**
+ * 我的报名列表
+ */
+ @GetMapping("/myRegistrations")
+ public TableDataInfo myRegistrations(StglActivityRegistrationBo bo, PageQuery pageQuery) {
+ // 只查询当前用户的报名记录
+ bo.setUserId(LoginHelper.getUserId());
+ return stglActivityRegistrationService.queryPageList(bo, pageQuery);
+ }
+}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityTeamInfoController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityTeamInfoController.java
new file mode 100644
index 00000000..7fb289ce
--- /dev/null
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityTeamInfoController.java
@@ -0,0 +1,105 @@
+package org.dromara.stgl.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.stgl.domain.bo.StglActivityTeamInfoBo;
+import org.dromara.stgl.domain.vo.StglActivityTeamInfoVo;
+import org.dromara.stgl.service.IStglActivityTeamInfoService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 活动团队信息管理
+ *
+ * @author ruoyi
+ * @date 2024-12-19
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/stgl/activityteaminfo")
+public class StglActivityTeamInfoController extends BaseController {
+
+ private final IStglActivityTeamInfoService stglActivityTeamInfoService;
+
+ /**
+ * 查询活动团队信息列表
+ */
+ @SaCheckPermission("stgl:activityteaminfo:list")
+ @GetMapping("/list")
+ public TableDataInfo list(StglActivityTeamInfoBo bo, PageQuery pageQuery) {
+ return stglActivityTeamInfoService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出活动团队信息列表
+ */
+ @SaCheckPermission("stgl:activityteaminfo:export")
+ @Log(title = "活动团队信息", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(StglActivityTeamInfoBo bo, HttpServletResponse response) {
+ List list = stglActivityTeamInfoService.queryList(bo);
+ ExcelUtil.exportExcel(list, "活动团队信息", StglActivityTeamInfoVo.class, response);
+ }
+
+ /**
+ * 获取活动团队信息详细信息
+ */
+ @SaCheckPermission("stgl:activityteaminfo:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+ return R.ok(stglActivityTeamInfoService.queryById(id));
+ }
+
+ /**
+ * 新增活动团队信息
+ */
+ @SaCheckPermission("stgl:activityteaminfo:add")
+ @Log(title = "活动团队信息", businessType = BusinessType.INSERT)
+ @PostMapping
+ public R add(@Validated(AddGroup.class) @RequestBody StglActivityTeamInfoBo bo) {
+ return toAjax(stglActivityTeamInfoService.insertByBo(bo));
+ }
+
+ /**
+ * 修改活动团队信息
+ */
+ @SaCheckPermission("stgl:activityteaminfo:edit")
+ @Log(title = "活动团队信息", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public R edit(@Validated(EditGroup.class) @RequestBody StglActivityTeamInfoBo bo) {
+ return toAjax(stglActivityTeamInfoService.updateByBo(bo));
+ }
+
+ /**
+ * 删除活动团队信息
+ */
+ @SaCheckPermission("stgl:activityteaminfo:remove")
+ @Log(title = "活动团队信息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+ return toAjax(stglActivityTeamInfoService.deleteWithValidByIds(List.of(ids), true));
+ }
+
+ /**
+ * 根据活动ID查询团队列表
+ */
+ @GetMapping("/activity/{activityId}")
+ public R> getTeamsByActivityId(@PathVariable Long activityId) {
+ return R.ok(stglActivityTeamInfoService.queryByActivityId(activityId));
+ }
+}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglClubController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglClubController.java
index a5604d00..f0bed731 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglClubController.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglClubController.java
@@ -25,6 +25,7 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
+import org.dromara.common.satoken.utils.LoginHelper;
/**
* 社团信息管理
@@ -147,15 +148,69 @@ public class StglClubController extends BaseController {
* 检查社团名称是否重复
*/
@Operation(summary = "检查社团名称是否重复")
- @SaCheckPermission("stgl:club:list")
- @GetMapping("/checkClubNameUnique")
+ @SaCheckPermission("stgl:club:add")
+ @GetMapping("/checkClubName")
@Parameters({
@Parameter(name = "clubName", description = "社团名称", required = true),
- @Parameter(name = "excludeId", description = "排除的ID", required = false)
+ @Parameter(name = "id", description = "社团ID,编辑时排除自己", required = false)
})
- public R checkClubNameUnique(@RequestParam String clubName,
- @RequestParam(required = false) Long excludeId) {
- return R.ok(stglClubService.checkClubNameUnique(clubName, excludeId));
+ public R checkClubName(@RequestParam String clubName, @RequestParam(required = false) Long id) {
+ return R.ok(stglClubService.checkClubNameExists(clubName, id));
+ }
+
+ /**
+ * 验证当前用户是否为社团社长
+ */
+ @Operation(summary = "验证当前用户是否为社团社长")
+ @SaCheckPermission("stgl:club:query")
+ @GetMapping("/checkPresident/{id}")
+ @Parameters({
+ @Parameter(name = "id", description = "社团ID", required = true)
+ })
+ public R checkPresidentRole(@PathVariable Long id) {
+ Long currentUserId = LoginHelper.getUserId();
+ if (currentUserId == null) {
+ return R.ok(false);
+ }
+ boolean isPresident = stglClubService.isClubPresident(id, currentUserId);
+ return R.ok(isPresident);
+ }
+
+ /**
+ * 社团转让
+ */
+ @Operation(summary = "社团转让")
+ @SaCheckPermission("stgl:club:edit")
+ @Log(title = "社团转让", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PostMapping("/transfer/{id}")
+ @Parameters({
+ @Parameter(name = "id", description = "社团ID", required = true),
+ @Parameter(name = "newPresidentUserId", description = "新社长用户ID", required = true)
+ })
+ public R transferClub(@PathVariable Long id, @RequestParam Long newPresidentUserId) {
+ return toAjax(stglClubService.transferClub(id, newPresidentUserId));
+ }
+
+ /**
+ * 临时测试接口:验证副社长数据映射
+ */
+ @Operation(summary = "测试副社长数据映射")
+ @SaCheckPermission("stgl:club:query")
+ @GetMapping("/testVicePresidentData/{id}")
+ public R testVicePresidentData(@PathVariable Long id) {
+ StglClubVo club = stglClubService.queryById(id);
+ if (club != null) {
+ // 输出调试信息到日志
+ System.out.println("=== 副社长数据测试 ===");
+ System.out.println("副社长姓名: " + club.getVicePresidentName());
+ System.out.println("副社长院系: " + club.getVicePresidentDept());
+ System.out.println("副社长专业: " + club.getVicePresidentMajor());
+ System.out.println("副社长班级: " + club.getVicePresidentClass());
+ System.out.println("副社长电话: " + club.getVicePresidentPhone());
+ System.out.println("=====================");
+ }
+ return R.ok(club);
}
/**
@@ -173,4 +228,17 @@ public class StglClubController extends BaseController {
return toAjax(stglClubService.changeStatus(id, status));
}
+ /**
+ * 修复已存在社团的成员记录
+ * 为缺失社长、副社长成员记录的社团补充相应记录
+ */
+ @Operation(summary = "修复已存在社团的成员记录")
+ @SaCheckPermission("stgl:club:edit")
+ @Log(title = "社团信息", businessType = BusinessType.UPDATE)
+ @PostMapping("/fixMemberRecords")
+ public R fixMemberRecords() {
+ Integer fixedCount = stglClubService.fixExistingClubMemberRecords();
+ return R.ok("成功修复 " + fixedCount + " 条社长/副社长成员记录");
+ }
+
}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglClubRegisterController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglClubRegisterController.java
index b0c57795..007c26fe 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglClubRegisterController.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglClubRegisterController.java
@@ -20,6 +20,7 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
+import org.dromara.stgl.domain.bo.StglClubApplyBo;
/**
* 社团报名大厅
@@ -30,7 +31,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
@Validated
@RequiredArgsConstructor
@RestController
-@RequestMapping("/stgl/register")
+@RequestMapping("/stgl/clubRegister")
@Tag(name = "社团报名大厅", description = "社团报名大厅")
public class StglClubRegisterController extends BaseController {
@@ -40,6 +41,7 @@ public class StglClubRegisterController extends BaseController {
* 查询社团报名大厅列表
*/
@Operation(summary = "查询社团报名大厅列表")
+ @SaCheckPermission("stgl:club:list")
@GetMapping("/list")
public TableDataInfo list(@RequestParam(required = false) String clubType,
@RequestParam(required = false) String clubName,
@@ -70,18 +72,16 @@ public class StglClubRegisterController extends BaseController {
}
/**
- * 报名加入社团
+ * 申请加入社团
*/
- @Operation(summary = "报名加入社团")
- @SaCheckPermission("stgl:register:join")
- @Log(title = "社团报名", businessType = BusinessType.INSERT)
- @PostMapping("/join/{clubId}")
- @Parameters({
- @Parameter(name = "clubId", description = "社团ID", required = true)
- })
- public R registerClub(@PathVariable Long clubId) {
+ @Operation(summary = "申请加入社团")
+ @SaCheckPermission("stgl:register:apply")
+ @Log(title = "社团申请", businessType = BusinessType.INSERT)
+ @PostMapping("/apply")
+ public R applyClub(@RequestParam Long clubId, @RequestBody StglClubApplyBo applyBo) {
Long userId = LoginHelper.getUserId();
- return toAjax(stglClubRegisterService.registerClub(clubId, userId));
+ String reason = applyBo != null ? applyBo.getReason() : null;
+ return toAjax(stglClubRegisterService.registerClub(clubId, userId, reason));
}
/**
@@ -132,6 +132,7 @@ public class StglClubRegisterController extends BaseController {
* 查询推荐社团
*/
@Operation(summary = "查询推荐社团")
+ @SaCheckPermission("stgl:club:list")
@GetMapping("/recommend")
@Parameters({
@Parameter(name = "clubType", description = "社团类型", required = false),
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglMaterialSubmissionController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglMaterialSubmissionController.java
new file mode 100644
index 00000000..7343f114
--- /dev/null
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglMaterialSubmissionController.java
@@ -0,0 +1,190 @@
+package org.dromara.stgl.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.dromara.stgl.domain.bo.StglMaterialSubmissionBo;
+import org.dromara.stgl.domain.vo.StglMaterialSubmissionVo;
+import org.dromara.stgl.service.IStglMaterialSubmissionService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 材料提交记录管理
+ *
+ * @author ruoyi
+ * @date 2025-01-03
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/stgl/activitymaterial/submission")
+public class StglMaterialSubmissionController extends BaseController {
+
+ private final IStglMaterialSubmissionService materialSubmissionService;
+
+ /**
+ * 查询材料提交记录列表
+ */
+ @SaCheckPermission("stgl:activitymaterial:query")
+ @GetMapping("/list")
+ public TableDataInfo list(StglMaterialSubmissionBo bo, PageQuery pageQuery) {
+ return materialSubmissionService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出材料提交记录列表
+ */
+ @SaCheckPermission("stgl:activitymaterial:export")
+ @Log(title = "材料提交记录", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(StglMaterialSubmissionBo bo, HttpServletResponse response) {
+ List list = materialSubmissionService.queryList(bo);
+ ExcelUtil.exportExcel(list, "材料提交记录", StglMaterialSubmissionVo.class, response);
+ }
+
+ /**
+ * 获取材料提交记录详细信息
+ */
+ @SaCheckPermission("stgl:activitymaterial:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+ return R.ok(materialSubmissionService.queryById(id));
+ }
+
+ /**
+ * 新增材料提交记录
+ */
+ @SaCheckPermission("stgl:activitymaterial:upload")
+ @Log(title = "材料提交记录", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping
+ public R add(@Validated(AddGroup.class) @RequestBody StglMaterialSubmissionBo bo) {
+ return toAjax(materialSubmissionService.insertByBo(bo));
+ }
+
+ /**
+ * 修改材料提交记录
+ */
+ @SaCheckPermission("stgl:activitymaterial:upload")
+ @Log(title = "材料提交记录", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping
+ public R edit(@Validated(EditGroup.class) @RequestBody StglMaterialSubmissionBo bo) {
+ return toAjax(materialSubmissionService.updateByBo(bo));
+ }
+
+ /**
+ * 删除材料提交记录
+ */
+ @SaCheckPermission("stgl:activitymaterial:remove")
+ @Log(title = "材料提交记录", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+ return toAjax(materialSubmissionService.deleteWithValidByIds(List.of(ids), true));
+ }
+
+ /**
+ * 材料上传
+ */
+ @SaCheckPermission("stgl:activitymaterial:upload")
+ @Log(title = "材料上传", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping("/upload")
+ public R uploadMaterial(@Validated(AddGroup.class) @RequestBody StglMaterialSubmissionBo bo) {
+ return toAjax(materialSubmissionService.uploadMaterial(bo));
+ }
+
+ /**
+ * 根据任务ID查询提交记录
+ */
+ @SaCheckPermission("stgl:activitymaterial:query")
+ @GetMapping("/task/{taskId}")
+ public R> getByTaskId(@PathVariable Long taskId) {
+ List submissions = materialSubmissionService.queryByTaskId(taskId);
+ return R.ok(submissions);
+ }
+
+ /**
+ * 查询用户在指定任务的提交记录
+ */
+ @SaCheckPermission("stgl:activitymaterial:query")
+ @GetMapping("/task/{taskId}/user/{userId}")
+ public R getByTaskIdAndUserId(@PathVariable Long taskId, @PathVariable Long userId) {
+ StglMaterialSubmissionVo submission = materialSubmissionService.queryByTaskIdAndUserId(taskId, userId);
+ return R.ok(submission);
+ }
+
+ /**
+ * 查询团队在指定任务的提交记录
+ */
+ @SaCheckPermission("stgl:activitymaterial:query")
+ @GetMapping("/task/{taskId}/team/{teamId}")
+ public R getByTaskIdAndTeamId(@PathVariable Long taskId, @PathVariable Long teamId) {
+ StglMaterialSubmissionVo submission = materialSubmissionService.queryByTaskIdAndTeamId(taskId, teamId);
+ return R.ok(submission);
+ }
+
+ /**
+ * 获取任务的提交统计信息
+ */
+ @SaCheckPermission("stgl:activitymaterial:query")
+ @GetMapping("/statistics/{taskId}")
+ public R